Вы находитесь на странице: 1из 109

Структура программы на

языке С++
Татьяна Леонидовна Труханович,
ст. преподаватель, магистр управления ИС

Минск, 2021
Цель курса
Изучить алгоритмы и концепцию объектно-ориентированного
программирования
Научиться проектировать и разрабатывать алгоритмы и ПО в
объектно-ориентированном стиле
Примечание:
Изложение материала производится на примере языка С++.
Особое внимание уделено оформление программного кода*
(структурирование, именование объектов, комментирование).

*Читабельность кода VS производительность


Если не заданы атрибуты качества для
производительности, то предпочтительно читабельность
кода
Источники

1. Доудсон, М. Изучаем C++ через программирование игр/ М. Доудсон. –


Санкт-Перербург: Питер, 2020.
2. ravesli.com [Электронный ресурс]. – Режим доступа: https://
https://ravesli.com/uroki-cpp/
3. https://www3.ntu.edu.sg/home/ehchua/programming/index.html
4. C++ Core Guidelines
https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#S-functions
Языки программирования.
Основные элементы языка
C++
Т.Л. Труханович,
ст. преподаватель, магистр
Язык программирования

 это способ записи алгоритма решения различных задач на


ЭВМ в понятной для компьютера форме.
 характеризуется
― алфавит языка программирования;
― правописание слов и правила записи предложений
(синтаксис);
― смысл слов и фраз (семантика).
 Соблюдение правил в ЯП должно быть более строгим,
чем в разговорном языке, т.к. компьютер это автомат,
который формально выполняет команды и домысливать не
умеет.
Программа – это синтаксическая единица,
подчиняющаяся правилам специфического языка
программирования и состоящая из описаний и
операторов или команд, необходимых для
выполнения определенной функции, либо решения
задачи или проблемы.
Алфавит языка С++ включает

 Латинские буквы (от a до z от A до Z)


 Десятичные цифры: 1 2 3 4 5 6 7 8 9 0
 Спецсимволы: {} () ? ; и др.

Комбинации некоторых символов интерпретируются как один


значимый символ ++ == //
Лексемы

служебные слова – лексемы, значение которых однозначно


определено в языке его разработчиками (int, if, main);
идентификаторы – имена программных объектов, которые дает
им разработчик программы;
константы (литералы) – фиксированные величины в тексте
программы (5, "текст");
знаки операций - это символы, определенные разработчиками
языка, которые указывают выполнить определенные действия
над объектами (операндами);
разделители – разделяет лексемы. В языке С это пробел, перевод
строки, символ табуляции.
Величины

Данные делятся на исходные, промежуточные и результаты.


Всякая величина занимает место памяти компьютера – ячейку.
Каждая ячейка имеет: имя, тип, значение.
Ячейка может быть константой, значение которой не может
изменяться в ходе выполнения программы, или переменной.
Тип определяет занимаемый объем памяти, множество значений,
допустимые операции над величиной.
Операторы

Действия, которые нужно выполнить задаются с помощью


операторов (statement).
Все переменные и операторы хранятся в ячейках памяти
компьютера последовательно друг за другом. Чтобы
выполнить действие, извлекается из памяти оператор,
данные, необходимые для его выполнения и производится
вычисление.
Операторы объединяются в логически завершенные блоки
действий – в С++ функции.
Функции объединяют в библиотеки, которые
разработчики могут подключать и использовать в своих
программах.
Структура программы на языке
С++
директивы препроцессора
int main(){
операторы, которые пишет разработчик
return 0;
}
Трансляция – перевод программы
с ЯП на язык машинных команд.

Компиляция Интерпретация
В память ЭВМ загружается В память компьютера помещаются и
программа компилятор, программа на ЯП и программа
которая переводит программу с интерпретатор.
ЯП на язык машинных команд.
Интерпретатор в последовательности
В результате получается выполнения алгоритма читает
программа на языке машинных определённый оператор программы,
команд, которую можно переводит его в машинные коды и тут же
запускать на выполнение. выполняет эти команды. Затем переходит
к следующему оператору. Если
выполнить не может, то останавливается.
Этапы работы с программой на С++ в
системе программирования

