Problema: sistema di prenotazione aereo

di il
1 risposte

Problema: sistema di prenotazione aereo

Ciao a tutti ragazzi, in allegato c'è un problema in C che proprio non riesco a risolvere. Questa è la mia versione:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SEATS_N 10

int main( void )
{
   srand( time(NULL) );

   int seats[ SEATS_N + 1 ] = {0};
   int scelta;
   int i, j = 0;  /* contatori prima classe / economica */
   int x;         /* per il generatore num.casuale */
   int change;    /* input in caso di cambio sistemazione */

   while ( i != SEATS_N/2 || j != SEATS_N/2 ) {

      printf( "\nPlease type 1 for \"first class\""
              "\nPlease type 2 for \"economic\": ");
      scanf( "%d", &scelta );

      if ( scelta != 1 && scelta != 2 ){
         printf( "\nErrore, riprovare.\n" );
      }
      else {

         if ( scelta == 1 ){

            x = 1 + rand() % 5;

            while ( seats[x] == 1 && i != 5 ){
               x = 1 + rand() % 5;
            }

            if ( i != 5 ) {
               seats[x] = 1;
               printf( "\nFirst class, %d", x );
               i++;
            }
            else {

               printf( "\nNo first class seats left. Would you like an economic one instead?"
                       "\n(1 yes, otherwise no): ");
               scanf( "%d", &change );

               if ( change == 1 ) {

                  x = 6 + rand() % 5;

                  while ( seats[x] == 1 ) {
                     x = 6 + rand() % 5;
                  }
                  seats[x] = 1;
                  printf( "\nEconomic, %d", x );
                  j++;
               }
               else {
                  printf( "\nNext flight leaves in 3 hours.\n" );
               }
            }
         }

         if ( scelta == 2 ){

            x = 6 + rand() % 5;

            while ( seats[x] == 1 && j != 5 ){
               x = 6 + rand() % 5;
            }

            if ( j != 5 ) {
               seats[x] = 1;
               printf( "\nEconomic, %d", x );
               j++;
            }
            else {

               printf( "\nNo economic seats left. Would you like a first class one instead?"
                       "\n(1 yes, otherwise no): ");
               scanf( "%d", &change );

               if ( change == 1 ) {

                  x = 1 + rand() % 5;

                  while ( seats[x] == 1 ) {
                     x = 1 + rand() % 5;
                  }
                  seats[x] = 1;
                  printf( "\nFirst class, %d", x );
                  i++;
               }
               else {
                  printf( "\nNext flight leaves in 3 hours.\n" );
               }
           }
         }

      }
   }

   printf( "\n\nPlane full, no seats left. Thank you.\n" );

   return 0;
}
In economic class ne conta, giustamente, 5, mentre in first class solo 3 e poi il programma si chiude ("no seats left"). E voi come lo fareste?

Grazie a tutti!!
Allegati:
17695_be429bb530bc7ac70ca91d9ed48eeec7.png
17695_be429bb530bc7ac70ca91d9ed48eeec7.png

1 Risposte

  • Re: Problema: sistema di prenotazione aereo

    Hai fatto alcuni errori.
    1) l'array non si inizializza nel modo che hai fatto tu, ovvero seats[ SEATS_N + 1 ] = {0};, in questo modo stai dicendo che seats[11] = 0. tralasciando il fatto che non ti serve a niente un array di 11 elementi, bensì ti serve di 10, per inizializzare un array devi utilizzare un ciclo for che, partendo dalla posizione 0 fino ad arrivare all'ultima posizione dell'array, ti setta i valori di ogni singola posizione a 0.
    2) i due random sono errati. un array di 10 elementi ha posizioni che vanno da 0 a 9 (gli informatici partono da 0 a contare ), per cui è errato fare 1 + rand()%5 e 6 + rand()%6, perchè così le posizioni che andrai a riempire saranno da 1 a 10 (e la posizione numero 10 non è compresa nell'array, causandoti quindi un overflow) mentre devi riempire, appunto, quelle che vanno da 0 a 9.
    3) sempre riguardo il random, anziché usare un while devi utilizzare un do-while che ti consente di evitare un'istruzione. con il while hai dovuto randomizzare 2 volte x, mentre se utilizzassi un do-while lo faresti una sola volta.

    non capisco comunque dove sia l'errore che hai detto tu, ho runnato il tuo codice ed esegue correttamente tutte le operazioni.
Devi accedere o registrarti per scrivere nel forum
1 risposte