Калькулятор полиномов. Помогите исправить ошибку

Тема в разделе "Общие вопросы по С и С++", создана пользователем fen99, 20 июн 2008.

  1. fen99

    fen99 Гость

    Помогите пожалуйста! Мне нужно поменять размерность массива. Нужно чтобы считал полиномы в степени до 100 а считает тока до 9. Прогу писала не я. Я понимаю что надо поменять цифры в массиве но у меня ничего не работает.((( я блондинко
    [codebox]#include <stdio.h>
    #include <conio.h>
    typedef struct //структура для хранения одного элемента многочлена
    {
    int zna4; //основание элемента
    int step; //показатель степени элемента
    }odn;

    int stp1,stp2,el2kol,el1kol,reskol,cn1,cn2; //переменные типа int
    odn arone[9],artwo[9],rezult[19]; //многочлены превый второй и рез-т операции с ними

    int readinfo ( odn a[9] ) //получение многочленов
    {
    int el,next; //кол-во эл-тов многочлена и
    el=-1; //изначально кол-во считаем равным -1
    do
    {
    el=el+1; //увеличиваем счётчик кол-ва элементов
    printf ( "Vi vvodite element mnogo4lena # %d\n",el+1); //вывод запроса на экран с номером эл-та
    printf ( "Pozalujsta,vvedite osnovanie elementa\n" ); //вывод запроса на ввод основания эл-та
    scanf ( "%d",&a[el].zna4 ); //ввод значения основания элемента
    printf ( "Pozalujsta,vvedite stepen elementa\n" ); //вывод запроса на ввод показателя степени эл-та
    scanf ( "%d",&a[el].step ); //ввод показателя степени эл-та
    if ( el==8 ) //если номер эл-та равен восьми
    printf ( "Vi vveli maksimalnoe koli4estvo elementov\n" ); //выводим сообщение
    else
    {
    printf ( "Esli zelaete vvesti ewe odin element,vvedite simvol 1\n" );//вывод запроса на продолжение
    scanf ( "%d",&next ); //получаем значение переменой next
    }
    }
    while ( next==1||el==9 ); //до тех пор пока next не равно 1 или el не равно 9
    return el; //возвращаем количество элементов
    }
    void vivod ( odn arr[19],int tmel ) //функция вывода результата
    {
    int c,b; //переменные c и b типа int
    b=0;
    for ( c=0;c<tmel+1;c++ ) //пока c < количества элементов в многочлене
    if ( arr[c].zna4!=0 ) //если значение степени эл-та с номером c не равно нулю
    {
    if ( b==1 ) if ( arr[c].zna4>0 ) printf ( "+" ); //если b равно единице и значение основания эл-та больше нуля то выводим +
    if ( arr[c].zna4!=1 && arr[c].zna4!=0 ) printf ( "%d",arr[c].zna4 ); //если основание эл-та не равно 1 или 0 выводим основание
    else if ( arr[c].zna4==1 && arr[c].step==0 ) printf ( "%d",arr[c].zna4 ); //иначе если основание равно 1 и степень равна 0 выводим основание
    if ( arr[c].step>0 ) printf ( "X" ); //если показатель степени больше нуля то выводим "X"
    if ( arr[c].step>1 ) printf ( "%d",arr[c].step ); //если показатель больше 1 выводим его
    if ( arr[c].zna4!=0 ) b=1; //если значение не равно нулю b = 1
    }
    printf ( "\n" ); //переходим на сл строку
    }


    int zna4 ( odn a[9],int k,int con ) //функция получения основания эл-та по его степени
    {
    int cn33,zn; //переменные типа int
    zn=0;
    for ( cn33=0;cn33<con;cn33++ ) //пока cn33 меньше количества эл-тов
    {
    if ( a[cn33].step==k ) zn=a[cn33].zna4; //если значение степени равно k zn присвоить значение показателя этой степени
    }
    return zn; //возвращаем zn
    }

    int maxstep ( odn a[9],int kol ) //функция получения
    {
    int cn5,cn6,s; //переменные типа int
    s=0;
    for ( cn5=0;cn5<kol+1;cn5++ ) //пока cn5 <= количества элементов в многочлене
    if ( a[cn5].zna4!=0 && a[cn5].step>s ) s=a[cn5].step; //если показатель не равен 1 и степень больше s то это и есть наибольшая степень
    return s; //возвращаем s
    }
    void slozvi4 ( odn ar1[9],odn ar2[9],odn res[19],int el1,int el2,int znak ) //функция сложения
    {
    int tmpel2,bol;
    reskol=-1;
    for ( cn1=0;cn1<el1+1;cn1++ ) //пока cn1 меньше либо равно количества элементов первого многочлена
    {
    reskol=reskol+1; //ув счётчик кол-ва эл-тов результата
    res[reskol].step=ar1[cn1].step; //степень элемента результата приваиваем степени операнда
    res[reskol].zna4=ar1[cn1].zna4; //основание эл-та рез-та равно основанию операнда
    for ( cn2=0;cn2<el2+1;cn2++ ) //пока значение cn2 меньше количества элементов второго многочлена
    {
    if ( ar1[cn1].step==ar2[cn2].step ) //если степени однаковы
    {
    if ( znak==1 ) res[reskol].zna4=res[reskol].zna4+ar2[cn2].zna4; //если знак операции + то сложить основания эл-тов
    else res[reskol].zna4=res[reskol].zna4-ar2[cn2].zna4; //иначе вычесть основания эл-тов
    }
    }
    }
    for ( cn1=0;cn1<el2+1;cn1++ ) //пока значение cn1 меньше либо количества элементов второго многочлена
    {
    bol=0;
    for ( cn2=0;cn2<reskol+1;cn2++ ) //пока сn2 <= количества элементов результата
    if ( ar2[cn1].step==res[cn2].step ) bol=1; //если степень элемента второго многочлена равна степени рез-та то bol=1
    if ( bol==0 ) //если bol равно нулю
    {
    reskol=reskol+1; //увеличиваем количество элементов рез-та
    if ( znak==1 ) //если znak равно 1
    res[reskol].zna4=ar2[cn1].zna4 ; //значению основания эл-та рез-та присваиваем значение основания 2 многочлена
    else res[reskol].zna4=ar2[cn1].zna4*-1; //иначе значению основания эл-та рез-та присваиваем значение основания 2 многочлена с противоположным знаком

    res[reskol].step=ar2[cn1].step; //показателю степени эл-та результата присваиваем показатель степени эл-та второго многочлена
    }
    }
    }
    void umnozenie ( odn ar1[9],odn ar2[9], odn rem[19],int el1,int el2 )
    {
    int s4,cn11;
    reskol=-1;
    el1=el1+1;
    el2=el2+1;
    for ( s4=0;s4<stp1+stp2+1;s4++ ) //пока s4 меньше либо равно сумме количества элементов многочленов
    {
    reskol=reskol+1; //увеличиваем кол-во эл-тов рез-та
    rem[reskol].zna4=0; //значение эл-та ноль
    for ( cn11=0;cn11<s4;cn11++ ) //пока cn11 меньше либо равно s4
    {
    rem[reskol].zna4=rem[reskol].zna4+zna4 ( ar1,cn11,el1 ) *zna4 ( ar2,s4-cn11,el2 ); //получаем и присваиваем новое значение элемента
    }


    rem[reskol].step=s4; //присвиваем степень элемета
    }
    }

    void delenie ( odn ar1[9],odn ar2[9] ) //функция деления
    {
    odn tmp[9],tmp2[19],tmp3[9],ost[100],rez[100],reztmp[9];
    float delzntmp;
    int delst,resel,eltmp2,eltmp,s4t,delzn;
    resel=-1;
    stp2=maxstep ( ar2,el2kol ); //stp2 присваиваем значение максимальной степени второго многочлена
    eltmp=el1kol; //eltmp присваиваем кол-во элементов первого многочлена
    for ( delst=0;delst<el1kol+1;delst++ ) tmp[delst]=ar1[delst]; //пока delst меньше либо равно кол-ва эл-тов первого многочлена эл-ту многочлена tmp присваиваем элемент первого многочлена

    do
    {
    resel=resel+1; //увеличиваем кол-во
    delzn = zna4 ( tmp,stp1,eltmp ) / zna4 ( artwo,stp2,el2kol ); //основание элемена частное от деления оснований операндов
    delst=stp1-stp2; //степень равна разности степеней элементов операндов
    rez[resel].zna4=delzn; //основание результата
    rez[resel].step=delst; //степень результата
    reztmp[0].zna4=delzn; //во временный многочлен сохраняем основание...
    reztmp[0].step=delst; //и показатель стеени результата
    umnozenie ( artwo,reztmp,tmp2,el2kol,1 ); //перемножаем этот временный многочлен на второй многочлен и рез-т вносим в многочлен tmp


    eltmp2=reskol; //eltmp2 присваиваем количество элементов в многочлене результата
    slozvi4 ( tmp,tmp2,tmp3,eltmp,eltmp2,0 ); //складываем многочлены tmp и tmp2 результат заносим в tmp3
    for ( cn2=0;cn2<reskol+1;cn2++ ) tmp[cn2]=tmp3[cn2]; //пока cn2 меньше либо равно количества элементов результата

    stp1=maxstep ( tmp3,reskol ); //stp1 присваиваем максимальную степень многочлена tmp3
    eltmp=reskol;
    }
    while ( stp1>=stp2 ); //повторяем пока stp1 >= stp2
    printf ( "Rezultat delenija\n" ); //вывод на экран
    printf ( "4astnoe\n" );
    vivod ( rez,resel ); //вывод результата
    printf ( "\n" );
    printf ( "Ostatok\n" );
    vivod ( tmp3,reskol ); //вывод остатка
    }
    Void main() //главная функция программы
    {
    int vvod,choice;
    printf ( "Vvedite 1 esli zelaete vvesti mnogo4len vru4nuju\n" ); //вывод запроса на экран
    scanf ( "%d",&vvod ); //ввод значения переменной vvod
    if ( vvod!=1 ) //если vvod не равно 1 то заполняем многочлены программно (16x^3+8x^2-5x+7 и -x^2+2x)
    {
    arone[0].zna4=16;
    arone[0].step=3;
    arone[1].zna4=8;
    arone[1].step=2;
    arone[2].zna4=-5;
    arone[2].step=1;
    arone[3].zna4=7;
    arone[3].step=0;
    artwo[0].zna4=4;
    artwo[0].step=2;
    artwo[1].zna4=-1;
    artwo[1].step=1;
    artwo[2].zna4=2;
    artwo[2].step=0;
    el1kol=3;
    el2kol=2;
    }
    else //иначе
    {
    el1kol=readinfo ( arone ); //считываем первый многочлен
    el2kol=readinfo ( artwo ); //считываем второй могочлен
    }
    //вывод запроса
    printf ( "---------------------------------- \n" );
    printf ( "Viberite dejstvie \n" );
    printf ( "1. Slozenie 2. Vi4itanie \n" );
    printf ( "3. Umnozenie 4. Delenie \n" );
    printf ( "----------------------------------\n " );
    scanf ( "%d",&choice ); //получаем номер операции
    printf ( "Mnogo4len 1\n" );
    vivod ( arone,el1kol ); //выводим первый многочлен
    printf ( "Mnogo4len 2\n" );
    vivod ( artwo,el2kol ); //выводим второй многочлен
    stp1=maxstep ( arone,el1kol ); //получаем степень первого многочлена
    stp2=maxstep ( artwo,el2kol ); //получаем степень второго многочлена
    switch ( choice ) //проверяем значение операции
    {
    case 1: slozvi4 ( arone,artwo,rezult,el1kol,el2kol,1 );printf ( "Summa\n" );vivod ( rezult,reskol );break; //если 1 складываем многочлены

    case 2: slozvi4 ( arone,artwo,rezult,el1kol,el2kol,0 );printf ( "Raznost\n" );vivod ( rezult,reskol );break;//если 2 то вычитаем

    case 3: umnozenie ( arone,artwo,rezult,el1kol,el2kol );printf ( "Proizvedenie\n" );vivod ( rezult,reskol );break;//если 3 то перемножаем

    case 4: delenie ( arone,artwo);break; //если 4 то делим первый на втрой
    }
    getche(); //задержка экрана
    }[/codebox]
     
Загрузка...
Похожие Темы - Калькулятор полиномов Помогите
  1. DreamForse
    Ответов:
    0
    Просмотров:
    2.220
  2. users574
    Ответов:
    0
    Просмотров:
    2.006
  3. Bonuse
    Ответов:
    1
    Просмотров:
    1.696
  4. Powinteh
    Ответов:
    0
    Просмотров:
    1.087
  5. Powinteh
    Ответов:
    1
    Просмотров:
    1.078

Поделиться этой страницей