Multipli di due in un loop infinito

di Anonimizzato18303 il
13 risposte
Seguendo un esercizio del manuale di Deitel, dovrei creare un programma che stampi i multipli di due in un loop senza uscita, e il codice che ho scritto è il seguente:
#include <iostream>

using namespace std;

int main()
{
    cout << "Questo programma mostra tutti i multipli di due in un loop infinito." << endl;

    int number = 2;
    int loop ;

    while (number > 0)
       {
        loop = number;
        number = 2 * loop;

        cout << loop << " ";
        cout << number << " ";

        loop = number;
        number = 2 * loop;
       }

    return 0;
}
Ora eseguendolo, questo è l'output:



Non restituisce altri multipli poichè lo spazio di una variabile int è limitato, giusto ?

Però se provo a convertire le variabili da int a double, entra in un loop infinito, ma non mi restituisce come valori iniziali 2 4 8 16 ecc, ma questo:

13 Risposte

  • Non stai stampando i multipli ma le potenze di 2.
    Forse invece di moltiplicare ti basta sommare 2... ragionaci sopra un po'
  • Non restituisce altri multipli poichè lo spazio di una variabile int è limitato, giusto ?
    Innanzitutto non sono multipli ma potenze; il processo esce dal loop perchè il valore int va in overflow e diventa negativo quindi esce perchè number non è più maggiore di 0.
  • candaluar ha scritto:


    Non stai stampando i multipli ma le potenze di 2.
    Forse invece di moltiplicare ti basta sommare 2... ragionaci sopra un po'


    Sarò rimbambito, ma la traccia è proprio la seguente:

    4.29 Scrivere un programma che visualizza i multipli del numero 2 (2, 4, 8, 16, 32, ecc.) senza mai terminare, cioè in un ciclo infinito (Utilizzate per questo la condizione true per il while). Che accade quando lo eseguite ?
  • candaluar ha scritto:


    Non restituisce altri multipli poichè lo spazio di una variabile int è limitato, giusto ?
    Innanzitutto non sono multipli ma potenze; il processo esce dal loop perchè il valore int va in overflow e diventa negativo quindi esce perchè number non è più maggiore di 0.
    Ah, ora ho capito la lezione sui numeri binari, l'overflow, e l'uno che indicava questo, e che in modulo e segno 1 e negativo
  • L'ultimo valore che vedi è 1073741824 ovvero 0x4000 0000 in esadecimale: stai lavorando con interi a 32 bit e nel momento in cui moltiplichi tale valore *2 arrivi a 0x8000 0000 che in realtà diventa un valore negativo in quanto il bit più significativo che indica il segno viene settato.
    Comunque, a mio avviso, la traccia ti richiede di fare qualcosa del tipo while(1) ...
    Il punto è, ripeto, che stai elencando le potenze e non i multipli
  • candaluar ha scritto:


    L'ultimo valore che vedi è 1073741824 ovvero 0x4000 0000 in esadecimale: stai lavorando con interi a 32 bit e nel momento in cui moltiplichi tale valore *2 arrivi a 0x8000 0000 che in realtà diventa un valore negativo in quanto il bit più significativo che indica il segno viene settato.
    Ok, ora capisco meglio.

    candaluar ha scritto:


    Comunque, a mio avviso, la traccia ti richiede di fare qualcosa del tipo while(1) ...
    Il punto è, ripeto, che stai elencando le potenze e non i multipli
    Per il tipo d'esercizio, credo che quello a cui mi hai fatto arrivare tu, fosse l'obbiettivo insito.

    Ad ogni modo, ho riscitto tutto da capo, e utilizzando delle variabili double:
    int main()
    {
        cout << "Questo programma mostra tutti i multipli di due in un loop infinito." << endl;
    
        double number = 2;
        double loop = 0;
    
        while (number > 0)
           {
            loop = number;
            number = 2 * loop;
    
            cout << loop << " ";
            cout << number << " ";
    
            loop = number;
            number = 2 * loop;
           }
    
        return 0;
    }
    ora l'output mi restituisce tutte le potenze di due, e continua il suo loop visualizzando Inf



    Però se lo riavvio, può ripartire da un punto imprecisato, come mai ?




    Si sul fatto delle potenze sono daccordo, sarà un errore perche i multipli di due sono (2 4 6 8 10 ecc.)... traduzioni frettolose...
  • Si sul fatto delle potenze sono daccordo, sarà un errore perche i multipli di due sono (2 4 6 8 10 ecc.)... traduzioni frettolose...
    La traduzione è corretta, se è questo il testo dell'esercizio:
    4.29 Scrivere un programma che visualizza i multipli del numero 2 (2, 4, 8, 16, 32, ecc.) senza mai terminare, cioè in un ciclo infinito (Utilizzate per questo la condizione true per il while). Che accade quando lo eseguite ?
    Qui ti chiede chiaramente di stampare i multipli di 2, non ci possono essere fraintendimenti!!!
  • candaluar ha scritto:


    Si sul fatto delle potenze sono daccordo, sarà un errore perche i multipli di due sono (2 4 6 8 10 ecc.)... traduzioni frettolose...
    La traduzione è corretta, se è questo il testo dell'esercizio:
    4.29 Scrivere un programma che visualizza i multipli del numero 2 (2, 4, 8, 16, 32, ecc.) senza mai terminare, cioè in un ciclo infinito (Utilizzate per questo la condizione true per il while). Che accade quando lo eseguite ?
    Qui ti chiede chiaramente di stampare i multipli di 2, non ci possono essere fraintendimenti!!!
    Ma quella serie nella parentesi indica le potenze! Sono confuso... In più continuo a non capire perche il programma non riparta da 2 se lo riavvio
  • Scusa! Ho sbagliato io!!!
  • candaluar ha scritto:


    Scusa! Ho sbagliato io!!!
    Tranquillo, ma sapresti dirmi dove sbaglio, e perchè il programma non riparte sempre da 0 e 2, come le inizializzazioni delle due variabili

    EDIT: Rettifico, ripartono sempre dall'inizio, ma la pagina non tiene memoria di tutto quello che stampa, e nel loop per continuare a stampare valori deve eliminare quelli già stampati
  • B2OG4N ha scritto:


    ... ma la pagina non tiene memoria di tutto quello che stampa, e nel loop per continuare a stampare valori deve eliminare quelli già stampati
    Ma che vuol dire?

    E comunque, perché tutto quel casino con le variabili? Basta scrivere
    
        double number = 2.0;
        while(1)
        {
    	    cout << number << " ";
    	    number *= 2.0;
        }
        
  • oregon ha scritto:


    B2OG4N ha scritto:


    ... ma la pagina non tiene memoria di tutto quello che stampa, e nel loop per continuare a stampare valori deve eliminare quelli già stampati
    Ma che vuol dire?
    Che quando si apre la pagina promt che avvia il programma compilato, se si prova a scorrere a ritroso, quest'ultima non mostrerà più la parte inizialmente stampata se sono già stati stampati svariati caratteri (in loop ovviamente), e non lo avevo capito, quindi tornavo indietro per capire se il programma fosse iniziato in maniera corretta a visualizzando la serie.

    oregon ha scritto:


    E comunque, perché tutto quel casino con le variabili? Basta scrivere
    
        double number = 2.0;
        while(1)
        {
    	    cout << number << " ";
    	    number *= 2.0;
        }
        
    Quindi while(1) sta a significare iterazione infinita ? Non l'avevo ancora incotrato in questa forma
  • B2OG4N ha scritto:


    oregon ha scritto:


    B2OG4N ha scritto:


    ... ma la pagina non tiene memoria di tutto quello che stampa, e nel loop per continuare a stampare valori deve eliminare quelli già stampati
    Ma che vuol dire?
    Che quando si apre la pagina promt che avvia il programma compilato, se si prova a scorrere a ritroso, quest'ultima non mostrerà più la parte inizialmente stampata se sono già stati stampati svariati numeri (in loop ovviamente), e non lo avevo capito, quindi tornavo indietro per capire se il programma fosse iniziato in maniera corretta, ma tornando fino a su, vedevo a volte la serie iniziata da un punto indefinito, questo avveniva perchè durante l'esecuzione dovevo evitare che la barra di scroll arrivasse fino in fondo.

    oregon ha scritto:


    E comunque, perché tutto quel casino con le variabili? Basta scrivere
    
        double number = 2.0;
        while(1)
        {
    	    cout << number << " ";
    	    number *= 2.0;
        }
        
    Quindi while(1) sta a significare iterazione infinita ? Non l'avevo ancora incotrato in questa forma
Devi accedere o registrarti per scrivere nel forum
13 risposte