Multipli di due in un loop infinito

di il
13 risposte

Multipli di due in un loop infinito

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

  • Re: Multipli di due in un loop infinito

    Non stai stampando i multipli ma le potenze di 2.
    Forse invece di moltiplicare ti basta sommare 2... ragionaci sopra un po'
  • Re: Multipli di due in un loop infinito

    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.
  • Re: Multipli di due in un loop infinito

    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 ?
  • Re: Multipli di due in un loop infinito

    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
  • Re: Multipli di due in un loop infinito

    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
  • Re: Multipli di due in un loop infinito

    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...
  • Re: Multipli di due in un loop infinito

    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!!!
  • Re: Multipli di due in un loop infinito

    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
  • Re: Multipli di due in un loop infinito

    Scusa! Ho sbagliato io!!!
  • Re: Multipli di due in un loop infinito

    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
  • Re: Multipli di due in un loop infinito

    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;
        }
        
  • Re: Multipli di due in un loop infinito

    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
  • Re: Multipli di due in un loop infinito

    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