0 Introduzione   A write   B br_\n   C abs_max_min_pow_round_sqrt_PI_E_writeln   D for_if   E {_}_;   F if_==_&&_!_!=_||   G cambio_dati   H for_inscatolati   I function_approssimare   J sequenze_length_parole_e   K istogrammi   L disegni   M for/for   N tabella_array   O while_else   P cbrt_sign_ceil_floor_cos_sin_tan_acos_asin_atan_log10_log2_log_random
 p0 probabilità   p1 serie   p2 produttoria   p3 distanza   p4 triangoli   p5 equazioni 2º3ºgrado   p6 bisezione   p7 p8 tabulazione_max_min   p9 combinazioni_binomiale   p10 integrazione   p11 ricorsione   p12 regressione   p13 data_appunti
 
Programmare con JavaScript
(vedendo sia il testo del programma che l'esito

con     macosa.dima.unige.it/js.com )

Nelle pagine Internet come questa si possono inserire procedimenti di calcolo ("programmi") che consentono di fare elaborazioni di vario tipo. Questi procedimenti si chiamano "script". È il modo di realizzare programmi (in inglese chiamato anche coding) più usato.  Vediamo degli esempi, alcuni accessibili sin dalla scuola di base.  Si possono aprire contemporaneamente più sessioni di  macosa.dima.unige.it/js.com.  Una volta che hai realizzato un programma, non cliccare "Aggiorna" (Ctrl+R) se non vuoi perdere il documento (eventualmente prima copialo o apri un'altra sessione).  Per script già redatti, usabili a "scatola nera", vedi qui;  in particolare, per la scuola di base,  vedi:  come si disegna col computer,   un gioco  e  questi.

Appena clicchi   macosa.dima.unige.it/js.com   compare:

"<p>Copia e incolla all'inizio della pagina (al posto di quanto c'è ora) le righe seguenti. Qui apparirà <b>10</b>
                            . . .
                            . . .
Copia e incolla all'inizio della pagina (al posto di quanto c'è ora) le righe seguenti. Qui apparirà 10
<pre><script> with(Math) {
document.write(2+4*2)
} </script></pre>

per spiegare il funzionamento.
Se fai quanto richiesto (con un copia e incolla) poi compare:

<pre><script> with(Math) {
document.write(2+4*2)
} </script></pre>
10

A partire da questo esempio è facile inserire delle modifiche per realizzare altri programmi.  Puoi anche copiare quanto segue provando a mettere al posto di ... le righe di programma e togliendo "$" (o altro simbolo che hai usato) per eseguirlo, ed eventualmente rimettendo "$" per apportare nuove modifiche prima di rieseguirlo (togliendo "$").
<pre><script> with(Math) {$ 
...
} </script></pre>
[Il programma è racchiuso tra <script> e </script>.  I comandi <pre> e </pre> fanno sì che il testo sia scritto in un formato prestabilito, che riservi lo stesso spazio ad ogni carattere.  "document.write" fa scrivere quello che segue, indicato tra parentesi.  "with(Math)" fa sì che siano inseribili delle operazioni matematiche, come quelle indicate più avanti, in C, in questo documento]

A)   Esempio:  il calcolo di  (3/4 + 7.5 + 0.25 - 5/2)·(3/2 + 7/10 - 1/2 + 4.3)     Copia e incolla:
<pre><script> with(Math) {

document.write( (3/4 + 7.5 + 0.25 - 5/2)*(3/2 + 7/10 - 1/2 + 4.3) )

} </script></pre>
Uscita:  36

Per avere una uscita con una parola o una frase usa
document.write(" ... ")
B)   Per inserire un A CAPO usa <br> ("br" rappresenta un "break", una "interruzione" della riga).
<pre><script> with(Math) {

document.write( "calcolo di <br>(3/4 + 7.5 + 0.25 - 5/2)*(3/2 + 7/10 - 1/2 + 4.3)" )

} </script></pre>
Uscita:
calcolo di
(3/4 + 7.5 + 0.25 - 5/2)*(3/2 + 7/10 - 1/2 + 4.3)


Al posto di <br> si può usare  \n  (nuova riga):
<pre><script> with(Math) {

document.write( "calcolo di\n(3/4 + 7.5 + 0.25 - 5/2)*(3/2 + 7/10 - 1/2 + 4.3)" )

} </script></pre>

C)   Alcune delle operazioni inseribili:   +   -   *   /    abs(K)  valore assoluto di K,  max(H,K)  il massimo tra H e K,  min(H,K)  il minimo tra H e K,  pow(H,K)  H alla K,  round(H)  l'intero più vicino ad H,  sqrt(H)  la radice quadrata di H.
PI  indica  π  (di cui 3.141592653589793 è un arrotondamento),  E  indica il numero di Nepero  (in genere indicato con e, di cui 2.718281828459045 è un arrotondamento).

Per arrotondare x = 12345.6789 ai centesimi si può usare round(x*100)/100, alle migliaia round(x*0.001)/0.001

Un esempio di calcoli, in cui viene usato  writeln  che dopo la stampa fa un "a capo" ("ln" sta per "line").
<pre><script> with(Math) {

x = 36
y = 10
document.writeln( x+y )
document.writeln( x-y )
document.writeln( x*y )
document.writeln( x/y )
document.writeln( round(x/y) )
document.writeln( min(x,y) )
document.writeln( max(x,y) )
document.writeln( pow(x,y) )

} </script></pre>
Uscite:
46
26
360
3.6
4
10
36
3656158440062976
D)   Vediamo come si possono eseguire dei cicli, ossia come si possono far ripetere automaticamente dei calcoli più volte. Un primo esempio:
<pre><script> with(Math) {

for(i=1; i<10; i=i+1) document.write( i*2," " )

} </script></pre>
Le uscite:  2 4 6 8 10 12 14 16 18

   i = 1
     |
 scrivi i*2  <—————
     |              | 
  i = i + 1         |
     |              |
  i < 10 ?  — SI' ——
     |
     |  NO
     |
    STOP
Compare un ciclo for:   il ciclo viene eseguito a partire dal valore assegnato alla "variabile contatore" (in questo esempio "i") fino a che vale la condizione indicata (i<10);   "i=i+1" indica come viene modificata la variabile contatore ad ogni fine ciclo;   l'istruzione che viene ripetuta è document.write( i*2," " ) che fa scrivere il valore di i*2 seguito da  " ", ossia uno spazio bianco.
Se invece di  document.write(i*2," ")  avessimo scritto  document.writeln(i*2)  avremmo ottenuto:
2
4
...
18


Che cosa calcola il seguente programma se metti in A un numero qualunque e in N un numero naturale? Prova con un po' di valori di A e di N.
<pre><script> with(Math) {

A = 2; N = 3
P=1
for(i=0; i<=N; i=i+1) P = P*A
document.write( P )

} </script></pre>
     

     leggi A
     leggi N
    poni P = 1
    poni I = 0
        |       si'
----> I = N ? ------->  scrivi P
|       | no
|   poni P = P*A
|   poni I = I+1
|       |
--------

La somma di due numeri naturali comunque lunghi, avendo messo le cifre in due sequenze (usando un ciclo for "decrescente" e una istruzione if, in cui "uguale" si scrive "=="):
<pre><script> with(Math) {

A=[3,5,7,0,3,8,0,5,3,2,1,6,5,4,3,2,1,8,9,0,1,7,3,0,6,8]
B=[0,0,0,0,8,7,4,0,5,1,0,0,3,4,8,1,9,2,1,5,2,5,1,6,0,3]
n=A.length; R=0; C=""
for(i=n-1; i>=0; i=i-1) {S=A[i]+B[i]+R; R=0; if(S>9) {S=S-10; R=1}; C=S+C}
if(R==1) {C="1"+C}
document.writeln(A," +")
document.writeln(B, " =")
document.write(C)

} </script></pre>
3,5,7,0,3,8,0,5,3,2,1,6,5,4,3,2,1,8,9,0,1,7,3,0,6,8 +
0,0,0,0,8,7,4,0,5,1,0,0,3,4,8,1,9,2,1,5,2,5,1,6,0,3 =
35712545831689141105424671
o la somma di due numeri non interi
<pre><script> with(Math) {

A=[3,5,7,0,3,8,0,5,3,2,1,6,5,4,3,2,1,8,9,0,1,7,3,0,6,8,".",7,1,2,5]
B=[0,0,0,0,8,7,4,0,5,1,0,0,3,4,8,1,9,2,1,5,2,5,1,6,0,3,".",7,5,0,0]
n=A.length; R=0; C=""
for(i=n-1; i>=0; i=i-1) {if(A[i]==".") {C="."+C} else {S=A[i]+B[i]+R; R=0; if(S>9) {S=S-10; R=1}; C=S+C} }
if(R==1) {C="1"+C}
document.writeln(A," +")
document.writeln(B, " =")
document.write(C)

} </script></pre>
3,5,7,0,3,8,0,5,3,2,1,6,5,4,3,2,1,8,9,0,1,7,3,0,6,8,.,7,1,2,5 +
0,0,0,0,8,7,4,0,5,1,0,0,3,4,8,1,9,2,1,5,2,5,1,6,0,3,.,7,5,0,0 =
35712545831689141105424672.4625

