wolk Opublikowano 5 Kwietnia 2005 Zgłoś Opublikowano 5 Kwietnia 2005 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)? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
wolk Opublikowano 13 Kwietnia 2005 Zgłoś Opublikowano 13 Kwietnia 2005 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);} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
MeHow Opublikowano 15 Kwietnia 2005 Zgłoś Opublikowano 15 Kwietnia 2005 nie chce Ci psuc humoru, ale jezeli robisz to na jakies zaliczenie, to pojada Cie za te zmienne globalne. To bardzo nieladny nawyk :). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...