Základy programovania pomocou príkladov - 2005

Tieto základy sú nadstavbou pre mo2004 a preto sa aj dajú stiahnuť spolu s predchádzajúcimi príkladmi (mo2004). Čo sa týka obtiažnosti, predpokladajú trochu viac ako mo2004. Avšak aj ja beriem ako samozrejmosť, že čitateľ si najskôr pozrie mo2004 a až potom mo2005.

  1. Napíšte program, ktorý bude simulovať pád guličky a jej odrazy. Pritom budú platiť tieto pravidlá: Gulička sa po dopade odráža do výšky 70% z predchádzajúcej výšky až dovtedy, kým jej výška nie je menšia ako 1, zároveň treba počítať dráhu.
    program mo2004_1;
    
    const min_h=1; {konstanta, jej typ netreba zadat}
    
    var h: real;
        actual_h:real;{terajsia vyska}
        s:real;{draha}
        n:integer;{pocitadlo odrazov}
    
    begin
    
    writeln('Zadajte vysku h, z ktorej gulicka pada:');
    
    repeat
          write('h:= ');
          readln(h);
          if h<0 then writeln('chybny vstup');
    until h>=0;
    
    s:=0;
    n:=0;
    {vyradenie padu z vysky < min_h }
    if h<min_h then begin
                    writeln('guluocka sa neodrazi, prejdena draha je s= ',h:5:10);
                    readln;{pocka na |Enter|}
                    halt;{ukoncenie programu, taky rychli prikaz}
                    end;
    
    s:=s+h;{prve padanie}
    actual_h:=h;
    
    repeat
          actual_h:= 0.7 * actual_h;
          if actual_h>min_h then begin
                                 inc(n);{increas n}
                                 write(n:3,'-ty odraz');
                                 s:= s + 2*actual_h;
                                 write(', vyska vystupu h= ',actual_h:2:2);
                                 writeln(', draha s= ',s:2:3);
                                 end;
    until actual_h < min_h;
    
    writeln('SUMARIZACIA:');
    writeln('- Pocet odrazov: ',n:3);
    writeln('- Prejdena draha: ',s:3:3);
    writeln('Stlacte Enter');
    
    readln;
    end.
    
  2. Naprogramujte program pre prácu so súborom, ktorý vypíše na obrazovku, vymení velké písmená za velké a naopak, zistí počet riadkov a čísel v súbore a zároveň takto zmenený súbor uloží inde.
    program mo2005_3;
    var fr: text;{typ zastupujuci subor v tvare textoveho suboru}
        fw: text;{fr - file read, fw - file write}
        ch:char;{pomocna premenna}
        poc_cisel, poc_riadkov:integer;
    
    {funkcia na zmenu 'case' teda 'velkosti' pismena}
    function change_case(ch:char):char; {vystupna hodnota je znak}
             var out:char; {vystup}
             begin
             out:=upcase(ch); {a -> A}
             
    		 {A -> a:}
             
    		 if (65<=ord(ch)) and (ord(ch)<=90) then out:=chr(ord(ch)+32);
    
             change_case:=out;
             end;
    
    begin
    
    {ak niektorym prikazom celkom nerozumiete pouzite
    pascal help > Shift+F1}
    
    {tento blok sa da vynechat, ak  mame subor praca1.txt}
          {vytvorime si pokusny subor}
          {asociujeme subor pod nazov premennej}
         assign(fw,'c:/bp/bin/praca1.txt');
    
          {vytvorenie suboru praca1.txt a jeho otvorenie
          pre zapis. pravdaze do prazdneho suboru}
         rewrite(fw);
    
          {zapis do suboru sa deje podobne ako vypis na obrazovku
          s tym rozdielom, ze specifikujem ciel, kde piseme}
         writeln(fw,'Ahojte 146, IiIiI,');
         write(fw,'novy riadok suboru Praca1.txt');
    
          {zatvorenie suboru - toto zatvorenie nesmie chybat!}
         close(fw);
    
    {----------------}
     {nacita sa subor c:/bp/bin/praca1.txt}
    assign(fr,'c:/bp/bin/praca1.txt');
    
     {otvorenie suboru len pre citanie}
    reset(fr);
    
     {vytvorime subor, do ktoreho zapiseme vysledok}
    assign(fw,'c:/bp/bin/praca2.txt');
    rewrite(fw);
    
    poc_cisel:=0;
    poc_riadkov:=1;{subor s n riadkami ma n-1 riadkovych koncov (eoln)}
    
     {vypis, konverzia a zapis do praca2.txt}
    writeln('> Subor praca1.txt:');
    
    repeat
          if eoln(fr) then inc(poc_riadkov); {eoln je podobne ako eof(fr)}
          read(fr,ch);
          write(ch);
          if (47 < ord(ch)) and (ord(ch) < 58) then inc(poc_cisel);
          write(fw,change_case(ch)); {zapis do praca2.txt}
    
    until eof(fr); {ak je znak ktory sa ma precitat koniec suboru
                   tak funkcia eof vrati true, a teda nam povie, ze
                   sme precitali vsetko.}
    close(fw);
    close(fr);
    
     {na koniec vypiseme zmeneny subor a statistiku}
    writeln;
    
    writeln('> Subor praca2.txt:');
    assign(fr,'c:/bp/bin/praca2.txt');
    reset(fr);
    
    repeat
          read(fr,ch);
          write(ch)
    until eof(fr);
    
    close(fr);
    
     {statistika}
    writeln('');
    writeln('----------------------------------');
    writeln('pocet riadkov suboru: ',poc_riadkov:6);
    writeln('pocet cisiel v subore: ',poc_cisel:5);
    
    readln;
    end.
    
  3. Vytvorte hru na hádanie čísla, kde si počítač pomyslí číslo z intervalu a Vy potom budete pomocou nápovedy (väčšie/menšie) hádať.
    program mo2005_5;
    {hadanie cisla, pocitac si mysli cislo}
    
    var dh,hh: integer;{hranice intervalu hadania}
        cislo: longint;
        koniec,koniec_programu:boolean;{indikuje koniec hry, programu}
        volba:string[10];{[10] - dlzka retazca}
        tip,h:longint;
        pokusy:longint;
    
    begin
    
    koniec_programu:=false;
    repeat {blok hry}
        
        writeln('> Zadajte hranice intervalu, z ktoreho budete typovat cislo:');
        write('Dolna hranica:=');
        readln(dh);
        
        write('Horna hranica:=');
        readln(hh);
        
        if hh<dh then begin h:=hh; hh:=dh; dh:=hh; end;
        
        {generator nahodnych cisel}
        randomize;
        
        {cislo je z intervalu <dh,hh>}
        cislo:=trunc(dh + random(hh-dh+1));
        koniec:=false;
        pokusy:=0;
        
        repeat {blok tipovania}
              write('tip: ');
              readln(tip);
              inc(pokusy);
              if tip<cislo then writeln('> vacsie')
                 else if tip>cislo then writeln('> mensie')
                         else begin
                              writeln('> !!Gratulujem!! cislo je: ',cislo:4);
                              writeln('  STATISTIKA');
                              writeln('  pokusov: ',pokusy:10);
                              koniec:= true;
                              end;
        until koniec;
        
              write('prajete si pokracovat? ["ano"/"nie"]: ');
              readln(volba);
              if volba<>'ano' then koniec_programu:=true;
        
    until koniec_programu;
    
    end.
    
  4. Urobte interaktívny program pre počítanie objemu a povrchu telies: kocka, kváder, valec, guľa. Nezabudnúť aj na kontrolu vstupných údajov.
    program mo2005_7;
    var vyber:byte;{cislo vyberu}
        objem:boolean;
        input,input2,input3:real;{vstupny udaj}
    
    {testujem korektnost cisla}
    function cislo_ok(input: real):boolean;
             begin
             if input>=0 then cislo_ok:=true
                else cislo_ok:=false;
             end;
    
    {ak objem bude false tak pocitame povrch inak objem}
    function kocka(co: boolean; a: real):real;
             begin
             if co then kocka:=a*a*a
                else kocka:=a*a*6;
             end;
    function kvader(co: boolean; a,b,c: real):real;
             begin
             if co then kvader:=a*b*c
                else kvader:=a*b*2 + a*c*2 + c*b*2;
             end;
    function valec(co: boolean; r,h: real):real;
             begin
             if co then valec:=PI*r*r*h
                else valec:=PI*r*r*2 + PI*r*2*h;
             end;
    function gula(co: boolean; r: real):real;
             begin
             if co then gula:=(4/3)*PI*r*r*r
                else gula:=4*PI*r*r;
             end;
    
    begin
    repeat
    
        write('> Vyber povrch[1]/objem[2]: ');
               readln(vyber);
        
        if vyber=2 then objem:=true
           else objem:=false;
        
        write('> Vyber kocka[1]/kvader[2]/valec[3]/gula[4]: ');
               readln(vyber);
        
        case vyber of
             1 {kocka}:begin writeln('> KOCKA');
                 repeat
                 write('a:= ');readln(input);
                 until cislo_ok(input);
        
                 if objem then write('> Objem ')
                    else write('> Povrch ');
                 writeln('kocky je ',kocka(objem,input):5:5);
                 end;
        
             2 {kvader}:begin writeln('> KVADER');
                 repeat
                  write('a:= ');readln(input);
                 until cislo_ok(input);
                 repeat
                  write('b:= ');readln(input2);
                 until cislo_ok(input2);
                 repeat
                  write('c:= ');readln(input3);
                 until cislo_ok(input3);
        
                 if objem then write('> Objem ')
                    else write('> Povrch ');
                 writeln('kvadra je ',kvader(objem,input,input2,input3):5:5);
                 end;
        
             3 {valec}:begin writeln('> VALEC');
                 repeat
                  write('r:= ');readln(input);
                 until cislo_ok(input);
                 repeat
                  write('h:= ');readln(input2);
                 until cislo_ok(input2);
        
                 if objem then write('> Objem ')
                    else write('> Povrch ');
                 writeln('valca je ',valec(objem,input,input2):5:5);
                 end;
        
             4 {gula}:begin writeln('> GULA');
                 repeat
                 write('r:= ');readln(input);
                 until cislo_ok(input);
        
                 if objem then write('> Objem ')
                    else write('> Povrch ');
                 writeln('gule je ',gula(objem,input):5:5);
                 end;
        end;{konci case}
        
           write('> Opakovat? ano[1]/nie[2]: ');
           readln(vyber);
           if vyber<>1 then halt; {okamzite skoncenie}
        
    until false;
    
    end.
    
  5. Pravdepodobne ste už natrafili na tzv. Cézarovu šifru, ktorá je založená na tom, že posúva znaky o vopred vybraný počet miest (A -> C, B -> D, Z -> B apod.). Urobte program na šifrovanie súboru, pričom zvlášť sa budú kódovať veľké, malé písmená a číslice.
    program mo2005_11;
    {sifrovanie textu}
    var fr: text;{typ zastupujuci subor v tvare textoveho suboru}
        fw: text;{fr - file read, fw - file write}
        ch:char;{pomocna premenna}
        kluc:shortint;{sifrovaci kluc, na desifrovanie treba pouzit zaporny}
        zdroj,ciel:string[200];{mena suborov}
    
    {funkcia na posun cisla o velkost kluca
     s prihliadnutim na cykliskost}
    function posun(cislo,dh,hh:integer):byte;
             var out_int:integer;
                 znamienko:shortint;
             begin
             out_int:=cislo+kluc;
             if out_int>hh then znamienko:=-1
                else if out_int<dh then znamienko:=+1
                     else znamienko:=0;
    
               repeat
               out_int:= out_int + znamienko * (hh-dh+1);
               until (out_int<=hh) and (out_int>=dh);
    
             posun:=out_int;
             end;
    
    {funkcia na sifrovanie pismena/cislice}	
    function sifra(ch:char):char;{vystupna hodnota je znak}
             var out:char;{vystup}
             begin
             out:=ch;
             {A-Z}
               if (65<=ord(ch)) and (ord(ch)<=90) then out:=chr(posun(ord(ch),65,90));
             {a-z}
               if (97<=ord(ch)) and (ord(ch)<=122) then out:=chr(posun(ord(ch),97,122));
             {0-9}
               if (48<=ord(ch)) and (ord(ch)<=57) then out:=chr(posun(ord(ch),48,57));
             sifra:=out;
             {skuste aj: sifra:=chr(posun(ord(ch),0,255))}
             end;
    
    begin
    
    writeln('> Program Sifra');
    {nacita sa subor c:/bp/bin/sifra1.txt}
       write('> meno suboru na sifrovanie: c:/bp/bin/');
       readln(zdroj);
       zdroj:='c:/bp/bin/'+zdroj;
       assign(fr,zdroj);
       {otvorenie suboru len pre citanie}
       reset(fr);
    
    {vytvorime subor, do ktoreho zapiseme vysledok}
       write('> meno suboru na ulozenie: c:/bp/bin/');
       readln(ciel);
       ciel:='c:/bp/bin/'+ciel;
       assign(fw,ciel);
       rewrite(fw);
    
    {sifrovaci kluc}
       write('> sifrovaci kluc [<-127; +127>]: ');
       readln(kluc);
    
    {vypis, konverzia a zapis do ciel}
    writeln('> Subor: ',zdroj);
    
    repeat
          read(fr,ch);
          write(ch);
          write(fw,sifra(ch));
    until eof(fr); {ak je znak ktory sa ma precitat koniec suboru
                   tak funkcia eof vrati true, a teda nam povie, ze
                   sme precitali vsetko.}
    close(fw);
    close(fr);
    
    {na koniec vypiseme zmeneny subor}
        writeln('');
        writeln('> Subor: ',ciel);
        assign(fr,ciel);
        reset(fr);
        repeat
          read(fr,ch);
          write(ch)
        until eof(fr);
        close(fr);
    writeln;
    
    readln;
    end.
    
  6. Urobte program, ktorý vygeneruje čísla ako v lotérií zo zadaného intervalu a potom bude hráč hádať vopred daný počet čísel, podobne ako v tipovacej súťaži.
    program mo2005_13;
    {tip}
    const top_n=100;{max. pocet tipov}
    type pole=array[1..top_n] of integer;
         pole_boolean=array[1..top_n] of boolean;
    
    var dh,hh:integer;
        pocitac,clovek,vysledok:pole;{zasobniky tipov}
    
    {pole v ktorom je napisane, ci uz cislo z tipov pocitaca 
    bolo uhadnute, je to preto aby pri viacnasobnom tipe hraca 
    nedoslo k mnozeniu "spravnych" odpovedi}
    
        pocitac_out:pole_boolean;
        input:integer;
        zhoda:integer;{pocet spravnych tipov}
        n:byte;{pocet tipovanych cisel}
        I,M:integer;
    
    begin
    
    repeat
    
    writeln('> Zadajte interval tipovania');
    write('dh: ');
    readln(dh);
    
    write('hh: ');
    readln(hh);
    
    write('> Zadajte pocet tipovanych cisel [<1,',top_n,'>]: ');
    readln(n);
    
    {kontrola} if (n<1) or (n>top_n) then n:=1;
    
    randomize; {generator nahodnych cisel sa zapol}
    
    {naplni sa zasobnik tipov pocitaca: pocitac[]}
    for I:=1 to n do begin
                     pocitac[I]:=trunc(dh+random(hh-dh+1));
                     end;
    {naplni sa zasobnik tipov hraca: clovek[]}
    for I:=1 to n do begin
                     write('> tip[',I,'/',n,']: ');
                     read(input);
                     clovek[I]:=input;
                     end;
    
    {porovnanie typov a vyhodnotenie}
    zhoda:=0;
    for I:=1 to top_n do vysledok[I]:=0; {pole vysledok ma len ulohu oznacit
                                         uhadnute cisla}
    
    for I:=1 to top_n do pocitac_out[I]:=false;
    
    for I:=1 to n do begin
                     M:=1;
                     repeat
                     if (clovek[I]=pocitac[M]) and (not pocitac_out[M]) then begin
                                   inc(zhoda);
                                   vysledok[I]:=1;
                                   pocitac_out[M]:=true;
                                   end;
                     inc(M);
                     until (M>n) or (vysledok[I]=1)
                     end;
    
    writeln('> VYHODNOTENIE');
    writeln('- Cisla/tipy hraca/zhody');
    
    for I:=1 to n do write(pocitac[I]:4); writeln;
    for I:=1 to n do write(clovek[I]:4); writeln;
    for I:=1 to n do write(vysledok[I]:4); writeln;
    
    writeln('> Pocet spravnych tipov: ',zhoda:5);
    
       write('> Opakovat? ano[1]/nie[2]: ');
       readln(input);
       if input<>1 then halt;{okamzite skoncenie}
    
    until false;
    end.
    
  7. Urobte program, v ktorom budú dvaja hráči hádať súčet hodnôt na hodených dvoch kockách až kým neuhádnu. Pravdaže ten kto bude mať menej tipov vyhráva.
    program mo2005_14; {hody kockou}
    var cislo1,cislo2:byte;
        hrac1,hrac2:byte;
        koniec:boolean;
        tip:byte;
    
    begin
    
    randomize;
         cislo1:=trunc(1+random*6);
         cislo2:=trunc(1+random*6);
    writeln('> Hada hrac 1.:');
    koniec:=false;
    hrac1:=0;
    
    repeat
          write('> tip: ');
          readln(tip);
          if tip<>(cislo1 + cislo2) then writeln('- nie')
             else begin
                  writeln('- ano! ',cislo1,'+',cislo2);
                  koniec:=true;
                  end;
          inc(hrac1);
    until koniec;
    
         cislo1:=trunc(1+random*6);
         cislo2:=trunc(1+random*6);
    
    writeln('> Hada hrac 2.(pozor, uz ine dva hody):');
    koniec:=false;
    hrac2:=0;
    repeat
          write('> tip: ');
          readln(tip);
          if tip<>(cislo1 + cislo2) then writeln('- nie')
             else begin
                  writeln('- ano! ',cislo1,'+',cislo2);
                  koniec:=true;
                  end;
          inc(hrac2);
    until koniec;
    
    writeln('> STATISTIKA');
    writeln('hrac1: ',hrac1:1,' hrac2: ',hrac2:1);
    if hrac1<hrac2 then writeln ('- vyhral hrac 1.')
       else if hrac1>hrac2 then writeln ('- vyhral hrac 2.')
            else writeln('- spravodliva remiza');
    
    readln;
    end.
    
  8. Skúste urobiť simuláciu hry "Kameň, papier, nožnice" medzi človekom a počítačom.
    program mo2005_15;
    {kamen papier noznice
     1     2      3      }
    
    const znak: array[1..3] of string[7] = ('kamen','papier','noznice');
    
    var pocitac,clovek:byte;
        clovek_vitaz:integer;{indikuje vytaztvo cloveka, [0/5/10]}
        input:byte;
    
    begin
    
    randomize;
    repeat
          repeat
                write('> Zadajte kamen[1]/papier[2]/noznice[3]: ');
                readln(clovek);
          until (clovek>=1) and (clovek<=3);
    pocitac:=trunc(1+random*3);
    
    writeln('> Hrac: ',znak[clovek],'  Pocitac: ',znak[pocitac]);
    clovek_vitaz:=0;
    case clovek of
    
         1:begin{kamen}
           case pocitac of
               1:clovek_vitaz:=5;
               2:{-};
               3:clovek_vitaz:=10;
           end;
           end;
    
         2:begin{papier}
           case pocitac of
               1:clovek_vitaz:=10;
               2:clovek_vitaz:=5;
               3:{-};
           end;
           end;
    
         3:begin{noznice}
           case pocitac of
               1:{-};
               2:clovek_vitaz:=10;
               3:clovek_vitaz:=5;
           end;
           end;
    end;
    
    case clovek_vitaz of
        0 :writeln('- Vyhral pocitac');
        5 :writeln('- Remiza');
        10:writeln('- Vyhral hrac');
    end;
    
       write('> Opakovat? ano[1]/nie[2]: ');
       readln(input);
       if input<>1 then halt;{okamzite skoncenie}
    
    until false;
    end.
    
  9. Naprogramujte hru oko. Hrá sa so žolíkovými kartami bez dolníkov, horníkov a kráľov, pričom každá karta má hodnotu čísla na karte a eso má hodnotu 1. Cieľom hry je ťahať karty, až kým nebude súčet kariet 21. To je oko. Hráč ťahá karty po jednej a hocikedy môže prestať. Ak prekročí súčet 21, automaticky prehráva. Vyhráva ten hráč, ktorý je najbližšie k súčtu 21, alebo ktorý má oko.
    program mo2005_16; {"oko"}
    const oko=21;
          top_n=100;
    
    type pole_hracov=array[1..top_n] of byte;
         pole_hracov_vitaz=array[1..top_n] of boolean;
    
    var hrac:pole_hracov;
        hrac_vitaz:pole_hracov_vitaz;{indikuje prehru hraca ak prekroci 21}
        vitaz:pole_hracov;{cisla vitazov}
        n:byte;{pocet hracov}
        I,M:byte;
        koniec:boolean;
        volba:string[3];
        karta:byte;
    
    begin
    
    randomize;
    repeat
          write('> Zadajte pocet hracov [<1,',top_n,'>]: ');
          readln(n);
    until (n>=1) and (n<=top_n);
    
    {"vycistenie" ptremennych}
    
    for I:=1 to top_n do hrac_vitaz[I]:=true;
    for I:=1 to top_n do hrac[I]:=0;
    for I:=1 to top_n do vitaz[I]:=0;
    
    for I:=1 to n do begin
        koniec:=false;
        writeln('> Ide hrac c.',I:2);
        repeat
           write(' > Kartu? ["ano"/"nie"]: ');
           readln(volba);
           if volba='nie' then koniec:=true
              else begin
                   karta:=trunc(1+random*10);
                   inc(hrac[I],karta); {zvacsi o hodnotu}
                   writeln(' - Vybrata karta ma hodnotu: ',karta:2);
                   if hrac[I]>oko then hrac_vitaz[I]:=false;
                   end;
        until koniec or (hrac[I]>oko);
        writeln(' - Hrac c.',I,' ma ',hrac[I],' bodov')
        end;
    
    {Vyhodnotenie}
    M:=1;
    for I:=1 to n do begin
        if hrac_vitaz[I] then
           if vitaz[M]=0 then vitaz[M]:=I{prvy vstup}
              else if abs(hrac[I]-oko) < abs(hrac[vitaz[M]]-oko) then vitaz[M]:=I
                      else if abs(hrac[I]-oko) = abs(hrac[vitaz[M]]-oko) then begin
                              {jedna sa o pripad zhody bodov}         inc(M);
                                                                      vitaz[M]:=I;
                                                                      end;
                     end;
    
    {vypis}
    M:=1;
    write('> Vitazi su hraci s cislami: ');
    repeat
          if vitaz[M]=0 then if M=1 then writeln('Niesu vitazi')
                                    else koniec:=true
                        else writeln(vitaz[M]:2,'., ');
          inc(M);
    until koniec or (M>n);
    
    readln;
    end.
    
  10. Urobte program na vyhodnotenie písomky, kde sa zadá maximálny počet bodov, body jednotlivých žiakov, následne sa žiaci oznámkujú (100%-90% 1, 89%-75% 2, 74%-60% 3, 59%-40% 4, 39%-0% 5) a vyhodnotí sa zastúpenie známok ako aj priemerná známka.
    program mo2005_17;
    const _1=90;{dolne hranice znamok}
          _2=75;  _3=60;  _4=40;  _5=0;
          top_n=100;
    
    type pole_ziakov=array[1..top_n,1..2] of real;
                     {x[i,1] - pocet bodov, x[i,2] - znamka}
         pole_znamok=array[1..5] of byte;{pocty znamok}
    
    var ziak:pole_ziakov;
        znamka:pole_znamok;
        n:byte;{pocet ziakov}
        top_b:real;{maximalny pocet bodov}
        I,M:integer;
        k:real;{pomocna premenna}
    
    begin
    
    {vycistenie premennych}
    
    for I:=1 to top_n do begin ziak[I,1]:=0; ziak[I,2]:=0; end;
    for I:=1 to 5 do znamka[I]:=0;
    
    repeat{zadanie poctu ziakov s podmienkou}
          write('> Zadajte pocet ziakov [<1,',top_n,'>]: ');
          readln(n);
    until (n>=1) and (n<=top_n);
    
    repeat{zadanie maximalneho poctu bodov s podmienkou}
          write('> Zadajte maximalny pocet bodov: ');
          readln(top_b);
    until top_b>0;
    
    {nacitanie poctu bodov ziakom}
    for I:=1 to n do begin
                     write(' > Ziak c.',I:2,', pocet bodov: ');
                     readln(ziak[I,1]);
                     end;
    
    {Vyhodnotenie}
    for I:= 1 to n do begin
                      k:= 100 * (ziak[I,1]/top_b);
                      ziak[I,2]:=1;
                      if k<_1 then ziak[I,2]:=2;
                      if k<_2 then ziak[I,2]:=3;
                      if k<_3 then ziak[I,2]:=4;
                      if k<_4 then ziak[I,2]:=5;
                      end;
    for M:=1 to 5 do for I:=1 to n do begin
        if ziak[I,2]=M then inc(znamka[M]);
        end;
    
    {Statistika}
    writeln('> STATISTIKA');
    for M:=1 to 5 do writeln(' - znamka ',M,'; pocet: ',znamka[M]:2,'; zastupenie: ',((znamka[M]/n)*100):2:2,'%');
    
    k:=0;
    for I:=1 to n do k:=k+ziak[I,2];
    writeln(' - Priemerna znamka je: ',(k/n):1:3);
    
    readln;
    end.
    
  11. Na vstupe programu je veta ukončená bodkou, program určí počet znakov vo vete (aj s medzerami), nahradí veľké malými písmenami, pred každý znak vloží "*", vo vete vymaže medzery a vetu vypíše aj odzadu.
    program mo2005_20;
    var veta:String[255];
        I:integer;
        ch:char;
        poc_znakov:integer;
    
    {A -> a}
    function downcase(ch:char):char;
             begin
             if (ch>='A') and (ch<='Z') then downcase:=chr(ord(ch) + 32)
                else downcase:=ch;
             end;
    
    begin
    
    writeln('> Zadajte vetu ukoncenu bodkou:');
    
    I:=1;
    veta:='';
    repeat
          read(ch);
          veta:=veta+ch;
          inc(I);
    until (ch='.') or (I>255);
    
    readln;
    
    poc_znakov:=length(veta);{length vracia dlzku retazca}
    
    writeln(' > Pocet znakov vo vete: ',poc_znakov);
    
    { A > a }
    writeln(' > Veta so zmenou "A"->"a":');
    for I:=1 to length(veta) do write(downcase(veta[I]));
    writeln;
    
    { *ch }
    writeln(' > Veta so zmenou "A" -> "*A":');
    for I:=1 to length(veta) do write('*',veta[I]);
    writeln;
    
    { ' ' > '' }
    writeln(' > Veta bez medzier:');
    for I:=1 to length(veta) do if veta[I]<>' ' then write(veta[I]);
    writeln;
    
    { 'ab' > 'ba' }
    writeln(' > Veta napisana odzadu:');
    for I:=length(veta) downto 1 do write(veta[I]);
    writeln;
    
    readln;
    end.
    
  12. Urobte program na výpočet sklárneho súčinu n-rozmerných vektorov, zároveť aj so zistením uhla, ktorý zverajú. (|u|*|v|*cos(alfa) = u . v = (ux*vx + uy*vy + ...))
    program mo2005_21;
    {skalarny sucin}
    
    const top_n=100;
         {vektorove pole}
    
    type pole_v=array[1..top_n] of real;
    
    var vektor1,vektor2:pole_v;
        n:byte;
        I:integer;
        skal_sucin,uhol:real;
    
    {vrati absolutnu hodnotu vektora}
    function abs_vektor(vektor: pole_v):real;
           var I:integer;
               out:real;
             begin
             out:=0;
             for I:=1 to n do out:=out + vektor[I] * vektor[I];
             abs_vektor:=sqrt(out);
             end;
    
    begin
    
    repeat
         write('> Zadajte rozmer vektorov: ');
         readln(n);
    until (n>0) and (n<=top_n);
    
    for I:=1 to n do begin
                     write(' > vektor1[',I,']:=');
                     readln(vektor1[I]);
                     end;
    for I:=1 to n do begin
                     write(' > vektor2[',I,']:=');
                     readln(vektor2[I]);
                     end;
    
    {vypis vektorov}
    writeln('> Vektor1:');
    write('('); for I:=1 to n do write(vektor1[I]:2:3,';'); writeln(')');
    writeln('> Vektor2:');
    write('('); for I:=1 to n do write(vektor2[I]:2:3,';'); writeln(')');
    
    {vypocet skal_sucinu}
    skal_sucin:=0;
    for I:=1 to n do skal_sucin:= skal_sucin + vektor1[I] * vektor2[I];
    writeln('> Skalarny sucin vektorov je: ',skal_sucin:5:5);
    
    {vypocet uhla}
    if skal_sucin=0 then uhol:=90
       else begin uhol:=( skal_sucin / (abs_vektor(vektor1)*abs_vektor(vektor2)) );
                  uhol:= ArcTan (sqrt (1-sqr (uhol)) /uhol);{vid. Pascal Help}
                  uhol:=(180/PI) * uhol;{premena na stupne}
                  end;
    writeln('> Uhol vektorov je: ',uhol:5:5,' deg');
    
    readln;
    end.
    
  13. Urobte jednoduchý program na načítanie mien žiakov a ich rodných čísel (prvých 8 čísel). Potom z týchto údajov počítač zistí počet dievčat a chlapcov (chlapci majú druhé dvojčíslie z rodného čísla od 01 do 12, dievčatá od 51 do 62), vyhľadá žiakov, ktorý sa narodili v danom mesiaci a všetky údaje bude môcť exportovať do súboru.
    program mo2005_22;
    const top_n=255;
    
    {Datovy typ record je ako sablona a je predzvestou komplikovanejsich 
    dat. typov. Jeho pochopenie vsak nieje az take problematicke.}
    type record_ziak = record
             meno:string[40];
             priezvisko:string[40];
             rc{rodne cislo}:string[8];
             mesiac:byte;{mesiac narodenia}
         end;{konci record}
         pole_ziakov=array[1..top_n] of record_ziak;
    
    var  ziak: pole_ziakov;
         n:byte;{pocet ziakov}
         I:integer;
         poc_dievcat:byte;
         mesiac,input:string[100];{pomocna premenna}
         chyba:integer;{pomocna premenna}
         input_int:integer;
    
    {exportuje zoznam ziakov}
    procedure exportuj(path: string);
              var fw: text;
                  I:integer;
              begin
              assign(fw,path);
              rewrite(fw);
              writeln(fw,'meno':16,'priezvisko':16,'rc':10,' mesiac');
    
              for I:=1 to n do
                writeln(fw,ziak[I].meno:16,ziak[I].priezvisko:16,ziak[I].rc:10,ziak[I].mesiac:3);
    
              close(fw);
              end;
    
    begin
    
    repeat
          write('> Zadajte pocet ziakov v triede: ');
          readln(n);
    until (n>0) and (n<=top_n);
    
    for I:=1 to n do begin
        writeln('> Ziak c.',I);
        write(' - Meno (krstne): '); readln(ziak[I].meno);
        write(' - Priezvisko: '); readln(ziak[I].priezvisko);
        write(' - Rodne cislo (prvych 8 cisel): '); readln(ziak[I].rc);
        end;
    
    {
    teraz pouzijem nasledovny nazov: ziak[I].rc[1]
       |prvok pola pole_ziakov
       |      |rc a index vymedzuje prvy znak textoveho retazca rc
    ------- -----
    ziak[I].rc[1]
           |
           |bodka oddeluje prvok (rc) zaznamu record_ziak
    }
    
    poc_dievcat:=0;
    
    for I:=1 to n do begin
        mesiac:=ziak[I].rc[3];
        if (ziak[I].rc[3]='5') then begin inc(poc_dievcat); mesiac:='0'; end;
        if (ziak[I].rc[3]='6') then begin inc(poc_dievcat); mesiac:='1'; end;
    
        mesiac:= mesiac + ziak[I].rc[4];{12, 06 ..}
        {val ako value}
        val(mesiac, ziak[I].mesiac, chyba);
         {chyba suvisi s faktom ze konvertovat muozme dat aj textovy retazec}
        if chyba<>0 then ziak[I].mesiac:=0;{pri zlom rc bude mesiac 0}
        end;
    
    writeln('> Pocet dievcat je: ',poc_dievcat);
    writeln('> Pocet chlapcov je: ',n-poc_dievcat);
    
    {Vyhladavanie}
    repeat
          writeln;
          write('> Prajete si vyhladat ziaka podla mesiaca ["ano"/"nie"]: ');
          readln(input);
    
          if input='ano' then begin
                         write(' > Zadajte mesiac [1,2,..,12]: ');
                         readln(input_int);
                         writeln('      meno        priezvisko  rc.       mesiac');
                         for I:=1 to n do
                             if ziak[I].mesiac=input_int then
                                writeln(' - ',ziak[I].meno:12,' ',ziak[I].priezvisko:12,' ',ziak[I].rc:10,' ',ziak[I].mesiac:2);
                         end;
    until input<>'ano';
    
    {export dat}
    write('> Napiste nazov suboru pre export: C:/');
    readln(input);
    
    input:= 'C:/' + input;
    exportuj(input);
    
    end.
    
  14. Urobte program na výpočet ciferného súčtu kladného celého čísla.
    program mo2005_23;
    var cislo:longint;
        cislo_string:string;
        vyber:string;{pomocna premnenna}
        hodnota,cifra,chyba:integer;
        I:integer;
    
    begin
    
    repeat
    
        repeat
              write('> Zadajte cislo: ');
              readln(cislo);
        until cislo>0;
        
        {konvertuje cislo na string cislo_string}
        str(cislo,cislo_string);
        
        {ciferny sucelt
         length(string) vracia dlzku stringu}
        
        hodnota:=0;
        for I:=1 to length(cislo_string) do begin
                 val(cislo_string[I], cifra, chyba);
                 hodnota:=hodnota+cifra;
                 end;
        writeln('> Ciferny sucet je: ',hodnota);
        
        write('> Prajete si opakovat? ["ano"/"nie"]: ');
        readln(vyber);
        
        if vyber='nie' then halt;
             {tento nekonecny ciklus je isteny moznostou opustit
             program pomocou halt}
        
    until false;
    end.
    
  15. Simulujte hru m hráčov, ktorí odoberajú z kopy zápaliek po 1, 2, 3 zápalkách. Hráč, ktorý zoberie poslednú zápalku vyhráva. Nezabudnite na mená hráčov.
    program mo2005_25;
    const top_m=255;
    
    type pole_hracov=array[1..top_m] of string[20];
    
    var m:byte;{pocet hracov}
        n:integer; {pocet zapaliek}
        hrac:pole_hracov;{mena hracov}
        I:integer;
        input:byte;
        koniec:boolean;{koniec hry}
        vyber:string;{pomocna premenna}
    
    begin
    
    repeat
    
    koniec:=false;
    
    repeat
          write('> Zadajte pocet hracov: ');
          readln(m);
          write('> Zadajte pocet zapaliek: ');
          readln(n);
    until ((m>0) and (m<top_m)) and (n>0);
    
    {vlozenie mien hracov}
    for I:=1 to m do begin
        write(' > Hrac c.',I,' ma meno: ');
        readln(hrac[I]);
        end;
    I:=0;
    
    repeat
          inc(I);
          if I>m then I:=1;{cyklovanie}
          repeat
                write(' - Ide hrac ',hrac[I],', beries 1,2 alebo 3 zapalky?: ');
                readln(input);
          until (input=1)or(input=2)or(input=3);
          dec(n,input);{odobratie z kopy zapaliek}
          if n<1 then koniec:=true;
    until koniec;
    
    writeln('Vytazom sa stal: ',hrac[I]);
         write('> Prajete si opakovat hru? ["ano"/"nie"]: ');
         readln(vyber);
         if vyber='nie' then halt;
    
    until false;
    end.
    
  16. Napíšte program na nájdenie najväčšieho spoločného deliteľa dvoch čísel pomocou Euklidovho algoritmu odčítania.
    program mo2005_28;
    var a,b: longint;{cisla}
        nsd_a,nsd_b: longint;
        I:integer;
        vyber:string;
    
    begin
    
    repeat
    
    repeat
          writeln('> Zadajte dve cele, kladne cisla:');
          readln(a,b);
    until (a>0) and (b>0);
    
    {pouzijem euklidov algoritmus}
    nsd_a:=a;
    nsd_b:=b;
    I:=0;
    writeln('     a     b');
    
    repeat
          inc(I);
          writeln(I:2,',',nsd_a:4,'|',nsd_b:4);
          if nsd_a>nsd_b then nsd_a:= nsd_a - nsd_b
             else if nsd_b>nsd_a then nsd_b:= nsd_b - nsd_a;
    until nsd_a=nsd_b;
    
    writeln('> Najvacsi spolocny delitel cisel ',a,' a ',b,' je: ',nsd_a);
         write('> Zadat nove cislo? ["ano"/"nie"]: ');
         readln(vyber);
         if vyber<>'ano' then halt;
    
    until false;
    end.
    
  17. Program bude dávať n príkladov na súčet dvoch celých kladných čísel menších ako 101. Žiak napíše odpoveď alebo "n" ako neviem, kedy mu nepribudnú body.
    program mo2005_29;
    var n:integer;{pocet prikladov}
        a,b:byte;{dve cisla}
        sucet:integer;{skutocny sucet}
        odpoved:string;
        vysledok:integer;{odpoved hraca}
        body,chyba:integer;
        I:integer;
    
    begin
    
    randomize;
    repeat
    body:=0;
    
    repeat
          write('> Zadajte pocet prikladov: ');
          readln(n);
    until n>0;
    
    for I:= 1 to n do begin
        a:=random(101);
        b:=random(101);
        sucet:=a+b;
        write(' - ',I,', ',a,'+',b,' = ');
        readln(odpoved);
        val(odpoved,vysledok,chyba);
        writeln('    spravna odpoved: ',sucet);
    
    {ak je chyba=0 tak string odpoved je cislo! a nie napr."n"}
        if chyba=0 then if vysledok=sucet then inc(body)
                           else dec(body);
        end;
    
    writeln('> Pocet ziskanych bodov: ',body);
    
    write('> Znovu? ["ano"/"nie"]: ');
    readln(odpoved);
    
    if odpoved<>'ano' then halt;
    
    until false;
    end.
    

mo ≈ master outline (hlavný náčrt)

Posledná aktualizácia: august 2005