
- •Лабораторна робота №1. Тема: Побудова блок-схем алгоритмів засобами програми Word 2010.
- •Хід роботи
- •Лабораторна робота № 2. Тема: Робота та знайомство в середовищі програмування. Запуск програм на виконання. Редагування тексту.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №3. Тема: Побудова алгоритмів за допомогою DiagramDesigner.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №4. Тема:Створення лінійних програм. Процедури вводу та виводу в машинному коді. Описати кожний рядок програми в звіті рукописом!!!!!!!!!!!!!!!!!
- •Теоретичні положення
- •Лабораторна робота №5. Тема: Написання програм використовуючі математичні функції. Освоєння арифметичних операторів. Описати кожний рядок програми від руки.
- •Лабораторна робота №6. Тема: Написання програм використовуючи логічні значення Boolean.
- •Теоретичні відомості
- •Булеві значення.
- •Детальний розпис програми:
- •Лабораторна робота №7. Тема: Типи в програмах.
- •Теоретичні положення
- •Хід роботи
- •Лабораторна робота №8. Тема: Оператор вибору в циклах середовища пргограмування.
- •Хід роботи
- •Оператор вибору варiанту.
- •Циклiчнi алгоритми.
- •Циклiчнi алгоритми
- •Лабораторна робота №9. Тема: Використання процедур та функцiй. Звукові можливості Паскаля.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №10. Тема: Використання перелiчуваного та обмеженого типу даних.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №11. Тема: Одновимiрнi масиви.
- •Теоретичні відомості
- •1. Одновимірні масиви (рядки, вектори):
- •Можна і так:
- •Хід роботи
- •Двовимiрнi масиви.
- •Лабораторна робота №12. Тема: Використання множин.
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №13. Стандартн і модулі Crt, Dos, System, Graph, Printer. Робота з клавiатурою
- •Теоретичні відомості
- •Іі семестр. Мова програмування с Лабораторна робота №13. Тема: Проста програма на с: друк рядка тексту
- •Лабораторна робота №14. Тема: Арифметика в с. Використання операцій рівності і відношення
- •Лабораторна робота №15 . Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while
- •Операції інкремента і декремента
- •Лабораторна робота №16. Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while
- •Основи структур повторення while
- •Структура повторення for
- •8. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму що кінцевим числом виведе на екран ваш номер варіанту по списку.
- •Лабораторна робота №17. Тема: Програмні модулі в с. Функції математичної бібліотеки
- •Генерація випадкових чисел
- •Рекурсія
- •Обчислення факторіалів рекурсивною функцією
- •Лабораторна робота №18. Тема: Приклади роботи з масивами
- •Передача масивів у функції
- •Лабораторна робота №19. Тема: Сортування масивів
- •Пошук в масивах
- •Двійковий пошук в сортованому масиві
- •Ініціалізація багатовимірних масивів
- •Лабораторна робота №20. Тема: Покажчики
- •Лабораторна робота №21. Тема: Покажчики
- •Лабораторна робота №22. Тема: Форматоване введення/вивід
- •Лабораторна робота №23. Тема: Використання прапорів в рядку управління форматом printf
- •Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf
- •Лабораторна робота №25. Тема: Структури, об′єднання, операції з бітами і перечисленнями
- •10.18. Використання перечислення Лабораторна робота №26. Тема: Створення файлу послідовного доступу
Генерація випадкових чисел
3. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть і проаналізуйте її виконання.
/* Генерація цілих 1 + rand () % 6 в масштабі і із зрушенням */
#include <stdio.h>
#include <stdlib.h>
main ( )
{
int i;
for (i = 1; i <= 20; i++)
{
printf("%10d", 1 + (rand() % 6));
if (i % 5 == 0)
printf("\n");
}
return 0;
}
Лабораторна робота №1. Тема: Побудова блок-схем алгоритмів засобами програми Word 2010. 3
Лабораторна робота № 2. Тема: Робота та знайомство в середовищі програмування. Запуск програм на виконання. Редагування тексту. 5
Лабораторна робота №3. Тема: Побудова алгоритмів за допомогою DiagramDesigner. 6
Лабораторна робота №4. Тема:Створення лінійних програм. Процедури вводу та виводу в машинному коді. 8
Лабораторна робота №5. Тема: Написання програм використовуючі математичні функції. Освоєння арифметичних операторів. 10
Лабораторна робота №6. Тема: Написання програм використовуючи логічні значення Boolean. 12
Лабораторна робота №7. Тема: Типи в програмах. 15
Лабораторна робота №8. Тема: Оператор вибору в циклах середовища пргограмування. 17
Лабораторна робота №9. Тема: Використання процедур та функцiй. Звукові можливості Паскаля. 21
Лабораторна робота №10. Тема: Використання перелiчуваного та обмеженого типу даних. 25
Лабораторна робота №11. Тема: Одновимiрнi масиви. 27
Лабораторна робота №12. Тема: Використання множин. 30
ІІ семестр. Мова програмування С 34
Лабораторна робота №13. Тема: Проста програма на С: друк рядка тексту 34
Лабораторна робота №14. Тема: Арифметика в С. Використання операцій рівності і відношення 35
Лабораторна робота №15 . Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 38
Лабораторна робота №16. Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 41
Лабораторна робота №17. Тема: Програмні модулі в С. Функції математичної бібліотеки 47
Лабораторна робота №18. Тема: Приклади роботи з масивами 57
Лабораторна робота №19. Тема: Сортування масивів 67
Лабораторна робота №20. Тема: Покажчики 80
Лабораторна робота №21. Тема: Покажчики 97
Лабораторна робота №22. Тема: Форматоване введення/вивід 116
Лабораторна робота №23. Тема: Використання прапорів в рядку управління форматом printf 122
Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf 125
Лабораторна робота №25. Тема: Структури, об′єднання, операції з бітами і перечисленнями 128
Лабораторна робота №26. Тема: Створення файлу послідовного доступу 138
5.7. Масштабовані і зрушені цілі, генеровані вираженням 1 + rand()%6
Як показує результат, виведений програмою, масштабування і зрушення у поєднанні з функцією rand дозволяє реалістично моделювати обертання шестигранної гральної кістки. Зверніть увагу, що в структурі switch немає варіанту default. Також звернете увагу на використання специфікації перетворення %s для друку символьних рядків "Face" і "Frequency" як заголовки стовпців.
Повторне виконання програми лістингу 5.7 дає результат
Лабораторна робота №1. Тема: Побудова блок-схем алгоритмів засобами програми Word 2010. 3
Лабораторна робота № 2. Тема: Робота та знайомство в середовищі програмування. Запуск програм на виконання. Редагування тексту. 5
Лабораторна робота №3. Тема: Побудова алгоритмів за допомогою DiagramDesigner. 6
Лабораторна робота №4. Тема:Створення лінійних програм. Процедури вводу та виводу в машинному коді. 8
Лабораторна робота №5. Тема: Написання програм використовуючі математичні функції. Освоєння арифметичних операторів. 10
Лабораторна робота №6. Тема: Написання програм використовуючи логічні значення Boolean. 12
Лабораторна робота №7. Тема: Типи в програмах. 15
Лабораторна робота №8. Тема: Оператор вибору в циклах середовища пргограмування. 17
Лабораторна робота №9. Тема: Використання процедур та функцiй. Звукові можливості Паскаля. 21
Лабораторна робота №10. Тема: Використання перелiчуваного та обмеженого типу даних. 25
Лабораторна робота №11. Тема: Одновимiрнi масиви. 27
Лабораторна робота №12. Тема: Використання множин. 30
ІІ семестр. Мова програмування С 34
Лабораторна робота №13. Тема: Проста програма на С: друк рядка тексту 34
Лабораторна робота №14. Тема: Арифметика в С. Використання операцій рівності і відношення 35
Лабораторна робота №15 . Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 38
Лабораторна робота №16. Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 41
Лабораторна робота №17. Тема: Програмні модулі в С. Функції математичної бібліотеки 47
Лабораторна робота №18. Тема: Приклади роботи з масивами 57
Лабораторна робота №19. Тема: Сортування масивів 67
Лабораторна робота №20. Тема: Покажчики 80
Лабораторна робота №21. Тема: Покажчики 97
Лабораторна робота №22. Тема: Форматоване введення/вивід 116
Лабораторна робота №23. Тема: Використання прапорів в рядку управління форматом printf 122
Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf 125
Лабораторна робота №25. Тема: Структури, об′єднання, операції з бітами і перечисленнями 128
Лабораторна робота №26. Тема: Створення файлу послідовного доступу 138
Зверніть увагу, що була надрукована та ж сама послідовність значень. Як же це може бути випадковими числами? Як не дивно, ця повторюваність є важливою характеристикою функції rand. При відладці програми ця повторюваність є істотним чинником для доказу того, що виправлення, внесені в програму, працюють правильно.
4. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму замінивши 6000 разів на свій номер варіанту по списку з додаванням двух нулів.
/* Кидання шестигранної гральної кістки 6000 разів */ #include <stdio.h> #include <stdlib.h> main ( ) { int face, roll, frequency1 = 0, frequency2 = 0, frequency3 = 0, frequency4 = 0, frequency5 = 0, frequency6 = 0; for (roll = 1; roll <= 6000; roll++){ face = 1 + rand () % 6; switch (face){ case 1 : ++frequencyl; break; case 2: ++frequency2; break; case 3: ++frequency3; break; case 4 : ++frequency4; break; case 5: ++frequency5; break; case 6: ++frequency6; break; } } printf ("%s%13s\n", "Face", "Frequency"); printf (" 1% 13d\n", frequency1); printf (" 2% 13d\n", frequency2); printf (" 3% 13d\n", frequency3); printf (" 4% 13d\n", frequency4); printf (" 5% 13d\n", frequency5); printf (" 6% 13d\n", frequency6); return 0; }
5.8. Кидання шестигранної гральної кістки 6000 разів |
Щоб показати, що ці числа з'являються приблизно з рівною імовірністю, давайте змоделюємо 6000 кидків гральної кістки, використовуючи програму, приведену нижче. Кожне ціле число від 1 до 6 повинно "випасти" приблизно 1000 разів.
Функція rand генерує насправді псевдовипадкові числа. При виклику rand генерується послідовність чисел, які виглядають випадковими. Проте ця послідовність повторюється при кожному новому виконанні програми. Коли програма буде ретельно відлагоджена, можна модифікувати її для генерації різних послідовностей випадкових чисел для кожного виконання. Це називається рандомізацією і забезпечується функцією стандартної бібліотеки srand. Функція srand отримує як аргумент ціле без знаку (тип unsigned), зване сім'ям, яке дозволяє отримувати від rand різні послідовності випадкових чисел при кожному виконанні програми. Застосування функції srand показане на лістингу 5.9. У програмі ми використовуємо тип даних unsigned, що є скороченням запису unsigned int. Тип int зберігається щонайменше в двох байтах пам'яті і може набувати позитивних і негативних значень. Змінна типу unsigned також зберігається щонайменше в двох байтах пам'яті. Двобайтове ціле типу unsigned int може набувати тільки позитивних значень в діапазоні від 0 до 65535. Чотирьохбайтове ціле типу unsigned int може набувати позитивних значень в діапазоні від 0 до 4294967295. Функція srand набуває як аргумент значення типу unsigned. Для читання даних типу unsigned функцією scanf потрібна специфікація перетворення % і. Прототип функції для srand знаходиться в <stdlib.h>. Давайте виконаємо програму кілька разів і подивимося на результати. Зверніть увагу, що при кожному виконанні програми виходять різні послідовності випадкових чисел, що забезпечується введенням різних значень.
|
5. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть і опишіть її.
/* Рандомізація програми кидання гральної кістки */ #include <stdlib.h> #include <stdio.h> main () { int I; unsigned seed; printf("Enter seed: "); scanf ("%u", &seed); srand(seed);
for (i = 1; i <= 10; i++){ printf("%10d", 1 + (rand () % 6)); if (i % 5 == 0) printf ( "\n"); } return 0; }
Enter seed: 67 1 6 5 1 4 5 6 3 1 2 Enter seed: 432 4 2 5 4 3 2 5 1 4 4 Enter seed: 67 1 6 5 1 4 5 6 3 1 2 Лістингу 5.9. Рандомізація програми бросання гральної кістки |
Якщо ми хочемо проводити рандомізацію без введення сім'я, ми можемо написати оператор ніби srand(time(NULL)); Комп'ютер тут прочитує показання внутрішніх годинників, щоб автоматично набути не визначеного заздалегідь значення. Функція time повертає поточний час дня в секундахЦе значення перетвориться в ціле без знаку і використовується як сім'я для генератора випадкових чисел. Функція time отримує як аргумент NULL (функція time може формувати рядок, що представляє час дняаргумент NULL забороняє цей варіант в цьому виклику time). Прототип функції time знаходиться в <time.h>. Значення, безпосередньо генеровані rand, завжди знаходяться в діапазоні 0 <= rand() <= RAND_MAX Заздалегідь ми показали, як написати єдиний оператор З, що імітує обертання шестигранної гральної кістки : face = 1 + rand () % 6; Цей оператор завжди привласнює ціле значення (випадковим чином) змінної face в діапазоні від 1 до 6. Зверніть увагу, що ширина цього діапазону (тобто число послідовних цілих чисел в нім) дорівнює 6 і початковим числом цього діапазону є 1. Що стосується попереднього твердження, ми бачимо, що ширина діапазону визначається числом, використовуваним для масштабування функції rand операцією ділення по модулю (тобто 6), а початкове число діапазону дорівнює числу, яке додається до rand % 6 (тобто 1). Ми можемо узагальнити цей результат таким чином: n = а + rand() % b; Тут а - значення зрушення (яке дорівнює першому числу діапазону послідовних цілих чисел), і b - коефіцієнт масштабування (який дорівнює ширині діапазону послідовних цілих чисел). У вправах у кінці розділу ми побачимо, що можна вибирати випадкові цілі числа з наборів значень, що не є послідовними. |
6. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи.
Приклад: стохастична гра
/* Гра в крепс */ #include <stdio.h> #include <stdlib.h> include <time.h> int rollDice(void); main () { int gameStatus, sum, myPoint; srand(time(NULL)); sum = rollDice(); /* перший викид кісток */ switch(sum){ case 7: case 11: /* виграш при першому кидку */ gameStatus = 1; break; case 2: case 3: case 12: /* програш при першому кидку */ gameStatus = 2; break; default: /* запам'ятати окуляри */ gameStatus = 0; myPoint = sum; printf("Point is %d\n", myPoint); break; } while (gameStatus == 0){ /* продовжувати кидати */ sum = rollDice (); if (sum == myPoint) /* виграш повторним викидом окулярів */ gameStatus = 1; else if (sum ==7) /* програш при викиді 7 */ gameStatus = 2; } if (gameStatus == 1) printf ("Player wins\n"); else printf("Player loses\n"); return 0; } int rollDice(void) { int diel, die2, workSum; diel = 1 + (rand() % 6); die2 = 1 + (rand() % 6); workSum = diel + die2; printf ("Player rolled %d + %d = %d\n", diel, die2, workSum); return workSum; }
Програма, що моделює гру в крепc Player rolled 6+5=11 Playe rwins Player rolled 6+6=12 Player loses
Player rolled 4+6=10 Point is 10
Player rolled 2+4=6 Player rolled 6+5=11 Player rolled 3+3=6 Player rolled 6+4=10 Player wins
Player rolled 1+3=4 Point is 4 Player rolled 1+4=5 Player rolled 5+4=9 Player rolled 4+6=10 Player rolled 6+3=9 Player rolled 1+2=3 Player rolled 5+2=7 Player loses Приклад виконання програми гри в кістці |
Однією з найбільш популярних стохастичних ігор є "крепc", в який грають в казино і в темних закутках по всьому світу. Правила гри прості: Гравець викидає дві кістки. Кожна кістка має шість граней. Ці грані містять 1, 2, 3, 4, 5 і 6 точок. Після того, як кістки зупиняться, обчислюється сума точок на двох гранях, повернених вгору. Якщо випавша сума при першому кидку опинилася рівною 7 або 11, то переміг гравець. Якщо сума при першому кидку склала 2, 3 або 12, то гравець програє (виграє казино). Якщо сума першого кидка дорівнює 4, 5, 6, 8, 9 або 10, то ця сума стає окулярами гравця. Щоб виграти, ви повинні, продовжити кидати кістки до тих пір, поки не наберете свої очки ще раз. Гравець програє, якщо при черговому кидку випадає 7. Програма, приведена лівіше, моделює цю гру. На програмі що нижче показано декілька прикладів виконання програми. (Приклад виконання програми гри в кістці) Зверніть увагу, що і в першому кидку і в усіх наступних гравець викидає дві кістки. Ми визначаємо функцію rollDice таким чином, що вона виконує кидки ігрових кісток, обчислює і друкує суму. Функція rollDice визначена один раз, але викликається в двох місцях програми. Цікаво, що rollDice не отримує ніяких аргументів, оскільки в списку параметрів стоїть void. Функція rollDice повертає суму, що випала на двох ігрових кістках, так що в заголовку функції як повертаного типу вказаний тип int. Починається гра. Гравець може виграти або програти вже при першому кидку, або може виграти або програти при будь-якому наступному. Для відстежування ситуації використовується змінна gameStatus. Коли програма виграла або на першому кидку, або на будь-якому з наступних, змінна gameStatus встановлюється рівною 1. Коли програма програла на першому кидку або на одному з наступних, gameStatus встановлюється рівною 2. У інших випадках gameStatus дорівнює нулю і гра повинна тривати. Якщо після першого кидка гра закінчується, програма обходить структуру while, оскільки змінна gameStatus не дорівнює нулю. Програма переходить до структури if/else, яка виводить на друк рядок "Player wins" (Гравець виграв), якщо gameStatus дорівнює 1, і "Player loses" (Гравець програв), якщо gameStatus дорівнює 2. Якщо після першого кидка гра не закінчується, то значення sum зберігається в змінній myPoint. Виконання програми триває за участю структури while, оскільки gameStatus рівна О. Кожного разу при проходженні структури while викликається функція rollDice, яка генерує нову суму. Якщо значення sum співпадає зі значенням myPoint, gameStatus встановлюється на 1, щоб показати, що гравець виграв. Після цього слідує вихід із структури while, оскільки її умова перестає виконуватися, структура if/else виводить на друк рядок "Player wins" і виконання програми припиняється. Якщо значення sum дорівнює 7, gameStatus встановлюється на 2, щоб показати, що гравець програв. Далі слідує вихід із структури while, оператор if/else друкує рядок "Player loses" і виконання програми припиняється. Зверніть увагу на цікаву структуру програми, що управляє. Ми використовували дві функції - main і rollDice, структури switch, while, if/else і вкладену структуру if. У вправах ми досліджуємо різні цікаві характеристики гри в крепc. |