Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснительная записка.doc
Скачиваний:
2
Добавлен:
16.09.2019
Размер:
110.08 Кб
Скачать

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];

}