Pascal/Metodo top-down, procedure e funzioni: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Ramac (discussione | contributi)
+ esercizi
Ramac (discussione | contributi)
nuovi esercizi
Riga 107:
 
I parametri sono ovviamente variabili locali della procedura.
==== Passaggio di parametri per valore e per riferimento ====
Introdotto l'uso dei parametri, è necessario però fare una distinzione molto importante tra i due modi possibili di passare una variabile:
*quando i valori sono passati per '''valore''' la variabile che funge da parametro assume semplicemente il valore dell'espressione introdotta nella chiamata della procedura. Questa è la situazione presentata nel programma Esempio che abbiamo precedentemente visto.
Riga 205:
== Esercizi ==
* Scrivere una funzione ''ipotenusa'' che, presi come valori i cateti di un triangolo rettangolo, restituisca il valore della sua ipotenusa, applicando il [[w:teorema di Pitagora|teorema di Pitagora]]
{{cassetto|titolo=Soluzione proposta|testo=
<source lang=pascal>
function ipotenusa (c1:real, c2:real):real;
Riga 221:
}}
* Implementare una funzione che calcoli l<nowiki>'</nowiki>''n''esimo numero della [[w:successione di Fibonacci|successione di Fibonacci]], già vista nel capitolo precedente, utilizzando però un algoritmo ricorsivo.
{{cassetto|titolo=Soluzione proposta|testo=
<source lang=pascal>
function fibonacci(n:integer):longint;
Riga 229:
fibonacci:= 1;
0:
fibonacci:= 0;
else
fibonacci := fibonacci(n-1) + fibonacci(n-2);
Riga 236:
In questo caso siamo partiti dalla definizione della serie, sapendo quindi che F<sub>0</sub> = 0 e F<sub>1</sub> = 1.
}}
* Implementare una funzione <code>strpos</code> che prenda come parametri una stringa e un carattere, e restituisca la posizione della prima occorrenza del carattere nella stringa. Se il carattere non viene trovato, restituisce -1.
[[Categoria:Pascal|Metodo top-down, procedure e funzioni]]
{{cassetto|titolo=Soluzione proposta|testo=
<source lang=pascal>
function strpos(str: string, ch: char): integer;
var i, ris : integer;
begin
i := -1;
for i := 1 to length(str) do
begin
if (i = -1) and (str[i] = ch) then
ris := i;
end;
strpos := ris;
end;
</source>
La funzione scorre i caratteri della stringa e se a) il carattere non sia già stato trovato b) il carattere corrente è quello cercato, allora imposta come risultato la posizione corrente.
}}
* Una volta risolto il precedente esercizio, non dovrebbe essere difficile scrivere una funzione simile, ma che parta dal fondo a cercare il carattere
{{cassetto|titolo=Suggerimento|testo=Basta capovolgere i termini del ciclo ''for'' e usare un ''downto''}}
* Implementare una funzione <code>substr</code> che prenda come parametri una stringa e due interi, e restituisca una sottostringa partendo dal carattere in posizione specificata per una lunghezza specificata. Ad esempio se si passano come valori <code>'il linguaggio pascal'</code>, <code>4</code> e <code>5</code>, deve restituisce <code>'lingu'</code>.
{{cassetto|titolo=Soluzione proposta|testo=
<source lang=pascal>
function substr(str: string; pos, lnt: integer): string;
var max, i: integer;
ris: string;
begin
ris := '';
if pos < length(str) then
begin
if length(str) > pos + lnt then
max := pos + lnt - 1
else
max := length(str);
for i := pos to max do
ris := ris + str[i];
end;
substr := ris;
end;
</source>
La funzione è prevista per restituire come risultato una stringa vuota, nel caso non sia possibile fare altrimenti. Ad esempio se la posizione indicata come partenza è maggiore della lunghezza della stringa, viene restituita una stringa vuota. Se invece la posizione inserita è corretta, si procede con la funzione vera e propria.
<br/>Innanzitutto si determina la posizione del carattere finale della sottostringa (sappiamo l'inizio e la lunghezza, infatti). Decidiamo che, se con i parametri indicati, la stringa dovesse "sforare", allora verrebbe restituita la stringa fino alla fine. Dopo questa valutazione, tramite il ciclo aggiungiamo man mano alla variabile ''ris'' un carattere, fino a comporre la sottostringa finale, quella desiderata.
}}
*
 
[[Categoria:Pascal|Metodo top-down, procedure e funzioni]]
{{Avanzamento|100%|31 dicembre 2007}}