E)   Se invece avessimo usato:
<pre><script> with(Math) {

A=3; for(i=1; i<10; i=i+1) {A = -A; document.write(A,"  ")}

} </script></pre>
avremmo ottenuto:
-3  3  -3  3  -3  3  -3  3  -3
Le istruzioni del ciclo ora sono due; sono messe tra parentesi graffe e separate da ";".

F)   Un'altra istruzione utile è if
<pre><script> with(Math) {

 ora = 10
 frase = "E' notte"
 if(ora == 12) frase = "E' mezzogiorno"
 if(ora < 21 && ora > 12) frase = "E' pomeriggio"
 if(ora < 12 && ora >= 7) frase = "E' mattina"
 document.write( frase )


} </script></pre>
Uscita:  E' mattina
Se metto  ora = 22   ho:  E' notte

Abbiamo visto che in una istruzione  if   "uguale"  si scrive  "==";  "e"  si scrive  "&&";  "not" si scrive "!";  "diverso" si scrive "!=";  "o" (non esclusivo) si scrive "||".

Altri esempi

G)
<pre><script> with(Math) {

parte = 163; totale = 384
document.write( "percentuale = ", round(parte/totale*100) )


} </script></pre>
Uscita:  percentuale = 42

<pre><script> with(Math) {

P1 = 163; P2 = 247; P3 = 102; totale = P1+P2+P3
document.write( "totale = ", totale, "<br>" )
document.write( "percentuali: ",round(P1/totale*100)," ",round(P2/totale*100)," ",round(P3/totale*100) )


} </script></pre>
Uscita:
totale = 512
percentuali: 32 48 20


Cambiando i dati ottengo immediatamente le nuove uscite

H)   Due tabelline.
<pre><script> with(Math) {

for(i=1; i<10; i=i+1)
   { for(j=1; j<10; j=j+1)
        {if(i*j<10) document.write(" "); document.write(i*j); document.write(" ")}
    document.write("<br>") }


} </script></pre>
Uscita:
 1  2  3  4  5  6  7  8  9 
 2  4  6  8 10 12 14 16 18 
 3  6  9 12 15 18 21 24 27 
 4  8 12 16 20 24 28 32 36 
 5 10 15 20 25 30 35 40 45 
 6 12 18 24 30 36 42 48 54 
 7 14 21 28 35 42 49 56 63 
 8 16 24 32 40 48 56 64 72 
 9 18 27 36 45 54 63 72 81 
Compaiono due cicli for, uno inscatolato nell'altro:  il ciclo "i" stampa le righe;  ogni riga è stampata da un ciclo "j";  il primo document.write(" ") scrive uno spazio bianco prima del numero se questo ha una sola cifra;  il document.write(" ") finale scrive lo spazio bianco che separa un numero dal successivo;  usciti dal ciclo inscatolato, document.write("<br>") genera l'"a capo" tra una riga e la successiva.

Con piccole modifiche (quali?) viene prodotta una tabellina con più numeri:
<pre><script> with(Math) {

for(i=1; i<21; i=i+1)
   { for(j=1; j<21; j=j+1)
       {if(i*j<10) document.write(" ");if(i*j<100) document.write(" ");document.write(i*j);document.write(" ")}
    document.write("<br>") }


} </script></pre>
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
  2   4   6   8  10  12  14  16  18  20  22  24  26  28  30  32  34  36  38  40 
  3   6   9  12  15  18  21  24  27  30  33  36  39  42  45  48  51  54  57  60 
  4   8  12  16  20  24  28  32  36  40  44  48  52  56  60  64  68  72  76  80 
  5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95 100 
  6  12  18  24  30  36  42  48  54  60  66  72  78  84  90  96 102 108 114 120 
  7  14  21  28  35  42  49  56  63  70  77  84  91  98 105 112 119 126 133 140 
  8  16  24  32  40  48  56  64  72  80  88  96 104 112 120 128 136 144 152 160 
  9  18  27  36  45  54  63  72  81  90  99 108 117 126 135 144 153 162 171 180 
 10  20  30  40  50  60  70  80  90 100 110 120 130 140 150 160 170 180 190 200 
 11  22  33  44  55  66  77  88  99 110 121 132 143 154 165 176 187 198 209 220 
 12  24  36  48  60  72  84  96 108 120 132 144 156 168 180 192 204 216 228 240 
 13  26  39  52  65  78  91 104 117 130 143 156 169 182 195 208 221 234 247 260 
 14  28  42  56  70  84  98 112 126 140 154 168 182 196 210 224 238 252 266 280 
 15  30  45  60  75  90 105 120 135 150 165 180 195 210 225 240 255 270 285 300 
 16  32  48  64  80  96 112 128 144 160 176 192 208 224 240 256 272 288 304 320 
 17  34  51  68  85 102 119 136 153 170 187 204 221 238 255 272 289 306 323 340 
 18  36  54  72  90 108 126 144 162 180 198 216 234 252 270 288 306 324 342 360 
 19  38  57  76  95 114 133 152 171 190 209 228 247 266 285 304 323 342 361 380 
 20  40  60  80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400
I)   La tabulazione di una funzione
<pre><script> with(Math) {

document.write( "         x^5 + 6*x^3 + x/7<br><br>" )
x = 1.5
document.write( "x=",x, " -> ",pow(x,5)+6*pow(x,3)+x/7, "<br>" )
x = 2
document.write( "x=",x, "   -> ",pow(x,5)+6*pow(x,3)+x/7, "<br>" )
x = 2.5
document.write( "x=",x, " -> ",pow(x,5)+6*pow(x,3)+x/7, "<br>" )
x = 3
document.write( "x=",x, "   -> ",pow(x,5)+6*pow(x,3)+x/7, "<br>" )


} </script></pre>
Uscite:
         x^5 + 6*x^3 + x/7

x=1.5 -> 28.058035714285715
x=2   -> 80.28571428571429
x=2.5 -> 191.76339285714286
x=3   -> 405.42857142857144
Possiamo introdurre la funzione con  function.  Vediamo come:
<pre><script> with(Math) {

function F(x) { return  pow(x,5)+6*pow(x,3)+x/7 }
document.writeln("F(x) = pow(x,5)+6*pow(x,3)+x/7")

x = 1.5; document.write( "x=",x, " -> ",F(x), "\n" )
x = 2; document.write( "x=",x, " -> ",F(x), "\n" )
x = 2.5; document.write( "x=",x, " -> ",F(x), "\n" )
x = 3; document.write( "x=",x, " -> ",F(x), "\n" )

} </script></pre>
F(x) = pow(x,5)+6*pow(x,3)+x/7
x=1.5 -> 28.058035714285715
x=2 -> 80.28571428571429
x=2.5 -> 191.76339285714286
x=3 -> 405.42857142857144

Posso definire una funzione richiamabile da altre. Ad esempio una funzione per arrotondare alla n-esima cifra dopo il ".":
    function APPR(x,n) {return round(x*pow(10,n))/pow(10,n)}
