/* File: voli.c */
/* Time-stamp: "2001-05-07 22:47:27 calvanes" */
/* Scopo: uso di strutture */

#include <stdio.h>
#include <string.h>

/* dim dell'array dei voli giornalieri */
#define MAXVOLI 5

struct ora {
  int ore;
  int minuti;
};
typedef struct ora Ora;

struct volo {
  char *numvolo;
  Ora orario;
  int numposti;
  char *destinazione;
};
typedef struct volo Volo;

struct voli {
  int numvoli;
  Volo vettorevoli[MAXVOLI];
};
typedef struct voli Voli;


void CambiaOrario(Volo vettorevoli[], const char *numerovolo, Ora nuovaora);
void AggiornaPosti(Volo vettorevoli[], const char *numerovolo,
                   int postiprenotati);
void StampaVoli(Volo vettorevoli[]);


int main(void)
{
  Volo voligiornalieri[MAXVOLI] = {
    "AZ001",  8, 10, 70, "Bologna",
    "AZ002",  9, 20, 71, "Palermo",
    "AZ003", 10, 30, 73, "Milano",
    "AZ004", 11, 40, 74, "Torino",
    "AZ005", 12, 50, 75, "Bari"
  };
  char nvolo[10], carattere;
  Ora nuovorario;
  int nposti;

  do {
    printf("\n\nIntroduci opzione:\n");
    printf("  A ... Cambia orario\n");
    printf("  B ... Aggiorna posti\n");
    printf("  C ... Stampa voli\n");
    printf("  F ... Fine:\n");
    carattere = getchar();
    getchar();
    switch (carattere) {

    case 'a': case 'A':
      printf("\n\tIntroduci il numero del volo da modificare: ");
      scanf("%10s", nvolo);
      printf("\tIntroduci nuovo orario: ");
      scanf("%d%d", &nuovorario.ore, &nuovorario.minuti);
      getchar();
      CambiaOrario(voligiornalieri, nvolo, nuovorario);
      break;

    case 'b': case 'B':
      printf("\n\t%s", "Introduci il numero del volo da modificare: ");
      scanf("%10s", nvolo);
      printf("\t%s", "Introduci posti prenotati: ");
      scanf("%d", &nposti );
      getchar();
      AggiornaPosti(voligiornalieri, nvolo, nposti);
      break;

    case 'c': case 'C':
      StampaVoli(voligiornalieri);
      break;

    case 'f': case 'F':
      break;

    default:
      printf("%s", "Carattere errato");
      break;
    }
  } while (carattere!='f'&&carattere!='F');

  return 0;
}


void CambiaOrario(Volo vettorevoli[], const char *numerovolo, Ora nuovaora)
{
  int i = 0;
  int trovato = 0;    /* inizializzazione della var booleana trovato a false */

  while ((i < MAXVOLI) && (!trovato)){
    if (strcmp(numerovolo, vettorevoli[i].numvolo) == 0)
      trovato = 1;
    i++;
  }
  if (!trovato)
    printf("\t%s", "Volo non trovato");
  else {
    i--;
    vettorevoli[i].orario.ore = nuovaora.ore;
    vettorevoli[i].orario.minuti = nuovaora.minuti;
    printf("\tModificato l'orario del volo %s\n", numerovolo);
  }
}


void AggiornaPosti(Volo vettorevoli[], const char *numerovolo,
                   int postiprenotati)
{
  int i = 0;
  int trovato = 0;    /* inizializzazione della var booleana trovato a false */

  while ((i < MAXVOLI) && (!trovato)){
    if (strcmp(numerovolo, vettorevoli[i].numvolo) == 0)
      trovato = 1;
    else
      i++;
  }
  if (!trovato)
    printf("\t%s", "Volo non trovato");
  else {
    if (vettorevoli[i].numposti >= postiprenotati) {
      vettorevoli[i].numposti -= postiprenotati;
      printf("\tAggiornamento per il volo %s: posti disponibili %d\n",
             numerovolo, vettorevoli[i].numposti);
    } else {
      printf("\tAggiornamento per il volo %s NON effettuato\n", numerovolo);
      printf("\t\tposti disponibili %d\n", vettorevoli[i].numposti);
    }
  }
}


void StampaVoli(Volo vettorevoli[MAXVOLI])
{
  int k;

  printf("\nPARTENZE VOLI GIORNALIERI\n"
         "%3s %6s %12s %10s %12s\n", "", "n.volo", "destinazione", "partenza",
         "posti liberi");
  for (k = 0; k < MAXVOLI; k++)
    printf("%3d %6s %12s %7d:%2d %12d\n",
           k,
           vettorevoli[k].numvolo,
           vettorevoli[k].destinazione,
           vettorevoli[k].orario.ore,
           vettorevoli[k].orario.minuti,
           vettorevoli[k].numposti);
}