La automazione
Dalle macchine semplici alle macchine programmabili

Scheda 3
Il calcolatore

1. Dalla calcolatrice al calcolatore
2. Ambienti di programmazione
3. Automatizziamo qualche procedimento di calcolo in JavaScript
4. Ancora due esempi in JS (approfondimenti)
5. Esercizi
Sintesi

 

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'esecuzione di un generico algoritmo che gli possiamo descrivere.

    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 …)
   (9)   batto    faccio calcolare il fattore la percentuale di dato rispetto a totale
  (10)   ritorno a  (6)

    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. Se non hai idea di come funzioni il programma puoi cliccare qui.

    Per poter eseguire un programma come (1.2), il computer deve essere in grado di memorizzare il testo del programma, cioè, nel caso di (1.2), la seguente sequenza di caratteri, dove con "◊" e "" abbiamo indicato lo spazio bianco (pressione della barra spaziatrice) e l'"a capo", caratteri normalmente invisibili:

10◊INPUT◊T20◊K=100/T30◊INPUT◊D40◊PRINT◊D*K50◊GOTO◊30

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

    Deve, inoltre, essere in grado 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 computer deve avere:

  un "programma incorporato" per codificare il "programma battuto dall'utente",
  un dispositivo di memorizzazione in cui registrare il il programma codificato,
  un certo numero di memorie-utente da associare alle variabili (T, K, D, …) e
  un ulteriore "programma incorporato" per tradurre il programma codificato nell'azionamento dei vari dispositivi di calcolo, memorizzazione, … .

    Esistono linguaggi di programmazione più sofisticati. Sotto a sinistra, si vede come il programma (1.2) può essere riscritto usando il QBasic..  A destra è presentata una stesura del programma in un altro linguaggio, una versione di Pascal (il nome, Pascal, deriva da quello del famoso filosofo e scienziato francese - vedi - che, nella prima metà del 1600, inventò una delle prime calcolatrici da tavolo, per fare addizioni e sottrazioni).



(1.3)  
INPUT Tot
k = 100/Tot

 

Introduzione:
INPUT dato   
PRINT dato*k 
GOTO Introduzione
       

program Percentuali;

var tot, k, dato: real;

label 10;

begin

   readln(tot);

   k:=100/tot;

10: readln(dato);

    write(dato*k);

    goto 10

end.

Esistono, infine, linguaggi di programmazione incorporati in tutti i browser. Con essi sono redatti i programmi che usiamo per cercare l'orario di un treno, prenotare un posto al cinema, …. Uno dei più usati tra essi è JavaScript (in breve, JS). Il programma precedente assume la forma a cui puoi accedere da qui, visualizzata a lato.  Questo è quanto vede l'utente, per calcolare 62/720·100.   

Sotto è illustrato come è stato realizzato il programma, che potete visualizzare usando un opportuno comando del browser ("visualizza sorgente pagina", "html", … o altro, a seconda del browser che state impiegando).

<head>
<script language="javascript">
function Calc()
 {document.C.r.value = Number(document.C.d.value)*100/Number(document.C.t.value)}
</script>
</head>                                                   (1.4)

<center>Metti gli input nelle prime due caselle e clicca<br>
<form name="C">
totale <input type="text" name="t" value="0" size=24>
dato <input type="text" name="d" value="0" size=24>
<input type="button" name="pulsante" value="%" onClick="Calc()"><br>
percentuale = <input type="text" name="r" value="0" size=24>
</form>
</center>

Potete provare ad usare il programma (e ad esplorarne la struttura). Più avanti vi sarà spiegato come usare questo semplice e comodo linguaggio di programmazione.

 

2. Ambienti di programmazione

    Un computer è in grado di tradurre in operazioni-macchina un programma scritto in un qualunque linguaggio di programmazione, a patto che gli venga fornito in "input" anche un opportuno programma traduttore.  La CPU di un computer può eseguire direttamente solo un programma che le arrivi sotto forma di una sequenza di bit che, a gruppi, rappresentino direttamente le operazioni-macchina da effettuare.

    Il linguaggio (che ha come alfabeto i simboli 0 e 1) in cui sono scritti questi programmi è detto linguaggio macchina.
    I linguaggi di programmazione evoluti (come quelli usati sopra) non descrivono direttamente singole operazioni-macchina, ma, come abbiamo visto, • impartiscono comandi più sofisticati (a cui corrispondono più comandi del linguaggio-macchina), • usano come caratteri quasi tutti i simboli della tastiera e • indicano i comandi con nomi che ne richiamano il significato; per questo vengono detti linguaggi evoluti (o di alto livello). Per usarli il computer deve essere dotato di un ambiente di programmazione, cioè un programma che contiene come sottoprogrammi: 
•  un programma redattore (editor) per registrare i caratteri battuti dall'utente; in genere è presente anche un help che richiama uso e significato dei comandi, propone esempi, … .
Un editor è una applicazione per leggere/elaborare testi (come NotePad/BloccoNote in Windows) che registra i documenti codificando i vari caratteri (lettere, cifre, virgole, spazi bianchi, e altri simboli) attraverso byte, ossia sequenze 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 = 256).  Il codice impiegato è chiamato ASCII (pronuncia: aski). Ad esempio "P" è codificato con 01010000, l'"a capo" con 00001101. 
•  un programma traduttore per tradurre il programma in linguaggio evoluto in una sequenza di bit che sia la versione in linguaggio macchina del programma.

    Ecco come viene trasformata da un programma taduttore l'assegnazione (scritta in un linguaggio Basic) corrispondente alla formula a fianco:

       3
      2 ·-x
 w = ——————— + x·5
      9 - 1
ASSEGNAZIONE:          W = (2^3*-X)/(9-1)+X*5

variabili->REGISTRI:  R0 = (2^3*-R1)/(9-1)+R1*5

                        +             Traduzione in
              _________/ \_________   istruzioni elementari:
             /                     *            R2 = 2 ^ 3
       _____/ \_____          ____/ \____       R3 = - R1
      *             -        X           5      R4 = R2 * R3
   __/ \__       __/ \__                        R5 = 9 - 1
  ^       -     9       1   Grafo ad albero     R6 = R4 / R5
 / \      |                 corrispondente      R7 = R1 * 5
2   3     X                                     R0 = R6 + R7

    Ecco i passaggi con cui da tale grafo si può risalire alla scrittura nel linguaggio di programmazione, partendo dai nodi a sinistra in basso:

2^3 → 2^3*–x → (2^3*–x)/(9-1) → (2^3*–x)/(9-1)+x*5

 1 
    (a)  Scrivi un'assegnazione che corrisponda alla seguente sequenza di assegnazioni elementari:
          R2 = 1/3         R3 = R1^R2         R0 = R3+R1
    (b)  Scrivi le assegnazioni elementari e traccia il grafo che corrispondono alla assegnazione  C = F + U*N.

    In un ambiente di programmazione la traduzione in linguaggio macchina può essere avviata operando con il mouse o premendo una opportuna combinazione di tasti. La nuova versione viene memorizzata temporaneamente; quando l'esecuzione finisce essa viene persa. Questo è, per esempio, quanto accade con il JavaScript.
    In altri casi la traduzione in linguaggio macchina viene memorizzata (in un file eseguibile) e può essere avviata successivamente, anche al di fuori dell'ambiente di programmazione. Questo tipo di traduzione viene detta compilazione. Ad esempio in Windows tutti i file con estensione EXE sono dei programmi compilati.

    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). In realtà non si tratta di "regole" ma di modelli che usiamo per orientarci nella produzione/interpretazione dei messaggi verbali.

    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.  L'help indica le regole da rispettare per costruire i programmi. Ad es. le seguenti istruzioni dei programmi del 1º paragrafo:

k = 100/Tot    document.C.r.value = Number(document.C.d.value)*100/Number(document.C.t.value)    k := 100/Tot

sono tutte assegnazioni, che secondo i rispettivi help debbono avere nei primi due casi la forma  variable = expression  e nell'altro  variable := expression.
    In altri linguaggi le assegnazioni debbono avere forme diverse:  variable < expression  o  variable << expression  o  set variable = expression  o  variable : expression  o  …