<pre><script> with(Math) {

function APPR(x,n) {return round(x*pow(10,n))/pow(10,n)}
function F(x) { return  pow(x,5)+6*pow(x,3)+x/7 }
x = 3; document.writeln( "x=",x, " -> ",F(x) )
x = 3; document.writeln( "x=",x, " -> ",APPR(F(x),10) )
x = 3; document.writeln( "x=",x, " -> ",APPR(F(x),5) )
x = 3; document.writeln( "x=",x, " -> ",APPR(F(x),0) )
x = 3; document.writeln( "x=",x, " -> ",APPR(F(x),-1) )
x = 3; document.writeln( "x=",x, " -> ",APPR(F(x),-2) )

} </script></pre>
x=3 -> 405.42857142857144
x=3 -> 405.4285714286
x=3 -> 405.42857
x=3 -> 405
x=3 -> 410
x=3 -> 400
J)   La media (e somma, min, max) di una sequenza di dati
<pre><script> with(Math) {

n=5; A = [172,169,183,181,167]
min=A[0]; max=A[0]
S = 0; for(i=0; i<n; i=i+1) {S = S+A[i]; if(A[i]>max) max=A[i]; if(A[i]<min) min=A[i]}
document.write ("la somma di ",A,"  e'  ", S, "<br>")
document.write ("la media e' ",S,"/",n, " = ", S/n,"<br>")
document.write ("min = ",min,"   max = ",max )


} </script></pre>

                             n = 5
                               |
  A[0] = 172, A[1] = 169, A[2] = 183, A[3] = 181, A[4] = 167 
                               |
                min = A[0], max = A[0], SOMMA = 0
                               |
                             i = 0
                               |
                     SOMMA = SOMMA + A[i]  <——————
                               |                  |
                  se A[i] > max prendi max = A[i] |
                               |                  |
                  se A[i] < min prendi min = A[i] |
                               |                  |
                          i = i + 1               |
                               |                  |
                           i < n ?  — SI' ————————
                               |
                               |  NO
                               |
          scrivi i valori di SOMMA, SOMMA/n, min, max
                               |
                             STOP
Uscite:
la somma di 172,169,183,181,167  e'  872
la media e' 872/5 = 174.4
min = 167   max = 183
Alternativa, usando "length" (lunghezza), con le stesse uscite:
<pre><script> with(Math) {

A = [172,169,183,181,167]
n = A.length; min = A[0]; max = A[0]
S = 0; for(i=0; i<n; i=i+1) {S = S+A[i]; if(A[i]>max) max=A[i]; if(A[i]<min) min=A[i]}
document.write ("la somma di ",A,"  e'  ", S, "<br>")
document.write ("la media e' ",S,"/",n, " = ", S/n,"<br>")
document.write ("min = ",min,"   max = ",max )


} </script></pre>
Posso ordinare anche le  parole:
<pre><script> with(Math) {

A = ["casa", "pino", "cielo", "zio", "aria"]
n = A.length; min = A[0]; max = A[0]
for(i=0; i<n; i=i+1) {if(A[i]>max) max=A[i]; if(A[i]<min) min=A[i]}
document.write ("min = ",min ,"   max = ", max )


} </script></pre>
Uscita:   min = aria    max = zio

Non solo "minimo" e "massimo", ma l'ordinamento completo
<pre><script> with(Math) {

A = ["casa", "pino", "cielo", "zio", "aria", "io", "tu", "nonna", "zia"]
document.write(A,"<br>")
B = A
n = A.length
for(k=0; k<n; k=k+1) {
  for(i=k+1; i<n; i=i+1) { if(B[i]<B[k]) {C=B[k]; B[k]=B[i]; B[i]=C} }
}
document.write(B)


} </script></pre>
Uscita:
casa,pino,cielo,zio,aria,io,tu,nonna,zia
aria,casa,cielo,io,nonna,pino,tu,zia,zio

Ovviamente, cambiando solo l'input, posso ordinare anche numeri:
<pre><script> with(Math) {

A = [23, 4.1, PI, 3, 5, 12, -3, 1e3, 1e-4]
document.write(A,"<br>")
B = A
n = A.length
for(k=0; k<n; k=k+1) {
  for(i=k+1; i<n; i=i+1) { if(B[i]<B[k]) {C=B[k]; B[k]=B[i]; B[i]=C} }
}
document.write(B)


} </script></pre>
Uscita:
23,4.1,3.141592653589793,3,5,12,-3,1000,0.0001
-3,0.0001,3,3.141592653589793,4.1,5,12,23,1000
Nota. 1000 e 0.0001 sono stati scritti 1e3 e 1e-4, ossia in notazione esponenziale:  AeB sta per A*10B


Possiamo elaborare facilmente grandi quantità di dati. Le lunghezze in cm delle fave esaminate dai ragazzi di una classe scolastica:
<pre><script> with(Math) {

dat = [1.35, 1.65, 1.80, 1.40, 1.65, 1.80, 1.40, 1.65, 1.85, 1.40, 1.65, 1.85, 1.50, 1.65, 1.90, 1.50, 1.65, 1.90,
1.50, 1.65, 1.90, 1.50, 1.70, 1.90, 1.50, 1.70, 1.90, 1.50, 1.70, 2.25, 1.55, 1.70, 1.55, 1.70, 1.55, 1.70, 1.60,
1.70, 1.60, 1.75, 1.60, 1.75, 1.60, 1.80, 1.60, 1.80, 1.60, 1.80, 1.60, 1.80, 1.00, 1.55, 1.70, 1.75, 1.30, 1.55,
1.70, 1.75, 1.40, 1.60, 1.70, 1.75, 1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.40,
1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.45, 1.60, 1.70, 1.80,
1.50, 1.60, 1.70, 1.80, 1.50, 1.60, 1.70, 1.85, 1.50, 1.60, 1.70, 1.85, 1.50, 1.60, 1.75, 1.90, 1.50, 1.60, 1.75,
1.90, 1.50, 1.65, 1.75, 1.90, 1.55, 1.65, 1.75, 1.95, 1.55, 1.65, 1.75, 2.00, 1.55, 1.65, 1.75, 2.30, 1.35, 1.65,
1.80, 1.40, 1.65, 1.80, 1.40, 1.65, 1.85, 1.40, 1.65, 1.85, 1.50, 1.65, 1.90, 1.50, 1.65, 1.90, 1.50, 1.65, 1.90,
1.50, 1.70, 1.90, 1.50, 1.70, 1.90, 1.50, 1.70, 2.25, 1.55, 1.70, 1.55, 1.70, 1.55, 1.70, 1.60, 1.70, 1.60, 1.75,
1.60, 1.75, 1.60, 1.80, 1.60, 1.80, 1.60, 1.80, 1.60, 1.80, 1.00, 1.55, 1.70, 1.75, 1.30, 1.55, 1.70, 1.75, 1.40,
1.60, 1.70, 1.75, 1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80,
1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.40, 1.60, 1.70, 1.80, 1.45, 1.60, 1.70, 1.80, 1.50, 1.60, 1.70,
1.80, 1.50, 1.60, 1.70, 1.85, 1.50, 1.60, 1.70, 1.85, 1.50, 1.60, 1.75, 1.90, 1.50, 1.60, 1.75, 1.90, 1.50, 1.65,
1.75, 1.90, 1.55, 1.65, 1.75, 1.95, 1.55, 1.65, 1.75, 2.00, 1.55, 1.65, 1.75, 2.30]
A = dat; n = A.length
for(k=0; k<n; k=k+1) {  for(i=k+1; i<n; i=i+1) { if(A[i] < A[k]) {C = A[k]; A[k]=A[i]; A[i]=C} }  }
document.writeln ("n = ", n, "  min = ", A[0], "  max = ", A[n-1])
document.writeln ("mediana = ", A[round(n/2)], "  1^ quarto = ", A[round(n/4)], "  3^ quarto = ", A[round(n*3/4)])
S = 0; for(i=0; i<n; i=i+1) {S = S + A[i]}; media = S/n
document.writeln ("media = ", media)
} </script></pre>
n = 260  min = 1  max = 2.3
mediana = 1.65  1^ quarto = 1.55  3^ quarto = 1.75
media = 1.6592307692307673

Il 50% centrale dei dati ordinati cade nell'intervallo [1.55 cm, 1.75 cm]

