Imparare a programmare partendo da zero

Numeri
Come nasce un programma? Dalla necessit di risolvere un problema. Non un problema qualunque, per, ma un problema riguardante dei dati; perch un computer, infatti, per quanto potente possa essere, sar sempre e comunque solo un calcolatore. Il simulatore di volo pi realistico, l'ultima versione di Fifa 2036, il pi complesso dei programmi di grafica, tutti quanti non fanno altro che manipolare numeri. Sta al progammatore attribuire uno specifico significato a quei numeri. E qui entrate in scena voi.

Per poter scrivere un programma, bisogna seguire questi passi:
-individuare il problema da risolvere
-analizzare il problema
-scomporlo in sotto-problemi pi semplici, a loro volta da scomporre e riscomporre successivamente, fino a ridursi a tantissimi, piccolissimi, semplicissimi problemi, rappresentati da operazioni tra numeri 
-escogitare un modo per mettere nella memoria del computer questi numeri 
-insegnare al computer a risolvere ognuno di quei singoli problemi
-ordinare al computer di mostrare il risultato finale
Tutto questo perch a un computer non importa se deve fare tantissime operazioni ( il suo mestiere...), gli importa solo che le operazioni siano semplici: per un computer sar semplicissimo prendere un miliardo di numeri, dividerli tutti per due, e stamparli sullo schermo, mentre noi ci metteremmo una vita. Mentre per noi sar semplicissimo riconoscere la faccia di un nstro amico su una foto, ma provate a "dire" al vostro PC di fare altrettanto: DOVE glielo dite? In una fessura del monitor? :-) COME glielo dite? Scrivete con la tastiera "Chi  questo tizio?" E lui come fa a vedere la foto? Col monitor?!? Con uno scanner? E come diciamo al computer di leggere e interpretare la foto che  nello scanner?!?
Niente da fare. 
Ci vuole UN PROGRAMMA.

Proviamo a scriverlo, questo programma. Non pretenderemo di insegnare al PC a riconoscere una persona da una foto (migliaia di provetti programmatori cercano di insegnarglielo da anni, ma ancora con scarsi risultati, nonostante quanto si vede nei film); ci limiteremo a insegnargli a riconoscere se una figura  un quadrato oppure no.

Abbiamo dunque identificato il problema: riconoscere se una figura  un quadrato. Ora analizziamolo:
-un quadrato  un poligono, ossia una figura formata da linee che uniscono dei punti;
-il quadrato ha, in particolare, 4 linee che uniscono 4 punti;
-ancora pi in particolare, le 4 linee hanno la stessa lunghezza;
-una lunghezza pu essere espressa sotto forma di numero: CI SIAMO! Siamo riusciti a tradurre il nostro problema grafico in un problema di numeri!
Bene, e adesso?
Il nostro programma dovr essere usato da un utente; questi fornir al programma dei dati (INPUT), e si aspetter dei risultati (OUTPUT).
INPUT: come vogliamo inserire i nostri dati? Graficamente (disegnando un poligono), o numericamente (scrivendo le coordinate dei vertici)? "Graficamente", direte voi,  pi semplice. Perfetto:  pi semplice PER L'UTENTE, ma di conseguenza pi complicato PER VOI CHE PROGRAMMATE. Delle due l'una, non ci sono altre possibilit: il computer  solo un velocissimo imbecille che sa solo fare bene i conti, per cui "qualcuno" deve abbassarsi al suo livello e "parlare per numeri". Normalmente se ne occupa il programmatore, cosicch l'utente ignorante deve solo cliccare qualche pulsante per ottenere i risultati voluti; ma, nel caso che stiamo trattando voi, gli ignoranti... be', siete voi, che ancora IGNORATE come si fa a programmare, per cui lasciamo un po' di lavoro da fare anche all'utente finale, che dovr inserire a mano le coordinate: per voi sar pi semplice scrivere il programma.

