Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C++] Problema di stdout, errore nel codice?

    Salve a tutti, sto scrivendo un programma per un esame, e per l'esattezza è un programma che dovrebbe dirmi se un numero è primo oppure no. Il codice è il seguente:
    codice:
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    int main () {
    	long long p;
    	cout<<"Digita un numero intero positivo: \n", cin>>p;
    	if(p<0) cout<<"Non fare il furbetto, voglio un numero positivo!\n";
    	else if(p<2) cout<<"Questo non è un numero primo.\n";
    	else if(p==2 || p ==3) cout<< p << "e un numero primo, e per giunta anche il mio preferito!\n";
    	else if(p%2 == 0) cout<< p <<" = 2*" << p/2 <<" e come vedi non è un numero primo." <<endl;
    	else {
    		for(int q = 3; q <= p/2; q+=2)
    		if (p%q == 0) {
    			cout<< p <<" = " << q << " * "<< p/q << endl;
    			cout<<"Dunque non e un numero primo.\n";
    		}
    		cout<< p <<" e' un numero primo!\n";
                    exit(0); 
    	};
    }
    Il problema ora è questo, anzi questi:

    1) quando digito alcuni numeri va benissimo, ma se ad esempio digito il numero "33", l'output è questo:

    codice:
    ~/Scrivania/Downloads$ ./a.out
    Digita un numero intero positivo: 
    33
    33 = 3 * 11
    Dunque non e un numero primo.
    33 = 11 * 3
    Dunque non e un numero primo.
    33 e' un numero primo!
    Dove ho sbagliato nel codice? Perché è evidente che 33 non è un numero primo, ma li mi butta entrambi i risultati.

    Inoltre vorrei chiedervi anche queste cose:

    1bis) come faccio affinché produca la lista di "moltiplicandi e moltiplicatori" possibili (come ha fatto nell'esempio, ossia mostrare che 33 = 11*3 e 3*11), senza che venga interrotto dalla scritta "dunque non è un numero primo"?

    1tris) come faccio, una volta ottenuto il risultato, a fare in modo che il programma mi richieda di inserire un altro numero, senza che invece esca dal processo?

    Grazie a tutti!!!!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ho solo aggiunto un "break" e una variable "bool primo".
    Ho anche indentato il codice.

    codice:
    #include <iostream>
    
    using namespace std;
    
    void chiedi_primo()
    {
        long long p;
        bool primo;    
        
        cout << "Digita un numero intero positivo: \n", cin >> p;
        if (p < 0)
            cout << "Non fare il furbetto, voglio un numero positivo!\n";
        else if (p < 2)
            cout << "Questo non è un numero primo.\n";
        else if (p == 2 || p == 3)
            cout << p << "e un numero primo, e per giunta anche il mio preferito!\n";
        else if (p % 2 == 0)
            cout << p << " = 2*" << p / 2 << " e come vedi non è un numero primo." << endl;
        else {
            primo = true;
            for (int q = 3; q <= p / 2; q += 2)
                if (p % q == 0) {
                    cout << p << " = " << q << " * " << p / q << endl;
                    cout << "Dunque non e un numero primo.\n";
                    primo = false;
                    break;
                }
            if (primo)
                cout << p << " e' un numero primo!\n";
        }
    }
    
    int main()
    {
        while (true)
           chiedi_primo();
    
        return 0;
    }
    P.S. Ho aggiunto anche che ti richiedesse il numero usando una FUNZIONE (chiedi_primo).

  3. #3
    Grazie infinite!!!
    Solo un'ultima scocciatura: come faccio per fare in modo (almeno, inconsciamente, prima ci ero riuscito), che se digito un numero (tipo che so, 12990) che ovviamente non sia primo, mi restituisca tutti i possibili "moltiplicandi"?

    Ad esempio, inserico 40, e vorrei che uscisse:

    40 = 2*20
    40 = 4*10
    40 = 5*8
    40 = 8*5
    40 = 10*4
    40 = 20*2
    Dunque 40 non è un numero primo.

    Spero di essere stato chiaro!
    Se è una cosa troppo complicata o "poco invogliante" va bene anche così, senza

    Ri-grazie!


    AH, e sopratutto, che restituisca un "cout" del tipo "non ci provare, questi non sono valori possibili", quando inserisco ad esempio un numero float (tipo 0.03) o un carattere char (tipo inserisco "adsda" o "e")??

    Graziegraziegraziegrazie!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Non sarebbe più interessante scomporre il numero nei sui fattori primi,
    invece di elencare tutti i suoi divisori?

  5. #5
    Mmm direi che è altrettanto interessante! Se non ti secca riesci a darmi una mano?

    Altrimenti mi accontento anche del modo per non farlo impazzire quando digito "la vispa teresa" o "0.032"

    in ogni caso ti ringrazio tantissimo comunque!

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Se ti basta la lista dei divisori prova così.

    codice:
    #include<iostream>
    
    using namespace std;
    
    void chiedi_primo()
    {
        long long p;
        int divisori = 0;
        
        cout << "Digita un numero intero positivo: ", cin >> p;
        if (p < 0)
            cout << "Non fare il furbetto, voglio un numero positivo!\n";
        else if (p < 2)
            cout << "Questo non è un numero primo.\n";        
        else {
            for (int q = 2; q <= p / 2; q++)
                if (p % q == 0) {
                    cout << p << " = " << q << " * " << p / q << endl;
                    divisori++;
                }
            if (divisori > 0)
                cout << "Dunque non e un numero primo.\n";            
            else
                cout << p << " e' un numero primo!\n";
        }
    }
    
    int main()
    {
        while (true)
           chiedi_primo();
    
        return 0;
    }

  7. #7
    E' magnifico! Vanno benissimo i divisori, così si identificano tutti i "motivi" per cui non è primo

    Io ho provato ad implementare anche un modo per fare in modo che se inserisco "a" o "asd" o "0.03" non vada in loop infinito/crash, ma non va.. come devo fare?
    E' ovvio che se faccio

    char a;
    if (p == a) blablabla..

    non va! Questa cosa non la capisco..

  8. #8
    Allora ho provato così:

    char z;
    float f;

    [....]

    else if (p == z || p == f) exit (0);

    tralasciando il resto del codice.

    In questo modo, se inserisco "e" o "0.03" esce normalmente dal processo.
    Secondo te/voi va bene?

  9. #9
    Dannazione, un altro problema..

    se nell'input digito ad esempio "12000k" il programma esegue tutto come se fosse 12000, ed alla fine esce...


  10. #10
    Dunque ho risistemato un po' il codice, tra quello che avevo e quello che c0der mi ha aiutato a scrivere, ed alla fine ho elaborato questo:
    codice:
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    
    void chiedi_primo()
    {
        long long p;
        char c;
        float f; 
    	int divisori = 0;   
        
        cout << "Digita un numero intero positivo: \n\n", cin >> p;
        if (p == c || p == f || p == 0)
            cout << " Cos'e' questo ciarpame!?\n\n", exit(0);
        else if (p < 0)
            cout << " Non fare il furbetto, voglio un numero positivo!\n\n";
        else if (p < 2)
            cout << " Questo non e' un numero primo.\n\n";
        else if (p == 2)
            cout << p << " Questo e' il numero primo piu' piccolo e piu' bello!\n\n";
        else {
    		for (int q = 2; q <= p/2; q++)
                if (p%q == 0) {
                    cout << p << " = " << q << " * " << p / q << endl;
                    divisori++;
                }
            if (divisori > 0)
                cout <<"\nQuesto dimostra che "<< p <<" non e un numero primo.\n\n";            
            else
                cout <<"\n"<< p <<" e' un numero primo!\n\n";
        }
    }
    int main()
    {
        while (true)
           chiedi_primo();
    
        return 0;
    }
    Va tutto benissimo, ossia il programma restituisce tutti i divisori qualora il numero inserito non sia primo, et vicem.
    Se inserisco "la vispa teresa" o "asd" o "i" o "0.00034" il programma rifugge dallo schifo inserito, uscendo.

    Ma se inserisco "11d", il programma mischia le cose: stdout mi dice:

    "11d è un numero primo.

    Cos'è questo ciarpame?"

    Ossia mischia i risultati dell'inserimento di "11" con "d"..
    Non so come risolverlo..

    Aiutatemi per favore!

    P.s. domanda: l'inserimento di exit(0) è corretto? O ci sono altri modi per effettuare quell'azione?

    grazie!!

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