Всички структурни единици в една програма на C са функции. Дефиниция на функция:
тип име (аргументи)
Типът може да бъде пропуснат, тогава се подразбира int; функцията може да не връща резултат тогава за тип се записва void; ако функцията връща резултат, то тя задължително трябва да съдържа return в тялото си;
за начало и край на блок в C се използват фигурни скоби { };
дефинирането на променливи може да се прави навсякъде в програмата (естествено дефиницията трябва да е преди употребата на променливата); при дефинирането се допуска инициализация
17 октомври
В езика C няма вграден тип низ (подобно на Pascal); променлива от тип низ е едномерен символен масив (от тип char);
7. Коментари. Структура на програмата и етапи на нейната обработка.
#include
void main ()
{ float p, r, s;
printf (“Въведи r = “);
scanf (“%f”, &r);
p = 2 * 3.14159 * r;
s = 3.14159 * r * r;
printf ( “Периметърът P = %f\n”,p);
printf ( “Лицето S = %f\n”,s);
}
Ред по ред:
-
Директива към препроцесора за включване на заглавен файл (stdio.h);
-
Дефиниране на главната функция main; без аргументи и без параметри;
-
Разпределяне на памет за променливите (от тип float – 3x4 байта);
-
Извеждане на подканващо съобщение (низът зададен в скобите);
-
Спиране изпълнението на програмата и подканване към потребителя да въведе стойност, която се записва в адреса на променливата (предоставен е и формат на въвеждане);
-
Аритметична операция умножение (приложена два пъти) и оператор за присвояване;
-
Като 6.;
-
Извеждане на резултата; низът се извежда символ по символ до достигане на знак “%”, тогава се извежда първата променлива в указания формат, на следващия “%” се извежда втората променлива и т.н.; отделните променливи се разделят със запетаи;
-
Като 8.
Коментар – последователност от символи, заградени със
знаците /* и */; използват се за да се запишат пояснения в прогрмамата, обикновено за да се поясни какво точно прави определен израз, блок, функция и т.н.; програмата не губи ефективност ако има големи коментари, те се изключват от препроцесора преди компилацията; с коментари могат да се изолират отделни фрагменти от програмата (които са излишни или подлежат на корекции и т.н.); влагане на коментари се допуска с опция (по подразбиране не се допуска); друг начин да се дефинира коментар е със //; с този символ се обозначава коментар в рамките на един ред – в коментара попадат всички символи след този знак
Структура на програмата – програмата на C представлява съвкупност от функции (непразна); точно една от функциите е главна (носи задължително името main); при изпълнението на една програма операционната система предава управлението точно на тази функция; след завършване на изпълнението на главната функция управлението се връща към операционната система; най-общо структурата е следната:
-
описания на заглавни файлове
-
дефиниция на външни (глобални) променливи
-
функции f1, f2, …, fn и главна функция
Външните променливи са един от начините за обменяне на данни между функциите; в C не се допуска влагане на функции; допуска се навсякъде в програмата да се използват стандартните функции, към компилатора има библиотека, която съдържа тяхната реализация
Важно: Информацията от “h” файла – указва се единствено прототипите на функциите (име, тип, аргументи), но не и реализацията
Етапи за обработка на програмата
-
Програмата е текст; въвежда се чрез текстов редактор, който предоставя възможност за лесна корекция на грешки; препоръчително е програмата периодична да се съхранява във външната памет, тъй като тя се намира в оперативната и може да бъде загубена); една програма на C обикновено е с разширение .c, а на C++ с разширение .cpp;
-
Преди да се компилира програмата тя минава през обработка от препроцесор – изчистват се коментарите, изпълняват се директивите означени с и др.
-
След това програмата се обработва от компилатора; ако има синтактични ( и др.) грешки, компилаторът указва съответното съобщение; след успешно компилиране се създава .obj-файл (обектен код)
-
На следващия етап свързващ редактор преобразува .obj файла в изпълним (.exe) файл; свързващият редактор обединява в едно обектния код на програмата и обектния код на стандартните функции; дава съобщение за грешка, ако пътят към библиотеката със стандартните функции е зададен неправилно; изпълнимият файл (.exe) е вече на машинен език;
-
По време на изпълнение на програмата може да възникнат семантични грешки поради проблем с входните данни или в самата програма; и накрая изпълнението на програмата може да е успешно, но тя да не връща очаквания резултат – тогава програмистът търси алгоритмична или съдържателна грешка
8. Операции и изрази.
Операциите са три вида:
-
унарни (едноаргументни) – ‘+’, ‘-‘
-
бинарни (двуаргументни) – ‘ + ’,’ - ‘,’ *’, ‘ / ‘, ‘ %’ – остатък от целочислено деление
-
тернарни (триаргументни) – операция за условен израз
Операндите са променливи, константи или обръщения към функции; ако и двата операнда са цели, резултатът е цял; ако един от операндите е реален, то резултатът е реален; ‘ %’ се използва само с цели числа
В C няма вграден булев тип; всяка стойност различна от 0 се счита за истина (true), а всяка стойност равна на 0 се счита за лъжа (false); Ако една операция връща булева стойност, то тя е 1 ако е истина и 0 ако е лъжа
22 октомври
Правоъгълен триъгълник има катети x и y и хипотенуза z. По дадени z и a = x – y да се определят x и y. (Входът е коректен.)
Формулите са:
x = (a + 2z2 – a2)/2
x = (- a + 2z2 – a2)/2
#include
#include
void main ()
{ double z, a, x, d;
printf (“Въведете z и a: “);
scanf (“%lf %lf”, &z, &a );
d = sqrt (2*z*z – a*a);
x = (a + d) / 2;
y = (- a + d) / 2;
printf (“x = %lf y = %lf\n”, x, y);
}
В езиците за програмиране изразите се записват линейно, а не многоетажно.
Израз е валидна комбинация от операции, операнди и кръгли скобки. Съобразен е със синтактичните правила и със семантичните изисквания.
Операции за отношение: >, >=, <=, <, ==, !=
Резултатът от тях е истина (true) или лъжа(false).
Логически операции:
-
&& - логическо “и” – операнд1 && операнд2 && ... && операндN; особеност – някои компилатори правят оптимизации; при израз от горния тип по време на изпълнението изчисляването се преустановява, когато някой операнд има стойност лъжа, тъй като тогава целият израз има стойност лъжа;
-
|| - логическо “или” - операнд1 || операнд2 || ... || операндN; същата особеност като при логическото “и” – по време на изпълнението изчисляването се преустановява, когато някой операнд има стойност истина, тъй като тогава целият израз има стойност истина;
-
! – логическо отрицание
Важно: Оптимизациите могат да пропуснат някои операнди, заедно с евентуалните промени, които се правят в тях.
Операция присвояване:
име на променлива = израз – пресмята се израза и резултатът, преобразуван по тип се записва в адреса на променливата; резултатът от тази операция е стойността на десния операнд
Пример: a = b = 2; a = b = c = d и т.н.
Оператор за присвояване:
име на променлива = израз ; (не връща резултат)
Често срещани комбинации от операции:
-
a = a + b, съкратено a += b
-
a = a - b, съкратено a -= b
-
a = a * b, съкратено a *= b
-
a = a / b, съкратено a /= b
-
a = a % b, съкратено a %= b
-
a = a + 1, съкратено a++ или ++a
-
a = a - 1, съкратено a-- или --a
Когато ++ (--) е преди променливата първо се изпълнява операцията, а след това променливата се използва с новата си стойност; ако са след променливата първо се използва променливата със старата стойност и след това се изпълнява операцията.
Примери:
int x, y;
x = 15
y = ++x; |след операцията x = 16; y = 16
x = 12
y = x--; | след операцията x = 11; y = 12
x++;
++x; (ако са самостоятелни няма значение дали ++ (--) е преди или след променливата)
Операция за последователно изпълнение:
операнд1, операнд2, ... операндN – последователно се пресмятат операндите и резултатът от операцията е стойността на операндN
Операция за преобразуване на тип:
(тип) операнд; при някои компилатори тип (операнд)
Преобразува операнд в даден тип;
Пример:
int uspeh, broi;
float srus;
srus = (float) uspeh/broi;
Операция за размер на даден обект:
sizeof (операнд) – дава като резултат размера на операнда в байтове; например sizeof (srus) връща 4; sizeof (int) връща 2 или 4 (в зависимост от това дали компилатора е 16 или 32 битов); особеност – изпълнява се по време на компилация, а не по време на изпълнение
Ред на изпълнение на операциите в един израз – зависи от приоритета на операциите; операциите с по-висок приоритет се изпълняват преди операциите с по-нисък приоритет; ако операциите са с един и същи приоритет те се изпълняват отляво надясно ако са ляво-асоциативни или отдясно наляво ако са дясно-асоциативни; кръглите скоби указват операцията в тях да се изпълни преди останалите операции, независимо от приоритета;
Таблица на приоритетите:
Приоритет
|
Операции
|
Асоциативност
|
1
|
() – извикване на функция
[] – достъп до елемент на масив
|
ляво-асоциативни
|
2
|
‘!’ – логическо отрицание
‘+’ - унарен плюс
‘-‘ - унарен минус
‘++’ – прибавяне на 1
‘--‘ – изваждане на 1
& - адресиране
(тип) – преобразуване на тип
sizeof – размер на обект
|
дясно-асоциативни
|
3
|
‘*’ – умножение
‘/’ – деление
‘%’ – деление по модул
|
ляво-асоциативни
|
4
|
‘+’ – събиране
‘-‘ - изваждане
|
ляво-асоциативни
|
6
|
<, <=, >=, >- операции за отношение “по-малко, по-голямо”
|
ляво-асоциативни
|
7
|
==, != - операции за отношение “равно, не равно”
|
ляво-асоциативни
|
11
|
&& - логическо “и”
|
ляво-асоциативни
|
12
|
|| - логическо “или”
|
ляво-асоциативни
|
13
|
? : - операция за условен израз
|
дясно-асоциативни
|
14
|
=, +=, -=, *=, /=, %= - операции за присвояване
|
дясно-асоциативни
|
15
|
‘,’ – операция за последователно изпълнение
|
ляво-асоциативни
|
10. Условни изрази и условни оператори.
Операция за условен израз:
операнд1 ? операнд2 : операнд3
Пресмята се операнд1; ако стойността му е истина (0), тогава се пресмята операнд2 и стойността му е резултатът от изпълнението на операцията; ако стойността му е лъжа (=0), тогава се пресмята операнд3 и стойността му е резултатът от изпълнението на операцията;
Пример:
int x, y;
x = 1; y = 2;
y = x < y ? 10 : 100; |y става 10
Операцията е дясно-асоциативна; ако имаме:
операнд1 ? операнд2 : операнд3 ? операнд4 : операнд5
първо се изчислява (операнд3 ? операнд4 : операнд5) и след това с получения резултат се изчислява (операнд1 ? операнд2 : резултат); ако искаме първо да се изпълни (операнд1 ? операнд2 : операнд3), трябва да поставим кръгли скоби
Сподели с приятели: |