- •Int z[n]; //Неверно!
- •Урок 10. Рекурсивные функции
- •Int z[3]; //Массив
- •Урок 26. Конструкторы и деструкторы
- •Урок 27. Классы и указатели
- •Урок 28. Практика: список - добавление элементов
- •Урок 29. Показ элементов списка
- •Урок 30. Ищем элемент в списке
- •Урок 32. Удаление элемента из списка
- •Урок 33. Функция с переменным числом параметров
- •Урок 31. Пара вспомогательных методов для списка
- •Урок 34. Считаем элементы в списке
- •Урок 35. Обмен соседних элементов в списке
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 37. Сортируем элементы списка
- •Урок 38. Сортировка с перегрузкой оператора
Урок 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.
Вот еще пример:
