Il BASIC:  Linguaggio di programmazione. Il primo programma in BASIC "girò" il 1º maggio 1964 alle ore 4:00
Bill Gates e Paul Allen: la fortuna della microsoft iniziò con un interprete Basic
John George Kemeny e Thomas Eugene Kurtz:inventarono il linguaggio nel 1964



differenze fra una lingua "naturale" (e.g. Italiano, Inglese, Cinese) e un linguaggio di programmazione
lingua naturale
linguaggio di programmazione
  • numero di vocaboli/verbi: decine di migliaia
  • regole sintattiche: tante e con eccezioni
  • verbi regolari, irregolari...
  • singolare plurale
  • declinazioni
  • coniugazioni
  • numero di "parole chiave": qualche decina
  • regole poche e senza eccezioni

primi programmini Quitebasic
cos'è il BASIC
le quattro sezioni della pagina di sviluppo del quitebasic

Le regole per la numerazione delle istruzioni
Uso delle prime istruzioni: Esecuzione passo-passo dei  programmi (tasto "step") e visualizzazione dei valori delle variabili

programma che somma due numeri, contiene un errore.

La sintassi del nostro Basic
operatori aritmetici:
*  /  +  -   e  % (modulo) 
Uso delle parentesi nelle espressioni (ci sono solo le parentesi tonde)
Le funzioni principali

Funzioni

funzioni matematiche comuni: in verde quelle esaminate

  • ABS(X)
  • SGN(X)
  • ASIN(X)
  • ASIN(X)
  • ATAN(X)
  • COS(X)
  • SIN(X)
  • TAN(X)
  • SQR(X)
  • EXP(X)
  • LOG(X)
funzioni per arrotondamento e troncamento
  • ROUND(X)
  • FLOOR(X)
generazione di numeri casuali fra zero e il valore di X
  • RAND(X)
Utilizzo delle funzioni in basic
20  rem utilizzo di alcune funzioni del quitebasic
40  cls
45  rem salto alla 1400
50  goto 1400
90  rem stampa di formule matematiche
100 PRINT (5/3)*  2
150 rem stampa il valore di pigreco
200 print pi
300 PRINT 15 % 3
350 rem valore assoluto di un numero (ABS)
400 print ABS (-6)
500 print ABS (7)
550 rem segno di un numero (SGN)
600 PRINT SGN (-10)
700 PRINT SGN (4)
750 rem radice quadrata di un numero (SQR)
800 PRINT SQR (4)
900 PRINT SQR (-25)
950 rem due funzioni, SQR e ABS
1000 PRINT SQR (abs(-25))
1050 rem arrotondamento
1100 print ROUND (5.1)
1150 rem round (arrotonda al numero intero piu vicino)
1160 rem troncamento
1170 print "questo è il FLOOR (troncamento) di 5.99 ";
1200 print floor (5.99)
1210 print "questo è il FLOOR di pi ";
1300 print floor (pi)
1350 rem ciclo di stampa di lanci di dado, utilizza la funzione RAND  e arrotonda all'intero più vicino il valore
1400 for c=1 to 20
1450    pause 200
1470    let n=round (rand(6))
1480    if n<>0 then print n
1500 next c
2000 end


I nomi delle variabili
: In quitebasic i nomi delle variabili (le caselle di memoria) possono essere al massimo lunghi due caratteri, il secondo carattere, se c'è, deve essere una cifra o il simbolo $. Nomi validi sono A1, B3, C, A$, Nomi NON validi sono Somma, TOT, importo ecc.

Gestione delle MAIUSCOLE, minuscole e spazi in quitebasic. 
1000 REM commento
1100 rem commento
1200 ReM Commento
1300 PrINt"ciao ciao"
1400 Print "Ciao ciao" + "AAA" +       "BBB"
1500 PrINt"Ciao ciao"+"AAA"+"BBB"
1600 ForI=1to5
1700 printI
1800nextI
1900 leti=1
2000ifi=7thengoto3000
2100printi
2150leti=i+      1
2200goto 2000
3000end
funziona tutto

L'unico caso in cui ci siano differenze fra MAIUSCOLE e minuscole in un sorgente quitebasic è quando sono parte di stringhe racchiuse fra doppi apici "AAA  hgdydhd"

esempio di commenti in bella grafica
1000 rem ********************************
1100 rem *   scatolina con commenti     *
1150 rem *   bella mostra               *
1200 rem *   programma scritto da BC    *
1250 rem *   il  2-marzo-2014           *
1300 rem ********************************
notare che ho dovuto scegliere un font con larghezza(spaziatura)  fissa 
(il courier)
 altrimenti la "scatolina" sarebbe venuta male.

vediamo chi riesce a capire come funziona questo. (utilizzo di GOSUB RETURN)
01 rem freccina che si muove
20 cls
50 for i=5 to 20 step 1
100     gosub 1000
120 next i
150 print "finito"
200 end

