Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник с,с++.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
68 Кб
Скачать
☆

Урок 10. Рекурсивные функции

Функция может вызывать сама себя. Т. е. внутри функции мы используем ее саму.

Вот классический пример - вычисление факториала (факториал n (обозначается как n!) - это произведение целых чисел от 1 до n. Например, 4!=24 (1*2*3*4)):

//Объявление функции.

int fact(int n)

{

if(n>1)

{

//Вызываем функцию из себя самой.

return n*fact(n-1);

}

else

{

//Факториал 1 равен 1.

return 1;

}

}

void main()

{

//Вызов функции.

cout<<fact(5);

}

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

Указанный фрагменты выведет, естественно, 120 (1*2*3*4*5).

C/C++. Урок 11. Случайные числа

Для получения случайных чисел служит функция rand(). Параметров у нее нет. Она возвращает случайное число от 0 до значения констаны RAND_MAX. Как правило, эта константа равна 32767 (2 в 15-степени минус 1). Функция rand() (как и константа RAND_MAX) описана в файле stdlib.h, так что не забудьте подключить его:

#include <stdlib.h>

Вот пример использования функции rand():

int k;

k=rand();

Обратите внимание, что функция rand() будет постоянно возвращать одну и ту же последовательность случайных чисел. Это очень удобно на этапе отладки программы - если программа выдает ошибку, то эту ошибку легче воспроизвести при одних и тех же случайных числах. Реальная же программа должна, как правило, возвращать разные последовательности случайных чисел. Это делаем через функцию srand, которая принимает целый параметр, определяющий, какая конкретно последовательность случайных чисел у нас будет выдаваться функцией rand. Функцию srand достаточно вызвать только один раз в начале программы. Правда, в srand мы должны в качестве параметра подставить случайное число, но его можно получить, например, из текущего времени. Вот пример:

#include <time.h>

...

srand((unsigned)time(NULL));

cout<<rand()<<"\n";

C/C++. Урок 12. Встраиваемые (inline) функции

При компиляции тело функции не повторяется - т. е. при первом приближении оно имеется только в одном месте программы, и при вызове функции происходит переход на тело функции, которая и выполняется. При этом есть как плюсы, так и минуся. Плюс тот, что размер exe-файла получается не такой большой (функция-то занимает место только один раз), а минус - то, что программа работает несколько медленнее, так как тратится дополнительное время на переход к телу функции.

Встраиваемые (inline) функции как раз и решают эту проблему. Оформляется такая функция как и обычная, только с ключевым словом inline. Но при компиляции тело функции подставляется во все места ее вызова. Минусы и плюсы тут меняются местами по сравнению с обычной функцией: вызов такой функции идет быстрее, а место exe-файл занимает больше. Вот пример:

...

//Встраиваемая функция.

inline int f(int a, int b)

{

return a*b;

}

void main()

{

//Вызов функции.

cout<<f(23, 45)<<"\n";

cout<<f(-23, 77)<<"\n";

}

Надо сказать, что разные компиляторы по-разному работают с inline-функциями. Если компилятор не может сделать функцию встраиваемой, то он делает ее обычной. Например, такое может случится с рекурсивной функцией.

C/C++. Урок 13. Ссылки

Когда мы передаем в функцию параметр, то он передается по значению. Это означает, что мы передаем в функцию копию и что изменения этого параметра внутри функции никак не повлияют на сам оригинал. Вот поясняющий пример:

#include <iostream.h>

void f(int a)

{

a++; //Увеличиваем a на 1.

}

void main()

{

int k=20;

f(k);

cout<<k<<"\n"; //Выведется 20.

}

Тут мы внутри функции изменяем параметр на 1, но в функции main переменная k как имела значение 20, так и будет иметь.

Параметры можно передавать и по ссылке. Это означает, что иы передаем в функцию сам оригинал переменной. Вот пример:

...

void f(int &a)

{

a++; //Увеличиваем a на 1.

}

void main()

{

int k=20;

f(k);

cout<<k<<"\n"; //Выведется 21.

}

В этом примере в функцию f передается оригинал переменной, и в функции main переменная k будет изменена. Это мы достигаем передачей ссылки на переменную:

...

void f(int &a)

{

...

Как вы видите, для передачи по ссылке мы используем знак амперсанда (&).

C/C++. Урок 14. Адрес переменной

Операционная система Windows выделяет каждой программе 4 Гб адресного пространства. В реальности, конечно, такой оперативной памяти нет (хотя кто знает, что будет через пару-тройку лет ;)), но каждая программа искренне думает, что у нее есть столько места.

Каждый байт адресного пространства имеет свой адрес. Адрес - это просто некоторое число. В Windows адрес выглядит приблизительно так: 0x0D56FF23. Тут префикс 0x означает что это число в шестнадцатеричном виде. Цифры шестнадцатеричного числа - это обычные числа от 0 до 9 и буквы A, B, C, D, E, F. Обратите внимание, что в адресе 8 знаков (так и должно быть, так как у каждой программы 4 Гб адресного пространства).

Рассмотрим подробнее, что происходит, когда вы пишете в вашей программе что-то вроде

int z;

В этом случае в адресном пространстве вашей программы несколько байт (а именно столько, сколько надо на хранение одного целого - скорей всего это будет 4 байта) получают имя z. И это очень удобно - запись в эти ячейки идет не по их адресу (который выглядит как-то вроде 0x00FD240A) а по удобному имени z. Эти байты выделяются в определенном месте адресного пространства. Адрес первого байта нашего числа z будет начальным адресом все переменной z.

Адрес можно получить непосредственно. Для этого служит оператор взятия адреса & (называется амперсанд). Вот пример:

int z;

cout<<&z; //Выводим на экран адрес переменной z.

Указаный фрагмент выведет что-то вроде 0x0012FF7C.

Вот еще пример: