Функция стандартной библиотеки языка С (stdlib.h) rand() генерирует псевдослучайное число на интервале значений от 0 до RAND_MAX (константа, обычно 32767). Чтобы получить случайные числа от 0 до 9 – используется получение остатка от деления rand() % 10. Если нам нужны числа от 1 (а не от 0) до 9, то можно прибавить единицу -- rand() % 9 + 1, т.е. генерируется случайное число от 0 до 8, и после прибавления 1 оно превращается в случайное число от 1 до 9. Для получения при каждом вызове rand() различных случайных последовательностей надо сначала вызвать функцию srand(), которая в качестве аргумента просит число. И по этому числу уже будет генерироваться случайное число функцией rand(): srand(time(NULL)); chislo = rand(); CPascal Для моделирования ситуаций, когда требуется, чтобы результат работы программы был случайным в определенных пределах, во многих языках программирования присутствуют встроенные функции, код которых выдает случайные числа. На самом деле числа не совсем случайные, а псевдослучайные, т.к любая программа представляет собой детерминированный алгоритм и с его помощью реализовать случайность невозможно. Алгоритмы реализации псевдослучайных чисел оцениваются по длине последовательности, после которой последовательность начинает повторяться. 1 Функции генерации случайных последовательностей Для генерации псевдослучайных чисел в заданных диапазонах используется функция random. Перед ее использованием обычно выполняется процедура инициализации датчика случайных чисел - randomize; иначе функция при вызове всегда будет выдавать одну и ту же последовательность чисел. Randomize задает начальное значение последовательности, от которого вычисляются все последующие. При каждом запуске программы это значение будет разным, а значит и результат работы функции random будет различным. Функция random генерирует случайное число в диапазоне от 0 (включительно) до единицы. Если в скобках указан аргумент, то от 0 до значения указанного в скобках (не включая само значение). ВМП
CPascal 2 Функции генерации случайных последовательностей Выражение random (10) генерировать любое число в диапазоне [0, 10). Для получения значения в другом диапазоне (не от нуля, например, от -100 до 100, то надо записать такое выражение: random (200) – 100. В результате, сначала будет получено число из диапазона [0, 199], а затем из него будет вычтена сотня. И если случайное число было меньше 100, то результат выражения будет отрицательным.) В примере программы сначала с помощью процедуры randomize инициализируется датчик случайных чисел. Затем переменной n присваивается случайное значение в диапазоне [5, 12). Значение переменной n используется для определения количества итераций цикла for. В цикле for генерируются случайные числа в диапазоне [0, 50) и выводятся на экран. var n, i, x: integer; begin randomize; n := random (7) + 5; for i := 1 to n do begin x := random (100) - 50; write (x:5) end; readln end. Пример: #include int main() { int rand_chislo; srand(time(NULL)); for (int i = 0; i <5; i++ ) { rand_chislo = 2 + rand() %7; printf (" rand_chislo =%d ", rand_chislo); } return 0; } В оболочке программирования Borland С/C++ в виде макросов реализованы random(x) и randomize() аналогичные Pascal. Пример: #include int main(void) { randomize(); /* задаёт случайные начальные значения при запуске функции random() */ printf("Случайное число в диапазоне от 0 до 99: ", random(100)); return 0; } Будем использовать random для заполнения массивов. ВМП
Формат описания Функции: [класс] [(тип 1 имя_формального_параметра 1, …, типN имя_формального_параметраN)] [throw (исключения)] { } Формат вызова Функции: ([фактич_параметр 1, …, фактич_параметры]); // Сортировка мас. целых чисел выборочнымым. методом #include #define sz 5 // размерность массива void main () { int a[sz]; // массив целых чисел int i; // элем., от которого ведется поиск мин. элем. int min; // мин. элем. в части мас. от i до конца мас. int j; // элемента сравниваемого с мин. int buf; // буфер, исп. при обмене элементов массива int k; // индекс для ввода и вывода printf ("\n Введите в одной строке %i", sz); printf (" целых чисел и нажмите Enter \n"); printf ("-> "); for (k=0; k<sz; k++) scanf ("%i", &a[k]); // Сортировка for (i = 0; i < sz-1; i++) { // Поиск мин. элем. в части мас. от a[i] до a[sz] min = i; for (j = i+1; j < sz; j++) if (a[j] < a[min]) min = j; // Меняем местами a[min] и a[i] buf = a[i]; a[i] = a[min]; a[min] = buf; } // Цикл сортировки закончен // Вывод отсортированного массива printf ("Отсортированный массив\n"); for (k = 0; k<sz; k++) printf ("%i ", a[k]); } CC Практическое занятие : сортировка и слияние двух массивов (на языке С) используя функции выборочнымымой сортировки и слияния целочисленных массивов ВМП 3 МАССИВЫ. Сортировка Создать функцию выборочнымымой сортировки
// Сортировка мас. целых чисел выборочнымым. методом #include #define sz 5 // размерность массива void main () { int a[sz]; // массив целых чисел int i; // элем., от которого ведется поиск мин. элем. int min; // мин. элем. в части мас. от i до конца мас. int j; // элемента сравниваемого с мин. int buf; // буфер, исп. при обмене элементов массива int k; // индекс для ввода и вывода printf ("\n Введите в одной строке %i", sz); printf (" целых чисел и нажмите Enter \n"); printf ("-> "); for (k=0; k<sz; k++) scanf ("%i", &a[k]); // Сортировка for (i = 0; i < sz-1; i++) { // Поиск мин. элем. в части мас. от a[i] до a[sz] min = i; for (j = i+1; j < sz; j++) if (a[j] < a[min]) min = j; // Меняем местами a[min] и a[i] buf = a[i]; a[i] = a[min]; a[min] = buf; } // Цикл сортировки закончен // Вывод отсортированного массива printf ("Отсортированный массив\n"); for (k = 0; k<sz; k++) printf ("%i ", a[k]); } CC Практическое занятие : сортировка и слияние двух массивов (на языке С) используя функции выборочнымымой сортировки и слияния целочисленных массивов ВМП 4 МАССИВЫ. Сортировка Создать функцию выборочнымымой сортировки void direct_sort (int a[sz]) // Функция выборочнымымой сортировки массива целых чисел по возрастанию { int i; // элем., от которого ведется поиск мин. элем. int numin; // минимального элемента int j; // элемента сравниваемого с минимальным int buf; // буфер, исп. при обмене элементов массива for (i = 0; i < sz-1; i++) { // Поиск мин. элемента в части массива от a[i] до a[sz] numin = i; for (j = i+1; j < sz; j++) if (a[j] < a[numin]) numin = j; // Меняем местами a[numin] и a[i] buf = a[i]; a[i] = a[numin]; a[numin] = buf; } // цикл сортировки закончен }
Формат описания Функции: [класс] [(тип 1 имя_формального_параметра 1, …, типN имя_формального_параметраN)] [throw (исключения)] { } Формат вызова Функции: ([фактич_параметр 1, …, фактич_параметры]); #include #define SZ 5 //Размер исходных массивов void main() { int a[SZ], b[SZ]; // исходные массивы int c[SZ*2]; // массив-результат int k,i,m; // индексы массивов a, b и c printf ("Слияние двух упорядоченных массивов в один,\n"); printf ("ввод элементов через пробел, завершение: Enter\n"); printf ("\n Введите первый массив %i -> ", SZ); for (k=0; k<SZ; k++) scanf ("%i", &a[k]); printf ("Введите второй массив %i -> ", SZ); for (i=0; i<SZ; i++) scanf ("%i", &b[i]); k=i=m=0; do { if (a[k] < b[i]) c[m++] = a[k++]; else if (a[k] > b[i]) c[m++] = b[i++]; else { c[m++] = a[k++]; c[m++] = b[i++]; } } while ((k < SZ) && (i < SZ)); while (k < SZ) /*есть элем. массива А не переписанные в С*/ c[m++] = a[k++]; while (i < SZ) /* есть элементы B не переписанные в С */ c[m++] = b[i++]; printf("Массив-результат: \n"); for (i=0; i<2*SZ; i++) printf ("%i ", c[i]); printf("\n Для завершения работы нажмите Enter\n"); getch(); } CC Практическое занятие : сортировка и слияние двух массивов (на языке С) используя функции выборочнымымой сортировки и слияния целочисленных массивов 5 МАССИВЫ. Сортировка Создать функцию слияния отсортированных массивов ВМП
#include // Слияние двух упорядоченных массивов #include #define SZ 5 //Размер исходных массивов void main() { int a[SZ], b[SZ]; // исходные массивы int c[SZ*2]; // массив-результат int k,i,m; // индексы массивов a, b и c printf ("Слияние двух упорядоченных массивов в один,\n"); printf ("ввод элементов через пробел, завершение: Enter\n"); printf ("\n Введите первый массив %i -> ", SZ); for (k=0; k<SZ; k++) scanf ("%i", &a[k]); printf ("Введите второй массив %i -> ", SZ); for (i=0; i<SZ; i++) scanf ("%i", &b[i]); k=i=m=0; do { if (a[k] < b[i]) c[m++] = a[k++]; else if (a[k] > b[i]) c[m++] = b[i++]; else { c[m++] = a[k++]; c[m++] = b[i++]; } } while ((k < SZ) && (i < SZ)); while (k < SZ) /*есть элем. массива А не переписанные в С*/ c[m++] = a[k++]; while (i < SZ) /* есть элементы B не переписанные в С */ c[m++] = b[i++]; printf("Массив-результат: \n"); for (i=0; i<2*SZ; i++) printf ("%i ", c[i]); printf("\n Для завершения работы нажмите Enter\n"); getch(); } CC Практическое занятие : сортировка и слияние двух массивов (на языке С) используя функции выборочнымымой сортировки и слияния целочисленных массивов ВМП 6 МАССИВЫ. Сортировка Создать функцию слияния отсортированных массивов void mas_split (int a[sz], int b[sz], int c[sz*2]) /* Функция слияния двух упорядоченных по возрастанию массивов целых чисел в один */ { int k,i,m; // индексы массивов a, b и c k=i=m=0; do { if (a[k] < b[i]) c[m++] = a[k++]; else if (a[k] > b[i]) c[m++] = b[i++]; else { c[m++]=a[k++]; c[m++]=b[i++];} } while ((k < sz) && (i < sz)); while (k<sz) // есть элем. мас. a не переписанные в c c[m++] = a[k++]; while (i < sz) // есть элементы b не переписанные в c c[m++] = b[i++]; }
void mas_split (int a[sz], int b[sz], int c[sz*2]) /* Функция слияние двух упорядоченных по возрастанию массивов целых чисел в один */ { int k,i,m; // индексы массивов a, b и c k=i=m=0; do { if (a[k] < b[i]) c[m++] = a[k++]; else if (a[k] > b[i]) c[m++] = b[i++]; else { c[m++]=a[k++]; c[m++]=b[i++];} } while ((k < sz) && (i < sz)); while (k<sz) // есть элем. мас. a не переписанные в c c[m++] = a[k++]; while (i < sz) // есть элементы b не переписанные в c c[m++] = b[i++]; } CС Практическое занятие : сортировка и слияние двух массивов (на языке С) используя функции выборочнымымой сортировки и слияния целочисленных массивов Функции: void direct_sort (int a[sz]) // Функция сортировки массива целых чисел по возрастанию { int i; // элем., от которого ведется поиск мин. элем. int numin; // минимального элемента int j; // элемента сравниваемого с минимальным int buf; // буфер, исп. при обмене элементов массива for (i = 0; i < sz-1; i++) { // Поиск мин. элемента в части массива от a[i] до a[sz] numin = i; for (j = i+1; j < sz; j++) if (a[j] < a[numin]) numin = j; // Меняем местами a[numin] и a[i] buf = a[i]; a[i] = a[numin]; a[numin] = buf; } // цикл сортировки закончен } 7 МАССИВЫ. Сортировка ВМП
void main() /* Ввод двух целочисленных массивов, сортировка обеих массивов и слияние этих массивов в третий массив */ { int a[sz], b[sz]; // исходные массивы целых чисел int c[sz*2]; // массив-результат int d, l, n; // индексы массивов A, B и C randomize(); printf (" Сортировка и слияние двух упорядоченных по возрастанию массивов в один,\n"); printf (" элементы массива вводите через пробел, завершение ввода массива: Enter \n"); printf ("\n Введите первый массив %i целых чисел -> ", sz); for (d = 0; d < sz; d++) a[d] = random(100); // как вариант: scanf ("%i", &a[d]); printf ("\n Введите второй массив %i целых чисел -> ", sz); for (l = 0; l < sz; l++) b[l] = random(100); // как вариант: scanf ("%i", &b[l]); direct_sort (a); // Вывод отсортированного первого массива printf ("\n Отсортированный первый массив -> "); for (d = 0; d < sz; d++) printf ("%i ", a[d]); direct_sort (b); // Вывод отсортированного второго массива printf ("\n Отсортированный второй массив -> "); for (l = 0; l < sz; l++) printf ("%i ", b[l]); mas_split (a, b, c); // Вывод результата слияния двух массивов printf("\n Массив-результат: \n"); for (n = 0; n <2*sz; n++) printf ("%i ", c[n]); } C C Практическое занятие : сортировка и слияние двух массивов (на языке С) используя функции выборочнымымой сортировки и слияния целочисленных массивов Головная программа: 8 МАССИВЫ. Сортировка Для работы функции randomize() надо подключать библиотеку time.h; функция random(x) находится в библиотеке stdlib.h ВМП