Шаг 1: Написать исходный код и сохранить в файл с расширением (.cpp).


Описания программных объектов, можно помещать в заголовочные
файлы с расширением (.h), которые в свою очередь с помощью директивы
#include могут подключаться к основному программному коду, сохранен-
ному в файлах с расширением (.cpp).
Шаг 2: Обработать исходный код в соответствии с директивами пре-
процессора.
Шаг 3: Компилировать обработанный препроцессором исходный код в
объектный код. В итоге получается файл с расширением (.obj, .o).
Шаг 4: Слинковать полученный объектный код с другими частями в
объектном коде, включая объектный код стандартных библиотек (.lib, .a).
В итоге получаем исполнимый файл с расширением (.exe).
Шаг 5: Запустить исполнимый код с заданными входными параметра-ми,
чтобы получить выходные параметры.
Этапы работы с программой на
ЯП С
Написать программу на языке
С++ для вычисления деления
двух простых дробей.
Пример.
2/3 * 3/5=6/15
#include<iostream>
using namespace std;
 
int main()
{
// определение используемых в программе объектов
struct Fraction{ // определить структуру простая дробь
int numerator;
int denominator;
};
// определить переменные для хранения исходных и результирующей дробей
Fraction result, first, second = {1,2}; /* дроби second при создании присваивается
значение ½ */
// ввод исходных данных
cout << "Введите числитель первой дроби" << endl;
cin >> first.numerator;
cout << "Введите знаменатель первой дроби " << endl;
cin >> first.denominator;
// вычисление по алгоритму
result.numerator = first.numerator*second.denominator;
result.denominator = first.denominator*second.numerator;
// вывод результата
cout << result.numerator << "/" << result.denominator;
}
Тестирование и отладка
программы
Т.Л. Труханович,
ст. преподаватель, магистр
Тестирование

процесс исследования, Компоненты тестирования:


испытания
 Чек-лист
программного продукта,
имеющий своей целью  Тест-кейс
проверку соответствия между
реальным поведением  Баг-репорт
программы и её ожидаемым  Отчет о тестировании
поведением на конечном
наборе тестов, выбранных
определённым образом.
(Обнаружение факта ошибки.)
Чек-лист

Компоненты
 Содержит список
элементов, которые нужно
проверить.
 Задача — убедиться, что
элемент отображается на
экране, а описание
совпадает с реальностью.
Если всё так, пункт
отмечается как
выполненный.
Пример чек-листа

