Как вывести график на си
//axes4(int x0,int y0,int xmin,int ymin,int xmax,int ymax,int bc,int gc,int fc,int ax);//constructor
//axes(int,int,int,int,int,int,int,int,int,int,int,int);
axes()
<
x0=y0=20;
xmin=-120;xmax=120;
ymin=-100;ymax=100;
bc=12;
gc=10;
fc=7;
zoom=1;
grdstp=1;
fstp=zoom/10.0;
gstp=1/fstp*grdstp;
ax=1;
a=1;
b=16;
c=8;
> //end of constructor */
void draw_grid();
void draw_function();
void clear();
>; //end of class
void graphit (char *path)
<
int gd, gm , err ;
gd = 9 ;
gm = 2 ;
initgraph (&gd, &gm, path);
err = graphresult();
/* an error occurred */
if (err != grOk)
<
printf("Graphics error: %s\n", grapherrormsg(err));
printf("Press any key to halt:");
getch();
exit(1);
>
>
void axes::init()
<
xcent=x0-xmin;
ycent=y0+ymax;
xend=xcent+xmax;
yend=ycent-ymin;
fstp=zoom/1.0;
gstp=18/fstp*3.141592*grdstp;
>
void axes::clear()
<
init();
setfillstyle(1,0);
bar(x0,y0,xend,yend);
>
void axes::draw_grid()
<
init();
if(xend>639) //.
xend=639; //.
if(yend>479) //.
yend=479; //.
setcolor(bc);
rectangle(x0,y0,xend,yend);
setcolor(fc);
if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent);
else
<
setcolor(fc-2);
if(ycent<=y0)
line(x0,y0,xend,y0);
else
line(x0,yend,xend,yend);
>
setcolor(fc);
if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend);
else
<
setcolor(fc-2);
if(xcent<=x0)
line(x0,y0,x0,yend);
else
line(xend,y0,xend,yend);
>
if(gstp<2)
gstp=0;
if(gstp&&ax)
<
for(x=-xmin%gstp+x0;x<xend;x+=gstp)
for(y=ymax%gstp+y0;y<yend;y+=gstp)
if(x>x0&&y>y0)
putpixel(x,y,gc);
>
>
void axes::draw_function()
<
int sign;
init();
for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
<
y=sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
<
if(y/fstp>ymin&&y/fstp<ymax)
<
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>
y+=sign*fstp;
>
>
>
Добавлено
вот вариант на си с тебя пиво
void graphit (char *path)
<
int gd, gm , err ;
gd = 9 ;
gm = 2 ;
initgraph (&gd, &gm, path);
err = graphresult();
/* an error occurred */
if (err != grOk)
<
printf("Graphics error: %s\n", grapherrormsg(err));
printf("Press any key to halt:");
getch();
exit(1);
>
>
void init()
<
xcent=x0-xmin;
ycent=y0+ymax;
xend=xcent+xmax;
yend=ycent-ymin;
fstp=zoom/1.0;
gstp=18/fstp*3.141592*grdstp;
>
void clear()
<
init();
setfillstyle(1,0);
bar(x0,y0,xend,yend);
>
void draw_grid()
<
init();
if(xend>639) //.
xend=639; //.
if(yend>479) //.
yend=479; //.
setcolor(bc);
rectangle(x0,y0,xend,yend);
setcolor(fc);
if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent);
else
<
setcolor(fc-2);
if(ycent<=y0)
line(x0,y0,xend,y0);
else
line(x0,yend,xend,yend);
>
setcolor(fc);
if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend);
else
<
setcolor(fc-2);
if(xcent<=x0)
line(x0,y0,x0,yend);
else
line(xend,y0,xend,yend);
>
if(gstp<2)
gstp=0;
if(gstp&&ax)
<
for(x=-xmin%gstp+x0;x<xend;x+=gstp)
for(y=ymax%gstp+y0;y<yend;y+=gstp)
if(x>x0&&y>y0)
putpixel(x,y,gc);
>
>
void draw_function()
<
int sign;
init();
for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
<
y=sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
<
if(y/fstp>ymin&&y/fstp<ymax)
<
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>
y+=sign*fstp;
>
>
>
void main()
<
char ch=' ';
int step=1;
// axes m[2];//(10,50,-100,-60,120,130,10,14,4,3,1);
graphit (bgipath) ;
x0=300;
y0=50;
xmin=-100;//left[-100];
xmax=100;//right[i];
ymin=-100;//down[i];
ymax=100;//up[i];
zoom=10;//zom[i];
draw_grid();
draw_function();
while((ch=getch())!='q')
<
switch(ch)
<
case 'e':ymax-=step;ymin-=step;break;
case 'x':ymax+=step;ymin+=step;break;
case 'd':xmin-=step;xmax-=step;break;
case 's':xmin+=step;xmax+=step;break;
case '6':zoom+=.1;break;
case '5':if(zoom>0.1)zoom-=.1;break;
case '7':if(step) step—;break;
case '8':step++;break;
case 'h':ymax=100;ymin=-100;xmin=-100;xmax=100;break;
case 'o':if(grdstp>1)grdstp—;break;
case 'p':grdstp++;
>
Код:
| for(x=-xmin%gstp+x0;x<xend;x+=gstp) < line(x,ycent-5,x,ycent+5); > |
вертикальные уж сам нарисуешь . с цифирьками не сложнее, но там нужно высчитывать когда их нужно перестать отображать, по тому как в определенный момент они будут налазить на друг друга
ln? да там все по аналогии, то что нужно учитывать что нет ln отрицательного числа
Код:
| if(xt+1<=0) < continue; > |
а то оно начинает рисовать с момента когда х=0, а не с х=-1
for(x=xmin,xt=xmin*fstp; x<=xmax; x++,xt+=fstp) <
if(xt-1<=0)
continue;
Код:
| if(ycent>y0&&ycent<yend) line(x0,ycent,xend,ycent); //если горизонтальная ось "находится" в окне else < setcolor(fc-2); if(ycent<=y0) line(x0,y0,xend,y0); //если "выше" окна верхняя грань "окна" помечается другим цветом else line(x0,yend,xend,yend);// если "ниже" окна помечается нижняя грань > setcolor(fc); if(xcent>x0&&xcent<xend) line(xcent,y0,xcent,yend); //аналогично вертикальная ось else < setcolor(fc-2); if(xcent<=x0) line(x0,y0,x0,yend); else line(xend,y0,xend,yend); > |
for(x=xmin+jmp,xt=xmin*fstp; x<=xmax-jmp; x++,xt+=fstp) <
y = sin((3.141592/180)*xt)*180/3.141592;
yt = sin((3.141592/180)*(xt+fstp))*180/3.141592;
sign = y < yt ? 1 : -1;
while(y*sign<yt*sign) <
if(y/fstp>ymin && y/fstp<ymax) <
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>
Линии лучше рисовать от центра, иначе отрезки с учетом осей будут различны:в
как я сделал:
Программа на си для построения графика функции
В этой статье мы разберем программу на языке программирования си для построения графиков функций. В нашей программе будут отражаться система координат с делениями и подписями на них и будут строиться графики двух функций, который может сам задать пользователь.
В программе на си для построения графика функции вводятся следующие константы
X0 , Y0 — координаты центра координат
k – масштаб одного деления на осях (сколько пикселов в одном делении)
Опишем все функции и процедуры используемые в программе для построения графиков функций
Подробно о задании функций и процедур в си
int osx (float x) переводит реальную координату на оси ox в координату экрана
int osy (float y) переводит реальную координату на оси oy в координату экрана
float F1 ( float x ) и float F2 ( float x ) задают функции , графики которых мы будем строить
void Point ( float x, float y, int color ) рисует точку графика функции на экране
Перед построением графиков функций необходимо построить систему координат. Для построения системы координат используется процедура
void Axes()
В этой процедуре в цикле for рисуются линии меток делений на равном расстоянии друг от друга, который определяется масштабом одного деления k и выводятся значения делений с помощью двух операторов
sprintf ( s, "%d", i ); // записываем в строковую переменную число деления
outtextxy ( xe-10, Y0+4, s ); // вывод числа
Процедура grafik1() и grafik2() строят графики функций f1 и f2
В этих процедурах в цикле for для всех доступных значений x определяется координата y и точка графика строится с помощью процедуры point()
Пример работы программы построения графиков на си, функции пользователь может менять
Программа на си для построения графиков функций
#include <stdio.h>
#include <graphics.h> //графический режим
#include <math.h> // математические функции
//————————————————
const int X0 = 100, Y0 = 400;// координаты центра координат
const float k = 15;// масштаб в точках одного деления на графике
//——————————————
// перевод y в координаты экрана
//——————————————
int osx (float x)
<
return X0+k*x;
>
//——————————————
//перевод y в координаты экрана
//——————————————
int osy (float y)
<
return Y0-k*y;
>
// первая функция
float F1 ( float x )
<
return sqrt(2*x);
>
// вторая функция
float F2 ( float x )
<
return x*x/2;
>
// построение осей
void Axes()
<
int i, xe,ye,y1;
char s[10];
line ( X0, 0, X0, 599 ); // ось ox
line ( 0, Y0, 799, Y0 ); // ось oy
// метки на оси ox
for ( i = 1; i <= (800-X0)/k; i ++ )
<
xe = osx ( i );
line ( xe, Y0-2, xe, Y0+2 ); // рисуем деление разметки
sprintf ( s, "%d", i ); // записываем в строковую переменную число деления
outtextxy ( xe-10, Y0+4, s ); // вывод числа
>
// метки на оси oy
for ( i = 1; i <= (Y0)/k; i ++ )
<
ye = osy( i+1 );
line ( X0-2, ye, X0+2, ye ); // рисуем деление
sprintf ( s, "%d",i ); // записываем в строковую переменную число деления
outtextxy ( X0+10, ye+4, s ); // вывод числа
>
>
// построение точки графика функции
void Point ( float x, float y, int color )
<
int xe, ye;
xe = osx(x);
ye = osy(y);
if ( xe >= 0 && xe < 800 && ye >= 0 && ye < 600 )
putpixel(xe, ye, color);
>
// построение графика первой функции
void grafik1()
<
float x, h, xmin, xmax;
h = 1 / k;
xmin = (-X0)/ k;
xmax=(800-X0)/k;
for ( x = xmin; x <= xmax; x += h )
<
Point(x, F1(x), WHITE);
>
>
// построение графика второй функции
void grafik2()
<
float x, h, xmin, xmax;
h = 1 / k;
xmin = (-X0)/ k;
xmax=(800-X0)/k;
for ( x = xmin; x <= xmax; x += h )
<
Point(x, F2(x), WHITE);
>
>
// главная программа
main ()
<
initwindow ( 800, 600 ); // создать окно для графики
Axes(); // построение и разметка осей координат
grafik1(); // строим график первой функции
grafik2(); // строим график второй функции
getch(); // ждать нажатия на клавишу
closegraph(); // закрыть окно для графики
>
Полезно почитать по теме построение графиков функций в программа си
Графика в си
Процедуры и функции в си
» Как нарисовать график функции в СИ (compiler — bcc OR lcc)
Код:
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
//#define bgipath "a:\\bgi"
#define bgipath "d:\\borlandc\\bgi"
class axes
<
private:
int xcent,ycent,xend,yend;
float x,xt,y,yt,a,b,c;
void init();
public:
int x0,y0;//nachalo otnositel`no (0,0) ekrana
int xmin,ymin;//nachlo okna otnositelno (x0,y0)
int xmax,ymax;//konec""""""""""""""""
int bc,gc,fc;//border color,grid color,fill color
int gstp;//zoomgrid step
int grdstp; //grid step
float fstp; //func step
float zoom; //zoom
int ax;//show grid on/off
//axes4(int x0,int y0,int xmin,int ymin,int xmax,int ymax,int bc,int gc,int fc,int ax);//constructor
//axes(int,int,int,int,int,int,int,int,int,int,int,int);
axes()
<
x0=y0=20;
xmin=-120;xmax=120;
ymin=-100;ymax=100;
bc=12;
gc=10;
fc=7;
zoom=1;
grdstp=1;
fstp=zoom/10.0;
gstp=1/fstp*grdstp;
ax=1;
a=1;
b=16;
c=8;
> //end of constructor */
void draw_grid();
void draw_function();
void clear();
>; //end of class
void graphit (char *path)
<
int gd, gm , err ;
gd = 9 ;
gm = 2 ;
initgraph (&gd, &gm, path);
err = graphresult();
/* an error occurred */
if (err != grOk)
<
printf("Graphics error: %s\n", grapherrormsg(err));
printf("Press any key to halt:");
getch();
exit(1);
>
>
void axes::init()
<
xcent=x0-xmin;
ycent=y0+ymax;
xend=xcent+xmax;
yend=ycent-ymin;
fstp=zoom/1.0;
gstp=18/fstp*3.141592*grdstp;
>
void axes::clear()
<
init();
setfillstyle(1,0);
bar(x0,y0,xend,yend);
>
void axes::draw_grid()
<
init();
if(xend>639) //.
xend=639; //.
if(yend>479) //.
yend=479; //.
setcolor(bc);
rectangle(x0,y0,xend,yend);
setcolor(fc);
if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent);
else
<
setcolor(fc-2);
if(ycent<=y0)
line(x0,y0,xend,y0);
else
line(x0,yend,xend,yend);
>
setcolor(fc);
if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend);
else
<
setcolor(fc-2);
if(xcent<=x0)
line(x0,y0,x0,yend);
else
line(xend,y0,xend,yend);
>
if(gstp<2)
gstp=0;
if(gstp&&ax)
<
for(x=-xmin%gstp+x0;x<xend;x+=gstp)
for(y=ymax%gstp+y0;y<yend;y+=gstp)
if(x>x0&&y>y0)
putpixel(x,y,gc);
>
>
void axes::draw_function()
<
int sign;
init();
for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
<
y=sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
<
if(y/fstp>ymin&&y/fstp<ymax)
<
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>
y+=sign*fstp;
>
>
>
while(ch!='q')
<
ch=getch();
switch(ch)
<
case 'e':up[pres]-=step[pres];down[pres]-=step[pres];break;
case 'x':up[pres]+=step[pres];down[pres]+=step[pres];break;
case 'd':left[pres]-=step[pres];right[pres]-=step[pres];break;
case 's':left[pres]+=step[pres];right[pres]+=step[pres];break;
case '6':zom[pres]+=.1;break;
case '5':if(zom[pres]>0.1)zom[pres]-=.1;break;
case '7':if(step[pres]) step[pres]—;break;
case '8':step[pres]++;break;
case 'h':up[pres]=100;down[pres]=-100;left[pres]=-100;right[pres]=100;break;
case '1':pres=0;break;
case '2':pres=1;break;
case 'o':if(grdstp[pres]>1)grdstp[pres]—;break;
case 'p':grdstp[pres]++;
>
m[pres].grdstp=grdstp[pres];
m[pres].xmin=left[pres];
m[pres].xmax=right[pres];
m[pres].ymin=down[pres];
m[pres].ymax=up[pres];
m[pres].zoom=zom[pres];
m[pres].clear();
m[pres].draw_grid();
m[pres].draw_function();
>
getch();
>
у меня 3й борланд в нем нужно зайти в options->linker->libraries и отметить graphics library
как избавиться от класов? тебе вероятней всего нужны будут 2 функции, это draw_function() она рисует сам график и draw_grid() она рисует сетку и "окно" весь "основной код" находится в них. они тянут много переменных, но там вроде подписано что делает каждый из них и их можно сделать глобальными
Добавлено
вот вариант на си с тебя пиво
Код:
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
//#define bgipath "a:\\bgi"
#define bgipath "d:\\borlandc\\bgi"
int xcent,ycent,xend,yend;
float x,xt,y,yt;
int x0=20,y0=20;//nachalo otnositel`no (0,0) ekrana
int xmin=-120,ymin=-100;//nachlo okna otnositelno (x0,y0)
int xmax=120,ymax=100;//konec""""""""""""""""
int bc=12,gc=10,fc=7;//border color,grid color,fill color
int grdstp=1; //grid step
float zoom=1; //zoom
float fstp=zoom/10.0; //func step
int gstp=1/fstp*grdstp;//zoomgrid step
int ax=1;//show grid on/off
void graphit (char *path)
<
int gd, gm , err ;
gd = 9 ;
gm = 2 ;
initgraph (&gd, &gm, path);
err = graphresult();
/* an error occurred */
if (err != grOk)
<
printf("Graphics error: %s\n", grapherrormsg(err));
printf("Press any key to halt:");
getch();
exit(1);
>
>
void init()
<
xcent=x0-xmin;
ycent=y0+ymax;
xend=xcent+xmax;
yend=ycent-ymin;
fstp=zoom/1.0;
gstp=18/fstp*3.141592*grdstp;
>
void clear()
<
init();
setfillstyle(1,0);
bar(x0,y0,xend,yend);
>
void draw_grid()
<
init();
if(xend>639) //.
xend=639; //.
if(yend>479) //.
yend=479; //.
setcolor(bc);
rectangle(x0,y0,xend,yend);
setcolor(fc);
if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent);
else
<
setcolor(fc-2);
if(ycent<=y0)
line(x0,y0,xend,y0);
else
line(x0,yend,xend,yend);
>
setcolor(fc);
if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend);
else
<
setcolor(fc-2);
if(xcent<=x0)
line(x0,y0,x0,yend);
else
line(xend,y0,xend,yend);
>
if(gstp<2)
gstp=0;
if(gstp&&ax)
<
for(x=-xmin%gstp+x0;x<xend;x+=gstp)
for(y=ymax%gstp+y0;y<yend;y+=gstp)
if(x>x0&&y>y0)
putpixel(x,y,gc);
>
>
void draw_function()
<
int sign;
init();
for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
<
y=sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
<
if(y/fstp>ymin&&y/fstp<ymax)
<
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>
y+=sign*fstp;
>
>
>
void main()
<
char ch=' ';
int step=1;
// axes m[2];//(10,50,-100,-60,120,130,10,14,4,3,1);
graphit (bgipath) ;
x0=300;
y0=50;
xmin=-100;//left[-100];
xmax=100;//right[i];
ymin=-100;//down[i];
ymax=100;//up[i];
zoom=10;//zom[i];
draw_grid();
draw_function();
while((ch=getch())!='q')
<
switch(ch)
<
case 'e':ymax-=step;ymin-=step;break;
case 'x':ymax+=step;ymin+=step;break;
case 'd':xmin-=step;xmax-=step;break;
case 's':xmin+=step;xmax+=step;break;
case '6':zoom+=.1;break;
case '5':if(zoom>0.1)zoom-=.1;break;
case '7':if(step) step—;break;
case '8':step++;break;
case 'h':ymax=100;ymin=-100;xmin=-100;xmax=100;break;
case 'o':if(grdstp>1)grdstp—;break;
case 'p':grdstp++;
>
rew
Большое СПАСИБО. В коде я пока не разбирался, пишу сейчас совсем другое (определение CRC, контрольных сумм).
Как сделать не точки на осях, а черточки — засечки с подписями цифр под ними?
Как нарисовать функцию ln(1+x)?
Код:
for(x=-xmin%gstp+x0;x<xend;x+=gstp) <
line(x,ycent-5,x,ycent+5);
>
угу нужно писать
rew
Однако график получается правильным в случае:
Код:
void draw_function(void) <
int sign;
for(x=xmin,xt=xmin*fstp; x<=xmax; x++,xt+=fstp) <
if(xt-1<=0)
continue;
y = log(xt-1);
yt = log(xt+fstp-1);
zam
может быть я на точность для всех функций не претендую — для синуса и параболы, то что мне нужно было отобразить, вроде работало нормально
Код:
if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent); //если горизонтальная ось "находится" в окне
else
<
setcolor(fc-2);
if(ycent<=y0)
line(x0,y0,xend,y0); //если "выше" окна верхняя грань "окна" помечается другим цветом
else
line(x0,yend,xend,yend);// если "ниже" окна помечается нижняя грань
>
setcolor(fc);
if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend); //аналогично вертикальная ось
else
<
setcolor(fc-2);
if(xcent<=x0)
line(x0,y0,x0,yend);
else
line(xend,y0,xend,yend);
>
Код:
void draw_function(void) <
for(x=xmin+jmp,xt=xmin*fstp; x<=xmax-jmp; x++,xt+=fstp) <
y = sin((3.141592/180)*xt)*180/3.141592;
yt = sin((3.141592/180)*(xt+fstp))*180/3.141592;
sign = y < yt ? 1 : -1;
while(y*sign<yt*sign) <
if(y/fstp>ymin && y/fstp<ymax) <
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>
Б лок схема графической программы
Заданна функция float F(float x), необходимо на выбранном пользователем интервале построить ее график. Программа должна автоматически определять масштаб, содержать разметку, линейку для сканирования точек графика. Значения сканируемых точек должны писаться под графиком.
Этапы реализации
Программа реализуется в 4 этапа: Рисование разметки; Нахождение минимума и максимума функции; Оцифровка; Вывод графика; и Сканирование значений точек.
Рисование разметки
Для рисования разметки рекомендуется воспользоваться стилем линий DOTTED_LINE. После завершения рисования, не забудьте вернуться к стилю SOLID_LINE. Рисовать удобнее функцией line(. ) выводимой в цикле.

