Na FreeHostingu Endora běžà desĂtky tisĂc webĹŻ. PĹ™idejte se ještÄ› dnes!
VytvoĹ™it web zdarmaNa FreeHostingu Endora běžà desĂtky tisĂc webĹŻ. PĹ™idejte se ještÄ› dnes!
Vytvořit web zdarmaconst vodoretezec:array[0..2] of string=('sladka','slana','smisena'); type trida_zvirete = (ryba, ptak, savec); druh_biotopu = (travnaty, skalnaty, prales, poust); druh_vody = (sladka, slana, smisena); Zvire = record {Napred uvedeme obecne polozky, ktere budou u kazdeho zvirete} cesky_nazev:string; latinsky_nazev:string; {A ted specificke informace. Pomoci prikazu CASE odlisime jednotlive variany.} case Trida:trida_zvirete of Ryba:(voda:druh_vody; zivorodost:boolean); Ptak:(sirka_voliery, vyska_voliery:integer; zacatek_hnizdeni, konec_hnizdeni:string); Savec:(potrava:string; biotop:druh_biotopu); end; {Tady je trochu zrada. Pouziva se tu jenom jedno END. To zaroven ukoncuje blok CASE i RECORD. Proto neni mozne dat za specifickou informaci jeste nejakou obecnou.}
var drobecek:zvire; begin with drobecek do begin cesky_nazev:='Datel cerny'; {Pro neznale - to je ptak :-) } latinsky_nazev:='Dryocopus martius'; sirka_voliery:=10; {To by mu mohlo stacit} end; writeln(drobecek.sirka_voliery); {samozrejme napise 10} {A co je tohle?} drobecek.voda:=slana; {??? - ano, prekladac nevi, ze jsme se rozhodli, ze Drobecek je ptak} writeln(vodoretezec[ord(drobecek.voda)]); {napise "slana"} writeln(drobecek.sirka_voliery); {napise 1. To znamena, ze prirazenim polozky VODA jsme zmenili} {polozku SIRKA_VOLIERY}Jednotlivé varianty totiž sdílí stejný kus paměti. A to je dobře, protože to přináší další možnosti využití.
type Bod = record x,y:integer; end; Obdelnik = record case typ_souradnic:integer of 0:(a,b:Bod); 1:(ax,ay,bx,by:integer); end;
registry = record case i : integer of 0 : (ax,f1,bx,f2,cx,f3,dx,f4,bp,f5,si,f51,di,f6,ds,f7,es,f8,flags,fs,gs : word); 1 : (al,ah,f9,f10,bl,bh,f11,f12,cl,ch,f13,f14,dl,dh : byte); 2 : (eax, ebx, ecx, edx, ebp, esi, edi : longint); End;Simulace registrů procesoru.
Procedure Menu(var polozky:array of string);Jak vidíte, tak se v definici neříká nic o rozsahu pole. Jak ale procedura pozná horní a dolní hranici pole?
Procedure Menu(var polozky:array of string); var i:longint; begin for i:=Low(polozky) to High(polozky) do writeln(polozky[i]); end;V programu ji použijeme takto:
var jmena_veznu:array[1..MAX_VEZNU] of string; begin ... Menu(jmena_veznu); ... end;
Procedure Preved_na_zlomek(r:real;var citatel,jmenovatel:longint);můžeme volat takto:
Procedure Preved_na_zlomek(sin(60),c,j);A tento koncept můžeme rozvést takto:
Function Menu(polozky:string):integer; begin {Zda se to bizarni, ale v zakladni podobe teto techniky se nemusime vubec starat o vykresleni menicka! Procedura Menu se stara pouze o klavesnici a komunikaci s uzivatelem. To nas momentalne, nezajima, tak se tomu nebudeme venovat...} ... end; Function NapisPolozku(s:string;dalsi:string):string; begin writeln(s); end;Definice není zajímavá. Zajímavé je použití.
Menu(NapisPolozku('pampeliska', NapisPolozku('kopretina', NapisPolozku('rosnatka', NapisPolozku('konopi','' )))));Efektní ne?
Function NajdiMezeru(s:string):byte; var a:byte; for a:=Length(s) downto 0 do if s[a]=' ' then Break; NajdiMezeru:=a; end;Hm... to možná nebyl nejpůsobivější příklad, ale je vidět, o co jde.
repeat ... if Neco_se_stalo then Break; ... until 1=2; {Nesplnitelna podminka}Mám dojem, že Continue jsem zatím použil jenom několikrát, ale určitě je dobře vědět i o něm.
Procedure Pixel16(x,y:integer;barva:longint); Procedure Pixel256(x,y:integer;barva:longint); Procedure PixelTrueColor(x,y:integer;barva:longint);
Procedure Pixel16(x,y:integer;barva:longint); Procedure Pixel256(x,y:integer;barva:longint); Procedure PixelTrueColor(x,y:integer;barva:longint); type Pixel=procedure(x,y:integer;barva:longint); {stejne tak dobre by mohlo byt i pixel=procedure(a,b:integer;c:longint); Jmena parametru naprosto nehraji roli. Podstatny je jejich typ.}
case bitu_na_pixel of byte 4:pixel:=Pixel16; 8:pixel:=Pixel256; 32:pixel:=PixelTrueColor; end;
Pixel:=Pixel16; Ve FreePascalu záleží na módu překladače. Pokud máte zaškrtnutou možnost "Try to be TP compatible", tak se chová stejně. Pokud ne, tak se to zapisuje takhle: Pixel:=@Pixel16; (což je podle mě logičtější)if klavesa=Tab then ZpracujTabulator;ZpracujTabulator byla procedurální proměnná, která normálně ukazovala na prázdnou proceduru, takže po zmáčknutí Tab se