Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
01.10.2019
Размер:
150.36 Кб
Скачать

Лабораторная работа №12

РАБОТА С УКАЗАТЕЛЯМИ НА ФУНКЦИЮ

Студент гр. ИКПИ-81

Коваленко Л. А.

А. Постановка задачи

Необходимо написать функцию пользователя, позволяющую найти максимальное значение произвольной функции одного переменного, аргумент которой задан массивом из «n» элементов вещественного типа.

В настоящей лабораторной работе указатели на функцию используются для повышения универсальности функции пользователя. С этой целью у разрабатываемой функции вводится дополнительный параметр, через который передается указатель на функцию. Для получения дополнительной практики по работе с модулями решение задачи должно быть оформлено в виде двух модулей. В основном модуле должна находиться функция main(), а во вторичном (дополнительном) – разрабатываемая функция пользователя, решающая задачу и несколько функций (2–3), которые подлежат табулированию.

Б. Разработка алгоритма

Алгоритм решения задачи следующий:

  1. Создание указателя на функцию, вещественного массива, всп. переменных.

  2. Ввод n (количество элементов в массиве).

  3. Ввод в массив n исходных вещественных значений.

  4. Присваивание указателю адреса первой функции.

  5. Подсчитать, используя функцию нахождения максимума, максимальное значение первой функции (по исходным введенным данным).

  6. Вывод результата (максимума).

  7. Присваивание указателю адреса второй функции.

  8. Подсчитать, используя функцию нахождения максимума, максимальное значение второй функции (по исходным введенным данным).

  9. Вывод результата (максимума).

  10. Присваивание указателю адреса третьей функции.

  11. Подсчитать, используя функцию нахождения максимума, максимальное значение третьей функции (по исходным введенным данным).

  12. Вывод результата (максимума).

Входные данные состоят из величины 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));

}

Ж. Выводы

Тот факт, что результаты контрольных расчетов, выполненных вручную, достаточно совпадают с результатами контрольных расчетов, выполненных на ЭВМ, свидетельствуют о том, что программа составлена правильно.

Соседние файлы в папке Примеры отчетов