Appunti di Freebasic (FBIde)

Transcript

Appunti di Freebasic (FBIde)
Appunti di Freebasic (FBIde)
Versione 0.011
Vladimiro Lelli
21 dicembre 2011
1
Copyleft: CC-BY-NC-SA 3.0
Indice
1 Primi passi
1.1 Ciao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Modalità grafica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1 Come è strutturato un programma. . . . . . . . . . . . . . . . . . . . . . .
4
4
5
6
2 Programmi vari
2.1 Achille e la Tartaruga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 π . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
14
17
3 Grafici
3.1 Assi cartesiani . . . . . .
3.2 Rette . . . . . . . . . . . .
3.3 Circonferenze . . . . . . .
3.4 Funzioni trigonometriche .
.
.
.
.
19
19
20
20
21
4 Trasformazioni del piano
4.1 Traslazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
22
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Introduzione
La prima lezione di fisica per le classi di prima e terza liceo si svolge più o meno in questo modo:
... Le lezioni di quest’anno riguarderanno principalmente la cinematica e la dinamica, cioè lo studio del moto dei corpi. L’argomento può essere reso particolarmente
interessante se ogni studente, alla fine dell’anno, avrà costruito il proprio videogioco.
Per videogioco si intende una versione rudimentale di alcuni videogames apparsi negli
anni ’80, tipo Arkanoid, Space Wars, Pacman. Un prototipo di videogioco potrebbe
essere una pallina che viaggia in linea retta sullo schermo e che rimbalza un volta
giunta al bordo. Come è possibile realizzare un simile effetto? Come si fa a disegnare
una pallina e a dirle di spostarsi in linea retta? Occorre sapere un po’ di matematica
e di fisica e cercare in rete il seguente programma: FBIde. FBIde significa Free Basic
Ide, cioè Free Basic Integrated development environment: ambiente di sviluppo integrato per il Free Basic. Il Basic è un linguaggio di programmazione. Free significa
libero (in realtà è open source). Quello che occorre fare è collegarsi in rete, digitare
FBIde su un motore di ricerca (Google?), collegarsi al sito opportuno e scaricare il
programma. Il programma va installato (ci sono versioni per Windows e Linux). Se
tutto è andato a buon fine, all’avvio del programma comparirà una finestra. In quella
finestra scriveremo delle istruzioni che ci permetteranno di creare il videogioco.
Nelle prime pagine di un libro di testo per le classi prime o terze sono scritti un
sacco di discorsi su cosa è il metodo scientifico, cosa fa la scienza, come lavorano
gli scienziati. Scrivendo un programma e cercando di farlo funzionare commetterete molti errori che andranno corretti. Anche quando il programma funzionerà (cioè
farà “qualcosa”), è molto probabile che produrrà effetti molto lontano dalle vostre
aspettative: la pallina si deve spostare e invece sta ferma, deve rimbalzare e invece
scappa dallo schermo e non si fa più vedere. Imparare a gestire questi inconvenienti
provando, tirando a indovinare, cercando aiuto tra i compagni di classe, vedendo cosa
hanno fatto altre persone in rete significa fare attività di ricerca. Potrete saltare cosı̀
le prime pagine del libro di testo.
Diamo quindi per scontato che FBIde sia già installato sul pc. Chi ha Windows non dovrebbe
aver avuto problemi. In alcuni casi compare il messaggio “compiler path is corrupted or not
found” una volta che uno prova a compilare il primo programma. In questo caso ancora non so
quale sia la soluzione. Per gli utenti Linux la procedura di installazione è più laboriosa. Cercatela
in rete (es su youtube). Lavorerete con l’ambiente di sviluppo “Geany”. Per chi ha il Mac le cose
sono un po’ più complicate. Il Mac può simulare Windows. Provate cosı̀. Altrimenti conviene
fare una partizione dell’hard disk e installarci Linux o Windows.
Attenzione: questi sono solo appunti. Sono stati scritti avendo poco tempo a disposizione
e fungono solo da supporto a quanto viene spiegato in classe. È molto probabile che risultino
incomprensibili, poco dettagliati, scritti male. Pazienza, col tempo provvederemo.
2
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
Non sono dispense di un corso di programmazione (e un programmatore inorridirà ogni tre
righe per quello che legge). Servono a non perdere il filo con quello che abbiamo fatto in classe:
ci sono studenti arrivati a dicembre, altri che tendono ad “imboscarsi” tra i compagni più bravi
(ad ogni computer ci stanno due o tre persone) e a non provare a casa quello che imparano in
classe. Ci sono altri che tendono a capire il senso di quello che facciamo ma a perdersi i dettagli
e a non sperimentare autonomamente (e quindi non sanno riprodurre un programma che faccia
una qualsiasi cosa). Avendo una classe di 30 persone è impossibile seguire ogni studente se questi
non collabora e non lavora anche a casa.
3
V. Lelli
Capitolo 1
Primi passi
1.1
Ciao
Avviate FBIde. Una volta nell’ambiente di sviluppo aprite un nuovo file. Comparirà una
schermata bianca: qui vanno scritte le istruzioni del codice.
Il primo programma che scriveremo è il programma più semplice che esiste: scrive la parola
“ciao”, nel senso che una volta avviato, si aprirà una finestra con su scritto il saluto. Digitate il
seguente codice (è quello che inizia con “print” e finisce con “sleep”):
Programma 1.
Un programma che saluta.
print "ciao"
sleep
Occorre ora eseguire i seguenti passi:
1. Salvare il programma.
Salvatelo cliccando sulla barra in alto a sinistra o cercate in file, save as...
Al programma va dato un nome, per esempio “ciao.bas”. Attenzione: a volte capita di
salvare il programma senza avergli dato un nome. Il programma figurerà come “.bas”. In
questo caso troverete dei problemi in fase di compilazione. Il programma deve avere un
nome.
2. Compilare il programma.
Basta cliccare sulla barra in alto: lı̀ compare un quadratino. Se ci posizionate il mouse
compare la scritta “compile”. Se una volta cliccato non accade nulla, va bene: non ci sono
errori. Compilare il programma (tra le altre cose) serve proprio a questo: controllare di
non aver commesso errori ed eventualmente correggerli.
3. Eseguire il programma.
Sempre sulla stessa barra compare un quadratino. Posizionandoci sopra la freccia del mouse
appare la scritta “run”. Cliccate e guardate cosa succede.
4
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
Dovrebbe comparire una finestra e in alto a sinistra la scritta “ciao”. Premete un tasto
qualsiasi: la finestra si chiuderà.
Effettuate le seguenti prove:
1. Cancellate l’istruzione “sleep”. Salvate il programma (senza dargli un nome, ce l’ha già.
Basta cliccare in alto sull’icona con l’immagine di un dischetto), compilate e fatelo girare
(run). Provate più volte. Notate niente? Dovrebbe comparire sullo schermo una specie di
“flash”. Qualcosa che appare e subito dopo scompare, troppo veloce.
Senza il comando “sleep” quello che accade è che la finestra con la scritta “ciao” appare,
ma subito dopo scompare e non facciamo in tempo a vederla. Per questo motivo inseriamo
l’istruzione “sleep (dormi)”. Questo comando figurerà al termine di quasi tutti i programmi
scritti in freebasic.
2. Provate a scrivere “pront” al posto di “print”. Avete commesso un errore (pront non
significa niente). Salvate, compilate. Dovreste ricevere un messaggio dal compilatore: non
capisce cosa significa “pront”. Il compilatore in genere dice quale è l’errore e in quale riga
del codice sta.
ATTENZIONE: tutte le volte che modificate un programma, dovete salvare, compilare,
inviare.
Se saltate il primo o il secondo di questi passaggi, il programma in esecuzione non sarà quello
appena modificato ma l’ultimo per il quale avete effettuato questi tre passaggi.
1.2
Modalità grafica
Il freebasic è un linguaggio molto attraente perchè permette di utilizzare la modalità grafica in
maniera semplice e veloce. Grafica significa videogiochi, grafici, disegni, ...
Programma 2.
Apparizione di un cerchio.
screen 19
window (-10,-10)-(10,10)
print "ciao"
circle(3,2),1,4,,,,f
sleep
Fate girare il programma qui sopra. Siamo in modalità grafica: la scritta “ciao” è in caratteri
più gradevoli, la finestra dove compare più ampia e soprattutto compare un cerchio più o meno
al centro dello schermo. Con un po’ di fantasia il cerchio potrà diventare un pacman...
Il metodo che useremo è il seguente: non entreremo nei dettagli di ciascun programma. Se
ci sono problemi, potete chiedere a me direttamente o a qualche vostro collega. Inoltre potete
modificare i programmi per vedere cosa succede. Altro avvertimento: non c’è bisogno di imparare
tutti i comandi a memoria. Per chi usa Windows, sulla barra in alto, a destra compare un “Help”.
Per Linux esiste un manuale scaricabile (è un file .html) e navigabile. Basta ricordarsi che un
comando esiste e andarlo a cercare nell’ Help. Ad esempio io mi ricordo che per fare dei cerchi
si usa il comando “circle”. Come è strutturato me lo dice l’ help. Non solo: mi fornisce anche
l’esempio di programmi che utilizzano quel comando che sto cercando. Posso cosı̀ copiare il
codice che ho trovato nell’help, incollarlo all’interno del programma che sto scrivendo (oppure di
5
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
un nuovo programma che ho creato apposta) e vedere quello che fa. Questi non sono dettagli.
Studiando cosa fanno i programmi che compaiono negli esempi dell’help si impara a programmare.
Per questa volta però entreremo abbastanza nei dettagli del codice.
1. Screen 19.
Questo è il comando che dice che siamo entrati in modalità grafica. Cercarlo nell’help.
Provate a cambiare il 19 con il 20 o un altro numero. Io mi ricordo solo “screen-grafica”.
2. Window...
Ci serve un piano cartesiano per poter collocare il nostro cerchio. window (-10,-10)-(10,10)
significa che nella finestra che compare, il punto che sta nell’angolo in basso a sinistra ha
coordinate (-10,-10), quello nell’angolo in alto a destra invece (10,10).
Attenzione: il comando window non produce alcun effetto grafico (non si vede differenza
sullo schermo se lo mettete nel codice oppure no). Provate però a cancellare tale comando
dal codice e provate a vedere se vedete ancora il cerchietto.
3. Circle...
È il comando che serve per fare i cerchi. I numeri tra parentesi sono le coordinate del
centro, seguono l’ampiezza del raggio, il colore, un po’ di virgole e una “F” che sta per
“full”, pieno. Sperimentate!
1.2.1
Come è strutturato un programma.
Conviene a questo punto fare qualche commento su come in genere è strutturato un programma.
Spero sia chiara la differenza tra usare un programma e programmare: quando usiamo un editor di
testo (notepad, word, ...), un foglio elettronico (excel, ...), ..., utilizziamo un programma (scritto
da altri) per un qualche scopo preciso e limitato. Con un editor di testo posso scrivere un
documento, inserirvi delle immagini, un grafico che ho prodotto utilizzando un altro programma.
Quando invece scrivo un programma (e quindi scrivo del codice in un qualche linguaggio di
programmazione), decido io cosa fa il programma; e tale programma, se sono abbastanza bravo,
potrà fare quasi tutto...! A seconda dello scopo che mi prefiggo (fare un videogioco, un virus (!),
migliorare un pezzo di un sistema operativo, collezionare dei dati, fare il grafico di una funzione)
dovrò utilizzare il linguaggio di programmazione più adatto, ma con uno o più linguaggi si può
creare un programma che faccia una qualsiasi cosa. Sorge il dubbio che avendo a disposizione
una cosı̀ grande libertà, i comandi e le istruzioni da imparare nel linguaggio scelto siano centinaia
o migliaia. Non è cosı̀. Facciamo un esempio: vogliamo creare un videogioco rudimentale che
simuli il tennis. Ci saranno quindi al posto delle racchette due rettangoli colorati alla sinistra
e alla destra dello schermo, ciascuno mosso da un giocatore premendo la tastiera. Ci sarà una
pallina che rimbalza sulle racchette. Se un giocatore la manca la pallina andrà oltre la racchetta,
verrà assegnato un punto all’avversario e il gioco riprenderà. Per fare tutto questo (o altro)
bastano pochissimi comandi. Questo perchè non esiste il comando “crea racchetta” o quello
“assegna il punto a Tizio”; se cosı̀ fosse, cambiando videogioco avremmo bisogno del comando
“crea astronave aliena” o “spara missile”. Le istruzioni di base invece sono astratte e hanno a che
vedere con il sommare una certa quantità ad una certa variabile, ripetere una istruzione un certo
numero di volte, controllare se una certa condizione si è verificata. Ecco perchè con le istruzioni
che useremo ci sarà la possibilità di creare programmi totalmente diversi l’uno dall’ altro.
Tutti i programmi che scriveremo saranno strutturati nel seguente modo: una sequenza di
istruzioni, una per riga. Le istruzioni saranno di pochi tipi, elencati qui sotto. Alcune le abbiamo
già utilizzate, altre le useremo.
6
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
Input Questo tipo di istruzioni le eviteremo spesso. Questa prassi va contro ogni logica di
programmazione, ma all’inizio è più semplice: i programmi che creiamo sono per noi e li possiamo
modificare quando e come vogliamo. Tutte le volte salveremo, compileremo e faremo il run.
Output
• print
Questa istruzione l’abbiamo già usata. In realtà anche il comando circle crea un output:
visualizza un cerchio sullo schermo. A me piace però inserire circle nella sezione grafica.
• sleep
Con questa istruzione blocchiamo l’esecuzione del programma esattamente nel punto dove
compare la scritta sleep. Basta premere un qualsiasi tasto e il programma prosegue. Se
dopo sleep non vi sono altre istruzioni, il programma termina.
Strutture condizionali
• if ...
then
Comandi di salto
• goto
• gosub
Cicli
• for ...
• do ...
next
loop
Potremmo addirittura fare a meno dei cicli: un ciclo può essere implementato con una
struttura condizionale e una istruzione di salto. Ma i cicli sono cosı̀ comodi...
Dichiarazioni di variabili
• dim as integer ...
• dim as single ..., dim as double ...
Spiegheremo in seguito cosa sono le variabili. integer vuol dire variabile di tipo intero , single
o double sono tipi di variabili alle quali possono essere assegnati numeri non interi (... con la
virgola).
Assegnazione di e computazione con le variabili
• x = 3
Alla variabile x è stato assegnato il valore 3.
• *, +, -, ...
Con questi simboli possiamo moltiplicare, sommare, sottrarre due variabili.
7
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
Grafica
• screen
• window
• circle
• pset
Con questa istruzione è possibile colorare un pixel sullo schermo.
Vogliamo ora scrivere un programma che disegni 5 cerchi distinti sullo schermo. Il modo più
banale e noioso di farlo (se i cerchi fossero 100?) sarebbe questo:
screen 19
window (-10,-10)-(10,10)
circle(3,2),1,4,,,,f
circle(1,4),1,4,,,,f
circle(2,3),1,4,,,,f
circle(3,6),1,4,,,,f
circle(-5,2),1,4,,,,f
sleep
Noi però vogliamo che i cerchi siano allineati (le palle viaggiano in linea retta) e non vogliamo
ripetere le stesse istruzioni troppe volte. Utilizzeremo quindi il ciclo for ... next. Cercarlo
nell’help. Qui sotto c’è un programma che scrive 100 volte “ciao”, affiancando al saluto un
contatore che tenga il conto di quante volte compare la scritta.
Programma 3.
Tanti saluti...
dim as integer k
for k = 1 to 100
print "ciao", k
next
sleep
Il ciclo funziona cosı̀: utilizza una variabile k che fa da contatore: all’inizio vale 1, entriamo nel
ciclo e viene scritto “ciao 1” sullo schermo. Troviamo poi next; il valore di k viene incrementato di
1 (attenzione: questa non è una istruzione che compare sullo schermo) e poiché 2 < 100 torniamo
all’inizio del ciclo e questa volta k vale 2. Sullo schermo compare la scritta “ciao 2”. L’istruzione
print ‘‘ciao’’, k viene ripetuta finché k = 100. A questo punto automaticamente usciamo
dal ciclo e troviamo sleep. L’esecuzione si arresta fino a quando non premiamo un tasto.
Importante: la variabile k va dichiarata. Provate a cancellare la prima riga del programma
e guardate cosa dice il compilatore. Ogni volta che utilizziamo una variabile, la dobbiamo
dichiarare.
Torniamo al programma dei cerchi allineati. Supponiamo di dover far apparire un cerchio
che abbia il centro nel punto A(0; 0), poi un secondo cerchio con centro in B(1; 1), poi un terzo
in C(2; 2) e tutto questo con un’unica istruzione circle. È chiaro che non basta scrivere
8
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
circle(0,0),1,4,,,,f
oppure
for k = 1 to 10
circle(0,0),1,4,,,,f
next
Nel primo caso disegnamo un cerchio con centro A(0; 0), nel secondo disegnamo 10 cerchi
sovrapposti, tutti con centro in A(0; 0). In qualche modo dobbiamo riuscire a far variare le
coordinate del centro. Utilizzeremo due variabili: x e y. Provate il seguente programma:
screen 19
window (-10,-10)-(10,10)
dim as single x,y
x = 0
y = 0
circle(x,y),1,4,,,,f
sleep
Vedrete comparire un cerchio con centro nell’ origine. Il programma cioè produce lo stesso
risultato di questo:
screen 19
window (-10,-10)-(10,10)
circle(0,0),1,4,,,,f
sleep
ma è più complicato. Abbiamo dichiarato due variabili (x e y) che sono le coordinate del
centro e le abbiamo inizializzate: all’inizio valgono entrambe 0.
Ora dobbiamo trovare il modo di variarle. Si fa cosı̀: inserendole all’interno di un ciclo.
Programma 4.
10 cerchi.
dim as integer k
screen 19
window (-10,-10)-(10,10)
dim as single x,y
x = 0
y = 0
for k = 1 to 10
circle(x,y),1,4,,,,f
x = x + 1
9
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
y = y + 1
next
sleep
All’interno del ciclo for compaiono 3 istruzioni: la prima disegna un cerchio con centro in
A(x;y), la seconda dice questo: assegna alla variabile x il vecchio valore che aveva, aumentato di
1. La terza istruzione è simile alla seconda. Per capire meglio, provate a far girare il seguente
programma e a capire cosa fa e perchè lo fa:
dim as integer k
dim as single x,y
x = 3
y = 4
for k
print
x = x
y = y
next
= 1 to 10
"x = ",x, "y = ",y, "k = ",k
+ 1
+ 3
sleep
oppure semplicemente questo:
dim as single x
x = 3.67
print "x = ",x
x = x + 5.2
print "ho sommato 5.2 a x, ora x = ",x
sleep
Nel programma 1.2.1 le istruzioni che incrementano le variabili sono all’interno di un ciclo,
quindi ogni volta che il contatore k aumenta di 1, le istruzioni x = x + 1 e y = y + 1 vengono
ripetute. Ora è il tempo di un trucco e di una magia.
Il trucco:
dim as
screen
window
dim as
integer k
19
(-10,-10)-(10,10)
single x,y
x = 0
y = 0
for k = 1 to 10
10
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
circle(x,y),0.1,4,,,,f
x = x + 1
y = y + 1
sleep 150
next
sleep
La magia:
Programma 5.
Magia.
dim as
screen
window
dim as
integer k
19
(-10,-10)-(10,10)
single x,y
x = 0
y = 0
for k = 1 to 10
circle(x,y),0.1,4,,,,f
x = x + 1
y = y + 1
sleep 150
cls
next
sleep
Attenzione: cls significa “clearscreen”: pulisci lo schermo. Capite perchè succede quel che
succede? L’istruzione cls la metterei fra quelle di output.
Non abbiamo finito: vogliamo una pallina che si muove per sempre e rimbalza sullo schermo.
Il problema del ciclo for è che permette di ripetere delle istruzioni un certo numero di volte:
10, 100, 1000... vogliamo avere la possibilità di andare avanti in modo illimitato. Utilizzeremo il
ciclo do ... loop. Quando inizieremo a programmare in modo più sofisticato provvederemo
a trovare un modo per uscire da questo ciclo, per il momento se volete uscirne e terminare il
programma, dovete chiudere la finestra piccola cliccando con il mouse.
screen 19
window (-10,-10)-(10,10)
dim as single x,y
x = -7
y = -5
do
circle(x,y),0.1,4,,,,f
11
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
x = x + 0.5
y = y + 0.3
sleep 150
cls
loop
sleep
direi che il cerchietto è scappato dallo schermo e non tornerà più. Il programma non si arresta
da sè: dovete forzarne la chiusura chiudendo la finestra piccola (ho detto PICCOLA...).
Cercate il ciclo do ... loop nell’ help e provate un po’ di esempi ivi inclusi.
Ora il cerchio che rimbalza: quando il cerchio arriva ad una delle estremità della finestra, ad esempio al margine sinistro, deve poter invertire la direzione. Questo significa che
se incrementavamo la x di 1, ora l’incremento deve cambiare segno.
Lo so, non sono stato chiarissimo. Provate questo programma e nel caso fate delle domande.
Programma 6.
Rimbalzi a destra
screen 19
window (-10,-10)-(10,10)
dim as single x,y,a
x = 3
y = -8
a = 0.5
do
circle(x,y),0.1,4,,,,f
if x > 10 then a = - a
x = x + a
y = y + 0.3
sleep 150
cls
loop
sleep
La pallina rimbalza a destra e poi... se ne va. Abbiamo ottenuto questo effetto dichiarando
una nuova variabile a, inizializzandola a = 0.5 e poi incrementando la x con essa: x = x + a.
Il rimbalzo sta in questa parte di codice:
if x > 10 then a = - a
Se (if) la variabile x diventa maggiore di 10 (e quindi la pallina esce dallo schermo) allora
(then) la variabile a cambia segno (a = - a) per cui la coordinata x, che prima aumentava,
torna a diminuire.
12
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
Programma 7.
Screensaver
screen 19
window (-10,-10)-(10,10)
dim as single x,y,a,b
x = 3
y = -8
a = 0.5
b = 0.3
do
circle(x,y),0.1,4,,,,f
if
if
if
if
x
x
y
y
>
<
>
<
10 then a = - a
’ rimbalzo a destra
-10 then a = - a
’ rimbalzo a sinistra
10 then b = - b ’ in alto
-10 then b = - b ’in basso
x = x + a
y = y + b
sleep 150
cls
loop
sleep
All’interno di un programma spesso si trovano dei commenti, come quello qui sotto:
’ rimbalzo a sinistra
Cominciano con un apostrofo. Il compilatore capisce che non sono istruzioni e li ignora.
Servono solo al programmatore o a chi legge il programma per spiegare a cosa serve quel pezzo
di codice. Provate a scrivere 100 righe di programma senza commentarle e rileggerle dopo un
mese. Capirete a cosa servono i commenti.
Per quanto riguarda l’istruzione if, provate il seguente programma:
dim as integer j
for j = 1 to 10
if k<4 then print "non mi saluti? ", k
sleep 300
if k > 7 then print "vabbè, ciao ", k
sleep 300
next
sleep
13
V. Lelli
Capitolo 2
Programmi vari
2.1
Achille e la Tartaruga
Abbiamo discusso in classe del paradosso di Zenone. Vogliamo ora vedere la gara implementata
su un computer. Riprodurremo cosı̀ le tabelle di marcia dei corridori e vedremo se e quando
Achille raggiungerà la Tartaruga.
I dati del problema sono i seguenti: la distanza iniziale fra A. e T. è d = 100 m, la velocità
di A. è vA = 10 m/s, quella di T. è vT = 1 m/s. Quando A. raggiungerà T?
Implementiamo il problema un pezzo di codice per volta. Questa è la corsa di A, opportunamente commentata (i commenti sono numerati e rimandano all’elenco sotto al codice):
screen 19
window(-5,-5)-(150,5)
dim as double xa, va, dt
’1
xa = 0
va = 10
dt = 0.01
’2
’3
’4
do
circle(xa,0),1,4,,,,f
xa = xa + va*dt
sleep 100
loop
’5
’6
1. La larghezza della finestra è importante: in classe abbiamo visto che A. percorrerà una
distanza di circa 111.11 metri per raggiungere la T. Se la larghezza della finestra non è
opportuna rischiamo di perderci la fine della gara.
2. A. parte dall’ origine
3. Questa è la velocità di A. Notate come nel codica non possiamo inserire unità di misura.
Dobbiamo essere consapevoli che in questo caso sono 10 metri al secondo.
4. dt è importante: “fotograferemo” la corsa a intervalli di 0.01 secondi. Questo parametro
può essere modificato. Provate a farlo.
14
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
5. Qui disegnamo la posizione di A. con un cerchietto
6. Questo è il pezzo più importante del codice: ogni volta che facciamo un ciclo, la vecchia
posizione di A. viene aggiornata incrementandola del pezzetto va*dt. È proprio quello che
succede: ogni volta che passano dt = 0.01 secondi A. percorre uno spazio pari a va*dt
metri.
Ultimo dettaglio: il trascorrere del tempo. Nella nostra simulazione, ogni volta che vengono
eseguite tutte le istruzioni all’interno del do ... loop, è come se fosse passato un tempo t
pari a dt = 0.01 secondi. Attenzione: la velocità della simulazione non è connessa al tempo
trascorso che simuliamo. Cambiate sleep 100 con sleep 500: la simulazione va più lenta ma
A. viaggia con la stessa velocità e raggiungerà la T. nello stesso istante.
Ancora sul trascorrere del tempo: provate il seguente programma.
dim as single dt, t
t = 0
dt = 0.1
do
print "sono passati dall’inizio del programma ", t, "
t = t + dt
sleep 300
loop
secondi."
Stiamo simulando il passare del tempo, ma la velocità di simulazione non ha niente a che
vedere con t o dt.
Inseriamo ora il moto della tartaruga e un “cronometro” per misurare quanto dura la corsa.
screen 19
window(-5,-5)-(150,5)
dim as double xa, va, dt
dim as double xt, vt
dim as double t
’variabili Tartaruga
’per misurare il tempo che passa
xa = 0
va = 10
dt = 0.01
xt = 100
vt = 1
t = 0
do
circle(xa,0),0.1,4,,,,f
circle(xt,3),0.1,2,,,,f
xa = xa + va*dt
xt = xt + vt*dt
t = t + dt
sleep 100
loop
’la T. parte 100 metri davanti ad A.
’ma è più lenta
’il cronometro parte da 0
’la T. è un po’ più su e ha un colore differente
’legge del moto per la T.
’questo è il tempo che passa
15
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
Ora occorre inserire un controllo che ci dica quando A. supera T: il sorpasso avviene quando
xa > xt. Nel programma qui sotto incontreremo anche l’istruzione goto. Vedremo a cosa serve.
Programma 8.
Achille e la Tartaruga.
screen 19
window(-5,-5)-(150,5)
dim as double xa, va, dt
dim as double xt, vt
dim as double t
xa = 0
va = 10
dt = 0.01
xt = 100
vt = 1
t = 0
do
circle(xa,0),1,4,,,,f
circle(xt,3),1,2,,,,f
if xa > xt then goto finecorsa
xa = xa + va*dt
xt = xt + vt*dt
t = t + dt
sleep 100
loop
finecorsa:
print
print
print
print
"Achille ha superato la Tartaruga in "; t, "
secondi"
"Achille ha percorso una distanza di "; xa, "
metri"
"La Tartaruga ha percorso una distanza di "; xt, "
metri"
"Zenone c’e’ rimasto male e se n’e’ andato..."
sleep
Rimane da commentare l’istruzione goto: serve a saltare da una parte del codice ad un altra.
La necessità di fare questo tipo di operazione è evidente nel programma appena scritto. Per
sperimentare un po’, provate quello qui sotto (e cercate come al solito nell’help).
print "sperimentiamo il goto"
sleep 200
goto pippo
16
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
print "questo è un messaggio invisibile"
pippo:
print "avete mica visto il messaggio invisibile?"
sleep
Come vedete l’esecuzione del programma, non appena trova l’istruzione goto pippo, salta
direttamente alla riga contenente l’etichetta pippo: (i due punti ci vanno messi) e prosegue da
lı̀.
Se invece di “guardare” le corsa vogliamo stampare le tabella di marcia, possiamo modificare
il programma cosı̀:
Programma 9.
Achille e la Tartaruga: tabelle di marcia.
dim as double xa, va, dt,xt,vt,t
xa = 0
va = 10
dt = 0.1
xt = 100
vt = 1
t = 0
do
print "tempo ", "Achille ", "Tartaruga "
if xa > xt then print "fine della gara " : stop
print t,xa,xt
xa = xa + va*dt
xt = xt + vt*dt
t = t + dt
sleep 100
loop
Cercate nell’help i nuovi comandi. I due punti (:) servono a separare una istruzione dall’altra
nel caso si voglia scriverle tutte su una riga. La seguente scritta:
dt = 0.1
xt = 100
vt = 1
è equivalente a questa:
dt = 0.1 : xt = 100 : vt = 1
(che occupa meno spazio).
2.2
π
Faremo un programma che calcoli π. Il metodo è poco efficiente anche per un computer, ma è
semplice e funziona. π è l’area del cerchio di raggio r = 1. Il metodo è il seguente ed è stato
17
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
Appunti di Freebasic (FBIde)
chiarito nei dettagli in classe. Questo è solo un promemoria. Ci costruiamo una griglia di punti
che stanno all’interno del quadrato avente un vertice in O(0; 0) e il vertice opposto, giacente sulla
stessa diagonale, in A(1; 1). Il quadrato giace tutto nel primo quadrante. Il seguente programma
crea una tabella con le coordinate x,y dei punti che generiamo.
dim as double j,k
for j
for k
print
sleep
next
next
sleep
= 0 to 1 step 0.1
= 0 to 1 step 0.1
j,k
200
Le novità sono le seguenti: due cicli for annidati l’uno dentro l’altro e il comando step 0.1
che stabilisce il valore per l’incremento dei contatori.
Il quadrato suddetto ha area A = 1. qui ci vanno delle spiegazioni...
Programma 10.
Calcolo di π.
dim as double j,k, pigreco
dim as integer npunti, ndentro
npunti = 0
ndentro = 0
for j = 0 to 1 step 0.01
for k = 0 to 1 step 0.01
npunti = npunti +1
if j^2+k^2 < 1 then ndentro = ndentro + 1
next
next
pigreco = 4*ndentro/npunti
print "pigreco = ", pigreco
sleep
e qui esercizi e modifiche proposte per migliorare il programma.
18
V. Lelli
Capitolo 3
Grafici
3.1
Assi cartesiani
Siamo già capaci di allineare dei cerchietti, non avremo alcuna difficoltà ad allineare dei punti
(pixel). I punti saranno tanti, quindi useremo dei cicli. Il seguente codice traccia l’asse x. Notare
che i pixel sono piuttosto “radi”.
screen 19
window(-10,-10)-(10,10)
dim as single x
for x = -10 to 10 step 0.1
pset(x,0),4
next
sleep
’asse x
Il seguente programma è migliore.
Programma 11.
Assi cartesiani
screen 19
window(-10,-10)-(10,10)
dim as single x
for x = -10 to 10 step 0.01
pset(x,0),4
pset(0,x),4
next
sleep
’asse x
’asse y
Notare che la variabile x è solo un nome... la possiamo utilizzare anche per tracciare l’asse y
(mettendola al posto opportuno).
19
Copyleft: CC-BY-NC-SA 3.0
3.2
Appunti di Freebasic (FBIde)
Rette
Il metodo utilizzato per le rette è valido per qualsiasi funzione.
Programma 12.
Retta y = x
screen 19
window(-10,-10)-(10,10)
dim as single x,y
for x = -10 to 10 step 0.01
pset(x,0),4
pset(0,x),4
next
’asse x
’asse y
’per comodità mettiamo qui il codice per le funzioni
’(lo potevamo mettere dentro il primo ciclo)
for x = -10 to 10 step 0.01
y = x
pset(x,y),2
next
sleep
’qui scriviamo l’eq della funzione
L’unico dettaglio fastidioso è che la bisettrice del primo e terzo quadrante non sembra tanto
bisettrice. Questo perchè la finestra ha una risoluzione di 800x600 pixel, quindi in orizzontale
ci sono più pixel che in verticale, mentre noi abbiamo dichiarato window(-10,-10)-(10,10).
Ovviamo al problema in questa maniera: window(-8,-6)-(8,6). Anche questa è un’applicazione
dell’argomento “la retta”, no? (triangoli simili...).
3.3
Circonferenze
Scriviamo il programma per intero, anche se la modifica sarebbe minima. Notare:
1. Preferiamo window(-8,-6)-(8,6), altrimenti la circonferenza diventa un ellisse.
2. Possiamo disegnare la parte di sopra della circonferenza (e poi quella di sotto).
3. La radice quadrata è sqr( ).
4. Non c’è bisogno di stare attenti a dove varia la x: se x = -10 la sqr( x ) non è un numero
reale. Facendo girare il programma non notiamo particolari problemi...
Programma 13.
Circonferenza x2 + y 2 = 1
screen 19
window(-8,-6)-(8,6)
dim as single x,y
20
V. Lelli
Copyleft: CC-BY-NC-SA 3.0
for x = -10 to 10 step 0.01
pset(x,0),4
pset(0,x),4
next
Appunti di Freebasic (FBIde)
’asse x
’asse y
for x = -10 to 10 step 0.01
y = sqr(1-x^2)
pset(x,y),2
y = -sqr(1-x^2)
pset(x,y),3
next
sleep
3.4
’circonferenza di sopra
’e di sotto
Funzioni trigonometriche
Attenzione: gli angoli sono misurati in radianti e π ∼ 3.14...
Programma 14.
Seno.
screen 19
window(-6,-2)-(6,2)
dim as single x,y
for x = -10 to 10 step 0.01
pset(x,0),4
pset(0,x),4
next
’asse x
’asse y
for x = -10 to 10 step 0.01
y = sin(x)
pset(x,y),2
next
sleep
21
V. Lelli
Capitolo 4
Trasformazioni del piano
4.1
4.1.1
Traslazioni
Attive
Programma 15.
Attive 1
screen 19
window(-10,-10)-(10,10)
dim as single x,y,a,b
x= 1:y=2
a = 0.2: b=0.3
do
circle(x,y),0.5,4,,,,f
circle(x+2,y-5),0.5,2,,,,f
if x>10 then a = -a
if x<-10 then a = -a
if y>10 then b= -b
if y<-10 then b = -b
x = x+a
y = y+b
sleep 100
cls
loop
’cerchio traslato
’in realtà anche questa è una traslazione...
Programma 16.
Attive 2
screen 19
window(-10,-10)-(10,10)
dim as single x,y
for x = -10 to 10 step 0.01
22
Copyleft: CC-BY-NC-SA 3.0
pset(x,0),4
pset(0,x),4
next
for x = -10 to 10 step 0.01
y = x^2
pset(x,y),2
pset(x+3,y+2),3
next
sleep
4.1.2
Appunti di Freebasic (FBIde)
’asse x
’asse y
’qui scriviamo l’eq della parabola
’qui la disegna
’e qui la disegna traslata
Passive
23
V. Lelli