Содержание

Слайд 2

Структура программы Простейшая программы на языке C состоит всего из 12

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

Простейшая программы на языке C состоит всего из 12

символов, но заслуживает внимательного рассмотрения.
void main()
{
}
Слайд 3

#include int main() { printf(“Privet!\n”); return 0; }

#include
int main()
{
printf(“Privet!\n”);
return 0;
}

Слайд 4

include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { printf("Privet!\n"); return 0; }

include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{ printf("Privet!\n");
return 0;
}

Слайд 5

Основные понятия языка Программы на языке C++ может использовать лишь символами,

Основные понятия языка

Программы на языке C++ может использовать лишь символами,

предусмотренными алфавитом этого языка.
Буквы латинского алфавита
Арабские цифры
Специальные символы
Программа состоит из инструкций включающих в себя слова и выражения
Слайд 6

Основные понятия языка Слова в языке C++ делятся на: Ключевые слова Стандартные идентификаторы Идентификаторы пользователя

Основные понятия языка

Слова в языке C++ делятся на:
Ключевые слова
Стандартные идентификаторы
Идентификаторы

пользователя
Слайд 7

Основные понятия языка Ключевые слова являются частью языка, имеют определенное написание

Основные понятия языка

Ключевые слова являются частью языка, имеют определенное написание

и несут определенный смысл.
Например:
IF FOR WHILE DO
INT FLOAT CHAR
Слайд 8

Основные понятия языка Стандартные идентификаторы предназначены для вызова стандартных функций, хранящихся

Основные понятия языка

Стандартные идентификаторы предназначены для вызова стандартных функций, хранящихся

в библиотеках языка.
Например:
sin(x) exp(x) pow(x)
abs(x) cos(x) tan(x)
sqrt(x) log10(x)
Слайд 9

Основные понятия языка Идентификаторы пользователя служат для обозначения процедур, переменных и

Основные понятия языка

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

констант.
Правила:
не содержит пробелов
Состоит из букв, цифр и символов подчеркивания, но начинается с буквы
Слайд 10

Переменная – это именованная область памяти, предназначенная для хранения значений, которые

Переменная – это именованная область памяти, предназначенная для хранения значений, которые

могут изменяться в процессе работы программы
int f,x=0;
float Y; char z;
Слайд 11

Константа – это так же именованная область для хранения значений, которые

Константа – это так же именованная область для хранения значений, которые

не изменяться в процессе работы программы
const int x=4;
Константы и переменные используются в выражениях
Слайд 12

ВЫРАЖЕНИЯ Выражение задает порядок выполнения действий над элементами данных и состоит

ВЫРАЖЕНИЯ
Выражение задает порядок выполнения действий над элементами данных и состоит из

операндов (переменных, констант, вызовов функций), круглых скобок и знаков операций.
Операции определяют действия, выполняемые над данными.
Скобки ставятся для управления порядком выполнения действий.
Слайд 13

Арифметические операции * / + - Операции сравнения , =, !=,

Арифметические операции
* /
+ -
Операции сравнения
<, >, <= ,>=, !=, ==
Логические

операции
! -отрицание, && - И, || - ИЛИ
Слайд 14

Стандартные функции Имя(параметры)

Стандартные функции
Имя(параметры)

Слайд 15

abs(x-y)/pow(1+2*x,2)- exp(sqrt(1+м)) Написать выражение на языке С++

abs(x-y)/pow(1+2*x,2)- exp(sqrt(1+м))

Написать выражение на языке С++

Слайд 16

Типа данных Объявить тип переменной означает установить границы значений этой переменной,

Типа данных
Объявить тип переменной означает установить границы значений этой переменной, которые

определяются этим типом и установить допустимые операции для этого типа.
Слайд 17

Слайд 18

Целочисленные типы данных

Целочисленные типы данных

Слайд 19

Целочисленные типы данных char – целочисленный знаковый тип данных размером в

Целочисленные типы данных
char – целочисленный знаковый тип данных размером в 1

байт
int – целочисленный знаковый тип данных размером в 4 байта.
short int – сокращённый вариант int, имеет размер 2 байта
long long int – самый большой из встроенных типов данных, имеет размер 8 байт и позволяет хранить значения от -263 до 263-1.
Слайд 20

К каждому из этих типов можно добавить модификатор unsigned, что поднимет

К каждому из этих типов можно добавить модификатор unsigned, что поднимет

верхнюю границу диапазона значений в 2 раза, а нижнюю сделает равной 0.
int a;
unsigned char b=49;
long long int d, e, f=35416545, g;
Слайд 21

Вещественные типы данных В языке Си есть три типа чисел с

Вещественные типы данных
В языке Си есть три типа чисел с плавающей

запятой:
float – вещественное одинарной точности.
double – вещественное двойной точности.
long double – вещественное расширенной точности.
Слайд 22

#include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) {float x; double

#include "stdafx.h"
#include
int _tmain(int argc, _TCHAR* argv[])
{float x; double y=3.141592;
x=1.0*rand()/10;
std::cout <<

x<<“ “< return 0;
}
Слайд 23

ОПЕРАТОРЫ ЯЗЫКА С++ 1) Оператор присваивания Оператор присваивания служит для вычисления

ОПЕРАТОРЫ ЯЗЫКА С++
1) Оператор присваивания
Оператор присваивания служит для вычисления выражения и

записи результата в память компьютера.
Общий вид записи оператора
переменная=выражение;
Знак = читается как «присвоить». Конец любого оператора на языке С++ фиксируется точкой с запятой.
Слайд 24

Странные операторы присваивания В программировании часто используются несколько странные операторы присваивания,

Странные операторы присваивания
В программировании часто используются несколько странные операторы присваивания, например:

i = i + 1;
В языке С++ определены специальные операторы быстрого увеличения (уменьшения) на единицу инкремент и декремент
Слайд 25

(инкремент) i++; (постфиксная форма) ++i; (префиксная форма) что равносильно оператору присваивания

(инкремент)
i++; (постфиксная форма)
++i; (префиксная форма)
что равносильно оператору присваивания i

= i + 1;
(декремент)
--i; i--; равносильно оператору i=i-1;
Сокращенная запись оператора присваивания:
s+=x; (s=s+x;) p*=n;(p=p*n;)
Слайд 26

2)Комментарии Комментарии используются для документирования текста программы и не выполняют никаких

2)Комментарии
Комментарии используются для документирования текста программы
и не выполняют никаких действий.
Комментарий может

