Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР.doc
Скачиваний:
0
Добавлен:
31.12.2025
Размер:
795.65 Кб
Скачать

Задание 3

Вычисление определённого интеграла методом прямоугольников:

Приближенное значение определенного интеграла вычисляется как сумма площадей N прямоугольников, построенных на интервале интегриро­вания [a,b]. Интервал [a,b] разбивается на N равных частей длиной h = (b-a)/N, на каждой из которых строится прямоугольник с высотой, рав­ной значению функции f(xi) в центре участка с координатой xi = a+(i-0.5)h, где i=1,2,...,N

Формула прямоугольников для приближенного вычисления значения интеграла будет иметь вид

Вычисление определённого интеграла методом трапеций:

В методе трапеций интервал [a,b] разбивается на N равных частей длиной h=(b-a)/N, на каждой из которых строится трапеция. Приближен­ное значение интеграла определяется суммой площадей трапеций, постро­енных на интервале [a,b] , где xi =a+i* h :

Общая схема алгоритма

Разделы расчётно-графической работы:

- анимированная заставка;

- информация об авторе;

- вычисление функций с выводом результатов в виде таблицы;

- построение графиков функций;

- решение уравнения;

- вычисление определенного интеграла;

- выход из программы.

Для удобства взаимодействия с программой было разработано меню, управляемое клавишами стрелок на клавиатуре.

На рисунке 1 представлена схема алгоритма главной функции, в которой вызываются подфункции.

Рисунок 1 – Общая схема алгоритма

Детальные схемы алгоритмов

На рисунке 2 представлена схема алгоритма вычисления значений двух функций с выводом результатов в виде таблицы. Программа вычисляет значения функций на интервале [1; 1] в 12 равномерно распределённых точках, затем выводит результаты в виде таблицы, выделяя жёлтым цветом наибольшие значения функций и фиолетовым цветом наименьшие.

Рисунок 2 – Схема алгоритма построения таблицы значений функций

На рисунке 3 представлена схема алгоритма построения графиков функций F1 и F2. Сначала строятся оси координат Ox и Oy, затем выводятся надписи самих функций F1 и F2 и, наконец, выполняется построение графиков.

Рисунок 3 – Схема алгоритма построения графиков функций

Н

а рисунке 4 представлены схемы алгоритмов решения уравнения методами половинного деления и хорд.

Рисунок 4 – Схема алгоритма решения уравнения

Продолжение рисунка 4 – Схема алгоритма решения уравнения

На рисунке 5 представлены схемы алгоритмов вычисления определенного интеграла методом прямоугольников и трапеций.

Рисунок 5 – Схема алгоритма вычисления определённого интеграла

Продолжение рисунка 5 – Схема алгоритма вычисления определённого интеграла

Текст программы

#include <math.h>

#include <iomanip>

#include <stdlib.h>

#include <windows.h>

#include <iostream>

#include <conio.h>

#include <locale.h>

using namespace std;

void drawNLO(HDC hdc, int x, int y, COLORREF color = RGB(99, 102, 106))

{

HBRUSH bodyBrush = CreateSolidBrush(color);

SelectObject(hdc, bodyBrush);

Ellipse(hdc, x - 40, y - 10, x + 40, y + 10);

DeleteObject(bodyBrush);

HBRUSH domeBrush = CreateSolidBrush(RGB(54, 69, 79));

SelectObject(hdc, domeBrush);

Ellipse(hdc, x - 20, y - 25, x + 20, y - 5);

DeleteObject(domeBrush);

}

void clearNLO(HDC hdc, int x, int y)

{

RECT r = { x - 60, y - 40, x + 60, y + 100 };

FillRect(hdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));

}

void Effect(HDC hdc, int x, int y)

{

for (int i = 0; i < 2; i++)

{

HBRUSH flash = CreateSolidBrush(RGB(95, 210, 180));

SelectObject(hdc, flash);

Ellipse(hdc, x - 60, y + 20, x + 60, y + 50);

DeleteObject(flash);

Sleep(100);

RECT r = { x - 65, y + 15, x + 65, y + 55 };

FillRect(hdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));

Sleep(100);

}

}

