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.