размещаться, как в отдельной строке, так и в конце любой.
Комментарий может начинаться с //
или заключаться в /* … */
Слайд 27

Пример линейной программы Составить программу вычисления площади треугольника по формуле: Где

Пример линейной программы
Составить программу вычисления площади треугольника по формуле:
Где - полупериметр;

а,b,с - стороны треугольника.
Исходные данные: а = 1; b = 2; с = 0,5.
Слайд 28

#include "stdafx.h" #include int main() { float a, b, c, p,

#include "stdafx.h"
#include
int main()
{
float a, b, c, p, S;// описание переменных
printf("Введите

исходные данные ");
scanf("%f %f %f",&a, &b,&с); /* ввод с клавиатуры значений для а, b и с */
p = (a + b + c) / 2; // вычисление полупериметра
S=sqrt(p*(p - a)*(p -b)*(p - c)); // выч-е площади
printf("Площадь треугольника S =%5.2f", S);
return 0;
}
Слайд 29

3) Составной оператор Если возникла необходимость объединить несколько операторов в одно

3) Составной оператор
Если возникла необходимость объединить несколько операторов в одно целое,

используется составной оператор:
{
оператор 1;
. . .
оператор N;
}
Слайд 30

4) Операторы цикла 1) оператор For Формат: for( i = ml;

4) Операторы цикла
1) оператор For
Формат:
for( i = ml;

i<= m2; i=i+шаг)
{ <тело цикла>; }
i - параметр, управляющий работой цикла;
ml, m2 - выражения, определяющие соответственно начальное и конечное значения параметра цикла.
Слайд 31

Правила использования оператора for 1)Параметр цикла i, а также его значения

Правила использования оператора for
1)Параметр цикла i, а также его значения ml

и m2 могут быть любого типа.
2)Параметр i, а также значения ml и m2 не должны переопределяться (менять значения) в теле цикла.
3)При завершении работы оператора for параметр i становится неопределенным и переменную i можно использовать в других целях.
4)Тело цикла может не выполниться ни разу, если m1>m2 для цикла for... с положительным шагом, или m1
Слайд 32

Графическая интерпретация оператора цикла for...

Графическая интерпретация оператора цикла for...

Слайд 33

Слайд 34

Конец

Конец

Слайд 35

2)Оператор While Оператор цикла с предусловием Формат: While (условие) { Операторы

2)Оператор While
Оператор цикла с предусловием
Формат:
While (условие)
{
Операторы

тела цикла
}
Замечание. Если тело цикла состоит из нескольких операторов, то их обязательно заключают в операторные скобки {...}.
Слайд 36

Графическая интерпретация оператора

Графическая интерпретация оператора

Слайд 37

Слайд 38

Слайд 39

3)Оператор цикла do...while Оператор цикла с постусловием Формат do { } while (логическое выражение);

3)Оператор цикла do...while
Оператор цикла с постусловием
Формат
do
{
<тело цикла>
}
while

(логическое выражение);
Слайд 40

Графическая интерпретация оператора

Графическая интерпретация оператора

Слайд 41

Слайд 42

Вложенные циклы

Вложенные циклы

Слайд 43

int _tmain(int argc, _TCHAR* argv[]) {float х, у, z; // описание

int _tmain(int argc, _TCHAR* argv[])
{float х, у, z; // описание переменных
printf(“Расчет

функции двух переменных\n”); x= -l; //x - параметра внешнего цикла
while (х<=1) // запуск внешнего цикла
{
printf(“x=%6.1f \n”, x); //вывод значения x
for( y=0; y<=1; y=y+0.1)
{ z=sin(x) + cos(y); // вычисление функции
printf(“y= %6.1f z=%6.1f\n”, y, z);
} x=x + 0.5;
}return 0;}
Слайд 44

5) Условные операторы На языке С++ различают два вида условных операторов:

5) Условные операторы
На языке С++ различают два вида условных операторов: короткий

и полный.
Короткий условный оператор
Общий вид записи
if (логическое выражение) P;
где Р - любой оператор языка.
Слайд 45

Работа оператора Сначала вычисляется логическое выражение (ЛВ), и если оно имеет

Работа оператора
Сначала вычисляется логическое выражение (ЛВ), и если оно имеет

значение TRUE, то выполняется оператор Р, стоящий за логическим выражением. В противном случае оператор Р игнорируется.
Слайд 46

Графическая интерпретация оператора

Графическая интерпретация оператора

Слайд 47

Пример 1. Вычислить значение переменной у заданной двумя интервальными выражениями:

Пример 1.
Вычислить значение переменной у заданной двумя интервальными выражениями:

Слайд 48

Слайд 49

