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



страница13/16
Дата25.07.2016
Размер0.96 Mb.
#5224
ТипЛекции
1   ...   8   9   10   11   12   13   14   15   16

28 ноември

23. Инициализиране на променливите.


Под инициализиране на променливите се разбира присвояване на начални стойности на променливите;

някои от променливите получават автоматично нулеви стойности в началото на изпълнението на програмата – такива са например тези, за които памет се разпределя в областта за статичните данни; другите променливи (например клас памет auto, register) не получават нулева начална стойност;

всяка променлива може да бъде инициализирана при нейното дефиниране;

Синтаксис:

име_на_тип име_на_променлива = израз;
Пример:

float pi = 3.14;

този запис е екивалентен на следния:

float pi;

pi = 3.14;
ако една променлива има клас памет static или extern, т.е. за нея да е разпределена памет в областта на статичните данни, тогава изразът задължително трябва да е константен; това се налага, тъй като по време на компилация за тях трябва да е известна началната стойност;

в случай, че за променливата се разпределя памет в програмния стек изразът е произволен – той може да съдържа променливи, формални параметри или обръщения към функции;

Пример:

int z;


void fun1 (int x, int y)

{ int i = x*y*z;

}
void fun ()



{ static int i = 8;

int j = 4;

i = i + 2;



j = j + 2;

}
инициализиране на локални статични променливи – извършва се точно веднъж в началото от компилатора (преди да се влезе във функцията);

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

променливата i става 10, след второто извикване - 12 (тя не се инициализира отново) и т.н.;

инициализиране на локални променливи – когато влезем във функцията се разпределя памет в програмния стек и там се записва началната стойност (например 4 за j); в края на първото извикване j си променя стойността на 6, а след приключване на изпълнението на функцията паметта за j се освобождава – ето защо при повторно изпълнение, за разлика от локалните статичните променливи, j отново ще стане 4, след това 6, накрая паметта за j ще се освободи и т.н.;
въпросът за несъответствие между типа на израза:


    • в K&R C не може да има такова несъответствие;

    • в ANSI C и C++ типа на израза се преобразува към типа на променливата;

инициализиране на масиви – при дефинирането това става чрез задаване на списък от началните стойности за елементите на масива;

списъкът се поставя във фигурни скоби;

пример:

int list[5] = { 1, 2, 3, 4, 5 };


подреждането на стойностите съответства на реда на разпределение на елементите на масива в оперативната памет;

int mat[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};


ако началните стойности са по-малко от броя на елементите на масива, останалите се запълват с нули; ако началните стойности са повече, компилаторът дава съобщение за грешка;

ако масивите са многомерни може да се използва влагане на фигурни скоби;

пример:

int mat[3][3] = { { 1, 2, 3}, { 4, 5 } };


инициализиране на низова променлива (символен масив);

примери:


char name[6] = { ‘P’, ‘e’, ‘t’, ‘a’, ‘r’, ‘\0’ };

char name[6] = “Petar”;


във втория случай автоматично се добавя нулевия байт в края на масива; ако броят на символите е по-малък от размерността на масива, останалите елементи се запълват с нулеви байтове;

ако е по-голям – компилаторът дава съобщение за грешка;

ако при дефиниране на един едномерен масив, той е инициализиран, тогава може да се пропусне първата размерност; ако масивът е от char размерността е броя на символите + 1, тъй като е добавен нулев байт; ако масивът е многомерен може да се пропусне само първата размерност;

в ANSI C и C++ може да се използва ключовата дума const; една променлива от тип const задължително трябва да бъде инициализирана при нейното дефиниране и тя не може да променя стойността си по време на изпълнение;

примери:

const int initial = 100;

const double epsilon = 0.001;

const int masiv [ ] = { 1, 2, 3 };

void fun (const int a)

{ … … }


тук формалният параметър е const и не се допуска той да бъде променян в тялото на функцията fun;
в C, C++ се следва принципът за най-малки привилегии – за да може да се подпомогне по-лесната проверка на програмата; принципът гласи, че ако знаем, че нещо в програмата със сигурност не трябва да се случи, това трябва да се каже на компилатора;
една външна променлива може да се инициализира само при дефиниране, но не и при деклариране;
ако имаме външна променлива от тип const, която искаме да се ползва във всички модули, трябва да се постави extern пред const в дефиницията;

пример:


дефиниция – extern const int initial = 5;

декларация – extern const int initial;


24. Буфериран вход и изход. Функции getchar и putchar.
При много от функциите за вход и изход в C се използва буфер (един за вход и един за изход);

специалният файл, който е свързан с въвеждането от клавиатурата е stdin – стандартен вход; този файл е свързан със стандартния входен поток от данни и има собствен буфер;

специалният файл, който е свързан с извеждането на екрана е stdout – стандартен изход; този файл е свързан със стандартния изходен поток от данни, асоцииран с монитора и има собствен буфер;

буферът действа на принципа на опашката – пръв влязъл, пръв излязъл;

синтаксис:

int getchar (); - чете символ от буфера на stdin и той се връща като стойност на функцията; getchar е от тип int, защото при грешка или достигане до край на файла тя трябва да върне стойност, която е различима от символите (в случая EOF = -1); ако буфера на stdin е празен, тогава програмата подканва потребителя да въведе символи; след въвеждането и натискане на Enter изпълнението на програмата продължава; освен това getchar изпраща въведените символи на stdout и те се извеждат на екрана;

синтаксис:

int putchar(int);

аргументът се записва в буфера на stdout и се връща от функцията; ако има грешка при извикването putchar връща –1;
getchar и putchar са функции, но това не е вярно за всички компилатори - в Borland C те са макроси, като средства на препроцесора;




Сподели с приятели:
1   ...   8   9   10   11   12   13   14   15   16




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

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