K)   Diagrammi a barre / istogrammi:
<pre><script> with(Math) {

dati = [127,585,430,1256,148]
n = dati.length
totale = 0; for(i=0; i<n; i=i+1) totale = totale+dati[i]
document.write(dati); document.write("   ISTOGRAMMA:\n\n")
for(i=0; i<n; i=i+1) { p = round(dati[i]/totale*150); 
                      for(k=1; k<=p; k=k+1) document.write("#");
                      document.write("  ",dati[i],"\n") }


} </script></pre>
127,585,430,1256,148   ISTOGRAMMA:

#######  127
##################################  585
#########################  430
##########################################################################  1256
#########  148
Alternativa:
<pre><script> with(Math) {

dati = [127,585,430,1256,148]
n = dati.length
totale = 0; for(i=0; i<n; i=i+1) totale = totale+dati[i]
document.write(dati); document.write("   ISTOGRAMMA:\n\n")
for(i=0; i<n; i=i+1) { p = round(dati[i]/totale*100); 
                      for(k=1; k<=p; k=k+1) document.write("#");
                      document.write("  ", p,"%\n") }


} </script></pre>
127,585,430,1256,148   ISTOGRAMMA:

#####  5%
#######################  23%
#################  17%
#################################################  49%
######  6%

Un esempio un po' più complesso
<pre><script> with(Math) {

dati = [9055301, 7980654, 7334048, 6885687, 6167008, 5339883, 4491727, 3583550, 2853732, 2342455,
1942273, 1584971, 1226116, 869631, 623680, 404849, 201780, 73468, 17910, 2455, 173]
n = dati.length
totale = 0; for(i=0; i<n; i=i+1) totale = totale+dati[i]
document.write("ISTOGRAMMA popolazione femminile dell'Etiopia per fasce di eta':\n\n")
for(i=0; i<n; i=i+1) { p = round(dati[i]/totale*1000); p2 = round(dati[i]/totale*100000)/1000; 
                      if(i<2) document.write(" "); if(i<20) document.write(" ")
                      document.write(i/2*10); document.write(" ")
                      for(k=1; k<=p; k=k+1) document.write("#");
                      document.write("  ", p2,"%\n") }


} </script></pre>
ISTOGRAMMA popolazione femminile dell'Etiopia per fasce di eta': [0,5), [5,10), ...

  0 ################################################################################################################################################  14.378%
  5 ###############################################################################################################################  12.671%
 10 ####################################################################################################################  11.645%
 15 #############################################################################################################  10.933%
 20 ##################################################################################################  9.792%
 25 #####################################################################################  8.479%
 30 #######################################################################  7.132%
 35 #########################################################  5.69%
 40 #############################################  4.531%
 45 #####################################  3.719%
 50 ###############################  3.084%
 55 #########################  2.517%
 60 ###################  1.947%
 65 ##############  1.381%
 70 ##########  0.99%
 75 ######  0.643%
 80 ###  0.32%
 85 #  0.117%
 90   0.028%
 95   0.004%
100   0%

L)   Semplici disegni
<pre><script> with(Math) {

document.writeln( "    0000000000000000")
document.writeln( "   0                0")
document.writeln( "  0                  0")
document.writeln( " 0                    0")
document.writeln( "0----------------------0")
document.writeln( "0                      0")
document.writeln( "0       =======        0")
document.writeln( "0       |     |        0")
document.writeln( "0       |     |        0")
document.writeln( "0       |     |        0")
document.writeln( "000000000000000000000000")


} </script></pre>
    0000000000000000
   0                0
  0                  0
 0                    0
0----------------------0
0                      0
0       =======        0
0       |     |        0
0       |     |        0
0       |     |        0
000000000000000000000000 
M)   Che cosa devo mettere al posto di "..." per ottenere l'uscita sotto riprodotta?
<pre><script> with(Math) {

...
for(i=1; i<=n; i=i+1) {for(k=1;k<=i;k=k+1) document.write(0); document.write("<br>")}


} </script></pre>
0
00
000
0000
00000
000000
0000000
00000000
000000000
0000000000 
[ n=10 ]

N)   In questo esempio l'utente deve preoccuparsi di gestire solo l'assegnazione a "vai", per comandare gli spostamenti, a Destra, Sinistra, in Alto e in Basso di "0", come il movimento di una biscia.  Come negli altri casi l'utente può modificare via via l'input, vedendo immediatamente i cambiamentti nelle uscite.  Le righe successive sono comprensibili dai ragazzi più grandi: viene costruita una tabella (array, in inglese) 50×50 in cui sono contenuti per ogni colonna e ogni riga i caratteri da far apparrire sullo schermo: "0" o " " (ossia un carattere spazio bianco).
<pre><script> with(Math) {

D=1; S=2; A=3; B=4
vai = [D,D,D,D,D,D,D,D,D,D,D,D,B,B,B,B,B,B,B,B,B,S,S,S,S,S,S,S,S,S,S,S,
    A,A,A,A,A,A,A,D,D,D,D,D,D,D,D,B,B,B,B,B,S,S,S,S,S,S,A,A,A,D,D,D,D,B]

var T = new Array(50);
for (i=0; i<50; i=i+1) {T[i]=new Array(50)}
for (i=0; i<50; i=i+1) {for(j=0; j<50; j=j+1) T[i][j]=" "}
n = vai.length;  u=0; v=0
for(i=0; i<n; i=i+1) {
  if(vai[i] == D) {v=v+1; T[u][v]=0}
  if(vai[i] == S) {v=v-1; T[u][v]=0}
  if(vai[i] == A) {u=u-1; T[u][v]=0}
  if(vai[i] == B) {u=u+1; T[u][v]=0}
}
for (i=0; i<50;i=i+1) {for(j=0; j<50; j=j+1) {document.write(T[i][j]); if(j==49) document.write("<br>")} }


} </script></pre>
 000000000000                                     
            0                                     
 000000000  0                                     
 0       0  0                                     
 0 00000 0  0                                     
 0 0   0 0  0                                     
 0 0     0  0                                     
 0 0000000  0                                     
 0          0                                     
 000000000000
Variante, introducendo la possibilità di inserire degli spazi vuoti (per spezzare la "biscia") usando la lettera V
<pre><script> with(Math) {

D=1; S=2; A=3; B=4; V=0
vai = [D,D,D,S,S,S,B,B,B,D,D,D, V,D,D,V,
      D,A,A,A, V,D,D,V,
      D,B,B,B,A,A,A,D,D,D,B,B,B,A,S,S, V,D,D,D,D,V,
      D,B,D,D,D,A,A,A,S,S,S,B]

var T = new Array(50);
for (i=0; i<50; i=i+1) {T[i]=new Array(50)}
for (i=0; i<50; i=i+1) {for(j=0; j<50; j=j+1) T[i][j]=" "}
n = vai.length; u=0; v=0; traccia=1
for(i=0; i<n; i=i+1) {if(vai[i] == 0) traccia = -traccia
  if(vai[i] == D) {v=v+1; if(traccia==1) T[u][v]=0}
  if(vai[i] == S) {v=v-1; if(traccia==1) T[u][v]=0}
  if(vai[i] == A) {u=u-1; if(traccia==1) T[u][v]=0}
  if(vai[i] == B) {u=u+1; if(traccia==1) T[u][v]=0}
}
for (i=0; i<50;i=i+1) {for(j=0; j<50; j=j+1) {document.write(T[i][j]); if(j==49) document.write("<br>")} }


} </script></pre>
0000  0  0000  0000                               
0     0  0  0  0  0                               
0     0  0000  0  0                               
0000  0  0  0  0000                               

O)   Un'istruzione comoda (non banale per le prime classi) è while ("fin tanto che"). Un esempio: la scomposizione di un numero intero positivo in fattori primi:
<pre><script> with(Math) {

n=632
k=2; while(k <= n) {if(n/k == round(n/k)) {n = n/k; document.write(k," ")} else k=k+1 }

} </script></pre>
2 2 2 79
else  (= "altrimenti")  si può usare per indicare che cosa fare se la condizione di un  if  è falsa.

