Язык Си. Лабораторные работы / Примеры отчетов / Lab12
.docx
Лабораторная работа №12
РАБОТА С УКАЗАТЕЛЯМИ НА ФУНКЦИЮ
Студент гр. ИКПИ-81
Коваленко Л. А.
А. Постановка задачи
Необходимо написать функцию пользователя, позволяющую найти максимальное значение произвольной функции одного переменного, аргумент которой задан массивом из «n» элементов вещественного типа.
В настоящей лабораторной работе указатели на функцию используются для повышения универсальности функции пользователя. С этой целью у разрабатываемой функции вводится дополнительный параметр, через который передается указатель на функцию. Для получения дополнительной практики по работе с модулями решение задачи должно быть оформлено в виде двух модулей. В основном модуле должна находиться функция main(), а во вторичном (дополнительном) – разрабатываемая функция пользователя, решающая задачу и несколько функций (2–3), которые подлежат табулированию.
Б. Разработка алгоритма
Алгоритм решения задачи следующий:
-
Создание указателя на функцию, вещественного массива, всп. переменных.
-
Ввод n (количество элементов в массиве).
-
Ввод в массив n исходных вещественных значений.
-
Присваивание указателю адреса первой функции.
-
Подсчитать, используя функцию нахождения максимума, максимальное значение первой функции (по исходным введенным данным).
-
Вывод результата (максимума).
-
Присваивание указателю адреса второй функции.
-
Подсчитать, используя функцию нахождения максимума, максимальное значение второй функции (по исходным введенным данным).
-
Вывод результата (максимума).
-
Присваивание указателю адреса третьей функции.
-
Подсчитать, используя функцию нахождения максимума, максимальное значение третьей функции (по исходным введенным данным).
-
Вывод результата (максимума).
Входные данные состоят из величины n (количества элементов в вещественном массиве) и элементов массива. Значение n вводится в основной части программы. Массив в специальной функции.
Проект состоит из двух файлов: "lab12.c" с основной функцией main() и "funcLib.h" с вспомогательными функциями.
В. Таблица идентификаторов
N |
Обозначение в задаче |
Идентификатор |
Назначение |
1 |
n |
n |
Входные данные |
2 |
массив данных |
a |
Входные данные |
3 |
указатель на функцию |
(*p) (double) |
Промежуточные данные |
4 |
– |
result |
Выходные данные |
5 |
– |
i |
Промежуточные данные пользовательской функции |
6 |
– |
max |
|
7 |
– |
IArray(a, n) |
Ввод массива |
8 |
функция пользователя |
maxFunc(a, n, (*p) (double)) |
Функция пользователя |
9 |
– |
Sin2A(a) |
Функции вычисления опред. значений |
10 |
– |
Sec(a) |
|
11 |
– |
Cosec(a) |
0
Начало
Ввод
n 1 2 7
Вывод
result 8
3 9
4 10
5 11
Вывод
result Вывод
result
Останов 6 12
Возврат
sin(2*a)/(2*a) Конец 0 Ввод
a[i] Конец Да Нет Возврат
max Конец 1 2 3 0 1 2 3 4 5 6 0 1 Возврат
1/cos(a) Конец 0 1 Возврат
1/sin(a) Конец 0 1
Д. Контрольный расчет
Контрольный набор с , .
Результаты вычислений приведены ниже в таблице вычислений.
Назначение набора данных |
Набор данных |
Результаты вычислений |
|||||||
n |
Числа |
Ручные |
Машинные |
||||||
Max Sin2A |
Max Sec |
Max Cosec |
Max Sin2A |
Max Sec |
Max Cosec |
||||
Контрольный набор |
3 |
1 |
0.454649 |
25.112453 |
1.188395 |
0.454649 |
25.112453 |
1.188395 |
|
30 |
|||||||||
99 |
|||||||||
4 |
-75 |
-0.002127 |
2.052597 |
3.811341 |
-0.002127 |
2.052597 |
3.811341 |
||
-50 |
|||||||||
100 |
|||||||||
200 |
Е. Программа на языке Си
/* Файл Lab11.c */
// Стандарт языка СИ: "ISO C99"
// Компилятор: "TDM-GCC (MinGW) 4.9.2"
#include <stdio.h>
#include <stdlib.h>
#include "funcLib.h" // своя библиотека функций
/*
Лабораторная работа 12
РАБОТА С УКАЗАТЕЛЯМИ НА ФУНКЦИЮ
Студент гр. ИКПИ-81
Коваленко Л. А.
*/
int main() {
int n;
double *a;
double result;
double (*p) (double) = NULL; // Создание указателя на функцию
// Ввод количества значений
printf("Input n: ");
scanf("%d", &n);
// Указатель на массив вещ. чисел из n элементов
a = (double *)malloc(sizeof(double) * n);
// Ввод значений массива
printf("Input %d numbers (num <> 0): ", n);
IArray(a, n);
// Указатель на функцию Sin2A
p = Sin2A;
// Результат в result
result = maxFunc(a, n, p);
// Вывод результата
printf("Result for Sin2A(): %lf\n", result);
// Указатель на функцию Sec (секанс)
p = Sec;
// Результат в result
result = maxFunc(a, n, p);
// Вывод результата
printf("Result for Sec(): %lf\n", result);
// Указатель на функцию Cosec (косеканс)
p = Cosec;
// Результат в result
result = maxFunc(a, n, p);
// Вывод результата
printf("Result for Cosec(): %lf\n", result);
free(a);
a = NULL;
return 0;
}
/* Файл funcLib.h */
#include <math.h>
void IArray(double *a, int n) {
int i;
for (i = 0; i < n; i++)
scanf("%lf", &a[i]);
}
double maxFunc(double *a, int n, double (*p) (double)) {
int i;
double max = p(a[0]), result = 0;
for (i = 0; i < n; i++)
if ((result = p(a[i])) > max)
max = result;
return max;
}
double Sin2A(double a) {
return (sin(2.0*a)/(2.0*a));
}
double Sec(double a) {
return (1.0/cos(a));
}
double Cosec(double a) {
return (1.0/sin(a));
}
Ж. Выводы
Тот факт, что результаты контрольных расчетов, выполненных вручную, достаточно совпадают с результатами контрольных расчетов, выполненных на ЭВМ, свидетельствуют о том, что программа составлена правильно.