Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие - Основы программирования.doc
Скачиваний:
48
Добавлен:
14.03.2016
Размер:
3.79 Mб
Скачать

Лабораторная работа №7 Передача имён функций в качестве параметров

Цель лабораторной работы: изучение методов сортировки структур данных; совершенствование навыков процедурного программирования на языке C/С++ при решении задач обработки статических и динамических массивов.

Задание на программирование: используя технологию процедурного программирования реализовать заданный метод сортировки и применить его для указанных фрагментов числовой матрицы в соответствии с индивидуальным заданием.

Порядок выполнения работы:

1) Получить у преподавателя индивидуальное задание: метод сортировки и вид сортируемых фрагментов матрицы. Исходная матрица, содержащая 2*n строк и 2*n столбцов, не должна содержать одинаковых и нулевых элементов. Значения элементов матрицы необходимо формировать программно (с клавиатуры не вводить) с помощью формул.

2) Разработать математическую модель: описать с помощью формул и рисунков структуру массива и процесс его преобразования. У результирующей матрицы должны быть отсортированы заданные фрагменты, а значения элементов не сортируемых фрагментов должны быть обнулены.

3) Построить схему алгоритма решения задачи.

4) Составить программу на языке C/С++.

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

Выходные данные должны выводиться на экран с пояснениями.

6) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов, в том числе с ошибочными входными данными. Входные и выходные массивы должны выводиться в одном и том же формате.

7) Использовать стандартные потоковые объекты ввода/вывода cinиcout.

8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, текст программы, контрольные примеры.

Варианты индивидуальных заданий

25

Написать программу, содержащую рекурсивную функцию, которая находит с точностью ε корень уравнения f(x)=0 на отрезке [a, b] методом касательных.

26

Написать программу, содержащую рекурсивную функцию, которая находит с точностью ε корень уравнения f(x)=0 на отрезке [a, b] методом хорд.

27

Написать программу, содержащую рекурсивную функцию, которая находит с точностью ε корень уравнения f(x)=0 на отрезке [a, b] методом секущих.

Примеры программ

// Тема: передача имени функции в качестве параметра

// Программа нахождения определенного интеграла

// функции f(x) на отрезке [a, b] с точностью eps методом

// КРИВОЛИНЕЙНЫХ трапеций (метод СРЕДНИХ прямоугольников).

// Рекурсия. Два варианта функций.

#include <iostream.h>

#include <math.h>

#include <conio.h>

typedef double(*tfun)(double) ; //определение типа функции

double integral(double a, double b, double h, double eps, tfun fun, double s) ;

double fun1(double x) ;

double fun2(double x) ;

int main()

{int var ;

double shag, rez, s = 0 ;

tfun fun ;

double a, b, eps ;

clrscr() ;

for(;;)

{

//Выбор действия

cout << "\n Возможный вид действия:\n" ;

cout << " 1 - нахождение определенного интеграла функции sin(x)\n" ;

cout << " 2 - нахождение определенного интеграла функции -x^2 + 8\n" ;

cout << " 3 - завершение задачи\n" ;

cout << " Введите вид действия ->" ;

cin >> var ;

switch(var)

{case 1: fun = fun1;

break;

case 2: fun = fun2;

break;

default:return 0;

}

//Ввод исходных данных

cout << " Введите границы интервала a и b, " ;

cout << " начальный шаг и точность вычисления\n" ;

cin >> a >> b >> shag >> eps ;

rez = integral(a , b , shag, eps, fun, s) ;

//Вывод результата

cout.precision(4) ;

cout << " Результат =" << rez << endl ;

}

}

//нахождение определенного интеграла методом криволинейных трапеций

double integral(double a, double b, double h, double eps, tfun fun, double s1)

{double x, s = 0 ;

for(x = a + h / 2; x < b; x += h)

s += fun(x) ;

s *= h ;

if (fabs(s - s1) > eps)

{h /= 2 ;

s = integral(a, b, h, eps, fun, s) ;

}

return s ;

}

//описание вида функции №1

double fun1(double x)

{return (sin(x)) ;

}

//описание вида функции №2

double fun2(double x)

{return (- x * x + 8) ;

}

61