- •Программирование
- •Алгоритмизация вычислительных процессов
- •На языке высокого уровня
- •Часть 1. Основы языка Си
- •Методические указания
- •К выполнению лабораторных работ
- •Составитель: л.А. Прокушев
- •Подписано к печати Формат 60х84 1/16. Бумага тип. №3
- •Редакционно-издательский отдел
- •190000, Санкт-Петербург, ул. Б. Морская, 67 Общие методические указания
- •Средства программирования вычислительных процессов Базовые элементы языка Си
- •Данные и их типы
- •Константы
- •Переменные
- •Ввод-вывод данных
- •Форматированный ввод
- •Форматированный вывод
- •Консольный ввод-вывод
- •Функция ввода символа (без отображения)
- •Функция очистки экрана результатов
- •Структура Си-программы
- •Директивы препроцессора
- •Выражения и операции
- •Логические выражения и операции
- •Работа с ветвящимися процессами Операторы
- •Оператор присваивания
- •Условный оператор (if)
- •Операторы передачи управления Пустой оператор
- •Оператор break (прервать) используется для прерывания работы текущего сложного оператора, в теле которого находится оператор break, и передачи управления на следующий по порядку оператор.
- •Оператор выбора (switch)
- •Действие оператора выбора состоит в следующем:
- •Введите 2 числа х, y : 3 8
- •Работа с циклическими вычислительными процессами
- •Циклы с фиксированным числом повторений Оператор цикла с предусловием (while)
- •Прерывание цикла
- •Циклы с неизвестным числом повторений Вычисление рекуррентных последовательностей
- •Оператор цикла с постусловием (do)
- •Вложенные циклы и организация диалога в программе
- •Оператор цикла с параметром (for)
- •Программа:
- •Программа:
- •Программа:
- •Работа с массивами
- •Описание массива
- •Доступ к элементам массива
- •Указатель
- •Занесение данных в массив
- •Многомерные массивы
- •Работа с функциями
- •Определение функции
- •Вызов функции
- •Передача параметров функции
- •Передача данных по значению
- •Передача данных по адресу
- •Пример. Составить функцию обмена значениями между переменными X и y. Верным решением является применение передачи данных по адресу.
- •Прототип (шаблон) функции
- •Блочная структура программы
- •Внешние описания переменных
- •Многомодульные программы Проект программы
- •Внешние ссылки
- •Создание проекта программы
- •Работа с указателями Объявления объектов со сложными описателями
- •Массивы указателей
- •Указатель на указатель
- •Указатель на функцию
- •Использование указателя на функцию как аргумента
- •Массивы указателей на функции
- •Часть 1. Основы языка Си 1
Массивы указателей на функции
Как и обычные переменные, указатели на функции могут объединяться в массивы указателей. Например, интерпретируем описание массива указателей на функции:
1)
объект с этим именем есть
2)
массив
d
ouble
(*fp[
] ) ( );
3
)
указателей
4) на функции, которые
5)
возвращают значение типа double.
Для инициализации массива указателей на функции можно использовать имена как стандартных функций, так и разработанных пользователем, например:
double f0 (double x) {return x;} /* описание функций */
double f1 (double x) {return (x * x);} /* пользователя */
Инициализация массива указателей на функции именами функции (указателями-константами):
double (*fp[]) ( ) = { f0, f1, sin};
Доступ к элементам массива fp выполняется как к обычным элементам массива, например:
x=0.5; /* значение аргумента */
for (i=0; i<3; i++) /* цикл по функциям */
{
fx = fp[i] (x); /* вызов функции через массив указателей */
printf (“fx=%f\n”,fx); /* вывод значения функции */
}
Пример. В задаче аппроксимации функции пользователь должен задать несколько наборов из трех базисных функций среди множества функций, предлагаемых ему на выбор, из которых образуется вариант аппроксимирующей функции, участвующей в дальнейших вычислениях. По результатам вычислений можно определить набор базисных функций, обепечивающих, например, минимальное значение аппроксимирующей функции.
В программе вычисления значений вариантов аппроксимирующей функции используется массив указателей double (*fb [kb]) () на функции
аппроксимации вида
fap = c[0] * fb[0](x) + c[1] * fb[1](x) + c[2] * fb[2](x) ,
где fb[i] () – базисные функции.
Для выбора базисных функций из набора испытуемых функций используется функция int select_fb(int).
Программа:
#include <math.h>
#include <stdio.h>
#define kv 2 /* количество вариантов испытаний */
#define kb 3 /* количество базисных функций */
double f0 (double x) { return x; } /* описания испытуемых */
double f1 (double x) { return (x * x); } /* функций */
double f2 (double x) { return 1.0/x; }
double f3 (double x) { return sin(x); }
double f4 (double x) { return cos(x); }
double f5 (double x) { return exp(x); }
/* Объявление массива указателей на испытуемые функции с инициализацией: */
double (*fptr[]) () = { f0, f1, f2, f3, f4, f5 };
int select_fb (int number); /* прототип функции выбора базисной функции */
void main() /* главная функция */
{ double (*fb[kb]) (); /* объявление массива указателей на базисные функции */
double c [] = {1.6, 2.8, 3}; /* массив коэффициентов аппроксимации */
double fap, x; /* рабочие переменные */
int var, i; /* параметры циклов */
clrscr(); /* очистка экрана */
printf (“Выберите 3 базисных функций из возможных:\n”
“0) x 1) x * x 2) 1/x 3) sin(x) 4) cos(x) 5) exp(x)\n”);
for (var=0; var<kv; var++) /* цикл вариантов испытуемых функций */
{ printf (“\nВариант %d\n”, var+1);
for (i=0; i<kb; i++) /* цикл по базисным функциям */
fb[i] = fptr[select_fb(i)]; /* выбор и закрепление указателя функции за базисной функцией */
printf (“Введите отличный от нуля x (аргумент функции): ”);
scanf (“%lf”, &x);
/* Использование массива базисных функций: */
fap = 0;
for (i=0; i<kb; i++) /* цикл вычисления аппроксимирующей функции */
fap += c[i] * fb[i](x);
printf (“Значение аппроксимирующей функции fap= %-7.2f\n”, fap);
}
getch(); /* задержка экрана результатов */
}
/* Функция выбора испытуемой базисной функции из заданного набора : */
int select_fb (int number)
{ int sel = –1; /* начальное значение переменной выбора */
while (sel<0 || sel>5) /* проверка выхода номера за допустимые пределы */
{ printf (“Укажите номер %d-й базисной функции (от 0 до 5): ”, number+1);
scanf (“%d”, &sel); /* ввод номера базисной функции */
}
return sel; /* возврат номера выбранной функции */
}
Результаты программы:
Выберите 3 базисных функции из возможных:
0) x 1) x * x 2) 1/x 3) sin(x) 4) cos(x) 5) exp(x)
Вариант 1
Укажите номер 1-й базисной функции (от 0 до 5): 0
Укажите номер 2-й базисной функции (от 0 до 5): 1
Укажите номер 3-й базисной функции (от 0 до 5): 2
Введите отличный от нуля x (аргумент функции): 1
Значение аппроксимирующей функции fap=6.00
Вариант 2
Укажите номер 1-й базисной функции (от 0 до 5): 5
Укажите номер 2-й базисной функции (от 0 до 5): 0
Укажите номер 3-й базисной функции (от 0 до 5): 1
Введите отличный от нуля x (аргумент функции): 1
Значение аппроксимирующей функции fap=7.72
Библиографический список
Прокушев Л.А. Сравнительное изучение языков Си и Паскаль: Учебно-справочное пособие. С-Пб.: СПбГААП, 1997. 152 с.
Касаткин А.И., Вальвачев А.Н. От Turbo C к Borland C++: Справочное пособие. Минск: Вышэйшая школа, 1992. 240 с.
Березин Б.И., Березин С.Б. Начальный курс С и С++. М.: Диалог-МИФИ, 2000. 288 с.
ОГЛАВЛЕНИЕ
ПРОГРАММИРОВАНИЕ 1
