[C++] Controllare ogni cifra di un numero intero e trovare 0

Desideri ricevere supporto tecnico informatico? Hai qualche domanda di ambito informatico? Pubblicala qua!
Rispondi
NONONONO
Messaggi: 7
Iscritto il: 11/06/2021, 13:01

[C++] Controllare ogni cifra di un numero intero e trovare 0

Messaggio da NONONONO »

//Scrivere un programma C++ che, letto da input un intero N, stampi la stringa SI se tutte le cifre di N
sono diverse da 0 altrimenti stampi NO.//

Non riesco in nessuna maniera a scrivere un codice per fare questo programma...
chi mi può aiutare?
mi servirebbe pure con una certa fretta...
Grazie in anticipo
Avatar utente
Dragone2
Amministratore
Messaggi: 107
Iscritto il: 30/07/2014, 18:35
Località: Italia
Contatta:

Messaggio da Dragone2 »

Ciao,
Intanto hai già scritto qualcosa? Casomai potresti condividerla, così vediamo insieme dove sbagli, ci sono diversi modi di approcciarsi al problema.
Di per sé è abbastanza semplice, se leggi l'input come una stringa, poiché poi puoi andare a fare un test cifra per cifra sfruttando il fatto che una stringa è un array.

Alternativamente c'è un metodo un po' più elegante, che prevederebbe di sfruttare l'operatore % (il modulo), tenendo conto del fatto che siamo in base 10 e usare la ricorsione. Questo ti permetterebbe di utilizzare il tipo intero. Ma ovviamente è una soluzione un po' più complessa da capire a primo occhio.

Ad esempio, potremmo far finta che N sia uguale a 12345607.
Adesso prova a immaginare un treno con tanti vagoni quante le cifre di N, al cui interno risiedono dei passeggeri, il cui numero è quello della singola cifra di N:

Codice: Seleziona tutto

[1][2][3][4][5][6][0][7]
Il tuo obiettivo è quello di capire se esiste un vagone vuoto, ovvero con 0 passeggeri.
Quindi sostanzialmente cosa dovresti fare? Accedere ad ogni vagone e controllare il numero di persone (la singola cifra).
Se riesci a trovare un vagone con 0 passeggeri, allora puoi tranquillamente fermarti, perché hai già trovato la risposta al tuo obiettivo. Altrimenti devi proseguire fino alla fine del treno, controllando carrozza per carrozza.

Come si traduce questo in codice?
Semplicemente sfruttando un array di char o std::string e un ciclo che va da 0 a alla lunghezza della stringa inserita in input, al cui interno inserirai un if che controlla cifra per cifra e se trovi "0" si ferma, stampando "NO".

Quindi un qualcosa tipo:

Codice: Seleziona tutto

#include <iostream>
using namespace std;
int main() {

	string s = "12345607"; //Lascio a te l'onere di gestire la lettura in input
	for(int i = 0; i < s.length(); i++) {
		if(s[i] == '0') { //Controllo carattere per carattere e cerco 0
			cout << "NO";
			return 0; //L'ho trovato, quindi posso fermarmi. Esco proprio dal programma, visto che non devo fare altro.
		}
	}
	cout << "SI"; //Ho controllato tutti i "vagoni", quindi se non mi sono fermato prima, posso scrivere "SI".
	return 0;
}
Oppure, come ti dicevo all'inizio, un qualcosa di ricorsivo (cioè una funzione che al suo interno richiama sé stessa):

Codice: Seleziona tutto

#include <iostream>

using namespace std;
int controllaOgniCifraETrovaZero(int x)
{
    int cifra = x % 10;
    cout << "Valuto la cifra: " << cifra << endl;
    if(cifra == 0) {
        cout << "NO"<< endl; //Lo stampo qui
        return -1;
    }
    
    if(x >= 10) {
        return controllaOgniCifraETrovaZero(x / 10);
    }
    
    return 0;
}
int main()
{
    int x = 1234567; //Anche qui va gestito l'input
    if(controllaOgniCifraETrovaZero(x) >= 0) {
        cout << "SI";
    }
    return 0;
}
Quest'ultimo approccio è probabilmente molto più elegante, te l'ho inserito solo per farti vedere 2 approcci diversi allo stesso problema. Se non hai mai visto funzioni ricorsive oppure ti manca il concetto di funzione, sostanzialmente puoi tranquillamente ignorarlo oppure provarlo a eseguire anche solo per curiosità :lol:
Immagine
Rispondi