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