Подпрограммы. Определение функции, фактические и формальные параметры функции

Содержание

Слайд 2

Определение функции, фактические и формальные параметры функции Функция - это совокупность

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

Функция - это совокупность объявлений

и операторов, предназначенная для решения определенной задачи. Любая программа на С++ состоит из функций, одна из которых должна иметь имя main (с нее начинается выполнение программы).
Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена. Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова.
Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения и список передаваемых параметров.
Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках:
[ класс ] тип имя ([ список_параметров ])[throw ( исключения )]{ тело функции }
Слайд 3

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

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

С помощью необязательного модификатора класс

можно явно задать область видимости функции, используя ключевые слова extern и static:
extern – глобальная видимость во всех модулях программы (по умолчанию);
static – видимость только в пределах модуля, в котором определена функция.
Тип возвращаемого функцией значения может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значение, указывается тип void.
Список параметров определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).
Слайд 4

Список формальных параметров - это последовательность объявлений формальных параметров, разделенная запятыми.

Список формальных параметров - это последовательность объявлений формальных параметров, разделенная запятыми.

Формальные параметры - это переменные, используемые внутри тела функции и получающие значение при вызове функции путем копирования в них значений соответствующих фактических параметров.
Если функция не использует параметров, то наличие круглых скобок обязательно, а вместо списка параметров рекомендуется указать слово void.
В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать.
На имена параметров ограничений по соответствию не накладывается.
Параметры функции передаются по значению и могут рассматриваться как локальные переменные, для которых выделяется память при вызове функции и производится инициализация значениями фактических параметров. При выходе из функции значения этих переменных теряются. Поскольку передача параметров происходит по значению, в теле функции нельзя изменить значения этих переменных в вызывающей функции, являющихся фактическими параметрами. Однако, если в качестве параметра передать указатель на некоторую переменную, то используя операцию разадресации можно изменить значение этой переменной.
Тип возвращаемого значения и типы параметров совместно определяют тип функции.
Для вызова функции в простейшем случае нужно указать ее имя, за которым в круглых скобках через запятую перечисляются имена передаваемых аргументов.
Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция. Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Слайд 5

Найти сумму 5-ти факториалов #include using namespace std; int fact(int);//обяъвление ф-ции

Найти сумму 5-ти факториалов

#include
using namespace std;
int fact(int);//обяъвление ф-ции
int main()
{
int s

= 0, n,x;
for (int i = 1; i <= 5; i++)
{cout << "Input chislo: ";
cin >> n;
x = fact(n);
cout << "factorial " << n <<"="<s += x;
}
cout << "Summa factorialov= " << s << endl;
system("pause");
return 0;
}
//функция
int fact(int n)
{
int i, p = 1;
for (i = 1; i <= n; i++) p *= i;
return p;
}

Обращение к функции

Слайд 6

Найти число сочетаний из n по k #include using namespace std;

Найти число сочетаний из n по k

#include
using namespace std;
int

fact (int);
int main ()
{
int n,k;
cout<<"vvod n i k ";
cin>>n>>k;
cout< system("pause");
return 0;
}
//подпрограмма
int fact (int n)
{
int i,p=1;
for (i=1;i<=n;i++) p*=i;
return p;
}
Слайд 7

Статические одномерные массивы Массив – это упорядоченный набор элементов одного типа.

Статические одномерные массивы

Массив – это упорядоченный набор элементов одного типа.
Для того