1000 clc
1020 plot 6,i,"red"
1050 plot 6,i+1, "yellow"
1050 plot 5,i+1, "yellow"
1050 plot 7,i+1, "yellow"
1100 plot 6,i+2, "blue"
1150 plot 6,i+3, "green"
1200 pause 200
1400 return


50 cls
100 rem programma equivalente all'esercizio della verifica
200 input "dammi la frase da stampare";F
250 print "la frase da stampare è: ";f
300 input "dammi il valore di QV";q
350 print "il numero di volte è ";q
400 let c=2
500 print f
600 if c=q then goto 1000
700 let c=c+1
800 goto 500
1000 print "stop"
1100 end



le istruzioni INPUT e IF di quitebasic
Le istruzioni FOR-NEXT e GOSUB-RETURN
L'istruzione PAUSE.

grafica dei videogiochi primigeni.
loop con l'istruzione FOR
indentazione dei loop
loop (cicli) nidificati.

I primi videgiochi (al bar) pong, break a wall, space invaders (1978), Qix. (snake)


programma che disegna una riga di pixel

100 rem bc

200 rem disegna una fila di pixel tramite un ciclo (loop)

300 rem prima fila, con ciclo fatto a mano (IF e goto)

350 cls

400 LET I= 1

500 PLOT 5,I,"white"

550 LET I=i+1

580 pause 100

600 IF I< 40 THEN GOTO 500

700 REM secondo metodo  usa il ciclo FOR

800 for i=6 to 50

850     pause 100

900     plot 9,i,"RED"

1000 next i

1200 rem finisce qui

1300 print "ho finito"

1400 end

lo devi modificare in modo che:
  • disegni altre righe
  • le disegni orizzontali
  • le disegni a puntini
  • cambi colori
  • stampi i valori della variabile usata per il ciclo

programma che riempie un'area rettangolare di pixel bianchi, utile per colorare aree grandi
100 rem programma che colora un'area dello schermo
120 rem utilizzando due cicli FOR nidificati
140 rem ovvero uno dentro l'altro
200 cls
300 input "altezza area? ";a
400 input "larghezza area? ";l
500 input "coordinata x del vertice inferiore sinistro? ";x
600 input "coordinata y del vertice inferiore sinistro? ";y
650 print "OK, disegno un rettangolo di pixel bianchi"
670 print "di dimensioni ";a;" per ";l
700 FOR i=x to x+l
800    FOR j=y to y+a
850    rem notare i cicli nidificati e indentati
900      plot i,j,"white"
1000   next j
1100 next i
1400 end
utilizza le istruzioni INPUT, CLS PRINT FOR/NEXT e PLOT
contiene due cicli FOR nidificati

1000 rem programma che fa complimenti se voto alto
1100 print "che voto hai?"
1200 input ""; V
1300 if V>8 then print "sei proprio bravo!"
1400 end

1000 rem programma che calcola il fattoriale di un numero
1100 input "dammi N ";N
1200 if n >100 then goto 3000
1300 if n < 0 then goto 3000
1400 if  n= 0 then goto 4000
1500 let M=1
1600 let F=1
1700 let f=F*M
1800 if m = N then goto 5000
1900 let M=M+1
2000 goto 1700

3000 print "errore!!"
3100 end

4000 print "il fattoriale di zero è 1!"
4100 end

5000 print "il fattoriale di ";N;" è ";F
5100 end

Il ciclo FOR
sorgente basic
output dell'esecuzione
1000  rem usi del ciclo FOR
1100 print "ecco un ciclo senza FOR"
1200 LET i=1
1300 Print "I= ";I
1400 LET I=I+1
1500 if i < 6 then goto 1300
1550 rem ******************
1600 print "ecco lo stesso ciclo con il FOR"
1700 for i=1 to 6 
1750    print "I= "+I
1800 next I
1900 rem ******************
2000 print "ciclo passo 2"
2100 for i=1 to 6 step 2
2200    print "I= "+I
2300 next i
1900 rem ******************
2500 print "ciclo con passo negativo"
2600 for i =6 to 1 step -1
2700    print "i= ";I
2800 next i
2900 end
ecco un ciclo senza FOR
I= 1
I= 2
I= 3
I= 4
I= 5
ecco lo stesso ciclo con il FOR
I= 1
I= 2
I= 3
I= 4
I= 5
I= 6
ciclo passo 2
I= 1
I= 3
I= 5
ciclo con passo negativo
i= 6
i= 5
i= 4
i= 3
i= 2
i= 1



