Задание на лабораторную работу
Разработать программу для вывода на экран функции sin2(x/2)-sqrt(x). График должен быть отрисован в диапазоне от π/2 до 13π;
Произвести разметку осей и проставить истинные значения точек;
Найти максимальное значение функции на заданном интервале и вывести в отдельное окно на экране вместе с графиком.
Алгоритмы и тексты отлаженных программ
Функция Func (Рисунок 1), определяющая заданную функцию.
Рисунок 1 — Функция Func
Функция DrawLine (Рисунок 2), обеспечивающая построение линии заданной функции.
Рисунок 2 — Функция DrawLine
Функция
ScaleX
(Рисунок 3), задающая
нужный масштаб
относительно центра.
Рисунок 3 — Функция ScaleX
Фукция
ScaleY,
задающая
нужный масштаб координаты
относительно центра.
Рисунок 4 — Функция ScaleY
Функция main (Рисунок 5 - а, б), обеспечивающая выполнение основного задания.
Рисунок
5(а)
— Функция main
- начало.
Рисунок 5(б) — Функция main - конец
Текст программы:
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
const int SCALE = 13;
const int SCALEY = 30;
const double PI = 3.14159;
double Func(double x)
{
return pow(sin(x / 2), 2) - sqrt(x);
}
void DrawLine(int moveToX, int moveToY, int drawX, int drawY, int color)
{
moveto(moveToX, moveToY);
setcolor(color);
lineto(drawX, drawY);
}
double ScaleX(double x, int x_center)
{
return x_center + int(x * SCALE);
}
double ScaleY(double y, int y_center)
{
return y_center + int(y * SCALEY);
}
int main(void)
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "c:/turboc3/bgi");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
int WIDTH = getmaxx(), HEIGHT = getmaxy();
setbkcolor(15);
cleardevice();
int center_x = 40, center_y = HEIGHT / 2;
DrawLine(center_x - 20, center_y, WIDTH - 20, center_y, 9);
DrawLine(center_x, 20, center_x, HEIGHT - 20, 9);
float n = 0.5;
char temp_ar1[6];
for (int x_d = SCALE * (PI / 2) + center_x; x_d < WIDTH - 20; x_d += SCALE * (PI * 2.5))
{
DrawLine(x_d, center_y + 5, x_d, center_y - 5, 9);
sprintf(temp_ar1, "%.1f", n);
outtextxy(x_d - 15, center_y + 7, temp_ar1);
sprintf(temp_ar1, "Pi");
outtextxy(x_d - 13, center_y + 16, temp_ar1);
n += 2.5;
}
int v = 1, y_d;
char temp_ar2[2];
int digit_height = textheight("0");
outtextxy(center_x - 13, center_y + (digit_height)-1, "0");
for (y_d = center_y - SCALEY; y_d >= 20; y_d -= 1 * SCALEY)
{
DrawLine(center_x - 5, y_d, center_x + 5, y_d, 9);
sprintf(temp_ar2, "%i", v++);
outtextxy(center_x - 13, y_d - 4, temp_ar2);
}
int miunus_width = textwidth("-");
int z = 1;
for (y_d = center_y + SCALEY; y_d <= HEIGHT - 20; y_d += 1 * SCALEY)
{
DrawLine(center_x - 5, y_d, center_x + 5, y_d, 9);
sprintf(temp_ar2, "-%i", z++);
outtextxy(center_x - (13 + miunus_width), y_d - 4, temp_ar2);
}
double max_y = -1000.0;
for (double x = PI / 2; x <= PI * 13; x += 0.01)
{
double y = Func(x);
if (max_y < y)
max_y = y;
putpixel(ScaleX(x, center_x), ScaleY(-y, center_y), 12);
delay(1);
}
setcolor(9);
setlinestyle(0, 1, 3);
rectangle(WIDTH - 450, HEIGHT - 400, WIDTH - 190, HEIGHT - 350);
settextstyle(0, HORIZ_DIR, 2);
char temp_ar3[20];
sprintf(temp_ar3, "f(x) max = %.1f", max_y);
outtextxy(WIDTH - 440, HEIGHT - 380, temp_ar3);
getch();
closegraph();
return 0;
}
