p align="left">{ 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("\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<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("\n\n\r ђ бзсвл н Є®зҐл"); cprintf("%s","\n\n\n\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("\r `Ёб⥬ га ўҐЁ©:"); //система уравнений window(3,12,66,12); textbackground(LIGHTGRAY); clrscr(); cprintf("\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("\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 „«п Їа®¤®«¦ҐЁп ¦¬ЁвҐ <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("\n\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("\n\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); } } } } } 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<xx;i++) { cprintf("\n\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); } } } } } window(22,22,53,22); textbackground(BLUE); textcolor(WHITE); clrscr(); cprintf("\r„«п Їа®¤®«¦ҐЁп ¦¬ЁвҐ <Enter>"); //подсвечиваем строку синим фоном } //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 с.
Страницы: 1, 2, 3, 4
|