[https://praktikum.yandex.ru/]
Пример чек-листа

[https://praktikum.yandex.ru/]
Тест-кейс
вид тестовой документации, Обязательные элементы тест-кейса:
описывает процесс проверки  УИД;
сервиса.
 заголовок;
 шаги;
 ожидаемый результат (ОР).
Дополнительные элементы:
 предусловие/постусловие;
 операционную систему (ОС);
 устройство, на котором тестируют
продукт;
 другие компоненты: например,
версию ПО, названия элементов,
которые проверяют роль
пользователя.
Примеры тест-кейсов
Баг-репорт
Обязательные поля

Необязательные поля

Заголовок: Что? Где? Когда?


[https://praktikum.yandex.ru/]
Пример баг-репорта

[https://praktikum.yandex.ru/]
Пример баг-репорта

[https://praktikum.yandex.ru/]
Пример баг-репорта

[https://praktikum.yandex.ru/]
Отчет о тестировании

 Универсальный идентификатор – уникальный номер тест-кейса.


 Название – основная идея или тема, краткое описание тест-кейса.
 Предусловия – описание условий, которые должны быть выполнены
перед проведением теста.
 Шаги – последовательность действий, которая должна привести нас к
ожидаемому результату.
 Ожидаемый результат – результат, что мы желаем увидеть после
выполнения шагов.
 Полученный результат – результат, реально полученный после
выполнения шагов.
 Выводы – оценка корректности работы, комментарии по отладке
приложения.
Пример отчета о тестировании
для ЛР
1 Анализ простой дроби
Шаги:
1 Запустить программу
2 Ввести значение числителя 1
3 Ввести значение знаменателя 4
Ожидаемый результат
На экран должно быть выведено:
Вы ввели дробь: 1/4
Десятичное представление: 0,25
Дробь правильная? Да
Фактический результат:
Поиск и устранение ошибок

Методы локализации
Отладка ошибки
этап разработки Деление пополам.
компьютерной программы, на
Поэтапное
котором обнаруживают,
добавления/выполнения
локализуют и устраняют
функционала.
ошибки. (Обнаружение
причины ошибки.) Узнавать текущие значения
переменных. (Вывод значений
или дебагер)
Выяснять, по какому пути
выполнялась программа. (Вывод
сообщений с указанием метки
блока программы или дебагер)
Упражнение

Написать программу для вычисления площади комнаты.


Разработать для нее чек-лист с тест-кейсы.
Типы данных

Базовые типы Модификаторы


 char- арифметический  short- короткий
символьный тип;  long- длинный
 int-целочисленный тип;  signed-знаковый(+)
 float, double-  unsigned-беззнаковый
вещественные числа;
 bool – логический тип
{true,false}
Переменные

 это программные объекты,


которые создает Синтаксис оператора определения
разработчик для хранения переменной:
данных.
типДанных
 имеют имя, тип данных, имяПеременной[=значение |
значение, время жизни, (значение) | {значение} ];
область видимости и
адрес в памяти. Пример оператора, который
выделит ячейку памяти для
хранения значения целого типа,
присвоит ей имя testValue и
запишет в нее 1.
int testValue{1};
Способы задания значение
переменной
 Инициализация при объявлении
 Операция присваивания - обозначается знаком «=» и
выполняет копирование значения, являющегося правым
операндом, в переменную слева.
 testValue = 2;
 Ввод пользователя
 cin>>testValue;
Структурные переменные

 Группа переменных, описывающая определенный объект


реального мира, может быть объединена в структуру.
 Переменные, входящие в структуру занимают непрерывную
область в памяти и располагаются друг за другом.
 Можно сказать, что структура является шаблоном для
создания структурных переменных.
Пример оператора, который определит
Синтаксис оператора структуру Student, включающую строковое
определения структуры: поле surname и целочисленное mark:
struct ИмяСтруктуры{ struct Student {
тип_данных имяПоля1; string surname;
тип_данных имяПоля2; int mark;
}; };

Синтаксис объявления структурной переменной:


ИмяСтруктуры ИмяСтруктурнойПеременной[{значениеПоля1[,
значениеПоля2]}];

Пример оператора, который создаст объект theStudent и записать в него


студента с фамилией Колос.
Student theStudent{"Колос"};
Операции

int x=3;
 x/2 1  !true= false
 (float)x/2 1.5
 false&& true=false
 (float)x/2. 1.5
 false&&false=false
 x%2 1
 true&& false=false
 x++-2 1 //x=4
 true&& true = true
 ++x-2 2 //x=4
 false||false=false
 x==3 1
 false||true=true
 x!=3 0
 true||false=true
 x>0?'y':'n' 1
 x+=1 4
Правила записи выражения в
языках высокого уровня:
 все символы записываются в одну строку;
 в выражении проставляются все знаки операции;
 при записи выражений учитываются приоритеты операции;
 для влияния на последовательность операции используются
скобки.
Правила преобразования при
выполнении бинарных операций:

 при разных типах операндов происходит преобразование величин с


младшими типами к старшим для всех операций, кроме присваивания;
 при выполнении операции присваивания величина, полученная в
правой части преобразуются к типу переменных стоящих слева от
знака равно.
 Старший тип включает значение младшего. Вещественные является
старшими по отношению к целым.
char->shat->int->long
float->double->long->double
 При преобразовании целой величины к вещественному типу может
произойти потеря точности.
Операторы
Оператор if
Student first{"Колос", 8},
second{"Василькова", 9};
cout<<"лучше сдал студент ";
if(выражение){ if(first.mark > second.mark) {
блок1; cout<<first.surname;
} }
else {
[else{ cout<<first.surname;
блок2; }
}]
Student theStudent;
cin >> theStudent.mark;
if(theStudent.mark < 0 || theStudent.mark > 10){
cout<<"Некорректный ввод исходный
данных!";
exit;
}
cin >> theStudent.surname;

Под термином блок будем понимать последовательность операторов*.


Оператор switch

switch(целочисленное 1. Вычисление значения


целочисленного выражения;
выражение) {
2. Полученные значения
case константа1: блок1; последовательно сравниваются с
break; константами помещёнными после
служебного слова case, при
case константа2: блок2; совпадении значений выполняются
[default: операторы стоящие после :

блок;] 3. Если не с одной из констант


совпадений не произошло, то
}; выполняются операторы после
default. default может
отсутствовать.
break прерывает цепочку выполнения
операторов.
Student theStudent = {"Колос", 8};
switch (theStudent.mark){
case 0: cout<< "Незачтено! \n";
break;
case 1: cout<< " Удовлетворительно! \n ";
break;
case 2: cout<< " Хорошо! \n ";
break;
case 3: cout<< " Отлично! \n ";
break;
default:
cout<< " Нет такой отметки!\n ");
};
int x; //число
int n; // степень
int y = 1;// результат
cout<<"Введите степень ";
cin>>n;
cout<<"Введите число ";
cin>>x;
switch (n) {
case 5: y *= x;
case 4: y *= x;
case 3: y *= x;
case 2: y *= x;
case 1: y *= x;
cout<<y;
break;
default:
cout<<"Нет такой степени";
};
Массив

Область памяти, где хранятся объекты одного типа, доступ к


которым осуществляется через индексы называется массив.
Объявление массива

имяТипа ИмяМассива[размер] [ = {список значений} ];

Примеры:

Оператор, который создаст массив А для хранения 10 целых


чисел:
int A[10];
Оператор, который создаст массив для хранения данных о трех
студентах и запишет туда студентов Колоса с отметкой 8,
Василькову с отметкой 9 и Жука без указания отметки:
Student Students[] = { {"Колос", 8}, {"Василькова", 9}, {"Жук"} };
Оператор while

while (условие){
блок;
} int i=0, n=3;
Student Students[] = { {"Колос", 8},
{"Василькова", 9}, {"Жук", 7} };

while(Students[i].surname != "Колос"
&& i<n){
i++;
}

if( i < n) cout<<Students[i].mark;


Оператор do while

do{
операторы;
int i=0, n = 3;
}while (условие);
Student Students[] = { {"Колос", 8},
{"Василькова", 9}, {"Жук", 7} };

do{
cout << (i+1) <<
Students[i].surname << " " <<
Students[i].mark<<endl;
i++;
} while(i<n);
Оператор for

for(выр_1; выр_2; выр_3){


блок; n = 3;
} Student Students[]={ {"Колос", 8},
{"Василькова", 9}, {"Жук", 7} };

for (int i=0, number = 1; i<n ; i++){

if(Students[i].mark>0){
cout << number++ << "." <<
Students[i].surname << " « <<
Students[i].mark << endl;
}

}
Оператор foreach

for(типМассива
имяРабочейПеременной:
имяМассива){ Student Students[] = { {"Колос", 8},
блок; {"Василькова", 9}, {"Жук", 7} };
} for (Student theStudent : Students){
cout << theStudent.surname << " "
<< theStudent.mark << endl;
}

*Данный вид цикла не предоставляет доступ к индексу


элемента. Используется для перебора всех элементов массива.
Напечатать таблицу умножения.

int main (){


int x, y;
for(x=2; x<=9; x++)
for(y=2; y<=9; y++)
cout<<x<<"*"<<y<<"="<<x*y<<endl;
cout<<endl;
}
Бесконечный цикл

Если внутри тела цикла не  while(1);


изменяются параметры,
участвующие в условии
цикла, то выполнение цикла
никогда не остановится, т.е.  int i=0;
произойдет зацикливание.
while(i>0) cout>>i;

 for(int i=0; i<10; i+2)


cout>>i;
Операторы выходы

break; - досрочное прекращение


выполнения цикла.
continue; - прекращение итерации
цикла.
Оператор ЭВМ вводит последовательность из n
чисел. Найти сумму положительных чисел до
первого нуля.
void main (){
int a, i, S=0;
for(i=1; i<=n; i++){
cin >> a;
if(a==0) break;
if(a<0) continue;
S=S+a;
}
cout << S;
}
Указатели
Указатель

это адрес поля памяти,


занимаемого
программным
объектом.
Способы выделения памяти
под переменные

Статический Динамический
int a=5; int *a,*b;
cout<<a; a=new int; // выделить
int b[10]; *a=5;
cout<<a;
delete a;//забрать
b=new int[10];
delete[] a;
Ссылки

 Ссылка является скрытым указателем и используется как


альтернативное имя переменной.
 Основное назначение ссылок – передача параметра в
функцию, а также возвращение результата функции.
int number = 88; // объявление целочисленной переменной
number
int &refNumber = number;// объявление ссылки на переменную
number
Массивы
Массив

 структура или таблица однотипных элементов, занимающих


непрерывную область памяти.
 имеет: размер, имя, тип.
 элементы обозначаются индексными именами.
 нумерация элементов в языке С++ начинается с нуля.
 Размер массива должен быть целочисленной константой.
Объявление массива

Формат Пример
 Объявить массив из 10
элементов.
 тип имя [размер];
int A[10];
 Размер массива должен быть
целочисленной константой.  Объявление с
инициализацией
 #define n 5 или const int n=5;
int B[ ]={4, 6, 7, 8, 10,6};
n=sizeof(A)/sizeof(A[0]);
Доступ к элементам массива

Синтаксис Пример
 имя[индекс];
Имя массива – адрес его  cout>>B[2];// выведет 7
нулевого элемента.
 *(имя+индекс)
 cout>>*(B+2);// выведет 7
Проход по элементам массива
можно организовать с помощью for
Строка в языке С/C++

 это массив символов, в конце которого находится символ


«\0», который является признаком конца строки. На этом
факте и строятся все алгоритмы по обработке строк.
 char str[]={‘Т’,’е’,’с’,’т’,’о’,’в’,’а’,’я’,’ ’,’с’,’т’,’р’,’о’,’к’,’а’,’. ’,’\0
’};
 В С++ существует класс string. Следовательно со строками
можно работать как с объектами данного класса.
 string str=“Тестовая строка.”;
Функции
Подпрограммы

 Процедура
 является минимальным исполняемым программным
модулем и представляет собой набор команд для
выполнения некоторого вспомогательного алгоритма.
 может принимать параметры.

 Функция
 является минимальным исполняемым программным
модулем и представляет собой набор команд для
выполнения некоторого вспомогательного алгоритма.
 может принимать параметры.
 может возвращать значение.
Найти максимум из трех чисел.

int Max(int x, int y);


int main(){
int a,b,c,d;
cout<< "Вв три целых числа ";
cin>>a>>b>>c;
d=Max(Max(a,b),c);
cout<< "Максимальное значение“<<d;
}
int Max(int x, int y){
// нахождение максимума из двух переменных
if(x>y)return x; => return x>y;
else return y;
}
Формат описания функции

тип имя (спецификация параметров)


{
тело функции
}

Пример именования функций: getArea(), setRadius(),


moveDown(), isPrime().
Пример спецификации параметров: (int a, char b, float *c).

В языке С++ процедура это функция у которой тип


имеет значение void.
Оператор return

Формы записи: Назначение:


 return;  выход из функции;
 return выражение;  возврат значения.
Формат вызова функции

имя(список фактических параметров);


Алгоритм выполнения функции

1) Вычисляются выражения в списке параметров .


2) Тип полученного фактического аргумента сравнивается с
типом соответствующего формального параметра. Если они не
совпадают, то либо производится преобразование типов, либо
формируется сообщение об ошибке. Если при объявлении
функции указано, что ей не требуются параметры, а при
вызове они указаны, формируется сообщение об ошибке.
3) Происходит присваивание значений фактических параметров
соответствующим формальным параметрам.
Алгоритм выполнения функции

4) Управление передается на первый оператор функции.


5) Выполнение оператора return в теле функции возвращает
управление и вычисленное значение в вызывающую программу.
При отсутствии оператора return управление возвращается
после выполнения последнего оператора тела функции, а
возвращаемое значение не определено.
Прототип

 Прототипом называется предварительное описание