Come immetter l'utente i dati nel programma? Scrivendo dei numeri. Dove? Dentro delle caselle di testo. Quante saranno queste caselle? Quattro? Troppo facile, cos il programma dovrebbe solo calcolare quanto sono lunghi i lati... Predisponiamo allora 6 caselle. Siccome il programma che scriveremo sar molto elementare, dovremo per fargli dare per scontato almeno alcuni dati: ad esempio, le coordinate che inseriremo saranno dei vari vertici presi in senso orario, anzich a caso; cos il programma non dovr controllare quali vertici sono pi vicini tra loro, se per sbaglio tre vertici sono allineati, ecc. Il programma sapr cio a priori che i dati inseriti si riferiscono a un poligono "normale" (regolare o no, lo calcoler lui), cio senza righe che si incrociano, o vertici sovrapposti.
Non sapendo a priori di quanti vertici  dotato il poligono, come far il programma a sapere quando l'utente ha finito di inserire i dati? Certo NON quando tutte le caselle sono piene (senn avremmo sempre un esagono). Prepareremo allora un pulsante, che l'utente premer quando vorr avviare l'elaborazione.
Ok, e il risultato? Dove lo scriviamo? Dentro a un'etichetta, che inizialmente conterr la scritta "[non calcolato]". Una volta premuto il tasto, essa verr sostituita con "quadrato" se  il caso, altrimenti.... sta a noi decidere se visualizzare un semplice "non  un quadrato", oppure "triangolo", "pentagono" ecc..., nel qual caso per dovremo insegnare al programma anche a riconoscere altri poligoni.

