//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
[C++] Controllare ogni cifra di un numero intero e trovare 0
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:
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:
Oppure, come ti dicevo all'inizio, un qualcosa di ricorsivo (cioè una funzione che al suo interno richiama sé stessa):
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à
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]
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;
}
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;
}