{ File: palinerr.pas } { Scopo: array di caratteri, compatibilita` di tipo } program PalindromeSbagliato; { Le procedure di questo programma devono ricevere (tra l'altro) un array di caratteri. Tutto funziona perche' nel programma principale e' definito un tipo (TipoFrase) del quale sono dichiarate sia la variabile FRASE (parametro attuale per le chiamate di procedura) sia i parametri formali delle procedure (F, V). La definizione di TipoFrase e' indispensabile. Per capirlo, proviamo a dichiarare FRASE: array [1..N] of char. Il programma e' scorretto e nemmeno compila. Viene denunciato un errore di "incompatibilita' di tipi" perche' il tipo (anonimo cioe' senza nome) di FRASE non e' equivalente a quello del parametro attuale che le procedure si aspettano. ( Il tipo di FRASE non ha nome ... Il PASCAL riconosce come equivalenti solo i tipi CON IL MEDESIMO NOME, quindi il tipo di FRASE non e' equivalente a TIPOFRASE. } const N = 20; type TipoFrase = array [1..N] of char; var frase : array [1..N] of char; palin : boolean; ult : integer; procedure LeggiFrase (var f: TipoFrase; var u: integer); var i : integer; c : char; begin { LeggiFrase } i := 1; read(c); while c <> '.' do begin f[i] := c; i := i+1; read(c); end; u := i-1; readln end; { LeggiFrase } procedure VerificaPalindromia (f: TipoFrase; u: integer; var p: boolean); var i, j : integer; begin { VerificaPalindromia } i := 1; j := u; p := TRUE; while p and (i < j) do begin if f[i] <> f[j] then p := FALSE; i := i+1; j := j-1; end; end; { VerificaPalindromia } procedure MinToMaiusc (var v: TipoFrase; u: integer); var i : integer; begin for i := 1 to U do if ('a' <= V[i]) and (V[i] <= 'z') then V[i] := chr(ord(V[i])-ord('a')+ord('A')) end; { MinToMaiusc } begin { PalindromeSbagliato } LeggiFrase(frase, ult); MinToMaiusc(frase, ult); VerificaPalindromia(frase, ult, palin); if palin then writeln(' ... e'' palindroma') else writeln(' ... non e'' palindroma'); end. { PalindromeSbagliato }