
- •Общие сведения
- •Средства разработки
- •Структура программы
- •Алфавит
- •Лексемы
- •1.2. Переменные. Типы данных
- •Простые типы данных
- •Структурированные типы данных
- •1.3. Константы
- •1.4. Операции Арифметические
- •Присваивание
- •1.5. Операторы ветвления и цикла
- •1.6. Функции Описание и вызов
- •Неявно заданные параметры функции
- •Рекурсия
- •Механизм вызова функций, подставляемые функции
- •Перегрузка функций. Параметры по умолчанию
- •1.7. Указатели. Массивы. Строки Обзор
- •Приведение типов
- •Типизированные и нетипизированные указатели
- •Операции над указателями
- •Массивы
- •Многомерные массивы
- •Указатели в качестве параметров функций
- •Указатель на функцию
- •Функции работы с указателями и памятью
- •Строки.
- •1.8. Организация ввода-вывода
- •Форматированный ввод-вывод
- •1.9. Директивы препроцессора
- •1.10. Метки. Безусловный переход
- •1.11. Время жизни и область видимости переменных
- •1. 12. Многофайловые проекты
- •1.13. Введение в объектно-ориентированное программирование
- •2.3. Проблемы разработки сложных программных систем
- •2.4. Жизненный цикл программного продукта
- •Модели жц.
- •Экстремальное программирование
- •2.5. Оценка качества процессов создания программного обеспечения
- •2.6. Проектирование надёжного программного средства
- •2.7. Процессы проектирования
- •2.8. Требования, цели
- •2.9. Внешнее проектирование
- •Диаграммы потоков данных (Data Flow Diagrams).
- •Диаграммы переходов состояний (State Transition Diagrams). Функциональные диаграммы.
- •Описание структур данных
- •2.10. Проектирование архитектуры
- •2.11. Проектирование модульной структуры. Модуль
- •Внешнее проектирование модулей
- •Модульная декомпозиция
- •2.12. Кодирование.
- •2.13. Тестирование
- •2.14. Документирование
- •2.15. Проектирование пользовательского интерфейса
- •Реализация многомерных массивов
- •Очередь и стек
- •Ассоциативные массивы
- •3.3. Упорядоченные структуры данных.
- •Сортировка методом пузырька
- •Быстрая сортировка
- •3.4. Деревья
- •Бинарное дерево
- •Обход дерева
- •3.5. Множества, графы Множества
- •3.6. Строки Константные строки
- •Списковое представление строк
- •Представление массива строк
- •3.7. Библиотека stl
- •3.8. Реализация некоторых структур данных Реализация двусвязанного списка.
- •Реализация массива переменного размера:
- •Примеры программ
- •Список литературы
Неявно заданные параметры функции
Допустимо явно не указывать параметры функции, для этого используется многоточие в конце списка параметров. В этом случае компилятор контролирует только явно указанные аргументы. Никаких специальных базовых средств по работе с неявно указанными параметрами функции языки «С» и «С++» не предоставляют, но известно, что переданные фактические параметры располагаются в памяти (в стеке) последовательно после явно указанных.
Функции и типы данных для работы с неявно заданными параметрами определены в библиотеке stdarg.h.
Рекурсия
Языки «С» и «С++» разрешают использование рекурсии, то есть вызова функцией самой себя.
Пример (функция вычисления факториала):
long fact(int k)
{
if (k<0) return 0;
if (k==0) return 1;
return k*fact(k-1);
}
Механизм вызова функций, подставляемые функции
Каждая объявленная функция компилируется в свою область памяти, переход к выполнению соответствующего кода выполнятся по адресу размещения функции. Адрес функции доступен через её имя. Для вызова функции должна быть выполнена следующая комбинация действий:
– сохранения контекста выполнения функции, из которой происходит вызов: заключается, прежде всего, в сохранении некоторых регистров процессора;
– сохранение фактических параметров функции: как правило, производится в стек, но при небольшом их количестве может осуществляться передача через регистры; есть специальные директивы, управляющие режимом передачи аргументов;
– вызов функции по её адресу.
После выполнения тела функции необходимо провести обратный набор операций: сохранение результата, возврат в точку вызова, восстановление контекста.
Таким образом, вызов функции является достаточно ресурсозатаратным процессом. Это в особенности справедливо, если тело функции не велико, а количество вызовов достаточно большое (например, вызов происходит в цикле). Казалось бы, в этом случае эффективнее не выделять в программе отдельные функции, но такое решение может не соответствовать принципам структурного программирования. Для такой ситуации введены подставляемые (inline) функции. Их тело компилируется непосредственно в точку их вызова, а не в отдельную область памяти. На такие функции накладывается ряд достаточно очевидных ограничений: в них недопустима рекурсия, нельзя объявить указатель на такую функцию. Большинство современных компиляторов автоматически выбирает режим (стандартный / подстановка) для функций.
Перегрузка функций. Параметры по умолчанию
Язык «С++» предоставляет дополнительные возможности:
– перегрузка функций – несколько функций могут иметь одно имя и тип, но разный набор формальных аргументов, в этом случае компилятор сам выбирает подходящую функцию по фактическим аргументам;
– параметры по умолчанию – указание для некоторых формальных параметров функции значений, используемых в случае, если фактические параметры при вызове не указаны.
1.7. Указатели. Массивы. Строки Обзор
Переменные хранят данные и не позволяют управлять их размещением в памяти, можно лишь определить адрес их размещения (операция «&»).
Указатель на переменную хранит адрес размещения данного. Обратиться к данному можно через операцию разыменовывания указателя (*). Объявление указателя осуществляется символом «*» перед именем переменной. Пример:
int x;
int *t; // объявили указатель t на переменную типа int
t = &x; // присваиваем указателю адрес переменной x
*t = 4; // используя указатель, присваиваем x значение 4
Указатели и объекты одного типа могут быть объявлены вместе. Пример (другая реализация предыдущего примера):
int x,*t=&x;
Константа NULL предназначена для обозначения неинициализированных указателей.
Для обращения к полям структур, передаваемых по указателю, используется символ «->».
Пример:
struct S {int a; float b;};
int Func(S*s)
{
…
(*s).a = 3; // можно обратиться к полю так
s->b = 5.6 // а можно и так
…
return 0;
}