гл. ас. д-р. Нора Ангелова

Подобни документи
Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр

Програмиране на Паскал

Lush Green

Маисви

Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Lush Green

Виртуални функции

C++

Обработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Re

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма

Проф

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1

Рекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве

Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/

3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението

Структура на програма в C - Част 7 - масиви, оператор за индексиране, sizeof оператор

Програмен език C Пламен Танов Ненко Табаков Мартин Вачовски Технологично училище Електронни системи Технически университет София версия 0.5

Структура на програма в C - Част 9 - низове от символи, C-string

Сериализация Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23

2. Наследяване в C++ Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 1 февруари 2007 г. 1 Наследяване 1 2

В тази част, ще разгледаме аритметичните и логически операции, както, и включването им в изрази. В следващата таблица са дадени всички възможни операц

4

Black and White

МИНИСТЕРСТВО НА ОБРАЗОВАНИЕТО И НАУКАТА

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф

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

Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1

Структура на програма в C - Част 2 - типове, функции

2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнениет

-

Лабораторно упражнение 6 Тема: Оператори за цикли в езика C++. Реализиране на циклични алгоритми I. Цел на лабораторното упражнение Да се затвърдят зн

Slide 1

1. Инструментални средства на изкуствения интелект. Основната характеристика на програмните системи, базирани на знания, отличаваща ги от стандартните

Microsoft Word - VM22 SEC55.doc

