coniugazione verbi latini regolari

program attivo1;
(* coniugazione verbi latini attivi turbo pascal v.3 *)
(* coniugazione automatica su richiesta tempo e modo *)
const des1:array[1..84] of string[10]=('o','as','at','amus','atis','ant',
           'abam','abas','abat','abamus','abatis','abant','abo','abis','abit',
           'abimus','abitis','abunt',
           'i','isti','it','imus','istis','erunt',
           'eram','eras','erat','eramus','eratis','erant',
           'ero','eris','erit','erimus','eritis','erint',
           'em','es','et','emus','etis','ent',
           'm','s','t','mus','tis','nt',
           'erim','eris','erit','erimus','eritis','erint',
           'issem','isses','isset','issemus','issetis','issent',
           'a','ate','ato','ato','atote','anto',
           'are','isse','urum esse','uram esse','urum esse',
           'uros esse','uras esse','ura esse','ans','antis',
           'urus','ura','urum','andi','ando','andum','ando','um');
const des2:array[1..84] of string[10]=('eo','es','et','emus','etis','ent',
           'ebam','ebas','ebat','ebamus','ebatis','ebant','ebo','ebis','ebit',
           'ebimus','ebitis','ebunt',
           'i','isti','it','imus','istis','erunt',
           'eram','eras','erat','eramus','eratis','erant',
           'ero','eris','erit','erimus','eritis','erint',
           'eam','eas','eat','eamus','eatis','eant',
           'm','s','t','mus','tis','nt',
           'erim','eris','erit','erimus','eritis','erint',
           'issem','isses','isset','issemus','issetis','issent',
            'e','ete','eto','eto','etote','ento',
           'ere','isse','urum esse','uram esse','urum esse',
           'uros esse','uras esse','ura esse','ens','entis',
           'urus','ura','urum','endi','endo','endum','endo','um');
const des3:array[1..84] of string[10]=('o','is','it','imus','itis','unt',
           'ebam','ebas','ebat','ebamus','ebatis','ebant','am','es','et',
           'emus','etis','ent',
           'i','isti','it','imus','istis','erunt',
           'eram','eras','erat','eramus','eratis','erant',
           'ero','eris','erit','erimus','eritis','erint',
           'am','as','at','amus','atis','ant',
           'm','s','t','mus','tis','nt',
           'erim','eris','erit','erimus','eritis','erint',
           'issem','isses','isset','issemus','issetis','issent',
            'e','ite','ito','ito','itote','unto',
           'ere','isse','urum esse','uram esse','urum esse',
           'uros esse','uras esse','ura esse','ens','entis',
           'urus','ura','urum','endi','endo','endum','endo','um');
const des4:array[1..84] of string[10]=('io','is','it','imus','itis','iunt',
           'iebam','iebas','iebat','iebamus','iebatis','iebant',
           'iam','ies','iet',
           'iemus','ietis','ient',
           'i','isti','it','imus','istis','erunt',
           'eram','eras','erat','eramus','eratis','erant',
           'ero','eris','erit','erimus','eritis','erint',
           'iam','ias','iat','iamus','iatis','iant',
           'm','s','t','mus','tis','nt',
           'erim','eris','erit','erimus','eritis','erint',
           'issem','isses','isset','issemus','issetis','issent',
            'i','ite','ito','ito','itote','iunto',
           'ire','isse','urum esse','uram esse','urum esse',
           'uros esse','uras esse','ura esse','iens','ientis',
           'urus','ura','urum','iendi','iendo','iendum','iendo','um');
type stringa35=string[35];
var   rad1,rad2,rad3,rad:string[12];
      finale:string[3];
      coniugazione,modo:string[35];
      infinito:string[20];
      t,numero,c,d1,d2,dx:integer;
procedure testo(x,y:integer;stringa:stringa35);  (* stampa testi vari *)
begin
 gotoxy(x,y);
 writeln(stringa);
end;
procedure presenta;          (* presentazione scopo programma *)
begin
 writeln('il programma permette di coniugare i verbi regolari latini');
 writeln('della 1,2,3,4 coniugazione attiva');
 writeln('----------------------------------------------------------');
 writeln('viene richiesto il paradigma del verbo da coniugare');
 writeln('scrivere tutto in minuscolo:');
 writeln('presente,infinito,perfetto,supino');
 writeln('es.laudo,laudare,laudavi,laudatum');
 writeln('----------------------------------------------------------');
 writeln('.... opzioni:');
 writeln('.....coniugazione automatica dei tempi richiesti');
 writeln('.....possibile richiedere tempi e modi in vario ordine');
 writeln;
 writeln('premi return,prego');
 readln;
 clrscr;
end;
procedure fine;               (* fine operazione *)
begin
clrscr;
writeln('fine prova:arrivederci');
writeln('premi return,prego');
repeat until keypressed;
halt;                         (* ritorna a turbo pascal *)
clrscr;
end;
procedure pausa;
begin
 gotoxy(2,22);
 writeln('premi return,prego');
 repeat until keypressed;
 clrscr;
end;
procedure paradigma;              (* richiesta paradigma verbo*)
var lunghezza:integer;
    perfetto,prima,supino:string[20];
    termine:string[3];