int main() { setlocale (0,"Rus"); float x,y; cout cin>>x; if(x>0) y=log(x);

int main()
{ setlocale (0,"Rus");
float x,y;
cout <<"Введите Х:";
cin>>x;
if(x>0) y=log(x);
if (x<=0) y=exp(x);
printf("Y=%6.2f\n",y); return 0;
}

Слайд 50

Полный условный оператор Общий вид записи if (логическое выражение) P1; else

Полный условный оператор
Общий вид записи
if (логическое выражение)
P1;
else

P2;
где Р1, Р2 - любые операторы или даже группы операторов.
Слайд 51

Графическая интерпретация оператора

Графическая интерпретация оператора

Слайд 52

Работа оператора Вычисляется логическое выражение, и если оно имеет значение ИСТИНА(не

Работа оператора
Вычисляется логическое выражение, и если оно имеет значение ИСТИНА(не ноль),

то выполняется оператор Р1, стоящий после логического выражения. В противном случае (ЛОЖЬ(ноль)) оператор P1 пропускается, а выполняется оператор Р2, стоящий после служебного слова else.
Слайд 53

if (логическое выражение) { оператор 1; ……………… оператор n; } else

if (логическое выражение)
{
оператор 1;
………………
оператор n;
}
else


{
оператор 1;
………………
оператор m;
}
Слайд 54

Пример 1. Вычислить значение переменной у заданной двумя интервальными выражениями:

Пример 1.
Вычислить значение переменной у заданной двумя интервальными выражениями:

Слайд 55

Слайд 56

int main() { setlocale (0,"Rus"); float x,y; cout cin>>x; if(x>0) y=log(x);

int main()
{ setlocale (0,"Rus");
float x,y;
cout <<"Введите Х:";
cin>>x;
if(x>0)
y=log(x);
else
y=exp(x);
printf("Y=%6.2f\n",y);
return 0;
}

Слайд 57

Обработка последовательностей

Обработка последовательностей

Слайд 58

Пример 2. В последовательности чисел, вводимой с клавиатуры вычислить количество чисел кратных 7.

Пример 2.
В последовательности чисел, вводимой с клавиатуры вычислить количество чисел кратных

7.
Слайд 59

int main() { setlocale (0,"Rus"); int N,x,k,i; cout cin>>N; k=0; cout

int main()
{ setlocale (0,"Rus");
int N,x,k,i;
cout <<"Сколько чисел будете вводить:";

cin>>N;
k=0;
cout<<"Введите "< for(i=1;i<=N;i++)
{
cin>>x;
if(x%7==0) k++;
}
printf("K=%i\n",k);
return 0;
}
Слайд 60

Обработка последовательностей

Обработка последовательностей

Слайд 61

Слайд 62

int main() { setlocale (0,"Rus"); char N; int x,k,i; k=0; do

int main()
{ setlocale (0,"Rus");
char N; int x,k,i;
k=0;
do
{

cout<<"Введите элемент последовательности: ";
cin>>x;
if(x%7==0) k++;
cout<<"Будете еще вводить?(Y/N):";
cin>>N;
}while(N=='Y');
printf("K=%i\n",k);
return 0;
}
Слайд 63

Оператор выбора При большем числе вложений условий рекомендуется использовать оператор выбора

Оператор выбора
При большем числе вложений условий рекомендуется использовать оператор выбора switch-case.
switch

<выражение>
{
сase константа выбора 1: оператор 1; break;
…………………………………………………
сase константа выбора n: оператор n; break;
default: оператор n+1;
}
Слайд 64

Константы выбора - возможные значения селектора. default – осуществляет обработку непредусмотренного

Константы выбора - возможные значения селектора.
default – осуществляет обработку непредусмотренного значения

выражения. Наличие этой метки в операторе switch необязательно.
Работа оператора
По вычисленному значению выражения выбирается для исполнения case-оператор, содержащий константу выбора, равную значению селектора. После выполнения выбранного case-оператора управление передается на конец оператора case. Следующим в программе выполняется оператор, стоящий за оператором выбора switch.
Слайд 65

МАССИВЫ Массив представляет собой упорядоченное множество однотипных элементов. При обработке массива

МАССИВЫ
Массив представляет собой упорядоченное множество однотипных элементов.
При обработке массива необходимо:
Описать

массив
Инициализировать массив исходными данными
Обработать в соответствии с алгоритмом
Вывести результаты
Слайд 66

1) Описание массива При описании массива необходимо указать: - способ объединения

1) Описание массива
При описании массива необходимо указать:
- способ объединения элементов в

структуру (одномерный, двухмерный и т.д.);
- число элементов;
- тип элементов.
<тип элементов> имя [число элементов];
Слайд 67

Доступ к каждому элементу массива осуществляется с помощью индексов. Индексы задают

Доступ к каждому элементу массива осуществляется с помощью индексов. Индексы задают

порядковый номер элемента, к которому осуществляется доступ. В языке С++ первый элемент массива имеет индекс ноль.
Число индексов определяет структуру массива: если используется один индекс, то такой массив называется одномерным, если два индекса - двухмерным, и т.д.
Слайд 68

Одномерные массивы float A[5]; Компилятор отводит под массив память размером (sizeof(тип)*размер)

Одномерные массивы
float A[5];
Компилятор отводит под массив память размером (sizeof(тип)*размер) байтов.
При

описании массива можно задать начальные значения его элементов:
int dat[4]={5,8,-2,11};
float kom[]={3.5,6,-1.1};
Слайд 69

2) Инициализация массива это задание начальных значений. Инициализировать массив можно: -

2) Инициализация массива
это задание начальных значений.
Инициализировать массив можно:
- При описании:int dat[4]={5,8,-2,11};
вводом:

(для этого организуется цикл ввода по индексу)
float A[5];
printf("Введите массив А\n");
for( i = 0; i<=4; i++)
scanf("%f",&A[i]);
Слайд 70

Обработка одномерных массивов При решении задач обработки массивов используют типовые алгоритмы.

Обработка одномерных массивов
При решении задач обработки массивов используют типовые алгоритмы.
Просмотр массива

осуществляется в цикле.
Задача 1.
Дан целочисленный массив: В = {bi};i= . Определить количество элементов массива, которые делятся на 3 без остатка.
Слайд 71

Слайд 72

int main() { int В[20] ; /* описание массива B*/ int

int main()
{ int В[20] ; /* описание массива B*/
int

i, L;
printf("Введите массив В\n");
for( i=0; i<20; i++)
scanf("%d", &В[i]); // ввод данных
L=0;
for( i =0; i<20; i++)
if (В[i] % 3== 0) //проверка на кратность 3
L++;
printf("Кол-во=%d\n", L);
return 0; }
Слайд 73

Дано целое число п и массив вещественных чисел: . Вычислить среднее

Дано целое число п и массив вещественных чисел:
.
Вычислить среднее

арифметическое и среднее геометрическое чисел массива, используя формулы:
; .
Слайд 74

Слайд 75

#include "stdafx.h" #include int main() { float X [100]; //описание массива

#include "stdafx.h"
#include
int main()
{
float X [100]; //описание массива Х

float z;
int n;
int i;
float S=0, P=1; //начальные значения S и P
printf("Введите размер массива n= ");
scanf("%d",&n);
printf("Введите массив X\n");
for( i = 0; i scanf("%f",&X[i]);
Слайд 76

for( i=0; i { S = S + X[i]; // вычисление

for( i=0; i {
S = S +

X[i]; // вычисление суммы элементов
P =P*X[i]; // вычисление произведения
}
S = S/n; /* вычисление среднего значения Х */
z=1.0/n;
P=pow(P,z); /* вычисление среднего
геометрического Х */
printf("S=%6.2f\n", S);
printf("P=%10.6f\n",P);
return 0;
}
Страницы пособия 81-88
Слайд 77

Указатели и массивы Указатель - это переменная, содержащая адрес области памяти.

Указатели и массивы
Указатель - это переменная, содержащая адрес области памяти.
Присваивая указателю

то или иное допустимое значение, можно обеспечить доступ к данным через этот указатель.
Формат описания:
Тип *имя;
Например:
int *x;
char *y;

x – это указатель на ячейку, в которой хранится целое значение, а y – указатель на однобайтовую ячейку, предназначенную для хранения символа.

Слайд 78

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

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

адресу * и определение адреса &.
Операция обращения по адресу предназначена для записи или считывания значения, размещенного по адресу, содержащемуся в переменной-указателе.
Например:
int *x;
. . .
*x=5;
Слайд 79

Операция определения адреса & возвращает адрес памяти своего операнда. Операндом должна

Операция определения адреса & возвращает адрес памяти своего операнда. Операндом должна

быть переменная.
Например:
int *x;
int a=5;
x=&a;
Над указателями можно выполнять арифметические операции сложения и вычитания.
Если х – указатель на целое, то операция х++; увеличивает значение адреса, хранящегося в переменной-указателе на число равное размеру ячейки целого типа, т.е. на 4 байта; теперь оно является адресом следующей ячейки целого типа.
Слайд 80

Инициализация указателей Указатели обычно используют при работе с динамической памятью. В

Инициализация указателей
Указатели обычно используют при работе с динамической памятью.
В С++ используется

2 способа работы с динамической памятью:
Использование функция malloc() и free();
Использование операций new и delete.
При определении указателя надо выполнить его инициализацию.
Слайд 81

Существует 4 способа правильного задания начального значения для указателя: Присваивание указателю

Существует 4 способа правильного задания начального значения для указателя:
Присваивание указателю адреса

существующего объекта:
int a=5;
int *p=&a;
2) Присваивание указателю адреса области в явном виде:
char *p=(char*)0xB8000000;
3) Присваивание указателю безопасного нулевого адреса.
int *x=0;
int *y=NULL;
Слайд 82

4) Выделение участка динамической памяти и присваивание ее адреса указателю: c

4) Выделение участка динамической памяти и присваивание ее адреса указателю:

c помощью операции new:
int *x=new int;
c помощью функция malloc() :
int *x=(int*)malloc(sizeof(int));

#include
  int main()
{ int *x, *w;
int y;
x=(int*)malloc(sizeof(int));
*x=16;
y=-15;
w=&y; …

Слайд 83

Указатели могут обеспечить простой способ ссылок на массив. Имя массива является

Указатели могут обеспечить простой способ ссылок на массив.
Имя массива является

указателем, ссылающимся на адрес первого элемента массива.
Например:
int Ar[6];
printf ("адрес Ar=%x\n",Ar);
printf ("адрес Ar=%x\n",&Ar[0]);
 В приведенном фрагменте обе функции printf выводят адрес массива Ar, т.к. выражения Ar и &Ar[0] эквивалентны.
Слайд 84

Используя указатели, можно организовать работу с динамическими массивами. int main( )

Используя указатели, можно организовать работу с динамическими массивами.
int main( )
{ int

n;
cout << "vvedi razmer massiva:";
cin >> n;
int *M=new int[n];
for(int i=0;i { M[i]=rand()/1000;
cout<< *(M+i)<<" ";
}
. . .
}
Слайд 85

Двухмерные массивы Двухмерные массивы в математике представляются матрицей: или сокращенно можно

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

= , где т – число строк; n - число столбцов; i,j - индексы (номера) строки и столбца, на пересечении которых находится элемент aij.
Слайд 86

Описание двухмерного массива Описание матрицы задается структурным типом вида: [m][ n]

Описание двухмерного массива
Описание матрицы задается структурным типом вида:
<тип элементов><имя> [m][

n] ;
где m – количество строк;
n –количество столбцов матрицы.
Например:
float A [3][5];
Обращение к отдельным элементам матрицы осуществляется по имени переменной с двумя индексами, причем индексы, как и для одномерного массива начинаются с нуля.
Слайд 87

Например: А[i][j] А[2][3] А[2*n][k+1] При инициализации многомерного массива он представляется как

Например:
А[i][j] А[2][3] А[2*n][k+1]
При инициализации многомерного массива он представляется как массив из

массивов.
При этом левую размерность можно не указывать:
int matr2[][2]={{1,1},{0,2},{1,0}};
А можно значения задавать общим списком
int matr1[3][2]={ 1, 1, 0, 2, 1, 0};
Слайд 88

Ввод-вывод двухмерного массива Для поэлементного ввода и вывода матрицы используется двойной

Ввод-вывод двухмерного массива
Для поэлементного ввода и вывода матрицы используется двойной цикл

for....
int main()
{ int М[2][3] ;
int i, j;
printf("Введите матрицу М\n");
for( i = 0; i<2; i++)
for( j = 0; j< 3; j++)
scanf("%i",&M[i][ j]);
Слайд 89

Пример организовать вывод матрицы М на экран. for ( i =

Пример организовать вывод матрицы М на экран.
for ( i =

0; i<2; i++)
{
for ( j = 0; j< 3; j++)
printf("%4d",m[i][j]);
printf("\n");
}
Вид матрицы на экране будет следующим:
1 2 3
4 5 6

cout<cout<<"\n";

Слайд 90

Обработка матриц Базовыми алгоритмами обработки матриц являются те же алгоритмы, которые

Обработка матриц
Базовыми алгоритмами обработки матриц являются те же алгоритмы, которые используются

при обработке одномерных массивов.
Для просмотра всех элементов матрицы организуются два цикла: по строкам и по столбцам.
Пример 1:
Дана матрица вещественных чисел А = {аij}4х6. Вычислить значение Z = Р1/|Р2|, где Р1 и Р2 – произведения положительных и отрицательных элементов матрицы соответственно.
Слайд 91

1 1

1

1

Слайд 92

void main() { float A [4][6] ; int i; int j;

void main()
{ float A [4][6] ; int i;

int j;
float P1; float P2; float Z;
printf("Введите матрицу А\n");
for ( i =0; i<4; i++)
for ( j = 0;j<6; j++)
scanf("%f",&A[i][j]);
P1=1; P2=1; // установка начальных значений
for ( i = 0; i<4; i++)
for ( j =0; j<6 ;j++)
{ if (A[i][j]>0) P1= P1*A[i][j]; // произведение +
if ( A[i][j]<0) P2 = P2*A[i][j];// произведение -
} Z=P1/abs(P2);
printf("Z=%10.2f \n",Z);
}
Слайд 93

Пример 2: Дана матрица вещественных чисел С = {сij}8х4. Вычислить среднее

Пример 2:
Дана матрица вещественных чисел С = {сij}8х4. Вычислить среднее арифметическое

каждого столбца. Результат оформить в виде одномерного массива S = {sj};j = .
void main()
{ float C[8][4];
float S[4];
int i, j;
printf("Введите матрицу С:\n");
for(i=0; i<8; i++)
for (j= 0; j<4; j++)
scanf("%f",&C[i][j]);
Слайд 94

for (j= 0; j { S[j]=0; //начальная установка элемента массива S

for (j= 0; j<4; j++)
{
S[j]=0; //начальная установка

элемента массива S
for(i=0; i<8; i++)
S[j]= S[j] + C[i][j]; //накопление суммы j-го столбца
S[j]=S[j]/8; //вычисление среднего значения j столбца
}
for (j= 0; j<4; j++)
printf("%8.2f",S[j]); // вывод всех сумм
printf("\n");
}
Слайд 95

При обработке матрицы часто возникает необходимость просмотра не всей матрицы, а

При обработке матрицы часто возникает необходимость просмотра не всей матрицы, а

ее фрагмента.
Эта задача решается путем управления индексами в циклах.
 М:
int M[3][4];
for(i=1;i<3;i++)
for(j=1;j<3;j++)
<обработка фрагмента>
Слайд 96

Работа с треугольными фрагментами: i=0 j=0 i=1 j=0,1 i=2 j=0,2 int

Работа с треугольными фрагментами:

i=0 j=0
i=1 j=0,1
i=2 j=0,2

int M[3][3];
. . .
for(i=0;i<3;i++)
for(j=0;j<=i;j++)
<обработка

фрагмента>
Слайд 97

С помощью указателей можно создать динамический многомерный массив. Например: int nstr,

С помощью указателей можно создать динамический многомерный массив.
Например:
int nstr, nstb;
cout <<

«Введите кол-во строк и столбцов:";
cin>> nstr>>nstb;
int **a=new int *[nstr];
for(int i=0;i a[i]=new int [nstb];
Слайд 98

В операторе 1 объявляется переменная типа «указатель на указатель на int»

В операторе 1 объявляется переменная типа «указатель на указатель на int»

и выделяется память под массив указателей на строки матрицы (nstr). В операторе 2 организуется цикл для выделения памяти под каждую строку матрицы. В операторе 3 каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из nstb элементов типа int.
Слайд 99

Пример 1: Дана целочисленная матрица А = {аij}4х4. Упорядочить главную диагональ

Пример 1:
Дана целочисленная матрица А = {аij}4х4.
Упорядочить главную диагональ матрицы.
Решение:
Элементы главной

диагонали имеют одинаковые индексы: A[0][0],A[1][1], A[2][2]…A[i][i] .
Для упорядочивания элементов можно использовать любой типовой метод сортировки (например, метод пузырька).
Просматривается массив с конца и сравнивается каждый j-й элемент с j-1. Если j-й элемент меньше j-1, то элементы меняются местами.
Действия повторяются n-1 раз.
Слайд 100

Слайд 101

//ввод матрицы for(i=1;i { for(j=n-1;j>=i;j--) if(A[j][j] { x=A[j][j]; A[j][j]=A[j-1][j-1]; A[j-1][j-1]=x; } } //вывод матрицы

//ввод матрицы
for(i=1;i { for(j=n-1;j>=i;j--)
if(A[j][j] {
x=A[j][j];
A[j][j]=A[j-1][j-1];
A[j-1][j-1]=x;
}
}
//вывод

матрицы
Слайд 102

Текстовые данные В языке С++ текстовая информация представляется двумя типами данных:

Текстовые данные
В языке С++ текстовая информация представляется двумя типами данных: с

помощью символов и строк - массивов символов.
Символьная переменная объявляется с помощью ключевого слова char, например:
char cr; char x= ‘!’ ;
Для ввода используются функции:cin-поточный ввод, scanf() – форматированный ввод, getchar() или getch() – специальные функции для ввода символа.
char a,b,c;
printf("Введите исходные данные");
scanf("%c%c%c",&a,&b,&c);


printf("Введите исходные данные");
cin>>a>>b>>c;

Слайд 103

СТРОКИ Строка представляет собой массив символов, заканчивающийся нуль-символом.(\0) По положению нуль-символа

СТРОКИ
Строка представляет собой массив символов, заканчивающийся нуль-символом.(\0)
По положению нуль-символа определяется фактическая

длина строки.
сhar st[30];
В квадратных скобках указывается максимальное число символов в строке st.
Начальное значение строки можно задать при ее объявлении следующим образом:
char s[10] = "Язык Си";
Слайд 104

При вводе строк обычно используются функции cin и scanf(). char fam[20];

При вводе строк обычно используются функции cin и scanf().
char

fam[20];
printf ("Введите фамилию студента");
scanf("%s", fam);
или
cin>>fam;
Для ввода текста содержащего пробелы следует использовать специальную функцию gets().
printf(“Введите фамилию студента”);
gets(fam);
Слайд 105

Вывод строк осуществляется с помощью функции printf(), cout и специальной функции

Вывод строк осуществляется с помощью функции printf(), cout и специальной функции

puts().
printf(“ %20s”,fam);
cout<< fam;
puts(fam);
Обработка строковых данных
К любому символу строки можно обратиться как к элементу одномерного массива, например, запись st[i] определяет i-ый символ в строке st.
Для просмотра строк необходимо организовать цикл по порядковым номерам символов.
Слайд 106

Например: Дано предложение. Определите количество слов в нем. int main() {

Например: Дано предложение. Определите количество слов в нем.
int main()
{ char slova[120];

int i, n, k=1;
printf("Введите предложение\n");
gets(slova);
n= strlen(slova);//функция strlen() возвращает длину строки
for(i=0;i if(slova[i]==' ')k++; //поиск и подсчет пробела
printf("k=%d\n",k);
return 0;
}
Слайд 107

Стандартные функции обработки строк Определение длины строки: strlen(str) Сравнение строк: strcmp(str1,str2)

Стандартные функции обработки строк
Определение длины строки: strlen(str)
Сравнение строк: strcmp(str1,str2) –

сравнивает строки и возвращает 0, если они одинаковы; результат отрицателен, если str1str2.
Сцепление строк: strcat(str1,str2)-склеивает строки в порядке их перечисления.
Копирование строк: strcpy(str1,str2) – копирует строку str2 в строку str1.
Поиск адреса символа в строке: strchr(st, ch) -результатом выполнения поиска является адрес найденного символа в строке st, иначе возвращается нулевой адрес.
Слайд 108

Пример. В заданной фамилии определить порядковый номер символа ‘n’. #include "stdafx.h"

Пример. В заданной фамилии определить порядковый
номер символа ‘n’.
#include "stdafx.h"
#include
int main()
{

char fam[] = "Ivanov";
char faml[20];
char a='n'; char *p=0;
p=strchr(fam,a);
if(p)
printf("|%s|%d\n", fam, p-fam);
else
printf("нет такого символа в фамилии!\n");
return 0;}
Слайд 109

Пример2. Исходным текстом является предложение, заканчивающееся точкой. Слова в предложении отделяются

Пример2.
Исходным текстом является предложение, заканчивающееся точкой. Слова в предложении отделяются друг

от друга одним пробелом. Определить самое длинное слово в предложении.
Слайд 110

int main() { char slovo[12],x[120]; int i,m=0,n,k=0; gets(x); // ввод строки

int main()
{ char slovo[12],x[120]; int i,m=0,n,k=0;
gets(x); // ввод строки х
for(i=0; i

i++) //цикл до конца строки х
if(x[i]!=' ') k++; // считаем символы до пробела
else
{ if (k>m){ m=k;n=i;}//поиск мах значения счетчика к
k=0; }
k=0;
for(i=n-m;i slovo[k++]=x[i];
slovo[k]=0;
 printf("%s \n%s\n",slovo,x); //вывод слова и всей строки
return 0; }
Слайд 111

Структуры данных Очень часто при обработке информации приходится работать с блоками


Структуры данных
Очень часто при обработке информации приходится работать с блоками данных,

в которых присутствуют разные типы данных.
Структура - это тип данных, который может включать в себя несколько полей – элементов разных типов.
В общем случае при работе со структурами следует выделить четыре момента:
- объявление и определение типа структуры,
- объявление структурной переменной,
- инициализация структурной переменной,
- использование структурной переменной.
Слайд 112

Структура состоит из фиксированного числа элементов, называемых полями. Например, структурой можно

Структура состоит из фиксированного числа элементов, называемых полями. Например, структурой можно

считать строку экзаменационной ведомости:
Андреева С.В. 4 5 5
Данная структура состоит из четырех полей: одно поле - строка (ФИО студента) и три числовых поля (оценки студента по предметам).
Слайд 113

Описание типа структуры делается так: struct Имя { ; ; …………

Описание типа структуры делается так:
struct Имя
{ <тип> <имя 1-го поля>;
<тип>

<имя 2-го поля>;
…………
<тип> <имя последнего поля>;
};
Например, задание типа записи строки экзаменационной ведомости выглядит так:
struct student
{ char fam[20];
int mathematics, informatics, history;
};
Слайд 114

Тогда при описании переменных можно использовать этот тип: struct student X;

Тогда при описании переменных можно использовать этот тип:
struct student X;


Здесь X - переменная типа структура;
struct student - тип;
fam, mathematics, informatics, history - поля структуры.
Чтобы упростить обращение к структурному типу, можно воспользоваться директивой #define.
Слайд 115

Например, для предыдущей структуры: #define stud struct student stud { char

Например, для предыдущей структуры:
#define stud struct student
stud
{
char fam[20];

int mathematics, informatics, history;
}; 
Теперь идентификатор stud заменит в любом месте программы громоздкий тип struct student.
Теперь описании переменной типа структура будет выглядеть так:
stud X;
Слайд 116

В более поздних версиях языка С ключевое слово typedef позволяет создать

В более поздних версиях языка С ключевое слово typedef позволяет создать

синоним типа, который удобно использовать для объявления переменных структурного типа. Например:
typedef struct student
{
char fam[20];
int mathematics, informatics, history;
} STUD;
Идентификатор STUD представляет собой синоним типа struct student. С помощью синонима STUD можно объявить переменную:
STUD X;
Слайд 117

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

Для обращения к отдельным полям переменной типа структура используется составное имя:
<имя

переменной>.<имя поля>
Например, для переменной X обращения к полям записываются следующим образом:
X.fam, X. mathematics, X. informatics, X. history.
Структурную переменную можно инициализировать явно при объявлении:
STUD X={"Андреева С.В.", 4, 5, 5};
Слайд 118

Над структурами возможны следующие операции: присваивание значений структурной переменной; ввод и

Над структурами возможны следующие операции:
присваивание значений структурной переменной;
ввод и вывод значений

переменных структурного типа;
- сравнение полей переменных структурного типа.
Операция присваивания применима, как к отдельным полям переменной структурного типа, так и к переменным в целом.
Слайд 119

#include "stdafx.h" #include typedef struct student // описание структуры { char

#include "stdafx.h"
#include
typedef struct student // описание структуры
{ char fam[20];


int mathematics, informatics, history;
} STUD;
int main()
{ STUD X; //описание переменной
strcpy(X.fam, "Андреева С.В. ");
X. mathematics=4; X. informatics=5;
X. history=5;
printf("\n %s %d %d %d", X.fam, X.mathematics, X.informatics,X.history);/*вывод информации
. . .
}
Слайд 120

Для структурного типа возможно присваивание значений одной структурной переменной другой структурной

Для структурного типа возможно присваивание значений одной структурной переменной другой структурной

переменной, при этом обе переменные должны иметь один и тот же тип.
STUD X, Y;
. . .
Y=X; // копирование информации из Х в Y
. . .
Работа со структурной переменной обычно сводится к работе с отдельными полями структуры. Такие операции, как ввод с клавиатуры, сравнение полей и вывод на экран применимы только к отдельным полям.
Слайд 121

Пример задачи с использованием структурированных данных Рассмотрим пример программы, в которой

Пример задачи с использованием структурированных данных
Рассмотрим пример программы, в которой

вводится информация об абонентах сети: ФИО, телефон и возраст. В программе выбираются абоненты моложе 25 лет и их список выводится в алфавитном порядке.
 #include "stdafx.h"
#include
#include
typedef struct abon //описание структуры
{ char f[10],i[10],o[10];
long tel;
int voz;
}ABON;
Слайд 122

const int n=5; int i,k,j; int main() { ABON z[n],y[n]; //описание

const int n=5;
int i,k,j;
int main()
{ ABON z[n],y[n]; //описание массивов

структур
ABON х;
for (i=0; i{printf("Введите ФИО абонента:");
scanf("%s%s%s",z[i].f, z[i].i, z[i].o);
printf("введите его телефон и возраст:");
scanf("%ld%d",&z[i].tel,&z[i].voz);
}
printf("---------------------------------------------------\n");
Слайд 123

printf("| Фамилия | Имя | Отчество| Телефон | Возраст |\n”); printf("---------------------------------------------------------------\n");

printf("| Фамилия | Имя | Отчество| Телефон | Возраст |\n”);
printf("---------------------------------------------------------------\n");
for (i=0;i

//вывод в цикле информации
printf("|%9s|%8s|%9s|%7ld | %5d |\n", z[i].f,z[i].i,z[i].o, z[i].tel,z[i].voz);
printf("----------------------------------------------------------\n");
for (i=0;i {if(z[i].voz<25) // поиск абонента моложе 25 лет
y[k++]=z[i]; }
for(i=1;i for(j=k-1;j>=i;j--)
if(y[j].f[0] {x=y[j];
y[j]=y[j-1];
y[j-1]=x;}

if(strcmp(y[j],y[j-1])<0)

Слайд 124

printf("mologe 25\n"); printf("---------------------------------------------------------\n"); printf("| Фамилия | Имя | Отчество| Телефон |

printf("mologe 25\n");
printf("---------------------------------------------------------\n");
printf("| Фамилия | Имя | Отчество| Телефон | Возраст |\n");
printf("---------------------------------------------------------\n");
for

(i=0;i {printf("|%9s|%8s|%9s|%7ld | %5d |\n", y[i].f,y[i].i, y[i].o, y[i].tel,y[i].voz);
}
printf("---------------------------------------------------------\n");
return 0;
}
Слайд 125

ФУНКЦИИ Любая программа на языке высокого уровня может быть разбита на

ФУНКЦИИ
Любая программа на языке высокого уровня может быть разбита на ряд

логически завершенных программных единиц - подпрограмм. Такое разделение вызвано двумя причинами.
Экономия памяти.
Структурирование программы
В языке Си существует один вид подпрограмм, который называется функция. Каждая программа имеет главную функцию (main), которая служит точкой входа в программу и может иметь произвольное число функций.
Слайд 126

Ниже схематично приведена структура программы, в которой описана подпрограмма-функция. #include "stdafx.h

Ниже схематично приведена структура программы, в которой описана подпрограмма-функция.
#include "stdafx.h

"
Тип имя_функции(тип параметр1, тип параметр2,...)
{
тело функции
}
………………………………….
main() //начало главной функции
{
Обращение к подпрограмме
……………………..
} //конец главной функции
Слайд 127

Функция – это автономная часть программы, реализующая определенный алгоритм и допускающая

Функция – это автономная часть программы, реализующая определенный алгоритм и допускающая

обращение к ней из различных частей программы.
Общий вид описания функции
Тип Имя(список формальных параметров)
{ Описание локальных переменных;
Операторы тела функции;
return результат;
}
Тип указываемый в заголовке функции определяет тип результата ее работы, который будет возвращаться в точку вызова.
Слайд 128

Для возврата значения в теле функции должен быть оператор return. В

Для возврата значения в теле функции должен быть оператор return. В

дальнейшем будем называть такую функцию типизированной.
Если функция не должна возвращать результат, то она считается нетипизированной, что задается ключевым словом void, стоящим на месте типа. В этом случае оператор return в функции не требуется.
void Имя(список формальных параметров)
{
Описание локальных переменных;
Операторы тела функции;
}
Слайд 129

Список формальных параметров обеспечивает передачу исходных данных в функцию. Параметры, указанные

Список формальных параметров обеспечивает передачу исходных данных в функцию.
Параметры, указанные

в заголовке функции, называются формальными, а параметры, указываемые при ее вызове – фактическими.
Рассмотрим пример функции для вычисления максимального значения из двух заданных.
int max(int a, int b)
{ int c;
if (a>b) c=a;
else c=b;
return c;
}
Слайд 130

Обращение к типизированной функции не является специальным оператором, а включается в

Обращение к типизированной функции не является специальным оператором, а включается в

состав выражения. Результат выполнения функции возвращается в точку вызова через имя функции.
Приведем пример вызова приведенной выше функции:
void main()
{ int x,y,z;
printf("Введите x и y:");
scanf("%d%d",&x,&y);
z=max(x,y);
printf("max=%d\n",z); }
Слайд 131

При каждом вызове функции происходит замена формальных параметров (int a, int

При каждом вызове функции происходит замена формальных параметров (int a, int

b) на фактические (x,y). Вычисленный результат возвращается в выражение. Далее вычисляется значение z и выводится на экран.
Формальные и фактические параметры должны быть согласованы друг с другом по количеству, типу и порядку следования.
Для того чтобы функция могла быть вызвана, необходимо, чтобы до ее вызова о ней было известно компилятору.
Слайд 132

Это значит, что либо мы текст функции должны поместить до main(),

Это значит, что либо мы текст функции должны поместить до main(),

либо перед main() записывается прототип функции. Прототип функции по форме аналогичен заголовку функции, в конце которого ставится ";".
#include "stdafx.h"
int max(int , int ) ; //прототип функции
void main()
{. . .
z=max(x,y);
. . . }
int max(int a, int b) // заголовок функции
{ int c;
if (a>b) c=a; else c=b;
return c;}
Слайд 133

Механизм передачи параметров В языке С++ существует два механизма передачи параметров

Механизм передачи параметров
В языке С++ существует два механизма передачи параметров в

функции: по значению и по адресу.
Параметры, передаваемые по значению, играют роль входных параметров. Для них в памяти компьютера выделяются ячейки, в которые передаются копии значений параметров. При выполнении функции значения формальных параметров могут измениться, однако соответствующие им фактические параметры останутся без изменения.
При передаче параметров по адресу все действия в процедуре выполняются непосредственно над фактическим параметром, а не его копией.
Слайд 134

Слайд 135

Массивы, так же как и простые переменные, можно передавать в функции

Массивы, так же как и простые переменные, можно передавать в функции

в качестве параметров. Так как имя массива – это адрес, то передача массива происходит всегда по адресу.
Обратим внимание, что в заголовке функции размер массива рекомендуется указать отдельно. Тогда функцию можно использовать для работы с массивом разной длины. Нельзя объявлять массив-параметр как A[N], а только как A[] или *A.
Слайд 136

Перегрузка функций в С++ Цель перегрузки состоит в том, чтобы функция

Перегрузка функций в С++
Цель перегрузки состоит в том, чтобы функция с

одним именем по разному выполнялась и возвращала разные значения при обращении к ней с различными типами и различным числом фактических параметров.
Для обеспечения перегрузки функций необходимо для каждого имени функции определить сколько различных функций с ним связано.
Приведем пример перегруженной функции для поиска максимума (для 4 разных типов данных)
Слайд 137

int max_element ( int n, int a[ ]) // находит максимальный

int max_element ( int n, int a[ ])
// находит максимальный элемент

для массива типа int
{ int max=a[0];
for ( i=1; iif (a[i]>max) max=a[i];
return max;
}
long max_element ( int n, long a[ ])
// находит максимальный элемент для массива типа long
{ long max=a[0];
for ( i=1; iif (a[i]>max) max=a[i];
return max;
}
Слайд 138

double max_element ( int n, double a[ ]) //находит максимальный элемент

double max_element ( int n, double a[ ])
//находит максимальный элемент массива

типа double
{ double max=a[0];
for ( i=1; iif (a[i]>max) max=a[i];
return max;
}
float max_element ( int n, float a[ ])
// находит максимальный элемент массива типа float
{ float max=a[0];
for ( i=1; iif (a[i]>max) max=a[i];
return max;
}
Слайд 139

void main ( ) { int x[]={10, 20, 30, 40, 50,

void main ( )
{
int x[]={10, 20, 30, 40, 50, 60};
long y[]={12L,

44L, 22L, 37L,30L};
. . . . . .
int m1=max_element(6, x );
long m2=max_element(5, y);
. . . . .
}
Слайд 140

Если в функцию передаётся двумерный массив, то описание соответствующего аргумента функции

Если в функцию передаётся двумерный массив, то описание соответствующего аргумента функции

должно содержать количество столбцов; количество строк - несущественно, поскольку фактически передаётся указатель. Например: int Х[ ][5], или Х[5][5].
#define k 4
void vivod(int n, int m, int A[][k])
{for (int i=0;i {
for(int j=0;j printf("%6d",A[i][j]);
printf("\n");
}
}
Слайд 141

Если при передаче многомерных массивов все размерности неизвестны, то можно передавать

Если при передаче многомерных массивов все размерности неизвестны, то можно передавать

адрес первого элемента, а внутри функции интерпретировать массив как одномерный, а индексы пересчитывать в программе.
void vivod(int n, int m, int *A)
{for (int i=0;i {
for(int j=0;j printf("%6d",A[i*m+j]);
printf("\n");
}
}
Слайд 142

int main() {int X[4][4]={1,-2,3,-4, 5,6,7,8,9, 0,12,13,15,21,15,22}; int Y[3][3]={1,2,3,4,5,6,7,8,9}; vivod(4,4,&X[0][0]); printf("\n"); vivod(3,3,&Y[0][0]); return 0; }

int main()
{int X[4][4]={1,-2,3,-4, 5,6,7,8,9,
0,12,13,15,21,15,22};
int Y[3][3]={1,2,3,4,5,6,7,8,9};
vivod(4,4,&X[0][0]);
printf("\n");
vivod(3,3,&Y[0][0]);
return 0;
}

Слайд 143

Функции с переменным числом параметров В Си допустимы функции, у которых

Функции с переменным числом параметров
В Си допустимы функции, у которых при

компиляции не фиксируется число параметров.
Каждая функция с переменным числом параметров должна иметь хотя бы один обязательный параметр.
<тип> <имя_функции>(явные параметры, . . . )
Как правило количество параметров определяется значением обязательного параметра.
Для доступа к списку параметров используется указатель *p типа int. Он устанавливается на начало списка параметров в памяти.
Слайд 144

int sum (int k, . . .) { int *p =

int sum (int k, . . .)
{
int *p = &k; //настроили

указатель на параметр k
int s=0;
for ( ; k!=0;k--)
s+=*(++p);
return s;
}
void main( )
{
cout<<”\nСумма(2,4,6)= ”<cout<<”\nСумма(4,1,2,3,4)= ”<}
Слайд 145

Рекурсия В теле функции известны все объекты, описанные во внешнем блоке,

Рекурсия
В теле функции известны все объекты, описанные во внешнем блоке, т.е.

все глобальные переменные и имя самой функции.
#include
const int n=5; int x;//описание глобальных объектов
int sum (int k, . . .)
{int p; // описание локальных объектов
. . .
return s;}
void main( )
{int a; // описание локальных объектов
. . .
}
Слайд 146

Таким образом, внутри любой функции можно вызывать любую доступную функцию, в

Таким образом, внутри любой функции можно вызывать любую доступную функцию, в

том числе и саму себя. Ситуация, когда функция вызывает саму себя, называется рекурсия.
Рекурсия возможна благодаря тому, что при вызове функции создаются новые экземпляры локальных переменных, которые сохраняются во внутреннем стеке машины.
Стек функционирует по принципу LIFO - Last In – First Out (последний вошел – первый вышел). Переменные помещаются в стек одна за другой и выбираются из стека в обратном порядке.
Слайд 147

Обязательным элементом всякого рекурсивного процесса является утверждение, определяющее условие завершения рекурсии.

Обязательным элементом всякого рекурсивного процесса является утверждение, определяющее условие завершения рекурсии.

Оно называется опорным условием рекурсии.
Если опорное условие выполняется, то может быть задано некоторое фиксированное значение, заведомо достижимое в ходе вычисления. Это позволит организовать своевременную остановку рекурсивного процесса.
Рассмотрим пример вычисления факториала 5.
5!=1х2х3х4х5, где 1х2х3х4- это 4!
Т.е 5!=(4!)х5
Слайд 148

Факториал нуля равен 1. Отсюда формула вычисления N-факториала: Реализуем выч-е факториала

Факториал нуля равен 1. Отсюда формула вычисления N-факториала:
Реализуем выч-е факториала в

виде функции:
#include "stdafx.h"
float fact(int n)
{ if (n==0)
return 1;
else
return (fact(n-1)*n);
}
Слайд 149

int main() { printf("факториал 5=%f\n",fact(5)); return 0; } ОЗУ Статическая область СТЕК КУЧА

int main()
{
printf("факториал 5=%f\n",fact(5));
return 0; }
ОЗУ

Статическая область

СТЕК

КУЧА

Слайд 150

float fact(int n) { if (n==0) return 1; еlse return (fact(n-1)*n);

float fact(int n)
{ if (n==0)
return 1;
еlse
return (fact(n-1)*n);
}

5

Стек

n=

5

fact(4)*5

n=

fact(3)*4

n=

fact(2)*3

n=

fact(1)*2

n=

fact(0)*1

1

Слайд 151

Пример: Вычислить кол-во нулей в массиве А[10] # include “stdafx.h” const

Пример: Вычислить кол-во нулей в массиве А[10]
# include “stdafx.h”
const int n=10;
Int

kol(int i,int *A)
{ if (i==n) return 0;
else {
if(A[i]==0) return kol(i+1,A)+1;
else return kol(i+1,A);
}
}
int main()
{ int y[]={1,0,2,5,4,0,1,3,0,4,3};
int x=kol(0,y);