Lexikálne jednotky


Obsah tém. 

  1. Čo sú Lexikálne jednotky?
  2. Kľúčové slová
  3. Identifikátory
  4. Operátory
  5. Konštanty
  6. Príkaz WHILE
  7. Príkaz DO WHILE
  8. Príkaz FOR
  9. Príkazy skoku BREAK , CONTINUE

Na začiatok sme si ukázali niekoľko jednoduchých príkladov, prostredníctvom ktorých ste mali možnosť nahliadnuť do programovania.
V týchto príkladoch ste mali možnosť vyskúšať si základne funkcie vstupu a výstupu používané v C-čku. No aby sme mohli pokračovať ďalej musíme sa oboznámiť s takými vecami ako sú lexikálne jednotky, typy premenných, výrazy a operátory, príkazy v jazyku C, deklarácie a definície funkcií atď.
Takže poďme pekne po poriadku.

    Čo sú lexikálne jednotky?

Lexikálne jednotky sú základné stavebné prvky v jazyku. Pričom neberieme do úvahy len programovací jazyk. Lexikálne jednotky používame aj v bežnom jazyku či už písomnej resp. ústnej podobe. Lexikálna jednotka môže byť zložená z jedného alebo viac znakov.
Poznáme 6 základných druhov lexikálnych jednotiek: kľúčové slová, identifikátory, operátory, konštanty, oddeľovače, reťazec.


  
 Kľúčové slová

Kľúčové slová sú také lexikálne jednotky, ktorých použitie si vyhradzuje samotný jazyk. To znamená že ich nie je možné použiť na niečo iné ako to na čo sú určené.
Pre názornosť uvediem aspoň niektoré z nich:
char, float, if, else, int, return, switch, for, do, while, short, long, unsigned adť.
Zoznam všetkých kľúčových slov je možné nájsť v helpe a mi sa s nimi budeme postupne zoznamovať.

    Identifikátory

Identifikátor pomenúva jednotlivé prvky programu ako premenné, funkcie, návesti a pod. Pri vytváraní identifikátorov existujú isté pravidlá:

  • prvý znak z názvu identifikátora musí byť písmeno
  • nesmie obsahovať znaky národnej abecedy
  • v názve nesmie byť medzera
  • pri viac slovnom identifikátore treba použiť podčiarkovník napr. obvod_kruhu
  • v názve sa rozlišujú veľké a malé písmená
     

    Operátory

Operátory sú znaky pomocou ktorých vyjadrujeme matematické operácie. Najčastejšie sú zložené z jedného alebo dvoch znakov.
Uveďme si nejaké príklady operátorov:

+ sčítanie = priradenie
- odčítanie == rovnosť
* násobenie >= väčší alebo rovný
/ delenie <= menší alebo rovný
% delenie modulo ++  inkrementácia
&& a zároveň (AND) -- dekrementácia
|| alebo (OR)    
       

 

Aritmetické operátory

Sú to binárne operátory vzťahujúce sa k dvom operandom. Patria tam : +,-,*,/ a operátor modulo %. Operátor modulo sa nemôže aplikovať na údajové typy float a double.
Najnižšiu prioritu majú operátory +,- vyššiu prioritu majú operátory *, / a %. Operátor s najvyššou prioritou je unárny operátor mínus - . Operátory s rovnakou prioritou sa vykonávajú zľava do prava v poradí v akom sú uvedené.
V jazyku C existuje aj ternárny operátor:
a = (b > c) ? d : e;

Znamená, že premennej a bude priradená hodnota premennej d v tom prípade, že logický výraz v zátvorke je pravdivý, v opačnom prípade jej bude priradená hodnota premennej e.

Relačné a logické operátory

