- •Конспект лекций Часть 2 Оглавление
- •Часть 2 1
- •8. Указатели
- •8.1. Указатели Понятие указателя
- •Работа с указателями
- •Арифметика указателей
- •Ошибки при работе с указателями
- •If (p1) // Если указатель не равен 0, то все в порядке
- •8.2. Указатели и массивы
- •9. Функции и структура программы
- •9.1. Создание и использование функций Процедурный подход к разработке программ
- •Int Максимум_строки (int Строка)
- •Int Минимум_строки (int Строка)
- •Int Максимум_столбца (int Столбец)
- •Int Минимум_столбца (int Столбец)
- •Определение функций в программе
- •Завершение работы функции (инструкция return)
- •If ( Ошибка )
- •Список параметров функций
- •Обращение к функциям в программе
- •Передача данных по значению
- •Передача данных с помощью указателей
- •Передача данных по ссылке
- •Перегружаемые функции
- •Параметры по умолчанию
- •Функции с переменным числом параметров
- •Рекурсивное использование функций
- •Передача функций в качестве параметров
- •Встраиваемые функции (inline - функции)
- •Прототипы функций
- •9.2. Структура программы. Глобальные и локальные данные (области видимости и время жизни) Структура программы
- •Глобальные и локальные данные
- •Классы памяти
- •Многофайловые проекты
- •10. Структуры, объединения, перечисления
- •10.1. Структуры Определение структур
- •Доступ к полям структур
- •Указатели на структуры
- •Структурные параметры функций
- •Битовые поля структур
- •10.2. Объединения Обычные объединения
- •Анонимные объединения
- •10.3. Перечисления
- •Void WriteColor (тип_Спектр c )
- •11. Организация работы с файлами
- •11.1. Потоки для работы с файлами Общие сведения
- •Пример работы с файлом
- •11.2. Работа с файлами Создание потока, открытие и закрытие файла
- •Запись и чтение данных в текстовых файлах
- •Запись и чтение данных в двоичном режиме
- •If ( !File ) // Проверили удалось ли открыть файл
- •Как обнаружить конец файла?
- •Прямой доступ при работе с файлами
- •If ( !File ) // Проверили удалось ли открыть файл
- •Статус потоков ввода-вывода
- •Некоторые другие функции управления потоками ввода-вывода
- •Примеры по работе с файлами
- •12. Работа с динамической памятью Распределение памяти при работе программы
- •Динамическое выделение и освобождение памяти в стиле c
- •Возможные ошибки при работе с динамической памятью
- •Динамические массивы
- •Одномерные однонаправленные списки
- •Одномерные двунаправленные списки
- •Многомерные списки
Параметры по умолчанию
Еще одна интересная возможность при работе с функциями состоит в использовании параметров по умолчанию.
Рассмотрим пример:
void F (int I, double D, char C = ’a’, int J = 10)
{
cout << C << “ “ << J << endl;
}
int main ()
{
F (0, 3.14); // Результат: а 10
F (0, 3.14, ’G’); // Результат: G 10
F (0, 3.14, ’G’, 1000); // Результат: G 1000
}
В этом примере в функции Fпоследние два параметра определены как параметры по умолчанию.
При вызове функций имеющих параметры по умолчанию вместо них аргументы можно не подставлять. В этом случае внутри функции в качестве значений параметров будут использованы те значения, которые были заданы в заголовке функции. В том случае, если при вызове функции на место параметра по умолчанию будет подставлен некоторый аргумент, то внутри функции в качестве значения параметра по умолчанию будет использовано значение аргумента.
Количество параметров по умолчанию может быть любым. При использовании параметров по умолчанию необходимо помнить:
все параметры по умолчанию должны находиться в конце списка параметров функции;
если при вызове функции не указывается аргумент для некоторого параметра по умолчанию, то и все следующие аргументы должны быть пропущены.
Функции с переменным числом параметров
Одним из представителей подобных функций является, например, функция printf (), используемая в языкахCиC++ для вывода данных:
void main()
{
int a = 10, b = 20;
char *str = "Это текст";
printf("a = %d, с = %s, b = %d", a, str, b);
}
Эта функция может принимать произвольное число аргументов в зависимости от структуры первого аргумента, задающего так называемую строку формата. В строке формата каждый символ %означает подстановку соответствующего аргумента из перечисленных за строкой формата. Количество подставляемых аргументов должно соответствовать количеству символов%в стоке формата и может быть любым.
Для того чтобы написать собственную функцию с произвольным числом параметров, необходимо придерживаться определенной методики, включающей следующие пункты:
1. При разработке тела функции необходимо использовать макросы для работы со списками аргументов функций. Для их использования в программу необходимо включить заголовочный файл <stdarg.h>:
#include <stdarg.h>
2. В списке параметров заголовка функции должен присутствовать хотя бы один обязательный параметр, после которого следуют необязательные параметры, обозначенные тремя точками. Например:
double Summa (int N, …)
Здесь в списке параметров присутствует один обязательный параметр N, за которым могут следовать необязательные параметры. Необязательные параметры должны всегда находиться в конце списка параметров.
3. В теле функции необходимо определить переменную для работы со списком параметров (тип данных этой переменной va_listопределен в<stdarg.h>), значение которой инициализируют с помощью макросаva_start(он также принадлежит<stdarg.h>). Перед завершением работы функции необходимо (обязательно!) с помощью макросаva_endочистить стек программы от необязательных параметров функции:
{
va_list L; // Объявляем переменную для списка параметров
va_start (L, N); // Инициализируем переменную списка параметров
……….
va_end (L); // Очищаем стек
return ………;
}
Макрос va_startимеет два параметра. Первый – это переменная списка параметров. Второй – имя последнего обязательного параметра функции (параметра, который находится в списке параметров непосредственно перед необязательными параметрами).
4. Получение очередного параметра из списка необязательных параметров осуществляется с помощью макроса va_arg (), например, так:
double R = 0;
for (int I = 0; I < N; ++ I)
R += va_arg (L, double);
Параметрами макроса va_arg являются переменная списка параметров и тип данных очередного параметра из списка.
Приведенные выше “заготовки” приводят нас к функции, выполняющей суммирование Nвещественных значений:
#include <iostream>
#include <stdio.h>
#include <stdarg.h>
using namespace std;
double Summa (int N, …)
{
va_list L; // Объявляем переменную для списка параметров
va_start (L, N); // Инициализируем переменную списка параметров
double R = 0;
for (int I = 0; I < N; ++ I)
R += va_arg (L, double); // Добавляем кRочередной аргумент
va_end (L); // Очищаем стек
return R;
}
int main ()
{
cout << Summa (3, 10.0, 20.0, 30.0) << endl; // 60
cout << Summa (5, 10.0, 20.0, 30.0, 40.0, 50.0) << endl; // 150
return 0;
}