функции, в котором содержатся все необходимые
сведения для обращения к ней: имя и тип, а также типы
формальных параметров.
 В прототипе имена формальных параметров ставить
необязательно.
 В конце прототипа обязательно ставится «;».
 Прототип можно записывать и в теле основной
функции, наряду с описанием других программных
объектов.
Написать программу, которая выведет на экран n
раз заданный символ.
void printLine(int, char); // прототип функции line().

void main()
{
printLine (80,'*'); // вызов функции line()
}

// описание функции line()


void printLine (int n, char symbol)
{/* функция выводит на экран строку из 80 знаков,
переданных в качестве параметра*/
for (int i=0; i<n; i++)cout << symbol;
}
Рекомендации по
проектированию подпрограмм
 Одна подпрограмма должна реализовывать один
алгоритм
 Имя подпрограммы должно начинаться с глагола,
дающего ответ на вопрос, что делает она, далее
поясняющее существительное, за которым следуют ()
 Метод не должен выполнять неожиданных для
пользователя действий
 Соблюдать принцип ортогональности: два или более
объекта ортогональны, если изменения, вносимые в
один из них, не влияют на любой другой.
 struct Fraction{
int numerator;
int denominator;
};
// объявление функций
Fraction multFractions(Fraction, Fraction);
void outputFraction(Fraction);
 
