МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
ОСНОВНІ ПОНЯТТЯ АЛГОРИТМІЧНОЇ МОВИ С.
ОПЕРАТОРИ РОЗГАЛУЖЕННЯ ПРОГРАМИ У МОВІ С
ІНСТРУКЦІЯ
до лабораторної роботи № 1 з курсу
“Проблемно-орієнтовані мови програмування”
для базового напрямку “Комп’ютерні науки”
Затверджено
На засіданні кафедри
Систем автоматизованого проектування.
Протокол № _____ від ______________2005 р.
ЛЬВІВ – 2005
1. МЕТА РОБОТИ
Мета роботи - вивчення основних понять алгоритмічної мови Сі, операцій, стандартних функцій, операторів розгалуження програми.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
Сі - універсальна мова програмування. Вона розроблялась в тісному зв’язку з системою UNIX, однак не є прив’язаною до цієї операційнї системи і може використовуватись у будь-яких операційних системах або машинах.
Сі - мова порівняно “низького рівня” У ній немає:
а) прямих операцій над такими об’єктами як множини, стрічки, списки і масиви;
б) операцій які маніпулюють з цілими масивами або стрічками, натомість використовуються структури;
в) засобів розподілу пам’яті окрім можливості визначення статичних змінних і стекового механізму при виділенні місця для локальних змінних функцій;
г) засобів вводу-виводу (READ, WRITE) і методів доступу до файлів.
Все це механізми високого рівня, які в мові Сі реалізуються за допомогою функцій.
Мова Сі містить засоби лише послідовного управління ходом обчислень: не містить засобів мультипрограмування і паралельних процесів.
Основна філософія мови Сі грунтується на тому що програміст знає, що робить і явно вказує ці наміри. Тому мова Сі не є “строго типізованою” мовою. Крім того, рівень пріоритетності виконання деяких операторів не є загальноприйнятим, деякі синтаксичні конструкції вимагають покращення. Не звертаючи увагу на деякі недоліки, мова Сі є ефективною і виразною мовою, придатною для широкого кола задач.
2.1. Алфавіт мови Сі
Програма в мові Сі записується символами алфавіту, який містить:
1) великі і малі букви латинського алфавіту;
2) десяткові цифри від 0 до 9;
3) спеціальні символи: “,”, [,],(,),{,},+,-,/,%,\,;,:,?,<,>,+,-,|,^,&,*,#.
Із символів складаються базові елементи мови.
Правила запису імені змінної або іменованої константи (ідентифікатора):
Ідентифікатори складаються з букв, цифр і знаку підкреслення (“-”) (до складу ідентифікатора не може входити будь-який спеціальний символ).
Першим символом повинна бути буква. Не можна починати ідентифікатори із знаку підкреслення оскільки багато змінних бібліотечних програм починається саме з цього знаку.
Не можна плутати в ідентифікаторах великі і малі букви (Х і х - це два різні ідентифікатори). Здебільшого імена змінних набирають малими буквами, а іменовані константи - великими.
Ідентифікатори не можуть співпадати з ключовими словами мови Сі.
Довжина ідентифікатора: для зовнішніх імен не більше 6 символів; для внутрішніх - не більше 31 символа.
2.2 Типи і розміри даних
У мові Сі дані поділяються на 2 групи:
1) прості або скалярні;
2) складні або структуровані.
Для скалярних даних існують такі базові типи:
1) char - одиничний байт, що містить один символ;
2) int - ціле число;
3) float - число з плаваючою крапкою одиничної точності;
4) double - число з плаваючою крапкою подвійної тосності.
Для розширення базових типів використовуються кваліфікатори:
1) short - короткий; 2) long – довгий.
Ці кваліфікатори застосовуються до цілого типу: short int (можна писати просто short) - короткий цілий. Наприклад, якщо ціле число типу int може займати в пам’яті машини або 16 біт або32 біти, то long займає 32 біти, а short - 16 біт.
Кваліфікатор long може розширювати тип double. Тип long double - числа з плаваючою крапкою підвищеної точності.
Кваліфікатор 1) signed - із знаком; 2) unsigned - без знака - використовуються до типу int i char. Якщо значенню char відводиться 8 біт, то unsigned приймає значення від 0 до 255, а signed від -128 до 127.
У мові Сі не існує логічного або булевського типу, хоча логічні операції використовуються. Треба запам’ятати, що значенню “істина” відповідає “не нуль”, тобто будь-яке число, що не дорівнює нулю, а “не істина” - “нуль”.
2.3. Константи
Константи можуть бути тих самих типів що і змінні:
1) цілого: 1024
2) цілий довгий: 124727119L - останне літера L (або l);
3) беззнаковий довгий: 124727429UL - останні літери UL (або ul);
4) з плаваючою крапкою 7.1425;
5) в експоненціальній формі 0.742е-1;
6) символьні константи ‘X’,’L’,’0’.
Крім цього константи можуть бути представлені як вісімкове число, або як шістнадцяткове число;
7) вісімкове число 037 починається з цифри 0;
8) шістнадцяткове число 0Х1F - починається з 0Х.
2.4.Декларації
Всі змінні в програмі Сі повинні бути описані (задекларовані) до того як будуть використані. Деякі декларації можуть бути неявними. Декларація вказує тип і містить список одної або кількох змінних
int i,k,ms[20];
char C, cl;
Одночасно з декларацією змінних можлива і їх ініціалізація (задання початкового значення):
char ls=’0’;
іnt k,l,lk[20], I=1;
float eps=1. 0e-5.
До будь-якої змінної в декларації можна використати кваліфікатор const, тоді змінна перетворюється в константу, тобто її значення при виконанні програми не змінюється.
const int n=20;
const double l=2.71828182.
3. СТРУКТУРА ПРОГРАМИ
По аналогії з Паскалем і Фортраном програма на мові Сі складається з двох частин:
1) заголовка, 2)тіла програми.
Заголовок складається з директив препроцесора і імені функції. Тіло програми або функції являє собою набір операторів і міститься в фігурних дужках “{}”, що аналогічно оператором Веgin і end у Паскалі. Ознакою закінчення оператора є символ крапка з комою “;”.
В одному рядку може бути кілька операторів як і у Паскалі, але бажано дотримуватись правила “одна стрічка - один оператор” (як у Фортрані), тоді програма більш наглядна і легше читається.
Коментарі в мові СІ обмежуються символами /* і */.
Наведемо приклад простенької програми за допомогою якої вводимо з клавіатури символ, а на екран виводимо код цього символа.
# include<stdio.h> /* заголовок */
main()
{
char ch;
рrintf (введіть символ\n”); /*тіло функції}*/
scanf (“%с”, &ch);
printf(“\n код символу %C:%d)\n”,ch,ch);
}
Кожна програма на мові Сі складається з функцій. Функції в Сі подібні до підпрограм і функцій в Фортрані і до процедур і функцій в Паскалі. В наведеному прикладі це функція main () -основна програма пусті дужки при імені функції означають, що ніяких вхідних параметрів основна програма не потребує. Стрічка # include<stdio.h>вказує компілятору, що необхідно включити інформацію, яка міститься у файлі stdio.h - стандартна бібліотека вводу-виводу. Значок # означає, що це директива препроцесора. Значки “<>” означають, що це стандартні файли, якими комплектується компілятор Сі.
В наведеному прикладі функція main складається з 4 операторів.
char ch; - опис типу змінної ch.
рrintf (“введіть символ \n”); - виклик бібліотечної функції виводу на друк.В дужках задається список виводу. В даному випадку друкується стрічка символів, що міститься в подвійних лапках:
введіть символ.
Значок \n - перехід на наступну стрічку. scanf (“%с”, &ch); - виклик бібліотечної фукнції форматного вводу.
Аргументами цієї функції є:
1) специфікатор формату: “%c”; 2) вказівник на змінну сh; &ch.
Слід пам’ятати, що для того щоб ввести за допомогою функції scanf якесь значення і присвоїти його змінній одного з основних типів, перед іменем змінної необхідно записати символ “&”(крім char).
Специфікатор формату відображає тип змінної, що виводиться на друк або вводиться з клавіатури.
Розрізняють такі специфікатори формату:
%d- десяткове ціле число:
%f - число з плаваючою крапкою, десятковий запис;
%e - число з плаваючою крапкою, експоненціальний запис;
%g - число з плаваючою крапкою або десятковий або експоненціальний запис аналогічно формату G у Фортрані. Використовується тільки при виводі змінних;
%c - один символ;
%s - стрічка символів;
%u - десяткове ціле без знаку;
%o - вісімкове ціле число без знаку;
%x - шістнадцяткове ціле число без знаку.
Четвертий оператор тіла програми printf(“\n код символу ‘%с’:%d)\n”,ch,ch); виведе на екран повідомлення “код символу”, символ, який Ви набрали з клавіатури, в лапках, а тоді ціле число, що є кодом ASCII цього символа.
4. ОПЕРАЦІЇ
Умовно операції в мові Сі можна розбити на такі групи:
4.1 Операції аналогічні операціям в мові Паскаль і Фортран.
1)Арифметичні операції: унарні: +;-; бінарні +;-;*;/; (додавання, віднімання, множення, ділення)
До операції ділення в сові Сі потрібно відноситись дуже уважно. Якщо обидва операнди цілого типу, то і результат буде цілого типу, тому S=2/5; в результаті виконання цього оператора S присвоїться 0, щоб одержати правильний результат необхідно щоб хоча б один операнд був дійсного типу, тобто S = 2.0 /5.0;
У мові Сі є ще одна бінарна операція % - знаходження залишку від ділення цілих чисел.
K=7% 2; - присвоїти змінній цілого типу К значення 1, оскільки 7:2=3 і 1 залишок. До змінних дійсного типу ця операція не застосовується.
2) Операції порівняння: >; >=; <; <=;
3) Операційні рівності: = = - рівне; != - не рівне
4) Логічні операції: ! - логічне “ні”; || - логічне “або”;
&& - логічне “і”.
4.2 Операції відсутні в мовах Паскаль і Фортран:
4.2.1. Інкрементні та декрементні операції.
Інкрементна операція ++ додає 1 до свого операнда.
Оператор n++; можна записати n=n+1;
Декриментна операція - - віднімає 1 від свого операнда. Розрізняють два види цих операцій:
1)префіксні ++n - змінна n збільшується на 1 до того, як використовується у виразі;
2)постфіксні n++ - змінна n збільшується на 1 після того, як її значення буде використано у виразі.
Для ілюстрації цих операцій виконайте таку програму
# include<stdio.h>
main()
{
int a=1, b=1;
int aplus, plusb;
aplus=a++;
plusb=++b
рrintf (“a aplus b plusb”);
printf(“%3d%5d%5d%5d\n”, a, aplus, b, plusb);
}
В результаті виконання цієї програми одержимо: а aplus b plusb
2 1 2 2
Значення а збільшилось на 1 після того як виконалась операція присвоєння. Значення b спочатку збільшилось на 1, а тоді виконалась операція присвоєння.
4.2.2. Побітові операції
В мові Сі існує 6 операцій для роботи з бітами.
& - побітове “і”;
| - побітове “або”;
^ - побітове “виключаюче “або”;
~ - побітове “ні”;
>> - зсув вправо;
<< - зсув вліво.
& - побітове “і” - бінарна операція, що по розрядах порівнює два двійкові числа. Результат дорівнює 1, якщо обидва операнди рівні 1 у цьому розряді, тобто
10010011
00111101
_______
00010001
| - побітове “або”. Результат 1, якщо хоча б у одного операнда у цьому розряді 1, тобто
10010011
00111101
_______
10111111
^ - побітове “виключаюче “або” Для кожного розряда результат допівнює 1, якщо один з двох відповідних розрядів дорівнює 1, але не обидва одночасно.
10010011
00111101
_______
10101110
~ - побітове “ні” - унарна операція, яка заміняє кожну 1 на 0, а 0 на 1.
~(10010011)= =01101100
>> - зсув вправо - зсуває розряди лівого, операнда вправо на кількість позицій вказаних у правому операнді (10010011)<<2= =(00100100)
<< - зсув вліво - зсуває розряди лівого операнда вліво на кількість розрядів, що вказані в правому операнді: (10010011)>>2= =(01001100) позиції, які звільняються заповнюються нулями.
4.2.3. Операція “?”:”
Умовний оператор if у мові Сі можна замінити операцією виду “?”:”
z=(a<b)?a:b;
Цей оператор відповідає оператору умовного переходу такого виду:
if(a<b)
z=a;
else
z=b;
4.2.3. Операція присвоєння.
У мовах Паскаль і Фортран такої операції не було. Було поняття “оператор присвоєння”. У мові Сі немає одностойкості у застосуванні термінів “оператор” і операція. Так у [1,2] термін “оператор” застосовується і як поняття інструкція і як поняття “операція”, в [3,4] ці поняття розділені аналогічно мовам Паскаль і Фортран.
Операція присвоювання може мати такий вигляд:
<змінна>=<вираз>;
<змінна><знак операції>=<вираз>;
наприклад:
1)S=S+4
2)S+=4
У першому випадку операція присвоювання аналогічна оператору присвоювання у Паскалі і Фортрані, у другому - знак арифметичної операції виноситься за знак “=”;
В операції присвоювання можуть використовуватись такі операції:
+,-,*,/,%,<<,>>,&,|
4.3. Пріорітет і порядок виконання операцій.
В таблиці 1 приведено пріорітет і порядок виконання операцій
Таблиця 1
Пріорітет
Операції
Позначення
Порядок виконання
1.
Виклик функції або вибір
(); []; ->;.
зліва-направо
2.
Унарні операції
+; --; !; &; *; ~
справа-наліво
3.
Мультиплікативні
*; /; %
зліва-направо
4.
Аддитивні
+; -
зліва-направо
5.
Зсуву
>>; <<
зліва-направо
6.
Порівняння
>; >=; <; <=;
зліва-направо
7.
Рівності
==; !=
зліва-направо
8.
Побітове “і”
&
зліва-направо
9.
Побітове виклакаюче “або”
^
зліва-направо
10.
Побітове “або”
|
зліва-направо
11.
Логічне “і”
&&
зліва-направо
12.
Логічне “або”
||
зліва-направо
13.
Умови
?:
справа-наліво
14.
Присвоювання
=; <знак>=
справа-наліво
15.
Кома
,
зліва-направо
Стандартні функції
Основні математичні функції описуються в файлі <math.h> і приводяться в таблиці 2.
Таблиця 2
Ім’я функції
Математичний запис
Тип і межі зміни аргументів
Тип результату
sin(x)
sin x
double
double
cos(x)
cos x
double
double
tan(x)
tg x
double
double
asin(x)
arcsin x
double x([-1,1]
[-(/2,(/2]
acos(x)
arccos x
x([-1,1]
[0,(]
atan(x)
arctg x
x([-(/2,(/2]
double
sinh(x)
sh x
double
double
cosh(x)
ch x
double
double
tanh(x)
th x
double
double
exp(x)
ex
double
double
log(x)
ln x
x>0
double
log10(x)
lg x
x>0
double
pow(x,y)
xy
x(0; y>0
double
sqrt(x)
x(0
double
fabs(x)
|x|
double
double
ldexp(x,n)
x . 2n
x-double, n-int
double
fmod(x,y)
Залишок від ділення дійсних чисел х на у
double
double
5. Перетворення типів
В операторах і виразах бажано використовати змінні і константи однакового типу. Якщо у виразі є змішування типів компілятор автоматично перетворить типи за такими правилами.
Якщо операція виконується над змінними різних типів, то оббидві змінні переводяться до “вищого” з двох типів.
Порядок типів від “вищого” до “нижчого” має такий вигляд:
а) double;
в) float;
г) long;
д) int;
е) short;
є) char.
В операторах присвоювання результат перетворюється до типу змінної, якій присвоюється це значення. Це може бути як “підвищення” типу так і “пониження”, наприклад в програмі:
#include<stdio.h>
main()
{int n,m;
float s,p;
n=5/7.0;
m=4.8/9.2;
s=5/7;
p=4.8/9.2;
printf(“n m s p \n”);
printf(“%d%d%f%f\n”,n,m,s,p);
}
одержимо результат
n m s p
0 0 0.00000 0.52174
Найкраще при написанні програми уникати перетворення типів, особливо в бік “пониження”. Але якщо Ви хочете явно вказати із змінними, або константами якого типу працюєте, існує явний вказівник
(<iмя типу>)<зміннв або константа>.
Так у прикладі
m=1.6+1.8;
n=(int)1.6+(int)1.8;
Змінній m присвоїться значення 3, оскильки спочатку додадуться два дійсних числа 1.6 і 1.8 від результату 3.4 відкинеться дробова частина. Змінній n присвоїться значення 2, оскільки (int)1.6=1, (int)1.8=1; 1+1=2.
6. Оператори
Будь-яка програма складається з послідовності операторів. Ознакою закінчення оператора є крапка з комою “;”. Так запис S=5 не є оператором, це просто вираз, а S=5; це вже оператор присвоювання. Аналогічно Паскалю у мові Сі розрізняють прості оператори і блоки.
Блок - це група операторів, що міститься у фігурних дужках, вони використовуються:
1) щоб згрупувати кілька логічно зв’язаних операторів в один;
2) як тіло функції;
3) для локалізації дії описів.
6.1 Оператор if
Оператор if-else використовується для вибору одного з двох варіантів рішення. Синтаксичний опис оператора if-else:
if(вираз)
оператор 1;
else
оператор 2;
Обчислюється “вираз”, якщо його значення “істина” (тобто не нуль) виконується “оператор 1”, якщо “не істина” (тобто нуль) виконується оператор 2. Частина else може бути відсутня. При вкладених if-else необхідно пам’ятати, що else відноситься до внутрішнього if.
if(x>0)
if(a>b) z=a;
else z=b;
Якщо треба змінити порядок необхідно використати фігурні дужки, тобто виділити блок.
if(x>0)
{ if(a>b) z=a; }
else z=b;
Щоб розгалузити програму в кількох напрямках можна використати конструкцію: else if
if(вираз 1) оператор 1;
else if (вираз 2) оператор 2;
else if (вираз 3) оператор 3;
else оператор 4;
Якщо <вираз 1> - “істина” виконується оператор1, якщо “не істина” перевіряється вираз 2. Якщо <вираз 2> - “істина”, виконується оператор 2 і так далі.
6.2. Оператор switch
Оператор switch (перемикач) використовується для вибору одного з багатьох варіантів. Він подібний до оператора case у Паскалі.
Синтаксис оператора switch:
switch (вираз) {
case <константа вибору 1>:оператор 1;
case <константа вибору 2>:оператор 2;
…
default: оператор n }
Якщо “вираз” співпадає з одною із констант вибору, то виконується відповідний оператор або блок операторів. Якщо “вираз” не співпадає ні з однією з констант вибору - виконується оператор після слова “default”.
Для прикладу промоделюємо роботу світлофора.
#include<stdio.h>
main()
{
char ch;
printf(“введи першу літеру кольору”);
scanf(“%с\n”,ch);
switch (ch)& {
case `ч`: printf(“Зачекайте\n”); break;
case `ж`: printf(“Увага\n”); break;
case `з`: printf(“Ідіть\n”); break;
default: printf(“такого кольору у світлофора нема”); break;
} }
“Вираз” і константи вибору повинні бути цілого типу, або типу char. Заборонено використовувати в якості константи вибору змінну. Оператор break здійснює негайний вихід з оператора switch. Якщо цього оператора немає, то будуть виконані оператори всіх варіантів після вибраного.
7. КОНТРОЛЬНІ ЗАПИТАННЯ
Правила запису ідентифікаторів.
Які Ви знаєте типи даних і як вони описуються?
Структура програми на мові СІ.
Перелічіть операції аналогічні операціям у мовах Паскаль і Фортран.
Що таке побітові операції?
Що таке оператор, ознака закінчення оператора.
Напишіть основні стандартні функції у мові СІ.
Як здійснюється узгодження типів у виразах?
Яка різниця між оператором і блоком у мові СІ?
Синтаксис умовного оператора if.
Напишіть приклад оператора switch.
Для чого використовується оператор break?
8. ЛАБОРАТОРНЕ ЗАВДАННЯ
Вивчити основні елементи алгоритмічної мови СІ, правила запису програм, оператори розгалуження.
Одержати індивідуальне завдання (додаток).
Скласти програму на алгоритмічній мові СІ.
Відлагодити програму, виконати обчислення.
9. ЗМІСТ ЗВІТУ
Мета роботи.
Короткий опис конструкцій алгоритмічної мови СІ, що вивчаються.
Індивідуальне завдання.
Текст програми у відповідності з індивідуальним завданням.
Блок-схема алгоритму.
Результати обчислень.
Аналіз результатів, висновки.
10. СПИСОК ЛІТЕРАТУРИ
Керниган Б., Ритчи Д. Язык программирования СИ. - М. - Финансы и статистика. - 1992. – 272 с.
Уэйт М., Прата С., Мартин Д. Язык СИ. Руководство для начинающих. - М. - Мир. - 1988. –512 с.
Глинський Я. М., Анохін В. Є., Ряжська В. А. C++ i C++ Builder. – Львів: Деол. – 2003. – 192 с.
Герберт Шилдт. Полный справочник по C++. М. – С.-П.-К., Вильямс. – 2003. – 800 с.