/* File: drivevet.c */
/* Time-stamp: "2001-05-25 16:09:31 calvanes" */
/* Scopo: driver per le funzioni sui vettori */

#include <stdio.h>
#include <stdlib.h>

typedef int bool;
#define TRUE  1
#define FALSE 0

#define NumElementi 20

typedef int TipoElemVettore;
typedef TipoElemVettore TipoVettore[NumElementi];


#include "vettio.c"

#include "ricesau.c"
#include "ricbinri.c"
#include "ricbinit.c"
#include "elimvett.c"
#include "ricermed.c"

#include "ordsel.c"
#include "ordbub.c"
#include "ordbubot.c"
#include "ordins.c"
#include "ordmerge.c"
#include "ordmergo.c"


void StampaVettore(TipoVettore A, int n)
  /* Stampa i primi n elementi del vettore A su standard output. */
{
  int i;

  for (i = 0; i < n; i++)
    printf("%d  ", A[i]);
  printf("\n");
} /* StampaVettore */


int main(void)
{
  TipoElemVettore elemento;
  TipoVettore A;              /* vettore usato nel programma */
  int n = 0;                  /* dimensione corrente del vettore */
  int i, j;                   /* indici di elementi del vettore */
  char scelta;                /* opzione del menu che e` stata scelta */
  char nome_file[256];        /* nome del file da leggere o scrivere */

  do {
    printf("Opzioni:\n");
    printf("- ORDINAMENTO ------------------------\n");
    printf("s: Ordinamento per selezione          \n");
    printf("b: Ordinamento a bolle                \n");
    printf("B: Ordinamento a bolle ottimizzato    \n");
    printf("i: Ordinamento per inserimento        \n");
    printf("m: Ordinamento per fusione            \n");
    printf("M: Ordinamento per fusione ottimizzato\n");
    printf("- RICERCA SU VETTORE ARBITRARIO ------\n");
    printf("1: Ricerca esaustiva                  \n");
    printf("2: Ricerca mediano                    \n");
    printf("- RICERCA SU VETTORE ORDINATO --------\n");
    printf("3: Ricerca binaria ricorsiva          \n");
    printf("4: Ricerca binaria iterativa          \n");
    printf("5: Elimina elemento dato              \n");
    printf("- MODIFICA VETTORE -------------------\n");
    printf("6: Modifica elemento di indice i      \n");
    printf("7: Scambia elementi di indici i j     \n");
    printf("8: Aggiungi un elemento alla fine     \n");
    printf("9: Leggi vettore da file              \n");
    printf("a: Scrivi vettore su file             \n");
    printf("- ALTRO ------------------------------\n");
    printf("0: Stampa vettore                     \n");
    printf("q: FINE                               \n");
    printf("--------------------------------------\n");
    printf("Scelta: ");
    scanf("%c%*[^\n]", &scelta);

    switch (scelta) {

    case 's':
      printf("Ordinamento per selezione.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      SelectionSort(A, n);
      printf("Vettore ordinato\n");
      StampaVettore(A, n);
      break;

    case 'b':
      printf("Ordinamento a bolle.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      BubbleSort(A, n);
      printf("Vettore ordinato\n");
      StampaVettore(A, n);
      break;

    case 'B':
      printf("Ordinamento a bolle ottimizzato\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      BubbleSortOttimizzato(A, n);
      printf("Vettore ordinato\n");
      StampaVettore(A, n);
      break;

    case 'i':
      printf("Ordinamento per inserimento.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      InsertionSort(A, n);
      printf("Vettore ordinato\n");
      StampaVettore(A, n);
      break;

    case 'm':
      printf("Ordinamento per fusione.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      MergeSort(A, n);
      printf("Vettore ordinato\n");
      StampaVettore(A, n);
      break;

    case 'M':
      printf("Ordinamento per fusione ottimizzato.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      MergeSortOttimizzato(A, n);
      printf("Vettore ordinato\n");
      StampaVettore(A, n);
      break;

    case '1':
      printf("Ricerca esaustiva.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      printf("Inserire elemento da cercare: ");
      scanf("%d", &elemento);
      if (RicercaEsaustiva(A, elemento, n, &i))
        printf("Trovato in posizione %d\n", i);
      else
        printf("L'elemento non e` presente nel vettore\n");
      break;

    case '2':
      printf("Ricerca mediano.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      RicercaMediano(A, n, &elemento);
      printf("Mediano: %d\n", elemento);
      break;

    case '3':
      printf("Ricerca binaria ricorsiva.\n");
      printf("Vettore di Input\n");
      StampaVettore(A, n);
      printf("Inserire elemento da cercare: ");
      scanf("%d", &elemento);
      if (RicercaBinaria(A, elemento, n, &i))
        printf("Trovato in posizione %d\n", i);
      else
        printf("L'elemento non e` presente nel vettore\n");
      break;

    case '4':
      printf("Ricerca binaria iterativa.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      printf("Inserire elemento da cercare: ");
      scanf("%d", &elemento);
      if (RicercaBinariaIterativa(A, elemento, n, &i))
        printf("Trovato in posizione %d\n", i);
      else
        printf("L'elemento non e` presente nel vettore\n");
      break;

    case '5':
      printf("Elimina elemento.\n");
      printf("Vettore di input\n");
      StampaVettore(A, n);
      printf("Inserire elemento da eliminare: ");
      scanf("%d", &elemento);
      if (EliminaDaVettore(A, elemento, &n, &i))
        printf("Eliminato elemento in posizione %d\n", i);
      else
        printf("Elemento non era presente\n");
      break;

    case '6':
      printf("Inserire indice i dell'elemento da modificare [0..%d]: ", n-1);
      scanf("%d", &i);
      if (i >= 0 && i < n) {
        printf("Inserire valore elemento A[%d]: ", i);
        scanf("%d", &A[i]);
      }
      else
        printf("Indice non valido");
      break;

    case '7':
      printf("Inserire indici i j degli elementi da scambiare: ");
      scanf("%d%d", &i, &j);
      elemento = A[i];
      A[i] = A[j];
      A[j] = elemento;
      break;

    case '8':
      if (n < NumElementi) {
        printf("Inserire valore elemento da aggiungere alla fine: ");
        scanf("%d", &A[n]);
        n++;
      }
      else
        printf("Vettore ha gia` dimensione massima %d", NumElementi);
      break;

    case '9':
      printf("Scrivi il nome del file da cui leggere il vettore: ");
      scanf("%s", nome_file);
      n = LeggiVettore(nome_file, A, NumElementi);
      printf("Vettore letto\n");
      StampaVettore(A, n);
      break;

    case 'a':
      printf("Scrivi il nome del file su cui scrivere il vettore: ");
      scanf("%s", nome_file);
      ScriviVettore(nome_file, A, n);
      break;

    case '0':
      printf("Vettore di %d elementi:\n", n);
      StampaVettore(A, n);
      break;
    }

    if (scelta != 'q') {
      printf("\n[invio]\n");
      scanf("%*[^\n]");
      getchar();
      getchar();
    }

  } while (scelta != 'q');

  return 0;
} /* main */