- •Списки §1. Общие сведения о списках
- •§2. Создание списка
- •§3. Просмотр и анализ списка
- •3.1. Просмотр и анализ списка целых чисел.
- •3.2. Просмотр и анализ списка одномерных массивов.
- •§6. Сравнительный анализ списков.
- •§1. Порядок работы с файлом
- •1.1. Потоки и файлы
- •1.2. Объявление файла
- •1.3. Открытие файла.
- •1.4. Закрытие файла.
- •§2. Работа с текстовым файлом
- •2.1. Посимвольная работа с текстовым файлом
- •Int fputc(int ch, file *stream)
- •2.2. Построчная работа с текстовым файлом
- •§3. Функции блокового ввода/вывода
- •3.1. Экономические задачи с использованием файлов
- •3.2. Математические задачи с использованием файлов
- •§4. Прямой (произвольный) доступ к файлу
- •4.1. Функция fseek()
- •4.2. Замена записи. Функции ftell, fgetpos, fsetpos, rewind.
- •Пример. В файл записать координаты точек плоскости. Найти две (любые) точки с наибольшим расстоянием между ними. Массив для хранения координат всех точек не использовать.
- •Упражнения, тесты.
- •Функции (дополнительные возможности)
- •§1. Функции с переменным количеством параметров.
- •§2. Указатели на функции.
- •§3. Массив указателей на функции.
- •§4. Введение в рекурсивные функции.
- •Упражнения, тесты.
- •Void Fun1 (float); void Fun2(float); void Fun3(float);
- •Лабораторная работа № 12.
- •Команды препроцессора (директивы компиляции)
- •§1. Директива define (замены в тексте)
- •Простое макроопределение (макрос)
- •Макрос с аргументами.
- •Директива #undef.
- •§2. Директива #include (включение файлов).
- •§3. Директивы условной компиляции.
- •Директива #if.
- •Директивы #ifdef и #ifndef.
- •Упражнения, тесты
- •История развития технологий программирования
- •§1. Программирование в машинных кодах и на языках символического кодирования
- •§2. Языки высокого уровня. Структурное и модульное программирование
- •§3. Интегрированные системы программирования.
- •§4. История и идеи объектно-ориентированного программирования.
- •§5. Программирование для Windows. Визуальное программирование.
- •Литература
- •Оглавление Предисловие………………………………………………………….…………………3
- •Г л а в а 4. Структуры и другие типы, определяемые пользователем.84
- •Г л а в а 6. Файлы ………………………………………………………..154
- •Г л а в а 7. Функции (дополнительные возможности) ………………190
- •Г л а в а 9. История развития технологий программирования ……220
§3. Массив указателей на функции.
Указатели на функции могут быть объединены в массивы. Например,
float (*FunArray) (char, char) [5]; ?????
описывает массив фиксированной размерности из пяти указателей на функции, каждая из которых имеет два параметра типа char и возвращает значение типа float. Как для обычных массивов, индексация начинается с нуля. Поэтому для обращения к третьей из этих функций потребуется, например, такой оператор:
float f= (*FunArray[2]) (‘A’, ‘B’);
Массив указателей на функции удобно использовать при разработке программ, управление которыми выполняется с помощью меню. Для этого действия, предлагаемые на выбор пользователю программы (например, создание файла, чтение и анализ, корректировка файла), оформляются в виде функций, адреса которых помещаются в массив указателей на функции. Пользователь вводит номер выбираемого пункта и по нему из массива выбирается соответствующий адрес функции. Обращение к функции по этому адресу обеспечивает выполнение требуемых действий. Благодаря такому методу программирования нет необходимости выбирать соответствующие функции с помощью оператора switch. Общая схема реализации такого подхода иллюстрирует следующая программа:
Пример 1. Статический массив указателей на функции.
void Create (int);
void Read(int);
void Append(int);
void main()
{ const n=3;
// Объявляем массив из трёх указателей на функции
void (*far[n])(char *)= { Create, Read, Append };
int Numf;
char NameOfFile[30];
cout<<”\n 1- CREATE”;
cout<<”\n 2- READ”;
cout<<”\n 3- APPEND”;
cout<<”\n 4- EXIT”;
while (1)
{ while (1)
{ cout<<”\n Item of menu”; cin>>Numf
if (Numf>=1 && Numf<=4) break;
cout<<” \n Error! Repeat/ “;
}
if (Numf==4) break;
else
{cout<<”\n Name of file “;
gets( NameOfFile);
(*far[Numf-1])( NameOfFile);
}
}
}
void Create (int x)
{ cout << " Creating of file"<<endl;
}
void Read (int x)
{ cout << " Reading of file"<<endl;
}
void Append (int x)
{ cout << " Appending of file"<<endl;
}
В этом учебном, искусственном примере объявили массив far из трёх указателей на функции типа void, каждая из которых имеет один входной параметр (физическое имя обрабатываемого файла) типа указателя на строку (char *). Функция ничего не возвращает, а только выводит текст в зависимости от выполняемых над файлом действий. При объявлении массива выполнена инициализация тремя конкретными, определёнными после main(), функциями Create, Read и Append. В цикле вводим номер функции (1, 2, 3 или 4 для выхода) и выполняем одну из трёх функций. В качестве параметра в конкретную функцию передаётся её реальный номер в массиве (1 для Create, 2 для Read, и 3 для Append ). Если введём в качестве номера число 4 выходим из внешнего цикла.
Пример 2. (+) Динамический массив указателей на функции. Для x=0, 0.2, …, 1 вывести таблицу значений трёх функций.
// Тексты двух функций. Третья функция – стандартная cos(x).
double MyExp (double x){
return (exp(x));
};
double Myq(double x){
return x*x;
};
void main()
{ int n; cin>>n;
/* Объявляем и создаём массив указателей на функции с одним вещественным параметром. */
double (*(*fun))(double )= new (double (*[n])(double));
// Элементам созданного массива присваиваем имена функций.
fun[0]= cos;
fun[1]=MyExp;
fun[2]=Myq;
// Цикл для изменения x
for (float x=0; x<1; x+=0.2)
{ printf("%5.1f",x) ;
/* Цикл для вывода значений всех функций для одного фиксированного значения x. */
for(int j=0; j<n; j++)
printf (" %20.6f", fun[j](x));
cout<<endl;
}
getch(); }