La automazione

Dalle macchine semplici alle macchine programmabili

Scheda 4

Suoni e immagini al calcolatore - Sottoprogrammi

0.    Introduzione

1.    Segnali analogici e segnali digitali

2.    Suoni

3.    Grafica

4.    Variabili indiciate

5.    Sottoprogrammi

6.    Ancora sulla grafica

7.    Esercizi

0. Introduzione

     Abbiamo visto come impiegare il calcolatore, mediante un linguaggio di programmazione, per elaborare numeri e informazioni scritte: abbiamo considerato le istruzioni input, print, … (o readln, write, …), l'uso di variabili numeriche e di variabili stringa, l'uso di funzioni (+, *, …, sqr, mid$, …).

     Ma il calcolatore può anche produrre immagini (da figure geometriche a "cartoni animati") e musica (dal "beep" a brani musicali).

     Per affrontare questi aspetti dobbiamo innanzitutto approfondire lo studio dei segnali (ÆGli oggetti matematici), che abbiamo iniziato nella scheda 1 di questa unità didattica.

1. Segnali analogici e segnali digitali

     Ascoltando un brano musicale, indubbiamente, non lo percepiamo come una messaggio costituito da una sequenza di segnali digitali, come, invece, accade per un messaggio in codice morse (beep, beeeep, beeeep, beep, …). Eppure si parla anche di musica digitalizzata. Perché?

     Il suono può essere descritto come una massa d'aria (o di altri mezzi, ad esempio l'acqua) che oscilla e propaga questa oscillazione nello spazio.   Per un'analogia si pensi a due persone, A e B, che tengano per i

due capi una corda (Æfigura a lato): ogni volta che A muove rapida-mente, in su e in giù, la mano, sulla corda si forma un'onda che si spo-sta fino ad arrivare alla mano di B, che percepisce un impulso che tende a fargli muovere la mano. La corda non avanza, ma, comunque, trasmet-

te dell'energia meccanica. Un fenomeno simile è quello delle onde del mare.

     Venendo al suono, consideriamo ad esempio un tamburo: un colpo sulla membrana la fa oscillare; ogni oscillazione della membrana genera un'oscillazione nello strato d'aria immediatamente vicino, il quale a sua volta genera un'oscillazione in un successivo strato d'aria, e così via. Queste oscillazioni che si propagano nello spazio vengono dette onde sonore. A differenza dal caso della corda, che oscilla verticalmente, in su e in giù, perpendicolarmente alla direzione di avanzamento, nel caso del suono gli strati d'aria oscillano avanti e indietro, nella stessa direzione in cui avanzano le onde.

     Le onde sonore che costituiscono la voce umana sono provocate dalle corde vocali, cioè da due legamenti, posizionati più o meno all'altezza del pomo d'Adamo, che, chiudendo e aprendo ripetutamente la laringe, fanno variare il flusso d'aria che esce.

     Come udiamo? Le onde d'aria (o d'acqua se fossimo immersi in mare) che ci arrivano fanno oscillare la membrana del nostro orecchio (timpano) con gli stessi intervalli di tempo tra un'oscillazione e la successiva che avevano in origine (ad es. con gli stessi intervalli di tempo che vi erano tra le vibrazioni del tamburo o tra le chiusure della laringe da parte delle corde vocali).

E` così che percepiamo la sensazione dei suoni.

     Nel caso delle conversazioni al telefono, co-me avviene la trasmissione delle onde sonore?

     Abbiamo già osservato, nella scheda 1, che i messaggi orali vengono trasformati in segnali elettrici. Vediamo meglio come ciò accade.

     Il trasmettitore (la parte della cornetta in cui si parla) è dotato di una membrana che, come il nostro timpano, oscilla sotto la pressione delle onde sonore; vi è poi un dispositivo che al variare della posizione della membrana  fa  variare  la tensione del-la corrente elettrica che circola in uno dei due fili passanti per il cavo.

figura 1

 

     In questo modo le onde sonore vengono trasformate in onde elettriche. Il ricevitore (la parte della cornetta da cui si ascolta) è dotato anch'esso di una membrana. In questo caso interviene un dispositivo che, al variare della tensione della corrente elettrica che arriva dall'altro filo del cavo, fa oscillare con gli stessi intervalli di tempo la membrana producendo onde sonore.

     Il procedimento descritto è simile a quello già visto (Æscheda 1, p.16) per trasformare segnali digitali in segnali elettrici.   In quel caso la tensione elettrica poteva assumere solo un insieme fissato di tensioni, e

figura 2

il suo grafico in funzione del tempo assumeva un andamento a scatti.

   La figura 2 è riferita alla rappresentazione di segnali Morse. Man mano che trascorre un millisecondo la tensione cambia.  La tensione V1 rappre-senta "punto"; la tensione V2 rappresenta "linea". Il grafico corrisponde, quindi, a " ".  Corrisponderebbe a "01101" se ci si riferisse a segnali codificati in bit.

     La figura 3 presenta vari esempi di segnali:

  gli esempi A sono segnali con cui può venire comunicata una temperatura,

  gli esempi B sono segnali per rappresentare lo scorrere del tempo,

  gli esempi C sono due diverse raffigurazioni di un brano musicale: un pezzo di spartito e il grafico del segnale elettrico  - tensione (in volt) al variare del tempo (in millisecondi) -  che corrisponde a una esecuzione dello stesso pezzo con un particolare strumento musicale,

  gli esempi D sono rappresentazioni della rotazione di un certo oggetto mediante due diversi contagiri.

     I segnali A1, B1 e D1 sono costituiti da simboli (cifre) disposti in modi opportuni, cioè sono segnali digitali.

     Anche l'usuale scrittura della musica su uno spartito (ÆC1) è di tipo digitale: si impiega un insieme finito di simboli che vengono posti uno a destra dell'altro, a una quota scelta tra un numero finito di quote possibili  (i simboli possono essere su una riga o tra due righe, e le righe possibili sono in quantità finita). Le quote, come sai, rappresentano le note. Rappresentando le varie quote, ad esempio, con dei numeri interi possiamo ricondurci a una sequenza di simboli concatenati sulla stessa riga.

     È digitale anche il codice a barre che è presente sui prodotti in vendita in su-permercati, farmacie,… e che viene letto con penne ottiche o altri dispositivi  collegati alle casse e a calcolatori che tengono aggiornata la contabilità della merce venduta e presente. Non è altro che una particolare codifica dei numeri con cui sono classificati i vari prodotti (quando il dispositivo ottico non riesce a leggere il codice, il cassiere introduce direttamente i numeri mediante la tastiera).

     I segnali A2,…, D2 appaiono come fenomeni fisici  (una colonnina di mercurio che cambia lunghezza, lancette che ruotano, il variare di una tensione elettrica, un indice che scorre lungo un'asta graduata)  che variano con continuità, senza scatti:

   osservando la temperatura ambientale indicata in forma digitale mediante un'insegna al neon (Æfig.3, A1) o la temperatura corporea indicata da un termometro a lettura digitale, spesso capita una situazione di instabilità: la misura visualizzata salta ripetutamente da un valore all'altro, ad esempio passa da 16° a 17°, poi a 16°, poi a 17°, …; ciò accade se la temperatura è a metà strada tra 16° e 17° e subisce delle picco-lissime variazioni;

     invece, in un termometro a colonnina di mercurio (Æfig.3, A2) non si verificano scatti: la lunghezza della colonnina varia con continuità, come la temperatura: una piccola oscillazione di questa fa variare di poco la lunghezza della colonnina, mentre nel termometro digitale o lascerebbe immutato il valore visua-lizzato o lo farebbe aumentare di colpo di un grado;

   allo stesso modo nel contagiri D2 l'indice sulla scala graduata cambia posizione alla più piccola rotazio-ne dell'oggetto di cui si contano i giri, non solo al compimento di un giro completo, come fa D1.

   I grafici nella figura 4 rappresentano la relazione tra rotazione dell'oggetto (asse orizzontale) e cambiamento del segnale (asse verticale) nei casi D1 e D2. E` evidenziata in particolare la situazione in cui l'oggetto sta completando il 5° giro. Quale dei due grafici si riferisce al contagiri D1? Quale al contagiri D2? Perché?

figura 4         

     Segnali come A2 e D2, che rappresentano un fenomeno che varia nel tempo mediante un altro fenomeno che può variare con continuità nel tempo, non solo a scatti, vengono detti segnali analogici. La parola ricorda che si tratta di segnali che rappresentano il fenomeno originale (la variazione della temperatura, la rotazione dell'oggetto) mediante un fenomeno analogo (la variazione della lunghezza della colonna di mercurio, lo spostamento dell'indice).

     Gli orologi che visualizzano le ore mediante cifre (14:18, 14:19, 14:20, …) vengono detti digitali (Æfig.3, es. B1), quelli che rappresentano il fluire del tempo mediante la rotazione delle lancette vengono detti analogici (ÆB2). In realtà negli orologi analogici le lancette si spostano a scatti, ma in genere si tratta di scatti di ampiezza molto piccola, così che all'occhio umano il movimento sembra continuo.

   Indica qualche strumento di misura di uso comune (presente in casa o nelle automobili o nei negozi o …) di cui sono diffusi sia modelli digitali che modelli analogici.

