Skocz do zawartości
wolk

Wielomiany N-tego Stopnia W Zwyklym C

Rekomendowane odpowiedzi

napotkalem na dosc upierdliwy problem przy robieniu programiku do obliczania czegostam przy wielomianach n-tego stopnia...

 

mianowicie uzytkownik ma wpisac wielomian n-tego stopnia w postaci np. 24x^5+34x^3-3x^2-x+55 <enter>

wszystko to jak wiadomo po scanfie() wyladuje do CHAR i mozna sie z tym bawic, po wyjeciu przerobieniu tego na INT.

 

maly mankament przychodzi gdy programik ma byc idiotoodporny. tj. jesli gdzies bedzie np. 4x^5++6x^2 to na ekranie kursor ma zaznaczyc miejsce w ktorym wystapil nieodpowiedni znak.

 

moja strategia polega na tym zeby, sprawdzac bledy z pomoca niewygodnych petli, zrobic oddzielna tablice dla wspolczynnikow i poteg, kazda dwu wymiarowa. a nastepnie wyluskiwac wartosci INT potrzebne do obliczen uzywajac atoi().

 

i tutaj po moim niezgrabnym opisie kluczowe pytanie. czy ktos kiedys robil cos podobnego, albo ma jakis pomysl, ktory znaczaco algorytmicznie uprosci kod (zastapienie tych tablic czyms wygodniejszym albo uprościć weryfikacje bledow)?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

wklejam to bo skonczylem i byc moze komus sie przyda... program oblicza pochodne wielomianow n-tego stopnia... aha... zmienne globalne wystepuja tu ot tak dla denerwowania co po niektorych... w 3sek. mozna

sie ich pozbyc

 

