C64 - Il numero di Sarah... reloaded. In COMAL!
di
pubblicato il 14-06-2020 alle 15:37 (500 Visite)
Riprendiamo il simpatico problemino già trattato in questo articolo per proporre una nuova versione della soluzione, questa volta usando il linguaggio COMAL 80 (in particolare la versione 2.01 su cartridge) per Commodore 64.
Il codice è altamente leggibile e decisamente "moderno", a maggior ragione considerando che si tratta di un linguaggio concepito in pieni anni Settanta. Il confronto con l'equivalente BASIC sarà un ottimo esercizio per i lettori di ogni livello d'esperienza.
Articolo completo in PDF (caldamente raccomandato) e sorgenti di tutti gli esempi COMAL in formato .d64.
//******************************** //** save Sarah //******************************** DATA "Julie","Ken","Morris","Naomi" DIM conditions(7,4) DIM solution$(7) OF 4 DIM name$(4) OF 6 DIM phone$ OF 4 PAGE PRINT "************************" PRINT "** 11: Sarah's Number **" PRINT "************************" PRINT "#### J K M N" PRINT "------------------------" sol:=1 i:=1 WHILE NOT EOD DO READ name$(i) i:+1 ENDWHILE FOR n:=0 TO 99 DO phone$:=STR$(n) IF n<10 THEN phone$:="0"+phone$ phone$:+phone$(2)+phone$(1) number:=VAL(phone$) FOR i:=1 TO 4 DO conditions(sol,i):=FALSE cond'cnt:=0 //** Condizione 1 (J) IF phone$(1)="9" OR phone$(2)="9" THEN cond'cnt:=1 conditions(sol,1):=TRUE ENDIF //** Condizione 2 (K) IF number>5000 THEN cond'cnt:+1 conditions(sol,2):=TRUE ENDIF //** Condizione 3 (M) IF number/2=number DIV 2 THEN cond'cnt:+1 conditions(sol,3):=TRUE ENDIF //** Condizione 4 (N) d'sum:=1+((number-1) MOD 9) IF d'sum=9 THEN cond'cnt:+1 conditions(sol,4):=TRUE ENDIF IF cond'cnt=3 THEN solution$(sol):=phone$ PRINT phone$;" "; FOR i:=1 TO 4 DO PRINT conditions(sol,i);" "; ENDFOR i PRINT sol:+1 ENDIF ENDFOR n //************************** //** Stampa dei risultati ** //************************** FOR c:=1 TO 4 DO cond'cnt:=0 FOR r:=1 TO 7 DO IF conditions(r,c)=FALSE THEN cond'cnt:+1 rs:=r ENDIF ENDFOR r IF cond'cnt=1 THEN PRINT PRINT "Il numero di Sarah e'"; PRINT solution$(rs)," e" PRINT name$(c)," ha sbagliato!" END "** Fine lavoro **" ENDIF ENDFOR c