|
Moja malá jednoduchá kalkulačka na derivácie, zvláda(aspoň myslím) jednoduché derivácie, goniometrické funkcie, logaritmy, a prvú deriváciu násobenia alebo delenia. V prílohe prikladám zdrojové kódy, program je rozdelený na .c hlavný a .h s funkciami. Veľa vecí sa tam dá určite spraviť oveľa lepšie, chcem na tom časom ešte zapracovať ako taký vedľajší projekt popri učeniu sa ďalším veciam v C.
Kedže súbor .h nemôžem priložiť, prepísal som názov na funkcie.c , po stiahnutí si tento súbor prosím prepíšte na derivacie.h .
Subor .c a teda funkciu main pisem aj sem: #include"derivacie.h"
int parse_int(char *number);
int main() { int c,i,cislapred[100],cislapo[100],cislonasob[100],j = 0,n,cislo,opakovat = 1,koniec,oznam = 0,oznam1 = 0; //polia a premenné potrebné na uloženie čísiel char n1[50],n2[50],s[100],pomoc[10],pomoc1[10],buffer[101],pokr = 'A',*najdi,*najdi2; //polia a premenné potrebné na uloženie znakov char v[100] = {""}; //pole pre vysledny retazec printf("Vyraz x na druhu zapis v tvare x2 alebo x^2(^ je ALT 94).\nAk je exponent zaporny,zapis ho do zavoriek! Napriklad x(-2) alebo x^(-2)\n\n"); printf("Ak zadavas nasobenie alebo delenie, jednotlive vyrazy uzatvor v zatvorkach!\nNapr. (5x+5)*(5x) alebo (5x+5)/(5x)\n"); //instrukcie while((pokr == 'A')||(pokr == 'a')){ //aby bolo mozne opakovat zadavanie while (opakovat) { //parsovanie, aby bolo mozne zadat iba cislo, ak je zadanie nieco ine, opakuje sa zadanie printf("\nKolku derivaciu si zelas?\n"); //kolka derivacia ma byt fflush(stdin); //vyprazdnenie bufferu scanf(" %s", buffer); if (!parse_int(buffer)) printf("Nespravny format cisla!\n\n"); else{ n = parse_int(buffer); opakovat = 0; } } printf("\nZadaj vyraz na derivaciu: \n"); fflush(stdin); //vyprazdnenie bufferu scanf("%s",&s); //zadanie vyrazu na derivacie while((c = getchar())!= '\n'){ //ak boli zadane aj medzery, funkcia prida medzeru, precita dalsi retazec do zakladneho od pozicie konca strcat(s," "); scanf("%s",&s[strlen(s)]); } if((strstr(s,")*(") == NULL)&&(strstr(s,")/(")== NULL)){ //ak neboli najdene znaky urcujuce nasobenie alebo delenie, tak vykona jednoduchu derivaciu for(cislo = 0; cislo < n; cislo++){ //funkcia bezi dokym nedostaneme zelanu derivaciu for(i = 0; i < strlen(s); i++){ deriavacie(s,v,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); //volam funkciu na jednoduchu derivaciu derivacie_funkcii(s,v,pomoc,pomoc1,i); //volam funkciu na derivaciu funkcii sinus,cosin atd... } v[strlen(v)] = '\0'; //zapisem ukoncovaci znak do vysledku s[0] = '\0'; //ukoncovaci znak na zaciatok retazca s strcpy(s,v); //skopirovanie vysledneho retazca do zakladneho s --> aby bola mozna viacnasobna derivacia printf("%d. derivacia: ",cislo+1); puts(v); //vypis vysledneho retazca v[0] = '\0'; } } najdi = strstr(s,")*("); //hladam znak pred nasobenie while (najdi != NULL) { koniec = najdi - s; najdi = strstr(najdi + 1,")*("); oznam++; } if((oznam == 1)&&(n == 1)){ //ak je tam jeden nasobok a ziadana je prva derivacia derivacianasobok(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); //volam funkcia derivacie jedoducheho nasobenia } else if((oznam == 1)&&(n == 2)){ //ak je tam jeden nasobok a ziadana je druha derivacia derivacianasobok(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); //volam funkcia derivacie jedoducheho nasobenia derivacia2nasobok(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); //volam druhu derivaciu--je to chybne } else if((oznam == 2)&&(n >= 2)){ //ak su dva nasobky a ziadana je druha alebo vacsia derivacia if(n > 2) printf("Dokazem iba 2 derivaciu z nasobku :(\n"); //ak je vacsia ako 2 derivacia ziadana vypis derivacianasobok(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); //volam funkcia derivacie jedoducheho nasobenia derivacia2nasobok(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); //volam druhu derivaciu--je to chybne } najdi2 = strstr(s,")/("); //to iste len s delenim while (najdi2 != NULL) { koniec = najdi2 - s; najdi = strstr(najdi2 + 1,")/("); oznam++;
} if((oznam1 == 1)&&(n == 1)){ derivaciadelenie(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); } else if((oznam1 == 1)&&(n == 2)){ derivacia2delenie(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); } else if((oznam1 == 2)&&(n == 2)){ if(n > 2) printf("Dokazem iba 2 derivaciu z delenia :(\n"); derivaciadelenie(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); derivacia2delenie(s,v,n1,n2,pomoc,pomoc1,i,cislapred,cislapo,cislonasob,j); } oznam = 0; //moznost zadania znaku pre pokracovanie, ak sa pomyli opakovat, zmena hodnot aby platili pre opakovanie oznam1 = 0; fflush(stdin); printf("\nChces zadat dalsi vyraz na zderivovanie? [A/N]\n"); pokr = getchar(); while((pokr != 'a')&&(pokr != 'A')&&(pokr != 'N')&&(pokr != 'n')){ fflush(stdin); printf("Nespravny vyber!"); printf("\nChces zadat dalsi vyraz na zderivovanie? [A/N]\n"); pokr = getchar(); } opakovat = 1; } return 0; }
|
|