La automazione

Dalle macchine semplici alle macchine programmabili

Scheda 3

Il calcolatore

1.    Dalla calcolatrice al calcolatore

2.    Come usare un ambiente di programmazione

3.    Il linguaggio macchina e i programmi traduttori

4.    Descrizione dei linguaggi di programmazione - Esempi di linguaggi

5.    Automatizziamo qualche procedimento di calcolo

6.    Hardware e software

7.    I fogli elettronici

8.    I programmi per il calcolo simbolico

9.    Esercizi

1. Dalla calcolatrice al calcolatore

     Alle calcolatrici non programmabili possiamo far eseguire solo singole operazioni di:

   addizione, moltiplicazione, … ,

   calcolo di altre funzioni il cui programma è stato incorporato dal costruttore,

   immagazzinamento o estrazione di dati dalla memoria-utente.

     A un calcolatore (o computer o macchina calcolatrice programmabile) possiamo far gestire l'esecuzio-ne di tutto un algoritmo.

     Consideriamo ad esempio il calcolo della ripartizione percentuale di una serie di dati. Usando una CT possiamo procedere in questo modo:

(1)    batto    100                                                         

(2)    batto                      (1.1)

(3)    batto    totale

(4)    batto                                faccio calcolare il fattore di proporzionalità per cui moltiplicare i dati

(5)    batto      ( o  o …)       lo faccio mettere nella memoria

(6)    batto    dato

(7)    batto   

(8)    batto      (o  o …)

(9)    batto                                faccio calcolare la percentuale di dato rispetto a totale

(10)  ritorno a (6)                                   vado a introdurre un nuovo dato

     Come si vede, è l'utente che deve gestire l'esecuzione dell'algoritmo (1.1), cioè comandare alla CT man mano quale operazione compiere.

     I calcolatori sono invece in grado di "leggere" e tradurre automaticamente in una sequenza di operazioni-macchina (calcoli, memorizzazioni, …) un programma che illustri l'intero procedimento, cioè una descrizione dell'algoritmo (1.1) fatta in un opportuno linguaggio "comprensibile" dal calcolatore.

     Molti computer tascabili (o pocket computer) e tutti i calcolatori di maggiori dimensioni sono in grado di eseguire il seguente programma (1.2) scritto in linguaggio Basic:

(1.2)

10 INPUT T

20 K=100/T

30 INPUT D

40 PRINT D*K

50 GOTO 30

l'utente deve battere totale

 

l'utente deve battere dato

 

 

     È facile comprendere il significato di questo programma, che ha la forma di una sequenza di istruzioni numerate. print in inglese significa "stampa"; goto deriva dall'inglese "go to", che significa "vai a". La parola "input", che abbiamo già usato, indica qualcosa che entra in una macchina (energia, informazioni, …); in questo caso input viene usato per dire al calcolatore di attendere che l'utente batta un numero.

     Vediamo come si comporta un pocket computer se l'utente gli comanda di eseguire (1.2). Nello schema seguente la prima colonna evidenzia l'istruzione del programma che il computer sta eseguendo, la seconda riporta lo stato dello schermo (informazioni battute dall'utente o visualizzate direttamente dal calcolatore).

 

10

20 K=100/T

30 INPUT D

40 PRINT D*K

50 GOTO 30

?

Il computer fa comparire il prompt "?" per segnalare che attende l'introduzione di un dato.

 

10

20 K=100/T

30 INPUT D

40 PRINT D*K

50 GOTO 30

? 2750¿

L'utente batte il numero 2750 seguito da "a capo" (abbia-mo indicato con "¿" l´"a capo" premuto dall'utente; normalmente sullo schermo non appare alcun segno).

Il computer memorizza il dato nella memoria T.

 

10 INPUT T

20

30 INPUT D

40 PRINT D*K

50 GOTO 30

? 2750¿

Il computer calcola la divisione di 100 per il numero che ha messo nella memoria T

Poi mette il risultato nella memoria K.

 

10 INPUT T

20 K=100/T

30

40 PRINT D*K

50 GOTO 30

? 2750¿

?

Il computer fa comparire il prompt "?" per segnalare che attende l'introduzione di un dato.

 

10 INPUT T

20 K=100/T

30

40 PRINT D*K

50 GOTO 30

? 2750¿

? 1800¿

L'utente batte il numero 1800 seguito da "a capo".

Il computer memorizza il dato nella memoria D.

 

10 INPUT T

20 K=100/T

30 INPUT D

40

50 GOTO 30

? 2750¿

? 1800¿

65.45454

Il computer calcola la moltiplicazione del numero che ha messo nella memoria D per quello che ha messo nella memoria K.

Poi visualizza il risultato.

 

10 INPUT T

20 K=100/T

30 INPUT D

40 PRINT D*K

50

? 2750¿

? 1800¿

65.45454

Il computer trasferisce l'esecuzione alla riga che inizia con "30".

Da questo punto il computer ripete ciclicamente l'esecuzione delle stesse istruzioni:

 

 

10 INPUT T

20 K=100/T

30

40 PRINT D*K

50 GOTO 30

? 2750¿

? 1800¿

65.45454

?

Il computer fa comparire il prompt "?" per segnalare che attende l'introduzione di un dato.

 

10 INPUT T

20 K=100/T

30

40 PRINT D*K

50 GOTO 30

? 2750¿

? 1800¿

65.45454

? 950¿

L'utente batte il numero 950 seguito da "a capo".

Il computer memorizza il dato nella memoria D.

 

 

10 INPUT T

20 K=100/T

30 INPUT D

40

50 GOTO 30

? 2750¿

? 1800¿

65.45454

? 950¿

34.54545

Il computer calcola la moltiplicazione del numero che è nella memoria D per quello che è nella memoria K

Poi visualizza il risultato.

 

10 INPUT T

20 K=100/T

30 INPUT D

40 PRINT D*K

50

? 2750¿

? 1800¿

65.45454

? 950¿

34.54545

Il computer trasferisce l'esecuzione alla riga che inizia con "30".

 

10 INPUT T

20 K=100/T

30

40 PRINT D*K

50 GOTO 30

? 2750¿

? 1800¿

65.45454

? 950¿

34.54545

?

Il computer fa comparire il prompt "?" per segnalare che attende l'introduzione di un dato.

     E così via.

   Completa lo schema seguente con le parti mancanti: riquadri che evidenziano istruzioni (1a colonna), caratteri visualizzati sullo schermo (2a colonna, al posto dei puntini) e commenti (3a colonna).

 

istruzione in corso di esecuzione

stato dello schermo

commento

 

10

20 INPUT E

30 PRINT B^E

40 GOTO 20

 

Il computer memorizza la costante 2 nella memoria B

 

10 B=2

20

30 PRINT B^E

40 GOTO 20

?

 

 

10 B=2

20

30 PRINT B^E

40 GOTO 20

? 3¿

L'utente batte il numero 3 seguito da "a capo".

Il computer memorizza il dato nella memoria E.

 

10 B=2

20 INPUT E

30 PRINT B^E

40 GOTO 20

? 3¿

Il computer calcola il numero che è nella memoria B elevato al numero che è nella memoria E

Poi visualizza il risultato.

 

10 B=2

20 INPUT E

30 PRINT B^E

40

? 3¿

 

 

10 B=2

20 INPUT E

30 PRINT B^E

40 GOTO 20

? 3¿

Il computer fa comparire il prompt "?" per segnalare che attende l'introduzione di un dato.

     Per poter eseguire un programma come (1.2), il pocket computer deve essere in grado di memorizzare il testo del programma, cioè, nel caso di (1.2), la seguente sequenza di caratteri, dove con "" abbiamo indi-cato lo spazio bianco (carattere normalmente invisibile, che corrisponde alla pressione della barra spaziatri-ce):

10◊INPUT◊T¿20◊K=100/T¿30◊INPUT◊D¿40◊PRINT◊D*K¿50◊GOTO◊30¿

     Come le usuali CT memorizzano i numeri sotto forma di sequenze di bit, così un pocket computer memorizza sotto forma di una sequenza di bit anche il testo del programma, utilizzando uno specifico codice.

     Deve, inoltre, essere in grado (quando l'utente gli comanda, con un opportuno tasto, di eseguire il programma) di leggere (la sequenza di bit con cui ha codificato) il programma e decidere, man mano, quale operazione eseguire: una memorizzazione, un richiamo dalla memoria, un calcolo o una visualizzazione (operazioni che nelle CT non programmabili vengono comandate direttamente da tastiera), o un trasferimento dell'esecuzione a un altro punto del programma.

     Per fare tutto ciò, il pocket computer deve avere:

   un "programma incorporato" per codificare il "programma battuto dall'utente",

   un dispositivo di memorizzazione in cui registrare il programma codificato,

   almeno 26 memorie-utente (memoria A, memoria B, …, memoria Z) da associare alle diverse lettere dell'alfabeto e

   un ulteriore "programma incorporato" per tradurre il programma codificato nell'azionamento dei vari dispositivi di calcolo, memorizzazione, … .

     Esistono versioni più sofisticate del linguaggio Basic in cui, tra l'altro, si possono usare come variabili non solo lettere ma nomi composti da più caratteri e in cui non è necessario scrive in testa a ogni riga di programma un numero che indichi l'ordine in cui va eseguita.

     Poiché l'uso di queste versioni del linguaggio richiede molta più capacità di memorizzazione (si possono usare grandi quantità di variabili e, come vedremo, si possono impiegare istruzioni molto complesse, che richiedono dei programmi di traduzione complicati), esse vengono impiegate solo su personal computer o su calcolatori di dimensioni maggiori.

     Avviamo le nostre considerazioni sulla programmazione al calcolatore facendo riferimento a uno di questi linguaggi: il QuickBasic, che spesso chiameremo più brevemente QB.  Abbiamo scelto questo linguaggio per vari motivi:

   esso opera, con piccole differenze, su entrambi i tipi di personal computer più diffusi, i cosiddetti "Ibm-compatibili" e i "Macintosh";

   nel caso degli Ibm-compatibili ne esiste una versione liberamente riproducibile, spesso fornita direttamente insieme al computer; per usare un altro linguaggio occorre invece acquistarne una copia personale, se non si vuole commettere un'infrazione punibile per legge;

   si tratta di un linguaggio particolarmente semplice, di agevole lettura e che consente una facile riscrittura dei programmi in altri linguaggi di programmazione.

     Oltre che per questa introduzione alla programmazione, lo useremo anche in seguito, per descrivere gli algoritmi man mano considerati, lasciando alla scelta delle singole classi la possibilità di utilizzare in aula-computer linguaggi diversi.

     Vediamo come può essere riscritto in questo linguaggio il programma (1.2):

(1.3)

[1]

[2]

[3]

[4]

[5]

INPUT tot

k=100/tot

Introduzione: INPUT dato

PRINT dato*k

GOTO Introduzione

Nota. Fra parentesi quadre qui e in seguito indicheremo il numero d'ordine della riga del testo del programma; ciò ci servirà come riferimento per facilitare la descrizione dei programmi.

     In questo linguaggio, come già detto, possiamo fare a meno di numerare tutte le linee del programma. Quando vogliamo identificare una particolare linea del programma, ad esempio per "ritornarvi" con un goto, possiamo metterle in testa un numero intero positivo qualunque o, in alternativa, un nome seguito da ":", a mo' di etichetta. In (1.3) viene usata l'etichetta "Introduzione".

     Avremmo potuto anche scrivere:

(1.4)

[1]

[2]

[3]

[4]

[5]

[6]

[7]

INPUT tot

k=100/tot

 

Introduzione:

  INPUT dato

  PRINT dato*k

GOTO Introduzione

     Infatti, per rendere più "leggibile" un programma, in QB si possono inserire righe "vuote" (vedi [3]) o spazi bianchi in testa a una riga (vedi [5] e [6]) e si può andare a capo subito dopo un'etichetta o un numero di linea (vedi [4]).

2. Come usare un ambiente di programmazione

     Vediamo in dettaglio come scrivere e eseguire (1.4).

     Supponiamo di usare un Ibm-compatibile, in cui si può usare la versione del QuickBasic liberamente riproducibile, chiamata QBasic, a cui si può accedere battendo semplicemente qbasic (dal dos) o usando il mouse (se la si apre direttamente Windows) o attraverso il menu principale del software MaCoSa. Oppure (se la si è regolarmente acquistata) si può usare la versione estesa del linguaggio, a cui si può accedere, eventualmente dopo essere entrati in uno specifico directory, battendo qb (o ricorrendo al mouse).

     Se si usa un Macintosh basta fare un doppio clic sull'icona raffigurata a fianco (dopo aver eventualmente aperto la cartella che la contiene). O, come si può fare per usare tutto il software MaCoSa, si può ricorrere a un emulatore di Windows (o del DOS) e procedere come con un Ibm-compatibile.

 

     A questo punto lo schermo assume la configurazione riprodotta all'inizio della pagina seguente.

     Più sotto è riportata con commenti e in dimensioni maggiori la "schermata" che appare nella versione QBasic.

     Abbiamo fatto riferimento alla versione italiana; nella versione inglese le parole che appaiono sullo schermo sono grosso modo la traduzione in inglese di quelle qui riportate (Composizione-Edit, Visualizza-View, Cerca-Search, Esegui-Run, …).

     Descriviamo gli elementi che compongono la schermata (riferendoci alla versione per Ibm-compatibili).

Lo schermo appare suddiviso in due finestre:

  una finestra superiore (o fine-stra di lista), in cui l'utente può battere il programma, cioè una "lista" di istruzioni, e che appare  inizialmente con il titolo "Senza titolo" o "Senzanome" o "Un-titled,

  una finestra inferiore (o fine-stra comandi), con titolo "Im-mediato" o "Immediata" o "Com-mand", in cui l'utente può battere dei comandi da far eseguire immediatamente al calcolatore.

 

    Nell'angolo alto sinistro della finestra di lista appare il cursore (che può essere spostato usando i tasti direzionali ¯, ®, ¬ e ­ o con dei clic del mouse); a partire da lì verranno man mano visualizzati i caratteri battuti.

    Questa è la finestra "attiva", cioè quella in cui vengono scritte le cose battute da tastiera. Infatti il suo titolo appare evidenziato.

    Per cambiare la finestra attiva, cioè per rendere attiva la finestra comandi, se si ha il mouse basta fare un clic all'interno di essa, altrimenti, se si dispone di un Ibm senza mouse, si può battere il tasto F6, come suggerisce la "barra di riferimento" (che fornisce alcune informazioni sul funzionamento o sull'uso di QB).

     Proviamo a battere il programma.

     Quando abbiamo finito di battere la prima riga (il cursore è ora posizionato sulla colonna 10 della riga 1) lo schermo si presenta nel modo a fianco.

     Appena premiamo ¿, la parola "input" viene trasformata automaticamente in maiuscolo, in modo che sia più facile distinguerla:

 

