Programujeme v jazyku C (1) - Úvod

30.08.2007 15:00 | Články | Peter Rexa
Cieľom seriálu, ktorý ste práve začali čítať, je priblížiť vám programovanie v jazyku C pod Linuxom. Seriál je písaný pre úplných začiatočníkov a nie pre programátorskych guru v C. Mojou snahou je umožniť čitateľom seriálu čo najrýchlejšie zvládnutie jazyka. Aby čitateľ dokázal experimentovať a skúšať, čo zvládne, dostane dobrý základ na to, aby sa mohol začať učiť ďalšie veci a dosť na to, aby mohol rásť ako programátor.

O jazyku

Jazyk C vymysleli a napísali v 70-tych rokoch 20. storočia zamestnanci Bellových laboratórií. Boli to páni Brian W. Kernighan a Denis M. Ritchie.

brian-kernighan.jpg   

Tento jazyk patrí medzi kompilačné jazyky, čo znamená, že najprv musíme zdrojový kód napísať v editore, preložiť do podoby, ktorej rozumie procesor (do strojového kódu) a až následne môžeme program spustiť. Nejedná sa teda o interprečný jazyk, ktorý vykoná preklad jedného riadku nášho zdrojového kódu, ktorý následne vykonáva procesor. Takýto jazyk je napríklad Basic.

Jazyk C je veľmi obľúbený pre svoju rýchlosť oproti interprečným jazykom a pre svoju univerzálnosť. Môžeme ho preložiť pod akýmkoľvek operačným systémom (Linux, Microsoft Windows, FreeBSD), dokonca C bolo navrhnuté a implementované pre Unix a takmer celý Unix bol v ňom napísaný.

Ako začať?

Tento seriál, ako som už spomínal, je písaný pre programovanie pod Linuxom. Aby sme mohli písať zdrojový kód, potrebujeme editor. Doporučil by som Vim, Nano, alebo MCEDIT. V editore napíšeme program, uložíme ho s koncovkou '.c' a skompilujeme. V Linuxe existuje komplátor GCC. Použijeme ho tak, že do bashu zadáme: #gcc prvyProgram.c. Náš skompilovaný program spustíme: ./a.out.

Komentáre

Používame ich, keď potrebujeme urobiť dokumentáciu k zdrojovému kódu, alebo keď potrebujeme vysvetliť nejakú časť kódu pre ďalších programátorov, ktorí budú náš zdrojový kód čítať. Všetko, čo je za //, sa v zdrojovom kóde neberie do úvahy.

Príklad použitia:

#include <stdio.h>

main()
{
	printf("Ahoj\n"); //Práve som použil komentár 
}

Výstup: Ahoj

Prvý program, alebo Hello World!

Vytvoríme si pomocou príkazu mkdir priečinok programovanie, otvoríme editor a začneme písať náš prvý zdrojový kód.

#include <stdio.h> // krok 1

main() // krok 2
{
	printf("Hello world!\n"); // krok 3
}

Krok 1: Kompilátor C-čka pozná pomerne málo funkcií. Napríklad aj funkcia printf je pre náš kompilátor neznáma. Ale programátori to samozrejme vyriešili a spravili tzv. knižnice. V týchto knižniciach je uložené veľké množstvo funkcií, ktoré môžeme používať. Ak teda chceme použiť funckiu printf, musíme kompilátoru povedať, kde sa táto funkcia nachádza. Daná funkcia sa nachádza v stdio.h (anglicky: standard input-output).

Krok 2: Každý program, ktorý napíšeme musí obsahovať funkciu main. Vo funkcii main program začína a aj končí. Každá funkcia v C (aj funkcia main) obsahuje telo, ktoré je ohraničené kučeravými zátvorkami.

Krok 3: V tele funkcie sa nachádzaju príkazy. My sme použili iba jeden príkaz a to printf. Za každý príkaz píšeme bodkočiarku. Príkaz printf slúži na vypísanie správy na obrazovku.

Program skompilujeme a spustíme podľa predošlého postupu. Ak všetko prebehlo v poriadku výstup by mal byť nasledovný: "Hello World!".

Znak \n znamená prejdi na nový riadok. Teda ak by sme chceli mať výstup nasledovný:

Ahoj
Ako sa mas?

Tak by náš program vyzeral nasledovne:

