ZS/Testy/Test 08

Z Pascal
Revízia z 22:06, 29. november 2012; Andrej (Diskusia | príspevky)

(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Prejsť na: navigácia, hľadanie

Záverečný test v zimnom semestri 2008/2009



  1. 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;


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


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


  1. 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;


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


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


  1. 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;


  1. 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;


  1. 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;


  1. 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;