Benvenuti nella quinta puntata del corso per Programmare in Basic. Oggi vediamo la funzione RND, che genera numeri pseudo casuali, la funzione INT, che restituisce la parte intera di un numero ed anche la variabile di sistema TIMER.
Implementiamo le funzioni RND e INT all’interno di un programma, che può essere utile, ai vostri figli e nipoti, per ripassare le tabelline! Il computer misura anche il tempo impiegato a calcolare le varie tabelline, tramite la variabile di sistema TIMER.
Il programma per ripassare le tabelline è disponibile in fondo a questa pagina.
Imparare a programmare in Basic, su quali computer?
Anche il programma di esempio che analizziamo oggi può essere eseguito sui vari Commodore a 8 bit, come il Commodore 64, il C16, il Vic20, il Commodore 128 e il PET. Lo potete eseguire sugli emulatori, come il VICE e il CCS64. Inoltre è compatibile con il GWBASIC del vecchio DOS per PC IBM, che vediamo girare nell’emulatore DOSBox. Per chi non lo conoscesse, DOSBox consente di far funzionare i vecchi programmi DOS, anche su Windows 10.
Non da ultimo, il programma per ripassare le tabelline è compatibile anche con il QuickBasic QB64, introdotto nella puntata 3 del corso, che consente di compilare i programmi in Basic e di creare dei file eseguibili per Windows, Linux e Mac.
Corso per Programmare in Basic #5: listato del programma per ripassare le tabelline
Ecco il listato del programma per ripassare le tabelline. In fondo al listato, l’ultima riga del programma è leggermente differente tra i Commodore e i PC DOS. Continuando a leggere questo corso per programmare in Basic, scoprirete perché.
10 REM IL MIO QUINTO PROGRAMMA IN BASIC 20 REM RIPASSO TABELLINE 30 REM (C) 2021, WWW.VALOROSO.IT 40 REM TIPO ESERCIZIO 50 PRINT "FINO QUALE TABELLINA" 60 INPUT "RIPASSI (1-10)";NT 70 IF NT<1 OR NT>10 THEN GOTO 50 80 PRINT: INPUT "QUANTI ESERCIZI";NE 90 IF NE<1 THEN GOTO 80 100 REM INIZIALIZZAZIONE 110 X = RND(-TIMER) 120 PRINT 130 TM = TIMER 200 REM ESERCIZI 210 FOR ES = 1 TO NE 220 M1 = INT(RND(1) * (NT + 1)) 230 M2 = INT(RND(1) * 11) 240 PRINT: PRINT "QUANTO FA" 250 PRINT STR$(M1) + " X" + STR$(M2); 260 INPUT MR 270 IF MR = M1 * M2 THEN PRINT "GIUSTO!": NG = NG + 1 280 IF MR <> M1 * M2 THEN PRINT "SBAGLIATO!": NS = NS + 1 290 NEXT ES 300 REM PUNTEGGIO 310 PRINT 320 PRINT "NUMERO ESERCIZI:" + STR$(NE) 330 PRINT "- GIUSTI: " + STR$(NG) 340 PRINT "- SBAGLIATI: " + STR$(NS) 350 PRINT "TEMPO:" + STR$(INT((TIMER - TM) / 60)) + " S"
Analisi del programma di esempio per ripassare le tabelline
Le prime tre righe di programma, la 10, la 20 e la 30, contengono le istruzioni REM, per scrivere i commenti, che abbiamo già visto nella prima puntata del corso.
Anche le righe dalla 40 alla 90 comprese contengono delle istruzioni già viste.
In particolare, dalla riga 50, il computer chiede all’utente fino a quale tabellina vuole ripassare. Ho voluto limitare la larghezza a monitor delle varie richieste, in ragione del monitor con meno caratteri, che è quello del Commodore Vic20.
Il programma di esempio consente anche di ripassare fino ad una tabellina specifica. Infatti, i ragazzi non studiano tutte le tabelline insieme e potrebbero voler ripassare le varie tabelline fino a dove sono arrivati con lo studio.
Il computer memorizza il numero della tabellina, fino alla quale si vuole ripassare, nella variabile numerica NT.
La riga 70, tramite l’istruzione IF… THEN, già vista nella seconda puntata del corso, controlla che la tabellina sia compresa tra quella dell’1 e quella del 10. Se il numero fosse esterno a tali limiti, la domanda verrebbe riformulata.
Alla riga 80, il computer chiede quanti esercizi si vogliono eseguire. Infatti, è possibile decidere il numero NE di calcoli che l’utente deve eseguire per il ripasso.
Non è previsto un limite massimo al numero dei conti che il malcapitato utente deve eseguire! Tale numero, però, non può essere inferiore a 1, altrimenti il computer pone nuovamente la domanda.
Il generatore di numeri casuali RND
Con la riga 110 viene effettuata l’inizializzazione del generatore di numeri casuali RND. Infatti, se RND non viene inizializzato con un numero casuale, restituirebbe sempre la stessa sequenza di numeri.
Facciamo una prova con il Commodore PET. Lo accendiamo e chiediamo di scrivere un numero casuale. La funzione RND restituisce sempre un valore minore di 1, ma maggiore o uguale a zero. Lo trascriviamo. Poi resettiamo il computer e chiediamo sempre un numero casuale. Il numero… è sempre lo stesso!
Se, però, inizializziamo il generatore di numeri casuali con una variabile che cambia in ogni momento, ad esempio TIMER (approfondiremo il discorso nei paragrafi successivi), il numero casuale generato è sempre diverso.
Nel programma delle tabelline, il numero casuale serve per individuare i due fattori, sempre diversi, delle varie moltiplicazioni che l’utente deve calcolare.
La variabile di sistema TIMER
La riga 130 memorizza il TIMER nella variabile numerica TM, che serve per contare il tempo che l’utente ha impiegato ad effettuare i vari conti.
Relativamente alla variabile di sistema TIMER, nel Basic del Commodore non esiste, però funziona!
Infatti, esiste la variabile di sistema TIME, che restituisce il numero di sessantesimi di secondi che sono trascorsi dall’accensione del computer.
Dato che le variabili vengono riconosciute dalle loro prime due lettere, TIME viene riconosciuta da TI, come anche TIMER. Per questo funziona. Funzionerebbe anche un qualsiasi altro nome che iniziasse per TI.
Comunque, nel programma, ho scritto proprio TIMER al posto di TIME, per compatibilità con gli altri Basic del DOS, in cui la variabile di sistema TIMER è implementata.
Sempre approfondendo il TIMER, nei Commodore il valore si aggiorna di 60 unità al secondo. Invece, nel Basic dei PC, il valore è decimale e la parte intera rappresenta i secondi trascorsi dalla mezzanotte. Dobbiamo tenere conto di questa differenza nell’ultima riga del programma, dove calcoliamo il tempo che l’utente impiega ad effettuare i conti delle tabelline.
La generazione dei due fattori delle tabelline
Dalla riga 200 alla 290 comprese arriviamo al cuore del programma! Il ciclo FOR… NEXT, che abbiamo già studiato nella terza puntata del corso, genera per NE volte (il numero di esercizi), le moltiplicazioni da proporre all’utente.
La riga 220 genera il primo fattore M1, intero casuale, che deve essere compreso tra 0 e l’ultima tabellina che l’utente ha studiato (NT).
Il secondo fattore M2 della moltiplicazione, generato alla riga 230, è sempre compreso tra 0 e 10.
Programmare in Basic: la funzione INT per ricavare la parte intera di un numero
Per questi conti, ci viene utile la funzione INT(), che, per numeri positivi, restituisce la parte intera tralasciando quanto c’è dopo la virgola.
Approfondiamo il calcolo dei due fattori M1 e M2 con il Commodore Vic20. Il numero casuale, generato dalla funzione RND, è compreso tra 0 compreso e 1 escluso. Supponiamo di voler calcolare la tabellina del 10. Anche se il computer generasse un numero casuale molto grande (ad esempio 0.99), moltiplicando per 10, non si potrebbe mai raggiungere il numero intero 10. Per questo, bisogna moltiplicare la funzione RND per il numero massimo che si vuole generare +1. In questo caso, per arrivare fino a 10, dobbiamo moltiplicare per 11.
I fattori della moltiplicazione devono essere numeri interi. Ecco perché ci viene utile la funzione INT che, per numeri positivi, restituisce la sola parte intera del numero, tralasciando i decimali.
Verifica del valore immesso dall’utente
Torniamo al programma: abbiamo i due fattori M1 e M2, interi e casuali, per comporre la moltiplicazione.
Dalla riga 240 alla 260, il computer chiede all’utente il risultato della moltiplicazione M1 * M2. Tale risultato, viene memorizzato nella variabile MR.
Tramite due istruzioni IF… THEN, il computer valuta se MR, il risultato immesso dall’utente, è uguale al valore corretto della moltiplicazione. Se il risultato è giusto, viene incrementato il valore della variabile NG, che rappresenta il numero di esercizi corretti. Inoltre, il computer gratifica l’utente con la scritta “GIUSTO!”.
Se, invece, il risultato è errato, viene incrementato il valore di NS, che è il numero di risposte errate immesse dall’utente. Inoltre il computer scrive: “SBAGLIATO!”.
Raggiunta l’istruzione NEXT ES, presente alla riga 290, il ciclo FOR ES si ripete: l’utente è invitato a calcolare le restanti moltiplicazioni.
Programmare in Basic: il punteggio finale!
Terminata la sfida, il computer restituisce i risultati, dalla riga 300 in poi.
Vengono indicati a monitor:
- il numero totale degli esercizi (NE);
- quante moltiplicazioni l’utente ha eseguito correttamente (NG);
- il numero di moltiplicazioni errate (NS);
- nella riga 350, il computer indica il tempo impiegato dall’utente a fare i calcoli, espresso in secondi. Il computer scrive il tempo trascorso tra l’ultimo esercizio (valore attuale di TIMER) e il primo (memorizzato in precedenza nella variabile TM).
Qui, c’è una piccola differenza tra il Basic del Commodore e quello per i PC. Infatti, nel Commodore il valore del TIMER deve essere diviso per 60. Per i PC DOS, la divisione non è necessaria, in quanto il valore è già espresso in secondi.
Ecco, quindi, l’ultima riga di programma, la 350, per i computer Commodore:
350 PRINT "TEMPO:" + STR$(INT((TIMER - TM) / 60)) + " S"
E questa è per il Gw-Basic e il QuickBasic QB64 per PC MSDOS:
350 PRINT "TEMPO:" + STR$(INT(TIMER - TM)) + " S"
Listato del programma delle tabelline
Ed ecco il listato del programma in Basic della quinta puntata del video corso su come programmare in Basic con il Commodore e con il PC DOS.
Il programma è disponibile in due formati:
- CORSO-BASIC-5.TXT, in formato testo, per analizzarlo su PC o per trascriverlo sui vari Commodore, sul GwBasic nel DOSBox e sul QuickBasic QB64;
- CORSO-BASIC-5.ZIP, cartella compressa ZIP da scompattare. Include il programma in formato PRG, caricabile ed avviabile dal Commodore 64 e un disco virtuale D64 con all’interno i programmi caricabili dal C16, Vic20, C64 e C128, nonché emulatori (CCS64, VICE o altri). Include anche il programma in formato BAS per il QuickBasic QB64 e il GwBasic per DOSBox e MSDOS.
Gli argomenti del corso sono ancora tanti!
Credits: nel video corso, la SID music è Credits: DYSPIDCE, by Sami Seppä (Rock).
Per essere avvisati quando usciranno altri tutorial, esperimenti e recensioni relativi ai retro computer ed le successive puntate del corso sul BASIC, vi suggerisco di iscrivervi al canale YouTube e attivare la campanella delle notifiche!