int main()
{
Fraction result, A = {1, 2}, B = {1, 3};
// вызов функций
result = multFractions(A, B); /* результат умножения дробей,
полученный в функции multFractions присваивается дроби result */
outputFraction(A);
cout<<" * ";
outputFraction(B);
cout<<" = ";
outputFraction(result);
}
 
// определение функций
Fraction multFractions(Fraction first, Fraction second)
{
Fraction tmp; // временная переменная хранит результат умножения
tmp.numerator = first.numerator*second.numerator;
tmp.denominator = first.denominator*second.denominator;
return tmp;
}
void outputFraction(Fraction theFraction)
{
cout << theFraction.numerator <<"/"<< theFraction.denominator;
}
Упражнение

Написать программу для определения площади квартиры с


использованием вспомогательного алгоритма вычисления
площади комнаты.
Разработать для нее чек-лист и тест-кейсы.
Передача массива в функцию

Чтобы обрабатывать элементы массива в функции, необходимо


передать в качестве параметра:
 указатель (адрес) на начало массива;
 размер (если необходимо).
struct Student {
string surname;
int mark;
};
 
void outputArray(Student Students[], int n);
 
int main()
{
Student Students[]={ {"Колос", 8}, {"Василькова", 9} };
outputArray(Students, 2);
}