Analogamente vengono trasformate automaticamente in maiuscolo le parole "print" e "goto". Vengono inseriti automaticamente anche degli spazi bianchi prima e dopo i simboli di operazione e di eguaglianza. Ecco lo stato finale dello schermo:

 

     La barra dei menu è una sequenza di nomi che indicano dei "menu" di azioni che possono essere comandate al calcolatore. Vediamo che cosa "offre" il menu File.

     Per esaminarne il contenuto possiamo fare un clic con il mouse sul titolo del menu (su "File" in questo caso) oppure premere il tasto Alt.

     Il nome "File" appare evidenziato, assieme a una lettera di ciascuno degli altri titoli di menu (vedi figura precedente) e la barra di riferimento cambia aspetto, indicando:  come visualizzare il menu (premere il tasto "invio" - o "enter" - che in questo, e in molti altri casi, funziona come il tasto "a capo" - o "return"), come cambiare menu (usare le frecce ® e ¬), come uscire dai menu (premere il tasto "Esc").

     Per esaminare un particolare menu si può anche premere (dopo "Alt") la lettera del suo titolo che appare evidenziata.

     "Aperto" il menu File, compaiono "a cascata" sei comandi (azionabili con dei clic del mouse o premendo i tasti indicati dalle lettere evidenziate o usando i tasti ¯ e ­ (per selezionarli) e quindi ¿).

     Esci  (Exit) comanda l'uscita da QB. Nuovo (New) libera la fine-stra di lista e consente la scrittura di un nuovo programma.

     Salva con nome … (Save as) consente di registrare il testo del programma in modo da poterlo riutilizzare: compare una "finestra di dialogo" in cui battere il nome da assegnare al programma e indicare dove registrarlo (disco e directory).

     Per scegliere dove registrare il programma posso (con il tasto ®|) spostarmi nel riquadro centrale, ("dir/unità") scegliere il directory o l'unità disco usando ¯ e ­, e poi battendo ¿. Per uscire dal directory in cui sono collocato e risalire al directory che la contiene devo selezionare ".." (e battere ¿). Al posto dei tasti posso usare il mouse. Poi posso battere il nome del programma nel riquadro in alto ("nome del file").

     Nel caso sotto illustrato esco dal directory macosa in cui ero collocato inizialmente per risalire al directory classi e poi scendere nel directory prima_c, dove voglio registrare il programma.  Il grafo visualizza il percorso seguito.

  ®

  ®  

     Se come nome batto "percent", dopo la pressione di ¿ appare visualizzato (nel riquadro e poi come titolo della finestra di lista) il nome con l'aggiunta di ".bas": QB fa automaticamente questa aggiunta affinché in un successivo uso del calcolatore sia più facile capire che il documento registrato è un programma scritto in QuickBasic.

     Si può battere un nome di al più 8 caratteri (a parte il primo, gli altri caratteri possono anche non essere lettere; non si possono impiegare  *  =  +  {  }  .  ;  :  '  ?  /  \  |  e lo spazio bianco). Se non si vuole l'ag-giunta automatica di ".bas", si può aggiungere "." seguito (eventualmente) da una sequenza di al più tre caratteri, che viene chiamata estensione del nome.

     Per ulteriori informazioni puoi ricorrere alla barra di riferimento e al menu "?" (o "Guida" o "Help").

   Esercitatevi ad esaminare la barra di riferimento al variare dei menu e dei comandi selezionati e ad usare l'help.

     Per  avviare il programma si può battere run nella finestra co-mandi o azionare Avvia dal menu Esegui o premere Maius+F5, cioè tenere schiacciato il tasto per il maiuscolo (Maius o Shift) e premere F5. Simili alternative valgono per altri comandi.

     Appena avviato il programma scompaiono la finestra di lista e la fine-stra comandi e ricompare come "finestra di output" la configurazione che aveva lo schermo quando si è entrati in QB (cioè quando si è battuto qbasic). A fianco è riprodotto lo stato dello schermo dopo alcuni calcoli.

     Per arrestare l'esecuzione si può premere Ctrl+Break o Ctrl+C; si torna alla finestra di lista; premendo F4 si può riesaminare la finestra di output.

 

   L'istruzione CLS (clear the screen) comanda la cancellazione della finestra di output. Inseriscila in un punto opportuno del programma percent in modo che durante l'esecuzione non compaiano scritte precedenti ma solo le uscite del programma. Verifica la correttezza della modifica eseguendo il programma. Quindi registra la nuova versione con il nome percent2 usando il comando Salva con nome. Quindi usa il comando Apri per controllare se è stata conservata la precedente versione percent del programma.

3. Il linguaggio macchina e i programmi traduttori

     Approfondiamo quanto visto nel paragrafo precedente.

     All'inizio abbiamo battuto il testo del programma e lo abbiamo registrato (ad esempio nel directory prima_c) come percent.bas.

     Possiamo riesaminarlo anche senza entrare in QB. Ad esempio con gli Ibm da dos possiamo fare:  c:\>type c:\classi\prima_c\percent.bas  (stiamo ipotizzando di essere nella situazione illustrata all'inizio della pagina precedente; se fossimo già nel directory prima_c potremmo battere solo type percent.bas) ottenendo sullo schermo lo stesso testo che appariva nella finestra di lista.

     Oppure possiamo entrare in una qualunque applicazione per leggere/redigere te-

INPUT tot

k=100/tot

 

Introduzione:

    INPUT dato

    PRINT dato*k

GOTO Introduzione

sti (ad es. Edit in dos o BloccoNote/NotePad in Windows) e aprire percent.bas, riottenendo lo stesso testo. Potevamo anche battere il testo direttamente con una di queste applicazioni e poi aprirlo da QB.

     Se in modo analogo proviamo a esaminare game.exe (il programma per giocare al Castello stregato, ® scheda 1; exe è l'estensione di game) non otteniamo un testo comprensibile, ma una lunga sequenza di righe di caratteri, di cui riproduciamo una piccola porzione:


Pö≥[1]Î


[1]
∏∂‑P3¿PöÄ≥[1]öY≥[1]ö—≥[1]ã�Õ5
Õ5‑∫Õ=Ë–&Õ5

Pöb≥[1]Õ5

     Perché questa differenza?

     QB (così come tutti gli editor, cioè le applicazioni per redigere e leggere testi) registra il testo del programma codificando i vari caratteri (lettere, cifre, virgole, spazi bianchi, e altri simboli) attraverso sequenze di bit. Rappresenta ogni carattere con 1 byte, cioè con una sequenza di 8 bit (i caratteri codificabili in questo modo sono 256; infatti le diverse sequenze di 8 cifre che riesco a costruire con 0 e 1 sono 2·2·2·2·2·2·2·2=28=256).

     Il codice impiegato è chiamato ascii (pronuncia: ˘aski).  Ad esempio "N" è codificato con 01001110, l'"a capo" con 00001101, … . Viceversa quando QB (o un editor) apre un testo già redatto e memorizzato, decodifica la sequenza di bit trasformando ogni byte nel corrispondente carattere sullo schermo (carattere che può essere visibile, come una lettera o una cifra, o invisibile, come uno spazio o un "a capo").

Nota. La versione estesa del QuickBasic e gli editor più sofisticati consentono di registrare i testi con codici differenti: ad esempio (nel caso di QB) usando delle codifiche particolari, più brevi, per parole ricorrenti più volte nei programmi (come "input", "print", …) o (nel caso delle applicazioni per elaborare testi) impiegando delle codifiche che permettono di registrare le dimensioni e gli stili dei caratteri (grassetto, corsivo, sottolinea-to, …), la posizione dei margini, …. In questi casi il comando Salva con nome (o simili) è dotato di opzioni che consentono di scegliere la codifica: "testo" (per il codice ascii), "compresso", "normale", …

     Con opportune applicazioni si può leggere la traduzione in codice ASCII dei testi. Ad es. percent.bas diventa:

(3.1)                      

oppure:

(3.2)                      

 

    

 

10 cifre

2 cifre

16 cifre

 

00

0000

0

 

01

0001

1

 

02

0010

2

 

03

0011

3

 

04

0100

4

 

05

0101

5

 

06

0110

6

 

07

0111

7

 

08

1000

8

 

09

1001

9

 

10

1010

A

 

11

1011

B

 

12

1100

C

 

13

1101

D

 

14

1110

E

 

15

1111

F

 

 

 

In entrambi i casi non si ha la visualizzazione diretta dei bit.

(3.1) interpreta ogni byte come una coppia di numeri in base 2 (cioè scritti usando solo le cifre 0 e 1, come vedrai meglio nella scheda 1 de I numeri),  costituiti ciascuno da 4 bit, e li rappresenta in base 16 (cioè usando come cifre i 16 simboli 0, 1, …, 9, A,…, F). Ad esempio "N" (il secondo carattere del nostro programma) ha codifica 01001110; il primo quartetto è interpretato come 4, il secondo come E: vedi la seconda e la terza colonna della tabella a sinistra. Quindi in (3.1) compare 4E.

(3.2) invece interpreta ogni byte come un numero in base 2 e lo rappresenta in forma decimale: 01001110 diventa 78 (®tabella a destra), come vedrai meglio in seguito.

2 cifre    10 cifre

00000000    00

       ...

00001111    15

00010000    16

00010001    17

       ...

01001101    77

01001110    78

       ...

Confronta (3.1) con il testo del programma e usa la tabella precedente, a sinistra, per completare la seguente tabella.

 

 

carattere

ascii (binario)

carattere

ascii (binario)

carattere

ascii (binario)

 

I

 

T

 

¿

 

 

N

01001110

spazio

 

k

 

 

P

 

t

 

=

 

 

U

 

o

 

1

 

 

 

     Nel caso di game.exe si è invece ottenuta sullo schermo una sequenza di caratteri priva di senso: il comando type ha decodificato la sequenza di bit registrata come game.exe usando il codice ascii mentre essa non rappresenta la codifica binaria di un testo.

     Ad esempio la porzione di game.exe che appare come
Pö≥[1]
  in origine era 0E 50 9A 05 01 B3 02 (14 80 154 5 1 179 2), o, meglio:

 00001110010100001001101000000101000000011011001100000010111010110000010000000010.

     I primi 8 bit 00001110 in codice ascii rappresentano il carattere che sugli schermi degli Ibm appare come "
" (corrisponde alla combinazione di tasti Ctrl+n), ma è un carattere che non si usa per scrivere testi di programmi e che, nella finestra di lista degli ambienti di programmazione, non può essere visualizzato.

     La sequenza di bit sopra riprodotta non codifica un pezzo del testo del programma così come era stato redatto, ma rappresenta già, a gruppi di bit, le singole operazioni-macchina che il calcolatore deve eseguire.

     Possiamo dire che game.exe è la sequenza di bit che verrebbe inviata alla CPU del computer azio-nando il comando Avvia se nella finestra di lista di QB ci fosse il testo originale del programma per giocare al castello stregato.

     Riassumendo e precisando:

   La CPU di un personal computer è in grado di eseguire solo un programma che le arrivi sotto forma di una sequenza di bit che, a gruppi, rappresentino singole operazioni-macchina che essa è in grado di eseguire. Il linguaggio (che ha come alfabeto i simboli 0 e 1) in cui vengono scritti questi programmi viene detto linguaggio macchina.

     Nel caso degli Ibm i programmi in linguaggio macchina hanno in genere estensione exe ("exe" richiama il fatto che questi programmi sono direttamente eseguibili - executable - dalla CPU) o com ("com" deriva da "comando"). game.exe , stat.exe, … sono esempi di programmi in linguaggio-macchina. Nel caso dei Mac i programmi in linguaggio macchina (così come gli altri file) possono avere qualunque nome.

   Un ambiente di programmazione permette di scrivere e far eseguire programmi scritti in un linguaggio evoluto (o di alto livello), cioè in un linguaggio più articolato del linguaggio macchina e più vicino al linguaggio naturale.

   Un ambiente di programmazione non è altro che un programma in linguaggio macchina (ad esempio le versioni di QB per Ibm hanno nomi qb.exe e qbasic.exe) che contiene come sottoprogrammi:

   un programma redattore (editor) per registrare sotto forma di byte i caratteri battuti dall'utente (ad esempio registrare come game.bas il testo del programma originale per giocare al castello stregato) e

   un programma traduttore per tradurre la sequenza di bit costruita dall'editor, cioè il programma in linguaggio evoluto, in una sequenza di bit che sia la versione in linguaggio macchina del programma (ad esempio tradurre i bit che rappresentano game.bas nei bit che costituiscono game.exe).

     Nel QB in versione minore (cioè qbasic.exe) si può effettuare la traduzione solo con Avvia: il testo viene tradotto in linguaggio macchina e inviato direttamente alla CPU; la traduzione in linguaggio macchina viene memorizzata temporaneamente; quando l'esecuzione finisce essa viene persa, cioè, se si fosse redatto game.bas, non ci sarebbe modo di registrare su disco la traduzione in linguaggio macchina game.exe.

     Nel QB per Mac e nella versione estesa per IBM (qb.exe) la traduzione in linguaggio macchina del pro-gramma può invece essere registrata su disco. Nel menu di esecuzione è infatti presente un comando (Make exe o Crea un file exe negli Ibm, Compile as nei Mac) che permette di effettuare questa registrazione.

     I programmi game, stat, grafun, calcol, … che avete usato sono stati ottenuti in questo modo, senza che voi abbiate avuto modo di vedere il loro testo originale in linguaggio evoluto. E li avreste potuti eseguire anche se sui dischi del vostro calcolatore non fosse stato presente l'ambiente di programmazione QB; infatti sono già tradotti in linguaggio macchina.

     I personal computer (PC) possono eseguire programmi espressi in qualsiasi linguaggio evoluto, purché esista un opportuno programma traduttore che trasformi questi programmi nel linguaggio macchina con cui opera il modello di PC impiegato. A volte, invece che di un intero ambiente di programmazione, si dispone solo del programma traduttore (spesso chiamato compilatore). In questi casi, per redarre il programma, si può ricorrere a un qualunque editor.

     Possiamo sintetizzare l'impiego di un calcolatore con la seguente figura 1:

figura 1

Nota.

     Questa illustrazione è molto schematica. Ad esempio possiamo osservare che:

(1)   di solito per i pocket computer e per gli home computer (piccoli computer, molto usati per i video-giochi, che in genere come schermo utilizzano una normale televisione) non c'è la freccia 2: sono programmabili in un solo linguaggio, il cui programma traduttore è incorporato nella macchina;

(2)   anche con un PC spesso non è presente la freccia 2; ciò accade quando si introducono (freccia 1) programmi in linguaggio macchina (come game.exe);

(3)   per quanto riguarda la freccia 3,

   le informazioni da elaborare in alcuni casi sono introdotte dall'utente man mano che il calcolatore, eseguendo il programma, si arresta in attesa della battitura di dati (ad esempio dopo un'istruzione input);

   altre volte le informazioni possono essere inserite nel programma stesso: nel caso si voglia usare percent.bas più volte in momenti successivi con lo stesso totale, ad esempio 741362, per evitare di batterlo più volte si può sostituire  INPUT tot  con  tot=741362;

   in altri casi il programma può andarle a cercare direttamente in zone di memoria in cui sono già archiviate in forme opportune, come nel caso di statfile, quando si elaborano dati già memorizzati;  oppure si pensi al programma che gestisce i conti correnti di una banca o l'anagrafe di un comune: per elaborare un documento che utilizzi delle informazioni relative alla situazione finanziaria o familiare del signor Tizio Cercato, l'impiegato batte semplicemente "Tizio Cercato" e il programma cerca e carica automaticamente da appositi supporti (magnetici o di altro tipo) le informazioni necessarie;

(4)   anche la freccia 4 spesso non è presente o, meglio, non arriva direttamente all'utente: le informazioni elaborate non sempre vengono visualizzate (mediante schermo, stampante, …) ma a volte vengono solamente memorizzate su qualche supporto; ad esempio se con il programma statfile si duplica un file o se ne concatenano due, il nuovo file che si ottiene è un output che viene registrato sul disco.

4. Descrizione dei linguaggi di programmazione - Esempi di linguaggi

     Eseguendo un calcolo su una CT non vi sono particolari regole da rispettare nella battitura dei tasti.

     Ad esempio per eseguire 4+9+8 posso battere 4´+9+8=. La CT è stata programmata dal costruttore in modo che, in una situazione del genere, al posto del ´ già impostato imposti automaticamente il +.

     E` difficile che la CT invii dei messaggi di errore che segnalino che si è battuta una sequenza di tasti che lei non sa interpretare. Un caso in cui ciò accade è quando la CT è dotata di tasti di parentesi e si tenta di battere 3+)5´7)=. La CT si arresta dopo la battitura di 3+) segnalando un messaggio di errore. Per la CT questo è un "errore di scrittura" perché, a differenza del caso precedente, non sa come procedere.

     Vi sono dei casi in cui una sequenza di tasti viene battuta correttamente ma, comunque, la CT non riesce a completare il calcolo. Ad es. se si tenta di battere 3÷(55)+6= la CT si arresta dopo la battitura di 3÷(55)+ segnalando un errore in quanto di trova di fronte al calcolo del termine indefinito 3/0.

     La descrizione di un procedimento di calcolo in un linguaggio di programmazione evoluto deve ovviamente rispettare regole di scrittura più complesse di quelle che governano la battitura dei tasti di una calcolatrice.

     Riprendiamo l'algoritmo considerato in §1 e le sue seguenti traduzioni sotto forma di programmi:

(4.1)

[1]

[2]

[3]

[4]

[5]

10 INPUT T

20 K=100/T

30 INPUT D

40 PRINT D*K

50 GOTO 30

(4.2)

[1]

[2]

[3]

[4]

[5]

[6]

[7]

INPUT tot

k=100/tot

 

Introduzione:

    INPUT dato

    PRINT dato*k

GOTO Introduzione

(4.3)

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

program Percentuali;

var tot, k, dato: REAL;

label 10;

begin

   readln(tot);

   k:=100/tot;

10:

   readln(dato);

   write(dato * k);

   goto 10

end.

     Come abbiamo già detto, (4.1) è redatto in Basic. Del linguaggio Basic esistono molte versioni. Il testo (4.1) è compatibile con tutti i linguaggi Basic in circolazione, cioè tutti i programmi traduttori di tipo Basic sono in grado di leggerlo e tradurlo in linguaggio macchina.

     La parola "Basic" sta per "Beginner's All-purpose Symbolic Instruction Code", cioè: codice di istruzio-ni simboliche di uso generale per principianti. E` tuttora di gran lunga il linguaggio di programmazione più impiegato.

     (4.2) è redatto in un Basic più evoluto, che consente di impiegare come variabili parole generiche, non richiede la numerazione delle linee di programma, ammette istruzioni più complesse e che, come vedremo, possono occupare più righe di programma.

     Linguaggi Basic di questo tipo vengono in genere chiamati Basic strutturati. Ne esistono varie versioni. Noi, come già detto, faremo riferimento al QuickBasic, che è la versione più diffusa.

     Questi linguaggi sono compatibili con il Basic "di base" di cui abbiamo parlato sopra e consentono un approccio graduale alle più sofisticate tecniche di programmazione.

     (4.3)  è redatto in Pascal. Si tratta di un linguaggio di programmazione assai evoluto, rivolto ai "professionisti" della programmazione, anche se, ormai, non è più molto usato. Da (4.3) si vede immediatamente che in questo linguaggio un programma assume un aspetto più complesso.

     Come del Basic, anche del Pascal esistono diverse versioni. Esite un nucleo di istruzioni che, con piccole varianti, è compatibile con tutte le versioni circolanti. Altre istruzioni (ad esempio quelle per realizzare grafici, per misurare tempi, …) variano notevolmente e dipendono strettamente dal linguaggio macchina del calcolatore impiegato.

     Nell'ambito dei PC Ibm-compatibili è assai diffuso il TurboPascal, ma sono molto diffusi anche altri Pascal; nell'ambito dei PC Macintosh il più diffuso è il ThinkPascal.

     Linguaggi come i precedenti vengono detti d'uso generale, cioè non specializzati per particolari impieghi. Altri linguaggi d'uso generale assai diffusi sono il Fortran e, soprattutto, il linguaggio C.  Esistono poi linguaggi orientati alle applicazioni commerciali, linguaggi orientati alle elaborazioni statistiche, linguaggi orientati alla manipolazione di espressioni simboliche, ….  Si tratta di linguaggi che sono meno flessibili dei programmi d'uso generale ma che consentono di usare istruzioni che facilitano la descrizione di procedimenti di calcolo tipici di certe attività.

     Osserviamo, infine, che di uno stesso linguaggio di programmazione (ad esempio di un QuickBasic o di un TurboPascal) esistono successive versioni, non sempre totalmente compatibili l'una con l'altra.

     Nello stendere un programma in un linguaggio evoluto dobbiamo tener presenti delle regole di scrittura che garantiscano che il testo battuto sia effettivamente traducibile in linguaggio macchina. L'insieme di queste regole di scrittura viene detto sintassi.

     Anche nella lingua naturale esistono delle regole sintattiche. Ad esempio uno dei modi in cui si può comporre una frase in italiano è:  articolo+nome+verbo   dove articolo, nome e verbo devono essere raccordati in numero (sing./plu.) e, eventualmente, in genere (m/f), e rispettare altre eventuali condizioni (es.: davanti ai nomi maschili singolari se iniziano con z, x, gn, pn, ps, s seguita da consonante o i seguita da vocale si può mettere uno non un; negli altri casi si può mettere un, non uno).

     Ma si tratta di regole che spesso presentano eccezioni e su cui spesso esistono opinioni contrastanti (ad es. qualcuno sostiene che davanti a pn - pneumatico, pneumotorace, … - occorre, o si può, usare un).

     Poi, anche se ci esprimiamo in modo un po' sgrammaticato, in genere ci capiamo allo stesso (di fronte al cartello «attendi - lo cane morzica» non abbiamo difficoltà a interpretarlo come «Attenti: il cane morsica»).

     Nel caso dei linguaggi di programmazione le regole sintattiche sono invece definite senza ambiguità ed eccezioni (per questo si parla di linguaggi formali) e devono essere rispettate rigorosamente: se invece di GOTO si è scritto G0TO (uno zero al posto della prima "o") il programma traduttore non può meccanicamente individuare l'operazione che l'utente voleva indicare.

     Vediamo alcuni primi aspetti della sintassi di QB.

   Innanzitutto occorre precisare quali sono i segni che costituiscono l'alfabeto di QB. Essi non sono altro che i caratteri battibili con la tastiera di un calcolatore: lettere dell'alfabeto, cifre, segni di interpunzione, alcuni simboli matematici (+,–,*,/,^,=,<,>,…), altri caratteri speciali ($,#,…), lo spazio bianco () e il ritorno a capo (¿).

   Per denotare dati, insiemi di dati, etichette, … vengono usate particolari espressioni che vengono chiamate nomi (o identificatori). Si tratta delle espressioni inizianti con una lettera e composte da lettere, cifre o punti.

Sono escluse le parole chiave, cioè le espressioni che hanno un significato predefinito e sono impiegate come elementi costitutivi di particolari istruzioni, termini, formule,…, come ad esempio: print, goto, …; si tratta delle espressioni che in questa descrizione della sintassi di QB vengono scritte in grassetto.

Esempi:             A       B3     x      fattore      n.dati    Introduzione

     Due nomi che differiscono solo per le dimensioni (minuscolo/maiuscolo) di una o più lettere sono considerati uguali dal programma traduttore. Quindi se nel testo di un programma i nomi X1 e avvio di una variabile e di una etichetta (vedi sotto) vengono modificati in x1 e in AVVIO, il programma traduttore continua a produrre lo stesso programma in linguaggio macchina.

   Come variabili numeriche si possono prendere nomi qualunque.

   Le espressioni costituite da cifre, eventualmente da un punto e dai caratteri + e - (solo se collocati in testa) sono costanti numeriche.

Esempi:                0.045    -7.31    .6861     1

     Si possono anche aggiungere la lettera E, eventualmente + o , e una o più cifre.

Esempi:                4E-3     1.2E23   75E10     -1E0

   I seguenti caratteri sono operatori aritmetici:       +      *   /   \   ^

   Le variabili numeriche, le costanti numeriche e le espressioni ottenute combinando variabili numeriche e costanti numeriche mediante operatori aritmetici e coppie di parentesi vengono dette termini numerici.

Si noti che gli operatori aritmetici devono essere sempre esplicitati.

Ad esempio a volte nell'usuale linguaggio matematico si scrive  3x   invece di x ·3  (o di x) intendendo che  3x   stia per "3 volte x" (o per "3 per x"). Qui invece il termine  3x  verrebbe interpretato come un'espressione senza senso. Analogamente a volte scrivendo  ax  si intende intende indicare il risultato della moltiplicazione di a per x. In QB l'espressione  ax  verrebbe invece interpretata come un unico nome.

Inoltre non si possono scrivere espressioni a più piani. Quindi al posto di 32 e di occorrerà battere 3^2 e 2/(a+b).

   Sono istruzioni di assegnazione le espressioni del tipo:

cioè tutte le espressioni che si possono ottenere dalla espressione nel riquadro mettendo una variabile numerica al posto di Variabile e un termine numerico al posto di Termine. La coppia di parentesi quadre indica che è facoltativo aggiungere in testa all'istruzione la parola chiave let ("let" in inglese significa "sia"), seguita da uno spazio bianco.

Es.:                       LET A=120          B=C              somma=dato1+dato2

     Di fronte a un'istruzione come k=100/tot il programma traduttore dovrà far corrispondere in ordine le seguenti operazioni-macchina: 

   il caricamento di 100 nel 1° registro di lavoro,

   il caricamento nel 2° registro di lavoro del numero contenuto nella cella di memoria (così chiameremo un registro di memorizzazione, cioè una sequenza di flip-flop impiegata per memorizzare un dato) associata alla variabile tot,

   il calcolo del risultato della divisione,

   il suo trasferimento nella cella di memoria associata alla variabile k.

     Non vi è un'associazione fissa tra variabili e celle di memoria, come accadeva per il pocket considerato in §1 (ogni lettera impiegata individuava una ben precisa memoria-utente). Infatti le variabili impiegabili sono in quantità enorme: si pensi ad esempio che solamente le parole di 8 lettere sono 222222226=268=208827064576, più di 200 miliardi. Non avrebbe senso costruire calcolatori con tante celle di memoria quanti i nomi di variabile che una persona si potrebbe inventare.

     Solo man mano che incontra una nuova variabile il programma traduttore associa ad essa una nuova cella di memoria; a questa cella dovrà riferirsi ogni volta che ri-incontrerà la stessa variabile. Ad esempio quando incontra k=100/tot mentre traduce il programma (1.4), per trovare il valore di tot deve considerare la cella di memoria che ha associato a tot nella riga [1] del programma.

     Più in generale a un'assegnazione corrisponde la memorizzazione (nella cella di memoria assegnata alla variabile scritta a sinistra di "=") del valore del termine scritto a destra. Questo valore viene calcolato dando il significato usuale agli operatori aritmetici, tenendo conto delle parentesi e rispettando la gerarchia se-guente: prima l'elevamento alla potenza (^), poi la negazione (), poi moltiplicazione e divisione (*,/), poi divisione intera (\), poi addizione e sottrazione (+,), e, a parità di grado, prima l'operazione più a sinistra.

Nota. Questa gerarchia è simile a quella usuale (®scheda 4 di Le statistiche, §1); la sola differenza è che la negazione (o cambio-segno) non è prioritaria rispetto a "*" e "/". Comunque le due gerarchie danno in genere luogo a termini algebri-camente equivalenti in quanto (–x)·y equivale a –(x·y). Gli unici problemi si possono trovare di fronte a termini come 5^–3·2: secondo una convenzione questo termine sta per 5^–(3·2), che equivale a 5–6 e vale 0.000064, secondo l'altra sta per 5^(–3)·2, che equivale a 2/53 e vale 0.016. Per evitare ambiguità e rendere più leggibili i programmi conviene abbondare in parentesi. Nel caso della scrittura a più piani non sorgono questi problemi (nel primo caso si scriverebbe 5–3·2, nel secondo 5–3·2).

     Il programma compila (che trovi nel software macosa) illustra come avviene la traduzione in linguaggio macchina di un'assegnazione. Sotto è riportato qualche esempio.

 

 

 

 

 

 

   (a)  Scrivi un'assegnazione da dare come input a compila per ottenere l' output:

                                                                                     1   R2=1/3        3 R0=R3+R1

                                           2  R3=R1^R2

  (b)  Qual è l'output se l'input è:   C=F+U*N   (scrivi le assegnazioni elementari e traccia il grafo ad albero)                                                                             [verifica le risposte usando COMPILA]

 

   Sono istruzioni di stampa le espressioni del tipo:

dove con ListaDiTermini si è indicata una sequenza di uno o più termini separati mediante virgole o punti e virgola; al posto di un termine si può anche non battere nulla (vedi gli ultimi due esempi seguenti: nel primo non si è messo alcun termine tra due virgole, nel secondo si è messa solo la parola chiave).

Es.:                PRINT dato1/100       PRINT a;b,a+b       PRINT 1,,2       PRINT

     L'azione corrispondente è la visualizzazione uno dopo l'altro dei valori dei termini elencati. Il punto e virgola non sposta la penna di scrittura, per cui dà luogo a stampe ravvicinate, la virgola invece fa avanzare la penna di scrittura (più precisamente la sposta alla successiva "colonna di tabulazione":  le colonne di tabulazione sono le colonne 1, 15, 29, 43, 57 e 71).  Dopo la stampa dei valori indicati la penna di scrittura va a capo (in particolare l'istruzione costituita solo dalla parola chiave PRINT ha come unica azione un "a capo"), a meno che alla fine di ListaDiTermini ci sia un separatore (, o ;) che ne fissi diversamente la posizione.

     Il valore di un numero viene comunque sempre seguito da uno spazio bianco e, se non è negativo, preceduto da uno spazio bianco.

     Per vedere l'effetto di print posso eseguire direttamente delle istruzioni battendole nella finestra comandi. A fianco è riprodotto un esempio in questo senso, con le relative uscite.

   Sono istruzioni di input le espressioni del tipo:

dove con ListaDiVariabili si è indicata una sequenza di una o più variabili separate mediante una virgola.

Es.:                        INPUT X           INPUT A,B,x,y

     L'azione corrispondente è analoga a quella delle istruzioni di assegnazione: il calcolatore attende che l'u-tente batta (separate da virgole) tante costanti quante sono le variabili della lista e alla fine il tasto ¿; quindi ad ogni variabile assegna come valore la corrispondente costante. Alla fine la penna di scrittura va a capo.

   Sono istruzioni di salto le espressioni del tipo:

dove Etichetta è un nome (etichetta-nome) o una sequenza di cifre (etichetta numerica).

Es.:             GOTO 100      GOTO 5       GOTO Introduzione       GOTO ControlloDato

     L'azione corrispondente è il trasferimento dell'esecuzione del programma all'istruzione preceduta da Etichetta.

   I simboli seguenti sono simboli relazionali: =<>>=<=<>

    Una espressione ottenuta combinando due termini numerici mediante un simbolo relazionale (cioè un'espressione del tipo TermineSimboloRelazionaleTermine) è una condizione.

Esempi:                X<0         A=B        dato1-dato2>=0

   Sono istruzioni di test le espressioni del tipo:

Esempi:         IF X<0 THEN Y=-X                IF a=b THEN GOTO Fine

     L'azione corrispondente è:

        nulla (cioè non c'è alcuna azione) se Condizione è falsa,

        l'esecuzione di Istruzione se Condizione è vera.

La verità o meno di Condizione è determinata calcolando i valori dei termini confrontati e riferendosi al significato usuale dei simboli relazionali (<> sta per ≠, <= sta per ≤, …).

Considera le istruzioni:     IF 1=0 THEN PRINT x    e    IF x=1/0 THEN PRINT x

Sono entrambe istruzioni sintatticamente corrette, cioè il programma traduttore riesce a tradurle in linguaggio macchina? E, in caso affermativo, vengono eseguite senza causare arresti e messaggi di errore?

   Un programma è una sequenza di una o più istruzioni separate l'una dall'altra da un ¿ (cioè collocate in righe successive). In testa a ogni istruzione si può mettere un'etichetta, immediatamente seguita da un due punti se si tratta di un'etichetta-nome.

     L'azione corrispondente all'esecuzione di un programma è l'esecuzione delle istruzioni che lo compongono una dopo l'altra.

     Per facilitare la lettura di un programma si possono aggiungere spazi bianchi (senza spezzare parole chiave, nomi, costanti, …) e righe vuote, cioè ¿ (senza spezzare istruzioni).

  Analizza il programma (1.4) e individua i tipi di istruzione che vi compaiono, le costanti, le etichette e le variabili.

     Con le istruzioni che abbiamo descritto in questo paragrafo si possono costruire programmi che permettono di descrivere ed eseguire ogni tipo di algoritmo numerico. Vedremo, tuttavia, nel prossimo paragrafo e in altre schede di lavoro, che QB ammette molti altri tipi di istruzioni, che facilitano la descrizione degli algoritmi.

 

     Prima di proseguire, facciamo un attimo il punto sulle convenzioni che stiamo usando per descrivere la sintassi di QB, alcune delle quali sono esemplificate nella figura a fianco.

Esempio

Descrizione

 

PAROLA CHIAVE

Il maiuscolo grassetto viene usato per indicare parole chiave (nell'esempio di sopra, let); l'utente può scriverle usando caratteri maiuscoli o minuscoli.

 

VariabileSintattica

Le parole in corsivo sono variabili sintattiche, cioè nomi che nella scrittura delle istruzioni devono essere sostituiti con una espressione del tipo indicato (ad es. al posto di Termine occorre sostituire un termine).

 

simbolo

Le espressioni scritte in "stile" normale (né in grassetto né in corsivo) sono simboli o altre espressioni del linguaggio QB, da scrivere senza modifiche (nell'esempio di sopra,  =).

 

         ¿

Simboli impiegati per indicare lo spazio bianco e l'"a capo"

 

[espressione]

Le espressioni racchiuse tra parentesi quadre in grassetto sono facoltative.

 

{espressione1|espressione2}

Due o più espressioni separate da una barra verticale in grassetto all'interno di parentesi graffe in grassetto sono alternative: deve essere utilizzata una sola di esse.

 

espressione

Tre puntini ravvicinati indicano che l'espressione descritta imme-diatamente alla loro sinistra può essere ripetuta una o più volte.

 

   

    Ad esempio avremmo potuto descrivere Cifra come un'espressione del tipo:

{0|1|2|3|4|5|6|7|8|9}

ListaDiVariabili come:

Variabile[,Variabile]

(posso scrivere una sola variabile o posso aggiungere a essa una virgola e un'altra variabile e ripetere questa aggiunta più volte)

e un Programma come:

[{EtichettaNome:|EtichettaNumerica}]Istruzione

[¿[{EtichettaNome:|EtichettaNumerica}]Istruzione]

     L'help di QB consente di avere immediatamente alcune informazioni relative alla parola chiave su cui è posizionato il cursore. Se ad esempio si è posizionati su print si può ottenere un riquadro simile al seguente:

     Come si vede, la sintassi è descritta in modo abbastanza simile a quello impiegato nella scheda. Cambiano alcune terminologie (si parla di "espressioni" invece che di "termini") e sono indicate delle forme nuove (che noi vedremo in seguito) che possono essere date alle istruzioni di stampa.

5. Automatizziamo qualche procedimento di calcolo

  Completa il programma (5.1)  in modo che sia utilizzabile ripetutamente per visualizzare il risultato di una moltiplicazione (di due numeri introdotti come input dall'utente).

(5.1)

[1]

[2]

[3]

[4]

Via:

GOTO

  Completa il programma (5.2)  in modo che sia usabile ripetutamente per visualizzare il valore scontato del 25% del prezzo man mano introdotto come input dall'utente.

(5.2)

[1]

[2]

[3]

[4]

Via:

PRINT p*75/100

Che cosa "stampa" sullo schermo il programma (5.3) ?

(5.3)

[1]

[2]

[3]

[4]

i=0

5 i=i+1

PRINT i

IF i<10 THEN GOTO 5

 

Completa il programma (5.4) in modo che calcoli la media aritmetica di n dati (il numero n e i singoli dati sono introdotti dall'utente). Verifica la correttezza del programma facendolo eseguire dal calcolatore (la versione incompleta è già registrata come "es_media" nel sottodirectory aut di macosa).

(5.4)

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

INPUT n.dati

i=0 : somma=0

Introduzione: 

  INPUT

  somma=somma+dato

  i=i+1

IF i<n.dati THEN GOTO

PRINT somma/

 

 

         Il programma (5.4) può essere tradotto nel diagramma di flusso a fianco. Anche il linguaggio dei diagrammi di flusso serve per descrivere programmi, anche se, a differenza di QB, del Pascal, … , non impiega solo caratteri ma anche altri simboli grafici.

La differenza principale del linguaggio dei diagrammi di flusso rispetto a QB è che l'ordine di esecuzione è indicato dalle frecce che collegano i riquadri che contengono le varie istruzioni.  Quale (o quali) tra le istruzioni descritte nel §4 passando al linguaggio dei diagrammi di flusso non corrisponde a un semplice riquadro contenente l'istruzione ma assume forme differenti?

 

     Il programma (5.5) calcola la media aritmetica in maniera diversa da (5.4): con esso non dobbiamo sapere a priori qual è il numero dei dati e introdurlo come input iniziale, ma dobbiamo man mano rispondere se abbiamo altri dati da introdurre o no.

 

(5.5)

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

i=0

sum=0

Introduzione:

   INPUT dato

   sum=sum+dato

   i=i+1

   PRINT ,"vuoi altri dati (s/n)";

   INPUT risp$

IF risp$="s" THEN GOTO Introduzione

PRINT "numero dati ="; i

PRINT "media ="; sum/i

    A fianco è riportato lo stato dello schermo dopo una esecuzione di (5.5).

 

     In questo programma abbiamo usato termini non numerici: non vengono stampati solo numeri ma anche sequenze di caratteri (vedi righe [7], [10] e [11]); la variabile risp$ in [8] e [9] non ha come valore un numero, ma un carattere.

     In QB possiamo infatti considerare anche:

   le costanti stringa, cioè le espressioni inizianti e terminanti con il carattere " e contenenti caratteri diversi da " e da ¿ (la parola deriva dal fatto che le sequenze di caratteri vengono chiamate anche stringhe),

                                                                            Es.:        "Gianni"     "batti un dato"     "150"

   le variabili stringa, cioè le espressioni che hanno la forma di un nome seguito immediatamente dal carattere $,

                                                                            Es.:            A$       cognome$       c1$

   i termini (o espressioni) stringa, cioè le variabili stringa, le costanti stringa e le espressioni che si possono ottenere combinando queste con l'operatore +.

                                                                           Es.:               nome$+" "+cognome$       x$+"1"

     Possiamo estendere tutte le istruzioni considerate nel paragrafo precedente mettendo al posto di Variabile e Termine variabili e termini stringa, a patto che nelle istruzioni di input e di assegnazione a ogni variabile sia assegnato un valore dello stesso tipo (numerico o stringa) e che nelle condizioni delle istruzioni di test siano confrontati termini dello stesso tipo.

                   Es.:            nome$="Mario"          IF N$="Lia" THEN PRINT "ama "+"Guido"

     Come si è visto con l'esecuzione di (5.5), le istruzioni di stampa non visualizzano sullo schermo le virgolette iniziale e finale e, in risposta a un'istruzione di input in cui si richiede una costante stringa, l'utente può fare a meno di racchiuderla tra virgolette.

[è necessario mettere le virgolette se la stringa da battere come input inizia con spazi bianchi, che altrimenti si perderebbero, o se contiene una virgola, che altrimenti verrebbe interpretata come delimitatore finale della costante].

     Il valore di un termine stringa viene calcolato interpretando il simbolo + come l'operazione di concatenazione: il programma a fianco mette in x$ la stringa "nata" (vengono eliminate le virgolette intermedie) e fa comparire sullo schermo nata.

x$="nat"+"a"

print x$

[Confronta, usando l'help, l'istruzione PRINT con l'istruzione di stampa alternativa WRITE]

     Il confronto tra stringhe è basato sull'ordinamento alfabetico e (a differenza di quello che accade per i nomi di variabile) tiene conto della dimensione dei caratteri: le lettere maiuscole precedono le lettere minuscole; inoltre le cifre precedono le lettere.  Quindi "via"="Via" è falsa mentre "Gian"<"Gianni" è vera ("Gian" precede "Gianni" nell'ordinamento alfabetico).

[ad essere più precisi i caratteri sono ordinati sulla base della loro codifica in bit: "." precede "0" e "0" precede "A" poiché il codice ASCII assegna a ".", "0" e "A" i byte 00101110, 00110000 e 01000001, che sono in ordine alfabetico - rispetto all'alfabeto 0,1]

Se, durante l'esecuzione di (5.5), alla domanda "vuoi altri dati (s/n)?" l'utente introduce "S" (esse maiuscola) come prosegue l'esecuzione?

Sapendo che i programmi (5.6) e (5.7) sono equivalenti,  nel senso che a parità di input danno gli stes-

si output (a fianco è riportato un esem-pio d'uso), spiegate quali azioni vengono comandate dalle istruzioni di input e di test  sotto descritte, che sono di tipo più generale di quelle considerate in §4.

INPUT[CostanteStringa;]ListaDiVariabili

IFIstruzioneTHENIstruzione[ELSEIstruzione]

(5.6)

[1]

[2]

[3]

[4]

[5]

10

INPUT "introduci due numeri (separati da virgola)"; x,y

IF y>=x THEN max=y ELSE max=x

PRINT "il massimo è "; max

GOTO 10

 

(5.7)

[1]

[2]

[3]

[4]

[5]

[6]

10 PRINT "introduci due numeri (separati da virgola)";

INPUT x,y

IF y>=x THEN max=y

IF x>y THEN max=x

PRINT "il massimo è "; max

GOTO 10

     In pratica, la nuova forma assunta dall'istruzione di input permette di estendere il prompt "?" che compare normalmente aggiungendo un messaggio che ricordi all'utente che cosa deve introdurre.

  Completa (5.8) in modo che, dato un numero intero in input, dia come output "pari" o "dispari" a seconda che il numero battuto sia pari o dispari.

(5.8)

[1]

[2]

[3]

[4]

[5]

10 INPUT "introduci un numero intero";

q=

IF        THEN a$=      ELSE  

PRINT "il numero è "+a$

GOTO 10

(idea: dire che n è pari equivale a dire che la divisione di n per 2 dà un risultato intero, cioè che la divisione intera fornisce il risultato esatto: se  q=n\2 si ha q*2=n)

Il programma (5.9) (già memorizzato come divisori.bas nel directory aut) dovrebbe calcolare i divisori di un numero intero positivo e produrre uscite come quelle riprodotte in figura 2. Invece produce uscite come quelle riprodotte in figura 3. Infatti esso contiene due errori. Trovali, correggili e prova a eseguire la nuova versione del programma per controllare la correttezza delle tue conclusioni. Quindi registra la versione corretta come divis-ok.bas.

(5.9)

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

10 INPUT "Batti (per esteso) un numero intero n, 0<n≤10000"; n

IF n>1000 THEN GOTO 10

PRINT "  I suoi divisori sono: ";

d=1

20 q=n/d

   IF q*d=n THEN PRINT d;

   d=d+1

IF d<=n THEN GOTO 20

PRINT

GOTO 10

 figura 2  

 figura 3   

(a) Dalla figura 2 deduci qual è il massimo divisore che è comune a 96, 144 e 9216 (o, più in breve, il m.c.d. – massimo comune divisore – di 96, 144, 9216).  (b) Qual è il m.c.d. di 9216 e 96?  (c) Qual è il m.c.d. di 9973 e 9216?               (a)                        (b)                        (c)

     Il programma (5.10) (memorizzato come indovina.bas in aut) rappresenta un buon giocatore a Indovina numero (®scheda 1, quesito 15): tu pensi un numero tra 0 e 100 e il programma fa ripetuti tenta-

vi di indovinarlo; da tastiera, de-vi man mano rispondergli se il numero pensato è minore, mag-giore o uguale al numero che lui ti "ha detto".

     A fianco è raffigurato un im-piego del programma (il numero pensato era 73).

     Il programma presenta due nuovi tipi di istruzioni.

     Le righe [1]-[6] contengono delle istruzioni di commen-to: si tratta di sequenze  di carat-teri inizianti con un apostrofo (o

con REM, dall'inglese "remake", cioè "nota"): appena incontra l'apostrofo (o rem) il programma traduttore salta alla riga successiva, senza tentare di tradurre in linguaggio macchina il testo che va dall'apostrofo al primo ¿.

     Grazie a queste istruzioni è possibile introdurre annotazioni che spieghino il significato di certi pezzi del programma; fare ciò è assai utile sia per chi redige il programma (per aiutarlo a ricordarsi, se riprende in mano il programma dopo un po' di tempo, perché ha steso il programma in un certo modo), sia per altre persone che lo leggano e lo usino successivamente.

     Le righe [8], [12], [16], [17] e [18] contengono più istruzioni concatenate con dei due punti. Chiameremo istruzione-riga (o riga di istruzioni) ogni sequenza di tal genere e istruzione semplice  le istruzioni che avevamo considerato finora:

IstruzioneRiga    sta per     IstruzioneSemplice[:Istruzione semplice]

     L'esecuzione di un'istruzione-riga si traduce nell'esecuzione ordinata, da sinistra a destra, delle istruzioni semplici che la compongono.

(5.10)

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

[15]

[16]

[17]

[18]

[19]

[20]

[21]

[22]

' Programma che simula un buon giocatore a Indovina Numero

' Strategia impiegata:

' - man mano si tenta con il numero che sta a metà dell'intervallo [N1,N2]

'   in cui si sa che deve cadere il numero cercato (vedi:  Tentativo)

' - in base alla risposta che si riceve si decide se restringere la ricer-

'   ca a destra o a sinistra rispetto al numero tentato (vedi:  Risposta)

Via:

  N1=0 : N2=100 : n.tentativi=0

Tentativo:

  n.tentativi=n.tentativi+1

  PRINT N1,N2,

  dif=N2-N1 : N=N1+dif\2 : PRINT "dico "; N

Risposta:

  INPUT "il numero pensato è minore (<), maggiore (>) o uguale (=)"; risp$

  IF risp$="=" THEN GOTO FineGioco

  IF risp$=">" THEN N1=N : GOTO Tentativo

  IF risp$="<" THEN N2=N : GOTO Tentativo

  PRINT "ribatti" : GOTO Risposta

FineGioco:

  PRINT "Impiegati"; n.tentativi; "tentativi"

  INPUT "altra partita (1: sì, 0: no)"; risp

  IF risp=1 THEN GOTO Via

  Spiega il ruolo delle assegnazioni in riga [12] e la funzione della riga [18].

  Se sostituissi [16]e[17] con le linee di programma a fianco otterrei gli stessi output? Perché?

IF risp$=">" THEN N1=N

GOTO Tentativo

IF risp$="<" THEN N2=N

GOTO Tentativo

     L'uso di istruzioni-riga può essere utile sia per facilitare la stesura di un programma (ad esempio consente di comandare con degli if-then-else non solo singole istruzioni semplici, ma delle sequenze di istruzioni), sia per facilitarne la lettura e la comprensione (ad esempio nella riga [8] di (5.10) sono state raggruppate le istruzioni che assegnano i valori iniziali di N1, N2 e n.tentativi).

     Il programma (5.11) (memorizzato come rad-qua.bas in aut) permette di calcolare la radice quadrata di un numero y (>0), cioè il numero positivo x che rende vera l'equazione x=y.

     Man mano che l'utente preme "a capo" vengono generate una approssimazione per difetto x1 e una per eccesso x2 man mano migliori.

     Come si vede si è impiegata una strategia simile a quella a cui si è ricorsi per Indovina numero: a ogni passo si dimezza l'intervallo in cui cercare il numero. Nella pagina seguente è riprodotto un esempio d'uso di questo programma.

(5.11)

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

CLS

INPUT "numero di cui cercare la radice quadrata"; y

PRINT "batti 'f' per finire, solo 'a capo' per continuare"

IF y>1 THEN x1=1 : x2=y ELSE x1=y : x2=1

Ciclo:

  h=x2-x1 : x=x1+h/2

  IF x*x<y THEN x1=x ELSE x2=x

  PRINT x1,x2, : INPUT a$ : IF a$="f" THEN END

GOTO Ciclo

     In testa al programma è stata messa un'istruzione di pulizia dello schermo, CLS, di cui si è già discusso nel quesito 3. Se non si vuole cancellare la finestra di output ma si vuole solamente staccare le uscite del programma da altre eventuali scritte che siano già presenti sullo schermo, al posto di CLS si può mettere PRINT.

     Nella riga [8] è presente la istruzione di arresto END a cui corrisponde l'azione di arrestare l'esecuzione del programma.

 

     Se si batte "f" il programma si arresta, se si batte altro o si preme solo ¿ l'esecuzione prosegue a partire dalla riga [5]; la pressione del solo ¿ equivale a dare come input la stringa vuota, cioè "" (nessun carattere compreso tra le virgolette).

Discutete e motivate la scelta iniziale delle approssimazioni x1 e x2 (®[4]).

Come si può modificare il programma in modo da trovare la radice cubica di un numero positivo?

 

6. Hardware e software

     Il "cervello" del calcolatore è costituito oltre che dalla CPU (che esegue calcoli aritmetici elementari e confronti tra numeri codificati in bit, trasferisce dati dalle celle di memoria nei registri di lavoro,…) da una parte di circuiti dedicati solo alla memorizzazione (memoria centrale ).

     La memoria centrale si distingue in:

  ROM (read only memory: memoria di sola lettura), insieme di celle di memoria in cui sono contenute informazioni che ha inserito il costruttore e che l'utente non può modificare (ad esempio istruzioni in linguaggio macchina per effettuare particolari calcoli aritmetici, per riconoscere i dischi introdotti dall'utente, per far comparire al momento dell'accensione alcune informazioni sullo schermo, …), e in:

  RAM (random access memory: memoria a cui si può accedere liberamente), insieme di celle di memoria in cui (durante l'esecuzione di un programma o in seguito a opportuni comandi inviati dall'utente) possono essere memorizzati temporaneamente dati, program-mi, … .

     Per immagazzinare dati, programmi, … senza ingombrare permanentemente la RAM del calcolatore (o per far lavorare il calcolatore su insiemi di dati che non starebbero tutti contemporaneamente nella RAM), per memorizzare informazioni da usare più volte sullo stesso calcolatore o su altri dello stesso tipo o analoghi, …  si ricorre ad altri supporti per la memorizzazione (nastri magnetici, floppy disk -dischetti magnetici flessibili-, hard disk -dischi rigidi-…) sui quali possono essere registrate (e lette) con tecniche opportune, mediante dispositivi azionati dal calcolatore, sequenze di bit di varia lunghezza.

     Nei PC in genere questi supporti sono indispensabili in quanto la RAM si "azzera" automaticamente allo spegnimento del calcolatore. 

     Più personal computer possono essere collegati in rete, cioè collegati via cavo in modo da poter mettere in comune dati, programmi, risorse (ad esempio una stampante,… ).

     L'insieme dei programmi in linguaggio macchina che il calcolatore impiega per gestire programmi traduttori, per comunicare con unità periferiche (stampanti, supporti di memorizzazione,…), per utilizzare al meglio la RAM, … viene detto sistema operativo.

     Nei pocket computer esso risiede permanentemente tutto nella ROM; nei PC in genere buona parte del sistema operativo viene inserito nella RAM mediante un'unità periferica quando si inizia ad impiegare il calcolatore (ciò viene fatto automaticamente se il sistema è registrato sul disco fisso del PC).

     I sistemi operativi più diffusi (al momento) sui PC sono Windows-98 (PC Ibm-compatibili), il Mac-OS (PC Macintosh).

     Una sequenza di informazioni registrata (in forma codificata) nella RAM o su un disco o su altri supporti di memorizzazione sotto un nome specifico (il formato del quale dipende dal sistema operativo impiegato: vedi pag. 6) viene detta file (termine inglese il cui significato originale è "archivio");  ad esempio un file può essere costituito da una successione di dati numerici, da un programma, da un testo, da una rappresentazione grafica ,…

     La misura della memoria di solito viene espressa mediante un'unità pari a 210 (=1024) byte, detta kilobyte (e indicata con K o KB) poiché 1024@1000.  Per quantità maggiori si ricorre ai Megabyte: 1 MB = K2 @ 1 milione di byte  (nota: si usa KB invece di kB in quanto con la k minuscola si indicherebbero esattamente 1000 B).

Stima quanti K di memoria richiede la registrazione dei caratteri presenti in questa scheda.

     La figura seguente riproduce la finestra di "informazioni" sul funzionamento del computer con cui era stata redatta la precedente edizione di questo volume. Nel momento in cui è stata esaminata questa finestra il computer stava occupando i suoi, circa, 4MB di RAM in buona parte per eseguire programmi che fanno parte del sistema operativo (che, come si vede, al momento era alla sua versione 7.0.1: i sistemi operativi vengono aggiornati abbastanza frequentemente) e per usare un programma per elaborare testi. Una minima parte era occupata da un programma per realizzare disegni. Rimaneva disponibile più di un mega di RAM per "caricare" altre applicazioni (con questo sistema operativo è possibile tenere aperte contemporanea-mente più applicazioni).

     La struttura fisica del calcolatore (cioè l'insieme dei dispositivi meccanici, elettrici, magnetici ed elettronici che lo compongono) viene detta hardware (termine inglese il cui significato originale è "ferramenta"; è derivato da "hard"="duro" e "ware"="oggetto" per indicare letteralmente una "collezione di oggetti duri"), mentre i programmi vengono indicati con il termine software (neologismo, cioè nuova parola, che significherebbe letteralmente "collezione di oggetti molli").

     Come esempi di software noi abbiamo già considerato sia programmi in linguaggio macchina (ad esempio un ambiente di programmazione, come QB.EXE, e programmi tradotti in linguaggio macchina con esso, come GAME, CALCOL, GRAFUN) sia programmi redatti in linguaggi evoluti (il testo originale, non tradotto in istruzioni macchina, di un programma scritto in QB, come indovina.bas).

     Fanno parte del software anche il sistema operativo e altri programmi che hanno lo scopo di facilitare l'uso del sistema operativo o la ricerca di documenti o l'individuazione e l'eliminazione di "virus" o …

     Abbiamo già osservato che, oltre agli ambienti di programmazione (con cui si possono creare programmi), vi sono programmi in linguaggio macchina per redigere e memorizzare testi di vario genere, disegni, collezioni di dati, …. Ambienti di programmazione e programmi d'uso generale come questi vengono chiamati anche applicazioni e i file (programmi, testi, disegni, collezioni di dati, …) creati e leggibili mediante essi vengono detti documenti.

7. I fogli elettronici

     I linguaggi di programmazione sono lo strumento tipico per automatizzare procedimenti di calcolo. Esistono però anche altre applicazioni che possono essere utilizzate al loro posto.

     Ad esempio i fogli elettronici (spread sheet). Ne esistono numerosi tipi (per citare i più famosi, ricordiamo l'Excel e il Lotus), ma tutti con un funzionamento abbastanza simile.

     Assai facili da usare sono i fogli elettronici presenti nei cosiddetti integrati. Un integrato è un'applicazione che contiene come sottoprogrammi applicazioni per elaborare testi, per realizzare disegni, per organizzare schedari, per fare calcoli, per comunicare mediante collegamenti telefonici, …; il nome "integrato" deriva dal fatto che è possibile "integrare" facilmente l'uso delle varie sottoapplicazioni (scambiare documenti tra una sottoapplicazione e l'altra, passare da una sottoapplicazione all'altra senza uscire dall'integrato). Ciascuna sottoapplicazione, ad esempio l'elaboratore testi o il foglio elettronico, è meno sofisticata di una applicazione dedicata esclusivamente allo stesso scopo; ma, in cambio, è molto più facile da usare. Anche di integrati ne esistono numerosi modelli (MsWorks, ClarisWorks, …).

Nota. Abbiamo citato applicazioni prodotte da grandi aziende produttrici di software. Si tratta di applicazioni molto efficienti e complete, ma molto costose. Esistono anche applicazioni analoghe (prodotte da piccoli produttori, da studenti universitari, da persone che programmano per hobby,…), meno sofisticate ma sufficienti per gli usi più comuni, che sono liberamente riproducibili e che sono liberamente utilizzabili (freesoftware) o sono provabili per un po' di tempo, dopo il quale si è "invitati" a inviare una certa somma di denaro al produttore, ottenendo in cambio in genere una versione più estesa e un manuale di consultazione (sharesoftware).

     I fogli elettronici sono applicazioni che permettono di preparare, elaborare (e rappresentare graficamente) tabelle di dati simili alla tabella (7.1), relativa a una scuola secondaria superiore (®scheda 4 di Le statistiche). Nelle celle (A1, B1, …, A2, B2, …) si possono mettere costanti numeriche, costanti stringa o espressioni come quella nella cella A7, che, nell'uso, vengono chiamate formule.

     La "formula" in A7 va interpreta come una assegnazione:  PONI A7=A1-D1-C2+D2. In alcuni fogli elettronici invece di "=" occorre utilizzare un simbolo differente ("+" o "@" o …).

 

 

a.s. 1988/89

 

a.s. 1989/90

 

(7.1)

 

totale iscritti

ripetenti

totale iscritti

ripetenti

 

 

A

B

C

D

classe 1a

1

181

81

154

36

classe 2a

2

146

38

126

35

classe 3a

3

245

48

140

37

 

 

 

 

 

7

=A1-D1-C2+D2

 

 

 

 

8

=A2-D2-C3+D3

 

 

 

 

     Con opportuni comandi azionabili con la tastiera o con il mouse (che variano a seconda del tipo di foglio elettronico che si impiega) si può far sì che sullo schermo la tabella passi dallo stato raffigurato in (7.1) a quello parzialmente riprodotto in (7.2); cioè far sì che venga visualizzato il valore assegnato alle celle contenenti formule, cioè a A7 (che rappresenta gli abbandoni tra 1ª e 2ª) e A8 (abbandoni tra 2ª e 3ª).

 

 

 

 

(7.2)

7

54

 

 

 

 

8

8

 

 

 

 

     Le variabili A1, D1, … impiegate in queste assegnazioni, a differenza di quelle impiegate in QB, non sono dei nomi generici (a cui, nel corso della traduzione in linguaggio macchina, vengono assegnate delle celle di memoria), ma nient'altro che le coordinate delle celle della tabella. Esse rappresentano il valore numerico della cella o il valore associato alla cella da un'altra assegnazione.

  Se in B7 metto la formula  =A2/100, quale valore viene associato a B7?

       E se ci metto la formula =A7?

     I dati da elaborare non vengono introdotti mediante istruzioni di input, ma devono essere battuti direttamente nelle varie celle della tabella. Se ci si accorge che si è sbagliata la battitura di un dato o se, comunque, si vuole cambiarlo, basta posizionarsi sulla cella (con il mouse o con i tasti direzionali) e ribatterlo: automaticamente vengono ricalcolati e modificati anche i valori delle celle A7 e A8.

     In un ambiente di programmazione le assegnazioni vengono eseguite (a meno di "goto" …) secondo l'ordine con cui compaiono nella finestra di lista; gli esempi a fianco illustrano come i risultati dipendano dall'ordine delle assegnazioni (nel primo programma a2 assume il valore 3 poiché, in assenza di precedenti assegnazioni, a c3 viene automaticamente assegnato il valore 0).

     Il foglio elettronico, invece, ogni volta che si modifica una cella ricalcola tutti i valori: anche se prima scrivo in A2 la formula  =B1+C3  e scrivo dopo una formula di assegnazione in C3,  appe-

na ho completato questa seconda assegnazione viene automaticamente calcolato il valore da associare a C3 e ricalcolato il valore di A2:

 

A

B

C

 

 

A

B

C

 

 

A

B

C

 

 

A

B

C

1

 

3

 

 

1

 

3

 

 

1

 

3

 

 

1

 

3

 

2

=B1+C3

 

 

 

2

3

 

 

®

2

=B1+C3

 

 

 

2

33

 

 

3

 

 

 

 

3

 

 

 

 

3

 

 

=B1*10

 

3

 

 

30

 

formule

 

 

valori

 

 

formule

 

 

valori

 

 

 

 

A

B

 

 

A

B

 

 

1

1

=A1

 

1

1

 

 

 

2

=B2+1

=B1

 

2

 

 

 

 

3

=A2/10

=A1+A3

 

3

 

 

 

 

 

formule

 

 

valori

 

 

Prova a calcolare e descrivere lo stato del foglio elettronico passando dallo stato "visione formule" allo stato "visione valori" nel caso illustrato a fianco.

     Con opportuni comandi (con la tastiera o con il mouse) si possono selezionare delle celle, memorizzarne il contenuto e riprodurlo in altre celle.

     Se si tratta di una costante, essa viene riprodotta tale e quale. Se è una formula, può essere riprodotta in forma modificata.

     Ad esempio in (7.1) la formula in A8 (abbandoni tra 2ª e 3ª) non è stata battuta direttamente: è stata sele-zionata la cella A7 (abbandoni tra 1ª e 2ª) e se ne è riprodotto il contenuto in A8. Nella riproduzione la for-mula è stata automaticamente modificata: poiché rispetto ad A7 ci siamo spostati in basso di un po-sto, automaticamente le variabili vengono modificate in modo da riferirsi a celle tutte abbassate di un posto:  

A1  viene trasformata in  A2,  C2 in  C3, … , cioè =A1-D1-C2+D2 viene trasformata in =A2-D2-C3+D3, ….

      Nello stesso modo possiamo trovare automatica-

mente le espressioni che rappresentano gli abbandoni negli anni successivi.

 

         Se davanti a una "coordinata" metto $, essa non viene va-riata durante la riproduzione. Ad es. se in F1 ho  =$A5+C$2 e riproduco la formula in H4 ottengo  =$A8+E$2:  si modifi-cano solo 5 (+3, come da 1 a 4) e C (2 lettere avanti, come da F a H).

  Se in (7.1) metto in B8 la formula =B1/A1*100 viene calcolato e associato a B8 la percentuale dei ripetenti sugli iscritti alla prima nel 1988/89 (81/181·100). Se seleziono e ricopio B8 in D8 quale formula viene effettivamente registrata in D8? Che cosa rappresenta?

     Con una formula di assegnazione si possono effettuare calcoli riferiti anche a insiemi di celle. Ad esempio se volessi calcolare il totale degli iscritti nelle 5 classi della scuola di cui alla tabella (7.1), potrei mettere in una qualunque cella libera, ad esempio in A6, la formula di assegnazione  =Sum(A1:A5).  Infatti  Sum(A1:A5)  ha come valore la somma dei valori associati alle celle che stanno nel rettangolo di celle che va da A1 ad A5. Nel calcolo vengono saltate le celle del rettangolo che sono vuote.

[in alcuni fogli invece di "Sum" occorre impiegare un nome differente; in alcuni invece di Sum(A1:A5) occorre scrivere Sum(A1..A5); …]

 

 

a.s. 1988/89

 

a.s. 1989/90

 

 

 

totale iscritti

ripetenti

totale iscritti

ripetenti

 

 

 

A

B

C

D

E

classe 1a

1

181

81

154

36

 

 

 

 

 

 

classe 5a

5

234

4

232

1

 

 

6

=Sum(A1:A5)

 

=Sum(C1:C5)

 

 

 

Se in C6 abbiamo messo  =Sum(C1:C5) (vedi figura soprastante), quale formula appare in D6 se vi riproduciamo la formula di C6? Quale formula dobbiamo mettere in E6 per ottenere la percentuale dei ripetenti tra gli iscritti nel 1989/90 alla scuola che stiamo considerando?

          E quale formula dobbiamo mettere in E1 per ottenere la percentuale degli iscritti alla 1a (nel 1989/90)?  Come dobbiamo scrivere questa formula in modo che riproducendola in E2 si ottenga la percentuale degli iscritti alla 2a?

8. I programmi per il calcolo simbolico

     Un altro tipo di applicazioni impiegato per automatizzare calcoli di tipo matematico, a cui abbiamo già accennato (®scheda 4 di Le statistiche), è costituito dai programmi per il calcolo simbolico. Esisto-no sia applicazioni dedicate solo a tale attività, sia applicazioni impiegabili per molte attività di tipo matematico che, tra i loro sottoprogrammi, ne hanno alcuni destinati alla effettuazione di calcoli simbolici.

     Qui accenneremo a due di esse che sono di uso particolarmente semplice: Derive, operante sugli Ibm, e Milo, operante sui Mac. Le altre applicazioni hanno aspetti in comune con una o l'altra di queste due.

     Vediamo, ad esempio, come scrivere e trasformare A=πr2.

     Iniziamo da Derive. Ci riferiremo alla versione per Windows.

     Se si sceglie Espressione dal menu Crea/Author o se si "clicca" l'icona "matita" si ha la possibilità di scrivere (essere "autori" di) un'espressione.  Nella finestra di dialogo che appare battiamo l'espressione seguente (e infine ¿):

 

 A=pir^2

 

     "pi" viene usato per indicare pi greca. Non serve battere il segno di moltiplicazione: Derive, normalmente, usa come variabili singole lettere e quindi "comprende" che r è una nuova variabile (pi non viene interpretato come p*i in quanto "pi" è una parola "riservata", come input, print, … in QB). Nella parte superiore dello schermo appare:

 

            2

#1:  a = π r

 

[il simbolo "#" in matematica viene spesso usato al posto della parola "numero"]

     La variabile A viene visualizzata in minuscolo in quanto Derive, normalmente, scrive tutte le variabili in minuscolo, senza tener conto delle dimensioni impiegate dall'utente.

     Se dal menu scegliamo Dichiara possiamo modificare queste convenzioni linguistiche di Derive: si sceglie Stato Algebra - Inserimento nei successivi (sotto)menu e nella finestra di dialogo che compare successivamente si modificano le opzioni (qui rappresentate con sottolineature):

NomeVariabile:  Carattere   Parola        Maiuscole/Minuscole:  Sensibile   NonSensibile

Selezioniamo Parola (invece di Carattere) e Sensibile (invece di NonSensibile). Compaiono:

 

#2:  CaseMode := Sensitive

#3:  InputMode := Word

 

 

Se poi, riscelto Crea, battiamo esattamente ciò che avevamo battuto prima, otteniamo:

 

 

            2

#4:  A = pir

 

     Derive nella riga 4 ha interpretato pir come un'unica variabile e ha lasciato A in maiuscolo. Affinché Derive, con le opzioni scelte, interpreti il secondo termine dell'equazione come πr2 occorre che questo venga battuto in una delle seguenti forme: pi r^2, pi*r^2, (pi)r^2, … . Invece di pi si può anche battere Ctrl+P (che in Derive equivale alla lettera greca π); in altrenativa si può cliccare sul simbolo π che compare nella finsetra di dialogo di Crea.

     Se si clicca su #1 appare evidenziata la formula di riga 1. Per spostarsi da una riga all'altra si possono usare anche i tasti-freccia ­ e ¯. Queste e le altre frecce direzionali, azionate tenendo premuto il tasto Shift (Maiusc), consentono anche di evidenziare i vari sottotermini che costituiscono un termine o una formula:

  la freccia ¯ passa ai sottotermini "immediati" dell'espressione evidenziata,

  le frecce orizzontali permettono di passare da un sottotermine immediato di un'espressione a un altro sottotermine immediato della stessa espressione,

  la freccia ­ permette di passare dall'espressione evidenziata all'espressione di cui essa è sottotermine immediato.

Se disponete di Derive, provate a eseguire quanto descritto sopra. Poi provate a eseguire quanto descritto nella figura 4.

     Perché dopo l'azionamento di (Shift+) ¬ al punto 5 rimane evidenziato lo stesso sottotermine, mentre (punto 6) con l'azionamento di ® si ottiene la evidenziazione di un altro sottotermine?

     Quali tasti direzionali devi man mano battere per passare dallo stato finale di figura 4 alla evidenziazione della sola PI ?

figura 4

     E` importante padroneggiare la struttura di una formula o di un termine, non solo per svolgere a mano trasformazioni algebriche (®considerazioni sugli errori nelle attività algebriche in: Le Statistiche, scheda 4, §4), ma anche per usare i programmi di calcolo simbolico: con Derive, è possibile costruire nuove espressioni utilizzando sottotermini di espressioni già costruite, è possibile comandare l'esecuzione di una trasformazione algebrica solo su un sottotermine invece che sull'intera espressione, … . Qui non ci soffermiamo su tutti questi aspetti, che potrai poi man mano sperimentare in aula computer.

     Vediamo come esempio, come si può invertire la formula Ar2 per ricavare r in funzione di A. Si evidenzia #1. Si sceglie Algebricamente dal menu Risolvi. Appare una finestra di dialogo con visualizzata  l'equazione posta nella riga numero 1. In alternativa avremmo potuto battere direttamente l'equazione nella finestra di dialogo. In un opportuno riquadro occorre selezionare la variabile rispetto alla quale vogliamo risolvere l'equazione, cioè r. Se clicchiamo su "OK" appare su una nuova riga:

            2

SOLVE(a=p·r ,r)

     Se poi si azione Semplifica - Base si ottengono le due formule  r =  e  r = .

     Queste si sarebbero potute ottenere direttamente se nella finestra di dialogo di Risolvi si fosse cliccato su "Semplifica" invece che su "OK".

Verifica che queste sono soluzioni. Cioè opera in A=πr2 la sostituzione r=/e verifica se ottieni un'equazione vera. Poi fai la stessa cosa con la sostituzione r= /.

     Comunque, nel caso in questione, la soluzione  r = – …  non è significativa: r, in quanto misura di una lunghezza, non può essere un numero negativo.

Con Derive è possibile in abc2+d evidenziare bc? e c2+d? e bc2?     [motiva la risposta]

Usando Derive o un'altra applicazione che consente di svolgere calcoli simbolici, prova a scrivere i seguenti termini e la seguente equazione. Poi, con la stessa applicazione, prova a risolvere l'equazione rispetto a b2.

     Esistono anche applicazioni per scrivere espressioni matematiche, che non consentono però di effettuare calcoli simbolici. Un esempio tipico è l'Equation Editor in dotazione all'elaboratore di testi Word.

     Vediamo ad esempio come scrivere  .   Aperto l'Equation Editor appare il menu:

     Selezionato con il mouse il simbolo della divisione a 2 piani, compare la struttura del tipo   con caselle vuote al posto di termine1 e termine2. Le caselle vuote corrispondono ai "?" di Milo.

     Con il mouse o con i tasti freccia ci si può muovere dentro alla struttura e man mano completarla, come illustrato a lato.

—————————————

     Con le CT si possono svolgere le 4 operazioni e calcoli più complessi (elevamenti a potenza, radici quadrate e altre funzioni) in frazioni di secondo, mentre a mano per gli stessi calcoli si impiegherebbe molto più tempo e sarebbe facile commettere piccoli errori di distrazione (dimenticare uno zero o un riporto, scrivere o leggere male una cifra, interpretare male un incolonnamento, …) e ottenere risultati molto diversi da quelli corretti.

     Ai nostri giorni, e ormai da molti decenni, la capacità di eseguire a mano velocemente complicati calcoli aritmetici non è più considerata una abilità intellettuale particolarmente significativa. E in effetti richiede soltanto un po' di addestramento a svolgere alcune attività di tipo meccanico, che non a caso sono alla portata di dispositivi molto elementari, poco più complessi di un contagiri.

     Fino a qualche decennio fa per certi calcoli (ad esempio per le radici quadrate e per gli elevamenti a potenza) si usavano delle tavole numeriche che elencavano una grande quantità di input e i relativi output. Fino a qualche anno fa, in molti libri scolastici sono sopravvissute tavole simili, per calcoli di questo tipo o per altri calcoli che affronteremo più avanti (funzioni trigonometriche, logaritmi, …) e alcuni insegnanti vietavano l'uso delle CT in classe:  la scuola a volte recepisce in ritardo i cambiamenti nella cultura e nelle professioni.

     Ciò che è importante culturalmente e operativamente, per usare correttamente e consapevolmente le CT, è:

   capire, di fronte a una situazione problematica, quali calcoli occorre svolgere per risolverla (è inutile saper fare velocemente divisioni e moltiplicazioni se non si sa come affrontare il calcolo di una percentuale);

   saper stimare l'ordine di grandezza ed eventualmente qualche cifra significativa del risultato, sia attraverso calcoli approssimati, sia facendo considerazioni legate alla situazione (se dobbiamo determinare l'altezza di un palazzo ci aspettiamo che il risultato sia di poche decine di metri, nel caso dello spessore di un foglio di carta ci aspettiamo una misura vicina al decimo di millimetro);  ciò serve sia a fare valutazioni nei casi in cui si devono compiere delle scelte in tempi rapidi, sia a controllare le uscite della CT (un tasto mal premuto può dar luogo a risultati errati);

   conoscere le possibilità e i limiti della CT in modo da impostare correttamente i calcoli e da interpretarne le uscite.

     Su tutti questi aspetti ci siamo soffermati più volte.

     Possiamo fare considerazioni del tutto analoghe per i programmi per il calcolo simbolico: svolgono in pochissimo tempo (frazioni di secondo) calcoli che a mano richiederebbero molto più tempo e che sarebbe facile sbagliare per errori di distrazione.

     Fino a qualche anno fa era importante che un matematico o un fisico (e, in parte, un ingegnere) avesse un buon allenamento nello svolgere calcoli di tipo simbolico, anche se, a dire il vero, nella sua attività non avrebbe mai incontrato i calcoli "complessi" che venivano e vengono tuttora proposti come esercizi in molti libri di scuola:

un matematico e un fisico si trova spesso di fronte a formule che è difficile trasformare perché vi entrano in gioco funzioni particolari, più "strane" delle radici quadrate e degli elevamenti a potenza, non perché siano formule lunghe, a numerosi "piani", con tante lettere combinate in modi intricati, come accade negli esercizi di cui abbiamo parlato.

     L'impiego delle applicazioni per il calcolo simbolico ha diminuito l'importanza di questo allenamento. A maggior ragione, fra qualche anno (quando i mezzi di calcolo saranno ancora più diffusi e di più piccole dimensioni) i pochi di voi che nella vita si troveranno ad avere a che fare con calcoli simbolici di una certa complessità, non avranno da affrontarli a mano: le parti più meccaniche le demanderanno a un computer. Sarà invece importante che essi sappiano:

   descrivere situazioni mediante opportune formule;

   leggere un termine o una formula (la sua articolazione in sottotermini, …), conoscere le nozioni di base del calcolo simbolico (scegliere le regole di riscrittura da applicare, trovare le funzioni inverse e tener conto dei loro insiemi di definizione, …); queste abilità sono utili sia per lo svolgimento dei semplici calcoli simbolici che ricorrono frequentemente nelle attività scientifiche, sia per scegliere comandi, sottotermini, … usando un programma di calcolo simbolico per scrivere e elaborare una certa espressione;

   conoscere le modalità d'uso e il funzionamento dell'applicazione per il calcolo simbolico impiegata.

     Questi sono i motivi per cui nei nuovi programmi per la scuola secondaria superiore viene dato molto meno "peso" al cosiddetto "calcolo letterale"  di quanto ne fosse dato nei  "vecchi programmi" e, soprattutto, in molti dei libri di testo più diffusi.

     Del resto chi proseguirà gli studi in facoltà scientifiche raramente avrà a che fare con calcoli simbolici complessi. In genere gli studenti che nella scuola superiore hanno avuto un insegnamento della matematica che ha investito più tempo in attività di questo genere a scapito di attività meno "meccaniche" sono quelli che, negli studi universitari, incontrano maggiori difficoltà.

—————————————

     Abbiamo visto che, a seconda del linguaggio formale impiegato, può cambiare il modo in cui descrivere un termine. Ad esempio possono cambiare le convenzioni sull'ordine in cui vanno calcolate le diverse operazioni (possibilità di usare scritture a più piani, esplicitazione o meno del simbolo di moltiplicazione, rispetto di una "gerarchia", …), i nomi usabili come variabili, i simboli e i modi in cui indicare le costanti e le funzioni, … :

   QB:  x*2                                        Derive (scrittura):  x2 o x*2 o x 2 

     Derive (schermo)  x 2          Linguaggio matematico usuale:  x·2 (o 2x)

   QB:  SQR(2+a)  (®ques. 33)          Derive (scrittura):  sqrt(2+a)  o  √(2+a)

Derive (schermo)  √(2+a) o

Linguaggio matematico usuale:     grafun:  r(2+a)     CT:  

     Abbiamo già osservato che i linguaggi formali sono caratterizzati dalla distinzione tra regole di scrittura (aspetto sintattico) e regole di interpretazione (aspetto semantico): come scrivere espressioni corrette e quale significato dare a queste espressioni (abbiamo anche notato che pure per il linguaggio naturale esiste questa distinzione, ma è meno netta, e sia la sintassi che la semantica non sono riconducibili a un insieme di regole rigorose).

     Nel caso di QB l'espressione:    10INPUTx:PRINTx/(SQR(4)-2):GOTO10   è un programma, cioè è un'espressione costruita rispettando le regole sintattiche che indicano come si possono ottenere termini, istruzioni e programmi.

     E infatti se eseguo il programma non compare alcun messaggio che segnali la presenza di errori "sintattici": QB riesce a leggere il programma (e a tradurlo in linguaggio macchina).

     Ma, appena batto un dato dopo il prompt "?", l'esecuzione si arresta e viene segnalato un errore in corso di esecuzione (runtime error): "divisione per 0". Infatti il computer, nel dare un "significato" alle istruzioni, cioè nell'eseguire le azioni da esse comandate, si trova di fronte al calcolo di un termine indefinito.

     Nel caso di:    IF0>1THENPRINT"a"ELSEPRINT"b"   non abbiamo né errori sintattici né errori semantici: il computer dà come uscita b senza visualizzare alcun messaggio. La condizione 0>1 è scritta correttamente (non presenta errori sintattici) e il computer riesce a darle un significato, cioè a determinare che è una condizione "falsa" (non presenta errori semantici).

Considera le istruzioni IF2>>1THENPRINT"a" e IFSQR(1-2)>=0THENPRINT"a". Pre-sentano errori sintattici? errori semantici?

     Se, in Derive, se scrivo 0/0 non viene segnalato alcun errore: si tratta di un termine sintatticamente corretto. Se aziono il comando Semplifica Derive cerca di eseguire la divisione e ottengo la visualizzazione di "?": in questo modo Derive indica che si tratta di un termine indefinito.

9. Esercizi

 

 

 

ab/km2

n.indici

 

ITALIA

191

100

 

Abruzzi

117

61

 

Basilicata

62

 

 

Campania

425

 

 

Emilia-R.

177

 

 

Friuli-V.G.

154

 

 

Lazio

300

 

 

Liguria

321

 

 

 

 

 

 

Presa come dato base la densità della popolazione all'inizio del  1990 in Italia, vogliamo calcolare i numeri indici delle densità delle varie regioni italiane per evidenziare meglio in quali zone si è sopra e in quali si è sotto alla media nazionale e di quanto.

        Scrivi un programma che chieda come input iniziale il dato base, e, poi, ripetutamente, chieda un dato e ne calcoli e visualizzi il corrispondente numero indice.

        Usando questo programma completa la tabella a fianco (arrotonda agli interi i numeri indici ottenuti).

Nel seguente programma, che consente di tabulare la funzione radice quadrata e di cui sotto è riprodotto un esempio d'uso,  si utilizzano:

   una nuova forma dell'istruzione di input, nella riga [2];

   una nuova forma dell'istruzione di stampa, nella riga [3];

   il nome di funzione SQR, nella riga [3].

[1]  10

[2]  INPUT ; "x=", x

[3]  PRINT  TAB(15) "f(x)="; SQR(x)

[4]  GOTO 10

     Come si vede l'istruzione di input qui usata non ha come prompt il punto interrogativo, ma solo la costante stringa x=; inoltre non fa andare a capo la penna di scrittura. Dall'help di QB possiamo osservare che la forma più generale dell'istruzione di input è la seguente:

INPUT[;][CostanteStringa{;|,}]ListaDiVariabili

     L'help, in realtà, non usa un simbolo speciale per indicare lo spazio bianco. Anche noi spesso faremo altrettanto:

INPUT[;][CostanteStringa{;|,}] ListaVariabili

     Le azioni corrispondenti a questa istruzione sono, in ordine:

   Compare sul video un prompt costituito da:

?

in assenza di CostanteStringa{;|,}

CostanteStringa seguita da ?

in presenza di CostanteStringa;

CostanteStringa e basta

in presenza di CostanteStringa,

   Alle variabili presenti in ListaDiVariabili vengono assegnati ordinatamente i valori delle altrettante costanti numeriche introdotte dall'utente (separate da virgola)

   Alla fine       la penna di scrittura non si sposta               se dopo INPUT compare ;

   la penna di scrittura va a capo                     se dopo INPUT non compare ;

     Nell'istruzione di stampa si è ricorsi alla possibilità di usare come separatore in ListaDiTermini, invece che virgola o punto e virgola, l'espressione TAB(TermineNumerico). L'effetto è quello di spostare la penna di scrittura alla colonna n, dove n è il valore di TermineNumerico. Nel nostro caso TAB(15) fa sì che f(x)= venga scritto a partire dalla 15ª colonna.

     I nomi di funzione di QB vengono usati per richiamare alcuni calcoli predefiniti in QB, cioè per i quali QB ha incorporati dei sottoprogrammi in grado di eseguirli.

     Nel caso di SQR siamo di fronte al calcolo di una funzione numerica, cioè che a input numerici associa output numerici (in questo caso la radice quadrata dell'input). SQR può essere impiegato, come i simboli operazionali, per costruire termini numerici. In particolare consente di utilizzare termini dalla forma:

SQR(TermineNumerico)

     Più in generale abbiamo la possibilità di impiegare termini numerici dalla forma:

NomeDiFunzioneNumerica(TermineNumerico)

     Altri esempi di nome di funzione numerica sono ABS (calcolo del valore assoluto), FIX (calcolo del troncamento agli interi), SGN (calcolo del segno: a x associa 1 se x>0, –1 se x<0, 0 se x=0).

(1)  Modifica il programma riportato sopra in modo da tabulare la funzione x|® e eseguilo dando come input, man mano: 0, 1, –1, 2, –2, … . Che cosa ottieni?

(2)  Modifica lo stesso programma in modo da tabulare la funzione x|® sgn(x)·|x| e eseguilo dando come input, man mano: 0, 1, –1, 2, –2, … . Che cosa ottieni?

(3)  Modifica il programma prendendo come [3]:   PRINT TAB(15) "f(x)="; FIX(x+1/2)   e ese-guilo dando come input, man mano: 1.45, 1.57, 42.9, 42.3.  Che cosa ottieni? Come puoi modificare il programma del quesito 32 in modo che stampi direttamente i numeri indici arrotondati agli interi?

In QB sono predefinite anche funzioni che non hanno input e output entrambi numerici. Elenchiamone alcune, specificandone sintassi e semantica:

Sintassi

Semantica

esempio           valore

LEN(TermineStringa)

Restituisce la lunghezza della stringa rappresentata da TermineStringa

LEN("cane")

4

ASC(TermineStringa)

Restituisce la codifica ASCII del primo carattere della stringa rappresentata da TermineStringa

ASC("cane")

99

CHR$(TermineNumerico)

Restituisce il carattere che in ASCII è codificato con il valore di TermineNumerico

CHR$(99)

"c"

MID$(TermineStringa,t1,t2)

Se S è la stringa rappresentata da TermineStringa e m e n sono i valori di t1 e t2, restituisce la sottostringa di S lunga n a partire dal carattere m-esimo

 

MID$("Lassie",2,4)

"assi"

UCASE$(TermineStringa)

Restituisce la stringa rappresentata da TermineStringa trasformando in maiuscolo le lettere in minuscolo

UCASE$("AaBb3?")

"AABB3?"

TIMER

Restituisce il numero dei secondi trascorsi dall'avvio del computer

TIMER

ad esempio:      54629

TIME$

Restituisce la stringa che descrive l'ora segnata dall'orologio del computer

TIME$

ad esempio: "15:56:24"

 

(1)   Indica tra queste funzioni quali hanno:

  input numerico                                                  input stringa

  output numerico                                                output stringa

  input implicito (fornito non dall'utente ma automaticamente dal computer)

(2)  Qual è l'output del programma a fianco?

nome$="Giorgio" : cognome$="Rossi"

PRINT nome$+" "+UCASE$(cognome$)

(3)   Scrivi un programma che, ripetutamente, dando in input un carattere restituisca la sua codifica in ASCII e usalo per individuare la codifica delle 26 lettere minuscole e delle 26 lettere maiuscole dell'alfabeto inglese (nella risposta non elencare tutti i numeri di codice!)

(4)   Che cosa fa il programma a fianco? Prova a capirlo esaminandone il testo. Controlla la tua risposta facendolo eseguire dal computer.

10 IF TIME$=t$ THEN GOTO 10

PRINT TIME$ : t$=TIME$ : GOTO 10

(1) Redigi un programma che, dati in input gli esiti (V, P, S: vittoria, pareggio, sconfitta) delle partite disputate, visualizzi man mano il punteggio in classifica di una squadra di calcio. (2) Redigi un programma che, dando in input anche la sede della partita (C, F: casa, fuori casa) visualizzi pure il punteggio secondo la "media inglese" (prima osserva le classifiche riportate su un giornale del lunedì per capire come è calcolato questo punteggio).

 

 

 

A

B

C

D

 

 

1

 

dati

n.indici

dato base

 

 

2

ITALIA

191

 

=B2

 

 

3

Abruzzi

117

 

 

 

 

3

Basilicata

62

 

 

 

 

Quale formula devi mettere nella cella C2 del foglio elettronico parzialmente riportato a fianco in modo che (riproducendo tale formula nelle celle sottostanti)  nella colonna C appaiano i numeri indici di cui al quesito 32.

Progetta e redigi un foglio elettronico per calcolare la media di n dati messi nella colonna A (supponiamo che n100) avendo messo il valore di n nella cella B1. Utilizza "Sum".

Il programma sotto a sinistra, che calcola la media di n valori con n dato in input, contiene le nuove istruzioni:

FOR Variabile=TermineNumerico TO TermineNumerico      e     NEXT

[1]

[2]

[3]

[4]

[5]

[6]

[7]

INPUT n.dati

somma=0

FOR i=1 TO n.dati

  INPUT dato

  somma=somma+dato

NEXT

PRINT somma/n.dati

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

INPUT n.dati

somma=0

i=1

10 IF i>n.dati THEN GOTO 20

  INPUT dato

  somma=somma+dato

i=i+1 : GOTO 10

20 PRINT somma/n.dati

     Eseguendo questo programma QB si comporta come se esso fosse scritto nel modo riportato sopra a destra.  Cioè di fronte a un FOR v=t1 TO t2 ("per" v=t1 "fino a" t2) con t1 minore o uguale a t2:

   assegna alla variabile v (che impiega come contatore) il valore del termine t1

   esegue le istruzioni successive all'istruzione FOR fino a che incontra un NEXT e quindi incrementa v di 1, e ripete ciclicamente questo comportamento fin tanto che v non supera t2.

     Una fase di esecuzione in cui si ritorna ripetu-tamente a un medesimo punto del programma si chiama loop ("anello"). Anche nel linguaggio co-mune a volte si usa l'espressione "è andato in loop"

per dire che una persona si è impuntata, è entrata in un ragionamento da cui non riesce più a uscire. La se-quenza di istruzioni che vengono rieseguite più volte in questo loop viene chiamata ciclo.

     L'istruzione FOR ci fornisce, dunque, un modo per realizzare loop che è alternativo all'impiego dell'istruzione GOTO.

     Se t1 fosse maggiore di t2 il ciclo non verrebbe percorso neanche una volta. Nel caso del programma precedente se come n.dati si introduce 0, il programma salta alla riga [7] e, trovandosi di fronte al calcolo di 0/0, si arresta e visualizza un messaggio di errore.

     Il programma seguente simula la macchina cambia-monete considerata nella scheda 1.

     Più sotto è riprodotto un esempio d'uso (una persona che ha una moneta da 500 e vuole ottenere nel modo più veloce una moneta da 50).

     Completa le parti mancanti del programma.

     Che cosa accade se una persona introduce una moneta da 50 lire?

     Quale o quali sono le variabili impiegate come contatori?

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

PRINT "Cambi effettuati: 500=200+200+100, 200=100+100, 100=50+50"

Introduzione:

INPUT ; "Introduci moneta  ", m

IF m=500 THEN a=2 : b=1 : c=0 : GOTO Restituzione

IF m=200 THEN a=… : b=… : c=… : GOTO Restituzione

IF m=100 THEN a=0 : b=0 : c=2 : GOTO Restituzione

PRINT m : GOTO Introduzione

Restituzione:

PRINT "   cambio: ";

FOR i=1 TO … : PRINT 200; : NEXT

FOR i=1 TO b : PRINT 100; : NEXT

FOR i=1 TO c : PRINT …… ; : NEXT

PRINT

GOTO Introduzione

 

Redigi un programma che calcoli la distribuzione percentuale di n dati (essendo n dato in input), e in modo che man mano chieda:    batti il dato 1    batti il dato 2  

 

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

10 INPUT x$

y$=""

FOR i=1 TO LEN(x$)

   n=ASC(MID$(x$,i,1))

   IF n<123 AND n>96 THEN n=n-32

   y$=y$+CHR$(n)

NEXT

PRINT y$

GOTO 10

Che cosa fa il programma a fianco? Prova a eseguirlo dandogli diversi input stringa (usando sia caratteri minuscoli che caratteri maiuscoli). Capito "che cosa fa", cerca di spiegare "come fa" a farlo, cioè il ruolo delle diverse istruzioni che lo compongono (utilizza anche quanto trovato al punto (3) del quesito 34).

Quale, tra le seguenti rappresentazioni sintattiche, corrisponde alla descrizione dell'istruzione di stampa?

PRINT[[Termine]{,|;|TAB(TermineNumerico)}]

PRINT[Termine]{,|;|TAB(TermineNumerico)}

PRINT[{Termine}{,|;|TAB(TermineNumerico)}]

(posso non scrivere nulla o posso scrivere un separatore eventualmente preceduto da un termine e ripetere una scrittura di questo tipo più volte)