- •Томский государственныйуниверситет систем управления и радиотехники (тусур)
- •1 Цель работы
- •2 Описание метода решения задачи, программы и используемых алгоритмов.
- •3 Описание методики тестирования программы
- •4. Руководство пользователя по работе с программой
- •5 Блок схема программы
- •6 Распечатка текста программы
- •7 Выводы по работе
5 Блок схема программы
6 Распечатка текста программы
Файл main.cpp
#include<iostream>
#include<fstream>
#include<math.h>
#include<conio.h>
#define MAXN 500
#define MAXX 100000
#define MAXNAME 20
#define NIL 1.0e-015
using namespace std;
void in(),elti_mat(),mat_gramma(),diagonal(),kofti(),out();
int ch_int(char*);
double ch_db(char*);
int n,vid,end,ind[5];
double x[105],y[105],mat[5][5],xpow[5],rez[5];
int main()
{
in(); //vvod dannih
elti_mat(); //formirovanie elementov matrizi
mat_gramma(); // formirovanie matrizi
///////////////////////////////////////////////////////////////////////////////////
diagonal(); //privedenie matrizi k diagonal'nomu vidu
if(end==1)return 0;
cout<<"Matriza imeet vid:\n";
for(int q=0;q<=vid;q++)
{for(int w=0;w<=vid+1;w++)
if(fabs(mat[q][w])<NIL)cout<<'0'<<" ";
else cout<<mat[q][w]<<" ";
cout<<"\n";
}
cout<<"\n";
////////////////////////////////////////////////////////////////////////////////////
kofti();
cout<<"Koefizienti ravni\n";
for(int q=0;q<=vid;q++)
if(fabs(rez[q])<NIL)cout<<'0'<<" ";
else cout<<rez[q]<<" ";
cout<<"\n\nNarisotat' grafik?\n1. da\n2. net\n";
int graf=0;
while(!(1<=graf&&graf<=2))
{char num[MAXNAME];
cin>>num;
graf=ch_int(num);
if(!(1<=graf&&graf<=2))
cout<<"Vi vveli nekorrektnoe znachenie. Vvedite povtorno.\n";
}
if(graf==1)
{system("grafmain.exe");
out();
}
return 0;
}
void out()
{
fstream wer;
wer.open("sys.txt",ios::out);
wer<<n<<"\n";
for(int q=0;q<n;q++)
wer<<x[q]<<" "<<y[q]<<"\n";
wer<<vid<<"\n";
for(int q=0;q<=vid;q++)
wer<<rez[q]<<" ";
wer.close();
}
void kofti()
{int q,w;
double rez1[5];
for(q=0;q<=vid;q++)
rez1[q]=0;
for(q=vid;q>=0;q--)
{
rez1[q]=mat[q][vid+1]/mat[q][q];
for(w=q-1;w>=0;w--)
mat[w][vid+1]-=rez1[q]*mat[w][q];
}
for(q=0;q<=vid;q++)
rez[q]=rez1[ind[q]];
}
void diagonal()
{int flag,q,w,e;
for(q=0;q<=vid;q++)
{
//определение и вычеркивание пустых уравнений, определение совместности системы.
for(w=0;w<=vid;w++)
{//проверка левой части на ноль. Если в левой части ноль - flag=0;
flag=0;
for(e=0;e<=vid;e++)
if(fabs(mat[w][e])>NIL)flag=1;
if(flag==0)
{cout<<"Sistema ne sovmestna ili ne opredelena. Dannie ne korrektni.";
end=1;
return;
}
}
if(fabs(mat[q][q])<NIL)
{//перестановка столбцов в матрице, если матрица теряет трапецеидальный вид
for(w=q+1;w<=vid;w++)
{
if(fabs(mat[q][w])>NIL)
{int t=ind[q];
ind[q]=ind[w];
ind[w]=t;
for(e=0;e<=vid;e++)
{double r=mat[e][q];
mat[e][q]=mat[e][w];
mat[e][w]=r;
}
break;
}
}
}
for(w=q+1;w<=vid;w++)
{double k=0;
k=mat[w][q]/mat[q][q];
for(e=0;e<=vid+1;e++)
mat[w][e]-=mat[q][e]*k;
}
}
}
void mat_gramma()
{
for(int q=0;q<=vid;q++)
for(int w=0;w<=vid;w++)
mat[q][w]=xpow[q+w];
for(int q=0;q<=vid;q++)
{mat[q][vid+1];
for(int w=0;w<n;w++)
mat[q][vid+1]+=pow(x[w],(double)(q))*y[w];
}
}
void elti_mat()
{
for(int q=0;q<=vid*2;q++)
{xpow[q]=0;
for(int w=0;w<n;w++)
xpow[q]+=pow(x[w],(double)(q));
}
}
void in()
{
cout<<"Vvedite sposob vvoda dannih: \n1. S klaviaturi\n2. Iz fajla\n";
int sposob=0;
char num[MAXNAME];
while(!(1<=sposob&&sposob<=2))
{
cin>>num;
sposob=ch_int(num);
if(sposob==1)
{
n=0;
cout<<"Vvedite vid funkzii:\n1. pryamaya\n2. parabola\n";
while(!(1<=vid&&vid<=2))
{cin>>num;
vid=ch_int(num);
if(!(1<=vid&&vid<=2))
cout<<"vid nekorrekten. Vvedite vid povtorno: ";
}
cout<<"Vvedite chislo izmerenij 2<=n<=500: ";
while(!(2<=n&&n<=MAXN))
{cin>>num;
n=ch_int(num);
if(!(2<=n&&n<=MAXN))
cout<<"n - nekorrektno. Vvedite n povtorno: ";
}
cout<<"Vvedite rezul'tati izmerenij -10000<=x[i]<=10000, -10000<=y[i]<=10000\n";
for(int q=0;q<n;q++)
{x[q]=MAXX+1;
while(!(-MAXX<x[q]&&x[q]<MAXX))
{cout<<"x["<<q<<"] = ";
cin>>num;
x[q]=ch_db(num);
if(!(-MAXX<x[q]&&x[q]<MAXX))
cout<<"x["<<q<<"] nekorrektno. Vvedite povtorno ";
}
y[q]=MAXX+1;
while(!(-MAXX<y[q]&&y[q]<MAXX))
{cout<<"y["<<q<<"] = ";
cin>>num;
y[q]=ch_db(num);
if(!(-MAXX<y[q]&&y[q]<MAXX))
cout<<"y["<<q<<"] nekorrektno. Vvedite povtorno\n";
}
}
cout<<"\n"<<n<<"\n";
for(int q=0;q<n;q++)
cout<<x[q]<<" "<<y[q]<<"\n";
cout<<"\n";
}
if(sposob==2)
{
int flag=-1;
while(flag!=0)
{
cout<<"Vvedite imya fajla: ";
char filename[MAXNAME]="",emptystr[MAXNAME]="";
cin>>filename;
filename[20]='/0';
fstream qwe;
qwe.open(filename,ios::in);
n=0;
flag=0;
qwe>>num;
vid=ch_int(num);
if(!(1<=vid&&vid<=2))flag=1;
while(!qwe.eof())
{
for(int q=0;q<strlen(num);q++)
num[q]=0;
qwe>>num;
if(strcmp(num,emptystr)==0)break;
x[n]=ch_db(num);
for(int q=0;q<strlen(num);q++)
num[q]=0;
qwe>>num;
if(strcmp(num,emptystr)==0)break;
y[n]=ch_db(num);
if((!(-MAXX<=x[n]&&x[n]<=MAXX))||(!(-MAXX<=y[n]&&y[n]<=MAXX)))
flag=1;
n++;
}
if(!(2<=n&&n<=MAXN))
flag=1;
if(flag==1)
cout<<"Imya fajla neverno, ili dannie v fajle ne korrektni. Vvedite imya fajla povtorno.\n";
qwe.close();
}
cout<<n<<"\n";
for(int q=0;q<n;q++)
cout<<x[q]<<" "<<y[q]<<"\n";
cout<<"\n";
}
if(!(1<=sposob&&sposob<=2))
cout<<"Vvedeno nekorrektnoe znachenie. Vvedite nomer sposoba povtorno.\n";
}
for(int q=0;q<=vid+1;q++)
ind[q]=q;
}
int ch_int(char* num)
{
int flag=0,q=0,ft=0;
if(num[0]=='+'||num[0]=='-')
q=1;
for(;q<strlen(num);q++)
{if(!('0'<=num[q]&&num[q]<='9'))
flag=1;
}
if(flag==1||ft>1)return MAXX+1;
else return atoi(num);
}
double ch_db(char* num)
{
int flag=0,q=0,ft=0;
if(num[0]=='+'||num[0]=='-')
q=1;
for(;q<strlen(num);q++)
{if(!('0'<=num[q]&&num[q]<='9')&&num[q]!='.')
flag=1;
if(num[q]=='.')
ft++;
}
if(flag==1||ft>1)return MAXX+1;
else return atof(num);
}
Файл grafmain.cpp
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#define xkol 300
#define ykol 220
#define xstart 10
#define ystart 250
#define pointc 2
int gdriver = DETECT, gmode, errorcode;
void in();
double f(double);
double x[505],y[505],rez[5];
int n,vid;
int main()
{
clrscr();
initgraph(&gdriver, &gmode, "");
in();
bar(0,getmaxy()/2,getmaxx()/2,getmaxy());
cout<<"\n\nPress any key for continue.";
double stepx=0,stepy=0,maxx=x[0],minx=x[0];
for(int q=0;q<n;q++)
{if(maxx<x[q])maxx=x[q];
if(minx>x[q])minx=x[q];
}
double maxf=f(minx),minf=f(minx),d;
for(d=minx;d<=maxx;d+=0.01)
{if(maxf<=f(d))maxf=f(d);
if(minf>=f(d))minf=f(d);
}
stepx=(maxx-minx)/xkol;
stepy=(maxf-minf)/ykol;
int y0=ystart+ykol;
getch();
//tochki
for(q=0;q<n;q++)
{
setcolor(pointc);
circle(xstart+(int)((x[q]-minx)/stepx),y0-(int)((y[q]-minf)/stepy),3);
setfillstyle(1, pointc);
floodfill(xstart+(int)((x[q]-minx)/stepx),y0-(int)((y[q]-minf)/stepy), pointc);
}
getch();
//f(x)
for(d=minx;d<=maxx;d+=stepx)
putpixel(xstart+(int)((d-minx)/stepx),y0-(int)( (f(d)-minf)/stepy ),4);
getch();
return 0;
}
void in()
{
fstream qwe;
qwe.open("sys.txt",ios::in);
qwe>>n;
for(int q=0;q<n;q++)
qwe>>x[q]>>y[q];
qwe>>vid;
for(q=0;q<=vid;q++)
qwe>>rez[q];
qwe.close();
cout<<n<<"\n";
for(q=0;q<n;q++)
cout<<x[q]<<" "<<y[q]<<"\n";
cout<<vid<<"\n";
for(q=0;q<=vid;q++)
cout<<rez[q]<<" ";
}
double f(double x)
{
return rez[0]+x*rez[1]+x*x*rez[2];
}