чтобы объявить массив и проинициализировать его данными элементами, мы должны написать следующую инструкцию С++:
int fibon[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
Здесь fibon – это имя массива.
Элементы массива имеют тип int, размер (длина) массива равна 9. Значение первого элемента – 0, последнего – 21.
Для работы с массивом мы индексируем (нумеруем) его элементы, а доступ к ним осуществляется с помощью операции взятия индекса.
Слайд 8

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

Статические одномерные массивы

Для обращения к первому элементу массива естественно написать:
int first_elem

= fibon[1];
Однако это не совсем правильно: в С/С++ индексация массивов начинается с 0, поэтому элемент с индексом 1 на самом деле является вторым элементом массива, а индекс первого равен 0.
Чтобы обратиться к последнему элементу массива, мы должны вычесть единицу из размера массива:
fibon[0]; // первый элемент
fibon[1]; // второй элемент
...
fibon[8]; // последний элемент
fibon[9]; // ... ошибка
Девять элементов массива fibon имеют индексы от 0 до 8.
Слайд 9

Инициализируем массив из десяти элементов числами от 0 до 9 и

Инициализируем массив из десяти элементов числами от 0 до 9 и

затем напечатать их в обратном порядке:

#include
using namespace std;
 void main()
{int ia[10];
int index;
 cout << "isxodnyi massiv"<< endl;
for (index=0; index<10; ++index) // ia[0] = 0, ia[1] = 1 и т.д.
{ia[index] = index;
cout << ia[index] << " ";}
 cout <for (index=9; index>=0; --index)
cout << ia[index] << " ";
cout << endl;
system("pause");
}

Слайд 10

Генерация (псевдо)случайных чисел Функция стандартной библиотеки: int rand (void); Она генерирует

Генерация (псевдо)случайных чисел

Функция стандартной библиотеки:
int rand (void);
Она генерирует псевдослучайное целое число

на интервале значений от 0 до RAND_MAX. Последнее является константой, которая варьируется в зависимости от реализации языка, но в большинстве случаев составляет 32767.
Генерация чисел от 0 до 9:
rand() % 10
Если нам нужны числа от 1 (а не от 0) до 9, то можно прибавить 1:
rand() % 9 + 1
Идея такая: генерируем случайное число от 0 до 8, и после прибавления 1 оно превращается в случайное число от 1 до 9.
Слайд 11

Функция rand() генерирует псевдослучайные числа, т.е. числа, которые кажутся случайными, но

Функция rand() генерирует псевдослучайные числа, т.е. числа, которые кажутся случайными, но

на самом деле являются последовательностью значений, вычисленных по хитрому алгоритму, в качестве параметра принимающему так называемое зерно (seed). Т.е. сгенерированные функцией rand() числа будут зависеть от значения, которое имеет зерно в момент ее вызова. А зерно всегда устанавливается компилятором в значение 1. Иными словами, последовательность чисел будет хоть и псевдослучайной, но всегда одинаковой. Исправить ситуацию помогает функция srand().
void srand (unsigned int seed);
Она устанавливает зерно равным значению параметра, с которым была вызвана. И последовательность чисел тоже будет другая.
Слайд 12

Чтобы сделать зерно всегда разным, используем функцию time(). time_t time (time_t*

Чтобы сделать зерно всегда разным, используем функцию time().
time_t time (time_t* timer);
Она

тоже досталась в наследство от языка Си и, будучи вызвана с нулевым указателем в качестве параметра, возвращает количество секунд, прошедших с 1 января 1970 года. Теперь значение этой функции мы можем передать в функцию srand() и будет случайное зерно. И числа будут неповторяющиеся.
Для использования функций rand() и srand() нужно подключить заголовочный файл , а для использования time() – файл .
Слайд 13

Найти минимальный элемент одномерного массива и его порядковый номер #include #include

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

#include
#include
#include
 using namespace

std;
 int main()
{
const int n= 10;
int a[n];
int i, imin;
srand(time(NULL));
for (i = 0; i < n; i++)
{ a[i]=rand()% 10;
cout << a[i] << ' ';
}
for (i = imin = 0; i < n; i++)
if (a[i] < a[imin]) imin = i;
 cout << endl<< " Min = " << a[imin]<< endl;
cout << " \n# Min elementa: " << imin << endl;
 system ("pause");
return 0;
}
Слайд 14

Подсчитать сумму элементов массива … const int n = 10; //

Подсчитать сумму элементов массива


const int n = 10;
// размерность массива задана

целой положительной константой
int marks[n] = {3, 4, 5, 4, 4}; //массив инициализируется при объявлении
int sum = 0;
for (int i = 0; i sum += marks[i];
cout << "Сумма элементов: " << sum;

Слайд 15

Операция определения размера sizeof С помощью операции sizeof можно определить размер

Операция определения размера sizeof

С помощью операции sizeof можно определить размер памяти

(в байтах), которая необходима для хранения элемента с соответствующим идентификатором или определенного типа. Операция sizeof имеет следующий формат:
sizeof ( выражение )
В качестве выражения может быть использован любой идентификатор, либо имя типа, заключенное в скобки. Отметим, что не может быть использовано имя типа void, а идентификатор не может относиться к полю битов или быть именем функции.
Если в качестве выражения указанно имя массива, то результатом является размер всего массива (т.е. произведение числа элементов на длину типа), а не размер указателя, соответствующего идентификатору массива.
Слайд 16

Одномерной массив сместить на k позиций вправо #include using namespace std;

Одномерной массив сместить на k позиций вправо

#include
using namespace std;
int

main()
{
int x[]={0,8,6,3,5,0,1,3,-7};
int n=sizeof(x)/sizeof(x[0]);//определение размера массива
int i, k, buf, r;
cout<<"vvedite k=";
cin>>k;
cout << "isx"<for (i = 0; i < n; i++)
cout << x[i] << ' ';
 for (r = 1; r <= k; r++)
for (i = n-2; i > 0; i--)
{buf= x[i+1]; x[i+1] = x[i]; x[i]=buf;}
cout <for (i = 0; i < n; i++)
cout << x[i] << ' ';
cout <system ("pause");
return 0;
}
Слайд 17

В одномерном массиве сдвинуть элементы на число k, вводимое с клавиатуры,

В одномерном массиве сдвинуть элементы на число k, вводимое с клавиатуры,

влево

#include
using namespace std;
int main()
{
int x[]={1,2,3,5,4,0,1,3,-7};
int n=sizeof(x)/sizeof(x[0]);
int i, k, buf, r;
cout<<"vvedite k=";
cin>>k;
 cout << "isx"<for (i = 0; i < n; i++)
cout << x[i] << ' ';
 for (r=1;r<=k;r++)
for (i = 0; i < n-1; i++)
{buf= x[i+1]; x[i+1] = x[i]; x[i]=buf;}
 cout <for (i = 0; i < n; i++)
cout << x[i] << ' ';
cout <system ("pause");
return 0;
}

Слайд 18

Многомерные массивы задаются указанием каждого измерения в квадратных скобках, например, оператор

Многомерные массивы

задаются указанием каждого измерения в квадратных скобках, например, оператор

int matr [6][8];
задает описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс.
Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j].
Инициализация многомерного массива:
int mass2 [][]={ {1, 1}, {0, 2}, {1, 0} };
int mass2 [3][2]={1, 1, 0, 2, 1, 0};
Слайд 19

Правила Размерность нединамического массива может быть только константой или константным выражением.

Правила

Размерность нединамического массива может быть только константой или константным выражением. Рекомендуется

задавать размерность с помощью именованной константы.
Элементы массивов нумеруются с нуля, поэтому максимальный номер элемента всегда на единицу меньше размерности.
В двумерном массиве первый индекс всегда представляет собой номер строки, второй — номер столбца. Каждый индекс может изменяться от 0 до значения соответствующей размерности, уменьшенной на единицу.
Массив хранится по строкам в непрерывной области памяти.
Автоматический контроль выхода индекса за границы массива не производится, поэтому программист должен следить за этим самостоятельно.
При описании массива можно в фигурных скобках задать начальные значения его элементов.
Слайд 20

В двумерном массиве посчитать кол-во положительных элементов в строках #include #include

В двумерном массиве посчитать кол-во положительных элементов в строках

#include
#include //определены

некоторые манипуляторы потокового ввода/вывода
#include // Для функций rand() и srand()
#include //использование функции time() для усиления случайности "зерна"
using namespace std;
 int main ()
{
const int nstr = 4, nstb = 5;
int b[nstr][nstb],a[nstr];
int i, j,kol;
srand(time(NULL));
for (i = 0; i < nstr; i++)
for (j = 0; j < nstb; j++)
{
b[i][j]=rand()%10-5; }
cout << "isxodn massiv" << endl;
for (i = 0; i{cout<for (j = 0; jcout << setw(3) <}
for (i = 0; i < nstr; i++)
{ kol=0;
for (j = 0; j < nstb; j++)
if (b[i][j] > 0) kol++;
a[i]=kol;}
cout << endl;
 for (i = 0; icout <<"kol-vo="< cin.get();
//system ("pause");
return 0;
}