#include <stdio.h>#include <stdlib.h>#include <ctype.h>/*zmienne dostepne dla wszystkich funkcji*/char wielomian[225];/*Zmienna tekstowa przechowujaca wielomian wpisany przez uzytkownika*/                   char wsp[225][225], pot[225][225]; /*2 wymiarowe tablice przechowujace tekstowe wartosci kolejnych wspolczynnikow i poteg*/int wsp_int[225], pot_int[225];/* tablice zmiennych calkowitych do ktorych przypisane beda wartosci liczbowe wspolczxynnikow i poteg po uzyciu f. atoi()*/int x=0,y1=-1,z1=-1,y2=0,z2=0;/*zmienne pomocnicze uzywane do odczytywanie kolejnych wartosci w tablicach*/int pochodne;/* zmienna przechowujaca ilosc pochodnych do obliczenia*/int licznik_jedn=0;/*zmienna liczaca ilosc wystapien jednomianow uzywanaw funkcji wpisz_pochodne*/void error(int);/*deklaracja funkcji pokazujacej miejsce bledu i konczacej program*/void wypisz_pochodne(void);/*deklaracja funkcji wypisujacej kolejne pochodne wielomianu*/void sprawdz(void);/*deklaracja funkcji sprawdzajacej poprawnosc wielomianu i przypisujacej kolejne wspolczynniki/potegi do oddzielnych tablic*/int main(void){int i,q; /*zmienne pomocnicze uzywane przy czyszczeniu tablic*/ for(i=0;i<225;i++)  /*Czyszczenie tablic*/{		for(q=0;q<225;q++)	{	wielomian[i]='\0';		pot_int[i]=0;	wsp_int[i]=0;	wsp[i][q]='\0';	pot[i][q]='\0';	}}printf("\nPodaj wielomian: y="); /*wczytywanie wielomianu*/scanf("%s", &wielomian); sprawdz(); /*wywolanie funkcji(procedury) sprawdzajacej i grupujacej wspolczynniki oraz potegi*/printf("\nIle pochodnych mam policzyc:"); /*wczytywanie ilosci pochodnych do policzenia*/scanf("%d", &pochodne); i=0;  /*konwertowanie wartosci wspolczynnikow i poteg z char ---> int  [atoi()]  i przypisywanie do tablic int*/do{	wsp_int[i]=atoi(wsp[i]);	pot_int[i]=atoi(pot[i]);	i++;}while(i<licznik_jedn);wypisz_pochodne();/*funkcja wypisujaca kolejne pochodne uzywajaca tablic wsp_int i pot_int jako argumentow*/return 0;}/*############# Funcja sprawdzajaca poprawnosc wielomianu i przypisujaca wspolczynniki do tablic#############*/void sprawdz(void){do  /*petla majaca sie zakonczyc gdy znak bedzie rowny znakowi konca wiersza*/{    z1++; /*powiekszenie o 1 wartosci zmiennej pomocniczej wskazujacy na wspolczynnik jednomianu*/y1++; /*powiekszenie o 1 wartosci zmiennej wskazujacej na potege jednomianu*/		if(wielomian[x]=='+' || wielomian[x]=='-' || isdigit(wielomian[x])!=0) /* sprawdzenie czy jednomian ma znak lub od rzu cyfry*/ 	{	licznik_jedn++;	      if(wielomian[x]=='+' || wielomian[x]=='-')  {	  wsp[z1][z2]=wielomian[x]; /*dodanie znaku -/+ do tablicy wspolczynnikow*/  x++; /*przejscie do nastepnego znaku wielomianu*/  z2++;/*przejscie do nastepnego znaku w tablicy wspolczynnikow*/  }  else if (isdigit(wielomian[x])!=0)/*sprawdzanie czy wielomian ma cyfre na poczatku*/  {  }  else /*blad jesli nie jest to znak cyfry lub +/-*/  {  error(x);  }            if (wielomian[x]=='x'  && wielomian[x+1]=='^') /*warunek dla jednomianu postaci -/+ x^a */  { 	 //printf("\n\nxxxxxxxxxxx\n\n"); 	 wsp[z1][z2]='1'; /*wpisanie znaku 1 do wspolczynnika takiego jednomianu*/ 	 x=x+2;	/*skok o 2 znaki dalej w wielomianie*/        do /*przypisywanie kolejnych liczb potegi jednomianu do tablicy pot*/    {   	 if (isdigit(wielomian[x])!=0)/*warunek sprawdzajacy czy znak teskstowy w potedze jednomianu jest cyfra*/   	 {   	 pot[y1][y2]=wielomian[x]; /*przypisanie znaku*/   	 x++;   	 y2++;   	 }   	 else /*blad jesli nie jest to znak cyfry*/   	 {   	 error(x);   	 }    }    while((((wielomian[x]) != ('\0')) && ((wielomian[x]) != ('+')) && ((wielomian[x]) != ('-'))));  }    else if (wielomian[x]=='x' && (wielomian[x+1]=='\0' || wielomian[x+1]=='+' || wielomian[x+1]=='-')) /*warunek dla jednomianu postaci x*/  { 	 wsp[z1][z2]='1'; 	 pot[y1][y2]='1'; 	 x++; 	   }  else /* warunek dla jednomianu ax^b*/  {  do /*przypisywanie kolejnych cyfr wspolczynnika jednomianu do tablicy pot*/      {	 	 if (isdigit(wielomian[x])!=0) /*warunek sprawdzajacy czy znak tekstowy we wspolczynniku wielomianu jest cyfra*/ 	 { 	 wsp[z1][z2]=wielomian[x]; /*przypisanie znaku*/ 	 x++; 	 z2++; 	  	 }         	 else /*blad jesli nie jest to znak cyfry*/ 	 {    if(wielomian[x]=='x') /*warunek potrzebny do dokladnego wyswietlenie miejsca bledu*/    {    x++;    }	 	  	 error(x); 	 } 	   }	      while( !(wielomian[x]=='\0' || (wielomian[x]=='x' && wielomian[x+1]=='^') || (wielomian[x]=='x' && wielomian[x+1]=='+') || (wielomian[x]=='x' && wielomian [x+1]=='-') || (wielomian[x]=='x' && wielomian[x+1]=='\0') ));   	 if(wielomian[x]=='\0') /*warunek dla wyrazu wolnego*/ 	 {    pot[y1][y2]='0';    x++; 	 } 	 else if(wielomian[x]=='x' && (wielomian[x+1]=='+' || wielomian[x+1]=='-' || wielomian [x+1]=='\0')) /*warunek dla wyrazu o potedze 1,czyli x*/ 	 {    pot[y1][y2]='1';    x++; 	 } 	 else /*warunek dla wyrazu ax^b*/ 	 {    x=x+2;    do    {   	 if (isdigit(wielomian[x])!=0) /*przypisywanie kolejnych liczb potegi jednomianu do tablicy pot*/   	 {   	 pot[y1][y2]=wielomian[x];   	 x++;   	 y2++;   	 }   	 else /*blad jesli nie jest to znak cyfry*/   	 {   	 error(x);   	 }    }    while((((wielomian[x]) != ('\0')) && ((wielomian[x]) != ('+')) && ((wielomian[x]) != ('-')))); 	 }  }	} 				else if (wielomian[x]=='x') /*warunek gdy 1 wyraz jest postaci x^a*/	{	licznik_jedn++;    if(wielomian[x+1]=='^') /*jesli potega x^a istnieje*/  {  wsp[z1][z2]='1';  x=x+2; 	 do 	 {    if (isdigit(wielomian[x])!=0) /*przypisywanie kolejnych liczb potegi jednomianu do tablicy pot*/    {    pot[y1][y2]=wielomian[x];    x++;    y2++;    }    else /*blad jesli nie jest to znak cyfry*/    {    error(x);    } 	 } 	 while((((wielomian[x]) != ('\0')) && ((wielomian[x]) != ('+')) && ((wielomian[x]) != ('-'))));  }  else /*jesli potega nie wystepuje = 1 */  {  wsp[z1][z2]='1';  pot[y1][y2]='1';  x++;  }	}	else    	 {   	 error(x);   	 }if(y1>=1 && (atoi(pot[y1])<0 || (atoi(pot[y1-1])<=atoi(pot[y1]))))	/*warunek sprawdzajacy poprawnosc i kolejnosc poteg*/{error(x);}z2=0;y2=0;}while(wielomian[x]!='\0');}/*############# Funcja wypisujaca pochodne na ekran#############*/void wypisz_pochodne(void) /*funcja liczaca i drukujaca pochodne*/{int p=0; /*zmienna uzywana do obliczenia ilosci pochodnych w petli*/int v=0; /*zmienna pomocnicza uzywana w tablicach do kolejnych wyrazow*/do{printf("\n");if(pot_int[0]!=0) /*warunek zapobiegajacy nadmiernemu drukowaniu symbolu y=*/{printf("y=");}	do	{    if ((pot_int[v])==0)  {  }	  else if(wsp_int[v]>=0) /*warunek dla wspolczynnikow dodatnich*/  {	 	 if(v==0) /*warunek dla ostatniego wyrazu ,aby nie wpisywac wyrazu wolnego 0*/ 	 {} 	 else if(wsp_int[v]>0) /*warunek dla dodatnich roznych od 0*/ 	 { 	 printf("+");  	 }	        if(wsp_int[v]==1 && pot_int[v]==1) /* -+x */    {    printf("1");    wsp_int[v]=1;    pot_int[v]=0;    }    else if(pot_int[v]==2) /*warunek dla x^2, aby nie durokowac potegi ^1 po zrozniczkowaniu*/    {    printf("%dx", wsp_int[v]*2);    wsp_int[v]=wsp_int[v]*2;    pot_int[v]=1;    }    else if(pot_int[v]==1) /* ax*/    {    printf("%d", wsp_int[v]);    pot_int[v]=0;    }    else /*warunek dla wyrazow ax^b*/    {    printf("%dx^%d", (wsp_int[v])*(pot_int[v]),(pot_int[v])-1);     wsp_int[v]=(wsp_int[v])*(pot_int[v]);    pot_int[v]=(pot_int[v])-1;    }      }  else  {	    if(wsp_int[v]==1 && pot_int[v]==1) /* -+x */    {    printf("1");    wsp_int[v]=1;    pot_int[v]=0;    }    else if(pot_int[v]==1 && wsp_int[v]==-1) /*warunek dla wyrazu -x*/    {    printf("-1");    wsp_int[v]=-1;    pot_int[v]=0;    }    else if(pot_int[v]==2) /*warunek dla x^2, aby nie drukowac potegi ^1 po zrozniczkowaniu*/    {    printf("%dx", wsp_int[v]*2);    wsp_int[v]=wsp_int[v]*2;    pot_int[v]=1;    }    else if(pot_int[v]==1) /* 23422x*/    {    printf("%d", wsp_int[v]); /* ax*/    pot_int[v]=0;    }    else /*warunek dla wyrazow ax^b*/    {    printf("%dx^%d", (wsp_int[v])*(pot_int[v]),(pot_int[v])-1);    wsp_int[v]=(wsp_int[v])*(pot_int[v]);    pot_int[v]=(pot_int[v])-1;    }      }	v++;	}	while(v<licznik_jedn); /*petla zatrzymuje sie po uwzglednieniu wszystkich kolejnych jednomianow*/printf("\n");p++;if(pot_int[0]==0 && p<pochodne) /*drukuje wartosc pochodnych gdy pozostaje tylko wyraz wolny*/{printf("\n");printf("y=0");}v=0;}while(p<pochodne);printf("\n\n");}/*##############        Funkcja wskazujaca na blad w zadaniu                ##########################*/void error(int blad) /*funkcja wczytuje ilosc przeczytanych znakow*/{int spc=0; /*zmienna przechowujaca ilosc potrzebnych spacji*/printf("BLAD!!!! ->        ");while(spc<blad)/*petla drukujaca ilosc spacji aby wskazac polozenie bledu*/{printf(" ");spc++;}printf("^\n");exit(EXIT_SUCCESS);}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...