Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторна робота № 5. Програмування розгалуженого обчислювального процесу
Приклад виконання роботи
Вхідні дані |
Дії |
Вихідні дані |
x дійсного типу. |
Якщо виконується 0x5, тоді y=x2, інакше y= cos x |
y дійсне. |
a,b,x
введення даних
y
0x5
y=x2
y=cos x
+
4.4.1 АМ-схема алгоритма
Для перевірки правильності МПЗ та складеної програми розглянемо таки випадки:
Вхідні дані |
Розрахунок вихідних даних |
||
вручну |
Сі |
||
x=3 |
9 |
9.0 |
|
x=0 |
0 |
0.0 |
|
x=5 |
25 |
25.0 |
|
x=-4 |
-0,653644 |
-0,653644 |
|
x=9 |
-0,911130 |
-0,911130 |
По всіх тестових прикладах розрахунки, що були отримані вручну та програмно співпадають, це доводить правильність роботи програми.
Після запуску програми на екран виводиться повідомлення-запрошення про введення значення х. Необхідно ввести дійсне значення x. Обмежень на значення х не встановлюється.
Після розрахунку на екран виводиться значення у.
Для завершення роботи програми необхідно натиснути будь-яку клавішу на клавіатурі.
4.5.1. АПМ -Текст програм Сі.
#include <stdio.h> |
#include <conio.h> |
#include <math.h> |
main() |
{ |
float x, y; |
clrscr(); |
printf("Input x:"); |
scanf("%f", &x); |
if (x>=0 && x<=5) y=pow(x, 2); |
else y=cos(x); |
printf("\ny=%9.6f", y); |
getch(); |
} |
Варіанти завдань 1
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
|
|
|
|
|
|
4.1.2. Постановка завдання
Рекомендації до виконання роботи
Як вже було вказано в завданні, при виконанні цієї роботи необхідно використовувати оператор множинного розгалуження ( в мові Сі оператор switch case - default ).
Бажано при написі програми використовувати також гілку else(default) для перевірки та видачі повідомлення про «неможливі» значення вхідних даних, навіть якщо це не передбачено в умові варіанту завдання.
Приклад виконання роботи
Скласти програми Сі для виведення на екран повідомлення “молодша школа”, “середня школа”, “старша школа” в залежності від заданого номера класу.
4.1.2. Математична постановка задачі(МПЗ).
Вхідні дані |
Дії |
Вихідні дані |
К ціле Обмеження: К>0. |
Якщо К співпадає з: 1..4, тоді вивести |
молодша школа |
5..9, тоді вивести |
середня школа |
|
10, 11, вивести |
старша школа |
|
інакше вивести |
стільки не вчаться!!! |
Примітка! Схему алгоритму дивися на наступній сторінці.
Вхідні дані |
Розрахунок вихідних даних |
|
Сі |
||
К=2 |
молодша школа |
|
К=7 |
середня школа |
|
К=10 |
старша школа |
|
К=22 |
стільки не вчаться!!! |
По всіх тестових прикладах отримані коректні вихідні повідомлення.
4.4 Після запуску програми на екран виводиться повідомлення-запрошення про введення значення К. Необхідно ввести цілочисельне
Введення К
К
Стільки не вчаться
Молодша школа
Середня школа
Старша школа
1..4
5..9
10..11
+
-
додатне значення К. Після цього на екран виводиться повідомленні про шкільний рівень.
Для завершення роботи програми необхідно натиснути будь-яку клавішу на клавіатурі.
4.1.5. АПМ -Текст програм Сі.
#include <stdio.h> |
#include <conio.h> |
main() |
{ |
short k; |
clrscr(); |
printf("Введіть клас :"); |
scanf("%hd", &k); |
switch (k) { |
case 1:case 2:case 3:case 4: |
printf("молодша школа "); break; |
case 5:case 6:case 7:case 8:case 9: |
printf("середня школа "); break; |
case 10:case 11: |
printf("старша школа "); break; |
default: printf("стільки не вчаться!!!"); |
} |
getch(); |
} |
Варіанти завдань 2
№ квартири |
Тип квартири |
1,2,3,4, 16,17 |
однокімнатна |
5,7,9,12,13 |
двокімнатна |
6,8,10,14,15 |
трикімнатна |
11,18,19,20 |
чотирьохкімнатна |
Отже, за введеним номером квартири вивести її тип.
4.1.3. Постановка завдання
Скласти програми Сі для перевірки, чи належить точка з координатами (х, у) до заданої області(див. варіанти завдань).
Рекомендації до виконання роботи.
4.2.3. В математичній постановці задачі необхідно визначити:
Для прямої рівняння визначається за формулою:
,
де x1, y1, x2, y2 координати двох точок, що належать прямій.
Для кола:
де xс, yс координати центра, R радіус.
Приклад виконання роботи
В якості приклада буде розглянуто математичну постановку задачі(МПЗ) для двох варіантів областей, що задані на рис 1. та рис.2. Інші пункти прикладу виконання роботи будуть продовжувати МПЗ для рис. 1.
3
2
5
X
Y
Рис. 1
Математична постановка задачі.
Приклад 1(рис. 1)
Задана на рис. 1 область обмежена колом, центр якого знаходиться в точці (3, 2) і радіусом 2 та прямою, що проходить через пару точок (3, 4), (5, 2).
Після перетворень отримуємо: .
По-друге, для того щоби потрапити в задану область точка повинна бути нижче прямої, отже, її координати повинні задовольняти умові:
Приклад 2(рис. 2)
2
2
4
X
Y
Рис. 2
Задана на рис. 2 область обмежена трьома прямими, які описуються рівняннями:
y=2, y=0, x=4,
та півколом з координатами центру (2,2) і радіусом 2.
Рівняння кола буде:
Точка з координатами (х, у) буде належати заданій області, якщо вона потрапляє в коло, тобто виконується умова:
,
або до прямокутника, для якого виконуються умови:
x2 x4 y0 y4.
Ці чотири умови обєднані конюнкцією (логічне “І”) тому, що кожна з них повинна виконуватися для того, щоби точка за координатами (х, у) потрапляла всередину прямокутника.
Отже, точка належить області заданій на рис. 2, якщо вона потрапляє АБО до кола, АБО до прямокутника. Ці дві умови можна обєднати в один логічний вираз операцією дизюнкції (логічне “АБО”):
(x2 x4 y0 y4).
Вхідні дані |
Дії |
Вихідні дані |
x, y координати точки дійсного типу. |
Якщо виконується , тоді вивести на екран |
Належить |
інакше вивести на екран |
Не належить |
x,y
Належить
+
Не належить
4.4.3 АМ
Для перевірки правильності МПЗ та складеної програми розглянемо таки випадки:
Умова виконується.
Умова не виконується.
Вхідні дані |
Розрахунок вихідних даних |
||
вручну |
Сі |
||
x=3, y=1 |
Належить |
Належить |
|
x=3, y=4 |
Належить |
Належить |
|
x=4, y=2 |
Належить |
Належить |
|
x=4.5; y=3 |
Не належить |
Не належить |
|
x= 1, y=1 |
Не належить |
Не належить |
|
x=6, y=5 |
Не належить |
Не належить |
По всіх тестових прикладах результати, що були отримані вручну та програмно співпадають, це доводить правильність роботи програми.
. Опис програмного інтерфейсу з користувачем.
Після запуску програми на екран виводиться повідомлення-запрошення про введення значення координат точки (х, у). Необхідно ввести дійсне значення. Обмежень на значення х не встановлюється.
На екран виводиться повідомлення ”належить” чи “не належить” в залежності від результатів перевірки.
Після виведення результатів на екрані зявляється повідомлення:
“Для виходу з програми нажміть ESC”.
Для продовження роботи програми необхідно натиснути будь-яку клавішу на клавіатурі, для виходу з програми <ESC>.
4.5.3. АПМ -Текст програм Сі.
#include <stdio.h> |
#include <conio.h> |
#include <math.h> |
main() |
{ |
float x, y; |
do |
{ |
clrscr(); |
printf("Введіть координати (x, у): "); |
scanf("%f%f", &x, &y); |
if (pow(x-3, 2)+pow(y-4, 2)<= 4 && x<=5) printf(“Належить\n”); |
else printf(“Не належить\n”); |
printf("Для виходу нажміть ESC"); |
} |
while (getch() != 27); |
} |
Варіанти завдань 3
4.1.4. Постановка завдання
Рекомендації до виконання роботи
В залежності від типу клавіатури на ній можуть бути розташовані 83/84, 101/102, 122 клавіші. Але принцип розташування та призначення основних клавіш на всіх типах клавіатури однакові.
При натисненні або відпусканні клавіші на клавіатурі генерується електричний сигнал, який розпізнається контролером клавіатури. Контролер клавіатури передає код відповідної клавіші(скен-код) для подальшої обробки. В залежності від типу клавіші генеруються прямі або розширені коди.
Прямий скен-код клавіші розміром один байт і його значення співпадає з кодом відповідного символу в таблиці ASCII-кодів.
Розширений скен-код займає два байти: старший нульовий, молодший код клавіші.
старший байт |
молодший байт |
00 |
код клавіші |
Алфавітно-цифрова група клавіш та клавіші Esc, Tab, BackSpace, Enter, пробіл(Space), клавіші правої цифрової групи (крім Del) повертають прямі скен-коди (рис. 3).
Функціональні клавіші та клавіші управління курсором повертають розширені скен-коди.
Зсувні клавіші Shift, Ctrl, Alt, клавіші CapsLock (фіксування режиму прописних букв) та NumLock(фіксування режиму введення цифр), PrintScrn(друк екрану), ScrollLock(блокування прокрутки екрану), Pause/Break(переривання команди) не повертають кодів.
Але якщо зсувні клавіші використовуються в комбінаціями з клавішами алфавітно-цифрової клавіатури, вони повертають розширений скен-код. Наприклад, якщо натиснути на клавіатурі кнопку з латинською буквою a, буде повернений код 97, при натисканні Shift+a буде повернений код 65 це символ А.
Esc 27 |
12 функціональних клавіш (розширений код) |
Панель індикаторів |
||||||||
Back spase 8 |
NL |
|||||||||
Tab 9 |
Алфавітно-цифрові клавіші |
Клавіші управління (розширений код) |
Права цифрова група клавіш |
|||||||
Caps Lock Ø |
Enter 13 |
|||||||||
Shift Ø |
Shift |
|||||||||
Ctrl Ø |
Alt Ø |
SPACE (“Any key”) 32 |
Alt Ø |
Ctrl Ø |
Del |
|||||
Рис. 3 Загальна схема розташування клавіш |
||||||||||
Клавіши управління курсором (розширений код) |
Права цифрова група клавіш (прямий код) |
|||||||||
Print Scrn |
Scroll Lock |
Pause Break |
Num Lock |
/ |
* |
|
||||
Ø |
Ø |
Ø |
Ø |
47 |
42 |
45 |
||||
Insert |
Home |
PgUp |
Home |
PgUp |
+ |
|||||
82 |
71 |
73 |
55 |
56 |
57 |
43 |
||||
Delete |
End |
PgDn |
||||||||
83 |
79 |
81 |
52 |
54 |
||||||
End |
PgDn |
Enter |
||||||||
72 |
49 |
50 |
51 |
13 |
||||||
Ins |
Del |
|||||||||
75 |
80 |
77 |
48 |
00:83 |
||||||
Рис. 4. Розташування та коди клавіш управління курсором та правих цифрових. |
Для обробки в програмі сигналів від клавіатури можна скористатися такими функціями:
Мова прогр. |
Функція |
Призначення |
Бібліо-тека |
Сі |
char getch(); |
“” |
conio.h |
* не для всіх клавіш на клавіатурі є відповідні символи, наприклад ESC(простий скен-код 27, в ASCII-таблиці не позначений), тому для перетворення числового коду в його символьний еквівалент в Паскаль-програмі використовується такий запис:
Сі-програма розглядає символьні дані, як числові, тому, наприклад, символ a та його код 97 з точки зору Сі-програми не розрізняються.
Для отримання інформації про натиснуті клавіші у програмі необхідно оголосити символьну змінну і присвоювати їй значення, що повертає функція ( getch() ).
#include <conio.h> |
main() |
{ char c; |
c=getch(); |
} |
Але це спрацьовує, якщо клавіша повертає простий скен-код. Якщо клавіша повертає розширений скен-код, необхідно двічі звертаися до функції ( getch() ): перший раз для зчитування старшого байту #0(або просто 0 в Сі), вдруге для зчитування молодшого байту коду. Узагальнений фрагмент програми для зчитування і простих і розширених кодів буде:
#include <conio.h> |
main() |
{ char c; |
c=getch(); |
if (c= =0) c=getch(); |
…/* подальша обробка коду */ |
} |
Зазвичай тестування будь-якої програми потребує багатократного запуску, що вщент виснажує розробника :-). Можна додати до тексту програми оператор циклу з пост-умовою, в якому наприкінці виводити приблизно таке повідомлення: Для виходу натисніть ESC, для продовженя будь-яку клавішу, а в рядку-завершенні циклу звертатися до getch()) і перевіряти код на ESC.
… … … /*препроцесування */ |
main() |
{ |
do |
{ |
… … … /* текст програми */ |
printf("\n Для виходу натисніть ESC, для продовженя будь-яку клавішу \n"); |
} |
while (getch() != 27); |
Завдання: |
|
#include <stdio.h> |
#include <conio.h> |
main() |
{ |
int c; |
clrscr(); |
do |
{ |
printf("Натисніть клавішу\n"); |
c=getch(); |
if (c==0) |
{ |
c=getch(); |
printf("Розширений код>>>%d", c); |
} |
else printf("Код клавіші >>>%d\n", c); |
|
printf("\n <ESC> для виходу або будь-яку клавішу для продовження \n"); |
} |
while (getch() != 27); |
} |