Sottoprogrammi (R)

Per ognuno dei problemi seguenti realizzare un sottoprogramma risolutivo in linguaggio TP6

  1. Riempire tutto lo schermo (tranne l’ultima riga) con un certo carattere (di un certo colore)
  2. Quanto vale la somma dei codici ASCII delle lettere maiuscole?
  3. Il massimo tra 4 numeri sfruttando l’operazione di massimo tra 2 numeri
  4. Determinare i due caratteri che si trovano a una certa distanza, prima e dopo, di un certo carattere

Si richiede per ognuno: Analisi con esempi, Interfaccia commentata, Algoritmo (a parole, per l’esempio), Codice TP6 commentato.

1. Riempire tutto lo schermo (tranne l’ultima riga) con un certo carattere (di un certo colore)

Riempire lo schermo significa scrivere un carattere, con un certo colore, tante volte. Se il carattere è 'X' e il colore Yellow dopo l'esecuzione del sottoprogramma lo schermo sarà riempito di X gialle...

Procedure SCHERMO(CH: Char; COL: Byte);

è una "procedure" perché si tratta di eseguire un ordine... In ingresso 2 parametri: Il carattere e il colore specificati alla chiamata.

L'istruzione da eseguire più volte è write(CH);, è necessario un ciclo per ripeterla; il numero di passi è costante (80x24) quindi si tratta di for i:=1 to 80*24 do.

Procedure SCHERMO(CH: Char; COL: Byte);var i: Byte;begin GotoXY(1,1); {bastauna sola volta perché...} TextColor(COL); for i:=1 to 80*24 do write(CH);end;

Utilizzando la procedura utilizzata per realizzare un rettangolo...

Procedure SCHERMO(CH: Char; COL: Byte);var i, j: Byte;begin TextColor(COL); for i:=1 to 80 do for j:=1 to 24 do begin GotoXY(i,j); write(CH); end;end;

2. Quanto vale la somma dei codici ASCII delle lettere maiuscole?

Si tratta di calcolare una somma utilizzando come addendi i codici ASCII delle lettere maiuscole. Il risultato sarà del tipo 65+66+67+... se 65 corrisponde alla 'A'

Function ASCII_MAIUSC: Integer;

Si tratta di function perché è richiesta una "risposta" (intera). Nessuna informazione è richiesta in ingresso, quindi nessun parametro.

I codici ASCII si ottengono utilizzando l'operatore Ord(); è necessaria una variabile locale (TOT) come accumulatore per i calcoli; la somma ha 26 addendi quindi si utilizza un ciclo for .

Function ASCII_MAIUSC: Integer;Var ch: Char; TOT: Integer;Begin TOT:=0; for ch:='A' to 'Z' do Inc(TOT, Ord(ch)); ASCII_MAIUSC:=TOT;End;

Oppure

Function ASCII_MAIUSC: Integer;Var i, TOT: Integer;Begin TOT:=0; X:=Ord('A'); for i:=1 to 26 do begin Inc(TOT, X); Inc(X); end; ASCII_MAIUSC:=TOT;End;

3. Il massimo tra 4 numeri sfruttando l’operazione di massimo tra 2 numeri

Si tratta di determinare il massimo tra 4 numeri dati sfruttando l'operazione già studiata per 2 numeri. Se i valori in ingresso sono 4, 5, 3, 1 il risultato sarà 5.

Function MAX4(A, B, C, D: Integer): Integer;

Si tratta di function perché è richiesta una "risposta" (intera). I 4 numeri sono necessari per svolgere il compito quindi si tratta di 4 parametri in ingresso tutti interi.

Supponendo di avere già l'operatore che determina il max tra due numeri possiamo applicarlo successivamente per determinare il max4: max2(4, 5) -> 5, max2(5, 3) -> 5, max2(5, 1) -> 5.Oppure possiamo determinare due max "parziali" e poi combinarli ancora con max2 per ottenere il max dei max...: max2(4, 5) -> 5, max2(3, 1) -> 3, max2(5, 3) -> 5

Function MAX2(A, B: Integer): Integer;Begin if(A >= B) then MAX2:=A else MAX2:=B;End;

Function MAX4(A, B, C, D: Integer): Integer;Begin MAX4:=MAX2(MAX2(MAX2(A, B), C), D);End;

Oppure

Function MAX4(A, B, C, D: Integer): Integer;Begin MAX4:=MAX2(MAX2(A, B), MAX2(C, D));End;

Risulta più semplice se si usano variabili locali per i risultati parziali.

4. Determinare i due caratteri che si trovano a una certa distanza, prima e dopo, di un certo carattere

All'interno della tabella ASCII bisogna individuare i due caratteri che si trovano, uno prima e uno dopo, a una certa distanza da un certo carattere. Se il carattere è 'D' e la distanza è 2 allora (..., 'B', 'C', 'D', 'E', 'F', ...) le due soluzioni sono 'B' e 'F'.

procedure CAR_DIST(CH: Char; Dist: Byte; Var Ch1, Ch2: Char);

Le risposte al problema sono due quindi si tratta di una procedura con due parametri in uscita; in ingresso compaiono il carattere centrale e la distanza dalle risposte.

Utilizzando gli operatori Ord() e Chr() è possibile risalire ai caratteri richiesti.

procedure CAR_DIST(CH: Char; Dist: Byte; Var Ch1,Ch2: Char);Begin Ch1:=Chr(Ord(Ch)-Dist); Ch2:=Chr(Ord(Ch)+Dist);End;

Un'altra soluzione potrebbe essere raggiungere le soluzioni con un ciclo for...

procedure CAR_DIST(CH: Char; Dist: Byte; Var Ch1,Ch2: Char);Begin Ch1:=Ch; Ch2:=Ch; for i:=1 to Dist do begin Ch1:=Pred(Ch1); Ch2:=Succ(Ch2); end;End;

- ApPuNtIdIuNiNfOrMaTiCo