{ File: palin3.pas }

{ Scopo: record e file di testo }

program StringheDaFilePalindrome;
{ Legge una sequenza di caratteri da file e determina se e` palindroma.
  - la lunghezza MASSIMA della sequenza e` fissata.

  In questa versione
  - vengono considerati tutti i caratteri letti da file (anche quelli diversi
    da lettere alfabetiche e cifre)
  - lettere minuscole e maiuscole vengono considerate diverse
}

const
  LunghezzaMax = 500;

type
  TipoIndice       = 1..LunghezzaMax;
  TipoArrayStringa = packed array [TipoIndice] of char;
  TipoStringa      = record
                       caratteri : TipoArrayStringa;
                       lunghezza : 0..LunghezzaMax
                     end;        


  procedure LeggiStringa (var stringa: TipoStringa);
  { Legge un file e restituisce in stringa la sequenza di caratteri contenuti
    nel file (inclusi i caratteri non alfanumerici).
  }
  var
    continua : boolean;   { indica se continuare la lettura o terminare perche`
                            si e` superata la dimensione del vettore di
                            caratteri }
    nome     : string;    { nome fisico }
    f        : text;      { nome logico }

  begin { LeggiStringa }
    writeln('Nome del file contenente la stringa? ');
    readln(nome);

    Assign(f, nome);
    Reset(f);

    continua := TRUE;
    with stringa do
    begin
      lunghezza := 0;
      while (not eof(f)) and continua do
      begin
        if lunghezza < LunghezzaMax then
          begin
            lunghezza := lunghezza + 1;
            read(f, caratteri[lunghezza])
          end
          else
          begin
            continua := FALSE;
            writeln ('File troppo lungo!')
          end
      end
    end;

    Close(f)
  end; { LeggiStringa }


  function Palindroma (stringa: TipoStringa): boolean;
  { Verifica se una stringa e` palindroma. }
  var
    i : TipoIndice;

  begin { Palindroma}
    Palindroma := TRUE;                      { assumiamo che sia palindroma }
    for i := 1 to trunc(stringa.lunghezza/2) do
      if stringa.caratteri[i] <> stringa.caratteri[stringa.lunghezza-i+1] then
        { appena viene trovato una coppia di elementi che NON soddisfa la
          condizione sappiamo che la stringa NON e` palindroma }
        Palindroma := FALSE
      { N.B. NON c'e' il ramo else }
  end; { Palindroma }


{ N.B. Nel PASCAL standard le dichiarazioni di variabili devono precedere le
       dichiarazioni di procedure e funzioni. }

var
  s  : TipoStringa;

begin { StringheDaFilePalindrome }
  LeggiStringa(s);
  write('La stringa letta contiene ', s.lunghezza, ' caratteri ');
  if Palindroma(s) then
    writeln('ed e'' palindroma')
  else
    writeln('e non e'' palindroma');
end. { StringheDaFilePalindrome }