
- •Конспект лекций по дисциплине «алгоритмизация и программирование»
- •Лекция № 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. Классы, содержащие другие классы как данные-члены
- •Сложные классы
- •Структуры
-
Метод Ньютона-Рафсона
Алгоритм
Ньютона-Рафсона является наиболее
известным методом отыскания корней
уравнения по причине своей простоты и
высокого быстродействия. Гладкую и
непрерывную функцию
можно разложить в ряд Тейлора
.
Если
является корнем уравнения
,
то можем записать
.
Приравнивая
остаток
нулю, получим формулу Ньютона-Рафсона:
. (7.4)
Эта формула позволяет находить корень уравнения (если он существует на заданном отрезке) с заданной ошибкой за конечное число шагов. Программа, решающая заданное уравнение методом Ньютона-Рафсона, представлена в листинге 7.3.
Листинг 7.3. Решение уравнения методом Ньютона-Рафсона
#include <iostream.h>
#include <math.h>
int NewtonRaphson();
double Func(double p[], int n, double x);
double dFunc(double p[], int n, double x);
void main ()
{
NewtonRaphson();
}
int NewtonRaphson()
{
int i, n, numIter;
double p[10];
double x, dx, tol, root;
cout<<"Input degree of polynomial: ";
cin>>n;
cout<<endl;
cout<<"Input function:\n";
for (i=0; i<(n+1); i++)
{
cin>>p[i];
}
cout<<endl;
cout<<"Input x: ";
cin>>x;
cout<<endl;
tol=0.000001;
for (i=1; i<31; i++)
{
dx=-Func(p, n, x)/dFunc(p, n, x);
x=x+dx;
if (fabs(dx)<tol)
{
root=x;
numIter=i;
cout<<"Root: "<<root<<endl;
cout<<"NumIter: "<<numIter<<endl;
char Res;
cin>>Res;
return 1;
}
}
cout<<"The root isn't found";
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;
}
double dFunc (double p[], int n, double x)
{
double Sum=0;
double y=1;
for (int i=1; i<(n+1); i++)
{
Sum=Sum+i*p[i]*y;
y=y*x;
}
return Sum;
}
На рис. 7.3 показан график функции
. (7.5)
Как можно видеть, эта функция на интервале (0, 5) имеет два корня. Причем, первый корень совпадает с локальным экстремумом функции, при этом значения функции слева и справа от этого корня имеют один и тот же знак. Поэтому метод дихотомии не позволит определить этот корень. Однако метод Ньютона-Рафсона вполне способен справиться с данной проблемой.
Численные методы позволяют найти лишь один корень – даже в том случае, если уравнение имеет несколько действительных корней. Например, если в качестве исходных данных мы возьмем полином (7.5), и в качестве начального значения примем х=3, то получим корень х=2,1. Если же мы возьмем начальное значение х=3,9; то получим второй корень х=4.
Рис. 7.3. График функции
Лекция № 8. Основы объектно-ориентированного программирования
-
Введение
Язык С++ был создан как объектно-ориетированное продолжение одного из самых популярных в мире языков для разработки коммерческих программ. Язык С был разработан как нечто среднее между языками высокого уровня для бизнес-приложений (таких, как COBOL) и работающим на уровне «железа» высокоэффективным, но трудным в использовании языком ассемблер. Язык С является структурным, т.е. решение задачи разбивается на небольшие участки кода, реализующего определенные действия, которые называются процедурами.
Однако такие языки, как Smalltalk и CLU, проложили новое направление – ориентацию на объекты, что позволило объединить содержащиеся в структурах данные с процедурами, способными их обрабатывать. Такой единый блок называется объектом (object).
Мир наполнен объектами: автомобили, собаки, деревья, облака, цветы – все это объекты. Каждый объект имеет свойства (быстрый, дружелюбный, коричневый, пушистый, милый). Объекты ведут себя определенным образом (едут, лают, растут, увядают).
Программы, создаваемые в начале 21 века, значительно сложнее программ, созданных в конце прошлого века. Обычно программы на основании процедурных подходов трудно управляемы, их тяжело сопровождать и модернизировать. Графический пользовательский интерфейс, Internet, цифровая и беспроводная телефонная связь, а также поддержка новых технологий существенно увеличили сложность проектов, при этом требования пользователей к качеству пользовательского интерфейса значительно возросли.
Разработка программного обеспечения на основании объектно-ориентированных подходов оказалась выходом из тупика. Объектно-ориентированные языки программирования обеспечивают прочную связь между структурами данных и методами, с помощью которых ими манипулируют. Но самым большим преимуществом объектно-ориентированного программирования является то, что программист больше не обязан заботиться о структуре данных и управляющих функциях. Все, что необходимо, – это правильно использовать соответствующий объект.
Типы переменных, включая беззнаковые целые и символы, были описаны на предыдущих занятиях. В традиционных языках, к которым относится С, все типы встроены в язык. В С++ программист может самостоятельно расширить возможности языка, создавая собственный тип данных, необходимый для решения текущей задачи. Каждый из вновь созданных типов обладает всеми функциональными возможностями и правами встроенных типов.
В языке С++ новый тип данных создается в результате объявления класса. Класс – это набор переменных, зачастую различных типов, объединенный с набором функций, предназначенных для работы с ними.
Автомобиль, например, можно представить как набор колес, дверей, сидений, окон и т.д. Или как удобное средство передвижения, способное ехать, разгоняться, тормозить, останавливаться, парковаться и т.д. Класс позволяет собирать различные запчасти автомобиля и его разнообразные функции в один комплект, называемый объектом.
Объектно-ориетированные языки основаны на «трех китах»: инкапсуляции, наследовании и полиморфизме.
Инкапсуляция означает свойство автономности объектов, скрытности их внутреннего механизма от посторонних глаз. С помощью инкапсуляции можно обеспечить сокрытие данных. Это очень важное свойство, благодаря которому пользователь может использовать объект, не задумываясь о его внутренней работе.
Наследование означает, что можно объявить новый тип данных (класс), который будет расширением существующего класса. Об этом новом классе говорят, что он является наследником существующего класса, и называют его производным.
Полиморфизм означает, что можно вносить изменения в одноименные функции различных объектов. На греческом языке поли – это много, а морфе – это форма, таким образом дословно полиморфизм – это многообразие форм.
Инкапсуляция всего, что известно об автомобиле, в единый класс предоставляет разработчику ряд преимуществ. Когда все сведения собраны в одном объекте, к ним легче обращаться, копировать и манипулировать ими. При использовании класса можно не заботиться о том, как он устроен и какие процессы происходят внутри него.
Класс может состоять из комбинации переменных любых типов, а также других классов. Переменные в классе называют переменными-членами, или данными-членами. Класс Car (автомобиль) может иметь переменные-члены, представляющие сидения, радиоприемник, шины и т.д.
Функции в классе обычно выполняют действия над переменными-членами. Они называются функциями-членами, или методами класса. К методам класса Car можно отнести Start() (разгоняться) и Break() (тормозить). Класс Cat (кот) может иметь такие данные-члены, как Age, Weight (возраст и вес), а его методами могут быть Sleep(), Meow() и ChaseMice() (спать, мяукать и ловить мышей). Подобно переменным-членам, функции-члены являются составной частью класса. Именно они определяют, что данный класс может сделать.
Для объявления класса используется ключевой слово class, за которым следует открывающая фигурная скобка, список данных-членов и методов класса. Объявление завершается закрывающейся фигурной скобкой и точкой с запятой. Вот как выглядит объявление класса Cat:
Class Cat
{
unsigned int itsAge;
unsigned int itsWeight;