C, usmernenie

Sekcia: Programovanie 25.12.2010 | 13:52
Roj-i   Návštevník
zdravim vas teraz len zacinam v C programovat. Mam knizku ucim sa s nej a tam mam jeden program na pocitanie znakov ale nieje tam napisane ako ma vyzerat vystup. U mna po zadani znakov a stlaceni enter vyhodi len prazdny riadok a nepocita znaky. Chcem sa spytat ci tam nieje niekde chyba odpisal som to presne podla knizky.
#include <stdio.h>

main()
{
double pz;

for(pz = 0; getchar() != EOF; ++pz)
;
printf("%.0f\n", pz);
}
.
    • Re: C, usmernenie 25.12.2010 | 14:33
      Avatar omdzor #!  Používateľ
      poprve program ako si ho napisal nie je skompilovatelny (no mozno si sa len pomylil)
      Neviem co presne ma robit program alebo co chces aby robil, ale napriklad tento: #include <stdio.h>

      int main()
      {
      double pz;
      for (pz=0; getchar() != EOF; ++pz)
      {
      printf("%.0f\n", pz);
      }
      return 0;
      }

      ktory je skoro ten isty ako tvoj, vypisuje po zadani znakov a enteru toto:
      abc
      1
      2
      3
      defgh
      4
      5
      6
      7
      8
      9
      #! /usr/bin/env python
      • Re: C, usmernenie 25.12.2010 | 19:03
        Avatar Fridolín Pokorný Fedora 21  Používateľ
        Ten program, ktory napisal je skompilovatelny, je syntakticky spravne.
    • Re: C, usmernenie 25.12.2010 | 17:10
      iwtu   Návštevník
      Ahoj. Tu mas program, ktory Ti spocita pocet znakov az po novy riadok (teraz po stacetenie enteru). Koniec riadku v linuxe predstavuje znak '\n\. Prosim nepouzivaj praseny kod a nezneuzivaj moznosti C. for cyklus sa nepouziva na take veci. Pouziva sa iba na urcity pocet opakovania prikazu. Nasleduju kod je standard.
      #include <stdio.h>

      int
      main()
      {
      int c;
      int pocet = 0;
      while ((c = getchar()) != '\n') pocet++;
      printf("Pocet zadanych znakov je %d\n", pocet);

      return 0;
      }
      • Re: C, usmernenie 25.12.2010 | 17:16
        iwtu   Návštevník
        EOF je symbol pre koniec vstupu (co je aj koniec suboru). v linuxe koniec vstupu predstavuje klavesova skratka ctrl + D. Aby som doplnil. Ostatne veci vid. google
        • Re: C, usmernenie 25.12.2010 | 18:55
          Avatar Fridolín Pokorný Fedora 21  Používateľ
          EOF nie je symbol, ale stav/pripad. Spomenuta klavesova skratka tento stav emuluje - konkretne shell. EOF nie je ani koniec vstupu - ty si mozes za koniec vstupu zvolit teoreticky cokolvek.
          • Re: C, usmernenie 26.12.2010 | 13:58
            iwtu   Návštevník
            Spomenuta klavesova vyvola signal a ten nieco emuluje. Neviem, ci ma zmysel pri trivialnom priklade, kde dotazaju sa uci uplne zakladne veci, spominal signaly a ich spracovanie. Neviem, presne ako je definovany EOF (typujem znak ascii) ale vzhladom na to, ze za koniec vstupu mozem zvolit cokolvek, tak mi dava zmysel brat to skor ako zauzivany symbol.

            Ano, vravme cloveku, ktory sa uci elementarne veci, ze si za koniec vstupu moze zvolit hocico, najlepsie, nech si kazdy zvoli iny operacny system a ine standardy alebo iny jazyk, inu abecedu a uz sa vobec nedohovorime...

            Toto naozaj nie je spravne miesto miesto na obohacovanie si nejakeho ega...
            • Re: C, usmernenie 26.12.2010 | 15:44
              Avatar Fridolín Pokorný Fedora 21  Používateľ
              Klud ;)
              EOF nie je znakom ASCII. To byva aj castou chybou zacinajucich programatorov. EOF je v C definovane ako konstanta (ako je nizsie napisane) a je zauzivana hodnota -1 (vid zdrojove kody glibc).

              Predstav si, ze mas premennu c typu char. Makra/funkcie getchar(), fgetc(), getc(),... vracaju navratovu hodnotu int (a je to z dovodu prave EOF). Ked sa nad tym zamyslis, tak explicitna typova konverzia sposobi, ze c bude nadobudat hodnoty 255 pri EOF (a 255 je platnym znakom - aj ked nie tabulky ASCII ale hociktorej rozsirujucej narodnej).

              Je dobre, ze zaciatocnik zacina s C (je to najlepsia volba podla mna ako sa zacat ucit programovat). A tato vec je elementarna i ked na nu zacinajuci programatori casto zabudaju.

              Ja som o signaloch nic nevravel, zaoberame sa vyssie uvedenym zdrojovym kodom a obohacovat ego si tu rozhodne nechodim (to kludne prenecham inym).
              • Re: C, usmernenie 26.12.2010 | 15:52
                Avatar Fridolín Pokorný Fedora 21  Používateľ
                Este doplnim, ze 255 pri unsigned char a -1 pri signed char. Nasledok to ma vsak rovnaky...
              • Re: C, usmernenie 26.12.2010 | 16:25
                iwtu   Návštevník
                Asi som to zabudol postnut. Ano :)
          • Re: C, usmernenie 26.12.2010 | 16:37
            miso   Návštevník
            "Spomenuta klavesova skratka tento stav emuluje - konkretne shell."

            Spomenuta skratka nic neemuluje, len na stdin vlozi riadiaci znak (004), o to sa stara emulator terminalu. Shell do toho uz vobec nezasahuje, ten bezi na pozadi pricom vstup sa smeruje na proces na popredi - nas program. O interpretaciu riadiacich znakov v stdin sa stara kernel, oi. zabezpecuje aj echo znakov na terminal, moznost editovat riadok atd.. Beziaci program ma moznost si vybrat z viacerych moznosti "predspracovania" stdin vratane moznosti ho uplne vypnut v pripade zmu nevyhovuju.
            • Re: C, usmernenie 26.12.2010 | 17:03
              Avatar Fridolín Pokorný Fedora 21  Používateľ
              Dakujem za upresnenie.
              • Re: C, usmernenie 26.12.2010 | 18:55
                miso   Návštevník
                Neni zac, len este poopravim: mangluje sa to co sa zapisuje do prislusneho zariadenia terminalu, nie stdin, to uz je vysledok.
        • Re: C, usmernenie 26.12.2010 | 14:33
          Avatar Dušan Ďurech Debian Lenny 5.0  Používateľ
          EOF je makro konstanta, ktorej hodnotu vracia funkcia getchar ked sa dostane na koniec vstupu.
      • Re: C, usmernenie 25.12.2010 | 18:09
        Roj-i   Návštevník
        Vies ja to robim podla knizky(Programovaci jazyk C od autorov Brian W. Kernighan a Dennis M.Ritchie) cize ja nic nezneuzivam pretoze sa len ucim podla knizky a tam vysvetluju rozne prikazy na roznych ulohach. Inak velke dakujem Vam obom :D
      • Re: C, usmernenie 25.12.2010 | 19:06
        Avatar Fridolín Pokorný Fedora 21  Používateľ
        Zatial som nepocul o standarde kodu na spocitanie znakov do '\n' na vstupe. Vyssie uvedene riesenie podobnych pripadov sa v (nie len) C bezne pouziva.
      • Re: C, usmernenie 26.12.2010 | 15:27
        darth vader   Návštevník
        Nechapem co je na tom zneuzivanie foru.
        Ma tam startovaci prikaz pz=0. Podmienku ukoncenia (znak != EOF) a inkrementacnu podmienku.
        To, ze to neni for stylu od i:=1 to 10, neznemena, ze to je zly for.

        Prave stylom ako si to napisal ty je to 100krat neprehladnejsie (zvlast pre zaciatocnika).
        Takze laskavo netrep a chod si honit ego inde s tvojim standardnym ko(ko)d(t)om.
    • Re: C, usmernenie 26.12.2010 | 16:43
      iwtu   Návštevník
      Mam pocit, ze sme sa totalne odklonili od tvojho problemu. No, mam pocit, ze nevies presne napisat, co chces alebo ani nevies presne co chces. Standardna je uloha na pocitanie znakov v riaku alebo pocet znakov v celom vstupe. Koniec riadku je reprezentovany na Unixe znakom 'n' a koniec suboru konstantou EOF (end of file).

      Dalej programujem iba zopar rokov a uprimne neviem, aky ma zmysel pouzivat na pocet typ premennej double. Ani som to este nikde nevidel. Klasicky sa dava int... A hold, bez ujmy na vseobecnosti, pricitanie celeho cisla k double nevrati nam vzdy hodnotu, aku by sme ocakavali...

      V C velmi neprogramujem, radsej mam C++, Python, Javu, Haskel atd... Taky for cyklus som este v zivote nevidel. Ano, Ceckari maju z mne nepochitelnych dovodov vo zvyku pisat for(;;)... ale mne sa vazne vidi jasnejsie while(true)...

      Dalej, knihu, ktoru mas sa velmi neodporuca na zaciatok. Predsa, je pisana stylom, akym sa programovalo z pred par rokov. Je milovana biblia ludi, ktori programuju stale ako v tej dobe, ale predsa, uz zijeme trochu v inej dobe.

      Ten kod, ktory si napisal, je velmi cudny. Pre double, tym padom aj printf, main nema definovanu navratovu hodnotu ani nic nevracia... Ja tomu vravim spraseny kod.

      pre zaujemcov odporucam keyword programing practices. Kniha od Herouta je podla mna ovela vhodnejsia pre zaciatocnika. Sice som uz jedneho guru pocul, ze ten clovek C velmi nerozumie. Neviem, mozno je to pravda, ale niesom guru v C a kazdy iny tu ucebnicu chvali.
      • Re: C, usmernenie 26.12.2010 | 20:59
        lord vader   Návštevník
        for(;;) sice smrdi, ale jeho ani nie.

        mne skoro pripomina vec typu for (set<int>::iterator it = x.begin(); it != x.end(); ++it), co tiez nie je for na pocet opakovani. alebo iny priklad for (int i = 0; buf[i]; i++) na prejdenie celeho stringu (po posledny nulovy znak).

        btw vacsi problem ako v tom, ze tam nema navratovu hodnotu pre main vidim v tom, ze vypisuje double cez %f, ked spravne je %lf (nie som si teraz isty, ci to potom vypise uplnu hovadinu vzdy, alebo len obcas).
        • Re: C, usmernenie 26.12.2010 | 23:29
          Avatar borg Arch, Debian jessie  Administrátor
          ten for cyklus s iteratorom je ovela lepsi a citatelnejsi ako

          set<int>::iterator it = x.begin();
          while (it != x.end()) {
          strasne;
          dlhy;
          blok;
          s;
          kodom;
          az;
          do;
          aleluja;
          ++it;
          }

          ide o tom co je viac citatelnejsie, hlavne ak na projekte robi viac ludi. navyse ak nie medzi while a for ziadny rozdiel v performance, pretoze kazdy poriadny kompilator si to zoptimalizuje podla seba a ako uzna za vhode. takze "while" vs. "for" povazujem za flame, ktory je onicom.
        • Re: C, usmernenie 27.12.2010 | 00:19
          Avatar Fridolín Pokorný Fedora 21  Používateľ
          Uz sme kusok odbocili, ale nevadi.
          Este sme si nepovedali o aky standard ide. C99 definuje implicitnu navratovu hodnotu funkcie main() a to (prekvapivo???) int. C89 nic take nedefinuje (pokial viem)
          Chybou vsakje neuvedenie navratovej hodnoty, ktoru pouziva OS. V takomto pripade je tato hodnota nedefinovana.
          To kedy sa problem s %f a %lf prejavi je celkom zaujimave. Staci sa pozriet ako su reprezentovane cisla s plavajucou desatinnou ciarkou v pamati a dlzku v bitoch float a double (tu vsak pozor)
        • Re: C, usmernenie 27.12.2010 | 00:24
          Avatar Fridolín Pokorný Fedora 21  Používateľ
          Este som zabudol, ze uvedeny for na prejdenie nie je pouzitelny (teda ak nechces prejst retazcom len tak a nic z toho)
          • Re: C, usmernenie 27.12.2010 | 16:26
            lord vader   Návštevník
            Vazne? Toto mi praveze pride ako najlahsi sposob ako spravit hocijaku konecnoautomatovu vec nad stringom.
            Proste ked potrebujem raz prejst string a na zakladne toho vyplnit zopar inych hodnot, tak tento for je uplne super.

            Ale ked mas nejake super riesenie, tak sem s tym.
            • Re: C, usmernenie 27.12.2010 | 16:56
              Avatar Fridolín Pokorný Fedora 21  Používateľ
              Aha prepac, vcera som videl bodkociarku za for cyklom, ktora tam nie je. :) Beriem spat.
              Samozrejme ten for je spravne, ked ho pouzijes ako hovoris. V C je "true" akakolvek nenulova hodnota.