void outputArray(Student Students[], int n)


{
for(int i=0; i<n; i++){
cout<<Students[i].surname<<" "<<Students[i].mark<<endl;
}
}
Структура лямбда-выражения

 предложение фиксации (в
спецификации C++ это lambda-
introducer.)
 список параметров
(необязательно).(Также именуется
как lambda declarator.)
 отключаемая спецификация
(необязательно).
 спецификация исключений
(необязательно).
 завершающий возвращаемый тип
(необязательно).
 тело лямбда-выражения)
#include <iostream>
using namespace std;

int main()
{
auto f1 = [](int x, int y) { return x + y; };

cout << f1(2, 3) << endl;

int n = [] (int x, int y) { return x + y; }(5, 4);


cout << n << endl;

return EXIT_SUCCESS;
}
Аргументы по умолчанию
int myfunc(int, int, int = 3);
int main() {
cout << myfunc (4, 5, 6) << endl; // No default
cout << myfunc (4, 5) << endl; // 4, 5, 3(default)
// cout << myfunc (4) << endl;
// error: too few arguments to function 'int fun2(int, int, int)'
}
int myfunc (int n1, int n2, int n3) {
return n1 + n2 + n3;
}
Указатели для передачи
параметров функции
void swap (int * , int *);

int main ()
{
int x=1 , y=2;
cout<< " x= " <<x<< " y= " <<y);// x=1 y=2
swap (&x ,&y);
cout<< " x= " <<x<< " y= " <<y); // x=2 y=1
}

void swap (int *a , int *b)


{
int c;
c=*a ;
*a=*b ;
*b=c ;
}
Переменные в *a
*b
функции swap() FFCO FFC4

Переменные в
функции main() x y
1 2
FFC0 FFC2 FFC4
Ссылки для передачи
параметров функции
void swap (int&, int&);

int main ()
{
int x=1, y=2;
cout<< " x=" <<x<< " y=" <<y;// x=1 y=2
swap (x ,y);
cout<< " x=" <<x<< " y=" <<y; // x=2 y=1
}

void swap (int&a , int&b)


{
int c;
c=a ;
a=b ;
b=c ;
}
Рекурсивные функции
 В математике рекурсивным
называется определение любого
long Fact (int n)
понятия через само себя, т.е. вызов {
функции внутри функции. if (n<0) return 0;
 Последовательность рекурсивных
обращений функции должна
if (n==0) return 1;
обязательно выходить на //опорное значение
определенное значение.
return n*Fact (n-1);
 Весь маршрут последовательных
вхождений запоминается в СТЭКЕ.
}
 Выполнение рекурсивных функций
происходит в 2 этапа, прямой ход –
заполнения стека, и обратный ход –
цепочка вычислений по обратному
маршруту сохраненному, в стеке.
Указатели на функции

 Имя функции является начальным адресом ее расположения в


памяти, и, следовательно, может рассматриваться как указатель.

 Указатель на функцию объявляется следующим образом:


тип * имя_указат_на_функц(специфик. пар-ров);

 Пример
 double (*fp)(int, int); /* fp указатель на функцию, которая
принимает два параметра типа int и возвращает тип double */
int main() Функции:
{ int add(int n1, int n2)
int number1 = 5, number2 = 6; {
int (*fp)(int, int); // указатель на функцию return n1 + n2;
}
char c; // знак операции
int sub(int n1, int n2)
cout<<"Введите знак операции"; {
cin>>c; return n1 - n2;
switch(c){ // присвоить указателю адрес }
соответствующей функции int mult(int n1, int n2)
case '+': fp=&add; break; {
case '-': fp=&sub; break; return n1 * n2;
case '*': fp=&mult; break; }
default: cout<<"Такая операция не реализована.";
};
// вызвать функцию, на которую указывает
указатель
cout << number1<<c<<number2<<"="
<<fp(number1,number2) << endl;
}
Указатель на функцию как параметр
функции

int arithmetic(int, int, int (*)(int, int)); /*функция два аргумента типа int и
указатель на функцию, которая принимает два целочисленных аргумента и
возвращает значение типа int */

int main()
{
int number1 = 5, number2 = 6;
// выполняется сложение number1 и number2
cout << arithmetic(number1, number2, add) << endl;// add из предыд. слайда
// выполняется вычитание number1 и number2
cout << arithmetic(number1, number2, sub) << endl;
}

int arithmetic(int n1, int n2, int (*operation) (int, int))


{
return (*operation)(n1, n2);/* вызываем функцию, имя которой пришло
параметром*/
}
Параметры функции main()
тип main(int argc, char*argv[]){/*…*/}

 argc определяет количество параметров, передаваемых


функции, включая имя самой программы.
 argv является указателем на массив указателей типа
char. Каждый элемент массива содержит указатель на
отдельный параметр командной строки, хранящееся в
виде С-строки, оканчивающейся null-символом.
#include<stdlib.h>
#include<iostream>
using namespace std;
 
int main(int argc, char*argv[])
{
float a,b; // слагаемые
/*Массив argv[] содержит значения параметров в виде строк:
argv[0]- название программы; argv[1] – первое слагаемое;
argv[2] – второе слагаемое.*/
// для выполнения сложения слагаемые приводятся к типу
float
a=atof(argv[1]);
b=atof(argv[2]);
cout<<a<<"+"<<b<<"="<<a+b;
}
Тестовые задания
Для реализации условных алгоритмов
в языке С++ можно использовать:

 А) ?
 Б) if
 В) switch
 Г) for
 Д) do while
 Е) while