Con piccole modifiche possiamo utilizzare lo script per trovare m.c.d. e m.c.m di più numeri naturali, senza ricorrere a specifici algoritmi. Esempio:
<pre><script> with(Math) {

n=13068
k=2; while(k <= n) {if(n/k == round(n/k)) {n = n/k; document.write(k," ")} else k=k+1 }
document.write("<br>")
n=90882
k=2; while(k <= n) {if(n/k == round(n/k)) {n = n/k; document.write(k," ")} else k=k+1 }
document.write("<br>")
n=29376
k=2; while(k <= n) {if(n/k == round(n/k)) {n = n/k; document.write(k," ")} else k=k+1 }


} </script></pre>
2 2 3 3 3 11 11 
2 3 3 3 3 3 11 17 
2 2 2 2 2 2 3 3 3 17
m.c.d.(13068,90882,29376) = 2*3*3*3 = 54, m.c.m.(13068,90882,29376) = 2*2*2*2*2*2*3*3*3*3*3*11*11*17 = 31990464


P)   Esempi vari
Ricordiamo, innanzi tutto, i nomi di altre funzioni (di a) utilizzabili oltre a quelle richiamate in C):
cbrt(a)  radice cubica,   sign(a)  segno (-1, 1 o 0),  ceil(a)  intero vicino non < a,  floor(a)  intero vicino non > a,   cos(a)  coseno,  sin(a)  seno,  tan(a)  tangente,  acos(a)  arcocoseno,  asin(a)  arcoseno,  atan(a)  arcotangente,   log10(a)  logaritmo in base 10,  log2(a)  logaritmo in base 2,  log(a)  logaritmo naturale,   random()  numero a caso tra 0 ed 1.
p0)
Per generare l'uscita casuale di un dado equo si può usare floor(random()*6+1).  Per generare l'uscita di un generico numero tra 3 e 7 si può usare random()*(7-3)+3.  Esempio:
<pre><script> with(Math) {
N=10
for(i=0; i<N; i=i+1) document.write(floor(random()*6+1),"  ")
} </script></pre>
6  3  5  4  3  6  2  5  2  1
La valutazione "sperimentale" della probabilità che lanciando due dadi equilibrati la differenza delle uscite sia 1:
<pre><script> with(Math) {
n=1e4; x=0; for(i=0; i<n; i=i+1)
      { U=abs( floor(random()*6+1)-floor(random()*6+1) ); if(U==1) x = x+1 }
document.writeln (x/n*100,"%")
n=n*10; x=0; for(i=0; i<n; i=i+1)
      { U=abs( floor(random()*6+1)-floor(random()*6+1) ); if(U==1) x = x+1 }
document.writeln (x/n*100,"%")
n=n*10; x=0; for(i=0; i<n; i=i+1)
      { U=abs( floor(random()*6+1)-floor(random()*6+1) ); if(U==1) x = x+1 }
document.writeln (x/n*100,"%")
} </script></pre>
27.56%
27.79%
27.7626%
(teoricamente troverei che i casi possibili sono 6*6 = 36 e quelli buoni sono 10, e 10/36 = 5/18 = 0.2777…)
 
Volendo quantificare la precisione della stima sperimentale (mediante un intervallo in cui al 99.7% cade la probabilità) si può usare l'aggiunta di "±3·σ√n" (per giustificazioni teoriche vedi l'argomento "teorema limite centrale"):
<pre><script> with(Math) {
n=1e4; x=0; for(i=0; i<n; i=i+1)
      { U=abs( floor(random()*6+1)-floor(random()*6+1) ); if(U==1) x = x+1 }
document.writeln (x/n*100,"%  +/- ",sqrt(x/n*(1-x/n)/sqrt(n-1)*300),"%" )
n=n*10; x=0; for(i=0; i<n; i=i+1)
      { U=abs( floor(random()*6+1)-floor(random()*6+1) ); if(U==1) x = x+1 }
document.writeln (x/n*100,"%  +/- ",sqrt(x/n*(1-x/n)/sqrt(n-1)*300),"%" )
n=n*10; x=0; for(i=0; i<n; i=i+1)
      { U=abs( floor(random()*6+1)-floor(random()*6+1) ); if(U==1) x = x+1 }
document.writeln (x/n*100,"%  +/- ",sqrt(x/n*(1-x/n)/sqrt(n-1)*300),"%" )
} </script></pre>
26.94%  +/- 0.7684402681799349%
27.979%  +/- 0.4372274105711382%
27.7392%  +/- 0.24522180483732334%
Fermandomi a 1 milione di prove ho (27.74±0.25)%
 
p1)

<pre><script> with(Math) {
n = 20; S = 0
for(i=0; i<=n; i=i+1) S = S+i
document.write(S)
} </script></pre>

           210 ( = 0+1+2+...+20 )


      N = 20
        |
  S = 0, i = 0
        |
   S = S + i  <———————
        |             | 
   i = i + 1          |
        |             |
     i ≤ N ?  — SI' ——
        |
        |  NO
        |
     scrivi S
        |
      STOP
    
S = 0,  i = 0
S = S+i = 0,  i = i+1 = 1
i ≤ 20?  sì
S = S+i = 1,  i = i+1 = 2
i ≤ 20?  sì
S = S+i = 3,  i = i+1 = 3
i ≤ 20?  sì
S = S+i = 6,  i = i+1 = 4
i ≤ 20?  sì
...
S = S+i = 190,  i = i+1 = 20
i ≤ 20?  sì
S = S+i = 210,  i = i+1 = 21
i ≤ 20?  no
scrivi 210
p2) <pre><script> with(Math) { n = 5; P = 1 for(i=1; i<=n; i=i+1) P = P*i document.write(P) } </script></pre> 120 ( = 1*2*3*4*5 )

      N = 5
        |
  P = 1, i = 1
        |
   P = P * i  <———————
        |             | 
   i = i + 1          |
        |             |
     i ≤ N ?  — SI' ——
        |
        |  NO
        |
     scrivi P
        |
      STOP
    
P = 1,  i = 1
P = P*1 = 1,  i = i+1 = 2
i ≤ 5?  sì
P = P*2 = 2,  i = i+1 = 3
i ≤ 5?  sì
P = P*3 = 6,  i = i+1 = 4
i ≤ 5?  sì
P = P*4 = 24,  i = i+1 = 5
i ≤ 5?  sì
P = P*5 = 120,  i = i+1 = 6
i ≤ 5?  no
scrivi 120
p3) <pre><script> with(Math) { x1 = 1; y1 = 2; x2 = 6; y2 = 7 document.write( "distanza tra (",x1,",",y1,") e (",x2,",",y2,") <br>" ) document.write( sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) ) ) } </script></pre> distanza tra (1,2) e (6,7) 7.0710678118654755 <pre><script> with(Math) { x1 = 1; y1 = 2; z1 = 5; x2 = 6; y2 = 7; z2=1 document.write( "distanza tra (",x1,",",y1,",",z1,") e (",x2,",",y2,",",z2,") <br>" ) document.write( sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2) ) ) } </script></pre> distanza tra (1,2,5) e (6,7,1) 8.12403840463596
p4) <pre><script> with(Math) { x1 = 1; y1 = 1 x2 = 4; y2 = 0 x3 = 0; y3 = 5 L1=sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) ) L2=sqrt( (x1-x3)*(x1-x3) + (y1-y3)*(y1-y3) ) L3=sqrt( (x3-x2)*(x3-x2) + (y3-y2)*(y3-y2) ) document.write( "P1P2 P1P3 P2P3: ", L1," ", L2," ", L3,"<br>" ) document.write( "perimetro del triangolo P1,P2,P3 = ", L1+L2+L3, "<br>" ) document.write( "area del triangolo P1,P2,P3 = ", abs(x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2))/2 ) } </script></pre> P1P2 P1P3 P2P3: 3.1622776601683795 4.123105625617661 6.4031242374328485 perimetro del triangolo P1,P2,P3 = 13.688507523218888 area del triangolo P1,P2,P3 = 5.5
Puoi disegnare il triangolo e calcolarne area, lati, angoli con questo script ottenendo questa immagine.
Ovvero posso generare un triangolo con questo script e poi controllare la risposta con quanto ora visto.
p5)
Equazioni di 2º grado:
<pre><script> with(Math) {
titolo = "Soluzioni di  a*x^2 + b*x + c = 0"
a = 1
b = 2
c = -15
document.write(titolo+"\n     a = ",a,", b = ",b, ", c = ",c+"<br>")
d = b*b-4*a*c
k1 = -b/(2*a) + sqrt(d)/(2*a); k2 = -b/(2*a) - sqrt(d)/(2*a)
if(d < 0) document.write("non ha soluzioni")
if(d > 0) document.write(k1, "  ", k2)
if(d == 0) document.write(k1)
} </script></pre>
Soluzioni di  a*x^2 + b*x + c = 0
     a = 1, b = 2, c = -15
