- •Министерство образования и науки российской федерации
- •2. Методические указания к выполнению лабораторных работ
- •Лабораторная работа №1 Следование
- •Варианты индивидуальных заданий
- •Лабораторная работа №2 Операторы ветвления
- •Варианты индивидуальных заданий
- •Лабораторная работа №3 Операторы цикла
- •Варианты индивидуальных заданий
- •Лабораторная работа №4 Статические массивы
- •Варианты индивидуальных заданий
- •Пример программы на обработку двумерного массива (матрицы)
- •Лабораторная работа №5 Динамические массивы
- •Варианты индивидуальных заданий
- •Пример программы на обработку двумерного массива (матрицы)
- •Лабораторная работа №6 Методы сортировки
- •Варианты индивидуальных заданий Методы сортировки
- •Области сортировки элементов матриц
- •Лабораторная работа №7 Передача имён функций в качестве параметров
- •Варианты индивидуальных заданий
Лабораторная работа №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) ;
}