3. Automatizziamo qualche procedimento di calcolo in JavaScript

    Vediamo ora qualche semplice programma realizzato in JavaScript. Incominciamo da quello considerato alla fine di §1, di cui abbiamo già riportato un esempio d'uso e il testo.  Ha la struttura di una pagina Web: è un documento in HTML (hypertext markup language: linguaggio per contrassegnare ipertesti).  Abbiamo visto come esso appare visualizzato da un browser (applicazione per interpretare i documenti Html) e ne abbiamo visto il documento "sorgente", cioè il testo (redatto con un qualunque editor) comprendente il contenuto verbale del documento e i tag (contrassegni), ossia i comandi racchiusi tra parentesi angolari (< e >) che contengono indicazioni sui formati in cui visualizzare il contenuto verbale, le eventuali immagini da inserire, i collegamenti ad altri documenti, …, e indicano le azioni da eseguire, descritte tra i comandi "script".  I tag "head" ("intestazione"), <head> e </head>, delimitano la parte del sorgente in cui sono contenute informazioni o comandi riferiti all'intero documento. Seguono comandi indicano ciò che viene visualizzato; i tag "center" fanno sì che esso sia raffigurato "centrato"; invece <br> (break) comanda un "a capo".

    La parte del documento organizzata in caselle (modulo) è tra i tag "form"; forma un oggetto (ossia un componente) a cui, con la proprietà name è dato nome "C". Le caselle sono dei sotto-oggetti del modulo specificati con i tag "input"; a ciascuna viene dato un nome (t, d, pulsante, r) ed altre proprietà: a tre, specificate come "type" text, è assegnata "size" (dimensione) 24 (sono delle celle che possono accogliere 24 caratteri); sull'altra casella, specificata come "type" button, torniamo tra poco;  "value" assegna un eventuale valore iniziale agli oggetti precedenti; nel caso del "bottone" si tratta del nome che apparirà su di esso.

    Nel caso del sotto-oggetto di tipo "button" l'attributo "onClick" specifica che se si verifica l'evento "pulsante cliccato" viene avviata l'azione (o metodo) "Calc()" descritta dalla omonima function (così in Javascript vegono chiamati i sottoprogrammi).  Il programma in senso stretto è racchiuso tra i comandi "script" (che in questo caso è descritto non nel corpo della pagina-web, ma nella intestazione) ed è costituito solamente dalla function Calc().
    Il contenuto della function è delimitato da "{" e "}", e in questo è contenuto da una sola assegnazione. Essa legge i contenuti (ossia i valori: value) delle caselle di nome "d" e "t" del modulo di nome "C" e calcola il valore da mettere nella casella "r". Nelle assegnazioni è presente document:  in questo modo viene indicata la pagina web attualmente visualizzata. In breve:  document.C.d.value  indica la proprietà "value" della proprietà (o sotto-oggetto) "d" della proprietà (o sotto-oggetto) "C" dell'oggetto "document".
    Number serve per specificare che gli oggetti contenuti nelle caselle sono da intendere come "numeri", non come "testi": la somma di 3 e 4 viene intesa, altrimenti, come 34 invece che come 7.
    Ricordiamo, infine, che nelle istruzioni di JS lettere diverse solo per la dimensione (come "a" e "A") sono considerate diverse.
    La spiegazione sembra complicata, ma, accompagnata da delle prove, risulterà facile. Facciamone alcune.

  Se provi a cliccare qui si avvia la calcolatrice, di cui a lato è illustrato un possibile funzionamento:  metto 3 e 4 nelle caselle di input, scelgo la divisione e nella casella di output ottengo il risulato 0.75.  Nelle quattro caselle in basso posso copiare e incollare input o output dalle caselle precedenti.
    La struttura di questo documento, sotto riprodotto, è simile a quella del documento precedente:
ci sono quattro bottoni che comandano quattro diversi sottoprogrammi ("function");
in fondo sono aggiunte quattro caselle in cui si possono copiare i valori, ma che non sono richiamate da altri punti del programma.
  


<head> <script language="javascript">
function Piu() {document.C.r.value = Number(document.C.a.value)+Number(document.C.b.value)}
function Men() {document.C.r.value = Number(document.C.a.value)-Number(document.C.b.value)}
function Per() {document.C.r.value = Number(document.C.a.value)*Number(document.C.b.value)}
function Div() {document.C.r.value = Number(document.C.a.value)/Number(document.C.b.value)}
</script> </head>