3  -5
Equazioni di 3º grado
Mettiamo il procedimento risolutivo, senza spiegarlo.
<pre><script> with(Math) {
A = 1; B = 0; C = 0; D = 2
document.writeln("soluzioni di A*x^3 + B*x^2 + C*x + D = 0")
document.writeln("A = ", A,", B = ",B,", C = ",C,", D = ",D)
B=B/A; C=C/A; D=D/A; P=C-B*B/3; Q=D-C*B/3+2*B*B*B/27; T = 4*P*P*P/27+Q*Q; S=[]
if(T<0) { ang=acos(3*Q/2/P*sqrt(-3/P))/3; for(i=0;i<3;i=i+1) S[i] = sqrt(-4*P/3)*cos(ang+i*PI*2/3)-B/3 }
if(T==0) { S[0] = 2*cbrt(-Q/2)-B/3; S[1] = -cbrt(-Q/2)-B/3 }
if(T>0) { T=sqrt(T); S[0] = cbrt((-Q+T)/2)+cbrt((-Q-T)/2)-B/3}
if(T < 0) {document.write("3 sol: ", S[0], " ", S[1], " ", S[2])}
if(T ==0) {document.write("2 sol: ", S[0], " ", S[1])}
if(T > 0) {document.write("1 sol: ", S[0])}
} </script></pre>
soluzioni di A*x^3 + B*x^2 + C*x + D = 0
A = 1, B = 3, C = -10, D = -24
3 sol: 3 -3.9999999999999996 -2.0000000000000013  (ovvero 3 -4, -2)

soluzioni di A*x^3 + B*x^2 + C*x + D = 0
A = 1, B = 9, C = 15, D = -25
2 sol: 1 -5

soluzioni di A*x^3 + B*x^2 + C*x + D = 0
A = 1, B = 0, C = 0, D = 2
1 sol: -1.2599210498948732

p6)
Come viene calcolata la radice quadrata di un numero X?  Ad esempio procedendo per bisezione: parto da un intervallo che contiene la radice quadrata ([0,X] se X>1, [0,1/X] altrimenti), via via ne trovo la metà M, se M*M < X prendo quella destra come nuovo intervallo, altrimenti prendo quella sinistra; e così via.
<pre><script> with(Math) {
x = 1000
a = 0;  if(x > 1) {b = x} else {b = 1/x}
for(n=1; n<15; n=n+1) {
    m = (a+b)/2; y = m*m
    if(y < x) {a = m} else {b = m}
    document.writeln("n = ",n , "   a = ", a,"   b = ",b)
    }
} </script></pre>
n = 1   a = 0   b = 500
n = 2   a = 0   b = 250
n = 3   a = 0   b = 125
n = 4   a = 0   b = 62.5
n = 5   a = 31.25   b = 62.5
n = 6   a = 31.25   b = 46.875
     ...
n = 14  a = 31.6162109375   b = 31.67724609375
Se x = 0.1 ho:
n = 1   a = 0   b = 5
n = 2   a = 0   b = 2.5
     ...
n = 14  a = 0.316162109375   b = 0.3167724609375
Analogamente risolvo le equazioni  f(x) = 0  a partire da un intervallo in cui  f cambi segno (procedendo per bisezione: se a metà dell'intervallo la funzione ha lo stesso segno che nell'estremo sinistro assumo che la soluzione stia nella metà destra, altrimenti assumo che stia nella metà sinistra).
Esempio:  risolvere (rispetto ad x) 5x = 100, partendo da [0,10] (in quanto 50<100 e 510>100).
<pre><script> with(Math) {
function F(x) {return pow(5,x)-100}
a = 0;  b = 10
for(n=10; n<3000; n=n*2) {
  for(i=0; i<n; i=i+1) {
    m = a+(b-a)/2; y1 = F(a); y2 = F(m); y3 = F(b)
    if(y1*y2 > 0) {a = m} else {b = m}
  }
  document.writeln("n = ",n , "   a = ", a,"   b = ",b)
}
} </script></pre>
n = 10   a = 2.861328125   b = 2.87109375
n = 20   a = 2.861353112384677   b = 2.8613531216979027
n = 40   a = 2.861353116146786   b = 2.8613531161467862
n = 80   a = 2.861353116146786   b = 2.8613531161467862
n = 160   a = 2.861353116146786   b = 2.8613531161467862
n = 320   a = 2.861353116146786   b = 2.8613531161467862
n = 640   a = 2.861353116146786   b = 2.8613531161467862
n = 1280   a = 2.861353116146786   b = 2.8613531161467862
n = 2560   a = 2.861353116146786   b = 2.8613531161467862
Prendo come arrotondamento della soluzione 2.8613531161468.  (con software come WolframAlpha troveremmo 2.861353116146786101340213...)
p7)
Può essere comodo tabulare in un intervallo una funzione.  Ad esempio tabuliamo x → -x4-x3+7 (con 11 valori) tra -50 e 50:
<pre><script> with(Math) {
function F(x) {return -pow(x,4)-pow(x,3)+7}
a = -50;  b = 50
h=(b-a)/10
for(n=0; n<=10; n=n+1) {document.writeln("x = ",a+h*n,"   F(x) = ",F(a+h*n))}
} </script></pre>
x = -50   F(x) = -6124993
x = -40   F(x) = -2495993
x = -30   F(x) = -782993
x = -20   F(x) = -151993
x = -10   F(x) = -8993
x = 0   F(x) = 7
x = 10   F(x) = -10993
x = 20   F(x) = -167993
x = 30   F(x) = -836993
x = 40   F(x) = -2623993
x = 50   F(x) = -6374993
La cosa può essere utile per avere una rapida valutazione dell'andamento della funzione. In questo caso prendendo a e b man mano più vicini ci convinceremmo che la funzione ha un andamento /\ tra -10 e 10 (con WolframAlpha potremmo tracciare facilmente il grafico) e potremmo cercare dove assume il valore massimo. Vediamo come.

Data una funzione F, individuato un intervallo in cui l'andamento è /\, possiamo trovarne il massimo in tale intervallo, o individuatone uno in cui l'andamento è \/ possiamo trovarne il minimo.
L'idea è quella di dividere via via l'intervallo in 3 parti e prenderne i 2/3 in cui stia il valore cercato.

Ecco il programma per trovare il massimo (nel caso della funzione precedente):
<pre><script> with(Math) {
function F(x) {return -pow(x,4)-pow(x,3)+7}
a = -10;  b = 10
for(n=10; n<3000; n=n*2) {
  for(i=0; i<n; i=i+1) {
  h = (b-a)/3; y1 = F(a); y2 = F(a+h); y3 = F(a+h+h)
  if( (y1 < y2) & (y2  < y3) ) {a = a+h} else {b = b-h} }
  document.writeln("n=",n , "  max tra ", a,", ",b, "  val= ", y2)
  }
} </script></pre>
n=10  max tra -0.8421819167132386, -0.49535131839658636  val= 7.094270215667542
n=20  max tra -0.7500533542630592, -0.7499490523620422  val= 7.105468749998371
n=40  max tra -0.750000032934137, -0.7500000329247042  val= 7.105468749999999
n=80  max tra -0.750000032934137, -0.7500000329341369  val= 7.105468749999999
n=160  max tra -0.750000032934137, -0.7500000329341369  val= 7.105468749999999
n=320  max tra -0.750000032934137, -0.7500000329341369  val= 7.105468749999999
n=640  max tra -0.750000032934137, -0.7500000329341369  val= 7.105468749999999
n=1280  max tra -0.750000032934137, -0.7500000329341369  val= 7.105468749999999
n=2560  max tra -0.750000032934137, -0.7500000329341369  val= 7.105468749999999
Intuiamo che il valore esatto del punto in cui si ha il massimo è -0.75 = -3/4 e che qui F vale 7.10546875. I valori "strani" sulle ultime cifre sono dovuti alle approssimazioni fatte dal programma. In ogni caso, in ogni problema reale, si deve arrotondare ad un numero relativamente piccolo di cifre (con WolframAlpha troveremmo esattamente -3/4 e 1819/256).

