{ File: driveord.pas }

program DriveOrdinamento;

const
  NumElementi = 10;

type
  TipoElemento = integer;
  TipoIndice   = 1..NumElementi;
  TipoVettore  = array [TipoIndice] of TipoElemento;

{ Inclusione delle procedure di ordinamento. }

{$I ORDSEL.PAS }     { ordinamento per selezione del minimo }
{$I ORDBUB.PAS }     { ordinamento a bolle }
{$I ORDBUBOT.PAS }   { ordinamento a bolle ottimizzato }
{$I ORDMERGE.PAS }   { ordinamento per fusione }

{ Procedure di lettura da file e stampa su video di vettori. }

  procedure LeggiVettoreFile (var v : TipoVettore);
  { Legge un vettore di NumElementi da un file di testo. }
  var
    nome_file : string;
    f         : text;
    i         : TipoIndice;

  begin { LeggiVettoreFile }
    writeln('Nome del file contenente un vettore di ', NumElementi,
            ' elementi interi?');
    readln(nome_file);
    assign(f, nome_file);
    reset(f);
    for i := 1 to NumElementi do
      read(f, v[i]);
    close(f)
  end; { LeggiVettoreFile }


  procedure StampaVettore (v : TipoVettore);
  { Stampa gli elementi del vettore v sullo schermo, tutti su una riga. }
  var
    i : TipoIndice;

  begin { StampaVettore }
    for i := 1 to NumElementi do
      write(v[i]:5);
    writeln
  end; { StampaVettore }


{ Variabili usate nel programma principale. }

var         
  vett      : TipoVettore;    { vettore usato nel programma }
  scelta    : char;           { opzione del menu che e` stata scelta }

begin
  LeggiVettoreFile(vett);

  writeln;
  writeln('Vettore letto:');
  StampaVettore(vett);

  writeln;
  writeln('Scegli uno dei seguenti metodi di ordinamento:');
  writeln('  1: Ordinamento per selezione del minimo');
  writeln('  2: Ordinamento a bolle');
  writeln('  3: Ordinamento a bolle ottimizzato');
  writeln('  4: Ordinamento per fusione');

  readln(scelta);

  writeln;
  case scelta of
    '1' : begin
            writeln('Vettore ordinato per selezione del minimo:');
            SelectionSort(vett);
          end;
    '2' : begin
            writeln('Vettore ordinato a bolle:');
            BubbleSort(vett);
          end;
    '3' : begin
            writeln('Vettore ordinato a bolle (versione ottimizzata):');
            BubbleSortOttimizzato(vett);
          end;
    '4' : begin
            writeln('Vettore ordinato per fusione:');
            MergeSort(vett);
          end;
    else writeln('Nessun metodo di ordinamento e` stato scelto');
  end; { case }

  StampaVettore(vett)
end. { DriveOrdinamento }