<center>Metti gli input nelle prime due caselle e scegli l'operazione.<br>
<form name="C">
<input type="text" name="a" value="0" size=24>
<input type="text" name="b" value="0" size=24><br>
<input type="button" name="pulsante" value="+" onClick="Piu()">
<input type="button" name="pulsante" value="−" onClick="Men()">
<input type="button" name="pulsante" value="x" onClick="Per()">
<input type="button" name="pulsante" value="/" onClick="Div()"><br>
= <input type="text" name="r" value="0" size=24><br><br>
Caselle per copiare valori<br>
<input type="text" name="x" value="0" size=24>
<input type="text" name="y" value="0" size=24><br>
<input type="text" name="z" value="0" size=24>
<input type="text" name="v" value="0" size=24>
</form> </center>

<head>
<script language="javascript">   
i=0;
while (i < 10) {i = i+1};
document.write(i)
</script> </head>
  A lato è riprodotto il contenuto di un altro file, a cui puoi accedere cliccando qui.  Esso fornisce come uscita il numero 10.  È contenuto tutto nell'intestazione e l'uscita è comandata dal solo comando document.write: non ci sono caselle (form) in cui mettete input o output.  Questo script contiene tre comandi: una assegnazione (i=0), un ciclo while (su cui ora ci soffermiano) e il comando di scrittura descritto sopra.  I comandi sono separati da un ";" (punto e virgola).
    while (condizione) {assegnazioni}  esegue le assegnazioni fin tanto che la condizione risulta essere vera. In questo caso i viene incrementato di 1 fino a che raggiunge il valore 10.

  Cliccando qui viene avviato un programma per calcolare la somma e la media di una quantità qualunque di dati:  l'utente batte un dato, clicca "+" e, automaticamente, vengono aggiornati i valori del "contatore", della "somma" e della "media".
    Il bottone "azzera" annulla i valori introdotti: se lo si clicca viene avviato il sottoprogramma Via() che azzera o cancella i valori assegnati alle diverse variabili.
    Si noti che la media, nel caso esemplificato, viene visualizzata come 13.3…34 invece che come 13.3…33:  i calcoli vengono effettuati in base 2 e, come vedrai meglio più avanti, l'ultima cifra, nel caso di un risultato approssimato, può differire dal valore corretto.
  


<head> <script language="javascript">
i=0; sum=0;
function Via() {i=0; sum=0; document.M.dato.value=""; document.M.media.value="";
                document.M.n.value=0; document.M.s.value=0};
function Calc() {i=i+1; sum=sum+Number(document.M.dato.value);
                 document.M.s.value=sum; document.M.n.value=i;
                 document.M.media.value=sum/i}
</script> </head>
<center> <form name="M">
dato <input type="text" name="dato" value="" size=24>
<input type="button" name="altro" value="+" onClick="Calc()"><br>
n <input type="text" name="n" value="0" size=3>
somma <input type="text" name="s" value="0" size=24><br>
media <input type="text" name="media" value="" size=24><br>
<input type="button" name="via" value="AZZERA" onClick="Via()">
</form> </center>

4. Ancora due esempi in JS (approfondimenti)

n <- 1580
k <- 2; while(k<=n) if(n/k==floor(n/k)) {print(k); n <- n/k} else k <- k+1
    2     2     5     79

    Ancora due esempi in JavaScript.
  Il procedimento in R sopra riportato consente di trovare i numeri primi (maggiori di 1) per cui è esattamente divisibile un numero intero positivo (1580 nel caso esemplificato).  Il programmino in JS a cui accedi da qui consente di trovare tutti i numeri interi positivi per cui è divisibile un dato numero intero positivo. A destra ne è illustrato un esempio d'uso.
  

<head>
<script language="javascript">
function divisor(){ d=2; n=document.cal.n.value; document.cal.v.value=1;
  while (d <= n)
    {q=n%d; if (q==0) {document.cal.v.value=document.cal.v.value+" "+d}; d=d+1}
} </script> </head>
<form name="cal">
dato <input type="text" name="n" value="" size=7>
<input type="button" name="" value="Calcola" onClick="divisor()"><br>
<input type="text" name="v" value="" size=100>
</form>

   Qualche commento:
In JS  M%N  indica il resto intero della divisione di M per N;  vale, quindi, 0 quando N è un divisiore di M.
if (condizione) {assegnazioni}  esegue le assegnazioni quando la condizione è vera.
In una condizione possono essere usati simboli di operazione formati da due caratteri. In particolare si usano "==" invece di "=", "!=" invece di "≠", oltre a "<=" e ">=" (si possono poi usare i simboli logici "&&" invece di "and", "||" invece di "or", "!" invece di "not").

 2 
    Prova a modificare lo script precedente in modo che dimezzi, circa, i confronti da eseguire, tenendo conto che un numero naturale non può essere divisibile per numeri maggiori della sua metà e minori del numero stesso.

 3 
    Esamina la nuova versione del programma precedente a cui puoi accedere da qui e spiega il funzionamento dei Tag "textarea" in essa presenti.

  Nei casi precedenti i passi da eseguire crescono al crescere dell'input.  Vi sono situazioni in cui ciò non accade. Provate ad eseguire lo script illustrato a lato, relativo al "gioco del 3k+1", a cui potete accedere da qui, per rendervene conto.  Il gioco è spiegato nello script stesso. Esso termina quando si arriva ad 1.
    Si arriva sempre ad 1 o ci sono numeri a partire dai quali il gioco non termina?  Provate!
  

 4 
    Vi sono input minori di 31 che danno un output maggiore di 106?

    Se volete approfondire le conoscenze su JavaScript, cliccate qui

5. Esercizi

 e1 
    Abbiamo descritto una funzione F nel modo riportato a lato, in cui v5 indica il valore di F(x). Cerca di descrivere F(x) sia con un grafo ad albero, sia con un unico termine in cui compare la sola variabile x, sia nella usuale scrittura a più piani, sia nella scrittura ad un piano (quella che useresti in un programma).    
F(x):
v0 = x + 1
v1 = 2 ^ v0
v2 = v1 + 1
v3 = x - 1
v4 = v2 / v3
v5 = v4 + 1

 e2 
    Abbiamo descritto una funzione G nel modo indicato a lato. Cerca di descrivere G(x) sia mediante una sequenza di assegnazioni elementari, come nel testo del quesito precedente, sia nella usuale scrittura a più piani, sia con una grafo ad albero.  
G(x) = (2^(x+1)-1)/(x+1)-1

 e3 
    Abbiamo descritto una funzione H nel modo indicato a lato. Cerca di descrivere H(x) sia con un grafo ad albero, sia nella scrittura ad un piano (quella che useresti in un programma)  
           2 + 3x    5
H(x) = 3 + —————— - ———
              7     -2x

 e4 
    Scrivi il termine rappresentato dal grafo ad albero seguente sia in una scrittura "a più piani" che in una scrittura "ad 1 piano" (qui RAD indica la radice quadrata).

                                +
              _________________/ \_________________
             -                                     /
     _______/ \_______                     _______/ \_______
    *                 3                   *                 +
 __/ \__                               __/ \__           __/ \__
A       2                            RAD      4         A       B
                                      |
                                      B

 e5 
    Qui trovi l'algoritmo per R che corrisponde al programma (1.3) per il QBasic. Prova ad eseguirlo.
 

 e6 
    Sotto sono riprodotti esiti di due programmi JS, nome1 e nome2, che vorrebbero produrre la scrittura di Cognome Nome se l'utente mette in X il Nome e in Y il Cognome. Uno dei due funziona e l'altro no. Esamina i due codici-sorgente e spiega il perché di questo comportamento.

 e7 
    Sotto a sinsitra è riprodotto un esito di un programma in JavaScript che realizza il "cambio monete" descritto dal diagramma di flusso a destra.

Nei link seguenti puoi esaminare tre versioni, cambio1, cambio2 e cambio3, dello script. Una che usa i comandi if e for, una che usa switch-case e while, ed una che usa un'altra versione di if. Esamina i programmi e cerca di spiegare, in modo comprensibile, il funzionamento di queste istruzioni.

