Доброго времени суток, вообщем подскажите пожалуйста на чем написана данная программа и в каком месте допущена ошибка, заранее спасибо.
#include <dos.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <math.h> //******************************************************** #define CT BLACK #define TBGr LIGHTGRAY #define N_menu 5 #define v_segm 0xb800 #define attr_txt 0x30 #define attr_ins 0x4e //******************************************************** int vvod_int(unsigned int&,unsigned long); int vvod_doub(double &,double,int); void error_win(char*); double Fx(double**,double*,double*,int); double GP(double, double); int Minimiz(double**,double*,double*,int); int Prost_It (double **,double *,double *,int); unsigned char attribut(int,int,int,unsigned char); void win_make(int,int,int,int,int,int,char*); void help(double **, double*, int); void param(double **, double*, int); void result(double **, double*, double*,int&); void win_clear(double **, double*, int); void kolich_ur(double**,double*,int&); void matric(double**, double*,int); void Global_menu(); void main(); //******************************************************** int vvod_int(unsigned int&Result,unsigned long Hi_Range)// ввод только положительных { unsigned long Ret = 0, // результат Test = 0, // временная перем. для проверки на диапазон Simbol = 0; // код введенного символа int num = 0; _setcursortype(_NORMALCURSOR);// покажем курсор for(;Simbol != 13 // пока не ввели конец ввода (Enter) { Simbol = getch(); // вводим символ if ((Simbol > 47) && (Simbol < 58)) // проверяем все цифры { Test = Ret*10 + (Simbol-48); // проверяем на диапазон if (Test <= Hi_Range) { Ret = Test; num++; if (Simbol == 48) // при вводе 0 - должен быть не первым символом { if ((num==1)||(Ret != 0)) putch((int)Simbol); else num--; // невыводим первыми нули и не устанавливаем флаг ввода } else putch((int)Simbol);// выводим на экран } } if (Simbol == 8) // проверка на ввод BackSpace { if (Ret != 0) // если есть что удалять - удаляем { Ret = Ret/10; // округлять не надо, т.к. вводим целые num--; putch((int)Simbol);putch(32);putch((int)Simbol); } else { if (num==1) {putch((int)Simbol);putch(32);putch((int)Simbol);} num=0; // кагда все обнулили - сбрасываем число введенных символов } } } if (num==0) // если ничего не ввели -> рез-т функции=0 { _setcursortype(_NOCURSOR); // скроем курсор return 0; } _setcursortype(_NOCURSOR);// скроем курсор Result=(unsigned int)Ret;// результат return 1; // возврат - успех } //******************************************************** int vvod_doub(double &Result,double Hi_Range,int Flag_Signed) {int Simbol = 0, // код символа Signed = 1, // флаг знака мантиссы Point = 0, // флаг точки мантиссы Sig = 0, // флаг знака порядка fE = 0, // флаг ввода e num = 0; // вводимый символ char * str; str=(char*)calloc(15+1,sizeof(char)); // выделяем память для массива for (num=0;num<=15;num++) str[num]='\0'; // обнуляем его _setcursortype(_NORMALCURSOR); // покажем курсор num=0; for (;(Simbol!=13)||(fabs(atof(str))>Hi_Range) { Simbol=getch(); if (fE==0) // ввод мантиссы { if (Point==0) // ввод целой части мантиссы { if ((Simbol==45)&&// вводим знак (Signed!=-1)&&(Flag_Signed==1)&&(num==0)) { Signed=-1; // устанавливаем флаг знака str[num]=Simbol; // запомнили символ num++; putch(Simbol); } if ((num<15)&&(Simbol > 47) && (Simbol < 58)) { // вводим только цифры { str[num]=Simbol; // запомнили символ num++; str[num]=0; if (fabs(atof(str))>Hi_Range) { num--; // превысили диапазон str[num]=0; } // вывод символа else putch(Simbol); } } if ((Simbol == 46)&&(Point != 1)&&(num<15)) // если ввели "точку" { Point = 1; // устанавливаем флаг дробной части str[num]=Simbol; num++; str[num]=0; if (fabs(atof(str))>Hi_Range) { num--; // превысили диапазон str[num]=0; } // вывод символа else putch(Simbol); } } // конец ввода целой части else { if ((num<15)&&(Simbol > 47) && (Simbol < 58)) // вводим дробную часть { str[num]=Simbol; num++; str[num]=0; if (fabs(atof(str))>Hi_Range) { num--; // превысили диапазон str[num]=0; } // вывод символа else putch(Simbol); } } if ((num<15)&&((Simbol=='e')||(Simbol=='E'))) { fE=1; str[num]=Simbol; num++; putch(Simbol); } } // конец ввода мантиссы else { if ((Simbol==45)&& // вводим знак '-' (Sig!=1)&&(num<15)) { Sig=1; // флаг знака str[num]=Simbol; // запомнили символ num++; str[num]=0; if (fabs(atof(str))>Hi_Range) { num--; // превысили диапазон str[num]=0; } // вывод символа else putch(Simbol); } if ((num<15)&&(Simbol > 47) && (Simbol < 58)) { // вводим только цифры Sig=1; // флаг установки знака str[num]=Simbol; // запомнили символ num++; str[num]=0; if (fabs(atof(str))>Hi_Range) { num--; // превысили диапазон str[num]=0; if (((str[num-1]=='e')||(str[num-1]=='E'))&&(num>1)) Sig=0; } // вывод символа else putch(Simbol); } } // конец ввода порядка if ((Simbol == 8)&&(num>0)) // при BackSpace { num--; // сбрасываем все установленные флаги if (fE==1) // в обратном порядке if (str[num]=='-') Sig=0; if (fE==0) if (str[num]=='-') Signed=1; if ((str[num]=='e')||(str[num]=='E')) { fE=0; Sig=0; } if (((str[num-1]=='e')||(str[num]=='E'))&&(num>1)) Sig=0; if (str[num]=='.') Point=0; putch(Simbol); // удаляем введенный символ с экрана putch(32); putch(Simbol); str[num]=0; } } if (num==0) // если ничего не ввели -> рез-т функции=0 { _setcursortype(_NOCURSOR); // скроем курсор return 0; } _setcursortype(_NOCURSOR);// скроем курсор Result=atof(str); // результат return 1; } //******************************************************** void error_win(char* text) { win_make(23,8,60,10,RED,WHITE,"Ошибка!"); textcolor(WHITE); gotoxy(3,1); cprintf("%s",text); textcolor(LIGHTGRAY); gotoxy(3,3); cprintf(" Нажмите любую клавишу..."); getch(); } //******************************************************** // Вычисление Функции F=|A1j*Xj-B1|+|A2j*Xj-B2|+..+|Anj*Xj-Bn| double Fx(double**A,double*B,double* X,int NN) { int i,j; double F=0,S; for (i=1;i<=NN;i++) { S=0; for (j=1;j<=NN;j++) S=S+A[j]*X[j]; S=fabs(S-B); F=F+S; } return F; } //******************************************************** int generat(int NN,double *r){ // генерация единичного вектора int i; double sum=0; for (i=1;i<=NN;i++) { r=random(1000); r=r-500; sum=sqrt(sum*sum+r*r); }; if (sum==0) sum=1e-38; for (i=1;i<=NN;i++) r=r/sum; return 0; } //----------------------------------------------------------------------// void Metod (double**A,double*B,int NN,double *X,double *S,int *loops) { int i,c0=0,c1=0; double F0,F1,xi[10],z[10],zi[10],r[10],Y=0.5,Lz,Am=0,Bm=0.5,eps; for (i=1;i<=NN;i++) { z=0; // предистория Am=sqrt(Am*Am+S*S); // начальный шаг }; F0=Fx(A,B,X,NN); do { if (c0>=32000) {*loops=32767;return;} c0++; // цикл изм-я точности Lz=0; for(i=1;i<=NN;i++) // длина вектора z Lz=sqrt(Lz*Lz+X*X); if (Lz==0) Lz=1; Bm=c1/c0; generat(NN,r); // генерируем вектор r for(i=1;i<=NN;i++) // xk xi=X+Am*(Bm*z/Lz+(1-Bm)*r); for(i=1;i<=NN;i++) { // zk zi=Y*z+(1-Y)*(xi[i]-X[i])*S[i]; } F1=Fx(A,B,xi,NN); eps=fabs(F1-F0); if (F1<F0) // успешно вычислили {c1++; for (i=1;i<=NN;i++) {X[i]=xi[i]; z[i]=zi[i];} F0=F1; Am=Am*1.1; // +10% } else { // неудачно вычислили Am=Am*0.9; // -10% }; } while (eps>=1e-15); *loops=c0; } //******************************************************************** int Minimiz(double**A,double*B,double*X,int NN) { double *S; int i, // Временная переменная организации циклов loops=0, c0; S =(double*)calloc(NN+1,sizeof(double)); // Выделяем память for (i=1;i<=NN;i++) {X[i]=0;S[i]=1;} do { c0=loops; Metod (A,B,NN,X,S,&loops); if (loops==32767) return 1; // дошли до предела циклов } while (c0!=loops); // как 2 раза получили одно и тоже значение - выход return 0; } //******************************************************** int Prost_It (double **A,double *B,double *X,int NN) { double *Xi; int i,j,S=0,K; Xi=(double*) calloc(NN+1,sizeof(double)); int g=0; for (i=1;i<=NN;i++) for (j=1;j<=NN;j++) if ((i!=j)&&(A[i][i]<=A[i][j])) g=1; if (g==1) return 1; do { K=0; for (i=1;i<=NN;i++) { Xi[i]=-B[i]; for (j=1;j<=NN;j++) Xi[i]=Xi[i]+A[i][j]*X[j]; if (A[i][i]==0) return 1; else if ((fabs(Xi[i]/A[i][i])>=1e-8)) K=1; Xi[i]=X[i]-Xi[i]/A[i][i]; } for (i=1;i<=NN;i++) X[i]=Xi[i]; S=S+1; } while (K==1); for (i=1;i<=NN;i++) X[i]=Xi[i]; free(Xi); return 0; } //******************************************************** unsigned char attribut(int x,int y,int l,unsigned char atr) { int i,adr; unsigned char btr; for (i=0;i<l;i++) { adr=160*(y-1)+2*x+i*2-1; btr= peekb(v_segm,adr); pokeb(v_segm,adr,atr); } return(btr); } //******************************************************** void win_make(int xh,int yh,int xl,int yl,int cf,int cr,char* win_nam) { char m[6]={"+=+|++"}; int i,l; if (strlen(win_nam)>(xl-xh-1)) strncpy(win_nam,win_nam,xl-xh-1); window(xh-2,yh-1,xl+2,yl+1); textbackground(cf); textcolor(cr); clrscr(); gotoxy(2,1); putch(m[0]); for (i=xh; i<=xl; i++) putch(m[1]); putch(m[2]); for (i=yh; i<=yl; i++) { gotoxy(2,i-yh+2); putch(m[3]); gotoxy(xl-xh+4,i-yh+2);putch(m[3]); } gotoxy(2,yl-yh+3); putch(m[4]); for (i=xh; i<=xl; i++) putch(m[1]); putch(m[5]); l=(xl-xh-strlen(win_nam)+5)/2; gotoxy(l,1); cprintf(" %s ",win_nam); window(xh,yh,xl,yl); clrscr(); } //******************************************************** void help(double **A, double *B, int NN) //About { win_make(20,7,60,17,1,15,"О программе"); textcolor(LIGHTRED);gotoxy(14,1); cprintf("Курсовая работа"); textcolor(YELLOW); gotoxy(7,2); cprintf("на тему: Разработка программы,"); gotoxy(2,3); cprintf("реализующей методы: 1) простых итераций"); gotoxy(2,4); cprintf(" 2) минимизации"); gotoxy(3,5); cprintf("для решения систем линейных уравнений"); textcolor(WHITE); gotoxy(12,8); cprintf("Выполнил: ст.гр.СК-07"); gotoxy(17,9); cprintf("Гаевский А.М."); textcolor(8); gotoxy(10,11); cprintf("Нажмите любую клавишу..."); getch(); win_clear(A,B,NN); } //******************************************************** void param(double **A, double* B, int NN) { if (NN==0) return; int i,j; win_make(3,17,78,23,1,15,"Система уравнений"); textcolor(15); gotoxy(2,1); cprintf("Количество уравнений: %d",NN); gotoxy(2,2); cprintf("Матрица коэффициентов:"); gotoxy(3,3); for(i=1;i<=NN;i++) { for(j=1;j<=NN;j++) { cprintf("%11.4e ",A[i][j]); } if (i!=NN) cprintf("|%11.4e\r\n ",B[i]); else cprintf("|%11.4e",B[i]); } } //******************************************************** void result(double **A, double* B, double *X,int &NN,int k) { int i,j,fl=0; for (i=1;i<=NN;i++) { for (j=1;j<=NN;j++) if (A[i][j]!=0) fl=1; if (B[i]!=0) fl=1; } if ((NN==0)||(fl==0)) { error_win(" Введите матрицу!"); win_clear(A,B,NN); return; } win_make(3,9,78,13,BLUE,15,"Результат"); switch(k) { case 1: {cprintf("Решение по методу простых итераций:\n\r"); for (i=1;i<=NN;i++) cprintf("|_____X%d_____",i); cprintf("|\r\n"); for (i=1;i<=NN;i++) {X[i]=0;} if (Prost_It(A,B,X,NN)==0) { for (i=1;i<=NN;i++) cprintf("|%12.4e",X[i]); cprintf("|\r\n"); } else cprintf("| Условие сходимости не выполняется.\n\r"); break; } case 2:; { for (i=1;i<=NN;i++) {X[i]=0;} cprintf("Решение по методу минимизации:\n\r"); for (i=1;i<=NN;i++) cprintf("|_____X%d_____",i); cprintf("|\r\n"); if (Minimiz(A,B,X,NN)==0) { for (i=1;i<=NN;i++) cprintf("|%12.4e",X[i]); cprintf("|\r\n"); } else cprintf("| Невозможно получить решение..."); } break; default:break; } textcolor(LIGHTGRAY); cprintf("\r\n Нажми любую клавишу..."); getch(); /* NN=0; //Очистка for (i=1;i<=NN;i++) { for (j=1;j<=NN;j++) A[i][j]=0.0; B[i]=0.0; }*/ win_clear(A,B,NN); } //******************************************************** void win_clear(double **A, double *B, int NN) { int i; window(1,2,80,25); textbackground(TBGr); textcolor(CT); clrscr(); for(i=0;i<80*23;i++) putch('#'); window(1,1,80,1); textbackground(LIGHTGRAY); textcolor(CT); clrscr(); cprintf(" Решение СЛАУ методами простых итераций и минимизации"); window(1,25,80,25); textbackground(TBGr); textcolor(CT); clrscr(); textcolor(4); cprintf(" Alt-X");textcolor(0);cprintf(" - Выход"); param(A,B,NN); win_make(3,3,20,7,3,0,"Меню"); gotoxy(1,1); cprintf(" 1 Помощь"); gotoxy(1,2); cprintf(" 2 Число ур-ний"); gotoxy(1,3); cprintf(" 3 Ввод системы"); gotoxy(1,4); cprintf(" 4 Пр.итераций"); gotoxy(1,5); cprintf(" 5 Минимизация"); } //******************************************************** void kolich_ur(double **A,double* B,int &NN) { unsigned int tmp; win_make(3,9,78,9,1,15,"Введите количество уравнений"); textcolor(15); _setcursortype(_NORMALCURSOR); do { gotoxy(3,1); cprintf("Введите количество уравнений (<=%d):",5); if (vvod_int(tmp,5)!=0) NN=tmp; else NN=0; } while (NN<1); _setcursortype(_NOCURSOR); int i,j; for (i=1;i<=NN;i++) { for (j=1;j<=NN;j++) A[i][j]=0; B[i]=0; } win_clear(A,B,NN); } //******************************************************** void matric(double **A, double *B,int NN) { int i,j; double tmp; if (NN==0) { error_win(" Введите к-во уравнений!"); win_clear(A,B,NN); return; } win_make(3,9,78,13,1,15,"Ввод матрицы коэффициентов: "); textcolor(15); gotoxy(1,1); _setcursortype(_NORMALCURSOR); cprintf(" Введите коэффициенты матрицы [%d][%d]:\r\n",NN,NN); for (i=1;i<=NN;i++) for (j=1;j<=NN;j++) { cprintf(" Введите A[%d][%d] (-1e+38..1e+38, Enter=%11.4e):",i,j,A[i][j]); if (vvod_doub(tmp,1e+38,1)!=0) A[i][j]=tmp; else cprintf("%11.4e",A[i][j]); cprintf("\r\n"); } cprintf("\r\n Введите вектор:\r\n"); for (i=1;i<=NN;i++) { cprintf(" Введите B[%d] (-1e+38..1e+38, Enter=%11.4e):",i,B[i]); if (vvod_doub(tmp,1e+38,1)!=0) B[i]=tmp; else cprintf("%11.4e",B[i]); cprintf("\r\n"); } _setcursortype(_NOCURSOR); win_clear(A,B,NN); } //******************************************************** void Global_menu() { double **A, // Коэффициенты *X, // Решение *B; // Вектор int NN=0; // Кол-во уравнений //******************************************************** int i=1,j=1; A=(double**) calloc(7,sizeof(double *)); for (i=1;i<6;i++) {A[i] = (double*) calloc(7,sizeof(double));} X=(double*) calloc(7,sizeof(double)); B=(double*) calloc(7,sizeof(double)); char key=' '; win_clear(A,B,NN); i=1;j=1; for (; { attribut(3,j+2,18,attr_txt); attribut(3,i+2,18,attr_ins); key=getch(); switch (key) {case '1':help(A,B,NN); key=' ';j=i;i=1; break; case '2':kolich_ur(A,B,NN); key=' ';j=i;i=2; break; case '3':matric(A,B,NN); key=' ';j=i;i=3; break; case '4':result(A,B,X,NN,1); key=' ';j=i;i=4; break; case '5':result(A,B,X,NN,2); key=' ';j=i;i=5; break; case 13 :switch (i) { case 1 : help(A,B,NN); key=' ';j=i; break; case 2 : kolich_ur(A,B,NN);key=' ';j=i; break; case 3 : matric(A,B,NN); key=' ';j=i; break; case 4 : result(A,B,X,NN,1); key=' ';j=i; break; case 5 : result(A,B,X,NN,2); key=' ';j=i; break; } break; case 0 :switch(getch()) { case 80 : j=i; if (i==N_menu) i=1; else i++; break; case 72 : j=i; if (i==1) i=N_menu; else i--; break; case 45 : { window (1,1,80,25); textcolor(15); textbackground(0); clrscr(); return; } } break; } } } //******************************************************** void main(void) { _setcursortype(_NOCURSOR); randomize(); Global_menu(); _setcursortype(_NORMALCURSOR); }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
//******************************************************** unsigned char attribut(int x,int y,int l,unsigned char atr) { int i,adr; unsigned char btr; for (i=0;i<l;i++) { adr=160*(y-1)+2*x+i*2-1; btr= peekb(v_segm,adr); pokeb(v_segm,adr,atr); } return(btr); } //******************************************************** badblock