Помошью какого оператора на экран будет
выведена последовательность 12345

 А) for(i=0;i<5;)cout<<i++;
 Б) for(i=1;i<=5;i++)cout<<i;
 В) i=0;while(i<=5)cout<<i++;
 Г) while(i<=5)cout<<i++;
 Д) все из выше перечисленных
 Е) нет правильного ответа.
Выберите правильный вариант объявления
массива из 10 элементов целого типа:

 А)int A[10];
 Б)A=int[10];
 В A= new int[10];
 Г) float A[10]
 Д) int[10] A;
 Е) нет правильного ответа
Сколько операторов return может
содержать функция в языке С++
 А) ровно один;
 Б) не более двух;
 В) несколько;
 Г) два;
 Д) нет правильного ответа.
Что будет выведено на экран

short hand = 42; int b=0;


if ( hand < 50 && !b ) /* Line 7 */
hand++;
if ( hand > 50 ); /* Line 9 */
else if ( hand > 40 ) {
hand += 7;
hand++;
}
else --hand;
cout<<hand;

А)41 Б)42 В)50 Г)51


Что будет выведено на экран, если
переменная с принимает значение 1:

switch(c){
case 1:
case 2: cout<<"два";
case 3: cout<<"три";break;
default: cout<<"нет";;
}

А) ничего не будет выведено Б)два


В)три Г)дватри
Д)два три Е) нет
Что будет выведено на экран

int x = 12; 
while (x < 10) { 
    x--; 

cout<<x; 

А)0.
Б) cout никогда не будет выполнен.
В)10
Г) 12
Что будет выведено на экран

for(int i=0;i<10;i++){
if(i==3 || i==5)continue;
if(i==7)break;
cout<<i;
}

А) ничего не будет выведено


Б)0123456789
В)01246
Г) 012468
Д)357
Е)нет правильного ответа
Что будет выведено на экран

M[]={5,6,7,8,9,1,2,3,4,5}; Что будет выведено на экран


int i=7;
cout<<M[++i]/2<<*(M+i)+M[2];

А) 1 10
Б) 1,5 10
В) 2 10
Г) 2 8
Д) нет правильного ответа.
Что будет выведено на экран
#include<isotream>
using namespace std;
void f()
{
cout<<”Hello”<<endl;
}
main(){}
А) Ничего не будет выведено.
Б) Hello
В) Ошибка – функция объявлена, но не вызвана.
Г) Ошибка – функция определена, но не объявлена
Д) Ошибка – тело функции main() пусто.
Что будет выведено на экран

void f(int a, int* b) {


a++; *b++;
cout<<a<<*b<<endl;
}
int main() {
int c=1;b=1;
cout<<c<<b<<endl;
f(c,&b);
cout<<c<<b<<endl;
}
А) 112212 В) 112211
Б)11 Г)11
22 22
12 11
Как вызвать программу из командной
строки, чтобы на экран было выведено: Arg
is 2

int main (int argc, char*argv[])


{
String biz = argv[1];
String baz = argv[2];
String rip = argv[3];
cout<<"Arg is " << rip;
}

А) Myfile 222
Б) Myfile 1 2 2 3 4
В) Myfile 1 3 2 2
Г) Myfile 0 1 2 3
Упражнение

Написать эссе (10 предложений) на одну из тему


«Что такое компьютерная программа и как ее написать»