2. Suoni

 

     Come è possibile rappresentare un brano musicale, che è un suono che varia con continuità, mediante uno spartito musicale, che è di tipo digitale?

    La musica è un suono particolare, costituito da una successione di note, cioè piccoli suoni dalle oscillazioni regolari.

    Consideriamo uno strumento musicale molto semplice, costituito da una lamella metallica fissata per un'estremità a un supporto. Se spostiamo e rilasciamo l'estremità libera della lamel-la, questa si mette a oscillare con frequenza presso che costante, producendo un suono che, trasformato in segnale elettrico, è rappresentabile graficamente come segue (Æfigura 5):

 

     Vediamo come "leggere" il grafico del segnale elettrico per dedurre le caratteristiche dell'onda sonora prodotta dalla lamella:

   ogni 3.2 ms, circa, l'andamento del grafico si ripete allo stesso modo; ciò corrisponde al fatto che in 3.2 ms la lamella compie un ciclo, cioè compie una oscillazione completa, che poi ripete immediatamente dopo allo stesso modo; la durata di un ciclo viene chiamata periodo;

   quindi in 1 secondo (=1000 ms) la lamella compie 1000/3.2=310 (circa) cicli; si dice, perciò, che il fenomeno si ripete con una frequenza  di 310 cicli al secondo;

   ogni 1.6 ms il grafico attraversa la retta tratteggiata; ciò corrisponde ai passaggi della lamella per la "posizione di riposo", cioè per la posizione in cui resterebbe se non venisse sollecitata;

   l'ampiezza dell'intervallo costituito dai valori assunti dalla tensione dipende dall'ampiezza dell'oscilla-zione della lamella; se, all'inizio, avessimo spostato maggiormente la lamella dalla posizione di riposo, avremmo ottenuto un grafico con ampiezza maggiore.

     Dal periodo (la durata dei ciclo), ovvero dalla frequenza (cioè il numero di cicli al secondo) del fenomeno, dipende la altezza dell'effetto sonoro: maggiore è la frequenza con cui vibra la lamella (ovve-ro, minore è il tempo che impiega a compiere una oscillazione) più acuto è il suono.

     Invece dall'ampiezza dell'oscillazione dipende l'intensità dell'effetto sonoro: maggiore è l'ampiezza, maggiore è il volume del suono.

     Si può verificare che facendo oscillare la lamella con un'ampiezza diversa cambia solo il volume del suono prodotto, non la sua altezza, cioè la frequenza delle oscillazioni: questa dipende solo dalle caratteri-stiche (materiale, lunghezza, spessore, …) della lamella.   Per esempio se, suonando un'armonica a bocca, soffio, nella stessa posizione, man mano più forte, ottengo sempre la stessa nota, anche se a un volume diverso: la lamella in corrispondenza della quale soffio vibra sempre con la stessa frequenza.

     In realtà, dopo la sollecitazione iniziale, l'ampiezza delle oscillazioni della lamella man mano diminui-sce. Invece non si modifica sensibilmente il tempo che la lamella impiega a compiere una oscillazione com-

pleta: il suono diminuisce in volume ma non cambia in altezza.

     Tuttavia questo smorzamento è "lento": il grafico corrispondente (figura a lato) non è altro che un grafico che si ripete periodicamente (come in fig.5) deformato mediante una pro-gressiva riduzione della variazione verticale.

     Un  suono  che  corrisponde  a  un  grafico  pe-

riodico o "periodico-smorzato" viene detto nota.   Estendiamo anche al caso dello "smorzamento" il con-cetto di frequenza, anche se, a rigore, il fenomeno non si ripete esattamente allo stesso modo.

     Gli strumenti musicali "meccanici" (a percussione, a fiato, …) producono note con smorzamento. Solo con strumenti elettronici, in cui le onde sonore sono prodotte da dispositivi alimentati elettricamente, si possono produrre anche note non smorzate.

   Nelle sirene le onde sonore sono prodotte soffiando aria contro un disco ruotante dotato di fori. Aumen-tando la velocità di rotazione il suono diventa più acuto.  Sotto sono rappresentati graficamente i segnali elettrici relativi a suoni ottenuti con un dispositivo che, come le sirene,  può produrre onde sonore di altezza

variabile.

    In quale caso la sire-na genera un suono man mano più acuto?

    Perché?

     Un brano musicale viene eseguito facendo susseguire suoni rappresentabili con note. Questa sequenza di note, le loro durate, le pause sono codificate sullo spartito.

     Se lo stesso brano musicale viene eseguito al pianoforte o alla chitarra, comprendiamo che si tratta dello stesso pezzo, anche se il suono prodotto nei due casi è diverso: in corrispondenza della stessa nota la corrispondente corda del piano e quella della chitarra vibrano con la stessa frequenza, ma in modo diverso: ciascuno strumento dà una sua "impronta" (o timbro) alla nota.

     In figura 6 è rappresentata, sotto forma di segnale elettrico, una nota la dalla frequenza di 440 cicli al secondo prodotta da due diversi strumenti musicali.

     Un rumore è un suono che produce sensazioni sgradevoli. Il grafico corrispondente ha una forma "brutta", priva di regolarità.

     Le note "fondamentali" utilizzate dagli strumenti musicali hanno le frequenze seguenti (Hz sta per hertz, unità di misura che indica la frequenza di 1 ciclo al secondo: 5 Hz sta per 5 cicli al secondo; fra parentesi abbiamo indicato la notazione anglosassone delle note):

DO (C)     261.6 Hz              RE (D)      293.7 Hz              MI (E)     329.6 Hz              FA (F) 349.2 Hz

SOL (G)   392.0 Hz              LA (A)      440.0 Hz              SI (B)       493.9 Hz

     Sono DO anche i suoni con frequenza (in Hz) 261.6/2, 261.6/4, 261.6/8, … e 261.2, 261.4, 261.8, … ; considerazioni analoghe valgono per RE, MI, … . Ogni gruppo di note, da un DO al DO successivo (escluso) costituisce una ottava.

     L'ottava sopra descritta corrisponde alla parte centrale della tastiera di un pianoforte.

     Il linguaggio di programmazione QB è dotato dell'istruzione sound:

SOUND frequenza, durata

la cui esecuzione produce un suono che ha frequenza come valore della frequenza in Hz e durata come tempo in U per cui dura il suono, dove 1 U = 1 sec/18.2, cioè tale che 1 sec = 18.2 U.

     Questo suono non è "piacevole" come quello di uno strumento musicale.   Il grafico del segnale elettrico

