Смекни!
smekni.com

Разработка программы для решения систем линейных уравнений (стр. 3 из 4)

cprintf("%s","F");

textcolor(BLACK);

cprintf("%s","ile");

window(14,4,14,4);

textbackground(LIGHTGRAY);

clrscr();

}

if(n==10)

{

window(30,3,37,3);

textbackground(GREEN);

clrscr();

textcolor(RED);

cprintf("%s","D");

textcolor(BLACK);

cprintf("%s","isplay");

window(37,3,37,3);

textbackground(LIGHTGRAY);

clrscr();

}

if(n==11)

{

window(30,4,34,4);

textbackground(GREEN);

clrscr();

textcolor(RED);

cprintf("%s","F");

textcolor(BLACK);

cprintf("%s","ile");

window(34,4,34,4);

textbackground(LIGHTGRAY);

clrscr();

}

}

//------------------------------------------------------------------------------

//функция ввода натурального числа

//------------------------------------------------------------------------------

int n_input(int max)

{

char ch;

char str[100];

int i=0;

do

{

ch = (char)getch();

if (i==0)

{

if ((ch>'0')&&(ch<='9'))

{

str[i++]=ch;

putch(ch);

}

}

else

{

if ((ch>='0')&&(ch<='9'))

{

str[i++]=ch;

putch(ch);

}

}

if((ch=='&bsol;r')&&(i==0)) //если нажата клавиша ENTER и ничего не введено

{

ch='x';

printf(" &bsol;b"); //backspace

}

if ((ch=='&bsol;b')&&(i>0)) //если нажата клавиша BACKSPACE

{

i--;

printf("&bsol;b &bsol;b");

}

if(i==(max+1)) //если достигли max количества цифр

{

i--;

printf("&bsol;b &bsol;b");

}

}

while (ch!='&bsol;r');

str[i]='&bsol;0';

for (int j=i;j>0;j--)

printf("&bsol;b &bsol;b");

printf("%d",atoi(str));

return atoi(str); //преобразуем в число

}

//------------------------------------------------------------------------------

//функция ввода действительного числа

//------------------------------------------------------------------------------

double float_input()

{

const max=6; //максимальное количество цифр в числе

int i=0; //счётчик ввода символа

char ch,buffer[max];

bool flp=0; //флажок ввода символа "."

bool fle=0; //флажок ввода "е"

do

{

ch = (char)getch();

if ((ch=='-')&&((i==0)||(buffer[i-1]=='e'))) //ввод "-"

{ //в начале строки

buffer[i++]=ch; //и после "е"

putch(ch);

}

if ((ch>='0')&&(ch<='9')) //ввод цифр

{

buffer[i++]=ch;

putch(ch);

}

if (((ch=='.')||(ch==','))&&(flp==0)) //ввод плавающей

{ //точки

buffer[i++]='.';

putch('.');

flp=1;

}

if ((ch=='e' || ch=='E') && i>0 && fle==0)

{ //ввод "е"

buffer[i++]='e';

putch('e');

fle=1;

}

if ((ch=='&bsol;b')&&(i>0)) //ввод кода

{ //клавиши

i--; //BACKSPACE

cprintf("&bsol;b &bsol;b");

if (buffer[i]=='.') flp=0;

if (buffer[i]=='E') fle=0;

}

if ((ch=='&bsol;r')&&(i==0)) ch='&bsol;0';

if(i==(max+1))

{

i--;

cprintf("&bsol;b &bsol;b");

}

} while (ch!='&bsol;r');

buffer[i]='&bsol;0'; //"закрытие" строки

for (int j=i;j>0;j--)

cprintf("&bsol;b &bsol;b");

cprintf("%2.2e",strtod(buffer,0));

return strtod(buffer,0); //преобразование к веществ. значению

}

//------------------------------------------------------------------------------

//О программе

//------------------------------------------------------------------------------

void about()