begin
 writeln('SCRIVI PARADIGMA VERBO LATINO REGOLARE,come richiesto');
 writeln;
 writeln('scrivi prima forma indicativo presente:es.laudo');
 readln(prima);
 lunghezza:=length(prima);
 termine:=copy(prima,lunghezza-1,2);
 if (termine='eo') then dx:=2
  else dx:=3;
  repeat
 writeln('scrivi infinito verbo latino regolare:es.laudare');
 writeln('se forma errata o non regolare,viene ripetuta la richiesta');
 readln(infinito);
 lunghezza:=length(infinito);
 rad1:=copy(infinito,1,lunghezza-3);
 finale:=copy(infinito,lunghezza-2,3);
 until (finale = 'are') or (finale = 'ere') or (finale = 'ire');
 writeln('scrivi perfetto indicativo:es.laudavi');
 readln(perfetto);
 lunghezza:=length(perfetto);
 rad2:=copy(perfetto,1,lunghezza-1);
 writeln('scrivi forma del supino:es.laudatum');
 readln(supino);
 lunghezza:=length(supino);
 rad3:=copy(supino,1,lunghezza-2);
end;
procedure analisi;         (* riconoscimento coniugazione 1 2 3 4 *)
begin
 if (finale='are') then c:=1
  else if (finale='ere') and (dx=2) then c:=2
   else if (finale='ere') and (dx=3) then c:=3
    else if (finale='ire') then c:=4;
 case c of
 1:  coniugazione:='prima coniugazione';
 2:  coniugazione:='seconda coniugazione';
 3:  coniugazione:='terza coniugazione';
 4:  coniugazione:='quarta coniugazione';
 end;
end;
procedure tempo;          (* indicazione tempo da coniugare *)
begin
 clrscr;
 textcolor(4);
 writeln('scrivere numero tempo da coniugare');
 writeln('1...presente        indicativo');
 writeln('2...imperfetto      indicativo');
 writeln('3...futuro          semplice');
 writeln('4...perfetto        indicativo');
 writeln('5...piuccheperfetto indicativo');
 writeln('6...futuro          anteriore');
 textcolor(2);
 writeln('7...presente        congiuntivo');
 writeln('8...imperfetto      congiuntivo');
 writeln('9...perfetto        congiuntivo');
 writeln('10..piuccheperfetto congiuntivo');
 textcolor(3);
 writeln('11..imperativo      presente');
 writeln('12..imperativo      futuro');
 writeln('13..infinito        presente');
 writeln('14..infinito        perfetto');
 writeln('15..infinito        futuro');
 writeln('16..participio      presente');
 writeln('17..participio      futuro');
 writeln('18..gerundio              ');
 writeln('19..supino                ');
 writeln;
 writeln('0...per finire');
 writeln('-------------------------------');
 readln(numero);
 if (numero=0) then fine;
 textcolor(14);
 clrscr;
end;
procedure coniuga1;   (* coniugazione automatica su richiesta tempo *)
var a:integer;
begin
 textmode(1);
 textcolor(2);
 testo(2,2,modo);
 testo(2,3,coniugazione);
 testo(2,4,'verbo:'+infinito);
 writeln('----------------------------------');
 textcolor(14);
 for a:=d1 to d2 do
 begin
 case c of
 1:writeln(rad,des1[a]);
 2:writeln(rad,des2[a]);
 3:writeln(rad,des3[a]);
 4:writeln(rad,des4[a]);
 end;
 end;
 writeln('-----------------------------------');
end;
procedure decide;     (* stabilisce desinenze e radici da usare *)
begin
 case numero of
 1:begin d1:=1;d2:=6;rad:=rad1;modo:='presente indicativo';end;
 2:begin d1:=7;d2:=12;rad:=rad1;modo:='imperfetto indicativo';end;
 3:begin d1:=13;d2:=18;rad:=rad1;modo:='futuro semplice';end;
 4:begin d1:=19;d2:=24;rad:=rad2;modo:='perfetto indicativo';end;
 5:begin d1:=25;d2:=30;rad:=rad2;modo:='piuccheperfetto indicativo';end;
 6:begin d1:=31;d2:=36;rad:=rad2;modo:='futuro anteriore';end;
 7:begin d1:=37;d2:=42;rad:=rad1;modo:='presente congiuntivo';end;
 8:begin d1:=43;d2:=48;rad:=infinito;modo:='imperfetto congiuntivo';end;
 9:begin d1:=49;d2:=54;rad:=rad2;modo:='perfetto congiuntivo';end;
 10:begin d1:=55;d2:=60;rad:=rad2;modo:='piuccheperfetto congiuntivo';end;
 11:begin d1:=61;d2:=62;rad:=rad1;modo:='imperativo presente';end;
 12:begin d1:=63;d2:=66;rad:=rad1;modo:='imperativo futuro';end;
 13:begin d1:=67;d2:=67;rad:=rad1;modo:='infinito presente';end;
 14:begin d1:=68;d2:=68;rad:=rad2;modo:='infinito perfetto';end;
 15:begin d1:=69;d2:=74;rad:=rad3;modo:='infinito futuro';end;
 16:begin d1:=75;d2:=76;rad:=rad1;modo:='participio presente';end;
 17:begin d1:=77;d2:=79;rad:=rad3;modo:='participio futuro';end;
 18:begin d1:=80;d2:=83;rad:=rad1;modo:='gerundio';end;
 19:begin d1:=84;d2:=84;rad:=rad3;modo:='supino';end;
 end;
end;
procedure programma;        (* programma e scelta opzioni *)
begin
 clrscr;
 numero:=1;
 writeln('    opzione possibile:');
 writeln('    coniugazione automatica,senza interazione');
 paradigma;   (* chiede presente infinito  perfetto supino*)
 analisi;     (* ricerca coniugazione 1 2 3 4 *)
 testo(2,20,coniugazione);
 while numero <> 0 do
  begin
  tempo;       (* chiede tempo da coniugare *)
  decide;      (* stabilisce desinenze e radici da usare *)
  coniuga1;    (* coniugazione automatica singoli tempi *)
  pausa;
  end;
 numero:=0;
end;
begin       (* programma principale *)
 clrscr;
 textmode(2);
 presenta;  (* presentazione scopo programma *)
 programma;
end.