#include <stdio.h>

main()
{
	printf("Ahoj\n Ako sa mas?\n");
}

Alebo by mohol vyzerať aj takto:

#include <stdio.h>

main()
{
	printf("Ahoj\n");
	printf("Ako sa mas?\n");
}

To je ku dnešnému dielu asi všetko. V ďalšom pokračovaní seriálu si preberieme premenné. Ešte na záver dostanete 3 úlohy na precvičenie dnešnej témy.

1. Úloha: Napíšte program, ktorý bude mať nasledovný výstup: Ahoj, som tvoj prvý program v C.
2. Úloha: Napíšte program, ktorý bude mať nasledovný výstup:

3. Úloha: Napíšte program, ktorý vypíše na štvrtý riadok: "Hello".

    • brian 30.08.2007 | 18:23
      Avatar uid0 Debian  Používateľ
      Brian W. Kernighan
      Debian. apt-get into it…
    • mno 30.08.2007 | 18:27
      Avatar uid0 Debian  Používateľ
      nemal som sa ja pozerat dalej...

      C99 komentare v clanku o jazyku vymyslenom v 70. rokoch

      a pre zaujimavost si skus vsetko skompilovat s -Wall a ked chces aj -pedantic-errors
      Debian. apt-get into it…
      • Re: mno 30.08.2007 | 18:49
        Avatar borg Arch, Debian jessie  Administrátor
        nepisal, ze sa bude drzat nejakeho standardu. ja tiez pouzivam take komentare.
        • Re: mno 30.08.2007 | 19:48
          Avatar uid0 Debian  Používateľ
          tiez nepisal, ze nejake standardy existuju a ze sa za tie roky jazyk zmenil (vratane toho, ze dobovy prekladac // nepozna)

          eat this
          $ cat uloha2.S
          .text
          
                  .extern puts
          
                  .global main
                  .type main, @function
          main:
                  pushq   %rbp
                  movq    %rsp,   %rbp
          
                  movq    $pic,   %rdi
                  call    puts
          
                  movl    $0,     %eax    /* return */
                  leave
                  ret
          
          .data
          pic:    .ascii  "                oOOo\n" \
                          " /\\            oOOOOo\n" \
                          "/  \\            oOOo\n" \
                          "|  |             ||\n" \
                          "|__|--|-|-|-|-|  ||\n"
          $ gcc uloha2.S -lc -o uloha2
          $ ./uloha2
                          oOOo
           /\            oOOOOo
          /  \            oOOo
          |  |             ||
          |__|--|-|-|-|-|  ||
          
          $
          
          Debian. apt-get into it…
          • Re: mno 01.09.2007 | 14:57
            Avatar Igor Hlina Mac OS ML  Používateľ
            No to je krasa. Len tento dialekt ASM nepoznam. BTW co vykona call puts? Skoci na adresu ktora je na vrchole zasobnika?
            while (2*2 == 5) { echo "If you're reading this, something is definitely wrong"; }
            • Re: mno 01.09.2007 | 15:02
              Avatar uid0 Debian  Používateľ
              toto je AMD64 assembler v GNU as (AT&T syntax)

              call ulozi register EIP (tu konkretne callq -- RIP) a skoci na symbol puts (z libc)
              Debian. apt-get into it…
          • Re: mno 05.09.2007 | 17:58
            Avatar uid0 Debian  Používateľ
            sorry, idem sa hanbit do kuta
            --- uloha2.S.old        2007-08-30 17:45:34.000000000 +0200
            +++ uloha2.S    2007-09-05 15:52:33.000000000 +0200
            @@ -23 +23 @@
            -               "|__|--|-|-|-|-|  ||\n"
            +               "|__|--|-|-|-|-|  ||\n\0"
            
            Debian. apt-get into it…
            • Re: mno 06.09.2007 | 19:49
              Avatar Igor Hlina Mac OS ML  Používateľ
              :-D stava sa aj triezvym.
              while (2*2 == 5) { echo "If you're reading this, something is definitely wrong"; }
            • Re: mno 03.01.2008 | 01:05
              agama   Návštevník
              a ja som zase lama co sa nevyzna..

              agama@bedna:~/c$ cat uloha2.S
              .text

              .extern puts

              .global main
              .type main, @function
              main:
              pushq %rbp
              movq %rsp, %rbp

              movq $pic, %rdi
              call puts

              movl $0, %eax /* return */
              leave
              ret

              .data
              pic: .ascii " oOOo\n" \
              " /\\ oOOOOo\n" \
              "/ \\ oOOo\n" \
              "| | ||\n" \
              "|__|--|-|-|-|-| ||\n"
              agama@bedna:~/c$ gcc uloha2.S -lc -o uloha2
              uloha2.S: Assembler messages:
              uloha2.S:8: Error: bad register name `%rbp'
              uloha2.S:9: Error: bad register name `%rsp'
              uloha2.S:11: Error: bad register name `%rdi'
              agama@bedna:~/c$
              • Re: mno 03.01.2008 | 02:28
                Avatar uid0 Debian  Používateľ
                to je amd64 assembler
                Debian. apt-get into it…
      • Re: mno 30.08.2007 | 18:51
        Avatar borg Arch, Debian jessie  Administrátor
        tiez som ho chcel sprdnut za prototyp main(), ale nechal som si to pre seba
        • Re: mno 31.08.2007 | 10:28
          Avatar mcx Mac OS X / Windows 7 / Ubuntu  Používateľ
          Aaale no, chlapi, vsak on to nepisal pre expertov ale pre uplnych zaciatocnikov a pre tych je na zaciatok dobre cim menej nepotrebnych informacii. Berte to s rezervou ;)

          Ehm, alebo napiste vlastny navod pre expertov :) xixi
          • Re: mno 31.08.2007 | 11:51
            Avatar borg Arch, Debian jessie  Administrátor
            vsak v poho, ja som len rad ze sa tu objavuju taketo clanky, len tak dalej :)
          • Re: mno 31.08.2007 | 15:22
            Avatar uid0 Debian  Používateľ
            xixi, to ale neznamena, ze by no nemalo mat nejaku uroven
            Debian. apt-get into it…
    • zaciatocnici 31.08.2007 | 16:58
      Avatar Peter Rozum Arch Linux  Používateľ
      som rad, ze tu zacal takyto serial vychadzat, ale zda sa mi byt dost strohy na to aby ho chapali zaciatocnici a napr. vedeli sa postavit k rieseniu tych troch uloh ktore su na konci. su totalne jednoduch to je pravda, ale clanok mi pripada akoby to bolo nejake zhrnutie. dufam, ze serial nie je planovany na nejakych 10 dielov. zaciatocnikom treba davat dost informacii.
      Everything is proceeding as I have foreseen.
      • Re: zaciatocnici 31.08.2007 | 20:15
        eat   Návštevník
        Clanok je planovany samozrejme na viac dielov, ako uz bolo napisane clanok je pisany pre zaciatocnikov a nie pre expertov :), ale budem sa samozrejme snazit vylepsit kazdy jeden diel serialu, len prispievajte a prispievajte.. Btw podla mna je podla nasledovneho navodu velmi jednoduche vytvorit nasledovne tri ulohy, ma napadlo ze by som mohol poskytovat aj riesenie... :)
        • Re: zaciatocnici 31.08.2007 | 20:26
          Avatar borg Arch, Debian jessie  Administrátor
          riesenie je fajn, ale vzdy az v nasledujucom diely by bolo fajn
          • Re: zaciatocnici 31.08.2007 | 20:32
            Avatar nate UBUNTU 8.04 (HH)  Používateľ
            no ja ako kvazy-zaciatocnik musim povedat ze tento serial prisiel vhod. Co sa tyka zlozitosti resp. jednoduchosti je akurat, ale mohol by byt trochu rozsiahlejsi...uvidime ako bude pokracovat......drzim place aby bola vola aj nadalej...
    • out 01.09.2007 | 11:14
      Avatar david Debian Lenny  Používateľ
      este by sa mozno zislo podotknut ze ak to ulohy kompiluju v jednom adresari tak sa im vzdy prepise a.out..... gcc uloha1.c -o prvy.out
      dreamwalker
      • Re: out 01.09.2007 | 17:29
        Avatar Viliam Oravec Kubuntu 10.04 (MSI GX700PX)  Používateľ
        tak to skus takto:
        $gcc -c program.c
        $gcc -o program program.o
        $./program

        píš to bez toho "$"

        ináč dá sa spustiť aj to a.out
        Všichni mněli ruce od krve, jenom já hubu... :)
        • Re: out 01.09.2007 | 17:35
          Avatar david Debian Lenny  Používateľ
          ja viem ze sa da spustit aj a.out :)
          dreamwalker
        • Re: out 02.09.2007 | 23:39
          Avatar eNuke Gentoo macosx  Používateľ
          ono sa to da spravit aj s cc program.c -o program ;)
          Learnt to farth!!!
          • Re: out 02.09.2007 | 23:56
            Avatar uid0 Debian  Používateľ
            alebo mojim oblubenym c99
            Debian. apt-get into it…
      • Re: out 01.09.2007 | 17:49
        Avatar uid0 Debian  Používateľ
        make uloha1
        Debian. apt-get into it…
    • spomínané editory 01.09.2007 | 13:11
      Avatar Peter Paška Ubuntu 11.04, LinuxMint  Používateľ
      Tak dám úplne začiatocnícku otázku. Kde stiahnem spomínané editory? Nájdem ich v synapticu alebo kde? Môžu sa v Ubuntu volať trochu inak?
      PC Intel Core2Duo {3200}, 2GB RAM, ASUS Nvidia GTS250 1GB, 1 TB HDD, MB ASUS P5QE-L / NTB Fujitsu Lifebook AH512
      • Re: spomínané editory 01.09.2007 | 13:37
        Avatar Peter Rozum Arch Linux  Používateľ
        nemali by sa volat inak. pokial chces pracovat v textovom rezime tak ti asi najviac odporucam mcedit a ten je sucastou mc takze nainstaluj najprv ten. pokial chces pracovat v grafickom prostredi tak tych editorov je fakt dost.
        Everything is proceeding as I have foreseen.
      • Re: spomínané editory 01.09.2007 | 14:28
        Avatar rebrik Arch, Ubuntu  Používateľ
        A nano je v Ubuntu defaultne sa mi zda..
        Of All The Things I've Lost, I Miss My Mind The Most.
        • Re: spomínané editory 01.09.2007 | 16:19
          Avatar Peter Paška Ubuntu 11.04, LinuxMint  Používateľ
          Ďakujem pekne. Pozriem sa na to.
          PC Intel Core2Duo {3200}, 2GB RAM, ASUS Nvidia GTS250 1GB, 1 TB HDD, MB ASUS P5QE-L / NTB Fujitsu Lifebook AH512
          • Re: spomínané editory 03.09.2007 | 10:47
            Avatar LUcoRP Debian, *buntu, Android  Používateľ
            vyborne, zrozumitelne, dakujeme:)))

            BTW nedalo by sa v dalsom dieli povenovat trochu zakladnym matematickym operaciam? (scitanie, odcitanie, nasobenie, delenie, odmocnovanie, atd...)
            • Re: spomínané editory 03.09.2007 | 14:00
              Avatar Viliam Oravec Kubuntu 10.04 (MSI GX700PX)  Používateľ
              Nepredbiehaj udalosti. Aj k matematickým operáciám dôjde, ale až neskôr. Na matematiku potrebuješ premenné, a tie by mali nasledovať asi v 2. alebo 3. dieli.
              Ináč keď ti tak o to ide tak na sčítavanie, odpočet,... sa poučívajú znaky +,-,*,/ tak ako aj v matike

              Aby si pochopil to s tými premennými tak tu máš príklad:
              #include <stdio.h>
              main ()
              {
              	int i = 10, j = 5;
              
              	printf ("Sčítam odčítam, vynásobím a vydelím  číslo 10 číslom 5.\n");
              	printf ("Sšítanie: %d + %d = %d.\n", i, j, i+j);
              	printf ("Odčítanie: %d + %d = %d.\n", i, j, i-j);
              	printf ("Násobenie: %d x %d = %d.\n", i, j, i*j);
              	printf ("Delenie: %d : %d = %d.\n", i, j, i/j);
              }
              
              
              Skompiluj, pozeraj čo to robí a uč sa!!!
              Program vyšiel pod GPL v3 :D
              Všichni mněli ruce od krve, jenom já hubu... :)
              • Re: spomínané editory 03.09.2007 | 20:35
                Avatar Tomáš Gajdoš Ubuntu 8.10  Administrátor
                a myslis si ze to %d pochopi???
                • Re: spomínané editory 03.09.2007 | 21:25
                  NoOne   Návštevník
                  Nesazel bych na to.
                  • Re: spomínané editory 03.09.2007 | 21:35
                    Avatar rebrik Arch, Ubuntu  Používateľ
                    Nech si klikne tu a dole pozrie format commands :-)
                    Of All The Things I've Lost, I Miss My Mind The Most.
                • Re: spomínané editory 03.09.2007 | 21:54
                  Avatar Viliam Oravec Kubuntu 10.04 (MSI GX700PX)  Používateľ
                  Aha a ako vidím som zabudol vysvetliť, čo to vlastne to "%d" je... Takže je to miesto v dialogu, kde niečo na nás vybafne. Vysvetlenie je dole:
                  printf ("Sčítanie: %d + %d = %d\n", i, j, i+j)

                  // prvé %d patrí premennej "i" ako je to vidieť za prvou čiarkou
                  // druhé %d patrí premennej "j" --> druhá čiarka
                  // tretie %d patrí samotnej operácii i+j - práve tu na nás vybafne výsledok.

                  V praxi tento riadok vypadá nasledovne:

                  Sčítanie: 10 + 5 = 15

                  Hodne zdaru pri štúdií... (Mimochodom tiež s Céčkom začínam. Začal som asi v polovici prázdnin.)
                  Všichni mněli ruce od krve, jenom já hubu... :)
                  • Re: spomínané editory 03.09.2007 | 22:00
                    Avatar borg Arch, Debian jessie  Administrátor
                    takze reprezentuje cele cislo vo formatovacom retazci
                    • Re: spomínané editory 04.09.2007 | 18:26
                      Avatar Viliam Oravec Kubuntu 10.04 (MSI GX700PX)  Používateľ
                      no jo dá sa povedať, že áno.
                      Všichni mněli ruce od krve, jenom já hubu... :)
                      • Re: spomínané editory 04.09.2007 | 22:02
                        Avatar borg Arch, Debian jessie  Administrátor
                        nie da sa povedat, ze ano, ale ano :)
                        • Re: spomínané editory 04.09.2007 | 22:25
                          Avatar Viliam Oravec Kubuntu 10.04 (MSI GX700PX)  Používateľ
                          :D :D :D :D :D :D
                          Všichni mněli ruce od krve, jenom já hubu... :)
    • super 07.09.2007 | 13:29
      Avatar Tomáš ubuntu 7.04  Používateľ
      dakujem za krátky návod, konecne som mal cas sa do niecoho takehoto pustit a podla tohoto navodu mi to i slo, aspon som sa nieco zo zakladov naucil aspon to ako pustit ten program a ako ho tvorit dakujem :) budem sa tesit na dalsie diely
    • fuj 09.09.2007 | 02:03
      Jaroslav Šmíd   Návštevník
      Nezlobte se na mě, ale ten kód je pěkně hnusný. Funkce main má vypadat trošičku jinak a má vracet int.
      int main(int argc, char **argv) // popř. int main(int argc, char *argv[])
      {
        return 0;
      }
      
      • Re: fuj 11.09.2007 | 21:24
        vlado   Návštevník
        srandista,je to pre zaciatocnikov ... :-D
        • Re: fuj 11.09.2007 | 22:12
          Avatar borg Arch, Debian jessie  Administrátor
          je velmi zle ucit zaciatocnikov zle navyky
    • pokracovanie? 13.09.2007 | 12:52
      Avatar nate UBUNTU 8.04 (HH)  Používateľ
      cakam cakam a pokracovanie nikde:(...Nepozna niekto niejaky podobny serial o C (prip. C++, ale skor C ...) moze byt aj v AJ. Ale nehladam nieco takeho typu kde su popisane prikazy a syntaxy funkcii a zakladne funkcie, ale take cim praktickejsie....
      • Re: pokracovanie? 13.09.2007 | 20:38
        Avatar borg Arch, Debian jessie  Administrátor
        ono cez google najdes to co potrebujes, staci tam zadat klucove slova. inak mozes skusit thinking in c++
      • Re: pokracovanie? 07.10.2007 | 17:17
        anonymous   Návštevník
        www.builder.cz
    • tutorial 21.09.2007 | 18:02
      pogo   Návštevník
      http://people.tuke.sk/igor.podlubny/C/

      Moj nazor je tiez taky, ze od zaciatku treba cely main aj pre zaciatocnikov so vsetkym, co tam ma byt ( teda hlavne return 0;, kedze pri nezadani typu navratu je implicitne pouzity int, chybajuci return vyhadzuje warningy ), vysvetlenie by prislo potom v neskorsich dieloch.
      Takisto by som zacal s troska vacsou teoriou na zaciatok, hello world asi az v druhom diely, staci sa pozret na nejake kvalitne publikacie, akym stylom su pisane.
      Este by som sa rozpisal aj o editoroch alebo o vyvojovych prostrediach, program sa nemusi striktne pisat v konzole, predpokladam, ze kazdy zaciatocnik uz pouziva nejake graficke prostredie.
      • Re: tutorial 21.09.2007 | 21:27
        Avatar uid0 Debian  Používateľ
        myslis takto nejak? (pre zaujimavost som priklad uviedol tak aby bolo jasne ako to pracuje)
        int main(int argc, char **argv, char **env)
        {
        	char *str;
        	while (str = *env++)
        		printf("%s\n", str);
        	return 0;
        }
        

        v tom tvojom odkaze tiez maju main(void)

        inac nechapem co je take tazke na vysvetleni zmyslu return vo funkcii main() aby sa to muselo odkladat...
        Debian. apt-get into it…
        • Re: tutorial 21.09.2007 | 22:36
          Avatar Peter Rozum Arch Linux  Používateľ
          ten return sa mohol vysvetlit no s argumentmi v main by som este pockal.
          Everything is proceeding as I have foreseen.
          • Re: tutorial 21.09.2007 | 23:22
            Avatar uid0 Debian  Používateľ
            $ cat > test.c
            int main() {}
            $ make test
            cc     test.c   -o test
            $ ./test
            $ echo $?
            248
            

            ozaj?
            Debian. apt-get into it…
            • Re: tutorial 21.09.2007 | 23:23
              Avatar uid0 Debian  Používateľ
              mea culpa, zle som cital. un-fuck you :)
              Debian. apt-get into it…
      • Re: tutorial 21.09.2007 | 21:30
        Avatar uid0 Debian  Používateľ
        a ten odkaz mi silne pripomenul c bible, tak trosku staromodnejsie:
        int main(argc, argv, env)
        int argc;
        char **argv, **env;
        {
        	char *str;
        	while (str = *env++)
        		printf("%s\n", str);
        	return 0;
        }
        
        Debian. apt-get into it…
        • Re: tutorial 03.01.2008 | 01:19
          agama   Návštevník
          tak ja som jeden z tych co vidi cecko prvy raz.. clanok samozrejme vitam.. chcel by som podotknut, ze vacsina ludi co sa zacina zaujimat o Ccko uz nejaky ten zaklad okolo programovania ma.. nejaky ten pascal zo skoly, resp, php, javascript.. skor by sa zislo mozno na uvod upozornit na najvecsie rozdiely, respektive, co funguje inac.. a potom sa uz zapodievat vecami hlbsie.. co a preco je tak ako je..
    • pokracovanie... 01.05.2009 | 13:47
      Avatar cerwooo   Používateľ
      cawte..prosim vaas kedy bude pokracovanie???? tento uvod je dost dobryy
    • znak 14.11.2009 | 11:23
      marek   Návštevník
      neviete preco sa mi nezobrazy vo vystupe znak ,,\,,? #include <stdio.h>

      main()
      {
      printf(" oOOo\n");
      printf(" /\ oOOOo\n");
      printf(" / \ oOOo\n");
      printf("| | ||\n");
      printf("|___ |--|-|-|-|-| |\n");
      }
    • znak 14.11.2009 | 11:27
      marek   Návštevník
      neviete preco sa mi nezobrazy vo vystupe znak ,,\,,? #include <stdio.h>

      main()
      {
      printf(" oOOo\n");
      printf(" /\ oOOOo\n");
      printf(" / \ oOOo\n");
      printf("| | ||\n");
      printf("|___ |--|-|-|-|-| |\n");
      }
      • Re: znak 27.08.2010 | 15:07
        vito   Návštevník
        musis pouzit \\
        \ je speci znak