{

char ch;

window(25,8,59,18);

textbackground(BLACK);

clrscr();

window(24,7,58,17);

textbackground(LIGHTGRAY);

textcolor(BLACK);

clrscr();

cprintf("&bsol;n&bsol;r ђ §а Ў®вЄ Їа®Ја ¬¬л ¤«п аҐиҐ­Ёп ");

cprintf("&bsol;n&bsol;r бЁб⥬ «Ё­Ґ©­ле га ў­Ґ­Ё©");

cprintf("&bsol;n&bsol;n&bsol;r ‚ҐабЁп 1.0 2007Ј.");

cprintf("&bsol;n&bsol;n&bsol;r ‚лЇ®«­Ё« бв㤥­в Ја. ‘Љ-06");

cprintf("&bsol;n&bsol;r Њ ¬ Ґў ‘.‚.");

cprintf("&bsol;n&bsol;n&bsol;r „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

do

{

ch=(char)getch();

}

while(ch!=13); //пока не нажат ENTER

}

//------------------------------------------------------------------------------

//текст задания

//------------------------------------------------------------------------------

void task()

{

char ch;

window(21,6,62,20);

textbackground(BLACK);

clrscr();

window(20,5,61,19);

textbackground(LIGHTGRAY);

textcolor(BLACK);

clrscr();

cprintf("&bsol;n&bsol;n&bsol;n&bsol;r ђ §а Ў®в вм Їа®Ја ¬¬г ¤«п аҐиҐ­Ёп бЁб⥬");

cprintf("&bsol;n&bsol;r «Ё­Ґ©­ле га ў­Ґ­Ё©. ђҐ «Ё§®ў вм ¬Ґв®¤л: ");

cprintf("&bsol;n&bsol;r )Їа®бвле ЁвҐа жЁ©; Ў)‡Ґ©¤Ґ«п. ЏаҐ¤гᬮ-");

cprintf("&bsol;n&bsol;r ваҐвм ўў®¤ зЁб« га ў­Ґ­Ё©(¤® 10), ¬ в-");

cprintf("&bsol;n&bsol;r аЁжл Є®нддЁжЁҐ­в®ў Ё ўҐЄв®а бў®Ў®¤­ле ");

cprintf("&bsol;n&bsol;r з«Ґ­®ў.");

cprintf("&bsol;n&bsol;n&bsol;n&bsol;n&bsol;n&bsol;r „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

do

{

ch=(char)getch();

}

while(ch!=13); //пока не нажат ENTER

}

//------------------------------------------------------------------------------

//окно help

//------------------------------------------------------------------------------

void help()

{

char ans;

int h_num=1;

do

{

menu(); //отрисовка меню

window(3,4,12,5);

textbackground(BLACK);

clrscr();

window(2,3,11,4);

textbackground(LIGHTGRAY);

clrscr();

textcolor(RED);

cprintf("%s"," A");

textcolor(BLACK);

cprintf("%s","bout");

textcolor(RED);

cprintf("%s","&bsol;n&bsol;r T");

textcolor(BLACK);

cprintf("%s","ask");

cursor(h_num+5);

ans=(char)getch();

if(ans==80) {if(h_num!=2) h_num++;} //если нажали "стрелку вниз"

if(ans==72) {if(h_num!=1) h_num--;} //если нажали "стрелку вверх"

}

while((ans!=27)&&(ans!='a')&&(ans!='A')&&(ans!='t')&&(ans!='T')&&(ans!=13));

if((ans=='t')||(ans=='T')||((h_num==2)&&(ans==13)))

{

window(2,3,14,6);

textbackground(BLACK);

clrscr();

task(); //окно вывода текста задания

}

if((ans=='a')||(ans=='A')||((h_num==1)&&(ans==13)))

{

window(2,3,14,6);

textbackground(BLACK);

clrscr();

about(); //окно вывода информации о разработчике

}

}

//------------------------------------------------------------------------------

//функция ввода данных

//------------------------------------------------------------------------------

void input(double **&A,double *&B,int &n)

{

char ch;

window(8,3,20,6);

textbackground(BLACK);

clrscr();

window(15,6,64,18);

textbackground(LIGHTGRAY);

clrscr();

textcolor(BLACK);

cprintf("%s","&bsol;n&bsol;n&bsol;r ‚ўҐ¤ЁвҐ зЁб«® га ў­Ґ­Ё© (1..10)");

window(48,8,51,8);

textbackground(BLACK);

textcolor(LIGHTGRAY);

clrscr();

bool fl=false;

do //защита от ввода числа уравнений более 10

{

n=n_input(2); //функция ввода двузначного числа

if((n<=10)&&(n>=1)) fl=true;

else clrscr();

}

while(fl!=true);

A=(double**)malloc(n*n*sizeof(double)); //выделение памяти для массива

B=(double*)malloc(n*sizeof(double));

window(15,10,64,10);

textbackground(LIGHTGRAY);

clrscr();

textcolor(BLACK);

cprintf("%s","&bsol;r ‚ўҐ¤ЁвҐ н«Ґ¬Ґ­вл ¬ ваЁжл Є®нддЁжЁҐ­в®ў");

window(15,11,64,11);

textbackground(LIGHTGRAY);

clrscr();

for(int i=0;i<n;i++)

{

A[i]=(double*)malloc(n*sizeof(double));

for(int j=0;j<n;j++)

{

clrscr();

cprintf("&bsol;r A[%d][%d]=",i+1,j+1);

A[i][j]=float_input(); //ввод действительного числа

}

}

window(15,13,64,13);

textbackground(LIGHTGRAY);

clrscr();

cprintf("%s","&bsol;n&bsol;n&bsol;r ‚ўҐ¤ЁвҐ н«Ґ¬Ґ­вл ўҐЄв®а бў®Ў®¤­ле з«Ґ­®ў");

window(15,14,64,14);

textbackground(LIGHTGRAY);

clrscr();

for(int i=0;i<n;i++)

{

clrscr();

cprintf("&bsol;r B[%d]=",i+1);

B[i]=float_input(); //ввод действительного числа

}

window(15,17,64,17);

textbackground(LIGHTGRAY);

clrscr();

cprintf("%s","&bsol;r „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

do

{ch=(char)getch();}

while(ch!=13); //пока не нажат ENTER

}

//------------------------------------------------------------------------------

//функция решения

//------------------------------------------------------------------------------

void decision(double **&A,double *&B,double *&X,int &n,int &s)

{

char ch,ans;

int k;

double *Z; //вспомогательный вектор

X=(double*)malloc(n*sizeof(double)); //Вектор решений

Z=(double*)malloc(n*sizeof(double)); //Вектор начальных приближений

for(int i=0;i<n;i++) Z[i]=1;

window(23,7,57,16);

textbackground(LIGHTGRAY);

textcolor(BLACK);

clrscr();

cprintf("&bsol;n&bsol;r ‚лЎЁаЁвҐ ¬Ґв®¤ аҐиҐ­Ёп: ");

cprintf("&bsol;n&bsol;r 1-ЊҐв®¤ Їа®бвле ЁвҐа жЁ©");

cprintf("&bsol;n&bsol;r 2-ЊҐв®¤ ‡Ґ©¤Ґ«п");

do

{ans=(char)getch();}

while((ans!='1')&&(ans!='2'));

if(ans=='1') //Метод простых итераций

{

s=0;

do

{

k=0;

for(int i=0;i<n;i++)

{

X[i]=B[i]*(-1);

for(int j=0;j<n;j++)

{X[i]=X[i]+(double)A[i][j]*Z[j];}

if(A[i][i]!=0)

{

if(fabs((double)X[i]/A[i][i])>=0.0001) k=1; //проверка на сходимость

X[i]=Z[i]-(double)X[i]/A[i][i]; //если сходится->k=0->выход из цикла

}

}

for(int i=0;i<n;i++)

Z[i]=X[i];

s++; // ++итерация

if(s==100) k=0; //если итераций > 100->выход из цикла

}

while(k!=0);

}

if(ans=='2') //Метод Зейделя

{

s=0;

do

{

k=0;

for(int i=0;i<n;i++)

{

X[i]=B[i]*(-1);

for(int j=0;j<n;j++)

{

if(A[i][j]!=0)

X[i]=X[i]+(double)A[i][j]*Z[j];

}

if(A[i][i]!=0)

{

if(fabs((double)X[i]/A[i][i])>=0.001) k=1; //проверка на сходимость

X[i]=Z[i]-(double)X[i]/A[i][i];

Z[i]=X[i];

}

}

s++;

if(s==100) k=0; //количество итераций должно быть менее 100

} //иначе цикл прекращается->система не имеет решений

while(k!=0);

}

cprintf("&bsol;n&bsol;n&bsol;r ђ бзсвл н Є®­зҐ­л");

cprintf("%s","&bsol;n&bsol;n&bsol;n&bsol;r „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

do

{ch=(char)getch();}

while(ch!=13);

}

//------------------------------------------------------------------------------

//функция вывода данных на экран или в файл

//------------------------------------------------------------------------------

void output(double **&A,double *&B,double *&X,int &n,int &s)

{

char ch_out;

int xx=5,yy=5; //переменные скроллинга

float temp; //вспомогательная переменная

window(1,25,80,25);

textbackground(LIGHTGRAY);

clrscr();

cprintf("Alt+X - exit Arrows - scrolling");

gotoxy(70,1);

textcolor(BLACK);

window(3,3,78,23);

textbackground(LIGHTGRAY);

textcolor(BLACK);

clrscr();

if(s!=100) //если система имеет решения

{

window(3,4,66,4);

textbackground(LIGHTGRAY);

clrscr();

cprintf("&bsol;r ‘Ёб⥬ га ў­Ґ­Ё©:"); //система уравнений

window(3,12,66,12);

textbackground(LIGHTGRAY);

clrscr();

cprintf("&bsol;r ‚ҐЄв®а аҐиҐ­Ё©"); //вектор решений

for(int i=0;i<n;i++)

{

if(i==0)

{

window(3,13,30,19);

textbackground(LIGHTGRAY);

clrscr();

}

if(i==5) //если число уравнений>5->во второй столбец

{

window(32,13,70,19);

textbackground(LIGHTGRAY);

clrscr();

}

cprintf("&bsol;n&bsol;r X(%d)=%.4f",i+1,X[i]); //вывод решения

}

window(3,20,66,20);

textbackground(LIGHTGRAY);

clrscr();

cprintf("&bsol;n&bsol;n&bsol;r —Ёб«® ЁвҐа жЁ©: %d",s); //число итераций

} //if...

else cprintf("&bsol;n&bsol;n ‘Ёб⥬ ­Ґ Ё¬ҐҐв аҐиҐ­Ё©");

window(14,22,66,22);

textbackground(LIGHTGRAY);

clrscr();

cprintf("&bsol;n&bsol;n&bsol;r „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

if(s!=100) //если система имеет решения, т.е. число итераций <100

{

window(4,5,77,10); //окно вывода системы уравнений(неактивное)

textbackground(LIGHTGRAY); //серый фон

textcolor(BLACK);

clrscr();

if(n<=5) //если система имеет не более 5 уравнений

{

for(int i=0;i<n;i++)

{

cprintf("&bsol;n&bsol;r ");

for(int j=0;j<=n;j++)

{

if(j==n) cprintf("=%.2f",B[i]); //вывод вектора свободных членов

else

{

if(j<n)

{

if(A[i][j]>0) cprintf(" + %.2fX(%d)",A[i][j],j+1);

else

{

temp=A[i][j]*(-1); //если выводится отрицательный коэффициент

cprintf(" - %.2fX(%d)",temp,j+1);

}

}

}

}

} //for(i<n)...

} //if(n<=5)...

else //если система имеет более 5 уравнений

{

window(4,6,72,10); //окно вывода системы уравнений(активное)

textbackground(BLUE); //синий фон

textcolor(WHITE);

do

{

clrscr();

for(int i=xx-5;i<xx;i++)

{

cprintf("&bsol;n&bsol;r ");

for(int j=yy-5;j<=yy;j++)

{

if(j==n) cprintf(" = %.2f",B[i]); //вывод вектора свободных членов

else

{

if(j<n)

{

if(A[i][j]>0) cprintf(" + %.2fX(%d)",A[i][j],j+1);

else

{

temp=A[i][j]*(-1);

cprintf(" - %.2fX(%d)",temp,j+1);