- •Лекция 1 Создание консольного приложения
- •2. Консоль. Построение консольного проекта
- •3. Запуск приложения
- •4. Сохранение и редактирование проекта
- •Лекция 2
- •4. Функции форматированного ввода и вывода
- •4.1. Функция форматированного ввода с клавиатуры
- •4.2. Функция форматированного вывода на экран
- •5. Математические функции
- •Лекция 3 Линейные вычислительные процессы
- •1. Алгоритм. Управляющие структуры
- •2. Линейные вычислительные алгоритмы
- •2.1. Условный оператор if()
- •2.2. Условное выражение
- •2.3. Оператор выбора switch()
- •Лекция 5 Программирование разветвляющихся вычислительных процессов
- •Лекция 6 Циклические вычислительные процессы.
- •1. Типы циклов
- •3. Операторы безусловного перехода
- •Лекция 7 Вычисление последовательностей
- •4. Примеры вычисления последовательностей
- •5. Структура алгоритмов вычисления рекуррентных последовательностей
- •Лекция 8 Одномерные массивы
- •1. Массивы
- •1.1. Примеры программ обработки одномерных массивов
- •1.2. Сортировка выбором
- •1.3. Сортировка простыми вставками
- •Лекция 10 Двухмерные массивы
- •1. Двухмерные массивы
- •Лекция 11 Алгоритмы матричной алгебры
- •1. Алгоритмы матричной алгебры
- •Лекция 12 Динамические массивы
- •1. Память компьютера. Адресное пространство
- •2. Динамическая память
- •3. Адреса и указатели
- •4. Указатели и массивы. Динамические массивы
- •5. Проблемы, связанные с указателями
- •6. Поразрядные операции
- •1.2. Способы объявления и обращения к элементам двухмерных массивов
- •Лекция 14 Символы и строки
- •1. Символьный тип данных
- •2. Строки
- •Лекция 15 Структуры
- •1. Понятие структуры
- •2. Определение нового имени типа
- •3. Массивы структур. Указатели на структуры
- •3.1. Определение статического массива структур
- •3.1. Определение динамического массива из n структур
- •Лекция 16 Файлы
- •1. Потоковый ввод-вывод данных
- •3. Понятие файла. Функции работы с файлами
- •Лекция 17 Файлы
- •Лекция 18 Функции пользователя
- •I. Приёмы построения алгоритмов
- •2. Понятие функции
- •2.1. Определение функции
- •2.2. Область видимости переменных
- •2.3. Параметры функции
- •2.4. Описание функции
- •2.5. Организация вызова функции
- •2.5. Передача параметров в функцию
- •3. Рекурсия
- •Лекция 20 Нахождение приближенного значения корня нелинейного уравнения
- •На отрезке [a;b] с заданной точностью eps
- •1.1. Метод дихотомии (половинного деления)
- •1.2. Метод хорд
- •1.3. Метод касательных (Ньютона)
- •Лекция 22 Объектно-ориентированное программирование
- •Полиморфизм – это свойство класса, позволяющее определить одно и то же по имени, но разное по смыслу действие. Основные этапы ооп:
- •Уточнённое имя принадлежит классу (т.Е. Компонентной) функции
- •Лекция 23 Объектно-ориентированное программирование
- •1. Конструкторы и деструкторы
- •1.2. Определение компонентных функций
- •Лекция 25 Объектно-ориентированное программирование
- •1. Свойства классов
- •1.1. Наследование классов
- •1.2. Полиморфизм
- •Библиографический список
3. Рекурсия
В языке С++ допустимо рекурсивное определение функций, при котором функция может вызывать сама себя. Надо сказать, что такие функции работают медленнее, чем нерекурсивные. Однако они незаменимы при обработке динамических структур, например деревьев.
Пример. Вычислить сумму факториалов целых чисел, принадлежащих отрезку [m;n].
Это классическая задача, которую можно решить с использованием рекурсивной функции.
Ход выполнения работы
-
В файле f.h опишем рекурсивную функцию, вычисляющую факториал числа n:
int fact(int n)
{
if(n= =0 || n= =1) return 1;
else
return n*fact(n-1);
}
Как видно, среди операторов тела функции происходит ее вызов, т.е. функция является рекурсивной.
В файле главной функции запишем основной алгоритм решения задачи на языке С++:
#include "stdio.h"
#include "stdlib.h"
#include "iostream.h"
#include "iomanip.h"
#include "f.h"
int main()
{
int i, n, m, s;
cout<<"Введите границы отрезка m=";
cin>>m;
cout<<"n=";
cin>>n;
if(m<n)
{
//вычислим сумму
s=0;
for(i=m; i<=n; i++)
//вызываем функцию fact(); ее аргумент изменяется в цикле
s=s+fact(i);
//выведем значение суммы на экран
cout<<"summa="<<s<<endl;
}
else
cout<<"Границы отрезка введены неверно"<<endl;
return 1;
}
Примечание. При вычислении 4! функция fact() будет вызывать сама себя три раза следующим образом:
4*fact(3)
3*fact(2)
2*fact(1)
Как только значение параметра этой функции достигнет 1, результат ее работы будет вычисляться в обратном порядке:
2*1=2
3*2=6
4*6=24
Лекция 20 Нахождение приближенного значения корня нелинейного уравнения
Цели:
-
познакомиться с алгоритмами нахождения приближенного значения корня нелинейного уравнения на заданном отрезке с заданной точностью;
-
методику написания и перевода таких алгоритмов на язык программирования С++ и разработки соответствующего проекта в среде Visual C++ 6.0.
Нелинейные уравнения – это уравнения, в которые переменная входит в степени больше чем 1. Решить уравнение – значит, найти его корень. Корнем называется такое значение переменной, при подстановке которого в уравнение вместо переменной уравнение превращается в верное равенство.
1. Методы нахождения корней уравнения f(x)=0
На отрезке [a;b] с заданной точностью eps
Постановка задачи заключается в следующем. Дан отрезок [a;b], на котором находится корень уравнения f(x)=0. Найти с заданной точностью eps корень этого уравнения. Рассмотрим три метода нахождения корней нелинейных уравнений.
1.1. Метод дихотомии (половинного деления)
Данный метод основывается на утверждении, что если на отрезке [a;b] содержится корень уравнения, то значения f(a) и f(b) имеют разные знаки, т.е. f(a)·f(b)<0.
Схема метода
Отрезок делится пополам – середина обозначается через точку c (рис.14). Если |a-b|>=eps, то вычисле-ния продолжаются. Эта проверка означает, что если |a-b|<eps, то длина отрезка, на котором находится корень уравнения, достаточна мала и вычисления можно прекратить, а за значение корня можно взять середину этого отрезка, т.е. корень уравнения вычислен с заданной точность eps. Происходит проверка f(a)·f(c)<0 или нет. Если да, то значение c присваивается перемен-ной b, иначе значение c присваива-ется переменной a. Если |a-b|>=eps, то опять происходит проверка f(a)·f(c)<0 или нет. Если да, то значение c присваивается переменной b, иначе значение c присваивается перемен- ной a и т.д. Графически этот метод изображен на рис.14.
Опишем алгоритм и соответствующую программу для нахождения корней уравнения ln(x-3)=0 на отрезке [3.5;5] с помощью этого метода:
Алгоритм |
Программа |
объявление вещ: fa, fb, fc, a, b, c, eps ввод а ввод b fa=ln(a-3) fb=ln(b-3) если fa*fb<0 ввод eps c=(a+b)/2 fc=log(c-3) пока (|a-b|>=eps ) если (fa*fc<0) b=c иначе a=c; всё если c=(a+b)/2 fa=ln(a-3) fb=ln(b-3) fc=ln(c-3) всё пока печать c печать fc иначе печать “на отрезке нет корня” все_если
|
#include "stdio.h" #include "math.h" #include "iostream.h" #include "iomanip.h" int main() { float fa, fb, fc, a, b, c, eps; cout<<"a="; cin>>a; cout<<"b="; cin>>b; fa=log(a-3); fb=log(b-3); if(fa*fb<0) { cout<<"eps="; cin>>eps; c=(a+b)/2; fc=log(c-3); while(fabs(a-b)>=eps) { if(fa*fc<0) b=c; else a=c; //вычисляется новая середина //отрезка c=(a+b)/2; //вычисляются значения //функций в новых точках fa=log(a-3); fb=log(b-3); fc=log(c-3); } cout<<"корень уравнения х*="<<c<<endl; cout<<"значение f(x*)="<<fc<<endl; } else cout<<"неверно введены концы" <<"отрезка"<<endl; return 1; } |