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.
-
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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. -
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)