Il programma per trovare il minimo applicato al caso di  x → 7*x2 - x/3 + 5:
<pre><script> with(Math) {
function F(x) {return 7*x*x - x/3 + 5}
a = -10;  b = 10
for(n=10; n<3000; n=n*2) {
  for(i=0; i<n; i=i+1) {
  h = (b-a)/3; y1 = F(a); y2 = F(a+h); y3 = F(a+h+h)
  if( (y1 > y2) & (y2  > y3) ) {a = a+h} else {b = b-h} }
  document.writeln("n=",n , "  min tra ", a,", ",b, "  val= ", y2)
  }
} </script></pre>
n=10  min tra -0.21998679063150905, 0.12684380768514317  val= 5.030706157217319
n=20  min tra 0.0237545988945348, 0.02385890079555173  val= 4.9960317671489705
n=40  min tra 0.023809512484711453, 0.02380951249414428  val= 4.996031746031747
n=80  min tra 0.023809512484711453, 0.023809512484711456  val= 4.996031746031747
n=160  min tra 0.023809512484711453, 0.023809512484711456  val= 4.996031746031747
n=320  min tra 0.023809512484711453, 0.023809512484711456  val= 4.996031746031747
n=640  min tra 0.023809512484711453, 0.023809512484711456  val= 4.996031746031747
n=1280  min tra 0.023809512484711453, 0.023809512484711456  val= 4.996031746031747
n=2560  min tra 0.023809512484711453, 0.023809512484711456  val= 4.996031746031747
Il minimo è in 0.0238095124847 dove F vale 4.99603174603 (con WolframAlpha troveremmo 1/42 e 1259/252)

Un altro esempio. Abbiamo capito (tabulando la funzione) che (x*sin(x)+sqrt(x)-x*x)3-x4 ha un massimo tra 0 e 0.8. Troviamolo con più precisione.
<pre><script> with(Math) {
function F(x) {return pow(x*sin(x)+sqrt(x)-x*x,3)-pow(x,4) }
a = 0;  b = 0.8
for(n=10; n<3000; n=n*2) {
  for(i=0; i<n; i=i+1) {
  h = (b-a)/3; y1 = F(a); y2 = F(a+h); y3 = F(a+h+h)
  if( (y1 < y2) & (y2  <y3) ) {a = a+h} else {b = b-h} }
  document.writeln("n=",n , "  max tra ", a,", ",b, "  val= ", y2)
  }
} </script></pre>
n=10  max tra 0.5923893715388915, 0.6062625954715576  val= 0.2980093461765785
n=20  max tra 0.599325390462832, 0.5993295625388726  val= 0.2980093461811849
n=40  max tra 0.599327315089737, 0.5993273150901144  val= 0.2980093461812495
n=80  max tra 0.599327315089737, 0.5993273150897371  val= 0.29800934618124975
n=160  max tra 0.599327315089737, 0.5993273150897371  val= 0.29800934618124975
n=320  max tra 0.599327315089737, 0.5993273150897371  val= 0.29800934618124975
n=640  max tra 0.599327315089737, 0.5993273150897371  val= 0.29800934618124975
n=1280  max tra 0.599327315089737, 0.5993273150897371  val= 0.29800934618124975
n=2560  max tra 0.599327315089737, 0.5993273150897371  val= 0.29800934618124975
Potrei prendere x = 0.5993273, y = 0.29800934618125, ma, se il problema è "pratico", è sufficiente prendere x = 0.5993, y = 0.2980  (con Geogebra avrei invece ottenuto x = 0.6, y = 0.3!!! Con WolframAlpha avrei ottenuto correttamente x ≈ 0.599327, y ≈ 0.298009).
p8)
Il minimo e il massimo di una funzione in un intervallo, se non se ne conosce l'andamento (\/ o/\ o ...), possono essere approssimati con una fitta tabulazione.  Consideriamo la stessa funzione studiata sopra:
<pre><script> with(Math) {
function F(x) {return 7*x*x - x/3 + 5 }
a = -10; b = 10
min = 1e300; max = -1e300
n = 8*9*5*7*11*13
for(i=0; i<=n; i=i+1) {x = a+(b-a)/n*i; y = F(x); if(y<min) {min=y; x1=x}; if(y>max) {max=y; x2=x}}
document.write("min ≈ ", min, " (x=", x1, ")   max ≈ ", max, " (x=", x2, ")")
} </script></pre>
min ≈ 4.996031746031746 (x=0.023809523809523725)   max ≈ 708.3333333333334 (x=-10)
Ho una stima del punto in cui la funzione assume il valore minimo e una stima di questo valore:  0.023809523809523725 invece di 0.0238095124847,  4.996031746031746 invece di 4.99603174603.
p9)
Un biologo deve fare un esperimento su 2 topi, scelti tra i 4 (A, B, C e D) di cui dispone. In quanti modi può effettuare la scelta?
6: AB, AC, AD, BC, BD, CD.  È il numero dei sottoinsiemi di 2 elementi di un insieme di 4 elementi, ovvero le combinazioni di 4 elementi 2 a 2.  Una formuletta per contarle è 4/2·3/1 (= 6).  Se dovesse scegliere 15 topi tra 25, le scelte possibili sarebbero  25/15·24/14·...·11/1.  Quante sono?
<pre><script> with(Math) {
document.write(25/15*24/14*23/13*22/12*21/11*20/10*19/9*18/8*17/7*16/6*15/5*14/4*13/3*12/2*11/1)
} </script></pre>

3268760    Più di 3 milioni!
Il calcolo si può fare facilmente, e in generale, con un ciclo for. Le combinazioni C(25,15) di 25 elementi 15 a 15 sono:
<pre><script> with(Math) {
n=25; k=15
c=1; for(i=0; i<k; i=i+1) { c=c*(n-i)/(k-i) }
document.write("C("+n+","+k+") = "+round(c))
} </script></pre>

C(25,15) = 3268760
L'istruzione "round" serve per non visualizzare le eventuali variazioni dai numeri interi derivanti dalle approssimazioni.

Un esempio di calcolo che utilizza i coefficienti binomiali: un calcolo relativo alla legge di distribuzione binomiale.
In una certa popolazione di individui adulti di una data regione si sa che una particolare malattia infantile ha colpito in media 1 persona su 8; prese del tutto a caso 100 persone adulte di quella regione qual è la probabilità che non più di 10 siano state colpita da essa?
Per capire, vediamo come calcolare la probabilità che ne siano state colpite 3:
    la probabilità che le prime 3 (o le ultime 3 o la 1ª, la 3ª e la 9ª o …) siano state colpite: (1/8)3·(1-1/8)97
    i modi in cui posso scegliere i 3 elementi tra i 100: C(100,3)
    la probabilità che esattamente 3 siano state colpite: C(100,3)·(1/8)3·(1-1/8)97
La soluzione del problema: C(100,0)·(1/8)0·(1-1/8)100+C(100,1)·(1/8)1·(1-1/8)99+ ... + C(100,10)·(1/8)10·(1-1/8)90
<pre><script> with(Math) {

Q=0; P=1/8; n=100
for(k=0; k<11; k=k+1)
{ c=1; for(i=0; i<k; i=i+1) { c=c*(n-i)/(k-i) }
  Q = Q + c*pow(P,k)*pow(1-P,n-k) }
document.write(Q)

} </script></pre>
0.28099917939852637
La probabilità cercata è 28.1%.
p10)
L'integrazione.  Consideriamo l'integrale tra 1 e 5 di x → 2*x*x + 3*x + 1.
Procediamo approssimando l'area con n rettangolini (divido l'intervallo in n intervallini che prendo come basi dei rettangolini; come loro altezze prendo i valori della funzione nel centro di essi; se i valori sono negativi prendo i rettangolini rivolti verso il basso).  Partiamo con n=10 e man mano raddoppiamo n:
<pre><script> with(Math) {
function F(x) { return  2*x*x + 3*x + 1 }; a = 1; b = 5
document.writeln("F(x) = 2*x*x + 3*x + 1; a = 1; b = 5")
n=10
for(i = 0; i < 5; i = i+1) {
  s=0; h=(b-a)/n; for (var j=0; j < n; j=j+1) {s = s + F(a+(j+1/2)*h)}
  document.writeln(n, " rettangoli, integrale di F su [a,b] = ", s*h); n=n*2
   }
} </script></pre>
F(x) = 2*x*x + 3*x + 1; a = 1; b = 5
10 rettangoli, integrale di F su [a,b] = 122.56000000000004
20 rettangoli, integrale di F su [a,b] = 122.64000000000001
40 rettangoli, integrale di F su [a,b] = 122.66000000000003
80 rettangoli, integrale di F su [a,b] = 122.66500000000003
160 rettangoli, integrale di F su [a,b] = 122.66624999999999
Aumentiamo n, mettendo n=10000 al posto di n=10:
F(x) = 2*x*x + 3*x + 1; a = 1; b = 5
10000 rettangoli, integrale di F su [a,b] = 122.66666655999998
20000 rettangoli, integrale di F su [a,b] = 122.66666663999993
40000 rettangoli, integrale di F su [a,b] = 122.66666665999948
80000 rettangoli, integrale di F su [a,b] = 122.6666666649996
160000 rettangoli, integrale di F su [a,b] = 122.66666666625022
Deduco che:  integrale di F su [a,b] = 122.666… = 122+2/3 = 368/3

