- •Конспект лекций по дисциплине «алгоритмизация и программирование»
- •Лекция № 1. Основные понятия
- •Использование ключевого слова using
- •2: Int main()
- •4: Using std::cout; // Вместо этих двух строк можно записать
- •5: Using std::endl; /* одну: using namespace std;*/
- •20: Return 0;
- •Комментарии
- •Функции
- •Переменные
- •Лекция № 3. Операторы
- •Математические операторы
- •Математические функции
- •Логические операторы
- •Операторы отношения
- •Операторы переходов по условию
- •Лекция № 4. Циклы
- •Оператор goto
- •Оператор цикла while
- •Операторы break и continue
- •Оператор цикла do..While
- •Оператор цикла for
- •Int main ()
- •Лекция № 5. Массивы
- •Одномерные массивы
- •Int main()
- •Многомерные массивы
- •Массивы символов (строки)
- •Int main()
- •Лекция № 6. Некоторые простые алгоритмы
- •Поиск максимального (или минимального) числа из выборки чисел
- •Int main()
- •Пузырьковая сортировка (bubble sort)
- •Void exch(double &a, double &b)
- •Лекция № 7. Численное решение уравнений
- •Теоретические основы
- •Метод простого перебора
- •Int RootSearch (double p[], int n, double a, double b, double dx);
- •Int main ()
- •Int RootSearch (double p[], int n, double a, double b, double dx)
- •Метод половинного деления
- •Метод Ньютона-Рафсона
- •Лекция № 8. Основы объектно-ориентированного программирования
- •Введение
- •Void Meow();
- •Закрытые и открытые члены класса
- •Void Meow();
- •Int main()
- •Void Meow();
- •Лекция № 9. Конструкторы и деструкторы
- •Определение
- •Int Weight;
- •Файлы заголовков
- •Встраиваемые функции
- •Лекция № 10. Классы, содержащие другие классы как данные-члены
- •Сложные классы
- •Структуры
Void exch(double &a, double &b)
{ a=a+b; b=a-b; a=a-b; }
Эта программа использует меньше памяти, однако требуется комментарий, чтобы объяснить, для чего она предназначена.
Лекция № 7. Численное решение уравнений
-
Теоретические основы
Предположим, нам нужно решить кубическое уравнение
. (7.1)
Это означает, что нужно найти корни уравнения – такие числа, которые обращают уравнение в ноль, если приравнять неизвестную переменную x какому-либо из этих чисел. Основная теорема алгебры утверждает, что корней может быть несколько, причем, некоторые из них могут являться комплексными числами. Обычно практический интерес представляют только действительные корни. Убедиться в наличии действительных корней в уравнении (7.1) можно путем построения графика функции
. (7.2)
Такой график приведен на рис. 7.1.

Рис. 7.1. График функции
![]()
Как можно видеть,
действительный корень уравнения (7.1)
располагается где-то в диапазоне между
0,6 и 0,8. Если известно, что в заданном
диапазоне находится только один корень
уравнения, то функции от крайних точек
диапазона, как правило, имеют разные
знаки. Например, в случае функции,
изображенной на графике рис. 7.1,
имеет положительное значение, а
– отрицательное значение. Можно
утверждать и обратное: если значения
функции на краях интервала имеют разные
знаки, то внутри интервала содержится
корень уравнения. Однако если функция
имеет разрывы в некоторых точках, это
правило не справедливо. Например, функция
изменяет знак в точках
,
,
как показано на рис. 7.2. Однако в этих
точках нет корней уравнения, поскольку
функция
не пересекает ось
.
Такие точки
называются сингулярными.

Рис. 7.2. График функции
![]()
-
Метод простого перебора
Самым простым методом решения алгебраических уравнений является метод перебора в заданном интервале. Программа, которая реализует данный метод, представлена в листинге 7.1. Помимо основной функции main() она содержит также функции RootSearch()и Func(). В функции main() пользователь вводит исходные данные, после чего вызывается функция RootSearch(), которая непосредственно и вычисляет корень уравнения.
Листинг 7.1. Решение уравнения методом перебора
# include <iostream>
/* Прототипы функций */
Int RootSearch (double p[], int n, double a, double b, double dx);
double Func (double p[], int n, double x);
int n;
double p[10];
double a, b, dx; // Глобальные переменные
Int main ()
{
cout<<"Input degree of polynomial: ";
cin>>n;
cout<<endl;
cout<<"Input function:\n";
for (int i=0; i<(n+1); i++)
{
cin>>p[i];
}
cout<<endl;
cout<<"Input left limit: ";
cin>>a;
cout<<endl;
cout<<"Input right limit: ";
cin>>b;
cout<<endl;
cout<<"Input step: ";
cin>>dx;
cout<<endl;
RootSearch(p, n, a, b, dx);
return 0;
}
Int RootSearch (double p[], int n, double a, double b, double dx)
{
double x1, x2, f1, f2; //Локальные переменные
x1=a;
x2=a+dx;
f1=Func(p, n, x1);
f2=Func(p, n, x2);
while (f1*f2>0.0)
{
if (x1>=b)
{
cout<<"Root is not bracketed in ("<<a<<", "<<b<<")"<<"\n";
char Res;
cin>>Res;
return 0;
}
x1=x2;
f1=f2;
x2=x1+dx;
f2=Func(p, n, x2);
}
cout<<"x1: "<<x1<<"\n";
cout<<"x2: "<<x2<<"\n";
char Res;
cin>>Res;
return 0;
}
double Func (double p[], int n, double x)
{
double Sum=0;
double y=1;
for (int i=0; i<(n+1); i++)
{
Sum=Sum+p[i]*y;
y=y*x;
}
return Sum;
}
Функция Func() используется функцией RootSearch() как подпрограмма. Во второй и третьей строчках программы заявлены прототипы функций. Далее объявляются глобальные переменные, которые доступны для всех функций программы. В языке С++ глобальные переменные почти никогда не используются, поскольку существует возможность, что какая-либо из функций может изменить их значение. Альтернативой глобальным переменным являются статические переменные-члены, которые доступны всем экземплярам своего класса. Они представляют собой компромисс между глобальными данными, доступными всем элементам программы, и данными-членами, доступными только объектам этого класса.
В данной программе глобальные переменные используются в качестве примера. Угроза их несанкционированного изменения отсутствует.
В отличие от глобальных переменных локальные переменные объявляются внутри функций. После выполнения функцией своей задачи ее локальные переменные стираются из памяти.
