Giorni fa ho scritto un semplice programma GW-BASIC, volevo provare a tornare indietro di 30 anni... e ho fatto una gran fatica! In questo articolo scopriamo PC-BASIC, un emulatore di questo ambiente, spolveriamo le nostre nozioni di BASIC e implementiamo il crivello di Erastotene.

pcb 608 328 1

STRUMENTI

Per lavorare con GW-BASIC abbiamo diverse possibilità, fra cui:
- lavorare in una macchina virtuale
- usare DOSBox (ne ho parlato qui)
- installare un interprete compatibile, come ad esempio PC-BASIC.

Io ho voluto provare PC-BASIC che si può scaricare da https://robhagemans.github.io/pcbasic/index.html.

ALGORITMO

L'algoritmo da implementare, il crivello di Erastotene, è spiegato molto bene qui https://it.wikipedia.org/wiki/Crivello_di_Eratostene.
In sostanza, dato in input un intero N con questo algoritmo troviamo tutti i numeri primi minori o uguali a N.
Il procedimento parte dalla predisposizione di un array di N elementi che vengono "passati al setaccio" per marchiare (e quindi escludere) tutti i multipli degli interi da 2 a √N.

CONCETTI UTILI DI GW-BASIC

Per l'implementazione ho dovuto rispolverare alcuni concetti (il tutto comunque ottimamente spiegato nella documentazione online di PC-BASIC).

Innanzitutto come definire un array:

10 OPTION BASE 1
20 DIM A%(100)

OPTION BASE permette di specificare il primo indice per gli array mentre è DIM a definire l'array (il carattere % specifica che gli elementi saranno interi): qui ho impostato una dimensione massima di 100 elementi.

Per l'input si usa l'operatore INPUT mentre per testare la correttezza del valore inserito dall'utente usiamo una IF che in caso di errore ci fa saltare ad una linea che gestisce la segnalazione all'utente:

40 INPUT "INSERISCI N=";N%
50 IF N%>100 THEN 300

Ci sono poi i cicli, in questo caso ho utilizzato sia un FOR/NEXT che un WHILE/WEND.

Qui sotto ecco il FOR che "resetta" il contenuto dell'array:

70 FOR I=1 TO N%
80 A%(I)=0
90 NEXT

e qui sotto il WHILE che marchia tutti i multipli di I

110 J=I+I
120 WHILE J<=N%
130 A%(J)=1
135 J=J+I
140 WEND

Maggiori dettagli si possono ottenere nella documentazione online di PC-BASIC.

NOTE OPERATIVE

L'inserimento delle righe del programma avviene digitando ciascuna riga facendo seguire un INVIO.
Se si vuole modificare una riga precedente basta spostarsi sopra la riga con i tasti freccia e, al termine della modifica, dare INVIO; se la riga da modificare non è presente a video basta visualizzarla con un

LIST

Dopo aver inserito poche righe probabilmente sentirete l'impulso di salvare, per fare questo basta dare:

SAVE "CRIVELLO.BAS",A

con l'opzione "A" si richiede il salvataggio in formato testo; PC-BASIC salva questi files nella cartella %USERPROFILE%; se volete riprendere un lavoro precedentemente salvato vi basterà dare:

LOAD "CRIVELLO.BAS"

... dimenticavo... per eseguire il programma basta dare:

RUN

IMPLEMENTAZIONE

Ecco il codice completo:

10 OPTION BASE 1
20 DIM A%(100)
30 CLS
40 INPUT "INSERISCI N=";N%
50 IF N%>100 THEN 300
60 MAXDIV%=SQR(N%)
70 FOR I=1 TO N%
80 A%(I)=0
90 NEXT
100 FOR I=2 TO MAXDIV%
110 J=I+I
120 WHILE J<=N%
130 A%(J)=1
135 J=J+I
140 WEND
150 NEXT
160 FOR I=2 TO N%
170 IF A%(I)=0 THEN PRINT I
180 NEXT
190 END
300 PRINT "N MASSIMO =";100
310 END

ed ecco qui un esempio di esecuzione con N=12:

pcb 608 328 2

CONCLUSIONI

Il programma implementato era semplice ma ciononostante mi ha dato la possibilità di riassaporare il gusto di scrivere in GW-BASIC.
La difficoltà maggiore ce l'ho avuta nel dover specificare i numeri di linea: aggiungere un pezzo di codice prima di una un'altra parte non è affatto semplice!

FONTI

https://robhagemans.github.io/pcbasic/index.html
https://it.wikipedia.org/wiki/Crivello_di_Eratostene