48647 (608705), страница 3
Текст из файла (страница 3)
}
//------------------------------------------------------------------------------
//текст задания
//------------------------------------------------------------------------------
void task()
{
char ch;
window(21,6,62,20);
textbackground(BLACK);
clrscr();
window(20,5,61,19);
textbackground(LIGHTGRAY);
textcolor(BLACK);
clrscr();
cprintf("\n\n\n\r ђ §а Ў®в вм Їа®Ја ¬¬г ¤«п аҐиҐЁп бЁб⥬");
cprintf("\n\r «ЁҐ©ле га ўҐЁ©. ђҐ «Ё§®ў вм ¬Ґв®¤л: ");
cprintf("\n\r )Їа®бвле ЁвҐа жЁ©; Ў)‡Ґ©¤Ґ«п. ЏаҐ¤гᬮ-");
cprintf("\n\r ваҐвм ўў®¤ зЁб« га ўҐЁ©(¤® 10), ¬ в-");
cprintf("\n\r аЁжл Є®нддЁжЁҐв®ў Ё ўҐЄв®а бў®Ў®¤ле ");
cprintf("\n\r з«Ґ®ў.");
cprintf("\n\n\n\n\n\r „«п Їа®¤®«¦ҐЁп ¦¬ЁвҐ ");
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","\n\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","\n\n\r ‚ўҐ¤ЁвҐ зЁб«® га ўҐЁ© (1..10)");
window(48,8,51,8);
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
bool fl=false;
do //защита от ввода числа уравнений более 10
{
n=n_input(2); //функция ввода двузначного числа
if((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","\r ‚ўҐ¤ЁвҐ н«Ґ¬Ґвл ¬ ваЁжл Є®нддЁжЁҐв®ў");
window(15,11,64,11);
textbackground(LIGHTGRAY);
clrscr();
for(int i=0;i { A[i]=(double*)malloc(n*sizeof(double)); for(int j=0;j { clrscr(); cprintf("\r A[%d][%d]=",i+1,j+1); A[i][j]=float_input(); //ввод действительного числа } } window(15,13,64,13); textbackground(LIGHTGRAY); clrscr(); cprintf("%s","\n\n\r ‚ўҐ¤ЁвҐ н«Ґ¬Ґвл ўҐЄв®а бў®Ў®¤ле з«Ґ®ў"); window(15,14,64,14); textbackground(LIGHTGRAY); clrscr(); for(int i=0;i { clrscr(); cprintf("\r B[%d]=",i+1); B[i]=float_input(); //ввод действительного числа } window(15,17,64,17); textbackground(LIGHTGRAY); clrscr(); cprintf("%s","\r „«п Їа®¤®«¦ҐЁп ¦¬ЁвҐ "); 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 window(23,7,57,16); textbackground(LIGHTGRAY); textcolor(BLACK); clrscr(); cprintf("\n\r ‚лЎЁаЁвҐ ¬Ґв®¤ аҐиҐЁп: "); cprintf("\n\r 1-ЊҐв®¤ Їа®бвле ЁвҐа жЁ©"); cprintf("\n\r 2-ЊҐв®¤ ‡Ґ©¤Ґ«п"); do {ans=(char)getch();} while((ans!='1')&&(ans!='2')); if(ans=='1') //Метод простых итераций { s=0; do { k=0; for(int i=0;i { X[i]=B[i]*(-1); for(int j=0;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 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 { X[i]=B[i]*(-1); for(int j=0;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("\n\n\r ђ бзсвл н Є®зҐл"); cprintf("%s","\n\n\n\r „«п Їа®¤®«¦ҐЁп ¦¬ЁвҐ "); 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("\r ‘Ёб⥬ га ўҐЁ©:"); //система уравнений window(3,12,66,12); textbackground(LIGHTGRAY); clrscr(); cprintf("\r ‚ҐЄв®а аҐиҐЁ©"); //вектор решений for(int i=0;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("\n\r X(%d)=%.4f",i+1,X[i]); //вывод решения } window(3,20,66,20); textbackground(LIGHTGRAY); clrscr(); cprintf("\n\n\r —Ёб«® ЁвҐа жЁ©: %d",s); //число итераций } //if... else cprintf("\n\n ‘Ёб⥬ Ґ Ё¬ҐҐв аҐиҐЁ©"); window(14,22,66,22); textbackground(LIGHTGRAY); clrscr(); cprintf("\n\n\r „«п Їа®¤®«¦ҐЁп ¦¬ЁвҐ "); if(s!=100) //если система имеет решения, т.е. число итераций <100 { window(4,5,77,10); //окно вывода системы уравнений(неактивное) textbackground(LIGHTGRAY); //серый фон textcolor(BLACK); clrscr(); if(n<=5) //если система имеет не более 5 уравнений { for(int i=0;i { cprintf("\n\r "); for(int j=0;j<=n;j++) { if(j==n) cprintf("=%.2f",B[i]); //вывод вектора свободных членов else { if(j { 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 } //if(n<=5)... else //если система имеет более 5 уравнений { window(4,6,72,10); //окно вывода системы уравнений(активное) textbackground(BLUE); //синий фон textcolor(WHITE); do { clrscr(); for(int i=xx-5;i { cprintf("\n\r "); for(int j=yy-5;j<=yy;j++) { if(j==n) cprintf(" = %.2f",B[i]); //вывод вектора свободных членов else { if(j { 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); } } } } } ch_out=(char)getch(); if((ch_out==80)&&(xx!=n)) xx++; //при нажатии "стрелки вниз" прокрутка вниз if((ch_out==72)&&(xx!=5)) xx--; //при нажатии "стрелки вверх" прокрутка вверх if((ch_out==77)&&(yy!=n)) yy++; //при нажатии "стрелки вправо" прокрутка вправо if((ch_out==75)&&(yy!=5)) yy--; //при нажатии "стрелки влево" прокрутка влево } while(ch_out!=27); //при нажатии ESC //скроллинг становится неактивным window(4,6,77,10); //окно вывода системы уравнений(неактивное) textbackground(LIGHTGRAY); //серый фон textcolor(BLACK); clrscr(); //выводим систему уравнений в новом неактивном окне for(int i=xx-5;i { cprintf("\n\r "); for(int j=yy-5;j<=yy;j++) { if(j==n) cprintf(" = %.2f",B[i]); //вывод вектора свободных членов else { if(j { 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); } } } } } window(22,22,53,22); textbackground(BLUE); textcolor(WHITE); clrscr(); cprintf("\r„«п Їа®¤®«¦ҐЁп ¦¬ЁвҐ "); //подсвечиваем строку синим фоном } //else(n<=5)... } do //пока не нажата клавиша ENTER {ch_out=(char)getch();} while(ch_out!=13); } //------------------------------------------------------------------------------ //============================================================================== main() { int n, //число уравнений m_num=1, s; //число итераций char ch,ch2; bool inpflag=false,decflag=false; //флаги состояния double *X, //вектор решений **A, //матрица коэффициентов *B; //вектор свободных членов _setcursortype(_NOCURSOR); //убираем курсор do { menu(); cursor(m_num); ch=(char)getch(); if((ch=='h')||(ch=='H')||((ch==13)&&(m_num==1))) help(); if((ch=='i')||(ch=='I')||((ch==13)&&(m_num==2))) {input(A,B,n);inpflag=true;} if(((ch=='o')||(ch=='O')||((ch==13)&&(m_num==4)))&&(inpflag==false)&&(decflag==false)) { window(28,9,55,14); textbackground(BLACK); clrscr(); window(27,8,54,13); textbackground(LIGHTGRAY); textcolor(BLACK); clrscr(); cprintf("\r\n „ лҐ Ґ ўўҐ¤Ґл Ё Ґ"); cprintf("\r\n Ї®«г祮 аҐиҐЁҐ!"); cprintf("\n\n\r „«п ўл室 ¦¬ЁвҐ Esc"); do {ch2=(char)getch();} while(ch2!=27); } if(((ch=='o')||(ch=='O')||((ch==13)&&(m_num==4)))&&(inpflag==true)&&(decflag==false)) { window(28,9,55,14); textbackground(BLACK); clrscr(); window(27,8,54,13); textbackground(LIGHTGRAY); textcolor(BLACK); clrscr(); cprintf("\r\n ЌҐ Ї®«г祮 аҐиҐЁҐ!"); cprintf("\n\n\n\r „«п ўл室 ¦¬ЁвҐ Esc"); do {ch2=(char)getch();} while(ch2!=27); } if(((ch=='o')||(ch=='O')||((ch==13)&&(m_num==4)))&&(inpflag==true)&&(decflag==true)) {output(A,B,X,n,s);decflag=false;} if(((ch=='d')||(ch=='D')||((ch==13)&&(m_num==3)))&&(inpflag==true)) {decision(A,B,X,n,s);decflag=true;} if(((ch=='d')||(ch=='D')||((ch==13)&&(m_num==3)))&&(inpflag==false)) { window(28,9,55,14); textbackground(BLACK); clrscr(); window(27,8,54,13); textbackground(LIGHTGRAY); textcolor(BLACK); clrscr(); cprintf("\r\n „ лҐ Ґ ўўҐ¤Ґл!"); cprintf("\n\n\n\r „«п ўл室 ¦¬ЁвҐ Esc"); do {ch2=(char)getch();} while(ch2!=27); } if(ch==77) {if(m_num!=4) m_num++;} //клавиши "стрелка вправо" и if(ch==75) {if(m_num!=1) m_num--;} //"стрелка влево" } while(ch!=45); //пока не нажата комбинация ALT+X } //============================================================================== Приложение Г (справочное) Библиографический список 1. Боглаев, Ю.П. Вычислительная математика и программирование: Учебное пособие для студентов ВТУЗов[текст]/Ю.П. Боглаев. -М.: Высшая школа, 1990.- 544с. 2. Подбельский, В.В. Программирование на языке Си: Учебное пособие [Текст]/ С.С. Фомин - М.: Финансы и статистика, 1998. - 600 с.















