МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
АЛГОРИТМІЧНА МОВА ПРОГРАМУВАННЯ Сі
ПРОГРАМИ З РОЗГАЛУЖЕНИМИ ТА ЦИКЛІЧНИМИ АЛГОРИТМАМИ
ІНСТРУКЦІЯ ДО ЛАБОРАТОРНОЇ РОБОТИ № 2
З КУРСУ “АЛГОРИТМІЧНІ МОВИ І ПРОГРАМУВАННЯ”
для студентів спеціальностей
7.160102 “Захист інформації з обмеженим доступом та автоматизація її обробки”
7.160103 “Системи захисту від несанкціонованого доступу”
7.160104 “Адміністративний менеджмент в сфері захисту інформації з обмеженим доступом”
7.160105“Захист інформації і комп'ютерних системах і мережах”
Затверджено
на засiданнi кафедри
“Захист інформації”
Протокол №___ від __ ________2008 р.
Львів 2008
Алгоритмічна мова програмування Сі. Програми з розгалуженими та циклічними алгоритмами. Інструкція до лабораторної роботи № 2 з курсу “Алгоритмічні мови і програмування” для студентів спеціальностей 7.160102 “Захист інформації з обмеженим доступом та автоматизація її обробки”, 7.160103 “Системи захисту від несанкціонованого доступу”, 7.160104 “Адміністративний менеджмент в сфері захисту інформації з обмеженим доступом”, 7.160105“Захист інформації і комп'ютерних системах і мережах” / Укл.: Отенко В.І., Гарасимчук О.І., Будз Б.Д. – Львів: НУЛП, 2008.- 20 с.
Укладачі: Отенко В.І., к.т.н, доцент,
Гарасимчук О.І., к.т.н, доцент,
Будз Б.Д., асистент
Мета роботи – вивчити оператори мови Сі та основні функції введення-виведення даних, навчитися складати та відлагоджувати розрахункові програми з розгалуженими та циклічними структурами.
ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Оператори є основними елементами, із яких будується програма на мові Cі. Оператор є закінченою інструкцією для комп’ютера. Ознакою оператора є символ “ ; ”, що його завершує. Тому, наприклад, якщо number = 4 є виразом (який може бути частиною більшого виразу), то number = 4; є оператором.
1.1. Пустий оператор “ ; ”.
Пустий оператор – це оператор, який складається лише із крапки з комою “ ; ”.
Синтаксис:
;
Даний оператор може з’являтися в довільній частині програми, де за синтаксисом може знаходитись оператор. Виконання пустого оператора не змінює стану програми. Пустий оператор найчастіше використовується тоді, коли за синтаксисом необхідна наявність оператора, який б не виконував ніяких дій, зокрема в операторах do, for, if, while.
Приклад:
for(i = 0; i < 10; i++)
;
В наведеному прикладі у третьому виразі оператора циклу for значення змінної і інкрементується, доки і не стане рівним 10.
1.2. Оператор-вираз.
Синтаксис:
<вираз>;
Оператор-вираз може бути записаний лише там, де по синтаксису допустимий оператор.
Приклад:
x = y + 3; /* приклад 1*/
x++; /* приклад 2*/
f(x); /* приклад 3*/
В першому прикладі змінній х присвоюється значення y + 3.
В другому прикладі змінна х інкрементується.
В третьому прикладі показанно вираз виклику функції.
1.3. Умовний оператор if.
Умовний оператор дає змогу змінити хід виконання програми залежно від результату перевірки значення деякого виразу логічного типу.
Синтаксис:
if <вираз>
<оператор1> [else <оператор2>]
де if, else – ключові слова мови Cі;
<вираз> – вираз логічного типу;
<оператор1> – оператор, який виконується, якщо значення виразу <вираз> є істинне (true); <оператор2> – довільний оператор, який виконується, якщо значення виразу <вираз> не є істинне (false). Частина умовного оператора обмежена квадратними дужками є необов’язковою.
Якщо значення виразу <вираз> є false, однак конструкція else пропущена, то керування передається на оператор, що знаходиться в програмі за оператором if.
Приклад:
if (a < 10)
a = 10;
else
a = 15;
В даному прикладі показано, що змінній а присвоюється значення 10 тоді, коли значення виразу (a < 10) – true, тобто умова виконується; в іншому випадку, якщо значення виразу false, (тобто (а > = 10) або (а > 10)), змінній а присвоюється значення 15.
В одному операторі можна використовувати стільки конструкцій else if, скільки потрібно, що ілюструється на даному прикладі:
if (a < 10)
a = 10;
else if (a < 15)
a = 15;
else if (a < 20)
a = 20;
else
a = 25;
Існує правило, яке говорить, що else відповідає найближчому if, крім тих випадків, коли присутні фігурні дужки.
Приклад1:
if (number > 6)
if (number < 12)
printf (“Вивід змінних … ”);
else
printf (“Вивід змінних завершено ! ”);
При виконанні програми результат буде наступним:
Число Результат
5 Немає
10 Вивід змінних …
15 Вивід змінних завершено !
Якщо ми хочемо, щоб else відповідав першому if , необхідно даний фрагмент оформити наступним чином:
if (number > 6)
{
if (number < 12)
printf (“Вивід змінних … ”);
}
else
printf (“Вивід змінних завершено !”);
Тепер результат виглядатиме так:
Число Результат
5 Вивід змінних завершено !
10 Вивід змінних …
15 Немає
В мові Сі є короткий спосіб запису одного із видів оператора if else. Він називається “Умовним виразом” і використовує операцію умови ? : . Ця операція складається із двох частин і містить три операнда. Нижче наводиться приклад оператора, за допомогою якого знаходиться абсолютне значення числа:
x = (y < 0 ) ? –y : y;
Cенс оператора полягає у наступному:
Якщо y < 0 то x = -y; в іншому випадку x = y.
В загальному випадку умовний вираз можна записати наступним чином:
<вираз1> ? <вираз2> : <вираз3>;
1.4. Оператор циклу з передумовою while.
Оператор циклу while визначає ччоперації, які циклічно виконуються до тих пір, поки вираз, що перевіряється не стане false або рівним 0. Оператор while – це цикл з передумовою; рішення, чи виконувати в черговий раз тіло циклу, приймається перед початком його проходження.
Оператор, що утворює тіло циклу, може бути або простим або складеним.
Синтаксис простого оператора:
while (вираз) /*простий оператор*/
<oператор>
Приклад:
while (i < 0)
printf(“Значення змінної і від’ємне”);
Оператор виконується в тому випадку, коли i < 0. Якщо значення і буде більшим чи рівним 0 ((i > 0) чи (і >= 0)), то тіло оператора while взагалі не буде виконуватись і управління зразу перейде на наступний за тілом циклу оператор програми.
Синтаксис складеного оператора :
while (вираз) /*складений оператор*/
{
<oператор1>
<oператор2>
}
Приклад:
while (i < 10)
{
i = 0;
i++;
printf(“Значення змінної і = %d”, i );
}
1.5. Оператор покрокового циклу for.
В операторі for використовуються три вирази, що керують роботою циклу; вони розділені символами “ ; ”.
Синтаксис:
for( [<ініціалізація>]; [<умовний вираз>]; [<корекція>])
<oператор>
Тіло оператора циклу for виконується до тих пір, поки <умовний вираз> не стане false або рівним 0. Якщо він із самого початку false, то тіло циклу не буде виконано жодного разу. <Ініціалізація> і <корекція> використовуються для ініціалізації і модифікації параметрів циклу чи інших значень.
Ініціалізуючий вираз (якщо він є) обчислюється тільки один раз до початку виконання якого-небудь із операторів циклу. Потім обчислюється умовний вираз і проводиться його оцінка наступним чином:
Якщо вираз що перевіряється true (не рівний нулю), то тіло циклу виконується один раз. Потім обчислюється величина виразу що коректується, і значення виразу що перевіряється визначається знову.
Якщо <умовний вираз> пропущений, то його значення приймається за істину і процес виконання продовжується. В цьому випадку оператор циклу for пердставляє собою безкінечний цикл, який може завершитись тільки при виконанні в його тілі операторів break, goto, return.
Якщо умовний вираз не істинний, то виконання оператора for завершується і управління передається наступному за ним оператору в програмі.
Оператор for – це цикл з передумовою: рішення, виконати в черговий раз тіло циклу чи ні, приймається до початку його проходження. Тому може бути так, що тіло циклу не буде виконано ні разу.
Оператор, що утворює тіло циклу, може бути як простим (приклад 1), так і складеним (приклад2)
Приклад1:
for( n = 0; n < 10; n++)
printf( “%d”, n);
Приклад2:
for( n = 0; n < 10; n++)
{
k = 5 * b;
printf( “%d”, k);
}
В даних прикладах тіло циклу виконується до тих пір, поки умова що перевіряється (n < 10), не стане false чи рівна нулю.
Операція “,” пов’язує два вирази в один і гарантує, що самий лівий вираз буде обчислюватись першим.
Приклад:
for( а = 1, в = 0; в < 10; a * = 2)
b + = a ;
1.6. Оператор циклу з післяумовою do while .
Оператор do while визначає дії, які циклічно виконуються до тих пір, поки вираз не стане false, чи рівним 0. Оператор do while – цикл з післяумовою; рішення, виконувати чи не виконувати в черговий раз тіло циклу, приймається після його проходження. Тому тіло циклу буде виконуватись по крайній мірі один раз. Оператор, що утворює тіло циклу, може бути як простим, так і складеним.
Форма запису:
do
<оператор>
while (вираз)
Виконання оператора повторюється до тих пір, поки вираз не стане false, чи рівним 0.
Наприклад:
do
scanf (“%d”, &number);
while (number ! = 20)
Оператори switch і break.
Загальна структура оператора switch:
switch(цілий вираз)
{
case константа1:
<оператори> (необов’язкові)
case константа2:
<оператори> (необов’язкові)
. . . .
default:
<оператори> (необов’язкові)
}
Управління в програмі передається оператору, у якого в якості міток використовується значення деякого виразу. Потім в процесі проходження програми будуть виконуватись оператори, що залишились, поки не відбудеться новий перехід. Як вирази, так і мітки повинні мати значення цілого типу (включаючи тип char); мітки повинні бути константами чи константними виразами. Якщо деякому значенню виразу не відповідає ніяка мітка, управління передається оператору з міткою default (якщо такий є в програмі). В протилежному випадку управління передається оператору, що знаходиться за оператором switch (приклад ).
Приклад:
switch(number)
{
case 1: printf(“Номер 1-ший”);
break;
case 2: printf(“Номер 2-гий”);
break;
. . . .
default: printf(“Інші номера…”);
break;
}
Цей приклад слугує ілюстрацією роботи оператора switch. Спочатку обчислюється вираз в дужках, розташованого за ключовим словом switch. В даному випадку значенням цього виразу буде символ, присвоєний змінній number, яким ми ввели перед цим. Далі програма переглядає список “міток” (в цьому прикладі case 1; , case 2: і т.д.) доки не знайде “мітку”, яка відповідає даному значенню, і виконує оператор розташований після “мітки”. Наступний етап – програма переходить до виконання оператора, що розташований в цій стрічці. Якщо такої “мітки” не знаходиться і якщо існує стрічка з “міткою” case default: , то буде виконуватись оператор, що позначений цією “міткою”. В іншому випадку відбудеться перехід до оператора, розташованому за оператором switch.
Виконання оператора break приводить до того, що в програмі відбувається вихід із оператора switch і здійснюється перехід до наступного оператора, що знаходиться за даним.
При відсутності оператора break будуть виконані всі оператори, починаючи з поміченого даною “міткою” і закінчуючи оператором switch.
Ключові слова: break, continue, goto .
Ці три команди викликають перехід від одного оператора програми до іншого, розташованого в іншому місці (в тілі програми).
break
Оператор break можна використовувати з любою із трьох форм циклу і з оператором switch. Вона приводить до того, що управління програмою “ігнорує” залишок циклу чи оператор switch, що містить цей залишок, і поновлює виконання програми з оператора, що знаходиться за циклом чи оператором switch (див. попередній приклад). Якщо оператор break знаходиться в середині деякої сукупності вкладених структур, його дія розповсюджується тільки на саму внутрішню структуру, в якій він безпосередньо знаходиться.
continue
Оператор continue може використовуватись в любій з трьох форм циклів, но не в операторі switch. Його виконання приводить до такої зміни логіки програми, що решту операторів циклу пропускаються. Для циклів while чи for в слід за цим починається новий крок, а для циклу do while перевіряється умова на виході, і потім, якщо вона виявляється істинною, виконується наступна ітерація.
Приклад:
while(number != 0)
{
if(number = = 2)
continue;
printf(“number = %d”, number);
}
goto
Bиконання оператора goto викликає передачу управління в програмі оператору, поміченому вказаною міткою. Для відокремлення оператора від відповідної йому мітки використовується двокрапка “ : “ . Імена міток утворюються по тим же правилам, що й імена змінних. Позначений оператор може появитися в програмі текстуально до чи після goto.
Форма запису:
goto мітка;
. . . . .
мітка: оператор;
Приклад:
top : number = 1;
. . . . .
if(number = = 0)
goto top;
2. ЗАВДАННЯ
2.1. Домашня пiдготовка до роботи
1. Вивчити синтаксис, призначення, принцип роботи і використання операторів мови СІ та основних функцій введення-виведення.
2. Скласти блок-схеми алгоритмів та програми мовою СІ для табулювання функцій. Забезпечити ввід значень інтервалу, кроку і похибки табулювання з клавіатури і вивід результатів на дисплей. Дані для роботи беруться з таблиць 1 і 2 за вказівкою викладача:
а) табулювання функції (див. табл.1), що вибирається залежно від значення аргумента, на проміжку [a, b] з кроком табуляції h.
Таблиця 1
№ п/п
Функції
Умови для вибору функцій
Крок, h
Інтервал, [a,b]
1
0.02
[0.5, 0.9]
2
0.2
[2, 4]
3
0.2
[4, 6]
4
0.2
[2, 4]
5
0.05
[0.1, 0.7]
6
0.02
[0.5, 0.8]
7
0.2
[3, 6]
8
0.2
[1.5, 3.5]
9
0.2
[4, 7]
10
0.1
[2, 3]
11
0.2
[3, 6]
12
0.2
[0.5, 2]
13
0.02
[0.2, 0.5]
14
0.02
[0.4, 0.8]
15
0.2
[7.5, 10]
16
0.2
[2, 5]
17
0.05
[0.3, 0.9]
18
0.05
[-0.9, -0.4]
19
0.05
[0.3, 0.9]
20
0.3
[0.3, 3.5]
21
0.3
[3, 6]
22
0.2
[2, 5]
23
0.5
[3, 8]
24
0.2
[2, 5]
25
0.2
[6, 9]
26
0.5
[0,6, 1,2]
27
0.2
[3, 6]
28
0.1
[1.5, 3]
29
0.5
[0, 5]
30
0.3
[3, 9]
31
0.1
[2, 4]
32
0.2
[1, 4]
33
0.05
[0.2, 0.9]
34
0.2
[4, 7]
35
0.3
[3, 9]
б) табулювання функції, представленої рядом (див. табл.2), на інтервалі [a, b] з кроком табуляції h та абсолютною похибкою d. Оцінку похибки здійснювати за значенням модуля чергового члена ряду.
Таблиця 2
№ п/п
Функція
Інтервал, [a, b]
Крок, h
Похибка, d
1
[0.5, 0.7]
0.02
0.001
2
[0.1, 0.6]
0.05
0.001
3
[3, 4]
0.1
0.001
4
[0.2, 0.3]
0.01
10-6
5
[1.1, 2]
0.1
0.001
6
[-1, 1]
0.5
0.001
7
[-1, 1]
0.2
0.001
8
[-1, -0.9]
0.01
0.001
9
[-1, 1]
0.1
0.001
10
[0.1, 1]
0.1
0.001
11
[0, 1]
0.1
0.0001
12
[1, 2]
0.1
0.001
13
[3, 4]
0.1
0.001
14
, m=20
[0.1, 0.5]
0.05
0.001
15
, m=3
[0.1, 0.5]
0.05
0.001
16
[1, 1.2]
0.02
10-6
17
[1, 1.5]
0.05
10-5
18
[1, 1.5]
0.05
10-5
19
[0, 0.5]
0.05
0.001
20
[-0.5, 0]
0.05
0.001
21
[0.5, 0.9]
0.05
0.001
22
[0.5, 0.9]
0.05
0.001
23
[0.1, 0.2]
0.01
0.001
24
, m=20
[0, 0.5]
0.05
0.001
25
, m=9
[0, 0.5]
0.05
0.001
26
[1, 5]
0.5
0.001
27
[0.1, 0.6]
0.05
0.001
28
[-1, 1]
0.2
0.001
29
[0.1, 0.5]
0.05
0.0001
30
[0.5, 1]
0.05
0.00001
31
[1, 2]
0.1
0.0001
32
[3, 4]
0.1
0.001
33
[0.5, 0.9]
0.05
0.001
34
[1, 1.5]
0.05
10-5
35
[0.1, 0.6]
0.05
0.001
2.2. Робота в лабораторії
Ввести в комп'ютер програму, написану мовою CI згідно з отриманим завданням.
Відлагодити програму. При необхідності скоригувати блок-схему алгоритму та програму у відповідності з виявленими логічними та синтаксичними помилками.
Остаточні версії блок-схеми, програми та отримані результати занести у звіт з лабораторної роботи.
Здати звіт з лабораторної роботи.
3. ЗМIСТ ЗВIТУ
Номер і назва лабораторної роботи.
Повний текст завдання.
Остаточна версія блок-схеми алгоритму.
Список ідентифікаторів констант, змінних, функцій, використаних у блок-схемі алгоритму і програмі, та їх пояснення.
Остаточна версія програми.
Результати роботи програми.
СПИСОК ЛIТЕРАТУРИ
Керниган Б., Ритчи Д., Фоюэр А. Язык программирования Си. Задачи по языку Си: Пер. с англ. – М. : Финансы и статистика, 1985.
Бочков С.О., Субботин Д.М. Язык программирования для персонального компьютера. – М.: СП «Диалог» «Радио и связь» 1990.
Уэйт М., Прата С., Мартин Д. Язык Си. Руководство для начинающих: Пер. с англ. – М. : Мир, 1988.
Проценко В.С., Чаленко П.Й., Ставровський А.Б. Техніка програмування мовою СІ. - Київ: Видавництво «Либідь», 1993.