100 rem programma che disegna una linea orizzontale
110 rem di lunghezza e colore a piacere
120 rem c è la colnna da cui si inizia a plottare
130 rem l è la lunghezza della linea da plottare in pixel
140 rem c1 è il colore da utilizzare
150 rem mancano tutti i controlli.
160 rem **************************************
200 input "da che colonna deve iniziare la riga?(0-30)"; c
250 input "quanti pixel deve essere lunga la linea? (1-20)";l
300 input "di che colore deve essere la linea?";c1
400 for i=c to c+l
450    plot i,c,c1
500 next i
550 END



traduzione del flow chart in programma basic
Flow chart
Programma



le dimensioni variabili della "canvas" grafica
la radice quadrata e il quadrato di un numero
la precisione di calcolo
La roulette russa e la probabilità
eventi equiprobabili (es: lancio dado, roulette, estrazione lotto...)

precisione di calcolo e simulatore lancio dado
50 rem utilizzo di sqr, precisione di calcolo e lancio dado.
100 cls
200 print sqr(2)
250 let A=sqr(2)*SQR(2)
260 PRINT A
300 print 1.4142135623730951*1.4142135623730951

500 for i=1 to 20
600    print round(rand(6)); " ";
700 next i
1000 end


100 REM OPERAZIONI SULLE STRINGHE
120 rem programma by BC 01-05-2015
150 rem ****************************************
160 rem * le operazioni sulle stringhe sono:   *
170 rem * LEFT                                 *
180 rem * RIGHT                                *
190 rem * MID                                  *
200 rem * LEN                                  *
210 rem * UPPERCASE                            *
220 rem * LOWERCASE                            *
150 rem ****************************************
300 cls
400 input "dammi il tuo nome";n$
450 print "il tuo nome è: ";n$
460 print "il tuo nome è lungo ";len(n$); " caratteri"
500 print "ecco la prima lettera del tuo nome: ";left (n$,1)
600 print "ecco l'ultima: ";right(n$,1)
700 rem ora stampo il nome un carattere per riga
800 for I=1 to len(n$)
900    let c$ = mid(n$,i-1,1)
930    print c$
950 next i
1000 end

simulazione lancio dado
100 rem lancio dado
120 rem utilizzo della funzione RAND
130 rem deve essere completato....
150 cls
200 for i=1 to 20
220    rem venti lanci
250    print rand(6)
300 next i
500 print "finito"

700 END

fare il controllo del simulatore lancio dado
20 rem plotta 500 pixel in posizioni a caso e COLORI a caso
30 clc
50 for i=1 to 500
100   let r=round(i/2)
520   let g=round(500-i)/2
530   let b=(i*i) % 256
550   let c="rgb("+r+","+g+","+b+")"
800   plot floor(rand(50)),floor(rand(50)),c
900   pause 100
950 next i
1000 end
concatenazione di stringhe
100 rem concatenazione di stringhe con l'operatore "+"
150 rem notare gli spazi nelle stringhe
200 let a=" ABCD  "
300 let b=" 12345 "
400 let c=a+b
500 print a
600 print b
700 print c
1000 end

20 rem plotta 500 pixel in posizioni A CASO e COLORI a caso
22 rem r, g e b sono le tre componenti RGB del colore
30 rem c è la stringa che contiene il colore scelto in formato RGB
32 rem sfrutta il trucco che i colori si possono specificare in chiaro, es "white" o come combinazione di R G e B.
35 clc
50 for i=1 to 500
100   let r=round(i/2)
520   let g=round((500-i)/2)
530   let b=(i*i) % 256
550   let c="rgb("+r+","+g+","+b+")"
560   let x=floor(rand(50))
570   let y = floor(rand(50))
600   print "coordinate x e y ";x;" ";y;" il colore è: ";c
800   plot x,y,c
900   pause 100
950 next i
1000 end

01 rem freccina che si muove
02 rem utilizza GOSUB/RETURN
20 cls
30 let x=6
40 rem il primo valore della x lo pongo a 6
50 for i=5 to 20 step 1
60      rem chiamo la subroutine con l'istruzione GOSUB
100     gosub 1000
120 next i
130 input "dammi il valore di x " ; x
150 rem il secondo valore della x lo chiedo all'utente
160 for i=7 to 40 step 1
170     gosub 1000
175     rem notare l'indentazione del loop (ciclo for)
180 next i
190 print "finito"
195 rem è buona norma che il programma segnali di aver terminato l'esecuzione
200 end

1000 rem inizio sottoprogramma (subroutine)
1010 clc
1025 rem cancello tutta la finestra grafica
1020 plot x,i,"red"
1030 print "il pixel rosso ha cordinate (" ; x;"," ; y;")"
1050 plot x,i+1, "yellow"
1050 plot x-1,i+1, "yellow"
1050 plot x+1,i+1, "yellow"
1100 plot x,i+2, "blue"
1150 plot x,i+3, "green"
1200 pause 50
1300 rem ora eseguo la RETURN e ritorno all'istruzione immediatamente successiva alla GOSUB
1400 return