Попередня сторінка Зміст Наступна сторінка Електронні посібники ВНТУ
ЛАБОРАТОРНА РОБОТА № 3
ГЕНЕРУВАННЯ ВИПАДКОВИХ ЧИСЕЛ. РОБОТА З ОДНОВИМІРНИМИ МАСИВАМИ
Мета роботи
- Дослідити функції генерування послідовностей псевдовипадкових чисел і навчитись їх застосовувати.
- Ознайомитись з можливостями створення одновимірних масивів і навчитись обробляти елементи масивів.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Генерація псевдовипадкових чисел
В сучасних умовах для отримання випадкових чисел використовують різноманітні генератори, які поділяються на апаратні та програмні.
В апаратних генераторах джерелом випадкових чисел є шум в електронних приладах. Проте, використання апаратних генераторів вимагає наявності спеціального обладнання. В зв’язку з цим більш зручним вважається застосування програмних генераторів випадкових чисел.
Програмний генератор випадкових чисел являє собою програму, яка генерує послідовність чисел за деяким алгоритмом. Завдяки алгоритму така послідовність чисел цілком детермінована, тобто не може бути цілком випадковою. Її називають послідовністю псевдовипадкових чисел.
Для підключення вбудованого генератора псевдовипадкових послідовностей чисел в мові С використовують бібліотеку <stdlib.h>.
Функція rand(): int rand(void);
Функція rand() генерує послідовність псевдовипадкових цілих чисел в діапазоні від 0 до RAND_MAX. Константа RAND_MAX визначена в бібліотеці <stdlib.h>. Його значення за замовчуванням може змінюватися залежно від реалізації, але воно не повинно бути меншим за 32767.
Функція srand(): void srand(unsigned int seed);
Функція srand() використовується для ініціалізації генерування нової послідовності псевдовипадкових чисел, які отримуються за допомогою функції rand(). Якщо функція srand() викликається з одним і тим же початковим значенням, то послідовність псевдовипадкових чисел не зміниться. Тому в якості початкового заповнення зазвичай у програмах використовують системний час, який отримують за допомогою функції time() бібліотеки <time.h>.
long time(long *timeptr);
Функція time відповідно до системного годинника повертає кількість секунд, які пройшли з моменту часу 00:00:00 (значення часу за Гринвічем), тобто з 1 січня 1980 року. Якщо показчик timeptr не рівний NULL, то значення, яке повертається, також записується в timeptr.
Приклади програм для генерування випадкових чисел
Приклад №1. Програма генерує псевдовипадкове число від 1 до 10 і за допомогою клавіатури користувач намагається вигадати це число.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
int main ()
{ int iSecret, iGuess;
srand (time(NULL)); /* ініціалізація початкового заповнення: */
iSecret = rand() % 10 + 1; /* Генерація випадкового числа: */
do { printf ("Guess the number (1 to 10): ");
scanf_s ("%d", &iGuess);
if (iSecret < iGuess)
puts("The secret number is lower");
else
if (iSecret>iGuess)
puts("The secret number is higher");
} while (iSecret!=iGuess);
puts ("\n\n\tCongratulations!");
return 0;
}
Приклад №2. Програма генерує послідовності псевдовипадкових чисел (цілих і дійсних) на певних проміжках.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
int main ()
{ int n;
printf ("\n\t\tГЕНЕРУВАННЯ ВИПАДКОВИХ ЧИСЕЛ \n\n\n");
printf ("Введ1ть к1льк1сть чисел посл1довност1: n = ");
scanf_s ("%d", &n);
srand (time(NULL) ); /* ініціалізація початкового заповнення: */
printf("\n\n\tЦ1л1 випадков1 числа на проміжку [-50,100]:\n");
for (int i=0; i<n; i++)
{ if (i%10==0) printf("\n");// Генерація цілого випадкового числа:
int number = rand()%150-50;
printf("%7d", number);
}
printf("\n\n\tД1йсн1 випадков1 числа на проміжку [-100,100]:\n");
for (int i=0; i<n; i++)
{ if (i%10 == 0) printf("\n");
float number = (float)rand()/RAND_MAX*200 – 100.0;
printf("%7.1f", number);
}
return 0;
}
Одновимірні масиви
Масив – це набір змінних одного типу, що мають одне і те ж ім'я. Доступ до конкретного елемента масиву здійснюється за допомогою індексу. У мові С всі масиви розташовуються в окремій безперервній області пам'яті. Перший елемент масиву розташовується з самою найменшою адресою, а останній – з найбільшою. Масиви можуть бути одновимірними і багатовимірними. Рядок – це масив символьних змінних, що закінчується спеціальним нульовим символом, це найбільш поширений тип масиву.
Загальна форма оголошення одновимірного масиву має вигляд:
тип ім'я_змінної [розмір];
Як і інші змінні, масив повинен бути оголошений явно, щоб компілятор виділив для нього певну область пам'яті (тобто розмістив масив). Тут тип позначає базовий тип масиву, що є типом кожного елемента. Розмір задає кількість елементів масиву. Наприклад, наступний оператор оголошує масив з 25 елементів типу float під ім'ям account:
float account [25];
Доступ до елемента масиву здійснюється за допомогою імені масиву й індексу, який поміщається в квадратних дужках після імені. Наприклад,
account [20] = 15.47;
Індекс першого елемента будь-якого масиву в мові С дорівнює нулю. Тому оператор
int num[11];
оголошує масив символів з 11 елементів – від num[0] до num [10].
Обсяг пам'яті, необхідний для зберігання масиву, безпосередньо визначається її типом і розміром. Для одновимірного масиву кількість байтів пам'яті обчислюється таким чином:
К-ть_байтів = sizeof (базовий_тип) × довжина_масиву.
Приклади програм з використанням одновимірних масивів
Приклад №3. Елементам масиву tod присвоюються значення від 0 до 55.
#include <stdio.h>
int main(void)
{
int tod[55];
int i;
for(i=0; i<55; i++)
tod[i] = i;
for(i=0; i<55; i++)
printf("%d ", tod[i]);
return 0;
}
Приклад №4. Програма працює з трьома масивами, перший з яких ініціалізується цілими числами, другий заповнюються випадковими числами, а елементи третього – сумами відповідних елементів двох масивів.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
const int n=15;
int arr1[] = {1,3,-10,2,4,8,43,9,14,0,1,2,3,-5,-9};
for (int i=0; i<n; i++)
printf("%5d",arr1[i]);
printf("\n");
int arr2[n];
for (int i=0; i<n; i++)
{ arr2[i]=rand()%25+1;
printf("%5d",arr2[i]);
}
printf("\n------------------------------------------------------\n");
int arr3[n];
for (int i=0; i<n; i++)
{ arr3[i]=arr1[i] + arr2[i];
printf("%5d",arr3[i]);
}
printf("\n");
_getch();
return 0;
}
Приклад №5. Програма, що реалізує задачу з прикладу 4, але з використанням покажчиків.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
const int n=15;
int arr1[] = {1,3,-10,2,4,8,43,9,14,0,1,2,3,-5,-9};
for (int i=0; i<n; i++)
printf("%5d",arr1[i]);
printf("\n");
int arr2[n], arr3[n];
for (int i=0; i<n; i++)
{ arr2[i]=rand()%25+1;
printf("%5d",arr2[i]);
}
printf("\n ---------------------------------------------\n");
int *ptr1 = arr1;
int *ptr2 = arr2;
for (int i=0; i<n; i++)
{ arr3[i]=*ptr1 + *ptr2;
printf("%5d",arr3[i]);
ptr1++; ptr2++;
}
printf("\n");
_getch();
return 0;
}
Порядок виконання роботи
- Засвоїти теоретичний матеріал. Розібратись з прикладами 1-5, відлагодити наведені в прикладах програми на комп’ютері.
- Розробити власні програми, яка реалізують індивідуальне завдання.
- Підготувати звіт по кожній задачі, який включатиме:
- номер варіанту і текст індивідуального завдання;
- формалізацію задачі;
- схему роботи програми;
- лістинг програми;
- роздруківку трьох контрольних прикладів для кожної задачі;
- висновки.
Варіанти індивідуальних завдань
Задача 1. Числа m, n і k (3≤k≤10) вводяться з клавіатури. Згенерувати і вивести на екран m цілих випадкових чисел з проміжку, вказаному у пункті а, та n дійсних чисел (виводити на екран з вказаною точностю) з проміжку, вказаному у пункті б. Виведення на екран здійснювати по k чисел у рядку.
1 | а) [-25, 30] | б) [1, 5] з точністю до сотих |
2 | а) [13, 399] | б) [-2, 2] з точністю до десятих |
3 | а) [-200, 100] | б) [0, 10] з точністю до тисячних |
4 | а) [0, 125] | б) [3, 6] з точністю до сотих |
5 | а) [-100, 0] | б) [-1, 3] з точністю до десятих |
6 | а) [-45, 45] | б) [-5, 0] з точністю до тисячних |
7 | а) [-66, 666] | б) [0, 13] з точністю до сотих |
8 | а) [77, 127] | б) [-6, 10] з точністю до десятих |
9 | а) [-33, 333] | б) [1, 2] з точністю до тисячних |
10 | а) [-10, 10] | б) [-1, 0] з точністю до сотих |
11 | а) [-1000, 500] | б) [5, 10] з точністю до десятих |
12 | а) [-11, 111] | б) [2, 6] з точністю до тисячних |
13 | а) [13, 900] | б) [-1, 1] з точністю до сотих |
14 | а) [125, 500] | б) [10, 15] з точністю до десятих |
15 | а) [-444, 333] | б) [4, 8] з точністю до тисячних |
Задача 2. Розробити программу, дотримуючись таких вимог:
- використовувати статичні масиви;
- число n (кількість елементів масиву) – іменована константа;
- елементи масиву – псевдовипадкові числа, згенеровані на інтервалі [a, b], де a і b вводяться з клавіатури (a<b);
- усі вхідні дані і також елементи масиву виводяться на екран.
1. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) суму від’ємних елементів масиву; 2) добуток елементів масиву, розташованих між максимальним і мінімальним елементами. |
2. |
В одновимірному масиві, що складається з n цілих елементів, обчислити: 1) суму додатних елементів масиву; 2) добуток елементів масиву, розташованих між максимальним за модулем і мінімальним за модулем елементами. |
3. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) добуток елементів масиву з парними номерами; 2) суму елементів масиву, розташованих між першим і останнім нульовими елементами. |
4. |
В одновимірному масиві, що складається з n цілих елементів, обчислити: 1) суму елементів масиву з непарними номерами; 2) суму елементів масиву, розташованих між першим і останнім від’ємними елементами. |
5. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) максимальний елемент масиву; 2) суму елементів масиву, розташованих до останнього додатного елемента. |
6. |
В одновимірному масиві, що складається з n цілих елементів, обчислити: 1) мінімальний елемент масиву; 2) суму елементів масиву, розташованих між першим і останнім додатними елементами. |
7. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) номер максимального елемента масиву; 2) добуток елементів масиву, розташованих між першим і другим нульовими елементами. |
8. |
В одновимірному масиві, що складається з n цілих елементів, обчислити: 1) номер мінімального елемента масиву; 2) суму елементів масиву, розташованих між першим і другим від’ємними елементами. |
9. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) максимальний за модулем елемент масиву; 2) суму елементів масиву, розташованих між першим і другим додатними елементами. |
10. |
В одновимірному масиві, що складається з n цілих елементів, обчислити: 1) мінімальний за модулем елемент масиву; 2) суму модулів елементів, розташованих після першого елемента, рівного нулю. |
11. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) номер мінімального за модулем елемента масиву; 2) суму модулів елементів, розташованих після першого від’ємного елемента. |
12. |
В одновимірному масиві, що складається з n цілих елементів, обчислити: 1) номер максимального за модулем елементу масиву; 2) суму елементів масиву, розташованих після першого додатного елемента. |
13. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) кількість елементів, що лежать в діапазоні від А до В (А і В – з клавіатури); 2) суму елементів масиву, розташованих після максимального елемента. |
14. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) кількість елементів масиву, рівних 0; 2) суму елементів масиву, розташованих після мінімального елемента. |
15. |
В одновимірному масиві, що складається з n дійсних елементів, обчислити: 1) кількість елементів масиву, більших за С (С вводиться з клавіатури); 2) добуток елементів масиву, розташованих після максимального за модулем елемента. |
Задача 3. Змінити програму, що реалізує завдання 2, таким чином, щоб у програмі були використані покажчики. У звіт не включати формалізацію та схему програми.
* Задача 3. В комп’ютерній системі зареєстровано таких користувачів: Alice, Bob, Carl з паролями Cooper, Dylan, Perkins відповідно. Розробити програму, яка визначатиме чи зможе користувач отримати доступ до читання (r), запису (w) або виконання файлів (x), на основі імені облікового запису користувача (так званий "логін") та пароля.
1 | Alice | rx | 6 | Alice | x | 11 | Alice | rx |
Bob | w | Bob | r | Bob | rw | |||
Carl | rw | Carl | rw | Carl | x | |||
2 | Alice | rwx | 7 | Alice | r | 12 | Alice | w |
Bob | x | Bob | wx | Bob | rwx | |||
Carl | w | Carl | rw | Carl | rw | |||
3 | Alice | x | 8 | Alice | rx | 13 | Alice | x |
Bob | wx | Bob | wx | Bob | x | |||
Carl | r | Carl | rw | Carl | rw | |||
4 | Alice | w | 9 | Alice | rw | 14 | Alice | w |
Bob | rw | Bob | w | Bob | rw | |||
Carl | x | Carl | rx | Carl | rx | |||
5 | Alice | rwx | 10 | Alice | w | 15 | Alice | r |
Bob | r | Bob | wx | Bob | wx | |||
Carl | x | Carl | r | Carl | rw |
Контрольні питання
- Яким чином можна згенерувати випадкове число?
- Для чого існує функція srand()?
- Яким чином генеруються цілі випадкові числа на певному інтервалі?
- Як згенерувати дійсні випадкові числа на певному інтервалі?
- Що таке масиви? Як розташовуються елементи масивів у пам’яті?
- Що собою являє рядок? В чому його особливість?
- Які бувають масиви за розмірністю та способом виділення їм пам’ті?
- Як оголошуюсь статичні масиви?
- Яка роль ключового слова const при оголошенні розмірності масиву?
- Що таке покажчик на змінну та адреса змінної? Що таке розіменування покажчиків?
- Як звернутись до першого та останнього елементу масиву за допомогою покажчиків?
- Яким чином обчислюється кількість байтів пам'яті, виділених масиву?
- Наведіть фрагмент програми (за допомогою операторів for, while та do-while), що обчислює суму, добуток, кількість парних елементів одновимірного масиву, найбільше та найменше значення.