Un MANUALETTO di LINGUAGGIO
PASCAL per il biennio
Parte C
12) UNA RACCOLTA DI ESERCIZI
22)
Si lancia un
dado, mediante l’istruzione x:=random(6)+1, finchè esca il numero 1.
Quanti “colpi”
sono stati effettuati in totale?
23)
Letto in input
un intero n, si stabilisce se n è un numero “perfetto” (un intero si dice
“perfetto” se è uguale alla somma dei suoi divisori, inclusa l’unità ma escluso
il numero stesso: ad es. 6 è un numero perfetto, perché 1+2+3=6)
24)
Elenco dei
numeri perfetti ≤ m, con m letto in ingresso.
25)
Elenco degli
interi da a fino a b, con a, b letti in input, coi numeri primi scritti in
rosso, i perfetti in verde.
Si vogliono 10
numeri per riga: quindi, poiché una riga dell’output Turbo Pascal è composta da
80 posizioni di carattere, si utilizzerà una write (n:8)
26)
Il computer “inventa” un intero pseudocasuale non
superiore a 100 e invita l’utente a indovinarlo, dandogli 10 tentativi al
massimo.
Ogni volta che l’utente “tenta”, il computer gli
dice “più alto…” oppure “più basso…” oppure “giusto!!!” a seconda dei casi.
Il gioco si deve arrestare quando l’utente indovina,
oppure quando sono stati effettuati i 10 tentativi concessi.
27) Si lancia un
dado finchè escano due risultati consecutivi uguali, e si conta il numero di
colpi effettuato.
28) Output desiderato:
……..BOOM!
…BOOM!
……BOOM!
…
con 100
“esplosioni” (naturalmente, se l’utente si “stufa” potrà sempre far “abortire”
il programma con Ctrl-Pausa-Pausa ) e un numero pseudocasuale di puntini prima
di ogni esplosione.
Ci deve essere
un ritardo opportuno fra la comparsa di
ciascun puntino e il successivo, nonché fra una riga e la successiva.
Vogliamo far comparire la scritta BOOM! in colore, lampeggiante e anch’esso
(pseudo)casuale.
Ricordiamo che a
tale scopo si ricorre all’istruzione
textcolor (n) dove n è il codice del colore desiderato.
29) Scrivi un
programma che, letti in ingresso due interi positivi y, k, calcoli la somma
algebrica
1-y+y2-y3+ … ±yk
Ad esempio, se
y=2 e k=5, l’output dovrà essere il numero –21.
30)
Scrivere un
programma che, letti in input i 3 coeff. a, b, c di un’equazione di secondo
grado, ne fornisca le soluzioni.
Converrà far
calcolare innanzitutto il delta: poi:
if delta > 0 then … if delta = 0 then …
if delta < 0 then …
Evidentemente si
utilizzeranno variabili real e si vorrà l’output in notazione non esponenziale.
A tale proposito,
ricordiamo:
write (x1:10:5)
fa scrivere il valore della variabile real x1, in notazione non esponenziale,
su di un campo di 10 posizioni di carattere, allineata a destra su questo
campo, e con 5 cifre dopo il punto decimale.
31)
Programma per la
risoluzione di un sistema di 1° grado
ax+by=c,
a1x+b1y=c1
col metodo di
Cramer.
32)
Si chiama “successione di Fibonacci” la sequenza di
numeri
0 1 1
2 3 5 8 13
21 …
costruita nel modo seguente:
i primi due numeri della sequenza sono 0 e 1
rispettivamente;
a partire dal terzo numero, ciascun termine della
sequenza è ottenuto sommando i due termini che lo precedono.
Scrivi un programma che, letto in input n, scriva i
primi n termini della successione di Fibonacci.
33)
Un metodo per calcolare la radice cubica di un
numero, approssimata per difetto a meno di 0,1 (cioè, con la prima dopo la
virgola esatta), è il seguente:
dato il radicando x, si parte da un valore intero y
che sia una approssimazione per difetto di
;
poi si passa a considerare, via via, i numeri y;
y+0,1 ; y+0,2; y+0,3 ; … ciascuno di questi numeri viene
elevato al cubo, finché il risultato superi x. Allora il valore cercato sarà il
penultimo fra i numeri considerati.
Ad esempio, data l’operazione
si partirà da y=4 e
si farà:
43=64<70; poi 4,13=68,921<70; poi 4,23=74,088>70;
quindi il valore cercato è 4,1.
Scrivi un programma che, letti in input il radicando
x, e un numero intero, fornito dall’utente,
che sia approssimazione per difetto di
, calcoli e mandi in output in output il valore y=
approssimato per difetto a meno di 0,1.
34)
Un intero n
letto in input è sottoposto alla seguente procedura:
lo si fa
diventare 3n+1 se è dispari;
lo si fa
diventare la metà, ossia n div 2, se è pari.
Il procedimento
viene poi iterato sul nuovo numero ottenuto, fino ad arrestarsi quando si
ottenga il valore 1.
Ad esempio, se
n=7, in questo modo si genera la sequenza:
22 11
34 17 52
26 13 40
20 10 5
16 8 4 2 1
I numeri con cui
si è provato finora ad innescare questa procedura iterativa si sono tutti
“abbattuti a 1” dopo un numero più o meno alto di passi; la comunità matematica
sta tentando di provare che questo “abbattersi a 1” deve necessariamente aver
luogo per ciascun numero intero positivo, ma fino ad oggi questa
congettura non è ancora stata dimostrata.
Scrivi un
programma Pascal che, letto in input un intero n fornito dall’utente, mandi in
output la successione dei numeri che si ottengono sottoponendo n alla procedura
descritta.
L’algoritmo si
deve arrestare quando n diventa uguale a 1.
35)
Se tre interi a,
b, c, sono tali che a2+b2=c2, allora si dice
che a, b, c costituiscono una “terna pitagorica”.
Utilizzando
delle strutture FOR… DO … annidate,
dovresti riuscire a scrivere un programma che fornisca in output un elenco di
terne pitagoriche; ad esempio, tutte le terne pitagoriche nelle quali c non sia
superiore ad un numero N scelto dall’utente.
36)
Una terna
pitagorica si dice “fondamentale” se i suoi tre elementi sono numeri primi fra
loro (=privi di divisori comuni).
Ad esempio, la
terna (1, 12, 13) è fondamentale, mentre la (6, 8, 10) non lo è.
Modifica il
programma precedente in modo che le terne “fondamentali” compaiano,
nell’elenco, scritte in rosso (textcolor(12)).
Tieni conto del
fatto che, in una terna (a, b, c) tale che a2+b2=c2,
i tre numeri a, b, c sono primi fra loro se e solo se sono primi fra loro due
qualsiasi di essi (sapresti giustificare questa affermazione?)
37)
Si lancia n
volte una moneta, con n letto in ingresso.
Si vuole
stabilire quale è stato il numero massimo di risultati consecutivi uguali.
Ad esempio, se
la successione dei lanci è stata
1 0 1 1 1 0 1 1
0 0 0 0 1 1 0 0 1
la risposta è
“4”.
38)
Se indichiamo
con ln la misura del lato del poligono regolare di n lati, inscritto
nella circonferenza di raggio r, allora si dimostra che la misura del lato del
poligono regolare, inscritto nella stessa circonferenza, ma avente numero di
lati doppio, è dato da
![]()

