Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник 357.docx
Скачиваний:
27
Добавлен:
30.04.2022
Размер:
1.75 Mб
Скачать

10.2 Приемы инициализации и заполнения массивов случайными числами

При отладке программ возникает необходимость заполнить массив некоторыми значениями, если массив небольшой, то это можно сделать явно:

double a[]={-12.6, 2e-2, 123, 2.1e14, 2.5};

Или заполнить константами в цикле:

for(i=0; i<n; i++)a[i]=MYCONST;

Но лучше заполнить случайными числами. Случайные числа могут быть сгенерированы функцией стандартной библиотеки Си rand(), которая генерирует числа в диапазоне от 0 до RAND_MAX и возвращает число типа unsigned long. Функция rand() не имеет аргументов. Константа RAND_MAXи прототип функции rand() объявлены в <stdlib.h>.

Так как возможна генерация числа только по определенному алгоритму, то для превращения функции rand в генератор действительно случайных чисел, нужно его каждый раз инициировать неким случайным числом. Для этого следует использовать функцию srand (unsigned seed), которая в качестве аргумента seed получает некоторое число, которое определяет последовательность генерации случайных чисел функцией rand.

srand (12);

Если этим числом будет системное время, тогда при каждом запуске программы будет происходить инициализация генератора «новым значением», и, как следствие, создаваться неповторяемаяпоследовательность чисел.

/* объявление необходимых переменных */

int stime;

longl time;

/* получает текущее календарное время */

ltime = time(NULL);

/* преобразование его к типу int */

stime = (unsigned) ltime/2;

/* инициализация генератора */

srand(stime);

За одно обращение к функции rand можно получить одно случайное число в диапазоне от 0 до RAND_MAX. Для получения случайного целого числа m в заданном диапазоне от A до B, необходимо выполнить преобразование:

m = A+ rand() % (B -A);

Если необходимо заполнить массив случайными числами вещественного типа, то вещественное число в интервале от 0 до 1 может быть получено:

x=1.* rand()/RAND_MAX

Заполнение массива случайными вещественными числами в интервале от XMIN до XMAX может быть организовано

for(i=0; i<N; i++)

a[i]=XMIN+1.f*(XMAX-XMIN)*rand()/RAND_MAX;

Константы диапазонов генерации чисел удобно задавать с использованием директив препроцессора:

#define XMAX 112.4

Подобное управление размерами и параметрами массива на этапе препроцессорной обработки позволяет легко менять их размер и другие связанные с ними параметры.

#define NMAX 10 //определение размера массива

main()

{

int value[NMAX];

for(i=0;i<NMAX; i++) value[i]=100-i*10;

}

10.3 Примеры работы с массивами

Пример 1. Ввод элементов массива с клавиатуры

#include<stdio.h>

void main(void)

{

double a[100], с;

intn, i;

printf("Введите количество чисел n = ");

scanf("%d", &n);

if( n>(sizeof a)/sizeof(double) )

{ printf("Слишком много элементов\n"); return; }

for(i=0; i<n; i++)

{

printf("a[%d] = ", i);

scanf("%lf", &c);

a[i]=с;

}

/* Операторы, обрабатывающие массив */

}

Во многих случаях удобно возложить на программу подсчет числа элементов, вводимого массива, при этом ввод завершается при появлении во входном потоке признака конца данных. Таким признаком в следующей программе служит число большее 1.0e300

#include<stdio.h>

void main(void)

{

double a[100], temp; int n, end;

for(end=n=0; n<(sizeof a)/sizeof(double); n++)

{

printf("a[%d] = ", n); scanf("%lf", &temp);

if( temp>=1.0e300 ) { end=1; break; }

a[n] = temp;

}

if( end )

{

/* Операторы, обрабатывающие массив */

}

else

printf("Переполнение массива\n");

}

Пример 2. Инициализация массива случайными числами

#include<stdlib.h>

#include <stdio.h>

#define XMIN 5

#define XMAX 15

void main(void)

{

int N, i;

float a[100];

printf("Введите количество чисел n = ");

scanf("%d", &N);

if(N>100)

{ printf("Слишком много элементов\n"); return; }

for(i=0; i<N; i++)

a[i]=XMIN+1.f*(XMAX-XMIN)*rand()/RAND_MAX;

// Обработка массива

}

Пример 3. Печать массива, заполненного случайными числами

main()

{

int s[10];

printf("Массив заполнится числами в заданном диапазоне от -10 до 20: \n");

srand(time(NULL)|clock());

for (int i=0;i<10;i++)

s[i]=-10+rand()%31;

printf("получен массив с целочисленными элементами\n");

for (int i=0;i<10;i++)

printf("\n s[%d]= %d", i, s[i]);

}

Комментарий к примеру

Функция srand осуществляет инициализацию генератора случайных чисел. Функция time возвращает текущее календарное время системы. Эта функция вызывается с нулевым указателем. Функция clock возвращает приблизительное процессорное время, потраченное на работу с программой. Таким образом, в качестве аргумента функции srand всегда будет новое неповторяющееся значение. Объявления этих функций в заголовочных файлах ctime.hи stdlib.h.

Пример 4. Формирование нового массива со значениями элементов, равными корню квадратному из значений исходного массива и вывод их на печать в виде таблицы

main()

{

int A[10],B[10], i;

// Инициализация массива А

printf("Индекс | Новый | Старый");

for(i=0; i<10; i++)

{

B[i]=sqrt(A[i]);

printf("\n%-7d|%7.2f|%7.2f", i, B[i], A[i]);

}

return;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]