Department of Computer Science and Engineering Language/Codepage <a href='/~arnost/vyuka/soj/pszk_vzor.html.cs'>
 

SOJ - Vzorové řešení půlsemestrální zkoušky

Zadané příklady bylo možné vyřešit mnoha způsoby, takže zde uvedená vzorová řešení nejsou jediná možná. Nejsou ani nejlepší možná, naopak se snaží si zachovat jednoduchost a čitelnost.

Řešení lze stáhnout zde: sojpszk1.pas a sojpszk2.pas.

1) Počet dvojhlásek ou v řetězci (10 bodů)

var retez: String;

function poc_ou(s: String): Byte;       { retezec s se automaticky okopiruje }
begin                                   { do lokalni promenne na zasobniku }
  asm
        lea     si,s                    { ss:si - kopie retezce s }
        mov     cl,ss:[si]
        xor     ch,ch                   { cx - delka retezce s }
        xor     dl,dl                   { vysledek = 0 }
        sub     cx,1
        jbe     @Ret                    { koncim je-li delka <= 1 znak }
@Loop:  inc     si
        cmp     WORD PTR ss:[si],'uo'   { nizsi byte: 'o', vyssi byte: 'u' }
        jne     @Next
        inc     dl
@Next:  loop    @Loop
@Ret:   mov     @Result,dl              { zapsani vysledku do hodnoty funkce }
  end;
end;

begin
  repeat
    WriteLn('Zadejte retez znaku: ');
    ReadLn(retez);
    Write('V zadanem retezu se vyskytuje ', poc_ou(retez),
          ' dvojhlasek ou.');
  until retez = '';
end.


2) Seřazení pole (10 bodů)

type PS = array[1..100] of Byte;
var i, n: Byte;
    pole_i, pole_o: PS;

procedure Serad(pole_in: PS; var pole_out: PS; n: Byte); near; assembler;
asm
        mov     cl,n
        xor     ch,ch                   { cx - n }
{ kopirovani pole_in do pole_out }
        push    ds                      { musim zachovat registr ds }
        push    cx
        lds     si,pole_in              { pole_in i pole_out se predavaji }
        les     di,pole_out             { stejne - adresou na zasobniku }
        cld
        rep     movsb                   { blokovy presun z ds:si do es:di }
        pop     cx
        pop     ds
{ razeni pole_out vzestupne metodou Bubble sort se zkracovanim pruchodu }
        les     di,pole_out
@Pruchod:
        sub     cx,1                    { zkraceni o 1 prvek }
        jbe     @Ret                    { cx <= 1 prvek? konec }
        mov     dl,0
        xor     bx,bx                   { bx - offset (index) v poli }
@Loop:  mov     al,es:[di+bx]
        inc     bx
        cmp     al,es:[di+bx]           { porovna sousedni prvky [i] a [i+1] }
        jbe     @Next                   { [i] <= [i+1] }
        xchg    es:[di+bx],al           { prohodi prvky [i] a [i+1] }
        mov     es:[di+bx-1],al
        mov     dl,1                    { indikator zmeny }
@Next:  cmp     bx,cx                   { cx - horni mez }
        jb      @Loop
        test    dl,dl                   { zmena? }
        jnz     @Pruchod
@Ret:
end;

begin
  n := 20;
  Randomize;
  for i := 1 to n do pole_i[i] := Random(256);
  Serad(pole_i, pole_o, n);
  for i := 1 to n do WriteLn(pole_i[i]:5, pole_o[i]:10);
end.




Zpět
© Department of Computer Science and Engineering, Božetěchova 2,
612 66 Brno, Czech Republic
Tel.: +420 54114 1144, +420 54121 2219, Fax: +420 54114 1270
e-mail: uivt@fee.vutbr.cz, Web: http://www.fee.vutbr.cz/UIVT/
Last modification: 10. November 2000