Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Dora
    Registrato dal
    Mar 2009
    Messaggi
    8

    C++ / Problema di memorizzazione valori

    Ciao a tutti.

    Sto svolgendo degli esercizi in C++. Un problema mi dice di trovare il numero più grande tra una serie di dieci numeri e visualizzarlo a video, non utilizzando matrici, puntatori, o nozioni complesse del C++, ma solo un ciclo while per la serie di numeri e if-else.

    Ho scritto questo:
    codice:
    #include<iostream>
    #include<cstdlib>
    using namespace std;
    
    int main()
    {
        int counter = 0;
        int number = 0;
        int largest = 0;
        
        while(counter != 10)
        {
            cout << "Enter a number: ";
            cin >> number;
            
            if(largest <= number)
            {
                largest = number;
            }
            
            counter++;  
        } 
        cout << endl << endl << "The largest number is: " << largest << endl << endl;
        system("pause");
        
        return 0;
    }
    Adesso quello che mi si richiede di scrivere è una modifica all'esercizio precedente: trovare i due interi più grandi.

    Come posso fare?

    Grazie.

  2. #2
    codice:
    #include<iostream>
    
    using namespace std;
    
    int main()
    {
        int counter = 0;
        int number = 0;
        int largest = 0;
        int secondlargest = 0;
        
        while(counter != 10)
        {
            cout << "Enter a number: ";
            cin >> number;
            
            if(largest < number)
            {
                secondlargest = largest;
                largest = number;
            }
            else if(secondlargest < number)
            {
                secondlargest = number;
            }
            counter++;  
        } 
        cout << endl << endl << "The largest number is: " << largest << endl <<"The second largest number is: " << secondlargest << endl << endl;
        cout << "Press Enter to exit...";
        cin.sync();
        cin.ignore();
        
        return 0;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di Dora
    Registrato dal
    Mar 2009
    Messaggi
    8
    Geniale. E dire che ho provato un'intera giornata!

    Grazie.

  4. #4
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di Dora
    Registrato dal
    Mar 2009
    Messaggi
    8
    Sono ritornata!

    Questa volta il mio problema riguarda le conversioni di tipo. Io ho un programma che mi richiede alla console dei numeri. Se inserisco un numero da 1 a 20, il programma mi deve disegnare il perimetro di un quadrato, formato da tanti asterischi per lato in base al numero che ho inserito (ma questo è un problema che cercherò di risolvere da sola). Se scrivo -1, il programma si interrompe, se scrivo un numero non compreso tra 1 e 20, che è diverso da -1, il programma deve visualizzare il messaggio "Misura non valida...", ma se scrivessi una lettera? Mi va in tilt tutto!

    In C, scrivevo:
    codice:
    if(variabile <= "47" && variabile >= "58"){printf("Carattere non valido! Inserire un numero!");}
    Ma in C++, la conversione da un numero ad un carattere non è possibile... come faccio?

    Io ho scritto questo:
    codice:
    #include<iostream>
    #include<cstdlib>
    
    using namespace std;
    
    int main()
    {
        int lato;
        int spazio;
        
        char carattere = static_cast<char>(lato);
        
        while(lato != -1)
        {
            cout << "Inserire misura del lato del quadrato da 1 a 20 (-1 per uscire): ";
            cin >> lato;
            if(lato >= 1 && lato <= 20)
            {
                cout << "OK!" << endl << endl;
            }
            else if(lato == -1)
            {
                break;
            }
            else if(carattere <= "/" && carattere >= ":")  
            {
                cout << endl << "Misura non valida! Inserire un numero compreso tra 1 e 20." << endl << endl;
            }          
        }
        
        system("pause");
        return 0;
    }
    P.S: Nel precedente problema, "secondlargest = largest" può essere rimosso: ho controllato.

  6. #6
    Originariamente inviato da Dora
    Sono ritornata!

    Questa volta il mio problema riguarda le conversioni di tipo. Io ho un programma che mi richiede alla console dei numeri. Se inserisco un numero da 1 a 20, il programma mi deve disegnare il perimetro di un quadrato, formato da tanti asterischi per lato in base al numero che ho inserito (ma questo è un problema che cercherò di risolvere da sola). Se scrivo -1, il programma si interrompe, se scrivo un numero non compreso tra 1 e 20, che è diverso da -1, il programma deve visualizzare il messaggio "Misura non valida...", ma se scrivessi una lettera? Mi va in tilt tutto!

    In C, scrivevo:
    codice:
    if(variabile <= "47" && variabile >= "58"){printf("Carattere non valido! Inserire un numero!");}
    Non so come facesse a funzionare, indipendentemente dal tipo di variabile un confronto di quel genere non ha alcun senso. L'unico caso in cui potrebbe aver senso è se variabile è un singolo char e 47 e 58 sono scritti senza le virgolette.
    Ma in C++, la conversione da un numero ad un carattere non è possibile... come faccio?
    La conversione da numero a carattere è possibile ma non c'entra niente. Il fatto qui è che l'operatore di estrazione (>>) cerca di convertire i dati inseriti in numero e non ci riesce, e li lascia nel buffer di input; visto che l'operazione è in un ciclo infinito il programma "impazzisce". Non ha senso cercare di controllare i caratteri inseriti convertendo lato in un char: non puoi ottenere direttamente i caratteri inseriti proprio perché ne hai delegato all'operatore >> il lavoro di conversione.
    Di solito in queste circostanze per acquisire input numerici o altri input che potrebbero dare problemi di caratteri non accettati utilizzo questa funzioncina:
    codice:
    #include <limits>
    
    //...
    
    template<class inType> void AcquireInput(std::ostream & Os, std::istream & Is, const char * Prompt, const char * ErrorMessage, inType & Result)
    {
        do
        {
            Os<<Prompt;
            if(Is.fail())
            {
                Os<<ErrorMessage;
                Is.clear();
                Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            }
            Is>>Result;
        } while(Is.fail());
    }
    da impiegare in questa maniera:
    codice:
    AcquireInput(cout, cin, "Inserire la misura del lato del quadrato da 1 a 20 (-1 per uscire): ", "Carattere non valido.\n", lato);
    P.S: Nel precedente problema, "secondlargest = largest" può essere rimosso: ho controllato.
    Non ne sarei così sicuro...
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da MItaly
    Non so come facesse a funzionare, indipendentemente dal tipo di variabile un confronto di quel genere non ha alcun senso. L'unico caso in cui potrebbe aver senso è se variabile è un singolo char e 47 e 58 sono scritti senza le virgolette.
    Che poi a dire il vero quel confronto non avrebbe senso nemmeno in questo caso, perché "variabile" come potrebbe essere contemporaneamente (essendoci l'operatore &&) <= 47 e >= 58 ?
    every day above ground is a good one

  8. #8
    Utente di HTML.it L'avatar di Dora
    Registrato dal
    Mar 2009
    Messaggi
    8
    Ciao!

    Ho pensato a tutto quello che mi avete detto... e ovviamente tutto era esatto. La mia difficoltà sta più nel ricercare gli algoritmi piuttosto che a trasformare questi ultimi in C++... c'è un metodo per essere facilitati a trovarli oppure si fa tutto a naso... perché se si dovessero trovare tutti gli algoritmi a naso... io sono rovinata!!!

    Comunque, ritornando al quadrato formato di asterischi, il mio quadrato dovrebbe assomigliare a questo (nel caso io digitassi 5):

    codice:
    *****
    *   *
    *   *
    *   *
    *****
    Io sono riuscita adisegnare un quadrato pieno... ma come fare gli spazi? Dichiarando una variabile "spazio = lato - 2" ???

    Il codice che ho scritto fin adesso è questo:
    codice:
    #include<iostream>
    #include<cstdlib>
    
    using namespace std;
    
    int main()
    {
        int lato = 0;
        
        while(lato != -1)
        {
            cout << "Inserire misura del lato del quadrato da 1 a 20 (-1 per uscire): ";
            cin >> lato;
    
            if(lato >= 1 && lato <= 20)
            {
    			int colonne = lato;
    			int spazio = lato - 2;
    			while(colonne > 0)
    			{   
    				int righe = lato;
    				while(righe > 0)
    				{
    					cout << "*";
    					righe--;
    				}
    				cout << endl;
    				colonne--;
    			}
    			cout << endl << endl;
            }
            else if(lato == -1)
            {
                break;
            }
            else
            {
                cout << "Misura non valida! Inserire un numero compreso tra 1 e 20." << endl << endl;
            }          
        }
        
        system("pause");
        return 0;
    }

  9. #9
    Originariamente inviato da Dora
    Ho pensato a tutto quello che mi avete detto... e ovviamente tutto era esatto. La mia difficoltà sta più nel ricercare gli algoritmi piuttosto che a trasformare questi ultimi in C++... c'è un metodo per essere facilitati a trovarli oppure si fa tutto a naso... perché se si dovessero trovare tutti gli algoritmi a naso... io sono rovinata!!!
    Esistono dei libri di algoritmi, ma trattano di algoritmi particolari e particolarmente complessi e ben studiati (ad esempio alcuni algoritmi di ordinamento); per i problemi "di tutti i giorni" si va a logica (anche se moltissimi problemi sono ricorrenti).
    Comunque, ritornando al quadrato formato di asterischi, il mio quadrato dovrebbe assomigliare a questo (nel caso io digitassi 5):

    codice:
    *****
    *   *
    *   *
    *   *
    *****
    Io sono riuscita adisegnare un quadrato pieno... ma come fare gli spazi? Dichiarando una variabile "spazio = lato - 2" ???
    Al di là del fatto che hai invertito le righe con le colonne, non è necessario dichiarare una variabile per tutto; puoi fare facilmente così:
    codice:
    int righe = lato;
    while(righe > 0)
    {
    	int colonnevuote = lato-2;
    	cout << '*';
    	while(colonnevuote > 0)
    	{
    		if(righe==lato || righe==1)
    			cout<<'*';
    		else
    			cout << ' ';
    		colonnevuote--;
    	}
    	cout << '*';
    	cout << endl;
    	righe--;
    }
    .
    P.S.: al posto dei while sarebbero meglio dei for in questo caso.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.