corrispondente è infatti simile a quello a lato.

     E` come il suono prodotto da un pistone che varia a scatti tra due posizioni.

   (A)  Scrivi un programma che produca la "scala musicale" do-re-…-do dal do dell'ottava sopra descritta al successivo con durata di 1 sec per ciascuna nota.

         (B)  Con un opportuno programma, con un "sistematico" procedimento per tentativi,  trova la tua banda dell'udibile, cioè l'intervallo delle frequenze dei suoni che riesci a percepire [accontentati, per i valori estremi della banda, di due cifre significative].

         (C)  Esamina l'help del QB sull'istruzione SOUND (e, se sei in DOS, sull'istruzione PLAY) e, copiatili nella finestra di lista, esegui i programmi indicati come esempio.

     Un suono può essere riprodotto fedelmente non solo mediante segnali elettrici, ma anche con altri feno-meni che varino con continuità, cioè con altri tipi di segnali analogici. Ad esempio può essere rappresentato su un nastro magnetico: le variazioni nel tempo della tensione elettrica (che traducono le vibrazioni della membrana del microfono) mediante un opportuno dispositivo vengono trasformate in variazioni del livello di magnetizzazione lungo il nastro che scorre. In modo analogo vengono registrati su un floppy-disk da un computer i segnali elettrici che rappresentano sequenze di bit [Æscheda 1 di questa u.d.].

     Come è possibile riprodurre fedelmente un suono sotto forma di segnali digitali? Vediamo in un modo un po' semplificato come può essere realizzata la digitalizzazione (cioè la trasformazione in segnale digitale) di un suono.

     Il segnale elettrico che traduce analogicamente il suono può essere "tabulato" (cioè descritto mediante una tabella di dati): ad esempio si può registrare ogni decimillesimo di secondo la tensione elettrica corrispondente e codificare il suono mediante la sequenza dei numeri che rappresentano queste misure.

     Esistono delle tecniche e dei metodi matematici che, data la sequenza di numeri che corrisponde alla tabulazione di un segnale elettrico analogico, permettono di costruire automaticamente una "curva" che sia vicina al grafico originale. In questo modo è possibile ricostruire (a partire da queste informazioni digitali approssimate) suoni che siano il più possibile fedeli ai suoni originali.

   La tabella seguente riporta la sequenza di numeri con cui è stato codificato un suono: sono le misure (in volt, arrotondate ai decimi) della tensione che aveva il segnale elettrico corrispondente al suono in istanti successivi distanziati di un decimillesimo di secondo (10-4 sec) l'uno dall'altro. Si tratta dell'esecuzione di una nota musicale. Completa la rappresentazione grafica delle diverse tensioni riportate nella tabella e cerca di tracciare una curva "liscia" che tocchi tutti i punti. Cerca poi di individuare se si tratta di un la con una frequenza di 440 vibrazioni al secondo o di un fa con la frequenza di 349.

 

3.6

4.1

4.5

4.9

5.2

5.4

5.5

5.4

5.3

5.0

4.7

4.2

3.7

3.2

2.6

2.1

1.6

1.2

0.9

0.6

0.5

0.5

0.6

0.9

1.2

1.6

2.2

2.7

3.2

3.7

4.2

4.7

5.0

5.3

5.4

5.5

5.4

5.2

4.9

4.5

 

 

 

periodo:

. . . . . . .    ·10-4 sec

 

frequenza:

. . . . . . .   cicli al sec

     In un CD, a differenza di quanto accade in un disco normale o in un nastro magnetico, non viene registrato direttamente il suono, ma viene memorizzata una codifica di una sua tabulazione. Sostanzialmente un CD (Æfigura 7) è un disco che su sottilissime piste circolari concentriche presenta un'alternanza di tratti in rilievo e di zone piane. Per dare un'idea delle dimensioni, si pensi che i rilievi hanno altezza e larghezza dell'ordi-ne di grandezza dei decimi di micron (1 micron - o micrométro - è pari a 10-6m).

     Le piste circolari vengono "lette" con un fascio laser (le zone piane vengono riconosciute sulla base del fatto che sono quelle che riflettono il fascio). Rilievi più lunghi vengono interpretati come 1; rilievi più corti come 0.

figura 7

 

       Un brano musicale può essere registrato sotto forma di una successione di 0 e di 1. Infatti può essere rappresentato con una tabella come quella del quesito 5 e ogni singola misura di tensione - usando una codifica binaria  - può essere rappresentata con una sequenza di 0 e di 1 (ad es.: 0.0Æ0000000, 0.1Æ0000001, 0.2Æ0000010, 0.3Æ0000011, 1.5Æ0001111, 1.6Æ0010000, 1.7Æ0010001, …).

     Alcuni linguaggi di programmazione sono dotati di un'istruzione che consente di dare alle note una "forma" (timbro) diversa rispetto a quella standard (a forma di "onda quadra") con cui le genera l'istruzio-ne sound (o istruzioni simili); questa forma viene descritta mediante una tabulazione, analoga a quella del quesito 5 (nel QB per Mac tale istruzione è WAVE, nel QB per DOS non è presente un'istruzione analoga).

3. Grafica

     Come può produrre immagini un calcolatore? Nella figura 8 è riprodotto lo stato dello schermo di un pocket computer (calcolatore programmabile tascabile) che visualizza una porzione di un grafico: non ab-biamo esattamente una linea retta ma un insieme di quadrettini. Avevamo già fatto un'osservazione analoga in La matematica e i suoi modelli, scheda 1, p.6.

figura 8           

     Un calcolatore può anche produrre immagini più complesse, può memorizzarle su un disco magnetico, trasmetterle o riceverle via cavo da altri calcolatori, … .

     Per fare tutto ciò deve trattare le immagini in forma digitale, l'unica che può comprendere.

     Vediamo come può essere digitalizzata un'immagine in bianco e nero.

     Un modo possibile è il seguente: l'immagine viene scomposta in tanti quadrettini; per ogni quadrettino  si individua il colore prevalente; codificando il bianco con 0 e il nero con 1, possiamo rappresentare l'im-magine come la sequenza dei bit che codificano i colori dei vari quadrettini.

   Supponiamo di rappresentare un'immagine in bianco e nero mediante una griglia di 112 quadretti. Il disegno di una casetta può essere approssimato con la quadrettatura raffigurata a fianco, a destra. Sotto è rappresentato il se-gnale digitale che codifica la quadrettatura.        

         Comprendi come è stata realizzata la codifica e com-pletala (mancano dodici cifre).

 

 

 

 

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

1

0

0

0

0

 

 

0

0

0

0

1

1

0

0

1

0

0

0

0

0

0

1

0

1

0

0

0

1

0

0

 

 

0

0

1

0

0

0

1

0

0

0

1

0

0

1

0

0

1

0

0

1

0

0

1

1

 

 

1

0

0

0

0

0

0

0

1

1

0

1

1

0

1

0

0

0

1

0

1

0

0

1

 

 

1

0

0

0

0

0

0

0

1

1

0

1

1

0

0

0

1

0

0

0

1

0

0

1

 

 

1

0

0

0

1

0

0

0

1

0

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     Se l'immagine fosse a colori, si potrebbe:

   fissare un insieme di colori,

   codificare ogni colore con un numero diverso, che a sua volta può essere codificato in forma binaria,

   per ogni quadrettino della griglia individuare il colore prevalente e scegliere il colore che più gli si avvicina tra quelli fissati.

     In questo modo anche un'immagine a colori può essere codificata in forma binaria.

     Per visualizzare immagini il calcolatore scandisce, in modo analogo, lo schermo in rettangolini ordinati in righe e in colonne, detti "pixel", a ciascuno dei quali associa un bit (o più bit nel caso di schermo a colori) che ne rappresenta il colore. Questa scansione dello schermo non è realizzata allo stesso modo da tutti i computer. Ad esempio i Macintosh scandiscono lo schermo in quadrettini. Gli "Ibm-compatibili" possono scandirlo in modi diversi:

– i modelli più recenti sono in grado di scandire lo schermo in 640¥480 pixel (640 colonne di 480 pixel ciascuna) o 1024¥768 pixel; in questo caso i pixel sono quadrati; infatti il rapporto tra le dimensioni dello schermo degli Ibm-compatibili è 4/3 e 640/480 = 1024/768  = 4/3;

– altri modelli, fuori produzione, scandiscono lo schermo in 640¥350 pixel, altri in 640¥200 pixel; in tali casi i pixel non sono, ovviamente, quadrati; esistono, meno diffuse, anche altre modalità di scansione.

     Per costruire un programma che visualizzi sullo schermo output grafici (punti o figure particolari, "comandabili" con opportune istruzioni "grafiche"), in QB-dos occorre inserire, prima delle istruzioni grafiche, il comando SCREEN TermineNumerico. A seconda del valore di TermineNumerico il calcolato-re sceglie la risoluzione grafica con cui lavorare. Ad esempio:

se TermineNumerico vale 1 la risoluzione è 320¥200, se vale 2 è 640¥200, se vale 9 è 640¥350, se vale 12 è 640¥480 (vedi l'help); i computer più recenti possono scegliere una qualunque tra queste risoluzioni.

     A seconda della risoluzione scelta vengono modificate automaticamente le dimensioni dei caratteri degli output-testo. Se TermineNumerico vale 0 vengono disattivate le capacità grafiche: non si possono più utilizzare le istruzioni grafiche e i testi vengono scritti in modo standard.

     Nel caso dei mac, lo schermo è sempre in modalità grafica.

     Le istruzioni grafiche si riferiscono ai pixel esprimendoli sotto forma di coordinate-schermo,  cioè mediante i numeri d'ordine della colonna e della riga in cui sono collocati; le colonne vengono numerate a partire da sinistra iniziando con il numero 0; analogamente, a partire dall'alto (non dal basso!), vengono numerate le righe. Se si impiegasse uno schermo con risoluzione di 600¥300 pixel il punto in alto a sinistra avrebbe coordinate 0,0 e il punto all'angolo opposto avrebbe coordinate 599,299.

     In QB le istruzioni grafiche di base sono:

PSET (TermineNumerico,TermineNumerico)

LINE (TermineNumerico,TermineNumerico)-(TermineNumerico,TermineNumerico)

     L'azione corrispondente a PSET (a,b) è quella di tracciare il pixel di coordinate a,b (cioè avente per coordinate i valori arrotondati agli interi dei termini a e b). Quella corrispondente a LINE (a,b)-(g,d) è il tracciamento dei pixel consecutivi che congiungono i pixel di coordinate a,b e g,d e che approssimano al meglio un segmento.

    E' possibile impiegare anche istruzioni dalla forma LINE -(a,b): l'effetto è equivalente a quello di LINE (m,n)-(a,b) dove m,n sono le coordinate dell'ultimo pixel tracciato da una precedente istruzione grafica o, in assenza di un tale punto, sono 0,0.

   Che figure tracciano i programmi a lato?

         [nel caso dei Mac la riga 1 non

         deve essere considerata; nel caso

         di vecchi PC potrebbe essere

         necessario camniarla]

[1]

[2]

[3]

[4]

[5]

SCREEN 12

FOR i = 5 TO 20

  PSET (i,i)

NEXT

LINE (20,20)-(35,5)

[1]

[2]

[3]

[4]

[5]

SCREEN 12

PSET (5,5)

LINE -(2,30)

LINE -(20,30)

LINE -(5,5)

Nota.  Forme più generali delle istruzioni precedenti sono   PSET (TermNum,TermNum)[,TermNum]   e LINE [(TermNum,TermNum)]-(TermNum,TermNum)[,TermNum], cioè si può aggiungere:  ,TermNum. A seconda del valore, arrotondato agli interi, di questo termine il tracciamento viene effettuato in un particolare colore; il colore dipende dalla modalità grafica impiegata. Per ulteriori informazioni si rimanda al manuale o all'help.

     Come viene memorizzata una immagine? Può essere memorizzata pixel per pixel oppure se ne possono memo-rizzare solo alcuni punti mediante i quali, con opportuni programmi, si può ricostruire l'intera immagine.

     Ad esempio nel caso della "V" tracciata dal primo pro-gramma del quesito precedente si possono memorizzare in un file le coordinate dei punti: (5,5), (6,6), …, (20,20), (21,19), (22,18), …, (34,6) e (35,5); oppure soltanto quelle dei punti (5,5), (20,20) e (35,5).

     Per vedere l'immagine nel primo caso si dovrà utilizzare un programma che legga dal file le coordinate dei punti e man mano li tracci, nel secondo caso un programma che legga le coordinate dei punti e man mano, in modo simile al secondo programma del quesito 7, li congiunga con dei segmenti.

     Esaminiamo il comportamento di grafun. Abbiamo visto [ÆLe statistiche, scheda 2, §4e§5] che può essere impiegato, oltre che per tracciare grafici di funzioni, anche per rappresentare graficamente sequenze di punti. Le coordinate dei punti possono essere introdotte direttamente dall'utente durante l'esecuzione del programma o possono essere richiamate da un file in cui siano già state memorizzate. Ecco, per es., come richiamare dal directory AUT il file macosa (contenente le coordinate di punti la cui congiunzione dà luogo alla scritta "MaCoSa") e rappresentarlo graficamente:             [i messaggi sono riprodotti semplificati]

     Si ottiene, scegliendo "scala automatica", la figura sotto riportata a sinistra.

                

     Se, invece di "punti congiunti", si sceglie "punti non congiunti":

si ottiene la figura a destra.  Con questa opzione si sarebbe potuta ottenere la nostra scritta solo se, di questa, avessimo registrato nel file non solo le coordinate dei "punti angolosi" ma anche quelle di molti altri punti.

     Per esaminare il file macosa possiamo usare un editor (ÆLa automazione, scheda 3, §3); il nome del file completo è macosa.gfu (l'estensione "gfu" ricorda che si tratta di un file per grafun). La prima riga è il "commento" (preceduto da un apostrofo), che appare quando, da grafun, si importa il file; la seconda riga contiene il numero dei punti; le righe successive contengono le coordinate dei punti.

 


'scritta 'macosa'

 31

 1,1

 1,3

 1.5,2

 2,3

 2,1

 2.5,2

 2.75,1.5

 2.25,1.5

 2.75,1.5

 3,1

 3,3

 3.7,3

 3,3

 3,1

 5,1

 5,2

 4,2

 4,1

 5.2,1

 6,1.67

 5.2,2.33

 6,3

 5.2,2.33

 6,1.67

 5.2,1

 6,1

 6.5,2

 6.75,1.5

 6.25,1.5

 6.75,1.5

 7,1

 


     Questo (commento + numero punti + coordinate dei punti) è il semplice formato per i file che conten-gono sequenze di punti (da rappresentare congiunti o isolati) impiegato da grafun. Altri programmi utilizzano formati diversi, spesso più complessi.

 

Nota.  Si noti che le coordinate memorizzate in macosa.gfu non sono coordinate-schermo: il programma, automaticamente, trasforma tali coordinate in coordinate schermo, nel modo illustrato dalla figura seguente, riferito alla esecuzione su un ibm-compatibile:

   in modo simile a come si fa rappresentando un grafico su carta millimetrata, grafun calcola il rapporto di scala tra le variazioni orizzontali riferite all'intervallo [x1,x2] e quelle riferite al corrispondente intervallo [0, 408] delle ascisse-schermo (la "base" del quadrato di schermo usato per i grafici), poi calcola la ascissa-schermo trasformando x–x1 mediante la moltiplicazione per questo rapporto;

     analogamente procede per le ordinate.

 

   Con grafun realizza la figura a lato importando, prima, i file stivale, sicilia e sardegna.

   

     Usando l'istruzione sound (o istruzioni simili) anche chi non sa suonare uno strumento può far suo-nare al calcolatore un brano musicale di cui abbia lo spartito. Analogamente anche chi non è bravo in dise-gno può costruire figure ricorrendo direttamente a istruzioni grafiche o utilizzando applicazioni già pronte, come grafun o altre più specializzate per la "grafica".

     Le applicazioni per la grafica sono classificabili in due tipi:  di tipo paint (dipinto) o bitmap (mappa di

bit) e di tipo draw (disegno) o vettoriale.

     Le applicazioni "paint" registrano le immagini pixel per pixel, come illustrato nel que-sito 6. Se (con opportuni comandi) traccio un poligono e poi un segmento ottenendo la figura a lato, questa viene identificata con l'insieme dei pixel colorati in nero: non posso più separare segmento e poligono in quanto questi sono stati "fusi" in un'unica figura.

     Con una applicazione "draw", invece, il poligono viene memorizzato non come insieme di pixel, ma con due tipi di informazione: l'informazione che si tratta di un poligono e l'informazione costituita dalla se-quenza delle coordinate dei suoi vertici; analogamente il segmento viene memorizzato attraverso l'infor-mazione che si tratta di un segmento e le coordinate dei suoi estremi; l'intera figura viene memorizzata registrando separatamente le informazioni relative alle due sottofigure, insieme alle informazioni sulle posi-zioni di queste. Se voglio, posso poi posizionare diversamente, l'una rispetto all'altra, le due sottofigure.

     Molte applicazioni integrano una sottoapplicazione "paint" e una "draw". Vari programmi per l'elaborazione di testi contengono sottoprogrammi grafici di tipo paint o draw.

4. Variabili indiciate

     Se "lancio" il programma a lato, e-ventualmente modificando la riga 1 (e-liminandola se uso un Mac), ottengo un triangolo che viene man mano tra-slato di 20 pixel a destra e 9 in basso:

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

SCREEN 2

x(0) = 1: y(0) = 1

x(1) = 30: y(1) = 7

x(2) = 5: y(2) = 40

FOR i = 1 TO 20

   CLS

   PSET (x(2), y(2))

   FOR j = 0 TO 2: LINE -(x(j), y(j)): NEXT

   t = TIMER: WHILE TIMER < t + 1: WEND

   FOR j = 0 TO 2

      x(j) = x(j) + 20: y(j) = y(j) + 9

   NEXT

NEXT

     Le righe 2-4 assegnano le coordinate (schermo) dei vertici del triangolo a un tipo di variabili che non ab-biamo ancora incontrato, x(0), x(1), x(2), y(0), … , che sono una versione per linguaggio di pro-grammazione delle variabili x0, x1, x2, y0, … , cioè di variabili dotate di indici, o variabili indiciate.

     In un linguaggio di programmazione, in cui la scrittura è "a 1 piano", non posso scrivere, per esempio, x e, a un livello più basso, l'indice 0. Quindi l'indice viene messo tra parentesi.

     Questa scrittura corrisponde all'usuale scrittura degli output di una funzione e, in effetti, la scrittura di  x0, x1, …, xn può essere pensata come una abbreviazione di x(0), x(1), …,x(n): x(.) è una funzione che all'indice 0 associa il valore x(0), …, all'indice n associa il valore x(n).

     Le righe 7-8 tracciano, in modo simile al secondo programma del quesito 7, il triangolo di vertici (x(0),y(0)), (x(1),y(1)), (x(2),y(2)):

   prima viene tracciato il punto (x(2),y(2)),                                                                                        [riga 7]

   poi da questo punto viene tracciato un segmento fino al punto (x(0),y(0)),              [riga 8, ciclo con j=0]

   da questo viene tracciato un segmento fino al punto (x(1),y(1)),                              [riga 8, ciclo con j=1]

   da questo viene tracciato un segmento fino al punto (x(2),y(2)).                              [riga 8, ciclo con j=2]

     La riga 9 fa trascorre 1 secondo: il ciclo while-wend viene rieseguito in continuazione fino a che l'orologio non è avanzato di 1 secondo rispetto al rilevamento iniziale.

     Le righe 10-12 aumentano le ascisse di 20 e le ordinate di 9.

     Questa operazione (tracciamento e traslazione) viene ripetuta 20 volte: il for alla riga 5 e il next alla riga 13 fanno percorre 20 volte le righe 6-12.

(A)   Come modificheresti il programma precedente in modo da ottenere – vedi figura a lato – un analogo mo-vimento del quadrangolo ottenuto inserendo il punto x(3),y(3) tra il punto x(2),y(2) e il punto x(0),y(0)?

        (B)   Discutete quando e perché è vantaggioso impiegare variabili indiciate in un programma.

     In QB le variabili indiciate possono essere indicate con un qualunque nome di variabile. Come indici si possono usare sia 0, 1, 2, … che termini numerici: il valore di questi viene automaticamente arrotondato agli interi. Ad esempio se scrivo  w(5/3) QB, durante l'esecuzione, arrotonda 5/3 (=1.66…) a 2 e interpreta w(5/3) come w(2).  I termini usati come indici non devono, comunque, avere valore negativo.

     Un indice al massimo può valere 10, cioè, volendo usare ad esempio la variabile indiciata w(.), posso impiegare w(0),  w(1), …, w(10) ma non w(11). Per utilizzare altri indici deve ricorrere a un'istruzione che "dichiari la dimensione" della variabile, cioè il valore massimo che l'indice può assumere:

DIM Nome(TermineNumerico)

Ad esempio, l'esecuzione di DIM w(20) fa sì che, successivamente, possa essere impiegata la variabile indiciata w(.) con indici compresi tra 0 e 20.

     Posso anche "dimensionare" più variabili indiciate con un'unica istruzione, nella forma:

DIM Nome(TermineNumerico) [,Nome(TermineNumerico)]...

Che cosa "fa" il programma a lato?

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

SCREEN 2

n = 12 : DIM x(n), y(n)

PRINT "Batti le coordinate dei vertici"

FOR i = 1 TO n

   INPUT "x, y"; x(i), y(i)

NEXT

   CLS

   PSET (x(n), y(n))

   FOR j = 1 TO n: LINE -(x(j), y(j)): NEXT

   t = TIMER: WHILE TIMER < t + 1: WEND

   FOR j = 1 TO n

      x(j) = x(j) + 20: y(j) = y(j) + 9

   NEXT

NEXT

Completa le righe 16, 18, 24 e 26 del seguente programma:

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

[15]

INPUT "n. dati (>0)"; n

DIM x(n)

FOR i=1 TO n

  PRINT "dato"; i; : INPUT x(i)

NEXT

10

INPUT "1:max, 2:min, 3:media"; risp

SELECT CASE risp

CASE 1

  max=x(1)

  FOR i=2 TO n

    IF x(i)>max THEN max=x(i)

  NEXT

  PRINT max

CASE 2

[16]

[17]

[18]

[19]

[20]

[21]

[22]

[23]

[24]

[25]

[26]

[27]

[28]

[29]

  min=

  FOR i=2 TO n

 

  NEXT

  PRINT min

CASE 3

  s=x(1)

  FOR i=2 TO n

    s=s+

  NEXT

  PRINT s/

CASE ELSE

END SELECT

GOTO 10

5. Sottoprogrammi

     Il seguente programma permette di calcolare il perimetro di triangoli:

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

PRINT "calcolo perimetro triangolo A-B-C"

via:

INPUT "xA,yA"; xA, yA

INPUT "xB,yB"; xB, yB

INPUT "xC,yC"; xC, yC

dx = xB-xA : dy = yB-yA : AB = SQR(dx*dx+dy*dy)

dx = xC-xB : dy = yC-yB : BC = SQR(dx*dx+dy*dy)

dx = xA-xC : dy = yA-yC : CA = SQR(dx*dx+dy*dy)

PRINT "perimetro ="; AB + BC + CA

GOTO via

     Le righe 6–8, che calcolano le lunghezze dei lati, ripetono la stessa sequenza di operazioni, riferendola man mano a variabili diverse.

     Sarebbe comodo che QB fosse dotato di una funzione DIST(t1,t2,t3,t4) per calcolare automatica-mente la distanza tra i punti (t1,t2) e (t3,t4). Potrei riscrivere la riga 6 così: AB = DIST(xA, yA, xB, yB) e analogamente le righe 7 e 8.

     Non esiste predefinita tale funzione. Posso tuttavia ovviare a ciò costruendo il seguente sottoprogramma ("SUB") Distanza:

SUB Distanza(x1, y1, x2, y2, d)

' sottoprogramma che mette in d la distanza tra P1=(x1,y1) e P2=(x2,y2)

dx=x2-x1 : dy=y2-y1 : d=SQR(dx*dx+dy*dy)

END SUB

e modificando le righe 6-8 nel modo seguente:

[6]

[7]

[8]

CALL Distanza (xA, yA, xB, yB, AB)

CALL Distanza (xB, yB, xC, yC, BC)

CALL Distanza (xC, yC, xA, yA, CA)

     Come procede l'esecuzione del programma quando, alla riga 6, si arriva all'istruzione CALL … ? Viene cercato il sottoprogramma Distanza e, poi, viene eseguito un procedimento che equivale a:

  sostituire nel SUB, temporaneamente, x1, y1, x2, y2, d con, rispettivamente, xA, yA, xB, yB, AB;

  eseguire il SUB così modificato;

  proseguire l'esecuzione del "programma principale" (andando alla successiva riga 7), avendo ora nella variabile AB il nuovo valore calcolato dal SUB.

     Di fronte all'istruzione CALL della riga 7 [della riga 8] il procedimento, analogamente, equivale a:

  sostituire nel SUB x1, y1, x2, y2, d con xB, yB, xC, yC, BC [con xC, yC, xA, yA, CA];

  eseguire il SUB così modificato;

  proseguire l'esecuzione del "programma principale" (andando alla riga successiva), avendo ora nella variabile BC [nella variabile CA] il nuovo valore calcolato dal SUB.

    Le variabili elencate tra parentesi a destra di SUB Distanza vengono chiamate parametri formali (o solo parametri); gli altrettanti termini che vengono elencati tra parentesi nelle istruzioni CALL Distanza vengono chiamati argomenti attuali (o solo argomenti).

    La definizione e l'impiego di un SUB sono analoghi alla definizione e al successivo impiego di un nome di funzione nelle usuali attività matematiche: se definisco f:x  x2+1 e poi scrivo f(5), f(z), f(z+3), …, la x impiegata nella definizione è analoga a un parametro formale, mentre i termini 5, z, z+3, … usati come input di f sono analoghi ad argomenti attuali.

     Per scrivere il SUB, in DOS, si procede così:

   dal menu Modifica (o Edit) si aziona Nuova SUB (o New SUB); (Æfig. a lato)

   compare una finestra di dialogo in cui si batte il nome del SUB (nel nostro caso "Distanza"); (Æfig. sotto a sinistra)

   si apre una nuova finestra predisposta per la scrittura del SUB;                              (Æfig. sotto a destra)

 

   nella nuova finestra mettiamo tra parentesi i parametri (Æfig. sotto a sinistra) e, poi, completiamo il testo del SUB;

   se vogliamo tornare alla finestra del programma principale (che al momento ha ancora come nome "senza titolo" o "untitled"), dal menu Visualizza azioniamo SUBs;            (Æfig. sotto a destra)

         

   compare una finestra di dialogo in cui sono elencati i nomi del programma principale e di tutti i SUB definiti (per aprire la finestra che interessa si può usare il mouse o i tasti-direzionali e il tasto "a capo"). (Æfig. a lato)

   Nel caso del QB per Mac, i SUB vengono scritti nella stessa finestra del programma principale, dopo di questo; nell'intestazione del sottoprogramma occorre aggiungere, in fondo, la parola "static":

SUB Nome(ListaDeiParametri) STATIC

(ciò può essere fatto anche in DOS; in Mac se ne può fare a meno se il programma non viene eseguito dall'ambiente di programmazione ma viene prima tradotto in linguaggio macchina; sul significato di "static" non ci soffermiamo, rinviando, chi è interessato, alla consultazione del manuale)

Facciamo alcune ulteriori osservazioni sui SUB, riferendoci al programma riportato nella pagina seguente:

(1)  Come parametri (nella intestazione di un SUB) e come argomenti corrispondenti (nella "chiamata" di esso) si possono usare anche variabili indiciate: il sottoprogramma POLIG consente di tracciare un poligo-no qualunque le cui coordinate siano state registrate nelle variabili indiciate x(.) e y(.). Per indicare le variabili indiciate (nella intestazione e nelle chiamate – righe 8 e 9) se ne scrive il nome seguito da "()";

(2)  All'interno di un sottoprogramma si possono chiamare altri sottoprogrammi: il sottoprogramma CANC richiama i sottoprogrammi SUONA (che genera un suono composto da due note) e ASPETTA (che fa trascorrere un secondo).

(3)  Alle variabili utilizzate in un sottoprogramma che non compaiono tra i parametri sono assegnati registri di lavoro diversi da quelli assegnati a variabili con lo stesso nome che compaiano nel programma principale o in altri sottoprogrammi:  la variabile i del programma principale (riga 7) e la variabile i del sub POLIG sono considerate diverse nel corso dell'esecuzione;  se così non fosse, dopo ogni chiamata di POLIG la variabile i del ciclo for-next varrebbe sempre 3, e non arriverebbe mai ad assumere il valore 10.

    In altre parole tali variabili sono interpretate non "globalmente", riferendole all'intero programma, ma "localmente", riferendole solo al sottoprogramma. Per questo motivo vengono chiamate variabili locali.

 

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

SCREEN 12   'riga modificabile (da eliminare con un Mac)

n = 3 : DIM x(n), y(n)

x(1) = 50 : y(1) = 50

x(2) = 50 : y(2) = 100

x(3) = 100 : y(3) = 100

t = INT(TIMER)

FOR i = 1 TO 10

  CALL CANC(t) : CALL POLIG(x(), y(), n)

  CALL CANC(t) : CALL POLIG(y(), x(), n)

NEXT

END

SUB POLIG(y(), x(), n)

  PSET (x(n), y(n))

  FOR i = 1 TO n: LINE -(x(i), y(i)): NEXT

END SUB

SUB CANC(t)

  CALL SUONA : CALL ASPETTA(t)

  CLS : PRINT t

END SUB

SUB SUONA

  SOUND 300,2 : SOUND 400,2

END SUB

SUB ASPETTA(t)

  t=t+1 : WHILE TIMER<t : WEND

END SUB

 

Dopo l'avvio del programma lo schermo man mano cambia aspetto. Nella figura seguente sono parzialmente riprodotte le prime due configurazioni assunte dallo schermo (se il calcolatore è acceso da 51475 sec - valore troncato).  Completala rappresentando la due configurazioni successive.

                  

6. Ancora sulla grafica

     Nel QB per IBM-compatibili esistono le istruzioni VIEW e WINDOW che consentono, rispetti-vamente, di definire una finestra per le uscite grafiche e di associare ad essa un rettangolo del piano cartesiano, in modo che nelle istruzioni grafiche (LINE, PSET) si possano impiegare direttamente le coordinate cartesiane: il programma traduttore automaticamente (con un calcolo simile a quello descritto nella nota a pag. 9) trasforma le coordinate cartesiane in coordinate schermo associando il rettangolo-schermo scelto con VIEW al rettangolo cartesiano scelto con WINDOW.

     Esiste anche l'istruzione VIEW PRINT TO che consente di definire una finestra per le uscite alfanumeriche o uscite "testo" (sequenze di lettere, cifre e altri caratteri).

     Spieghiamo l'impiego di queste istruzioni riferendoci al programma seguente:

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

 

     A fianco è rappresentato, parzialmente, lo schermo alla fine dell'esecuzione del programma.

     Nella riga [2], con view, si è definita la finestra grafica specificando le coordinate schermo del vertice in alto a sinistra e del vertice opposto.

     In [4], con window, si è definito il rettangolo di piano cartesiano da associare alla finestra grafica, specificandone le coordinate del vertice in alto a sinistra e del vertice opposto.

     In [5], con view printto …, si sono specificate le righe dello schermo da dedicare alle uscite "testo".

 

Descrivi a parole il significato delle istruzioni [11]-[14].

(1)   Come va modificato il programma per ottenere il grafico della stessa funzione con -5≤x≤20?

    (2)   Come va modificato il programma per ottenere il grafico "a punti congiunti"?

            [riguarda il programma a pag. 10 e i successivi commenti alle righe 7 e 8]

    Osserviamo, ancora, che le istruzioni CLS1 e CLS 2 puliscono, rispettivamente, la finestra-grafici e la finestra-testi. Per ulteriori informazioni su queste e altre istruzioni grafiche (circle, preset, …) rinviamo al manuale o all'help.

    Nel caso del QuickBasic per Macintosh si possono definire più finestre ricorrendo all'istruzione WINDOW NumeroFinestra, [Titolo], Rettangolo:

  NumeroFinestra può valere 1, 2, …: specifica la finestra (finestra 1, finestra 2, …) che si sta definendo,

  Titolo è il nome che si può dare alla finestra,

  Rettangolo ha la forma (o1,v1)-(o2,v2) e indica che la finestra ha come vertici opposti i pixel di coordinate (o1,v1) e (o2,v2) (in modo simile a quanto si è visto per l'istruzione VIEW del QB per DOS).

    Su ciascuna finestra le uscite possono essere sia grafiche che alfanumeriche. Per visualizzare un'uscita sulla finestra n occorre prima renderla "attiva" mediante l'istruzione WINDOW n. Non sono predefinite istruzioni per la trasformazione automatica da coordinate-cartesiane a coordinate-schermo. L'utente può sopperire a ciò costruendo un opportuno sottoprogramma.

    Vediamo, ora, qualche ulteriore considerazione sulle applicazioni per la grafica.

     Vari programmi di tipo paint sono dotati di "menu" simili a quello raffigurato a lato:  con un clic del mouse in un riquadro si aziona il co-mando raffigurato emblematicamente nel riquadro stesso.  Altri co-mandi azionabili da un menu a cascata consentono di memorizzare (Copy/Copia) e riprodurre (Paste/Incolla) porzioni di schermo.

    Ad esempio il riquadro 1 consente di battere delle parti di testo sul disegno.

    2 consente di impiegare il mouse per "selezionare" una porzione rettangolare del disegno su cui poi operare con successivi comandi.

    3, 4, 5 e 6 consentono di usare il mouse per, rispettivamente, tracciare linee a mano libera, tracciare segmenti, tracciare poligonali, azionare una "gomma".

    14 e 15 consentono di tracciare (descrivendo con il mouse il rettangolo che li circoscrive) ellissi (cerchi con Shift premuto) o rettangoli (quadrati con Shift).

    7 e 8 ribaltano verticalmente o orizzontalmente quanto racchiuso nella parte di schermo selezionata. 16 e 17 effettuano, invece, una rotazione di 90° o di –90°.

    9 fa sì che il rettangolo selezionato sia sovrapposto "opacamente" (cancellando le eventuali figure preesi-stenti) al rettangolo su cui, con il mouse, lo si è spostato, 18 fa sì che la sovrapposizione sia "trasparente".

    In altre applicazioni questi comandi non sono azionabili con dei clic su delle icone ma sono presenti all'interno di menu a cascata.

    Vediamo, ad es., come sottoporre ad alcune trasformazioni un poligono tracciato in precedenza (fig. 1).

    Con il mouse seleziono un rettangolo che contenga il poligono (fig. 2). Poi, azionando "copia" e "incolla", posso ottenere una copia del poligono. Oppure posso traslare il poligono con il mouse nella posizione che preferisco. Invece azionando il comando  (o "ruota a sinistra" o …, cliccando su un'icona o agendo su un menu a cascata, a seconda dell'applicazione) posso ruotarlo di –90° (fig. 3).

    Volendo posso trasformare il poligono mediante una trasformazione di scala: se seleziono un rettangolo (fig. 4) di dimensioni diverse da quello utilizzato per copiare il poligono e poi aziono "incolla" ottengo una copia del poligono originale dilatata o contratta verticalmente e orizzontalmente (fig. 5), con fattori di scala pari ai rapporti tra le corrispondenti dimensioni del rettangolo iniziale e del nuovo rettangolo.

    Nelle applicazioni di tipo draw le trasformazioni vengono realizzate in modo diverso.

    Ad esempio, dopo aver tracciato il poligono, con un solo clic posso selezionare il poligono stesso (fig. 2): vengono evidenziati i quattro vertici del più piccolo rettangolo che lo contiene. Poi posso copiare e incollare il poligono o posso modificarlo con una trasformazione di scala trascinando con il mouse uno qualunque dei quattro punti evidenziati (fig. 3).

    Volendo, azionando un opportuno comando ("edit polygon" o "reshape polygon" o …), posso far evi-denziare i vertici del poligono (fig. 4) e posso modificare il poligono trascinando con il mouse un vertice del poligono stesso (fig. 5).

2        3      4    5

     Ogni trasformazione è attuata mediante un'opportuna funzione F, come (x,y)  (x,2y) per dilatare ver-ticalmente con fattore 2 (ÆLa matematica e lo spazio, scheda 2). Le applicazioni "paint" calcolano F(x,y) per tutti i punti della figura, le applicazioni "draw" solo per alcuni punti (i vertici nel caso di un poligono).

7. Esercizi

Il grafico a fianco rappresenta come varia in funzione del tempo la posizione del pistone di un ciclomotore che sta viaggiando a velocità costante.

         Deduci dal grafico, arrotondato a 2 cifre, il periodo del movimento del pistone (cioè il tempo che il pistone impiega per compiere un'intera corsa, su e giù per il cilindro).

         Calcola quindi, arrotondata a 2 cifre, la frequenza espressa in giri al minuto.

Sia f la frequenza di un fenomeno periodico espressa in cicli al secondo e sia T il relativo periodo espresso in secondi.

     Scrivi la formula che esprime f in funzione di T e quella che esprime T in funzione di f.

                               f =                                                             T =

     La relazione tra T e f è una relazione di diretta proporzionalità, di inversa proporzionalità o è una relazione di altro genere? [motiva la risposta]

Cerca (ad es. su un atlante) le coordinate geografiche di alcune città italiane, registrale in un file analogo al file macosa.gfu (Æp.9) e realizza utilizzando grafun la figura del quesito 8 integrata con la rappresentazione di tali città.

Realizza un programma che, usando opportunamente una variabile indiciata, riceva in input n dati, dopo aver ricevuto in input il valore di n  (Æquesito 11), e stampi la distribuzione percentuale dei dati.

In QB esistono le istruzioni DATAListaDiCostanti e READListaDiVariabili che consentono di registrare e leggere sequenze di dati all'interno del testo di un programma. Se un programma contiene delle istruzioni DATA, il calcolatore si predispone a leggere i dati in esse elencati "posizionandosi" sul primo dato della prima istruzione DATA. Man mano che nel corso dell'esecuzione viene incontrata una istruzione READ, il calcolatore, per ciascuna delle variabili in essa presenti, assegna a questa il dato su cui è posizionato e si posiziona sul successivo, se esiste. Ad es. i programmi (2), (3) e (4) sono equivalenti al programma (1).

(1)

a=2 : b=4 : n=10

PRINT (b-a)/n

(2)

DATA 2,4,10

READ a,b,n

PRINT (b-a)/n

(3)

READ a,b,n

DATA 2,4,10

PRINT (b-a)/n

(4)

DATA 2,4

READ a

DATA 10

READ b,n

PRINT (b-a)/n

    Completa il programma seguente (che stampa gli elenchi degli studenti con voto sufficiente/insufficiente)  in modo da ottene-re l'uscita a lato.

 

n = 21 ' numero degli studenti

DIM voto(n)

' lettura dei voti presi dagli studenti, ordinati secondo il registro

FOR i=1 TO n : READ voto(i) : NEXT

DATA 7,2,9,4,4,6,7,3,8,8,6,10,5,6,7,4,5,9,6,6,5

PRINT "Alunni con voto insufficiente:"

FOR i=1 TO n

   IF voto(i)<6 THEN PRINT i;

NEXT

PRINT

PRINT "Alunni con voto sufficiente:"

Le variabili indiciate possono essere anche di tipo stringa.

         Completa il programma a lato in modo da ottenere l'uscita riportata di seguito:

    

n=4 : FOR i=1 TO n : READ nome$(i),pag(i) : NEXT

' 1 se ha pagato, 0 se non ha pagato

DATA Giovanni,1

DATA Lisa,0

DATA Mario,0

DATA Rina,1

FOR i=1 TO n

  IF  ..................  THEN PRINT nome$(i)

NEXT

PRINT "devono ancora pagare"

Completa il programma in modo che, dando gli input indicati, si comporti nel modo seguente:

n=4 : FOR i=1 TO n : READ nome$(i) : NEXT

DATA Giovanni,Lisa,Mario,Enrico

FOR i=1 TO n

    PRINT "n. pettorale del concorrente arrivato al posto "; i;

    INPUT pettorale : graduatoria(i)=pettorale

NEXT

FOR i=1 TO n

    PRINT nome$( ............................ )

NEXT

Completa, a fianco, la figura che il programma seguente traccia sullo schermo.

 

x(0) = 10: y(0) = 35

x(1) = 10: y(1) = 5

x(2) = 40: y(2) = 35

PSET (x(2), y(2)) : FOR i=0 TO 2: LINE -(x(i), y(i)): NEXT

FOR i=0 TO 2 : x(i)=10+x(i)*3 : y(i)=20+y(i)*3 : NEXT

PSET (x(2), y(2)) : FOR i=0 TO 2: LINE -(x(i), y(i)): NEXT

Si possono impiegare anche variabili a più indici.

         Ad esempio nel programma per giocare a filetto sotto riportato la variabile a 2 indici x$(.,.) viene impiegata per rappresentare la griglia 3¥3 usata nel gioco: con x$(1,1) viene indicato il contenuto ("X", "O" o "–", cioè "niente") della "casella" che sta nella 1ª riga e nella 1ª colonna, con x$(3,2) quello della casella che sta nella 3ª riga e nella 2ª colonna, …

         Il programma  è presente tra il software del progetto, registra-to come filetto.bas. Prova a eseguirlo (a fianco sono rappre-sentati tre successivi stati dello schermo durante una partita).

         Modifica il programma in modo che si arresti automaticamente quando non ci sono più caselle libere.

FOR i=1 TO 3 : FOR j=1 TO 3 : x$(i,j)="-" : NEXT : NEXT

gioc$="X"

10

FOR i=1 TO 3 : FOR j=1 TO 3

   LOCATE i,j*2 : PRINT x$(i,j)

NEXT : NEXT

20

LOCATE 5 : PRINT SPACE$(50) : LOCATE 5

PRINT "giocatore "; gioc$; ":  "; : INPUT "riga,colonna"; r,c

IF x$(r,c)<>"-" THEN GOTO 20

IF gioc$="X" THEN x$(r,c)="X" : gioc$="O" ELSE  x$(r,c)="O" : gioc$="X"

GOTO 10

Completa nel programma seguente le chiamate del sottoprogramma MOLT in modo da ottenere le uscite sotto indicate (i numeri indici sono rappresentati assumendo come dato base la media aritmetica dei dati, in modo da rendere facilmente confrontabili gli scarti percentuali da essa):

n=15 : DIM x(n), y(n), z(n), w(n)

FOR i=1 TO n : READ x(i) : NEXT

DATA 13,45,82,12,9,102,67,32,6,26,81,51,19,24,19

s=0 : FOR i=1 TO n: s=s+x(i) : NEXT

dato.base=s/n

CALL MOLT (n,x(),100/dato.base,y())

CALL MOLT (n,x(),,z())

CALL MOLT (n,,360/s,)

PRINT "n.dato","dato","n.indice","%","ampiezza sett.circolare"

PRINT

FOR i=1 TO n : PRINT i,x(i),y(i),z(i),w(i) : NEXT

SUB MOLT (n,x(),k,y())

   FOR i=1 TO n : y(i)=x(i)*k : NEXT

END SUB

Considera il seguente programma e il relativo esempio d'uso, in basso a destra.

' Disegno di rettangoli riempiti con "motivo"

FOR i=0 TO 7 : FOR j=0 TO 7 : READ x(i,j) : NEXT : NEXT

DATA 1,0,0,0,1,0,0,0      ' definizione del "motivo"

DATA 0,1,0,0,0,1,0,0

DATA 0,0,1,0,0,0,1,0

DATA 0,0,0,1,0,0,0,1

DATA 1,0,0,0,1,0,0,0

DATA 0,1,0,0,0,1,0,0

DATA 0,0,1,0,0,0,1,0

DATA 0,0,0,1,0,0,0,1

' scelta del vertice del rettangolo in alto a sinistra

' e volte per cui ripetere il motivo in orizzontale e in verticale

INPUT "x,y"; x,y

INPUT "m,n"; m,n

SCREEN 11  ' eventualmente modificabile

FOR i=0 TO m-1 : FOR j=0 TO n-1

   CALL MOTIVO(x+i*8,y+j*8,x())

NEXT : NEXT

 

SUB MOTIVO(a,b,x())

FOR i=0 TO 7 : FOR j=0 TO 7

   IF x(i,j)=1 THEN PSET(a+i,b+j)

NEXT : NEXT

END SUB

     Il "data-read" mette nella variabile indiciata x(.,.) la descrizione in bit del "motivo" di 8¥8 pixel raffigurato nell'ingrandimento a fianco. Il sottoprogramma motivo disegna il motivo collocando nel punto-schermo (a,b) il vertice in alto a sinistra di esso.   Nel programma princi-

pale è presente un ciclo che riproduce il motivo, a partire dal punto (x,y) dato in input, m volte in orizzontale e n volte in verticale, con m e n dati in input.

(1)  Il programma è già registrato con nome motivo.bas. Prova ad eseguirlo.

 

(2)  Modifica il "data-read" in modo che il motivo corrispondente consenta di ottenere uno dei rettangoli raffigurati a destra.

 

Che cosa fa il seguente programma? [battilo e prova ad eseguirlo]

SCREEN 11

10  INPUT n

    INPUT x.centro,y.centro

    INPUT raggio

    CALL POL(n,x.centro,y.centro,raggio)

GOTO 10

 

SUB POL (n,xc,yc,r)

pigreca=ATN(1)*4 : ang=pigreca*2/n

PSET(xc+r,yc)

FOR i=1 TO n

   LINE - (xc+r*COS(ang*i),yc+r*SIN(ang*i))

NEXT

END SUB

 

Il programma del quesito 11, parzialmente riportato sotto a sinistra, può essere modificato nel modo indicato a destra, usando l'istruzione a più righe IF-END IF, di cui a fianco è descritta la forma che può assumere. Esamina l'help o il manuale per ulteriori informazioni su questa istruzione. Utilizzando tale istruzione redigi un programma che, dato in input un reddito R (in milioni), calcoli (in milioni) l'imposta da pagare così definita:

         se R≤15.5 l'imposta è 0

         altrimenti se R≤30 l'imposta è pari al 10% della parte di R che eccede 15.5

         altrimenti l'imposta è pari a 1.45 più il 20% della parte di R che eccede 30.

IF Condizione THEN

[Istruzione]

...

[ELSEIF Condizione

[Istruzione]

...]

...

[ELSE

[Istruzione]

...]

END IF

 

...

INPUT "1:max, 2:min, 3:media"; risp

SELECT CASE risp

CASE 1

  ...

CASE 2

  ...

CASE 3

  ...

CASE ELSE

END SELECT

GOTO 10

...

INPUT "1:max, 2:min, 3:media"; risp

IF risp=1 THEN

  ...

ELSEIF risp=2 THEN

  ...

ELSEIF risp=3 THEN

  ...

END IF

GOTO 10

 

Quando si registra un programma contenente dei sub in testa al programma compiano automaticamente delle istruzioni declare che "dichiarano" il nome (e i parametri) dei sub usati nel programma stesso.

     Ad esempio se si registra il programma seguente con un certo nome, in testa ad esso vengono aggiunte le due righe a fianco.

     Per chiamare un sub si può evitare di scrivere "call" e, contempo-raneamente, omettere le parentesi che racchiudono gli argomenti. Ad es. la seconda riga del programma seguente può essere sostituita da quella a fianco.

DECLARE F(x!,y!)

DECLARE G(x!,y!)

F x,y : G y,z

10 INPUT ; "x"; x

CALL F(x,y) : CALL G(y,z)

PRINT TAB(10) "f(x) =";y

PRINT TAB(10) "g(f(x)) =";z

GOTO 10

SUB F(x,y)

IF x<3 THEN y= ELSE y=

END SUB

SUB G(x,y)

IF x<5 THEN y=0 ELSE y=x*

END SUB

Osservando le seguenti uscite, completa il programma.

 

Si possono usare istruzioni pset anche del tipo PSET (x,y),colore (con x,y, colore termini numerici). L'aggiunta, facoltativa, dell'ultimo termine, possibile anche per l'istruzione line, consente di scegliere il colore con cui viene tracciato il punto. Realizza un programma che (fissato il valore di "screen") ti permetta di associare colori ai corrispondenti valori (scelti tra numeri naturali) da assegnare a tale termine opzionale.

Le istruzioni data e read consentono di registrare/leggere all'interno di un programma dati da impiegare nel corso dell'esecuzione del programma stesso. In molti casi può essere comodo registrare i dati in un file separato e inserire nel programma istruzioni che consentano di leggerli da tale file. Ciò è quello che è stato fatto redigendo i programmi statfile e grafun.

     Vediamo, ad esempio, come modificare il programma del quesito 19 in modo che legga auto-maticamente i voti presi dagli studenti registrati precedentemente, mediante un editor, nel file "voti".

     Il file può essere scritto in uno dei modi indicati a fianco: separando i dati con degli "a capo", con degli "spazi" (uno o più) o con delle "virgole", oppure combinando queste forme.

Nota. Se i dati sono di tipo "stringa" per usare come delimitatore lo "spazio" occorre racchiudete ciascun dato tra virgolette (").

n=21

DIM voto(n)

' lettura dei voti presi dagli studenti, ordinati secondo il registro

OPEN "voti" FOR INPUT AS #1

FOR i=1 TO n :  INPUT #1, voto(i) : NEXT

CLOSE #1

PRINT "Alunni con voto insufficiente:"

FOR i=1 TO n

   IF voto(i)<6 THEN PRINT i;

NEXT

     L'istruzione OPEN NomeFile FOR INPUT AS #Num (Num termine numerico a valore intero positivo) serve per indicare il nome del file da cui leggere i dati ("open" sta per "apri"); il nome può contenere l'indicazione del percorso con cui raggiungere il file a partire dal directory in cui è collocato il programma. Nel seguito del programma il file è identificato come file numero Num (anche in altri contesti "#" è spesso utilizzato come abbreviazione di "numero").

     Man mano che viene incontrata un'istruzione INPUT #Num, Var [o INPUT #Num, ListaDiVariabili], analogamente a quanto accade con l'istruzione read, il calcolatore assegna a Var [o a ciascuna delle variabili della lista] un dato del file e si predispone a leggere il dato successivo.

     L'istruzione CLOSE #Num "chiude" il file.

     Per scrivere i dati, invece di un editor avrei potuto usare un programma come il seguente:

n=21

OPEN "voti" FOR OUTPUT AS #1

FOR i=1 TO n :  INPUT v : PRINT #1, v : NEXT

CLOSE #1

     L'istruzione OPEN NomeFile FOR OUTPUT AS #Num serve per indicare il nome del file in cui scrivere i dati.

     Man mano che viene incontrata un'istruzione PRINT #Num, Var [o INPUT #Num, ListaDiVariabili], il calcolatore scrive nel file il valore di Var [o i valori delle variabili della lista].

 

     Modifica il programma del quesito 20 in modo che legga nel file "pagamento", illustrato a fianco, le informazioni che nel programma originale erano contenute nelle istruzioni data.

Modifica il programma del quesito 11 in modo che, dal file "dati" illustrato a fianco, legga, nella prima riga, il numero dei dati e, nelle successive, i dati.

 

Con la scelta dell'opzione 4 ("calc") dal menu principale è possibile trasformare file. Supponiamo ad es. di aver importato (Æ p.9) il file "pesce.gfu", averlo registrato come "dat1" e rappresentato graficamente con l'opzione "punti congiunti", ottenendo il pesce A della figura seguente.  Per trasformarlo nel pesce B, traslato con passi ∆x=–10, ∆y=–20, possiamo procedere così:                                                                   [i messaggi sono riprodotti semplificati]

 

e poi rappresentare graficamente, con "scala invariata", il file "dat2".

     Trasformando "dat1" mediante una opportuna "moltiplicazione" delle ascisse e delle ordinate cerca di ottenere il pesce C.

Costruisci il pentagono a lato così:

    scelta l'opzione "punti congiunti", intro-duci (come "nuovi dati") i punti (–5, –5) e (5, 5), ottenendo il segmento orizzontale;

    registra i punti come file "dat1";

    poni u=360/5 e trasforma "dat1" in "dat2" con la rotazione attorno a (0,0) ampia u;

    trasforma analogamente "dat2" in "dat3", "dat3" in "dat4", "dat4" in "dat5";

      rappresenta graficamente dat2, …, dat5.

          Poi prova a costruire un pentagono con-giungendo i punti (2cos(0),2sin(0)), (2cos(u), 2sin(u)), (2cos(2u),2sin(2u)), ... .

          Che cosa ottieni?

 

1)   Segna con l'evidenziatore, nelle pagine indicate, frasi e/o formule che descrivono il significato dei termini:

       periodo, p.4                     frequenza, p.4                                         digitalizzazione, p.6

       pixel, p.7                          applicazioni di tipo "paint", p.16            applicazioni di tipo "draw", p.16

2)    Su un foglio da "quadernone" (che poi inserirai dopo l'ultima pagina della scheda), nella prima facciata, esemplifica l'uso di ciascuno dei concetti sopra elencati mediante una frase in cui esso venga impiegato.

3)    Nella seconda facciata riassumi in modo discorsivo (senza formule, come in una descrizione "al telefo-no") il contenuto della scheda (non fare un elenco di argomenti, ma cerca di far capire il "filo del discorso").