ZS/Testy/Test 08
Z Pascal
Záverečný test v zimnom semestri 2008/2009
- Aký dlhý reťazec vráti Retazec(20) a koľko sa v ňom nachádza hviezdičiek (znak '*' ):
function Retazec(N: Integer): string; var I: Integer; begin Result := 'o'; for I := 1 to N do case I mod 3 of 0: Result := '*' + Result + '*'; 1: Result := Result + '+' + Result; 2: Result := '-' + Result; end; end; |
- Dané funkcie nejako pracujú s množinami:
type TMnozina = set of Byte; function Urob(Cislo: Integer): TMnozina; var I: Integer; begin Result := []; for I := 0 to 31 do begin if Odd(Cislo) then Result := Result + [I]; Cislo := Cislo div 2; end; end; function Zmen(M: TMnozina): Integer; var I: Integer; begin Result := 0; for I := 31 downto 0 do begin Inc(Result, Result); if I in M then Inc(Result); end; end; |
- Zistite, čo vráti volanie:
- Zmen(Urob(3) + Urob(5) + Urob(7)) + Zmen(Urob(13) + Urob(15) + Urob(17))
- Zistite, čo vráti volanie:
- Aritmetické výrazy sme doplnili o operáciu priradenia := (prvý operand musí byť meno premennej a táto operácia priradí druhý operand do tejto premennej - výsledkom operácie je priraďovaná hodnota) a operáciu celočíselného delenia div:
- div + 8 * := c + := a 7 := b 4 - a b + 2 div c b
- Prepíšte tento prefix do postfixu a tiež zistite jeho hodnotu. Napr. infixový zápis ((a := 3) + a) má hodnotu 6. Ak sa vo výraze pri vyhodnocovaní vyskytne nedefinovaná premenná, tak tato ma hodnotu 0.
- Vieme, že v danom poli netypových smerníkov sú buď nil, alebo sú to smerníky na celočíselné a reálne dynamické premenné. Tiež vieme, že typy nenilových hodnôt sa striedajú: najprv je to smerník na Integer a za tým je to smerník na Real. Dopíšte program tak, aby správne spočítal všetky nenilové hodnoty v poli. Predpokladajte, že zvyšné premenné programu sú už zadeklarované správne:
type PInteger = _____________; PReal = _______________; var Pole: array [1..100] of ______________; I0: _____________; R0: _____________; SI: _____________; SR: _____________; ... begin ... Sucet := 0; I0 := 0; R0 := 0; B := True; for I := 1 to High(Pole) do begin SI := _______; SR := _______; if Pole[I] <> nil then begin if B then SI := ____________ else SR := ____________; B := not B; end; Sucet := Sucet + __________ + ___________; end; |
- Máme definovanú takúto funkciu Spoj:
type TPole = array of Integer; function Spoj(A, B: array of Integer): TPole; var I: Integer; begin Result := nil; for I := 0 to Max(High(A), High(B)) do begin if I <= High(A) then begin SetLength(Result, Length(Result)+1); Result[High(Result)] := A[I]; end; if I <= High(B) then begin SetLength(Result, Length(Result)+1); Result[High(Result)] := B[I]; end; end; end; |
- Zistite, čo bude výsledkom volania:
- Spoj(Spoj([1, 2, 3, 4], [5, 6, 7, 8, 9]), Spoj([10, 11, 12], [13]))
- Zistite, čo bude výsledkom volania:
- Máme danú triedu TStack, ktorá vie pracovať so celočíselným zásobníkom (TPrvok = Integer) a takúto časť programu:
while not Stack.Empty do begin Stack.Pop(I); if Odd(I mod 5) or Stack.Empty then Write(I, ',') else begin Stack.Pop(J); Write(J, ','); Write(I, ','); end; end; |
- Zistite, čo sa nachádzalo v zásobníku pred cyklom, keď sme dostali takýto výstup:
- 13, 3, 9, 11, 10, 6, 16, 7, 15, 15,
- Pôvodný obsah zásobníka uveďte v poradí od najspodnejšieho prvku až po vrch zásobníka.
- Zistite, čo sa nachádzalo v zásobníku pred cyklom, keď sme dostali takýto výstup:
- Textový súbor obsahuje 11 riadkov: v každom je jedno číslo - postupne od 1 do 11. Zistite, čo spraví tento program:
procedure Kopir(var Subor: TextFile; B1, B2: Boolean); var H: Integer; begin if B1 then Rewrite(Subor) else begin Readln(Subor, H); Kopir(Subor, Eof(Subor), H mod 3 <> 0); if B2 then Writeln(Subor, H); end; end; var T: TextFile; begin AssignFile(T, 'subor.txt'); Reset(T); Kopir(T, Eof(T), True); CloseFile(T); end; |
- Funkcia Zisti by mala vrátiť počet intervalov, z ktorých sa skladá nejaká množina. Napr. Zisti(['a'..'z', '.', '0'..'9']) vráti číslo 3 a Zisti(['a'..'z', 'p'..'x']) vráti hodnotu 1. Doplňte chýbajúcu podmienku:
type TMnozina = set of Char; function Zisti(M: TMnozina): Integer; var X: Char; begin Result := 0; for X in M do if ______________________________ then Inc(Result); end; |
- V poli dvojíc znakových reťazcov máme uložený nejaký slovník, ktorý je vzostupne utriedený podľa položky A. Doplňte chýbajúce časti funkcie Hladaj tak, aby pre daný reťazec správne vrátila jeho preklad (položku B). Ak sa slovo v slovníku nenachádza, funkcia vráti prázdny reťazec:
type TPole = array of record A, B: string; end; function Hladaj(Hodnota: string; Pole: TPole): string; var S: Integer; begin if _______________ then Result := else begin S := High(Pole) div 2; if Pole[S].A > Hodnota then Result := Hladaj(Hodnota, _________________) else if Pole[S].A < Hodnota then Result := Hladaj(Hodnota, _________________) else Result := _______________; end; end; |
- Chceli sme zadefinovať triedu na prácu s grafickým objektom TZviera, ale urobili sme niekoľko chýb - opravte ich.
type TZviera = class(Graphics) private Meno, FZvuk: string; Bmp: TBitmap; public constructor Create(Subor: TextFile); constructor Create(Param: array of string); procedure Kresli(Canvas: TCanvas); virtual; property Zvuk: string read FZvuk; virtual; end; constructor TZviera.Create(Subor: TextFile); var S1, S2: string; begin Readln(Subor, S1); Readln(Subor, S2); inherited Create(S1, S2, 'zver.bmp'); end; constructor TZviera.Create(Param: array of string); begin SetLength(Param, 3); Meno := Param[1]; Zvuk := Param[2]; Bmp.Create; Bmp.LoadFromFile(Param[3]); end; procedure TZviera.Kresli(Canvas: TCanvas); virtual; begin Canvas.DrawBitmap(Random(200), Random(200), Bmp); end; |