Poniamo ora per
semplicità r=1; la formula diventa ![]()
Se partiamo
dall’esagono regolare inscritto (l6=1: è noto che il lato
dell’esagono regolare inscritto è uguale al raggio della circonferenza), applicando ripetutamente questa formula
potremo calcolare l12, l24, l48, …
Osserviamo ora
che i perimetri dei corrispondenti poligoni regolari inscritti costituiscono
approssimazioni per difetto, sempre più precise, della lunghezza della
circonferenza. Ma tale lunghezza è data da 2πּr = 2π
(ricordiamo che abbiamo preso r=1), per cui i SEMIperimetri dei poligoni
regolari considerati costituiranno approssimazioni per difetto, sempre più
precise, del numero π.
Un programma
Pascal per il calcolo approssimato di π.
Scrivi un
programma Pascal che, a partire dal lato dell’esagono regolare inscritto nella
circonferenza di raggio r=1
(l6=r
=1), calcoli successivamente la misura del lato del poligono regolare inscritto
avente:
12, 24, 48, 96,
192 … lati, e mandi in output tale misura
insieme con la misura del SEMIperimetro del poligono corrispondente.
Tali semiperimetri
forniranno una successione di approssimazioni sempre più precise, del numero
π.
Fai in modo che
sia l’utente a stabilire il numero di iterazioni.
Il lavoro
dovrebbe riuscire pressappoco così: PIGRECO.EXE
39)
Risoluzione di un’equazione di 3° grado con metodo
“empirico”:
Supponiamo di voler risolvere graficamente
un’equazione di 3° grado ax3+bx2+cx+d=0.
Potremo fare in matita il grafico del primo membro, pensato come funzione, e vedere in
corrispondenza di quali ascisse (fino ad un massimo di 3, come è noto) il
grafico taglia l’asse orizzontale. Supponiamo di aver trovato che esiste
sicuramente una soluzione compresa fra due certi interi alfa e beta: allora
potremmo partire da x=alfa, poi passare a x=alfa + 0,001, x=alfa + 0,002, x =
alfa + 0,003, ecc. … fino a quando consteremo che, nel passaggio da un valore
di x al successivo, la y corrispondente cambia di segno. Allora i due valori di
x, il “precedente” e il “successivo”, daranno un’approssimazione per difetto e
una per eccesso, della “vera” soluzione, esatte fino alla terza cifra dopo la
virgola (ossia, come si suol dire, esatte “a meno di 0,001”, perché comunque,
operando in questo modo, la differenza fra ciascuna di tali due approssimazioni
e la VERA soluzione sarà inferiore a 0,001).
Va detto che il procedimento non funziona sempre:
infatti, nei casi in cui il grafico tocca l’asse x senza che la y cambi di
segno (grafico che scende, tocca l’asse x e poi risale, o viceversa), il metodo
fallisce.
Ciò premesso:
scrivi un programma Pascal che, dopo aver acquisito
in input i 4 coeff. a, b, c, d di un’equazione di 3° grado ax3+bx2+cx+d=0,
e dopo aver letto in input i valori di alfa e di beta (ascisse entro le quali
si sa che deve esserci una soluzione dell’equazione), calcoli, col metodo sopra
specificato, la soluzione approssimata a meno di 0,001.
40)
Per noi esseri
umani è facile, letto un numero intero a, calcolare quanto vale la somma
delle sue cifre. Ad esempio, se a=30227, la somma delle cifre di a è 14.
Non è invece
altrettanto facile far sì che il computer, dopo aver letto da tastiera un
intero a per effetto di un’istruzione readln (a) contenuta in un programma
Pascal, calcoli il valore della somma delle cifre di a.
Voglio dire: se
si comunicano al computer le cifre del numero UNA PER UNA, allora il problema è
banale; ma se invece si digita alla tastiera IL NUMERO a, e il computer,
eseguendo una readln (a), lo acquisisce in memoria "tutto in una
volta", allora far calcolare dal computer la somma delle cifre di a non è
banale.
Ci vuoi provare?
40’)
Esistono dei
numeri naturali, non superiori a 10000, che siano uguali al CUBO DELLA SOMMA DELLE PROPRIE CIFRE? In
caso affermativo, quali e quanti sono? Scrivi un programma Pascal che risponda
a questo quesito.