Altro esempio: calcolo di  ∫[0,3] |x·(x−2)| dx
F(x) = abs(x*(x-2)); a = 0; b = 3
10 rettangoli, integrale di F su [a,b] = 2.6550000000000002
20 rettangoli, integrale di F su [a,b] = 2.6634374999999997
...
81920 rettangoli, integrale di F su [a,b] = 2.6666666664804004
163840 rettangoli, integrale di F su [a,b] = 2.6666666666201007
Deduco che ∫[0,3] |x·(x-2)| dx = 2+2/3 = 8/3  (con Geogebra avrei ottenuto 2.67!!!  Per integrazione, ricerca di massimi/minimi, flessi, ... non è certo un software affidabile ...)

Altro esempio:  ∫[0,π/2] cos(x) dx
function F(x) { return  cos(x) };  a = 0; b = PI/2
5000 rettangoli, integrale di F su [a,b] = 1.0000000041123318
...
80000 rettangoli, integrale di F su [a,b] = 1.0000000000160585
Altro esempio:  1 − ∫[0,35] 0.1·exp(-0.1·x) dx
function F(x) { return  0.1*exp(-0.1*x) };  a = 0; b = 35
[document.writeln(n, " rettangoli,  1 - integrale di F su [a,b] = ", 1-s*h); n=n*2]
5000 rettangoli, 1 - integrale di F su [a,b] = 0.030197403222453345
10000 rettangoli, 1 - integrale di F su [a,b] = 0.030197388372357636
20000 rettangoli, 1 - integrale di F su [a,b] = 0.03019738465983124
40000 rettangoli, 1 - integrale di F su [a,b] = 0.030197383731682903
80000 rettangoli, 1 - integrale di F su [a,b] = 0.03019738349965262

p11)
È facilissimo studiare le successioni definite per ricorsione. Facciamo solo 3 esempi:
  x[0] = A, x[n+1] = sqrt(x[n])
  x[0] = 1, x[n+1] = (x[n] + A/x[n]) / 2
  x[0] = A, x[1]=B, x[n+2] = (3*x[n+1]-x[n]) / 2
<pre><script> with(Math) {
A = 13
document.writeln("x[0] = ", A, ", x[n+1] = sqrt(x[n])")
x = A; N = 1
for(i=0; i<N; i=i+1) x = sqrt(x)
document.writeln("x[", i, "] = ", x)
} </script></pre>
    Con A=13 cambiando N:
x[0] = 13, x[n+1] = sqrt(x[n])
x[1] = 3.605551275463989

x[20] = 1.0000024461293169

x[54] = 1

    Con A=0.17:
x[0] = 0.17, x[n+1] = sqrt(x[n])
x[1] = 0.41231056256176607

x[54] = 0.9999999999999999
                            x[n] -> 1  per n -> ∞  qualunque sia A
<pre><script> with(Math) {
A = 36
document.writeln("x[0] = ", 1, ", x[n+1] = (x[n] + A/x[n]) / 2")
x = A; N = 1
for(i=0; i<N; i=i+1) x = (x + A/x)/2
document.writeln("x[", i, "] = ", x)
} </script></pre>
    Con A=36 per crescenti valori di N:
x[0] = 1, x[n+1] = (x[n] + A/x[n]) / 2
x[1] = 18.5

x[2] = 10.222972972972974

x[5] = 6.0002529841194185

x[7] = 6
                            x[n] -> √A  per n -> ∞  qualunque sia A > 0
Una successione ricorsiva con 2 valori iniziali:
<pre><script> with(Math) {
A = 1; B = 2
document.writeln("x[0] = ", A, ", x[1] = ", B, ", x[n+2] = (3*x[n+1]-x[n]) / 2")
x = [A, B]
N = 2
for(i=2; i<=N; i=i+1) x[i] = (3*x[i-1]-x[i-2]) / 2
document.writeln("x[", N, "] = ", x[N])
} </script></pre>
    Con A = 1, B = 2 per crescenti valori di N:
x[0] = 1, x[1] = 2, x[n+2] = (3*x[n+1]-x[n]) / 2

x[0] = 1, x[1] = 2, x[n+2] = (3*x[n+1]-x[n]) / 2

x[55] = 2.999999999999999
Prova diversi valori di A e di B  (es.: A = -3; B = 9 → x[55] = 21)  e verifica che:
                                          x[n] -> 2*B - A
p12)
La regressione lineare.  Che cosa posso dire della funzione lineare F tale che F(5)=10 il cui grafico passa per i punti seguenti? (vi sono molti problemi di questo tipo; un semplice esempio: l'allungamento di un elastico o di una molla rilevato appendendovi oggetti di pesi diversi)
x:  12±1  17 ±1  24±1   33±1.5
y:  18±2  27±2  31±2.5  45±3

Guarda queste figure. La prima rappresenta la retta che meglio approssima i punti senza tener conto delle loro precisioni. La seconda rappresenta le rette di minima e massima pendenza che passano per tutti i punti dotati di precisione, che sono quindi in realtà dei rettangolini.
La prima retta si trova con un algoritmo non banale su cui si basa questo script; da esso si ricava che y = 1.225*x+3.875.
Le rette della seconda figura sono invece facili da trovare. Possiamo ricorrere a questo semplice programma:
<pre><script> with(Math) {
P = [5,10]; n = 4
x = [12, 17, 24, 33]; dx = [1, 1, 1, 1.5]
y = [18, 27, 31, 45]; dy = [2, 2, 2.5, 3]
pend1 = (y[0]-dy[0]-P[1])/(x[0]+dx[0]-P[0])
for(i=1; i<n; i=i+1) {p = (y[i]-dy[i]-P[1])/(x[i]+dx[i]-P[0]); if(p > pend1) pend1 = p}
pend2 = (y[0]+dy[0]-P[1])/(x[0]-dx[0]-P[0])
for(i=1; i<n; i=i+1) {p = (y[i]+dy[i]-P[1])/(x[i]-dx[i]-P[0]); if(p < pend2) pend2 = p}
document.write( P[1] + " + (x-" + P[0] + ") * " +pend1 + "  <=  y  <<=  " + P[1] + " + (x-" + P[0] + ") * " +pend2 )
} </script></pre>
10 + (x-5) * 1.1538461538461537  <=  y  <=  10 + (x-5) * 1.3055555555555556
che posso arrotondare a  10 + (x-5) * 1.154  <=  y  <=  10 + (x-5) * 1.306
 
p13)
Per stampare giorno ed ora usa Date().
In qualunque script puoi aggiungere uno spazio in cui annotare appunti.
<pre><script> with(Math) {
document.write( Date() )
} </script></pre>
<input size=70 value="Appunti">
<input size=70>
<input size=70>
<input size=70>



NOTA.  Si potrebbero inserire negli script delle specifiche istruzioni di INPUT, ma ciò non comporterebbe dei miglioramenti nel caso di script semplici come questi, in cui si possono direttamente cambiare i valori assegnati alle variabili e vedere immediatamente i cambiamenti delle uscite.  Chi è interessato veda qui.