рограмма вывода графиков
Нахождение минимума и максимума функции

еобходимо построить график на интервале
t0..tmax. Кол-во точек N. Шаг между точками
dt=(tmax-t0)/N. float t0,tmax,dt; int N;
В начале считаем что макс.=мин.= значение в
Просматриваем все остальные точки графика.
Каждая точка сравнивается
с макс. значение, если
больше то макс. берется
t0+i*dt — значение по
горизонтали i точки.
функции в i точки.
Для вывода цифр около линий разметки необходимо использовать функцию outtextxy(. ), но предварительно число необходимо записать в строку, т.к. outtextxy(. ) работает только со строками. Для этого удобнее всего пользоваться функцией sprintf(<Строка>,<«Текст, метки форматов»,[<Переменные>]>). Эта функция аналогична printf(. ), но вывод происходит не на экран, а в строку.
При выводе на экран, необходимо помнить что координаты переданные в функцию outtextxy(. ), относятся к левому верхнему углу строки. Чтобы строка была напротив (под) линей разметки, ее необходимо сдвинуть. Полезно учесть размер символа (функции textwidth(. ) и textheight(..).
Вывод графика
Для вывода графика рекомендуется ввести целые переменные: x1,y1,x2,y2 — координаты точек, WX1,WY1,WX2,WY2 — координаты окна вывода. Алгоритм рисования графика следующий.

Сложность заключается только в пересчете вертикальных координат. Обычно они направленны снизу вверх, а у машины наоборот.
Сканирование значений точек
Под сканированием точек в задании понимается вертикальная линия перемещающаяся по графику, и выводимые под графиком значения аргумента и функции. Как организовать движение по клавишам и вывод числовых значений в графики уже рассматривалось выше.
Новое: Изображение линии, с последующим восстановлением изображеного под ней. Это рекомендуется реализовать используя режим инверсии экрана. В Си существует несколько способов рисования линий и прямоугольников. Первый режим COPY_PUT, указанные объекты рисуются цветом установленным в setcolor(. ). Другие режимы позволяют рисовать комбинацией текущего цвета и цвета точек находящихся под рисунком. Удобнее всего использовать режим XOR_PUT. Повторно проведя линию того же цвета, возвращаемся к исходным цветам XOR(XOR(X))==X.
Установку режима осуществляет функция setwritemode(<Режим>). Установленный режим действует до установки нового. По умолчанию используется режим COPY_PUT.
Для того чтобы не забыть отключить режим инверсии, удобнее вынести все это в отдельную функцию, которая будет и стирать, и рисовать линю курсора.
void PutLine(int x,int y1,int y2)
setcolor(RED) ; /* Инверсия др. цветом даст др. резулт. */
/* Линия будет рисоваться не цветом RED */
line(x,y1,x,y2) ; /* Линия вертикальная x1=x2=x */
setwritemode(COPY_PUT) ; /* Иначе и все остальное будет с инверсией цветов. */