Лекции по Програмиране първа част I. Въведение в компютрите и програмирането КОМПЮТЪР = АПАРАТУРА + ПРОГРАМНО ОСИГУРЯВАНЕ Апаратна част Hardware(Харду

Анализ и оптимизация на софтуерни приложения

Kontrolno 5, variant 1

Microsoft Word - PRMAT sec99.doc

doll Механична кукла Механичните кукли автоматично повтарят предварително зададена последователност от движения. В Япония има традиции в изработката н

Препис:

гл. ас. д-р. Нора Ангелова

Дефиниция на функция Заглавие <тип_на_функция> <име_на_функция> (<формални_параметри>) <тип_на_функция> име на тип. Типът на резултата от изпълнението на функцията. Ако функцията не връща резултат тип void. <име_на_функция> идентификатор. <формални_параметри> множество от параметри. Те изпълняват ролята на входните данни на функцията. Функцията може да няма формални параметри. <параметър> <име_на_тип> <име_на_параметър>. Тяло редица от оператори и дефиниции оградени в {. { <тяло>

Декларация на функция <тип_на_функция> <име_на_функция>(<формални_параметри>); Декларацията на функцията се нарича също прототип. Имената на формалните параметри в декларацията могат да се пропускат. Пример: void testfunction(int); void testfunction2(int a);

Извикване на функция <име_на_функция>(<фактически_параметри>); Пример: testfunction(5);

Преди да се извика една функция, тя трябва да е декларирана/дефинирана. Ако дадена функция example извиква функцията testfunction, функцията testfunction трябва да бъде декларирана/дефинирана преди example.

Пример: void printparam(int a) { cout << a << endl; printparam(5);

Пример: void printparam(int a); printparam(5); void printparam(int a) { cout << a;

Пример: void printparam(int); printparam(5); void printparam(int a) { cout << a;

Свързване на формални с фактически параметри: Формален параметър стойност. Формален параметър указател.

void testfunction(int param) { param 5 int value = 5; testfunction(value); value 5 addr1

void testfunction(int *param) { param addr1 int value = 5; testfunction(&value); value 5 addr1

Разпределение на оперативната памет за програма: Програмен код записан е изпълнимият код на всички функции, изграждащи програмата. Статични данни записани са глобални и статични обекти. Динамични данни чрез средства за динамично разпределение на паметта се заделя и освобождава памет в процеса на изпълнение на програмата (не преди това). Тази памет е от областта на динамичните данни. Програмен стек записани са данните за функциите.

Хомогенна линейна структура от елементи. последен влязъл - пръв излязъл (LIFO). Пряк достъп, включване, изключване на елемент. Указател на стека (връх) Указател на стека (връх)

Програмен стек Елементите на стека са блокове от памет. Записани са данните за функциите. Наричат се още стекови рамки.

Програмен стек В дъното на стека е стековата рамка на main. На върха на стека е стековата рамка на функцията, която се обработва в момента. Под нея е стековата рамка на функцията, извикала функцията, обработваща се в момента.

Свързване на формални с фактически параметри: Формален параметър стойност В стековата рамка на функцията: За формалния параметър се отделя толкова памет, колкото типът му изисква и в нея се копира стойността на фактическия параметър. Формален параметър указател В стековата рамка на функцията: За формалния параметър се отделя памет за един указател. В нея се записва стойността на фактическия параметър, който трябва да бъде адрес на променлива.

int gcd(int x, int y) { while(x!= y) { if (x > y) { x = x - y; else { y = y - x; return x; int a = 5, b = 3; int r = gcd(a, b); cout << r << endl;

int gcd(int x, int y) { while(x!= y) { if (x > y) { x = x - y; else { y = y - x; return x; int a = 5, b = 3; int r = gcd(a, b); cout << r << endl; a -5 b - 3 r main gcd на main указател на стека програмен код

int gcd(int x, int y) { while(x!= y) { if (x > y) { x = x - y; else { y = y - x; return x; int a = 5, b = 3; int r = gcd(a, b); cout << r << endl; a - 5 b - 3 r - - y - 3 x - 5 return адрес адрес на предишна main gcd на main на gcd указател на стека програмен код

int gcd(int x, int y) { while(x!= y) { if (x > y) { x = x - y; else { y = y - x; return x; int a = 5, b = 3; int r = gcd(a, b); cout << r << endl; a - 5 b - 3 r - - y - 3 x = 5-3 == 2 return адрес адрес на предишна main gcd на main на gcd указател на стека програмен код

int gcd(int x, int y) { while(x!= y) { if (x > y) { x = x - y; else { y = y - x; return x; int a = 5, b = 3; int r = gcd(a, b); cout << r << endl; a - 5 b - 3 r - - y = 3-2 == 1 x = 2 return адрес адрес на предишна main gcd на main на gcd указател на стека програмен код

int gcd(int x, int y) { while(x!= y) { if (x > y) { x = x - y; else { y = y - x; return x; int a = 5, b = 3; int r = gcd(a, b); cout << r << endl; a - 5 b - 3 r - - y - 1 x = 2-1 == 1 return адрес адрес на предишна main gcd на main на gcd указател на стека програмен код

int gcd(int x, int y) { while(x!= y) { if (x > y) { x = x - y; else { y = y - x; return x; int a = 5, b = 3; int r = gcd(a, b); cout << r << endl; a - 5 b - 3 r - - y - 1 x - 1 return адрес адрес на предишна main gcd на main на gcd указател на стека програмен код

int gcd(int x, int y) { while(x!= y) { if (x > y) { x = x - y; else { y = y - x; return x; int a = 5, b = 3; int r = gcd(a, b); cout << r << endl; a - 5 b - 3 r - 1 main gcd на main указател на стека програмен код

void swap(int p, int q) { int temp = p; p = q; q = temp; p q 5->3 3->5 int a = 5, b = 3; swap(a, b); // 5 3 a 5 addr1 b 3 addr2

void swap(int p, int q) { int temp = p; p = q; q = temp; int a = 5, b = 3; swap(a, b); // 5 3 a - 5 b - 3 p - 5 q - 3 return адрес адрес на предишна temp main swap на main на swap указател на стека програмен код

void swap(int p, int q) { int temp = p; p = q; q = temp; int a = 5, b = 3; swap(a, b); // 5 3 a - 5 b - 3 p - 3 q - 5 return адрес адрес на предишна temp main swap на main на swap указател на стека програмен код

void swap(int p, int q) { int temp = p; p = q; q = temp; a - 5 b - 3 на main указател на стека int a = 5, b = 3; swap(a, b); // 5 3 main swap програмен код

void swap(int* p, int* q) { int temp = *p; *p = *q; *q = temp; int a = 5, b = 3; swap(&a, &b); // 3 5 p addr1 a 5->3 addr1 q addr2 b 3->5 addr2

void swap(int* p, int* q) { int temp = *p; *p = *q; *q = temp; int a = 5, b = 3; swap(&a, &b); // 3 5 a - 5 b - 3 p addr1 q addr2 return адрес адрес на предишна temp main swap на main на swap указател на стека програмен код

void swap(int* p, int* q) { int temp = *p; *p = *q; *q = temp; int a = 5, b = 3; swap(&a, &b); // 3 5 a - 3 b - 5 p addr1 q addr2 return адрес адрес на предишна temp main swap на main на swap указател на стека програмен код

void swap(int* p, int* q) { int temp = *p; *p = *q; *q = temp; int a = 5, b = 3; swap(&a, &b); // 3 5 a - 3 b - 5 main swap на main указател на стека програмен код

Област на идентификатори: Глобална дефинирани са пред всички функции, константи и променливи. Могат да се използват във всички функции, освен ако не е дефиниран локален идентификатор със същото име в някоя от функциите. Локална дефинирани са във функция и не могат да се използват в други функции. Областта им започва от дефиницията и завършва с края на блока, в който идентификаторът е дефиниран. Локалния идентификатор скрива нелокалния в областта си. Областта на формалните параметри е локална и е тялото на функцията. Област на клас

int sum = 0; void testfunction() { sum += 1; void testfunction2() { sum += 2; testfunction(); testfunction2(); cout << sum << endl; // 3

Пример: int sum = 0; void testfunction() { int sum = 10; sum += 1; void testfunction2() { sum += 2; testfunction(); testfunction2(); cout << sum << endl; // 2

Едномерни масиви като формални параметри: T a[] формален параметър a от тип едномерен масив от тип Т. T* a формален параметър a от тип указател към тип Т. * Трябва да се предаде и размерността на масива

Да се напише функция, която въвежда елементите на масив. void initarrayelements(int a[], int length) { for(int i = 0; i < length; i++) { cout << "a[" << i << "]="; cin >> a[i]; int arr[10]; initarrayelements(arr, 10);

void initarrayelements(int a[], int length) { for(int i = 0; i < length; i++) { cout << "a[" << i << "]="; cin >> a[i]; int arr[10]; initarrayelements(arr, 10); arr[9] arr[0] length 10 a addr return адрес адрес на предишна i - 0 main swap на main на initarrayelements указател на стека програмен код

void initarrayelements(int a[], int length) { for(int i = 0; i < length; i++) { cout << "a[" << i << "]="; cin >> a[i]; // *(a+i) int arr[10]; initarrayelements(arr, 10); arr[9] - ст/ст arr[0] - ст/ст length 10 a addr return адрес адрес на предишна i -0 main swap на main на initarrayelements указател на стека програмен код

void initarrayelements(int a[], int length) { for(int i = 0; i < length; i++) { cout << "a[" << i << "]="; cin >> a[i]; // *(a+i) int arr[10]; initarrayelements(arr, 10); arr[9]-ст/ст arr[0] - ст/ст main swap на main указател на стека програмен код

Многомерни масиви като формални параметри: T martix[][20] формален параметър matrix от тип двумерен масив от тип Т. В описанието му трябва да присъстват като константи всички размери с изключение на първия. T (*martix)[20] формален параметър matrix от тип указател към тип Т. * Трябва да се предаде и размерността на масива.

Да си припомним (лекция Масиви и указатели ): // *(*(matrix + i)+j) Адресът на третия елемент на матрицата (int matrix[5][4]) *(matrix + 2) + 0; matrix + 2; // correct matrix + 8 is equal to matrix + 8*sizeof(int*) // x *matrix + 8; matrix + 2;

Да се напише функция, която въвежда елементите на двумерен масив (N x M). Нека N!= M. const int MAX_ROWS = 10; const int MAX_COLS = 15; void initmatrix(int matrix[][max_cols], int rows, int cols) { for(int i = 0; i < rows; i++) { for(int j = 0; j < cols; j++) { cout << matrix[" << i << "]["<< j << "]="; cin >> matrix[i][j]; int matrix[max_rows][max_cols]; initmatrix(matrix, MAX_ROWS, MAX_COLS);

Да се напише функция, която въвежда елементите на двумерен масив (N x M). Нека N == M. const int MAX_ROWS_COLS = 10; void initsquarematrix(int squarematrix[][max_rows_cols], int size) { for(int i = 0; i < size; i++) { for(int j = 0; j < size; j++) { cout << squarematrix[" << i << "]["<< j << "]="; cin >> squarematrix[i][j]; int squarematrix[max_rows_cols][max_rows_cols]; initsquarematrix(squarematrix, MAX_ROWS_COLS);

Масивите като върнати оценки: Функциите не могат да са от тип масив. Функции могат да бъдат от тип указател.

// Не можем да върнем масив, който се създава във функцията int* initarray() { int arr[max_length]; for(int i = 0; i < MAX_LENGTH; i++) { cout << "arr[" << i << "]="; cin >> arr[i]; return arr; * arr e в стековата рамка на initarray

int* initarray(int arr[], int length) { for(int i = 0; i < length; i++) { cout << "arr[" << i << "]="; cin >> arr[i]; return arr;

Да се напише функция, която заменя всички срещания на символа x в символния низ s със символа y. void replace(char *str, char x, char y) { int charindex = strlen(str) - 1; while(charindex >= 0) { if (str[charindex] == x) { str[charindex] = y; charindex--;

Следва продължение