program latino;
(* coniugazione verbi latini turbo pascal v.5 *)
(* scritto con turbo v.3 e poi leggermente modificato *)

uses crt,printer;   (* printer per stampare su carta LST *)

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,yx,numero,c,d1,d2,dx,pro,rs,re: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('si offrono varie opzioni:');
 writeln('1....coniugazione automatica dei tempi richiesti');
 writeln('2....coniugazione interattiva e correzione errori');
 writeln('3....coniugazione automatica e stampa su carta');
 writeln('4....coniugazione sequenziale tempi da 1 a 19 ');
 writeln('.....in questo caso,premere return invece di numero tempo');
 writeln;
 writeln('.....si deve scrivere la forma richiesta:se errata viene ');
 writeln('.....stampata la forma corretta:conteggio errori ');
 writeln;
 writeln('.....possibile richiedere tempi e modi in vario ordine');
 writeln('.....possibile cambiare verbo o modalita-auto-interattiva');
 writeln;
 writeln('premi return,prego');
 readln;
 clrscr;
end;

procedure fine;               (* fine operazione *)
begin
clrscr;
case pro of
1:writeln('fine prova:arrivederci');
2:begin writeln('totale risposte esatte.....',re);
        writeln('totale risposte errate.....',rs);
        writeln('totale risposte............',re+rs);
  end;
end;
writeln('premi return,prego');
readln;
halt;
clrscr;
end;


procedure pausa;
begin
 gotoxy(2,22);
 writeln('premi return,prego');
 readln;
 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 per indicare 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
 textcolor(2);
 testo(2,2,modo);
 testo(45,2,coniugazione);
 testo(45,3,'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 stampa;   (* coniugazione automatica e stampa *)
var a:integer;
begin
 textcolor(2);
 testo(2,2,modo);
 testo(45,2,coniugazione);
 testo(45,3,'verbo:'+infinito);
 writeln('---------------------------------------------');
 textcolor(14);
 for a:=d1 to d2 do
 begin
 case c of
 1:begin writeln(rad,des1[a]);writeln(lst,rad,des1[a]);end;
 2:begin writeln(rad,des2[a]);writeln(lst,rad,des2[a]);end;
 3:begin writeln(rad,des3[a]);writeln(lst,rad,des3[a]);end;
 4:begin writeln(rad,des4[a]);writeln(lst,rad,des4[a]);end;
 end;
 end;
 writeln('---------------------------------------------');
end;

procedure coniuga2;   (* coniugazione automatica sequenziale tempi *)
var a:integer;
begin
 textcolor(2);
 testo(2,2,modo);
 testo(45,2,coniugazione);
 testo(45,3,'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 prova1;   (* coniugazione interattiva e correzione *)
var a:integer;
    r:string[15];
    persona:integer;
    cambio:string[4];
begin
 textcolor(2);
 testo(2,2,modo);
 testo(45,2,coniugazione);
 testo(45,3,'verbo:'+infinito);
 writeln('-------------------------------------------------------');
 textcolor(14);
 writeln('scrivi la forma esatta:tutto in minuscolo');
 writeln('altrimenti premi return:viene stampa forma richiesta');
 writeln('-------------------------------------------------------');
 yx:=12;
 persona:=1;
 for a:=d1 to d2 do
 begin
 str(persona,cambio);
 yx:=yx+1;
 persona:=persona+1;
 testo(2,yx,'forma esatta:'+cambio);gotoxy(20,yx);read(r);
 case c of
 1:if (r <> (rad+des1[a]))  then  testo(40,yx,rad+des1[a]);
 2:if (r <> (rad+des2[a]))  then  testo(40,yx,rad+des2[a]);
 3:if (r <> (rad+des3[a]))  then  testo(40,yx,rad+des3[a]);
 4:if (r <> (rad+des4[a]))  then  testo(40,yx,rad+des4[a]);
 end;
 case c of
 1:if (r <> (rad+des1[a]))  then  rs:=rs+1 else re:=re+1;
 2:if (r <> (rad+des2[a]))  then  rs:=rs+1 else re:=re+1;
 3:if (r <> (rad+des3[a]))  then  rs:=rs+1 else re:=re+1;
 4:if (r <> (rad+des4[a]))  then  re:=rs+1 else re:=re+1;
 end;
 writeln;
 readln;
 end;
 writeln('risposte esatte=',re,'....risposte errate=',rs,' su totale:',re+rs);
 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 *)
procedure scelta;
 var ch:char;
  begin
  textmode(2);
  numero:=0;
  writeln('per altra prova,premi S,per finire premi N');
  readln(ch);
  ch:=upcase(ch);
  if ch='S' then programma
   else fine;
  end;
begin
 clrscr;
 numero:=1;
 writeln('    opzioni possibili:');
 writeln('1...coniugazione automatica,senza interazione');
 writeln('2...coniugazione con interazione e correzione errori');
 writeln('3...coniugazione automatica e stampa su carta');
 writeln('4...coniugazione sequenziale tempi da 1 a 19 ');
 readln(pro);
 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;      (* decide se automatica o interazione *)
 case pro of
 1:coniuga1; (* coniugazione automatica singoli tempi *)
 2:prova1;    (* coniugazione interattiva *)
 3:stampa;
 4:begin
   for t:=1 to 19 do
   begin
    numero:=t;
    decide;
    coniuga2;     (* coniugazione totale sequenziale *)
    pausa;
   end;
   numero:=0;
   end;
 end;
 pausa;
 end;
 numero:=0;
 scelta;     (* opzione per finire o altra prova *)
 clrscr;
end;

begin       (* programma principale *)
 clrscr;
 presenta;  (* presentazione scopo programma *)
 rs:=0;
 re:=0;
 programma;
end.