- •Часть 2
- •Содержание
- •Лабораторная работа №1. Рекурсивные функции
- •1.1. Краткие теоретические сведения
- •1.2. Пример выполнения задания
- •1.2.1. Реализация задания в оконном приложении
- •1.2.2. Реализация задания в консольном приложении
- •1.3. Индивидуальные задания
- •Лабораторная работа №2. Алгоритмы поиска и сортировки в массивах
- •2.1. Краткие теоретические сведения
- •2.1.1. Алгоритмы поиска
- •2.1.2. Алгоритмы сортировки
- •2.2. Индивидуальные задания
- •Лабораторная работа №3. Динамическая структура стек
- •3.1. Краткие теоретические сведения
- •3.2. Пример выполнения задания
- •3.2.1. Реализация задания в оконном приложении
- •3.2.2. Реализация задания в консольном приложении
- •3.3. Индивидуальные задания
- •Лабораторная работа №4. Динамическая структура очередь
- •4.1. Краткие теоретические сведения
- •Создание первого элемента
- •Добавление элемента
- •Просмотр списка
- •Алгоритм удаления элемента в списке по ключу
- •4.2. Пример выполнения задания
- •4.2.1. Реализация задания в оконном приложении
- •4.2.2. Реализация задания в консольном приложении
- •4.3. Индивидуальные задания
- •Лабораторная работа №5. Обратная польская запись
- •5.1. Краткие теоретические сведения
- •5.2. Пример выполнения задания
- •5.3. Индивидуальные задания
- •Лабораторная работа №6. Нелинейные списки
- •6.1. Краткие теоретические сведения
- •Функция просмотра элементов дерева
- •Функция освобождения памяти, занятой деревом
- •6.2. Пример выполнения задания
- •6.3. Индивидуальные задания
- •Лабораторная работа №7. Алгоритмы поиска корней уравнений
- •7.1. Краткие теоретические сведения
- •Метод простой итерации
- •Метод Ньютона (метод касательных)
- •Метод секущих
- •Метод Вегстейна
- •Метод деления отрезка пополам
- •7.2. Пример выполнения задания
- •7.3. Индивидуальные задания
- •Лабораторная работа №8. Аппроксимация функций
- •8.1. Краткие теоретические сведения
- •Интерполяционный многочлен Ньютона
- •Линейная и квадратичная интерполяции
- •Интерполяционный многочлен Лагранжа
- •8.2. Пример выполнения задания
- •8.3. Индивидуальные задания
- •Лабораторная работа №9. Алгоритмы вычисления интегралов
- •9.1. Краткие теоретические сведения
- •Формула средних
- •9.2. Пример выполнения задания
- •9.3. Индивидуальные задания
- •Литература
- •Учебное издание
- •Часть 2
- •220013, Минск, п. Бровки, 6
1.2. Пример выполнения задания
Написать программу вычисления факториала положительногочислаn, содержащую функции пользователя с рекурсией и без рекурсии.
1.2.1. Реализация задания в оконном приложении
Вид формы и полученные результаты представлены на рис. 1.1. Компонента Edit1 используется для вводаn, а компонентыEdit2 иEdit3 – для вывода результатов.
Листинг программы может иметь следующий вид:
Блок-схема функции-обработчика Button1Clickпредставлена на рис. 1.2.
. . .
double Faktorial(int);
double Faktorial_R(int);
//--------------------- Кнопка START ---------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int n = StrToInt(Edit1->Text);
switch(RadioGroup1->ItemIndex) {
case 0:
Edit2->Text = FloatToStrF(Faktorial_R(n), ffFixed, 8, 1);
break;
case 1:
Edit3->Text = FloatToStrF(Faktorial(n), ffFixed, 8, 1);
break;
}
}
//------------------ Функция без рекурсии ---------------------------------------
double Faktorial(int n) {
double f = 1;
for (int i = 1; i <= n; i++) f *= i;
return f;
}
//------------------- Рекурсивная функция ----------------------------------------
double Faktorial_R(int n) {
if (n < 2) return 1;
else
return n*Faktorial_R(n-1);
}
Рис. 1.1
Рис. 1.2
Блок-схемы функций пользователя Faktorial_RиFaktorialпредставлены на рис. 1.3.
Рис. 1.3
1.2.2. Реализация задания в консольном приложении
Тексты функций пользователя смотрите в предыдущем примере, а листинг основной функции может иметь следующий вид:
…
#include <iostream.h>
…
double Faktorial(int);
double Faktorial_R(int);
void main(void)
{
int n, kod;
while(true) { // Бесконечный цикл с выходом поdefault
cout << "\n\tInput n " ;
cin >> n;
cout << "\n Recurs – 0\n Simple – 1\n Else – Exit" << endl ;
cin >> kod;
switch(kod) {
case 0:
cout << "\t Recurs = " << Faktorial_R(n) << endl;
break;
case 1:
cout << "\t Simple = " << Faktorial(n) << endl;
break;
default:return;
}
}
1.3. Индивидуальные задания
Составить алгоритм в виде блок-схемы, написать и отладить поставленную задачу с использованием рекурсивной и обычной функций. Сравнить полученные результаты.
1. Для заданного целого десятичного числа Nполучить его представление вp-ичной системе счисления (p < 10).
2. В упорядоченном массиве целых чисел ai(i = 1, ...,n) найти номер находящегося в массиве элементаc, используя метод двоичного поиска.
3. Найти наибольший общий делитель чисел M иN, используя теорему Эйлера: еслиM делится наN, тоНОД (N,M) = N, иначеНОД (N,M) = (M%N, N).
4. Числа Фибоначчи определяются следующим образом: Fb(0)=0; Fb(1)=1; Fb(n) =Fb(n–1) +Fb(n–2). ОпределитьFb(n).
5. Найти значение функции Аккермана A(m,n), которая определяется для всех неотрицательных целых аргументовmиnследующим образом:
A(0, n) = n + 1;
A(m, 0) = A(m–1, 1); при m > 0;
A(m, n) = A(m–1, A(m, n–1)); при m > 0 и n > 0.
6. Найти методом деления отрезка пополам минимум функции f(x) = 7sin2(x) на отрезке [2, 6] с заданной точностью(например, 0.01).
7. Вычислить значение x =, используя рекуррентную формулуxn=, в качестве начального значения использоватьx0 = 0,5(1 +a).
8. Найти максимальный элемент в массиве ai(i=1,,n), используя очевидное соотношениеmax(a1,,an) =max[max(a1,,an–1),an].
9. Вычислить значение y(n) =.
10. Найти максимальный элемент в массиве ai(i=1,,n), используя соотношение (деления пополам)max(a1,,an) =max[max(a1,,an/2),max(an/2+1,,an)].
11. Вычислить значение y(n) =.
12. Вычислить произведение четного количества n(n2) сомножителей следующего видаy =.
13. Вычислить y =xn по следующему правилу:y = (xn/2 )2, еслиnчетное иy =x yn–1, еслиn нечетное.
14. Вычислить значение (значение 0! = 1).
15. Вычислить y(n) =,nзадает число ступеней.
16. В заданном массиве заменить все числа, граничащие с цифрой «1», нулями.