{ 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 }