Nota. In cambio1 la parte che segue </head> è racchiusa tra <body> e </body>. Sono due comandi, non essenziali, che identificano la parte del file che viene visualizzata. In questo caso sono stati inseriti per specificare il font che devono impiegare i caratteri visualizzati (se esamini cambio1 vedi che dopo </head> c'è <body style="font-family:Times New Roman; font-size:100%">, che specifica che, fino a </body>, il font è Times New Roman e che le sue dimensioni sono al 100%; se cambi font dal menu del browser, esse vengono cambiate in cambio2 e cambio3, non in cambio1).

 e8 
    Il file riprodotto a sinistra, a cui accedere da qui, realizza la tabulazione della funzione x → √x+x3+1, riprodotta parzialmente a destra.
    È un file senza intestazione ("head"). Sono utilizzate delle funzioni (round, arrotondamento agli interi; sqrt, radice quadrata; pow, elevamento a potenza) diverse dalle usuali operazioni artimetiche, per impiegare le quali occorre usare una "libreria", ossia una parte secondaria del linguaggio JavaScript, che è caricabile usando with(Math) {…}.  Il sottoprogramma Arr(h,n) {…} mette in a all'arrotondamento di h alla n-esima cifra dopo il punto decimale (serve per avere degli arrotondamenti corretti, in quanto l'ultima cifra potrebbe differire da quella corretta).  L'elenco dettagliato delle funzioni di JS lo trovi qui.
    Il significato dei simboli Html &minus; &gt; &radic; <sup> lo puoi capire da solo.  <PRE> e </PRE> delimitano una parte di testo "preformattato", cioè scritto in un font "monospazio" (tutti i caratteri, sia la "i" che la "w", occupano lo stesso spazio, gli spazi bianchi vengono tutti considerati, gli "a capo" vengono realizzati anche senza un <br>).  \t e \n indicano una "tabulazione" (cioè il posizionamento dei caratteri su successive colonne a distanza prefissata l'una dall'altra) e un "a capo".
    Modificando solo for (x=1; x<=3; x=x+1/10) e y = sqrt(x)+pow(x,3)+1 puoi tabulare altre funzioni in altri intervalli.
Modifica il file e salvalo in modo da tabulare la funzione attuale nell'intervallo [0, 5] ogni 0.5, ossia in 0, 0.5, 1, ….
Modificalo, poi, per studiare  x → √(x4+1)+x  in [-5, 5] ogni 0.5.

 <pre>
 tabulazione di x &minus;&gt; &radic;x+x<sup>3</sup>+1
 <script language="javascript">
 with(Math) {
 function Ar(h,n) {a=round(h*pow(10,n))/pow(10,n)}
 for (x=1; x<=3; x=x+1/10)
   {Ar(x,7); x=a; y = sqrt(x)+pow(x,3)+1; Ar(y,7); y=a;
    document.write(x+'\t&minus;&gt;\t'+y+'\n')}}
 </script>
 </pre>
tabulazione di x −> √x+x3+1
 1	−>  3 
 1.1	−>  3.3798088
 1.2	−>  3.8234451
 1.3	−>  4.3371754
   ...
 2.7	−>  22.3261677
 2.8	−>  24.6253201
 2.9	−>  27.0919386
 3	−>  29.7320508

In R ci sono vari modi per realizzare la tabulazione di una funzione. Ma in questo caso è semplice battere  F <- function(x) sqrt(x)+x^3+1  e poi via via  F(1)F(1.1)F(1.2), ….  Prova a farlo.

 e9 
    A lato è illustrato come si può trovare la lunghezza dell'ipotenusa di un triangolo rettangolo note le lunghezze dei cateti (teorema di Pitagora). In questo modo possiamo determinare la distanza di un punto (x,y) dall'origine (0,0).  Sotto a sinistra questo calcolo è realizzato con R; in maniera simile potrebbe essere realizzato con molti altri progammi: si definisce una funzione d che esprime la distanza di un punto dall'origine e poi, ad es. per determinare la distanza di (1,2) di batte d(1,2) e se ne ottiene il valore.
Se non disponessi di un tale programma potresti realizzare un programmino in JS che si comporti nel modo esemplificato sotto a destra. Fallo.
     

d(x,y) <- sqrt(x^2+y^2)
d(1,1)        1.414214
d(1,2)        2.236068
d(sqrt(2),sqrt(2))   2
d(-2,-2)      2.828427
   

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

programma traduttore (§2),   sintassi (§2),   tag (§3),   form (§3).

2) Su un foglio da "quadernone", nella prima facciata, esemplifica l'uso di ciascuno dei concetti sopra elencati mediante una frase in cui esso venga impiegato.

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