void fly(HDC hdc, int startX, int startY, int targetX, int targetY)

{

const int step = 60;

for (int i = 0; i <= step; ++i)

{

float t = (float)i / step;

int x = (int)(startX + t * (targetX - startX));

int y = (int)(startY + t * (targetY - startY));

drawNLO(hdc, x, y);

Sleep(15);

clearNLO(hdc, x, y);

}

drawNLO(hdc, targetX, targetY);

Effect(hdc, targetX, targetY);

Sleep(300);

clearNLO(hdc, targetX, targetY);

}

void zastavka()

{

srand((unsigned)time(0));

HWND hwnd = GetConsoleWindow();

HDC hdc = GetDC(hwnd);

const int w = 1200;

const int h = 600;

const int m = 60;

RECT rect = { 0, 0, w, h };

FillRect(hdc, &rect, (HBRUSH)GetStockObject(BLACK_BRUSH));

POINT targets[4];

for (int i = 0; i < 4; i++)

{

targets[i].x = rand() % (w - 2 * m) + m;

targets[i].y = rand() % (h - 2 * m) + m;

}

for (int i = 0; i < 4; i++)

{

int startX = rand() % (w - 2 * m) + m;

int startY = -50;

fly(hdc, startX, startY, targets[i].x, targets[i].y);

Sleep(500);

}

_getch();

}

int maiшn()

{

zastavka();

return 0;

}

void avtor()

{

cout << "\n\n\n\n\n\n\n\t\t\t\t\t\t\x1b[36mРАСЧЁТНО-ГРАФИЧЕСКАЯ РАБОТА\n";

cout << "\t\t\t\t\t\t ПО ПРОГРАММИРОВАНИЮ\x1b[37m\n\n\n\n\n";

cout << "\t\t\t\t\t\t\x1b[96m БИБИКОВА АННА\n";

cout << "\t\t\t\t\t\t ФИТИКС, ИВТ-245\n";

cout << "\t\t\t\t\t\t 1 КУРС\n";

cout << "\t\t\t\t\t\t ОМСК, 2025\x1b[94m\n\n\n\n\n\n\n\n\n\n\n ";

}

void tabl()

