Лекции по увод в програмирането


октомври – семинарни занятия



страница5/16
Дата25.07.2016
Размер0.96 Mb.
#5224
ТипЛекции
1   2   3   4   5   6   7   8   9   ...   16

17 октомврисеминарни занятия

Всички структурни единици в една програма на 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);

}
Ред по ред:



  1. Директива към препроцесора за включване на заглавен файл (stdio.h);

  2. Дефиниране на главната функция main; без аргументи и без параметри;

  3. Разпределяне на памет за променливите (от тип float – 3x4 байта);

  4. Извеждане на подканващо съобщение (низът зададен в скобите);

  5. Спиране изпълнението на програмата и подканване към потребителя да въведе стойност, която се записва в адреса на променливата (предоставен е и формат на въвеждане);

  6. Аритметична операция умножение (приложена два пъти) и оператор за присвояване;

  7. Като 6.;

  8. Извеждане на резултата; низът се извежда символ по символ до достигане на знак “%”, тогава се извежда първата променлива в указания формат, на следващия “%” се извежда втората променлива и т.н.; отделните променливи се разделят със запетаи;

  9. Като 8.

Коментар – последователност от символи, заградени със

знаците /* и */; използват се за да се запишат пояснения в прогрмамата, обикновено за да се поясни какво точно прави определен израз, блок, функция и т.н.; програмата не губи ефективност ако има големи коментари, те се изключват от препроцесора преди компилацията; с коментари могат да се изолират отделни фрагменти от програмата (които са излишни или подлежат на корекции и т.н.); влагане на коментари се допуска с опция (по подразбиране не се допуска); друг начин да се дефинира коментар е със //; с този символ се обозначава коментар в рамките на един ред – в коментара попадат всички символи след този знак


Структура на програмата – програмата на C представлява съвкупност от функции (непразна); точно една от функциите е главна (носи задължително името main); при изпълнението на една програма операционната система предава управлението точно на тази функция; след завършване на изпълнението на главната функция управлението се връща към операционната система; най-общо структурата е следната:

    • описания на заглавни файлове

    • дефиниция на външни (глобални) променливи

    • функции f1, f2, …, fn и главна функция

Външните променливи са един от начините за обменяне на данни между функциите; в C не се допуска влагане на функции; допуска се навсякъде в програмата да се използват стандартните функции, към компилатора има библиотека, която съдържа тяхната реализация

Важно: Информацията от “h” файла – указва се единствено прототипите на функциите (име, тип, аргументи), но не и реализацията

Етапи за обработка на програмата





  1. Програмата е текст; въвежда се чрез текстов редактор, който предоставя възможност за лесна корекция на грешки; препоръчително е програмата периодична да се съхранява във външната памет, тъй като тя се намира в оперативната и може да бъде загубена); една програма на C обикновено е с разширение .c, а на C++ с разширение .cpp;

  2. Преди да се компилира програмата тя минава през обработка от препроцесор – изчистват се коментарите, изпълняват се директивите означени с и др.

  3. След това програмата се обработва от компилатора; ако има синтактични ( и др.) грешки, компилаторът указва съответното съобщение; след успешно компилиране се създава .obj-файл (обектен код)

  4. На следващия етап свързващ редактор преобразува .obj файла в изпълним (.exe) файл; свързващият редактор обединява в едно обектния код на програмата и обектния код на стандартните функции; дава съобщение за грешка, ако пътят към библиотеката със стандартните функции е зададен неправилно; изпълнимият файл (.exe) е вече на машинен език;

  5. По време на изпълнение на програмата може да възникнат семантични грешки поради проблем с входните данни или в самата програма; и накрая изпълнението на програмата може да е успешно, но тя да не връща очаквания резултат – тогава програмистът търси алгоритмична или съдържателна грешка

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), трябва да поставим кръгли скоби




Сподели с приятели:
1   2   3   4   5   6   7   8   9   ...   16




©obuch.info 2024
отнасят до администрацията

    Начална страница