-- Frazioni.ada con calcoli -- Giosia Poma By GPPROGRAM (c) '99 -- con la straordinaria partecipazione di Cihan Aydemir... che non aveva il programma quel venerdi' -- -- with Text_IO, Integer_Text_IO, Float_Text_IO, Calcoli, Calendar; use Text_IO, Integer_Text_IO, Float_Text_IO, Calcoli, Calendar; procedure Frazioni is --------------- -- Variabili -- --------------- n_calc : constant INTEGER := 10; -- numero di calcoli richiesti type Tabella_type is array(0..65536) of INTEGER; tabella : TABELLA_TYPE; -- tabella num casuali type Numeri_type is array(1..n_calc*2) of RATIONAL; numeri : NUMERI_TYPE; -- tabella num razionali type Utente_type is array(1..n_calc) of RATIONAL; utente : UTENTE_TYPE; -- tab num utente soluzioni : UTENTE_TYPE; -- tab num calcolati Text_File : FILE_TYPE; -- prestanome file Text_File2 : FILE_TYPE; Tempo : TIME; -- numero casuale -------------------------- -- Funzione Generatrice -- !! ok !! -------------------------- function Casuale(r : INTEGER) return INTEGER is begin return ((25173 * r + 13849) mod 65536); end Casuale; --------------------------------------------- -- Funzione Giusto calcolo decimale esatto -- !! ok !! --------------------------------------------- function Giusto(u : RATIONAL; s : RATIONAL) return BOOLEAN is a, b : FLOAT; begin a:= Decimale(u); b:= Decimale(s); if (a = b) then return TRUE; else return FALSE; end if; end Giusto; ------------------------------------------ -- Procedura che crea 40 numeri casuali -- !! ok !! ------------------------------------------ procedure Generazione( tabella : in out TABELLA_TYPE) is n : INTEGER; begin tempo := Clock; n := INTEGER(Seconds(tempo)) mod 65537; tabella(0) := n mod 799917; for i in 1..65536 loop tabella(i) := Casuale(tabella(i-1)); end loop; end Generazione; -------------------------------------------------- -- Crea i 20 numeri razionali poi li semplifica -- !! ok !! -------------------------------------------------- procedure Forma_Razionali( tabella : in TABELLA_TYPE; razio : in out NUMERI_TYPE) is conta : INTEGER := 1; begin for i in 1..n_calc*2 loop razio(i) := Create((1 + tabella(conta) mod 20),(1 + tabella(conta+1) mod 20)); conta := conta + 2; end loop; for i in 1..n_calc*2 loop razio(i) := Simplify(razio(i)); end loop; end Forma_Razionali; -------------------------------------------------- -- Stampa i calcoli e crea il file soluzioni.txt-- !! ok !! -------------------------------------------------- procedure Calcoli( tabella : in TABELLA_TYPE; numeri : in NUMERI_TYPE; utente : in out UTENTE_TYPE) is conta : INTEGER:= 1; dummy : UTENTE_TYPE; begin Create(Text_File, OUT_FILE, "soluzioni.txt"); Put(Text_File, "Calcoli Allievo/a"); New_Line(Text_File); Put(Text_File, "-------------------------"); New_Line(Text_File); for i in 1..n_calc loop Put(numeri(conta)); Put(Text_File, numeri(conta)); case tabella((i+17)*13) mod 10 is when 0|1 => Put(" + "); Put(Text_File, " + "); when 2|3 => Put(" - "); Put(Text_File, " - "); when 4|5|9 => Put(" * "); Put(Text_File, " * "); when 6|7|8 => Put(" : "); Put(Text_File, " : "); when others => null; end case; Put(numeri(conta+1)); Put(" = "); Put(Text_File, numeri(conta+1)); Put(Text_File, " = "); Get(dummy(i)); utente(i) := dummy(i); Put(Text_File, utente(i)); New_Line(Text_File); conta := conta + 2; end loop; Close(Text_File); end Calcoli; -------------------------------------------------------------------- -- Lettura su file dei calcoli e delle soluzioni date dall'utente -- -------------------------------------------------------------------- procedure Read_File(soluzioni : in out UTENTE_TYPE) is num : INTEGER; den : INTEGER; char : CHARACTER; operazione : CHARACTER; a,b,c : RATIONAL; parziale : INTEGER := 0; punti : INTEGER := 0; begin Open(Text_File, IN_FILE, "soluzioni.txt"); Create(Text_File2, OUT_FILE, "correzioni.txt"); Put(Text_File2, "Calcoli Allievo/a Punti Corr. "); New_Line(Text_File2); Put(Text_File2, "-------------------------------------------------------------------------------"); New_Line(Text_File2); Skip_Line(Text_File); Skip_Line(Text_File); for i in 1..n_calc loop Get(Text_File, num); Put(Text_File2,num,0); Get(Text_File, char); Put(Text_File2,char); Get(Text_File, den); Put(Text_File2,den,0); a := Create(num,den); Get(Text_File, char); Put(Text_File2,char); Get(Text_File, operazione); Put(Text_File2, operazione); Get(Text_File, char); Put(Text_File2,char); Get(Text_File, num); Put(Text_File2,num,0); Get(Text_File, char); Put(Text_File2,char); Get(Text_File, den); Put(Text_File2,den,0); b := Create(num,den); Get(Text_File, char); Put(Text_File2,char); Get(Text_File, char); Put(Text_File2,char); Get(Text_File, char); Put(Text_File2,char); Get(Text_File, num); Put(Text_File2,num,0); Get(Text_File, char); Put(Text_File2,char); Get(Text_File, den); Put(Text_File2,den,0); c := Create(num,den); case operazione is when '+' => soluzioni(i):=Simplify(a + b); when '-' => soluzioni(i):=Simplify(a - b); when '*' => soluzioni(i):=Simplify(a * b); when ':' => soluzioni(i):=Simplify(a / b); when others => null; end case; -- scrittura se calcolo giusto o sbagliato -- if Giusto(c,soluzioni(i)) = TRUE then Set_Col(Text_File2, 28); Put(Text_File2, "Giusto"); if Uguaglianza(c,soluzioni(i)) = TRUE then Set_Col(Text_File2,35); Put(Text_File2, "e semplificato"); else Set_Col(Text_File2,35); Put(Text_File2, ", non semplificato"); end if; else Set_Col(Text_File2, 28); Put(Text_File2, "Sbagliato"); end if; -- scrittura dei punti assegnati -- parziale := 0; if Giusto(c,soluzioni(i)) = TRUE then punti := punti + 1; parziale := 1; if Uguaglianza(c,soluzioni(i)) = TRUE then punti := punti + 1; parziale:= parziale +1; end if; end if; Set_Col(Text_File2, 58); Put(Text_File2, parziale); Set_Col(Text_File2,73); if Uguaglianza(c,soluzioni(i)) = FALSE then Put(Text_File2, soluzioni(i)); end if; Skip_Line(Text_File); New_Line(Text_File2); end loop; New_Line(Text_File2); Put(Text_File2, "Punteggio ottenuto e': "); Put(Text_File2, punti,0); Close(Text_File); Close(Text_File2); end Read_File; ------------------------------------------ -- Procedura che da i punti all'allievo -- !! ok !! ------------------------------------------ procedure Punteggio( utente : in UTENTE_TYPE; soluzioni : in UTENTE_TYPE) is punti : INTEGER := 0; begin for i in 1..n_calc loop if Giusto(utente(i),soluzioni(i)) = TRUE then punti := punti + 1; if Uguaglianza(utente(i),soluzioni(i)) = TRUE then punti := punti + 1; end if; end if; end loop; Put("Il punteggio ottenuto e' di: "); Put(punti,0); Put(" punti"); New_Line; case punti is when 19 | 20 => Put("Molto Buono"); when 17 | 18 => Put("Buono"); when 15 | 16 => Put("Discreto"); when 13 | 14 => Put("Sufficiente"); when 10..12 => Put("Insufficiente"); when 7..9 => Put("Scarso"); when 0..6 => Put("Molto Scarso"); when others => null; end case; end Punteggio; -------------------------- -- Programma Principale -- -------------------------- begin Generazione(tabella); Forma_Razionali(tabella, numeri); Calcoli(tabella, numeri, utente); Read_File(soluzioni); Punteggio(utente, soluzioni); end Frazioni;