{

int a = 1.0;

int b = 3.0;

int n = 15.0;

int i;

float X[15]{}, F1[15]{}, F2[15]{}, x, s;

s = fabs(b - a) / (n - 1);

x = a;

for (i = 0; i < n; i++)

{

F1[i] = sqrt(exp(x) - 1);

F2[i] = x * pow(log(x), 2);

X[i] = x;

x = x + s;

}

cout << fixed << setprecision(6);

float f1min = 5, f1max = 0, f2min = 5, f2max = 0;

for (i = 0; i < n; i++)

{

if (F1[i] > f1max)

f1max = F1[i];

if (F1[i] < f1min)

f1min = F1[i];

if (F2[i] > f2max)

f2max = F2[i];

if (F2[i] < f2min)

f2min = F2[i];

}

cout << "\n\t\t\t\t\t ------------------------------------------\n";

cout << "\t\t\t\t\t| i | x | f1 | f2 |\n";

cout << "\t\t\t\t\t ------------------------------------------\n";

for (i = 0; i < n; ++i) {

if (F1[i] == f1max)

cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | \x1b[33m" << F1[i] << " \x1b[37m| " << F2[i] << " |\n";

else if (F2[i] == f2max)

cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | " << F1[i] << " | \x1b[33m" << F2[i] << "\x1b[37m |\n";

else if (F1[i] == f1min)

cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | \x1b[35m" << F1[i] << " \x1b[37m| " << F2[i] << " |\n";

else if (F2[i] == f2min)

cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | " << F1[i] << " | \x1b[35m" << F2[i] << "\x1b[37m |\n";

else

cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | " << F1[i] << " | " << F2[i] << " |\n";

}

cout << "\n";

cout << "\n\n\n\n НАИБОЛЬШИЕ ЗНАЧЕНИЯ ФУНКЦИЙ ВЫДЕЛЕНЫ: \x1b[33m ЖЁЛТЫМ ЦВЕТОМ\x1b[37m.\n\n";

cout << " МИНИМАЛЬНЫЕ ЗНАЧЕНИЯ ФУНКЦИЙ ВЫДЕЛЕНЫ: \x1b[35m ФИОЛЕТОВЫМ ЦВЕТОМ\x1b[37m.\n\n\n\n\n ";

cout << "\n\n\n\n\n\n\n ";

_getch();

}

void grafic()

{

system("cls");

int flag;

HDC screen = GetDC(GetConsoleWindow());

HPEN pen = CreatePen(PS_DASH, 1, RGB(255, 255, 255));

SelectObject(screen, pen);

int start_x = 500;

int start_y = 270;

MoveToEx(screen, start_x - 400, start_y, NULL);

LineTo(screen, start_x + 400, start_y);

MoveToEx(screen, start_x, start_y - 250, NULL);

LineTo(screen, start_x, start_y + 250);

MoveToEx(screen, start_x + 380, start_y + 7, NULL);

LineTo(screen, start_x + 400, start_y);

LineTo(screen, start_x + 380, start_y - 7);

MoveToEx(screen, start_x + 7, start_y - 230, NULL);

LineTo(screen, start_x, start_y - 250);

LineTo(screen, start_x - 7, start_y - 230);

for (int i = -375; i <= 360; i += 25)

{

MoveToEx(screen, start_x + i, start_y - 5, NULL);

LineTo(screen, start_x + i, start_y + 5);

}

for (int i = -210; i <= 240; i += 25)

{

MoveToEx(screen, start_x - 5, start_y + i, NULL);

LineTo(screen, start_x + 5, start_y + i);

}

SetBkMode(screen, TRANSPARENT);

SetTextColor(screen, RGB(255, 255, 255));

TextOut(screen, start_x + 15, start_y - 240, L"Y", 1);

TextOut(screen, start_x + 380, start_y + 15, L"X", 1);

TextOut(screen, start_x - 12, start_y + 2, L"0", 1);

TextOut(screen, start_x + 10, start_y + 6, L"1", 1);

TextOut(screen, start_x - 17, start_y - 27, L"1", 1);

SetTextColor(screen, RGB(255, 153, 51));

TextOut(screen, start_x + 140, start_y - 260, L"y = x * pow(log(x), 2)", 25);

SetTextColor(screen, RGB(0, 153, 153));

TextOut(screen, start_x + 140, start_y - 240, L"y = sqrt(exp(x) - 1)", 25);

HPEN first_pen = CreatePen(PS_DASH, 1, RGB(255, 153, 51));

HPEN second_pen = CreatePen(PS_DASH, 1, RGB(0, 153, 153));

int i = 1;

for (double x = -20.0; x <= 20.0; x += 0.001)

{

SelectObject(screen, first_pen);

MoveToEx(screen, 30 * x + start_x, -30 * x * pow(log(x), 2) + start_y, NULL);

LineTo(screen, 30 * (x + 0.1) + start_x, -30 * x * pow(log(x), 2) + start_y);

SelectObject(screen, second_pen);

MoveToEx(screen, 30 * x + start_x, -30 * sqrt(exp(x) - 1) + start_y, NULL);

LineTo(screen, 30 * (x + 0.1) + start_x, -30 * sqrt(exp(x) - 1) + start_y);

i++;

if (i % 50 == 0) Sleep(0.5);

}

cout << "\n ";

_getch();

}

float function_uravn(float x)

{

return 2*x * log10(x) - 3;

}

float met_bis(float a, float b, float e)

{

float c;

while ((b - a) >= e)

{

c = (a + b) / 2;

if (function_uravn(c) == 0)

break;

else if (function_uravn(c) * function_uravn(a) < 0)

b = c;

else

a = c;

}

return c;

}

float met_hor(float a, float b, float e)

{

float c;

while ((b - a) >= e)

{

c = (a * function_uravn(b) - b * function_uravn(a)) / (function_uravn(b) - function_uravn(a));

if (function_uravn(c) == 0)

break;

else if (function_uravn(c) * function_uravn(a) < 0)

b = c;

else

a = c;

}

return c;

}

void uravnenie()

{

float a, b, e = 0.001;

cout << "\n y = 2x*log10(x-3)\x1b[36m\n\n";

cout << " ВВЕДИТЕ A: \x1b[36m";

cin >> a;

cout << "\n\x1b[96m ВВЕДИТЕ B: \x1b[96m";

cin >> b;

cout << "\n\x1b[94m ИНТЕРВАЛ: \x1b[37m[" << a << ", " << b << "]\x1b[37m\n\n";

cout << "\x1b[96m ТОЧНОСТЬ: \x1b[96m" << e << endl;

float x = met_bis(a, b, e);

cout << "\n\x1b[94m МЕТОД БИСЕКЦИИ: \x1b[94m" << x;

x = met_hor(a, b, e);

cout << "\n\n\x1b[96m МЕТОД ХОРД: \x1b[96m" << x;

cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n ";

}

float function_integral(float x)

{

return (log10(1 + x) / (1 + x * x));

}

float met_pr(int N, float a, float b)

{

float h = (b - a) / N;

float integral = 0;

for (int i = 0; i < N; i++)

{

float x_i = a + i * h;

integral += function_integral(x_i) * h;

}

return integral;

}

float met_tr(int N, float a, float b)

{

float h = (b - a) / N;

float integral = 0;

integral += (function_integral(a) + function_integral(a + h)) / 2;

for (int i = 0; i < N; i++)

{

float x_i = a + i * h;

integral += function_integral(x_i) * h;

}

return integral;

}

void integral()

{

float a, b;

int N;

cout << "\n РЕШЕНИЕ ИНТЕГРАЛА \x1b[36mb|a(lg(1 + x) / (1 + x^2))dx)\x1b[37m\n\n";

cout << " ВВЕДИТЕ КОЛИЧЕСТВО ИТЕРАЦИЙ N: \x1b[36m";

cin >> N;

cout << "\n\x1b[37m ВВЕДИТЕ ГРАНИЦУ ИНТЕРВАЛА А: \x1b[36m";

cin >> a;

cout << "\n\x1b[37m ВВЕДИТЕ ГРАНИЦУ ИНТЕРВАЛА B: \x1b[36m";

cin >> b;

float resultat = met_pr(N, a, b);

cout << "\n\x1b[37m МЕТОД ПРЯМОУГОЛЬНИКОВ: \x1b[36m" << resultat << endl;

resultat = met_tr(N, a, b);

cout << "\n\x1b[37m МЕТОД ТРАПЕЦИЙ: \x1b[36m" << resultat;

cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\x1b[37m ";

}

void close()

{

exit(0);

}

int main()

{

setlocale(LC_ALL, "ru");

int option = 0;

while (true)

{

system("color 0B");

system("cls");

cout << "\n\n\n\t\t\t\t\t\t \x1b[37m>\x1b[36m МЕНЮ \x1b[37m<\x1b[36m\x1b[0m\n\n";

cout << (option == 1 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ЗАСТАВКА\x1b[37m\n";

cout << (option == 2 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ОБ АВТОРЕ\x1b[37m\n";

cout << (option == 3 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ТАБЛИЦА\x1b[37m\n";

cout << (option == 4 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ГРАФИК\x1b[37m\n";

cout << (option == 5 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " УРАВНЕНИЕ\x1b[37m\n";

cout << (option == 6 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ИНТЕГРАЛ\x1b[37m\n";

cout << (option == 7 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ВЫХОД\x1b[37m";

char input = _getch();

switch (input)

{

case 72:

option = (option > 1) ? option - 1 : 7;

break;

case 80:

option = (option < 7) ? option + 1 : 1;

break;

case '\r':

system("cls");

switch (option)

{

case 1:

zastavka();

break;

case 2:

avtor();

break;

case 3:

tabl();

break;

case 4:

grafic();

break;

case 5:

uravnenie();

break;

case 6:

integral();

break;

case 7:

close();

break;

}

system("pause");

break;

}

}

return 0;

}

Соседние файлы в предмете Программирование