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

  • Автор темы fen99
  • Дата начала
F

fen99

Гость
#1
Помогите пожалуйста! Мне нужно поменять размерность массива. Нужно чтобы считал полиномы в степени до 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]