На чем написана C/C++? Что за Ошибка

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by qssD, 9 Jan 2011.

  1. qssD

    qssD New Member

    Joined:
    16 Dec 2010
    Messages:
    31
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток, вообщем подскажите пожалуйста на чем написана данная программа и в каком месте допущена ошибка, заранее спасибо.
     
    #1 qssD, 9 Jan 2011
    Last edited: 9 Jan 2011
  2. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    на С\С++
     
  3. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    Где?
     
  4. qssD

    qssD New Member

    Joined:
    16 Dec 2010
    Messages:
    31
    Likes Received:
    0
    Reputations:
    0
    #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]
     
    #4 qssD, 9 Jan 2011
    Last edited by a moderator: 9 Jan 2011
  5. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    Воовбе то это С, не перемешаный с плюсами.

    А копаться в этом скопе гуана нет никакого желания.
     
    #5 Edward, 9 Jan 2011
    Last edited: 9 Jan 2011
  6. qssD

    qssD New Member

    Joined:
    16 Dec 2010
    Messages:
    31
    Likes Received:
    0
    Reputations:
    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);
    }
    //********************************************************

    badblock
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Судя по всему это Borland C который под MS DOS
     
Loading...
Similar Threads - написана Ошибка
  1. Peja
    Replies:
    0
    Views:
    2,690