Perfetto, ora abbiamo tutto: il problema  analizzato e scomposto, sappiamo come riconoscere un quadrato (il procedimento usato da un programma per fare una cosa  detto, genericamente, algoritmo), abbiamo la nostra interfaccia (l'insieme di caselle di testo, pulsanti e etichette, che ci permette di inserire dati e vedere i risultati): non ci resta che implementare il nostro algoritmo, cio scrivere un programma che faccia quello che abbiamo progettato.
Lo faremo usando il linguaggio wxBasic.

Come si fa a scrivere un programma? Si prende un editor di testi, e si scrivono le istruzioni che lo compongono. Poi si fa elaborare questo elenco di istruzioni, chiamato codice sorgente, a un programma, che tradurr a sua volta il nostro sorgente facendolo diventare un programma. Quindi: il codice sorgente viene "trasformato" in un programma. Ma perch? Perch, come detto all'inizio, il computer capisce solo i numeri, mentre noi scriveremo il nostro programma usando parole: bisogner che qualcuno traduca queste parole in numeri che il computer possa capire. Questo "traduttore"  un programma che IMPLEMEMTA un linguaggio: un linguaggio che pu essere il C, il Pascal, il Basic, il Perl, quello che volete, ma sempre e comunque basato su parole: il "traduttore" legger il nostro sorgente, riconoscer le parole del linguaggio che abbiamo scelto, e le trasformer in numeri comprensibili dal computer. Dovremo quindi stare attenti a "dare in pasto" a un "traduttore" un sorgente scritto nel giusto linguaggio: inutile passare un sorgente BASIC a un "traduttore" Pascal, vedrebbe soltanto errori, ovviamente!

Parlando pi propriamente: non si dice, in realt, "traduttore"; possiamo avere interpreti  o  compilatori. Non ci addentreremo in spiegazioni complicate: qui basti sapere che il BASIC  un linguaggio interpretato, quindi chiameremo wxBasic "interprete" (anche se non  esattissimo, perch wxBasic si basa su bytecode). Tra parentesi, BASIC  una sigla che sta per Beginner's All Purpose Symbolic Instruction Code, ossia Codice a istruzioni simboliche adatto a tutti gli scopi, per principianti. Fatto apposta per voi, dunque. ;-)

Per ottenere il nostro programma a partire dal sorgente in wxBasic, quindi, dovremo passare al nostro interprete il sorgente, il quale avr estensione WXB , per convenzione. Come si fa? O si scrive da linea di comando
wxbasic nomesorgente.wxb
oppure si trascina col mouse il sorgente sull'eseguibile wxbasic.exe .
In entrambi i casi, trattandosi di un interprete, il programma risultante (i numeri equivalenti alle parole che noi avevamo scritto) non verr scritto in un file, ma solo conservato in memoria, e cancellato al termine dell'esecuzione. E per possibile ottenere anche un programma stand-alone, che cio "funziona da solo", senza dover ogni volta passare il sorgente a wxbasic. Per farlo, si usa il programma BIND che trovate insieme a wxbasic, o in versione migliorata sul mio sito (http://www.geocities.com/lcassioli/wxbasic/).
(Nel caso si usasse invece un compilatore come il C o il Pascal, si otterrebbe direttamente un file eseguibile.)

Per evitare di dover usare un editor di testi per scrivere, e dover poi passare il sorgente all'interprete/compilatore, spesso i programmatori usano gli IDE (Integrated Development Environment, ambienti di sviluppo integrati): si tratta di editor di testi "evoluti", che alla semplice pressione di un pulsante passano il sorgente all'interprete/compilatore, ed eseguono il programma risultante. Comodissimo ma... wxBasic non ha un suo IDE: ce ne sono diversi in giro per la rete, pi o meno stabili. Io personalmente uso l'editor di testi ConTEXT opportunamente configurato (vedi mio sito).

Bene, questo  tutto: ora sapete tutto quello che c' da sapere per scrivere il vostro programma sui quadrati. Non vi resta che studiarvi il listato commentato, copiarlo nel vostro editor di testi preferito, provarlo, modificarlo, aggiustarlo, storpiarlo, ecc. ecc..., finch non diverrete padroni di wxBasic.

Happy Programming,
Luca Cassioli
cassioli@iol.it

----------------
Programma per quadrati; ritagliarlo e incollarlo in un file vuoto, salvare in un file con estensione WXB, ed eseguire con wxBasic


'Programma didattico per il riconoscimento dei poligoni
'Linguaggio: wxBasic - Autore: Luca Cassioli - Anno: 2004

'**********
'   NOTA
'**********
'Qualunque linguaggio di programmazione  dotato di ALMENO una
'(ma spesso 2 o 3) istruzione di COMMENTO: qualunque cosa segua
'questa istruzione, viene IGNORATO dall'interprete/compilatore,
'e serve solo al programmatore per descrivere il funzionamento
'del programma. In wxBasic, il "comando"  un semplice APOSTROFO,
//ma si pu anche usare il simbolo "//", come in questa riga, oppure
rem mettere la parola REM (REMark=commento) all'inizio

'----------  INIZIO INTERFACCIA GRAFICA -----------
'"Nothing" indica il "controllo-padre" da cui l'oggetto-finestra
'dipende: ogni oggetto deve avere un oggetto-padre, da cui dipende,
'chiamato genericamente "parent" (genitore, in inglese).
'Nelle versioni precedenti di wxBasio, al posto di "Nothing" si
'usava "Null!.
'La finestra non ha identificatore (-1), ha titolo "Poligoni", 
'e' posizionata alle coordinate (10,10) dello schermo, e' larga 
'320 pixel e alta 200, ha il titolo (caption) visibile (attributo wxCAPTION)
'e il menu di sistema  visibile (attributo wxSYSTEM_MENU) .
frame=new wxFrame(Null,-1,"Poligoni",wxPoint(10,10),wxSize(320,200),wxCAPTION|wxSYSTEM_MENU)

'Il pannello che fa da sfondo (e da "padre") a tutti i 
'successivi controlli ha per "parent" la finestra 
'principale. Senza parametri, la occupera' per intero.
panel=new wxPanel(frame,-1)

'Definiamo le 4 coppie di caselle di testo (wxTextCtrl) che
'conterranno le coordinate dei vertici.
'Ognuna di esse conterra' PER DEFAULT (cio come valore standard,
'definito PRIMA di qualsiasi intervento dell'utente sul programma)
'il valore -1.
vert1x=new wxTextCtrl(panel,-1,"-1",wxPoint(10,10),wxSize(40,20))
vert1y=new wxTextCtrl(panel,-1,"-1",wxPoint(60,10),wxSize(40,20))

vert2x=new wxTextCtrl(panel,-1,"-1",wxPoint(10,40),wxSize(40,20))
vert2y=new wxTextCtrl(panel,-1,"-1",wxPoint(60,40),wxSize(40,20))

vert3x=new wxTextCtrl(panel,-1,"-1",wxPoint(10,70),wxSize(40,20))
vert3y=new wxTextCtrl(panel,-1,"-1",wxPoint(60,70),wxSize(40,20))

'Nella casella successiva non mettiamo nessun valore al
'momento della creazione, ma  lo facciamo con una
'istruzione successiva (tanto per capire come funziona).
vert4x=new wxTextCtrl(panel,-1,"",wxPoint(10,100),wxSize(40,20))
vert4y=new wxTextCtrl(panel,-1,"",wxPoint(60,100),wxSize(40,20))

vert4x.SetLabel("-1")
vert4y.SetLabel("-1")

'Definiamo il pulsante che fa eseguire l'elaborazione
pulsante=new wxButton(panel,-1,"ELABORA!",wxPoint(200,50),wxSize(80,80))

'Mostriamo la finestra
frame.Show(True)
'---------- FINE INTERFACCIA GRAFICA ----------


'----- PROGRAMMA -----
'La procedura  "vai" viene eseguita quando si preme il pulsante:
'questo perche' il pulsante e'  COLLEGATO alla procedura tramite
'il comando CONNECT alla fine del programma.
sub vai( event )
   'Il valore contenuto in una casella di testo e' di tipo STRINGA,
   'cio  un TESTO: possiamo trasformarlo in un NUMERO con la
   'funzione VAL() . Per estrarre il valore dalla casella, usiamo
   'il METODO GetLineText(0) dell'OGGETTO di tipo wxTextCtrl .
   'Notare che con i ":" (due punti) si possono concatenare pi istruzioni
   'sulla stessa riga.
   x1=val(vert1x.GetLineText(0)) : y1=val(vert1y.GetLineText(0))
   x2=val(vert2x.GetLineText(0)) : y2=val(vert2y.GetLineText(0))
   x3=val(vert3x.GetLineText(0)) : y3=val(vert3y.GetLineText(0))
   x4=val(vert4x.GetLineText(0)) : y4=val(vert4y.GetLineText(0))

   'Ora abbiamo in x1, y1 eccetera le coordinate dei vari vertici.
   'Come si calcola la lunghezza di un lato compreso tra due vertici?
   'Con la FORMULA MATEMATICA della distanza tra due punti: in linguaggio
   '"umano" si direbbe pressappoco cos:
   'distanza =
   'radice_quadrata_di (
   '  (differenza_coordinate_x al quadrato) + (differenza_coordinate_y al quadrato) 
   '  )
   'In wxBasic, la radice quadrata si indica con sqr(), e il quadrato di 
   'un numero X si scrive X^2 , perci, se le coordinate dei due vertici
   'sono nelle variabili x1, y1 e x2, y2, abbiamo:
   ' distanza=sqr((x1-x2)^2+(y1-y2)^2 )
   'Nel nostro programma scriveremo quindi:
   lato1=sqr((x1-x2)^2+(y1-y2)^2)
   lato2=sqr((x2-x3)^2+(y2-y3)^2)
   lato3=sqr((x3-x4)^2+(y3-y4)^2)
   lato4=sqr((x4-x1)^2+(y4-y1)^2)

   '(Inserire qui sotto l'istruzione print lato1,lato2,lato3,lato4
   'se si vuole vedere quanto valgono i lati.)
   

   'Per essere un quadrato, deve avere i 4 lati uguali: mostriamo
   'un altro messaggio:
      if (lato1=lato2) and (lato2=lato3) and (lato3=lato4) then
         wxMessageBox("Il poligono  un quadrato!")
      end if
   'Il blocco di istruzioni sopra  molto particolare, perch mostra l'uso
   'degli OPERATORI LOGICI (AND, OR, NOT):
   'Il blocco IF fa visualizzare il messaggio solo se e' vero che lato1=lato2
   'E che lato2=lato3 E che lato3=lato4 , cio se le tre condizioni sono TUTTE
   'vere. IN TEORIA, usando wxBasic si poteva scrivere anche
   'if lato1=lato2=lato3=lato4 eccetera ,
   'MA non tutti i linguaggi, in genere, permettono questa forma, quindi
   ' meglio non abituarsi ad usarla.
end sub


'Per finire, colleghiamo l'interfaccia al programma, con l'istruzione
'CONNECT che segue:
connect (pulsante,wxEVT_COMMAND_BUTTON_CLICKED,"vai")