Relačné operátory majú všetky rovnakú prioritu. 
Sú to: > , >= , < , <= , == , != . Najniššiu prioritu má rovnosť == a nerovnosť != . Relačné operátory majú nižšiu prioritu ako aritmetické.
Logické operátory sú: logický súčin && , logický súčet || a negácia ! .Najvyššiu priority má negácia. potom logický súčin a nakoniec logi súčet. Logické operátory maú[ nižšiu prioritu ako relačné.
Operátorom s najnižšou prioritou je operátor priradenia.

Výslednou hodnotou relačného výrazu je celočíselná hodnota 0, ak je výraz nepravdivý. Ak je výraz pravdivý výslednou hodnotou výrazu je 1.

Operátory inkrementácie a dekrementácia

V C - čku namiesto výrazu i=i+1 napíšeme i++ alebo ++i a namiesto i=i-1 napíšeme i-- alebo --i .Medzi nimi je rozdiel. Prefixový operátor (++ resp. -- pred premennou) inkrementuje resp. dekrementuje ešte pred použitím jej hodnoty. Posfixový operátor ( ++  resp. -- za premennou ) premennú inkrementuje resp. dekrementuje až po použití jej hodnoty.

Napr. ak n má hodnotu 5, potom

      x = n++

priradí premennej x hodnotu 5 a premenná n nadobudne hodnotu 6. Avšak výraz:

      x = ++n

priradí premennej x aj n hodnotu 6. Operátory inkrementovania a dekrementovania možno použiť len v spojitosti s jedinou premennou. Napr. výraz x = (i + j)++ nie je možný.

Logické operátory s bitmi

Operátory pre manipuláciu s bitmi môžu pracovať len s premennými typu int.
Sú to tieto operátory:

& logický súčin po bitoch
| logický súčet po bitoch
<< posun vľavo
>> posun vpravo

Priorita operátorov

V nasledujúcej tabuľke uvádzame všetky operátory používané v jazyku C. Pričom najvyššiu prioritu majú operátory v najvyššom riadku. V každom riadku majú operátory rovnakú prioritu.

 

operátor typ operátora asociatívnosť
[ ] ( ) . ->  postfixové ++ a -- výraz =>
prefixové ++ a -- sizeof & * + - ~ ! unárne logické OR
pretypovanie unárne <=
* / % násobenie =>
+ - sčítánie =>
<< >> bitového posunu =>
< > <= >= relačný/ menší (a rovný), väčší (a rovný),  =>
== != rovnosti a nerovnosti =>
& bitové AND =>
^ bitové vylučovacie OR (XOR) =>
| bitové OR =>
&& logické AND =>
|| logické OR =>
?: podmienené vyhodnotenie <=
= *= /= %= += -= <<= >>= &= |= ^= jednoduché priradenie a priradenie s výpočtom <=
, postupné vyhodnotenie =>

 

    Konštanty

V C-čku máme 4 typy konštánt: celočíselné, reálne, znakové, reťazec.


Celočíselná  konštanta

  • dekadická (desiatková)  zložená z číslic 0 až 9, pričom prvá číslica nie je 0. Môže obsahovať znamienko ´-´
  • oktávová (osmičková) zložená z zložená z číslic 0 až 7 a začína sa číslicou 0
  • hexadecimálna (šestnástková) zložená z číslic 0 až 9 a znakov A, B, C, D, E, F a začína dvojicou znakov 0x resp. 0X
     

Reálna  konštanta

Reálna konštanta je automaticky typu double. Mame aj typ float. Reálna konštanta je zložená z celej časti, desatinnej bodky a desatinnej časti. napr.:75.25 , 3.14

Znaková konštanta

Predstavuje jeden znak umiestnený medzi dvoma apostrofmi napr. ´a´. Niektoré nezobraziteľné znaky sa zapisujú pomocou opačného lomítka a príslušného symbolu
napr.:
 ´n´        posuv kurzora na nový riadok
 ´\r´        posuv kurzora na začiatok riadku
 ´t´        posuv o tabelačnú pozíciu
 ´b´        posuv o jeden znak späť
 '\0'        binárna nula - koncový znak reťazca atď.

Konštantný výraz sa definuje pomocou kľúčového slova #define
napr.:

    #define    MAXLINE    100
    #define    PI         3.14

Pri definíciách konštant sa bodkočiarka na konci nedáva.

Textová konštanta

Textová konštanta je postupnosť znakov uzavretých v úvodzovkách.
napr.: "Volam sa xy"

Okrem zobraziteľných znakov môžme použiť aj nezobraziteľné
napr.: " Zadaj hodnotu premennej x \n"

Ak chceme do reťazca vložiť úvodzovky dávame pred úvodzovky opačné lomítko.

 

                Dátový objekt

Dátový objekt je časť operačnej pamäte, ktorú program používa na ukladanie údajov. Základné objekty s ktorými program,  napísaný v jazyku C, narába sú premenné, konštanty a funkcie. Na ich pomenovanie sa používajú identifikátory. Ich vymenovanie sa nazýva deklarácia. Deklaráciou sa premenná pomenuje a určí sa jej typ. Veľmi často je prvá deklarácia zároveň aj definíciou premennej. V tom prípade sa premennej zároveň vyhradzuje v pamäti priestor, prípadne sa aj inicializuje ( priradí sa jej počiatočná hodnota).

Základné vlastnosti dátového objektu

Dátový typ
Udáva charakter čísla, uloženého v dátovom objekte.

základné

  • int    celé čísla
  • float, double    reálne číslo jednoduchej a dvojnásobnej presnosti
  • char    jeden bajt schopný uchovať jeden znak zo súboru znakov ( najčastejšie ASCII znakov)

Tabuľka č.1

Tu budú dátové typy zoskenovať

C++ POD LUPOU STR.6

Pre bližšie určenie dĺžky celého čísla sa používajú kvalifikátory short a long. Kvalifikátor unsigned ( bez znamienka) pripúšťa len celé kladné čísla no dvojnásobnej dĺžky.
napr.:

short int x;
long int y;
unsigned int z;

V jazyku C chýba typ logický (boolean). Tento je nahradený typom int, kde nulová hodnota je totožná s hodnotou (FALSE) a nenulová s hodnotou true (TRUE). 
Výslednou hodnotou relačných operátorov v prípade true je jednotka.

odvodené

Odvodené dátové typy sú vždy zložené zo základných dátových typov alebo ich kombinácií.

  • pole            dátový objekt zložený z dátových objektov rovnakého dátového typu
  • štruktúra     dátový objekt zložený z dátových objektov rôzneho dátového typu
  • smerník      reprezentuje adresu daného objektu   

Veľkosť
Každý dátový objekt má určený dátový typ, ktorý má jednoznačne určenú svoju veľkosť ( udáva sa v Bajtoch)
Veľkosti dátových objektov:

  • celočíselné     2B až  4B
  • reálne            4B  až 8B
  • znak                  1B
  • logický              1bit
  • pole               veľkosť poľa sa určí ak počet prvkov vynásobíme veľkosťou prvku
  • štruktúra        veľkosť štruktúry určíme ak sčítame veľkosti všetkých prvkov tvoriacich štruktúru

Pozn. Viac informácií o veľkosti jednotlivých dátových objektoch viď. tabuľka č.1

Adresa
Je to číslo prvej pamäťovej bunky, kde sa v operačnej pamäti začína dátový objekt. Adresa je celé kladné číslo a udáva sa v hexadecimálnej sústave

Obsah
Hodnota, ktorá sa do dátového objektu ukladá. Je to vždy číslo. Význam tohto čísla určuje dátový typ.

Obor hodnôt
Veľkosť operačnej pamäte je ohraničená preto aj dátové objekty majú svoje ohraničenie. Hovoríme tomu, že dátový objekt má svoj obor hodnôt.
napr.

Popis Označenie Veľkosť Obor hodnôt
celé číslo so znamienkom int 2B {-32768,...,32767}
celé číslo bez znamienka unsigned int 2B {0,...........65535}
znak so znamienkom signed char 1B {-128,...,127}
znak bez znamienka  unsigned char 1B {0,...........255}

Pozn. Viac informácií o obore hodnôt jednotlivých dátových objektoch viď. tabuľka č.1

Možnosť meniť obsah
Dátový objekt, ktorý mení svoj obsah počas behu programu nazývame premenná.
Dátový objekt, ktorý nemení svoj obsah počas behu programu nazývame konštanta.

Meno
Meno dátového objektu vyjadruje identifikátor. Názov by mal vyjadrovať použitie dátového objektu napr. obvod_stvorca alebo pocet_ziakov.

Rozsah platnosti
Dátový objekt, ktorý má platnosť v celom programe nazývame - globálny.
Dátový objekt, ktorý má platnosť len v určitej časti programu nazývame - lokálny.

Operácie s dátovým objektom

Definícia dátového objektu
- určenie typu
- určenie adresy
- možnosť meniť obsah
- určenie mena

Priradenie znamená napĺňanie obsahu dátového objektu hodnotou napr.:  pocet_ziakov=4;

Inicializácia určenie počiatočnej hodnoty dátového objektu už pri definícií.


      POLE

Pole je dátový objekt zložený z dátových objektov, ktoré majú rovnaký dátový typ. K prvkom poľa pristupujeme pomocou indexov.
Index prvku určuje jeho poradie, pričom index prvého prvku poľa je 0 a posledného je N-1.
N je počet prvkov poľa, ktorý sa určí pri deklarácií.
napr.:    float    pole[15];

Deklarácia poľa j podobná deklarácií jednoduchej premennej s tím rozdielom že za meno premennej uvedieme v hranatých zátvorkách počet prvkov poľa.
 

napr.: int    a[20];

  • deklarácia poľa 20 - tich celých čísel
  • počet prvkov poľa 20
  • veľkosť 1 prvku poľa 2B, teda veľkosť poľa 40B
  • indexy poľa sú od 0 po 19
  • meno poľa je a, pole je typu int

 

Prvkom v poli priradzujeme hodnoty dvoma spôsobmi a to buď v cykle napr. pomocou funkcie scanf alebo  priamo, vymenovaním jednotlivých hodnôt.
Tento spôsob si však vyžaduje poznať hodnoty vopred
napr.:    int    pole[10] = { 1,4,5,7,8,9,6,5,54,23}; pri tomto spôsobe nemusíme uvádzať počet prvkov poľa v hranatých zátvorkách

Znakové pole
Je dátový objekt zložený z dátových objektov, ktoré majú typ znak.

napr.: char znak[10];

Inicializácia poľa prvkov typu char:


char znak[] = "skola";   veľkosť tohto poľa je o 1 znak  väčšia ako počet znakov v reťazci, pretože každá reťazcová konštanta je ukončená znakom \ 0

alebo

char znak[] = {´s´,´k´,´o´,´l´,´a´,´\0´};

Matica - viacrozmerné poľe

Matica je príklad dvojrozmerného poľa. Pod pojmom matica typu m * n chápeme obdlžníkové pole, ktoré je zložené z m - riadkov a n - stĺpcov.

Zápis matice:

TU BUDE ZÁPIS

 

Deklarácia matice: napr.: int a[5][5];     

 

    Príklady pre prácu s poľom

Príklad č.26:
Program, ktorý načíta z klávesnice n desatinných čísel a vypíše ich v obrátenom poradí a načítanom poradí.

#include<stdio.h>
#include<conio.h>
void main()
{
   float pole[10]; //deklarácia poľa 10 reálnych čísel		
   int i,n;	  // i - premenná určujúca index prvku, 
                  // n - premenná pre počet prvkov poľa 
   clrscr();

   printf("\nZadaj počet prvkov pola \n");
   scanf("%d",&n);	      // do premennej n sa uloží počet prvkov poľa
   for(i=0;i<n;i++)          //  načítanie n prvkov do poľa s indexom od i=0 až n-1
   {
      printf("\n[%d] prvok pola: ",i);
      scanf("%f",&pole[i]);
      }

   printf("\nČísla v obrátenom poradí:");
   for(i=n-1;i>=0;i--)		// píš prvky v obrát.poradí, prvý vytlačený prvok 
      printf("\npole[%d]=%.2f",i,pole[i]);
                                // má index i=n-1 a posledný i=0 s krokom i=i-1

   printf("\nČísla v načítanom poradí:"); // čísla sú idexované podľa načítania 
                                          // prvé číslo i=0 a posledné i=n-1
   for(i=0;i<n;i++)	
   {
      printf("\npole[%d]=%.2f",i,pole[i]);
      }
   getch();
   }
Príklad č.27:
Program, ktorý načíta z klávesnice 7 celých čísel a vypíše na obrazovku súčet párnych a súčet nepárnych prvkov poľa.
 

#include<stdio.h>
#include<conio.h>

void main(void)
{
   int p=0,n=0,i,j,pole[10];

   clrscr();

   printf("\nZadaj 7 celých čísel: \n");

   for(i=0;i<7;i++)
   {
      printf("\n[%d] prvok pola: ",i);      
      scanf("%d",&pole[i]);
      }

   for(j=0;j<7;j++)
   {
      if(pole[j]%2==0)            // %2 - modulo2 ak je neparny nebude 0
         p=p+pole[j];      // pripočítaj párny   
      else
         n=n+pole[j];      // pripočítaj nepárny
      }

   printf("\nSúčet parných prvkov poľa je %d.",p);
   printf("\nSúčet neparných prvkov poľa je %d.",n);

   getch();
   }

Príklad č.28:
Program, ktorý načíta z klávesnice 10 celých čísel a vypíše ich súčet.

#include<stdio.h>
#include<conio.h>

void main(void)
{
   int pole[10],i,s=0;

   clrscr();

   printf("\nZadaj 10 prvkov, ktoré chceš spočítať.\n");

   for(i=0;i<10;i++)
   {
      printf("\n[%d] prvok pola: ",i);
      scanf("%d",&pole[i]);            // &pole[i] je adresa i-tého prvku poľa
      }

   for(i=0;i<10;i++) 
      s=s+pole[i];                    // sčítaj prvky poľa

   printf("\nSúčet prvkov poľa je %d.",s);

   getch();
   }

Príklad č.29:
Program, ktorý načíta z klávesnice n desatinných čísel a vypíše na obrazovku všetky s neparným indexom. 


#include<stdio.h>
#include<conio.h>

void main(void)
{
   float pole[10];
   int i;

   clrscr();
   printf("\nZadaj 10 desatinných čísel: \n");

   for(i=0;i<10;i++)
   {
      printf("\n[%d] prvok pola: ",i);
      scanf("%f",&pole[i]);
      }

   printf("\nTlačím prvky pola s neparným indexom:");   

   for(i=0;i<10;i++)
      if(i%2!=0)                     // i%2 => modulo 2 - ak je nerovný 
                                    //  0 ide o nepárny
         printf("\npole[%d]=%.2f",i,pole[i]);

   getch();
   } 

 

        Triedenie prvkov poľa

 

Tu bude teória

 

Príklad č.30:
Program, ktorý načíta z klávesnice n - celých čísel do poľa a podľa výberu ich zotriedi zostupne resp. vzostupne - metóda prebublávania - bublinkové triedenie.

 

#include<stdio.h>
#include<conio.h>

void main(void)
{
   int a[100];		 //45,12,5,87,15,96,25,84,14,2};
   int i,x,j,pom,n,k;

   clrscr();
   printf("\nZadaj veľkosť poľa: ");
   scanf("%d",&n);
   for (i=0;i<n;i++)
   {
      printf("\n Zadaj a[%d]= ",i);
      scanf("%d",&a[i]);
      }

   printf("\nChcete usporiadať prvky poľa zostupne alebo vzostupne (z/v): \n");
   x=getch();                       // načítaj jeden znak odpovede 
   if(x=='v')
   {
      for (i=0;i<n-1;i++)           // n cyklov potrebných pre 
                                    //"prebublanie" každého prvku
      {
         for (j=0;j<n-i-1; j++)     // v každom ďaľšom cykle sa 
                                    // zotrieďuje o 1 menší počet
         {
            if (a[j]>a[j+1])
            {
               pom=a[j];            // výmena dvoch prvkov cez pom premennú
               a[j]=a[j+1];
               a[j+1]=pom;
               }
            }
         }
      printf("\n Usporiadanie od najmenšieho po najväčší");
      for (i=0;i<n;i++)
         printf ("\na[%d]= %d",i,a[i]);
      }
   if(x=='z')
   {
      for (i=0;i<n-1;i++)          // n cyklov potrebných pre 
                                   // "prebublanie" každého prvku
      {
         for (j=0;j<n-i-1;j++)     // v každom ďaľšom cykle sa zotrieďuje o 
                                   // 1 menší počet
         {
            if (a[j]<a[j+1])
            {
               pom=a[j];           // výmena dvoch prvkov cez pom premennú
               a[j]=a[j+1];
               a[j+1]=pom;
               }
            }
         }
      printf("\n Usporiadanie od najväčšieho po najmenší");
      for (i=0;i<n;i++)
         printf ("\na[%d]= %d",i,a[i]);
      }

   getch();
   }

 

 Úlohy pre zopakovanie

Načítajte z klávesnice 10 desatinných čísel.
1.vypíšte ich v obrátenom poradí
2.vypíšte najmenší prvok poľa
3.utrieďte prvky od najmenšieho po najväčší
4.vypíšte všetky prvky poľa s neparným indexom

Načítajte z klávesnice neurčitý počet celých čísel
vypíšte na obrazovku všetky párne čísla a ich súčet. Zadávanie čísel končí 0.


Načítajte z klávesnice n celých čísel.
1.vypíšte ich v načítanom poradí
2.utrieďte prvky od najväčšieho po najmenší
3.vypočítajte a vypíšte priemer nepárnych prvkov poľa
4.vypíšte súčet párnych prvkov

Načítajte z klávesnice neurčitý počet celých čísel
vypíšte na obrazovku všetky čísla s nepárnym indexom. Zadávanie čísel končí 0.

 

 Príklady pre prácu s maticou

Príklad č.31:
Program, ktorý načíta z klávesnice prvky matice a realizuje nasledujúce operácie:

  •  výpis prvkov matice pomocou indexov
  • výpis prvkov matice priamo
  • výpis prvkov v 3. riadku matice

 

#include<stdio.h>
#include<conio.h>

void main(void)
{
   int matica[100][100];
   int s,r,i,j,min;

   clrscr();
   printf("Zadaj počet riadkov a stĺpcov\n");
   scanf("%d%d",&s,&r);              // &s,&r - adresy premenných s a r

   for(i=0;i<s;i++)              // cyklus pre riadky
   {
      for(j=0;j<r;j++)           // cyklus pre stĺpce  
      {
         printf("\nZadaj prvok M[%d,%d] = ",i,j);
         scanf("%d",&matica[i][j]);       // &matica[i][j] - adresa ij prvku poľa
         }
      }

   printf(" \n Výpis prvkov matice vo forme indexov\n");

   for(i=0;i<s;i++)             // cyklus riadkov
   {
      for(j=0;j<r;j++)          // cyklus stĺpcov
         printf("\nM[%d,%d] = %d ",i,j,matica[i][j]);
      }

   printf(" \n Výpis prvkov matice\n");

   for(i=0;i<s;i++)           // cyklus riadkov
   {
      printf("\n");           // každý riadok začne odriadkovaním
      for(j=0;j<r;j++)        // cyklus stĺpcov
         printf(" \t%d ",matica[i][j]);
      }

   printf("\nVýpis 3. riadku matice\n");

   for(j=0;j<r;j++)
      printf("\t%d ",matica[2][j]);    // prvky poľa sa indexujú 
                                       //od 0 t.j. tretí je 0,1,2

   getch();
   }

 

            Deklarácia, Inicializácia, Priradenie

Všetky premenné sa pred použitím musia deklarovať. Deklarácia pozostáva zo špecifikácie typu a uvedenia zoznamu premenných tohto typu.
 

Príklad deklarácie jednoduchej premennej
int x, y, pocet;

Príklad deklarácie poľa
char pole[10];

Príklad deklarácie štruktúry
 

   struct datum 
   {
      int den;
      int mesiac;
      int rok;
      char meno[8];
      }  dat_nar;
 

Posledným zápisom sme deklarovali štrukturovanú premennú dat_nar ( jej typ sme nazvali datum). Táto premenná obsahuje štyri premenné, nazývané členy štruktúry. Prvé tri sú typu int, posledná je 7 znakové pole pričom ôsmy znak je rezervovaný pre ukončujúcu nulu \0.

Deklaráciou sa určí, akého typu bude daná premenná.
Žiadnej z takto deklarovaných premenných sa ešte nepriradí hodnota, ale v pamäti sa jej rezervuje miesto, čiže sa jedná súčasne aj o definíciu

Jednoduchú premennú je možné zároveň aj inicializovať.
Inicializácia je
určenie počiatočnej hodnoty premennej už pri deklarácií.

int x=0;
int a=´0´;

 

Priradenie znamená napĺňanie obsahu dátového objektu hodnotou napr.:  pocet_ziakov=4;
 

 

 

Tu budem ešte doplňovať ...