Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Programma non termina a causa di condizione infinita

    Salve,
    Chiedo innanzitutto venia in caso il titolo non sia sufficientemente adeguato, non mi viene altro in mente.
    Ho sviluppato questo codice in basa ad un esercizio (aggiungo anche le richieste).
    Codice:
    codice:
    #include <iostream>
    using namespace std;
    
    //funzioni
    int sceltaClasse(); //include il mess. di benvenuto
    void visualizzaCartaImbarco(int, int);
    int cercaPosti1(); //cerca i posti disponibili nella prima classe
    int cercaPosti2(); //cerca i posti disponibili nella classe economica
    void cercaAltro(int);
    
    
    
    const int size = 11;
    int arrayPosti[size] = {0}; //array di 10 elementi (escludendo l'elemento con indice 0)
    
    int main(void)
    {
      
      cout << "Benvenuto nel programma.";
     
      while (true){  //condizione?
      
      int classe = sceltaClasse();
      
      int posto = 0;
       //controlli su classe
       if (classe == 1 ){
         posto=cercaPosti1();
         visualizzaCartaImbarco(classe, posto);
          }
        else if (classe == 2)
        {
        posto=cercaPosti2();
        visualizzaCartaImbarco(classe, posto);
        }
         else
        cout << "Dato inserito non valido." << endl;
       
       }
      return 0;
    }
    
    int sceltaClasse()
    {
        int classeScelta;
        cout << "\nIn quale classe desidera viaggiare?\nDigitare 1 per la prima classe.\nDigitare 2 per la classe economica." << endl;
        cin >> classeScelta;
    
       return classeScelta;
    }
    int cercaPosti1()
    {
    
        for (int i = 1; i<5; i++) //cerco i posti nell'array, partendo dall'indice 1: se un elemento ha valore 0 lo utilizza come posto e lo incrementa.
         {
             if (arrayPosti[i] == 0)
             {
                 arrayPosti[i]++;
                 return i;
    
             }
    
         }
    
    cercaAltro(1);
    
    }
    
    int cercaPosti2()
    {
    
        for (int i = 6; i<10; i++)//cerco i posti nell'array, partendo dall'indice 1: se un elemento ha valore 0 lo utilizza come posto, lo incrementa, e lo ritorna.
         {
             if (arrayPosti[i] == 0)
             {
                 arrayPosti[i]++;
                 return i;
    
             }
    
         }
    cercaAltro(2);
    }
    
    
    void cercaAltro(int classe)
    {
        int x =0;
       switch (classe)
       {
           case 1:
           cout << "Non è stato possibile trovare un posto nella prima classe. Passare alla classe economica?\nDigiti 1 per passare alla classe economica;\nDigiti 2 per uscire dal programa."
                <<endl;
           cin >> x;
           if (x == 1){
            cercaPosti2();
          
            }
           else
           {
             cout << "Arrivederci!"<<endl;
           }
           break;
           case 2:
           cout << "Non è stato possibile trovare un posto nella classe economica. Passare alla prima classe?\nDigiti 1 per passare alla prima classe;\nDigiti 2 per uscire dal programa."
                <<endl;
           cin >>x;
           if (x == 1){
            cercaPosti1();
            
            }
           else{
             cout << "Arrivederci!"<<endl;
           }
           break;
           default:
           cout << "Valore inserito non valido."<<endl;
    
    
    
    
    
    
    
    
       }
    
    }
    
    
    void visualizzaCartaImbarco(int classe, int posto)
     {
       cout << "\nPosto assegnato: " << posto << "\nNella classe: " << classe << endl;
    
     }
    Richieste:

    codice:
    Problema:
    Creazione di un programma che permetta di effettuare delle prenotazioni.
    Caratteristiche e dati particolari:
    
    -Massimo 10 posti nell'aereo;
    -Ci sono due classi: la prima classe(posti 1-5), e la classe economica (post 6-10);
    -Il programma, deve visualizzare la carta d'imbarco contenente il posto ed il tipo di classe;
    -Il programma, deve controllare che il posto sia libero: in caso tutta la classe sia completa, bisogna chiedere se passare all'altra (e viceversa).
    Altrimenti visualizzare un messaggio, che informa l'utente che il prossimo viaggio è fra 3 ore.
    Non sapendo quale condizione utilizzare, ho impostato la condizione del while su true, che appunto impedisce il termine del programma.
    Un'idea sarebbe utilizzare un valore che è effettua la somma di tutti gli elementi dell'array: quando questo valore arriva al massimo (considerando che gli elementi dell'array hanno due valori: 0 ed 1) il while risulterà false e terminerà.
    Ma non saprei come impostarlo; naturalmente altre proposte saranno bene accette.

    Un altro problema, è questo:
    http://i47.tinypic.com/2v2tvdd.png

    Vi invito a darmi dei consigli, sono un novellino in materia
    Grazie per l'attenzione.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Il linguaggio va indicato anche nel titolo, come da Regolamento.

    Qui l'ho aggiunto io, tienilo a mente per il futuro.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Mi spiace, non accadrà più.
    Nessuno può aiutarmi?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Aggiungi una voce di menù a sceltaClasse() (ad esempio: premere 9 per uscire) e usa il valore per uscire dal while.

    codice:
      while (true){  //condizione?
      
      int classe = sceltaClasse();
      
      int posto = 0;
       //controlli su classe
       if (classe == 1 ){
         posto=cercaPosti1();
         visualizzaCartaImbarco(classe, posto);
          }
        else if (classe == 2)
        {
        posto=cercaPosti2();
        visualizzaCartaImbarco(classe, posto);
        }
    
        else if (classe == 9) {
            cout << "Bon voyage" << endl;
            return 0; 
       }
    
         else
        cout << "Dato inserito non valido." << endl;
       
       }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Bene, grazie.
    Però il problema che non riesco a risolvere, riguarda l'uscita dal programma nella seconda opzione.
    Quando una classe diventa piena (si attiva la funzione cercaAltro() ), l'utente viene avvertito ed invitato a scegliere tra due opzioni:
    -Digitando 1, si passerà all'altra classe
    -Digitando 2, si dovrebbe uscire dal programma, ma non funziona.
    Come posso risolvere?

    Grazie ancora shodan.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Per unificare le varie opzioni io farei così.
    Dato che cercaposto1 e 2 ritornano valori positivi in caso di successo, ma sempre inferiori di 11, puoi usare un valore molto più alto per indicare la condizione di uscita.
    Usando una macro il codice diventa più pulito, espressivo e facile da mantenere.
    Per esempio:
    codice:
    #include <iostream>
    
    #define EXIT_VALUE 99
    
    using namespace std;
    
    //funzioni
    ...
    
    int cercaAltro(int classe)
    {
        int x =0;
       switch (classe)
       {
           case 1:
           cout << "Non è stato possibile trovare un posto nella prima classe. Passare alla classe economica?\nDigiti 1 per passare alla classe economica;\nDigiti 2 per uscire dal programa."
                <<endl;
           cin >> x;
           if (x == 1){
            cercaPosti2();
            return -2;  // -2 (vedi note). 
            }
           else
           {
             cout << "Arrivederci!"<<endl;
             return EXIT_VALUE;
           }
           break;
           // stessa cosa per il case 2:
    
    
    ...
    
    int cercaPosti1()
    {
    
        for (int i = 1; i<5; i++) //cerco i posti nell'array, partendo dall'indice 1: se un elemento ha valore 0 lo utilizza come posto e lo incrementa.
         {
             if (arrayPosti[i] == 0)
             {
                 arrayPosti[i]++;
                 return i;
    
             }
    
         }
    
    return cercaAltro(1); // se ritorna EXIT_VALUE si deve uscire dal programma
    
    }
    
    ...
    
    
      while (true){  //condizione?
      
      int classe = sceltaClasse();
      
      int posto = 0;
       //controlli su classe
       if (classe == 1 ){
         posto=cercaPosti1();
         if (posto == EXIT_VALUE) {
             // si esce
             return 0;
         }
    
         visualizzaCartaImbarco(classe, posto);
          }
        else if (classe == 2)
        {
        posto=cercaPosti2();
    
         if (posto == EXIT_VALUE) {
             // si esce
             return 0;
         }
    
        visualizzaCartaImbarco(classe, posto);
        }
    
        else if (classe == EXIT_VALUE) {
            cout << "Bon voyage" << endl;
            return 0; 
       }
    
         else
        cout << "Dato inserito non valido." << endl;
       
       }
    Il -2 non è usato ma serve perché una funzione con parametro d'uscita non void deve sempre restituire un valore
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Grazie per i consigli.
    Non posso usare #define (non l'ho ancora studiato, devo iniziare i puntatori), quindi ho sostituito con const int EXIT_VALUE = 99.
    Ho modificato il codice applicando i tuoi preziosi suggerimenti, ma c'è ancora un altro piccolo problema.
    codice:
    #include <iostream>
    using namespace std;
    
    //funzioni
    int sceltaClasse(); //include il mess. di benvenuto
    void visualizzaCartaImbarco(int, int);
    int cercaPosti1(); //cerca i posti disponibili nella prima classe
    int cercaPosti2(); //cerca i posti disponibili nella classe economica
    int cercaAltro(int);
    
    
    const int EXIT_VALUE = 99;
    const int size = 11;
    int arrayPosti[size] = {0}; //array di 10 elementi (escludendo l'elemento con indice 0)
    
    int main(void)
    {
      
      cout << "Benvenuto nel programma.";
     
      while (true){  //condizione?
      
      int classe = sceltaClasse();
      
      int posto = 0;
       //controlli su classe
          if (classe == 1 ){
         posto=cercaPosti1();
         if (posto == EXIT_VALUE)
       {
    	   return 0;
       }
         visualizzaCartaImbarco(classe, posto);
          }
        else if (classe == 2)
        {
        posto=cercaPosti2();
        if (posto == EXIT_VALUE)
       {
    	   return 0;
       }
                visualizzaCartaImbarco(classe, posto);
        }
         else if (classe == EXIT_VALUE)
         {
    		 return 0;
    	 }
         else
        cout << "Dato inserito non valido." << endl;
       
       }
      return 0;
    }
    
    int sceltaClasse()
    {
        int classeScelta;
        cout << "\nIn quale classe desidera viaggiare?\nDigitare 1 per la prima classe.\nDigitare 2 per la classe economica.\nDigitare 3 per uscire." << endl;
        cin >> classeScelta;
    
       return classeScelta;
    }
    int cercaPosti1()
    {
    
        for (int i = 1; i<5; i++) //cerco i posti nell'array, partendo dall'indice 1: se un elemento ha valore 0 lo utilizza come posto e lo incrementa.
         {
             if (arrayPosti[i] == 0)
             {
                 arrayPosti[i]++;
                 return i;
    
             }
    
         }
    
    return cercaAltro(1);
    
    }
    
    int cercaPosti2()
    {
    
        for (int i = 6; i<10; i++)//cerco i posti nell'array, partendo dall'indice 1: se un elemento ha valore 0 lo utilizza come posto, lo incrementa, e lo ritorna.
         {
             if (arrayPosti[i] == 0)
             {
                 arrayPosti[i]++;
                 return i;
    
             }
    
         }
    return cercaAltro(2);
    }
    
    
    int cercaAltro(int classe)
    {
        int x =0;
       switch (classe)
       {
           case 1:
           cout << "Non è stato possibile trovare un posto nella prima classe. Passare alla classe economica?\nDigiti 1 per passare alla classe economica;\nDigiti 2 per uscire dal programa."
                <<endl;
           cin >> x;
           if (x == 1){
            cercaPosti2();
            return -2;
            }
           else
           {
             cout << "Arrivederci!"<<endl;
             return EXIT_VALUE;
           }
           break;
           case 2:
           cout << "Non è stato possibile trovare un posto nella classe economica. Passare alla prima classe?\nDigiti 1 per passare alla prima classe;\nDigiti 2 per uscire dal programa."
                <<endl;
           cin >>x;
           if (x == 1){
            cercaPosti1();
            return -2;
            }
           else{
             cout << "Arrivederci!"<<endl;
             return EXIT_VALUE;
               }
           break;
           
           default:
           cout << "Valore inserito non valido."<<endl;
    
    
    
       }
    
    }
    
    
    void visualizzaCartaImbarco(int classe, int posto)
     {
       cout << "\nPosto assegnato: " << posto << "\nNella classe: " << classe << endl;
    
     }
    Ecco l'errore: http://i45.tinypic.com/9qd16g.png

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da signoredeltempo
    Grazie per i consigli.
    Non posso usare #define (non l'ho ancora studiato, devo iniziare i puntatori), quindi ho sostituito con const int EXIT_VALUE = 99.
    Nessun problema, anzi.

    Per l'altra cosa, fai:
    codice:
           if (x == 1){
               return cercaPosti2();
           }
    Ma attento alla ricorsione tra cercaAltro() e cercaPosti 1 e 2 se non premi 2 per uscire.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Questo da inserire dove?
    Da cosa è generato quell'errore?
    Tu cosa faresti per evitare ulteriori problemi?

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Io riorganizzerei il codice scrivendo una cosa del genere:
    codice:
    struct Posto {
      int classe;
      int posto;
      Posto(int classe, int posto) {
        this->classe = classe;
        this->posto = posto;
      }
    };
    
    int main() {
      //...
      Posto *x = NULL;
      x = cercaPosto1();
      if(x == NULL)
        cercaPosto2();
      //...
      delete x;
      //..
      return 0;
    }
    
    Posto *cercaPosto1() {
      if(found) 
        return new Posto(classe, posto);
    }
    Questo codice è ancora molto sporco e può essere molto migliorato, ma è già più gestibile...

    Edit: io in realtà riscriverei tutto riorganizzando il codice, ma questa è un'altra storia (A parte che il mio codice è sempre più C-Like che né C++-Like)
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.