- •Лекция №10 Тема: Строки.
- •Функции работы со строками из библиотеки обработки строк
- •Пример 4.
- •Пример 5
- •Пример на многомерные динамические массивы
- •Указатели на функции
- •Пример №1
- •Результат выполнения программы:
- •Результат выполнения программы
- •Пример №3
- •Пример №2
- •Результаты выполнения программы
Пример №2
/*Вызов функций по адресам через указатель
*/
#include<iostream.h>
// описания функций
// функции одного типа с одинаковыми сигнатурами
int add (int n, int m) { return n + m;}
int div (int n, int m) { return n % m;}
int mult (int n, int m) { return n * m;}
int subt (int n, int m) { return n - m;}
void main()
{
int (*par)(int, int); // указательна функцию
int a = 6, b = 2; /* задаются начальные значения
для переменных a и b */
char c = '+';
while(c != ' ')
{
cout<<"\nАргументы: а = "<<a
<< ", b = "<<b;
cout<<"\n Результат для с = \'"<<c<<"\'"
<< " равен ";
switch(c)
{
case '+':
par = add; // par получает адрес функции add
c = '%'; break;
case '-':
par = subt; // par получает адрес функции subt
c = ' '; break;
case '*':
par = mult; // par получает адрес функции mult
c = '-'; break;
case '%':
par = div; // par получает адрес функции div
c = '*'; break;
}
cout<<(*par)(a,b); /* вызов функции по адресу,
результат, возвращаемый функцией, выводится на экран */
}
cout<<endl;
}
Результат выполнения программы
Аргументы: a = 6, b = 2. Результат для с = '+' равен 8
Аргументы: a = 6, b = 2. Результат для с = '%' равен 0
Аргументы: a = 6, b = 2. Результат для с = '*' равен 12
Аргументы: a = 6, b = 2. Результат для с = '-' равен 4
Цикл продолжается, пока значением переменной с не станет пробел. В каждой итерации указатель par получает адрес одной из функций, и изменяется значение с. По результатам программы легко проследить порядок выполнения ее операторов.
Указатели на функции могут быть объединены в массивы. Например, float (*ptrArray) (char) [4] ; - описание массива с именем ptrArray из четырех указателей на функции, каждая из которых имеет параметр типа char и возвращает значение типа float. Чтобы обратиться, например, к третьей из этих функций, потребуется такой оператор:
float a = (*ptrArray[2]) ('f');
Как обычно, индексация массива начинается с 0, и поэтому третий элемент массива имеет индекс 2.
Массивы указателей на функции удобно использовать при разработке всевозможных меню, точнее программ, управление которыми выполняется с помощью меню. Для этого действия, предлагаемые на выбор будущему пользователю программы, оформляются в виде функций, адреса которых помещаются в массив указателей на функции. Пользователю предлагается выбрать из меню нужный ему пункт и по номеру пункта, как по индексу, из массива выбирается соответствующий адрес функции. Обращение функции к этому адресу обеспечивает выполнение требуемых действий. Самую общую схему реализации такого подхода иллюстрирует следующая программа.
Пример №3
/*пример с массивом указателей на функции
*/
#include<iostream.h>
// объявление функций
void func1(int);
void func2(int);
void func3(int);
void main()
{
/* объявление массива, в котором хранятся указатели на
функции func1, func2 и func3*/
void (*f[3])(int) = {func1, func2, func3};
int choice;
cout<<"Введите число между 1 и 3,"
" другое число - окончание: ";
cin >> choice;
while(choice >= 1 && choice < 4)
{
(*f[choice-1])(choice); // вызов функции f[choice]
cout<<"Введите число между 1 и 3,"
" другое число - окончание: ";
cin >> choice;
}
cout<<"Вы ввели "<<choice<<" для окончания\n";
}
// описания функций
void func1(int a)
{
cout<<"\nВы ввели "<<a
<< ", поэтому была вызвана func1\n";
}
void func2(int b)
{
cout<<"\nВы ввели "<<b
<< ", поэтому была вызвана func2\n";
}
void func3(int a)
{
cout<<"\nВы ввели "<<a
<< ", поэтому была вызвана func3\n";
}
