2.5 Опис основних функцій моделювання
Перелік функцій CALC.H:
double stepin(double x1,int f) – піднесення числа до степені f;
double faktorial(int k) – факторіал числа k;
double GetA(int i) – отримання множника а для першої інтерполяційної формули Ньютона;
double IntNuton1(double X1) – обчислення по першій інтерполяційній формулі Ньютона;
double GetВ(int i) – отримання множника а для другої інтерполяційної формули Ньютона;
double IntNuton2(double X1) – обчислення по другій інтерполяційній формулі Ньютона;
double IntLang(double X1) – обчислення по Лагранжу.
2.6 Структура комплексу програм для дослідження зміни температури термопари
Поскільки програма написана з використання модульного програмування, то розроблена программа складається з декількох модулів, розроблених самостійно.
Розбивання програми на модулі (бібліотеки) дозволяє згрупувати функції за певним їх призначенням, що призводить до зменшення помилок в програмі та легкого їх пошуку.
В даному випадку программа використовує функції п’ятьох стандартних модулів, та п’ятьох, розроблених самостійно. Список модулів приведений у таблиці 2.6.2.
Таблиця 2.6.2. Список бібліотек, які використовуються.
Назва модуля | Принадлежність | Опис |
STDIO.H | Стандартна бібліотека | Функції вводу-виводу |
CONIO.H | Стандартна бібліотека | Функції роботи з екраном(консолью) |
IOSTREAM.H | Стандартна бібліотека | Потоки ввод-вивід |
DOS.H | Стандартна бібліотека | Спеціальні функції |
MATH.H | Стандартна бібліотека | Математичні функції |
MENYS.H | Власна бібліотека | Головне меню програми.Бібліотека з меню та кнопками. |
INTERP.CPP | Власна бібліотека | Основна програма. |
DIALOGS.H | Власна бібліотека | Бібліотека з вікнами для вводу тексту. |
CALC.H | Власна бібліотека | Бібліотека з функціями для роботи з обчисленням. Даний файл можна доробляти, редагувати в залежності від потреб користувача. |
WIND.H | Власна бібліотека | Бібліотека малює вікна і панельки. |
3 Лістинг програми
3.1 Лістинг головної програми INTERP.CPP
#include <stdio.h>
#include "menys.h"
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
void main(void)
{
grinit();
init();
while (1)
{
getcurcorpos();
if (kbhit())
if (getch()==0)
if (getch()==45)break;
};
closegraph();
}
3.2 Лістинг модуля MENYS.H
#include <graphics.h>
#include <string.h>
#include "wind.h"
#include "edits.h"
#include "calc.h"
#include <stdlib.h>
//---
// =0 если клавиши подняты
// =2 или на уровне панели
const Flat=2;
const coloron=10;
const coloroff=1;
const colordn=14;
const colorhead=1;
//----
int OnPMenu=0, MenN2=0;
float Tt=-1000, Ttn=-1000;// значення температури яку вводять
double FLTt,FNTt1,FNTt2;
char string[25],sd[25];
float E;
FILE *in;
const colorsel=10;
const colornotsel=1;
const ButtonColor=7;
const ButtonN=5;
const Meny1=2;
const Meny2=2;
const Meny3=3;
const Meny4=0;
const Meny5=0;
const Meny6=0;
const PMeny1=2;
const PMeny2=2;
int BoolMeny1=0;
int BoolMeny2=0;
int BoolMeny3=0;
int BoolMeny4=0;
int BoolMeny5=0;
int BoolMeny6=0;
int BoolPMeny1=0;
int BoolPMeny2=0;
void DoSome(int i);
void windows(int x,int y,int xx,int yy,int color,char s[100],int p);
class TButton
{
public:
TButton(); //Конструктор
~TButton(){}; //деструктор
virtual void Draw();
void setwidth(int x){width=x;};
void setheight(int x){height=x;};
void settop(int x){top=x;};
void setleft(int x){left=x;};
virtual void setonoff(int x){onoff=x;Draw();};
void setcol(int x){color=x;};
void setcapt(char *x){caption=x;};
int getwidth()const {return width;};
int getheight()const {return height;};
int gettop()const {return top;};
int getleft()const {return left;};
int getonoff()const {return onoff;};
int getcol()const {return color;};
const char* getcapt(){return caption;};
virtual void mousemove(int i);
virtual void setpos(int x,int y, char* capt,int i=0);
protected:
int width;
int height;
int top;
int left;
int onoff;
int color;
char *caption;
};
class TMeny:public TButton
{
public:
TMeny();
~TMeny(){};
virtual void Draw();
virtual void setonoff(int x)
{
onoff=x;
if (!onoff) color=colornotsel;
else color=colorsel;
Draw();
};
virtual void mousemove(int i);
virtual void setpos(int x,int y, char* capt,int i=0);
virtual void close(int p=0);
};
void DrowMenyAll(TMeny FirstMeny[],int FMeny, int p=0);
//////////////////////////////////////////////////////////////////////////////
//ОБЪЯВЛЕНИЕ ОБЪЕКТОВ
///////////////////////////////////////////////////////////////////////////////////////////
TButton button[ButtonN];
TMeny FMeny1[Meny1],FMeny2[Meny2],FMeny3[Meny3],
FPMeny2[PMeny2],FPMeny1[PMeny1];
//////////////////////////////////////////////////////////////////////////////////////////
void TMeny::close(int p)
{
if (!p)
{
setonoff(0);
mouseoff();
putimage(xy1-2,yy1-2, arrow, 0);
mouseon();
free(arrow);
}
else
{
setonoff(0);
mouseoff();
putimage(xy1p-2,yy1p-2, arrowp, 0);
mouseon();
free(arrowp);
}
}
void TMeny::mousemove(int i)
{
if (mousein(left,top,left+width,top+height))
{
if (!getbutton(1))
{ //Не нажата
if (!onoff) setonoff(1);
if ((BoolMeny2)&&(!OnPMenu))
switch (i)
{
case 0:
if (BoolPMeny2)
{
FPMeny2[0].close(1);
BoolPMeny2=0;
}
if (!BoolPMeny1)
{
DrowMenyAll(FPMeny1,PMeny1,1);
BoolPMeny1=1;
}
break;
case 1:
if (BoolPMeny1)
{
FPMeny1[0].close(1);
BoolPMeny1=0;
}
if (!BoolPMeny2)
{
DrowMenyAll(FPMeny2,PMeny2,1);
BoolPMeny2=1;
}
break;
}
}
else
{
if ((onoff)&&(!(MenN2)))
{
//Нажата
close(OnPMenu);
if (BoolPMeny1)
{
if (BoolMeny2) FMeny2[0].close();
DoSome(i+100);
}
else
if (BoolPMeny2)
{
if (BoolMeny2) FMeny2[0].close();
DoSome(i+110);
}
else
if (BoolMeny1) DoSome(i+20); else
if (BoolMeny2) DoSome(i+30);else
if (BoolMeny3) DoSome(i+40);else
if (BoolMeny4) DoSome(i+50);else
if (BoolMeny5) DoSome(i+60);else
if (BoolMeny6) DoSome(i+70);
BoolPMeny1=0;
BoolPMeny2=0;
BoolMeny1=0;
BoolMeny2=0;
BoolMeny3=0;
BoolMeny4=0;
BoolMeny5=0;
BoolMeny6=0;
}
}
}
else
if ((getbutton(1))&&(!OnPMenu)&&(!MenN2))
{
if (!mousein(xy1,yy1,xy2+6,yy2+yy1+4))
{
close(OnPMenu);
if (BoolPMeny1)
{
FPMeny1[0].close(1);
BoolPMeny1=0;
}
if (BoolPMeny2)
{
FPMeny2[0].close(1);
BoolPMeny2=0;
}
BoolMeny1=0;
BoolMeny2=0;
BoolMeny3=0;
BoolMeny4=0;
BoolMeny5=0;
BoolMeny6=0;
BoolPMeny1=0;
BoolPMeny2=0;
}
}
else if (onoff) setonoff(0);
}
void TMeny::setpos(int x,int y, char* capt,int i)
{
left=x;
top=y;
caption=capt;
if (i) Draw();
}
void TMeny::Draw()// Метод постройки кнопок------------
{
int i;
setfillstyle(1,7);
setlinestyle(0,0,0);
setcolor(color);
mouseoff();
bar(left,top,left+width,top+height);
moveto(5+left,5+top);
outtext(caption);
if (color==colornotsel) setcolor(7);
rectangle(left,top,left+width,top+height);
rectangle(left+2,top+2,left+width-2,top+height-2);
mouseon();
} // Метод постройки кнопок--------------------------------
TMeny::TMeny()
{
caption='\0';
width=180;
height=18;
top=0;
left=0;
color=colornotsel;
onoff=0;
}
void DrowMenyAll(TMeny FirstMeny[],int FMeny, int p)
{
if (!p)
{
xy1=FirstMeny[0].getleft()-4;
yy1=FirstMeny[0].gettop()-4;
xy2=FirstMeny[0].getleft()+FirstMeny[0].getwidth();
yy2=FirstMeny[FMeny-1].gettop()-FirstMeny[0].gettop()+FirstMeny[0].getheight()+8;
size = imagesize(xy1-2, yy1-2, xy2+6, yy1+yy2+4);
arrow = malloc(size);
mouseoff();
getimage(xy1-2, yy1-2, xy2+6, yy1+yy2+4, arrow);
int dx=(xy2-xy1+4)/5;
int dy=(yy2+2)/5;
for (int k=1;k<=5; k++)
{
windows(xy1,yy1,dx*k,dy*k,7,"",0);
delay(30);
}
mouseon();
windows(xy1,yy1,xy2-xy1+4,yy2+2,7,"",0);
windows(xy1+2,yy1+2,xy2-xy1,yy2-2,7,"",1);
for (int gg=0;gg<FMeny;gg++)
{
FirstMeny[gg].Draw();
}
}
else
{
xy1p=FirstMeny[0].getleft()-4;
yy1p=FirstMeny[0].gettop()-4;
xy2p=FirstMeny[0].getleft()+FirstMeny[0].getwidth();
yy2p=FirstMeny[FMeny-1].gettop()-FirstMeny[0].gettop()+FirstMeny[0].getheight()+8;
sizep = imagesize(xy1p-2, yy1p-2, xy2p+6, yy1p+yy2p+4);
arrowp = malloc(sizep);
mouseoff();
getimage(xy1p-2, yy1p-2, xy2p+6, yy1p+yy2p+4, arrowp);
int dx=(xy2p-xy1p+4)/5;
int dy=(yy2p+2)/5;
for (int k=1;k<=5; k++)
{
windows(xy1p,yy1p,dx*k,dy*k,7,"",0);
delay(30);
}
mouseon();
windows(xy1p,yy1p,xy2p-xy1p+4,yy2p+2,7,"",0);
windows(xy1p+2,yy1p+2,xy2p-xy1p,yy2p-2,7,"",1);
for (int gg=0;gg<FMeny;gg++)
{
FirstMeny[gg].Draw();
}
}
}
void mysound()
{
sound(1000);
delay(30);
nosound();
}
void messageabout()
{ mysound();
size=imagesize(199,99,200+241,241);
arrow=malloc(size);
getimage(199,99,200+241,241,arrow);
mouseon();
windows(200,100,240,140,7,"",0);
windows(202,102,236,15,colorhead,"Про програму",1);
setcolor(11);
mouseoff();
outtextxy(230,130," КУРСОВА РОБОТА ");
outtextxy(230,150," ");
outtextxy(230,170," iнтерполяцiя по");
outtextxy(230,190," Лагранжу i Ньютону ");
outtextxy(230,210,"");
mouseon();
while (getbutton(1));
while ((!getbutton(1))&&(!kbhit()));
mouseoff();
putimage(199,99,arrow,0);
mouseon();
free(arrow);
while (kbhit()) getch();
}
void messageaboutavt()
{ mysound();
size=imagesize(199,99,200+241,241);
arrow=malloc(size);
getimage(199,99,200+241,241,arrow);
mouseon();
windows(200,100,240,140,7,"",0);
windows(202,102,236,15,colorhead,"Про автора",1);
setcolor(11);
mouseoff();
outtextxy(230,130," КУРСОВА РОБОТА ");
outtextxy(230,150," Програму написав ");
outtextxy(230,170," ");
outtextxy(230,190," ст.гр.5AC-02 ");
outtextxy(230,210," Гега А.М.");
mouseon();
while (getbutton(1));
while ((!getbutton(1))&&(!kbhit()));
mouseoff();
putimage(199,99,arrow,0);
mouseon();
free(arrow);
while (kbhit()) getch();
}
void TButton::mousemove(int i)
{
if (mousein(left,top,left+width,top+height))
{
if (getbutton(1))
{
if (onoff!=1) setonoff(1);
}
else
if (onoff==1)
{
setonoff(0);
DoSome(i);
}
else
{
if (onoff!=Flat) setonoff(Flat);
}
}else if (onoff!=0) setonoff(0);
}
void TButton::setpos(int x,int y, char* capt,int i)
{
left=x;
top=y;
caption=capt;
Draw();
}
TButton::TButton()
{
caption='\0';
width=100;
height=18;
top=0;
left=0;
color=ButtonColor;
onoff=0;
}
void TButton::Draw()// Метод постройки кнопок------------
{
int i=onoff;
setfillstyle(1,color);
setlinestyle(0,0,0);
mouseoff();
bar(left,top,left+width,top+height);
setcolor(1);
switch (i)
{
case 0:setcolor(coloroff);break;
case 1:setcolor(colordn);break;
case 2:setcolor(coloron);break;
}
rectangle(left,top,left+width,top+height);
rectangle(left+2,top+2,left+width-2,top+height-2);
switch (i)
{
case 0:moveto(5+left,5+top);break;
case 1:moveto(6+left,6+top);break;
case 2:moveto(5+left,5+top);break;
}
if ((!Flat)&&(!i)) moveto(5+left,5+top);
outtext(caption);
mouseon();
} // Метод постройки кнопок--------------------------------
void grinit()//---Инициал графики----------------------------
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
mouseinit();
mouseon();
}//_void grinit()//-----------------------------------------------
void getcurcorpos()
{
int i;
if (BoolMeny1)
for (i=0; i<Meny1; i++)
{
if (BoolMeny1)
FMeny1[i].mousemove(i);
}//===================================
MenN2=1;
if (BoolMeny2)
for (i=0; i<Meny2; i++)
{
if (BoolMeny2)
FMeny2[i].mousemove(i);
}//====================================
MenN2=0;
if (BoolMeny3)
for (i=0; i<Meny3; i++)
{
if (BoolMeny3)
FMeny3[i].mousemove(i);
}//====================================
OnPMenu=1;
if (BoolPMeny1)
for (i=0; i<PMeny1; i++)
{
if (BoolPMeny1)
FPMeny1[i].mousemove(i);
}//===================================
if (BoolPMeny2)
for (i=0; i<PMeny2; i++)
{
if (BoolPMeny2)
FPMeny2[i].mousemove(i);
}//====================================
OnPMenu=0;
for (i=0; i<ButtonN; i++)
{
button[i].mousemove(i);
}//=======================================
}
///////////////////////////////////////////////////////////////////
//----------------------------------------------------------------
//-----------------------------------------------------------------
void init()
{
mouseoff();
cleardevice();
mouseon();
windows(1,1,637,477,7,"",0);
// windows(1,25,637,27,7,"",0);
windows(3,50,630,406,7,"",1);
windows(3,3,633,20,colorhead,"Iнтерполяцiя по Лагранжу та Ньютону",1);
// windows(1+2,20+2,637-3,27-4,7,"",1);
windows(3,460,630,17,7,"",1);
button[0].setwidth(18);
button[0].setheight(18);
button[0].setpos(615,4,"X");
button[1].setpos(5,28," Довiдка");
button[2].setpos(110,28,"Тестування");
button[3].setpos(215,28,"Результати");
button[4].setpos(320,28," Вихiд");
int h;
for (h=0;h<Meny1;h++)
FMeny1[h].setwidth(150);
FMeny1[0].setpos(10,53,"Про автора");
FMeny1[1].setpos(10,53+19,"Про програму");
for (h=0;h<Meny2;h++)
FMeny2[h].setwidth(100);
FMeny2[0].setpos(115,53, "Тест 1 >");
FMeny2[1].setpos(115,53+19,"Тест 2 >");
for (h=0;h<Meny3;h++)
FMeny3[h].setwidth(100);
FMeny3[0].setpos(220,53,"В файл");
FMeny3[1].setpos(220,53+19,"На екран");
FMeny3[2].setpos(220,53+19+19,"На друк");
for (h=0;h<PMeny1;h++)
FPMeny1[h].setwidth(100);
FPMeny1[0].setpos(227,57,"По Лагранжу");
FPMeny1[1].setpos(227,57+19,"По Ньютону");
for (h=0;h<PMeny2;h++)
FPMeny2[h].setwidth(100);
FPMeny2[0].setpos(227,57+19,"По Лагранжу");
FPMeny2[1].setpos(227,57+19+19,"По Ньютону");
}
///////////////////////////////////////////////////////////////////////
void DoSome(int i)
{
switch (i)
{
case 0:
closegraph();exit(1);
break;
case 1:
DrowMenyAll(FMeny1,Meny1,0);
BoolMeny1=1;
break;
case 2:
DrowMenyAll(FMeny2,Meny2,0);
BoolMeny2=1;
break;
case 3:DrowMenyAll(FMeny3,Meny3,0);
BoolMeny3=1;break;
case 4: closegraph();exit(0); break;
///////////////////////
case 20:messageaboutavt();break;
case 21:messageabout();;break;
case 22:;break;
case 23:;break;
////////////////////////
///////////////////////
case 30:;break;
case 31:break;
case 32:;break;
case 33:;break;
case 34:windows(3,50,630,406,7,"",1);break;
case 40:
/* int dy=30,dx=20;
for (int i=0;i<110;i++)
{
putpixel(i+dx,dy*IntLang(i)+120,4);
putpixel(i+dx,dy*IntNuton1(i)+120,2);
putpixel(i+dx,dy*IntNuton2(i)+120,1);
if ((i%20)==0)
{
setcolor(4);
circle(i+dx,dy*IntLang(i)+120,2);
setcolor(2);
circle(i+dx,dy*IntNuton1(i)+120,2);
setcolor(1);
circle(i+dx,dy*IntNuton2(i)+120,2);
}
}
*/
edit1[0].setpos(200,200,"Введiть файл","");
EditEnter(edit1,FEdit1);
if (exittru==27) break;
if ((in = fopen(edit1[0].gettext(), "wt")) == NULL)
{
fprintf(stderr, "Cannot open input file.\n");
break;
}
fprintf(in,"Результати роботи\n");
if (Tt!=-1000)
{
fprintf(in," Iнтерполяцiя по Лагранжу\n");
fprintf(in,"T=%10.5f\n",Tt);
fprintf(in,"Q=%10.5f\n",FLTt);
E=fabs(FLTt/6006);
fprintf(in,"e=%10.5f\n",E);
}
if (Ttn!=-1000)
{
fprintf(in," Iнтерполяцiя по Ньютону\n");
fprintf(in,"T=%10.5f\n",Ttn);
fprintf(in,"Q=%10.5f\n",FNTt1);
E=fabs(FNTt1-IntLang(Ttn));
fprintf(in,"e=%10.5f\n",E);
}
fclose(in);
break;
case 41:
windows(3,50,630,406,7,"",1);
setcolor(4);
mouseoff();
outtextxy(240,80,"Результати роботи");
if (Tt!=-1000)
{
setcolor(1);
outtextxy(50,150," Iнтерполяцiя по Лагранжу");
sprintf(sd,"T=%10.5f",Tt);
outtextxy(40,170,sd);
sprintf(sd,"Q=%10.5f",FLTt);
outtextxy(40,190,sd);
E=fabs(FLTt/6006);
sprintf(sd,"e=%10.5f",E);
outtextxy(40,210,sd);
}
if (Ttn!=-1000)
{
setcolor(1);
outtextxy(50,250," Iнтерполяцiя по Ньютону");
sprintf(sd,"T=%10.5f",Ttn);
outtextxy(40,270,sd);
sprintf(sd,"Q=%10.5f",FNTt1);
outtextxy(40,290,sd);
E=fabs(FNTt1-IntLang(Ttn));
sprintf(sd,"e=%10.5f",E);
outtextxy(40,310,sd);
}
mouseon();
break;
case 42:
fprintf(stdprn,"Rezult\r\n");
if (Tt!=-1000)
{
fprintf(stdprn," Interpol LAGRANG\r\n");
fprintf(stdprn,"T=%10.5f\r\n",Tt);
fprintf(stdprn,"Q=%10.5f\r\n",FLTt);
E=fabs(FLTt/6006);
fprintf(stdprn,"e=%10.5f\r\n",E);
}
if (Ttn!=-1000)
{
fprintf(stdprn," Interpol NUTON\r\n");
fprintf(stdprn,"T=%10.5f\r\n",Ttn);
fprintf(stdprn,"Q=%10.5f\r\n",FNTt1);
E=fabs(FNTt1-IntLang(Ttn));
fprintf(stdprn,"e=%10.5f\r\n",E);
}
fprintf(stdprn, "\f");
break;
case 100:;
case 110:
edit1[0].setpos(200,200,"Введiть t (по Лагр.)","");
EditEnter(edit1,FEdit1);
if (exittru==27) break;
Tt=atof(edit1[0].gettext());
FLTt=IntLang(Tt);
//printf("\n f(%f)= %10.10f %10.10f %10.10f ",Tt,FLTt,FNTt1,FNTt2);
break;
case 101:;
case 111:
edit1[0].setpos(200,200,"Введiть t (по Ньютону)","");
EditEnter(edit1,FEdit1);
if (exittru==27) break;
Ttn=atof(edit1[0].gettext());
//FLTt=IntLang(Ttn);
if (Ttn<50)
FNTt1=IntNuton1(Ttn);
else
FNTt1=IntNuton2(Ttn);
//printf("\n f(%f)= %10.10f %10.10f %10.10f ",Tt,FLTt,FNTt1,FNTt2);
break;
///////////////////////
}
}
... Interpol. Для запуску програми необхідно запустити файл Interpol. exe. Після запуску програми з’являється меню, реалізоване в текстовому режимі, яке дозволяє вибрати необхідний метод інтерполяції. Для вибору методу розподілених різниць необхідно натиснути клавішу "1", для вибору методу Лагранжа - клавішу "2". Після вибору методу для графічного представлення результатів інтерполяції функції в ...
... Методичні вказівки до лабораторної роботи № З «Тепловіддача горизонтальної труби при вільному русі повітря». Тернопіль 2003 У даних методичних вказівках подані теоретичні основи, опис експернментальної установки і практичні рекомендації лля проведення лабораторної роботи і обробки дослідних даних Мета роботи - засвоїти знання з теорії" конвсктивнот теплообміну при ...
... ї зони та обмеження доступу до неї людей. На підприємстві згідно з вимогами законодавчих та інших нормативно-правових актів з питань захисту населення і територій від надзвичайних ситуацій та охорони праці повинні бути розроблені і затверджені роботодавцем: - план попередження надзвичайних ситуацій, у якому визначаються можливі аварії та інші надзвичайні ситуації техногенного та природного ...
... підвищенням гнучкості технологічних систем, застосуванням машин з числовим програмним керуванням, впровадженням автоматичних багатофункціональних маніпуляторів-роботів. РОЗДІЛ 3. ЕКОНОМІЧНЕ ОБҐРУНТУВАННЯ ОСНОВНИХ НАПРЯМКІВ РАЦІОНАЛІЗАЦІЇ ТРУДОВИХ ПРОЦЕСІВ НА ВАТ "ЕЛЕКТРОТЕРМОМЕТРIЯ" Провівши аналіз організації трудових процесів на ВАТ "Електротермометрія", слід було б відмітити, що в 2009 ...
0 комментариев