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);}