Škôlka jazyka C

Fórum o programovaní v jazyku C založené 3. januára 2012

Aktuálny čas je 26 Apr 2024, 10:01

Všetky časy sú v GMT + 1 hodina




Vytvoriť novú tému Odpovedať na tému  [ Príspevkov: 14 ] 
Autor Správa
PoslaťNapísal: 23 Mar 2015, 16:22 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
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:
Spoiler:
Kód:
#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;
 }





Prílohy:
Poznámka: Funkcia main, volanie funkcii atď...
derivacie.c [6.85 KiB]
369 krát
Poznámka: Všetky funkcie na derivaciu, parsovanie atď...
funkcie.c [43.97 KiB]
349 krát
Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 23 Mar 2015, 19:35 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Jednu vec napisem hned. Treba ten program rozdelit na tematicky spolocne veci a na ne spravit tzv. moduly (header a source subory). Navyse je dobre si zvykat na testovanie modulov, su dva sposoby. Testovanie az po vytvoreni programu a testovanie este pred jeho napisanim. Asi to znie sialene, ale ked si pozries moje portfolio na itnework.cz, su tam clanky, kde o tom pisem a z toho pochopis o co ide.
http://www.itnetwork.cz/sprava-uctu
Ak to nie je ono, tu mas odkazy na konkretne clanky.

http://www.itnetwork.cz/tutorial-testovanie-c-1-diel

http://www.itnetwork.cz/tutorial-testovanie-c-2-diel

pozri si aj toto

http://www.itnetwork.cz/tutorial-textov ... v-jazyku-c

http://www.itnetwork.cz/tutorial-knizni ... v-jazyku-c

Odporucam ti zaregistrovat sa na itnetwork.cz, tam su velmi dobre informacie o programovani vseobecne a programovani v jednotlivych jazykoch.

Na zaver info. Do prilohy sa daju nahrat zip subory.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 07:53 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Pozri si prílohy. (povolil som aj header súbory do príloh)
Príloha:
main.c [6.94 KiB]
332 krát

Príloha:
derivacia.c [43.1 KiB]
350 krát

Príloha:
derivacia.h [4.21 KiB]
357 krát

Vytvoril som projekt (konzolovú aplikáciu) a tieto súbory sú jeho súčasťou (sú to tvoje súbory trošku upravené a myslím, že teraz sa ti s nimi bude lepšie pracovať). Predpokladám, že vieš ako sa projekt vytvára.
Vytvor si projekt a tieto súbory do neho vlož. Potom si daj do Code::Blocks tie voľby, čo som ti písal predtým a skús skompilovať. Uvidíš koľko je tam zbytočností. Na zmenu warningov na chyby je prepínač -Werror, ak chceš program spustiť v takom stave ako je, mysíš ho vypnúť, inakšie to neskompiluješ a tým pádom ani nespustíš.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:01 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Ďakujem, pozriem to. K predchádzajúcej správe: Na Itnetwork som C-éčko celé prešiel, aj tvoje články o testovaní. No mám taký pocit, že pri mojom programe nie je možné zadať zlý vstup- vždy vypíše chybovú hlášku a požiada o nový výber.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:14 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Vela funkcii mas napisanych tak, ze maju vracat int, ale niekedy nevracaju nic, teda by mali byt void.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:21 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Napriklad
Kód:
int znak(char *s, char *v,char* pomoc1,int i)                                                 //znak precitam a opisem
{
    if(jeznak(s[i])&&(s[i-1]!='(')&&((s[i] != '-')&&((s[i+1] != '-')&&(s[i-1]!= '-')))){
                 pomoc1[0] = s[i];
                 pomoc1[1] = '\0';
                 strcat(v,pomoc1);
                 }
     else
        return 0;
}

Ak nie je splnena podmienka, vrati 0, ale ak je, tak co vrati?

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:22 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Viem, za to môže to, že som to robil postupne v dlhšom časovom úseku a potom som na to zabudol. Posledné, teda najnovšie funkcie som dal typu void, tie staršie som zabudol prepísať. Všetky samozrejme majú byť typu void, kedže nevracajú žiadnu hodnotu. Práve ich prepisujem.
Vypisuje mi teraz už len tento typ chýb: comparison between signed and unsigned integer expressions [-Werror=sign-compare], ako sa toho vyvarujem? Je to vlastne každý cyklus for.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:26 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Vo for neberie ako hotovu hodnotu strlen(slovo), ries to tak, ze premennu definujes skor, napr.
int velkost_s = strlen(s) a potom das do for velkost_s

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:38 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Vo vsetkych tych funkciach sa ti opakuju slova s, n1, n2 a v, tak na zaciatku kazdej funkcie pridaj ich definicie.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:39 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Vďaka, kód som už upravil tak, že mi už nevyhadzuje žiadnu chybu/varovanie.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:50 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Este sa spytam.
Normalny stav je, ze funkcia ma navratovu hodnotu. Specialny stav je vtedy, ked je vstupny parameter zaroven aj navratovou hodnotou. Toto sa ale pouziva len vtedy, ak je tych vstupno-vystupnych parametrov viac ako jeden a to je vtedy, ked su parametre v halde nie v zasobniku. Tvoje funkcie maju vsetky viac vstupno-vystupnych parametrov?

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 16:56 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Este jedna vec.
Funkcie by mali byt co najuniverzalnejsie, aby sa dali pouzit aj inde a nemusel sa viac krat opakovat kod. Nie som si isty, ale zda sa mi,ze sa ti tam vela kodu opakuje.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 24 Mar 2015, 17:09 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Mozes pouzit aj makra s parametrami.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 25 Mar 2015, 16:35 
Offline
Školák
Školák

Registrovaný: 05 Mar 2015, 18:22
Príspevky: 17
Udelené body: 3 bodov
Získané body: 8 bodov
Tak moje funkcie by mali byť všetky typu void, teda bez návratovej hodnoty.
Veľa kódu sa opakuje, to je pravda. Chcel som to vyriešiť už skôr,ale nemal som ta to čas. Ale kód sa dá podstatne skrátiť a teraz už na tom pracujem.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
Zobraziť príspevky z predchádzajúceho:  Zoradiť podľa  
Vytvoriť novú tému Odpovedať na tému  [ Príspevkov: 14 ] 

Všetky časy sú v GMT + 1 hodina


Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 2 hostia


Rýchla úprava:
Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre
Nemôžete zasielať súbory v tomto fóre

Hľadať:
Skočiť na:  
cron
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK