Viitenumerolaskenta
Pascal-kielinen ohjelma vuodelta 1995, joka laskee viitenumeron viimeisen tarkistenumeron.
program VIITENUMEROLASKENTA(input,output); uses crt; const l1='H'; l2='E'; l3='I'; l4='K'; l5='S'; l6='L'; l7='T'; l8='A'; var viite:array[1..20] of integer; c:char; vl:integer; rullaa:boolean; turha,tx,ty:integer; saako:boolean; procedure NOLLAA; var l:integer; begin for l:=1 to 20 do viite[l]:=-1; end; procedure RUUTU; procedure HEIKKI; begin write(l1,l2,l3,l4,l4,l3); end; procedure SILTALA; begin write(' ',l5,l3,l6,l7,l8,l6,l8,' 1995'); end; begin writeln('VIITENUMERON TARKISTEEN LASKENTA'); write('COPYRIGHT '); HEIKKI; SILTALA; writeln; writeln('Tätä ohjelmaa saa levittäää vapaasti.'); writeln; writeln('<ESC> lopettaa, <ENTER> päättää viitteen'); writeln('<BACKSPACE> poistaa edellisen numeron'); writeln; end; procedure LUE; var silmu:boolean; var lask:integer; begin silmu:=true; lask:=1; while silmu do begin c:=readkey; if c=#8 then begin if lask>1 then begin dec(lask); viite[lask]:=-1; write(c); write(' '); write(c); c:=' '; end else c:='h'; end; if c=#27 then begin silmu:=false; rullaa:=false; c:=' '; saako:=false; end; if c=#13 then begin if lask>1 then silmu:=false else c:='h'; end else begin val(c,vl,turha); if (silmu)and(not(c in ['0','1','2','3','4','5','6','7','8','9'])) then begin if c<>' ' then begin sound(5000); delay(10); nosound; end end else begin if lask<19 then begin viite[lask]:=vl; if saako then write(vl); inc(lask); end else begin viite[lask]:=vl; if saako then write(vl); silmu:=false; end; end; end; end; end; procedure KOE; var mat:integer; begin write(' '); for mat:=1 to 20 do begin if viite[mat]>=0 then write(viite[mat]); end; write(' '); end; procedure SIIRRA; var alku:integer; var paikka:integer; begin alku:=19; while (viite[alku]<0) do dec(alku); if alku<>19 then begin paikka:=19; while(alku>0) do begin viite[paikka]:=viite[alku]; viite[alku]:=-1; dec(alku); dec(paikka); end; end; end; procedure LASKE; var summa:integer; lask:integer; arvo:integer; tulos:integer; procedure NEXT; begin if arvo=7 then arvo:=3 else if arvo=3 then arvo:=1 else if arvo=1 then arvo:=7; end; begin summa:=0; arvo:=7; for lask:=19 downto 1 do begin if viite[lask]>=0 then summa:=summa+(arvo*viite[lask]); NEXT; end; tulos:=summa div 10; tulos:=tulos*10; tulos:=tulos+10; tulos:=tulos-summa; viite[20]:=tulos; if viite[20]=10 then viite[20]:=0; end; procedure TULOSTA; begin if saako then begin highvideo; writeln(' ',viite[20]); lowvideo; end; end; begin saako:=true; clrscr; RUUTU; rullaa:=true; while rullaa do begin NOLLAA; LUE; if rullaa then SIIRRA; if rullaa then LASKE; if rullaa then TULOSTA; writeln; end; writeln; end.