View Full Version : [C] scomporre un numero nelle sue cifre singole
salve a tutti! :D
a scuola mi è stato assegnato un esercizio...
"scrivere un programma che prenda in input un numero di cinque cifre, lo spezzetti nelle sue singole cifre e le visualizzi ognuna separata dall'altra da tre spazi."
devo realizzarlo nel modo piu semplice possibile e con il minor numero di funzioni possibili (infatti abbiamo visto poco a scuola, siamo arrivati fino ai cicli -for, while e do while- ma non sono da usare in quest'esercizio, non ne vedrei neanche l'utilita).
non ho idea di come fare!
avevo pensato inizialmente di fare un printf del tipo:
printf("%1d\n");
printf("%2d\n");
printf("%3d\n");
printf("%4d\n");
printf("%5d\n");
ma il risultato -prendendo come esempio il numero 12345- sarebbe stato:
1
12
123
1234
12345
qualcuno ha un'idea? credo che comunque la chiave sia nell'utilizzo della variabile nel printf... qualcosa che mi sfugge... boh
astorcas
17-03-2008, 11:19
personalmente userei un for/while con l'operazione modulo e divisione....
Puoi pensare di stampare i 5 caratteri della stringa...
Tutto in un'unica printf ben formattata
ho creato questo:
#include <stdio.h>
#include <conio.h>
int main()
{
int numero;
int divisore = 1;
float cifra;
printf("inserisci il numero da scomporre: ");
scanf("%d",&numero);
cifra = numero/divisore;
for (numero,divisore,cifra;cifra>1;divisore*10){
cifra = numero/divisore;
printf("%1.0f",cifra);
}
system("PAUSE");
return 0;
}
ma purtroppo, dopo avermi chiesto l'input, viene visualizzato "premere un tasto per continuare"... ci dev'essere un errore nel ciclo for!
l'idea era di continuare a dividere la cifra per 1, 10, 100 etc finche il risutato continuava a essere maggiore di 1 (e che quindi c'erano ancora cifre nuove da visualizzare), in questo modo verrebbero visualizzati:
12345
1234.5
123.45
12.345
1.2345
ma utilizzando printf("%1.0f",cifra);:
5
4
3
2
1
il tutto però non funziona... non so perche... dov'è l'errore nel codice?
inoltre cosi (quando funzionera) vengono visualizzate al contrario... come posso risolvere?
la strada che stai percorrendo e' giusta.
Prima di stampare, cucina un po' la singola cifra.
non basta dividere, occorre anche che tu riesca ad isolare la singola cifra che conti di stampare.
Io stavo pero' pensando ad un'altra strada.
Le stringhe le avete fatte?
le stringhe? no no...
cosa intendi per cucinare la singola cifra? :D
e che non capisco perche il programma termina subito dopo che chiede l'input... almeno dovrebbe restituire qualcosa, anche se sbagliato!
Il ciclo for e' sbagliato, si'.
divisore*10 non vuol dire nulla.
Isolare per me significa che nel ciclo for dovresti cercare di "Isolare" la singola cifra che vuoi stampare.
cifra=numero/divisore non restituisce una cifra.
Restituisce un numero, addirittura con la virgola.
Non proverei a risolvere il problema con i formati della printf. Proverei a cercare a mano la singola cifra che vuoi stampare.
Per isolarlo occorre che lo trasformi in intero (cosi' getti via le virgole)
e poi tieni solo l'ultima cifra del numero, operazione che si fa con il modulo in base 10.
L'operatore di modulo in C se non sbaglio dovrebbe essere %
non riesco a seguirti... scusa ma ho appena iniziato a programmare :cool:
un esempio?
divisore*10 è l'incremento...
astorcas
17-03-2008, 13:21
si si il modulo è %. Praticamente puoi risolvere il tutto facendo:
modulo 10 -> stampa risultato -> dividi numero iniziale per 10,
queso finche il numero non è 0
leggi bene la sintassi del ciclo for.
Il terzo parametro non deve essere un incremento (di che cosa poi?)
Ma una vera istruzione...
Il resto poi, hai calcolato quello che hai chiamato cifra.
Ma ovviamente non e' una cifra, e' un numero, decimale per giunta.
Ti proponevo di trasformarlo, di cucinarlo, aggiungendo qualche riga di codice.
Al fine di cercare proprio esattamente la cifra che vuoi stampare.
Es: al terzo passo del tuo esempio, cifra vale
123.45
Tu vuoi stampare 3.
che operazioni matematiche devi fare per ottenere proprio 3, in una variabile (che poi stamperai?)
e appunto non so che operazione devo fare!
comunque ho risolto cosi:
#include <stdio.h>
#include <conio.h>
int main()
{
int numero;
printf("inserisci il numero da scomporre: ");
scanf("%d",&numero);
for (numero;numero>0;){
printf("%d\n",numero%10);
numero = numero/10;
}
system("PAUSE");
return 0;
}
funziona (e per giunta con la metà di righe di codice!), i numeri vengono mostrati in ordine inverso ma credo che sia inevitabile!
ora... perche modulo 10 da come risultato proprio la cifra cercata?
allora quello che non ho capito è l'operazione matematica in se mi sa...
astorcas
17-03-2008, 13:34
il modulo non è altro che il resto della divisione fra i due numeri es:
15%10 = 5;
14%7 = 0;
1%5 = 1;
e così via
P.s. Perchè usi il for in quel modo? E' esattamente un while con un parametro ridondante, for(numero; numero>0) puoi tranquillamente scriverlo con while(numero>0)
si hai ragione :)
no appunto che e il resto della divisione lo sapevo... mi sembrava strano però che modulo 10 restituisca proprio la prima cifra dopo la virgola del numero!
banryu79
17-03-2008, 13:44
... mi sembrava strano però che modulo 10 restituisca proprio la prima cifra dopo la virgola del numero!
Restituisce solo la prima cifra intera e non i decimali dopo la virgola proprio perchè l'operatore modulo (%) ritorna il resto intero della divisione [un intero] (quindi arrotonda i decimali).
In haskell:
import Data.Char
numberToList = map digitToInt . show
Scusate...non ho resistito... :stordita:
ok, vediamo se ho capito il meccanismo del modulo 10!
praticamente dividere per 10 significa spostare la virgola di un posto verso sinistra:
quindi (partendo dal secondo numero):
1234/10 = 123.4
ma cercando di memorizzare 123.4 in una variabile di tipo int verrà memorizzato solo 123
123*10 = 1230
qui entra in gioco il modulo, da 1230 a 1234 mancano 4 unita, che è il resto e proprio l'ultima cifra del numero (è quindi una peculiarità del modulo10)!
è quindi un giochetto che si fa con le variabili di tipo int... ma qui sorge spontanea una domanda: si puo fare tutto cio nei linguaggi di programmazione in cui non esistono diversi tipi di variabili?
astorcas
17-03-2008, 14:14
ok, vediamo se ho capito il meccanismo del modulo 10!
praticamente dividere per 10 significa spostare la virgola di un posto verso sinistra:
quindi:
12345/10 = 1234.5
ma cercando di memorizzare 1234.5 in una variabile di tipo int verrà memorizzato solo 1234
1234*10 = 12340
qui entra in gioco il modulo, da 12340 a 12345 mancano 5 unita, che è il resto e proprio l'ultima cifra del numero (è quindi una peculiarità del modulo10)!
è quindi un giochetto che si fa con le variabili di tipo int... ma qui sorge spontanea una domanda: si puo fare tutto cio nei linguaggi di programmazione in cui non esistono diversi tipi di variabili?
Non proprio.... funziona così.
1 Si lavora nel campo degli interi (cioè torniamo alla prima elementare :) )
Quanto fa 12345 divso 10?
fa 1234 col resto di 5.... (ecco il modulo)
la tua ultima domanda non si pone visto che la peculiarità del modulo è che la virgola non la vedi nemmeno col binocolo ;)
Non proprio.... funziona così.
1 Si lavora nel campo degli interi (cioè torniamo alla prima elementare :) )
Quanto fa 12345 divso 10?
fa 1234 col resto di 5.... (ecco il modulo)
la tua ultima domanda non si pone visto che la peculiarità del modulo è che la virgola non la vedi nemmeno col binocolo ;)
ti ringrazio per la spiegazione :)
quello che cerco di capire è in se la logica di perche questo giochetto col modulo 10 funziona, ma credo di esserci arrivato :D
ora mi buttero negli esercizi sui cicli... aspettatevi altre domande :muro:
banryu79
17-03-2008, 17:17
Un ultima cosa.
Spesso capita di dover controllare se un numero è pari o dispari.
In questo caso l'operatore modulo è estremamente utile, infatti basta che fai il modulo del numero che devi controllare, e ne guardi il valore: se il modulo è uguale a 0(zero) allora il numero è pari, altrimenti è dispari.
Ciao e buono studio ;)
Un ultima cosa.
Spesso capita di dover controllare se un numero è pari o dispari.
In questo caso l'operatore modulo è estremamente utile, infatti basta che fai il modulo del numero che devi controllare, e ne guardi il valore: se il modulo è uguale a 0(zero) allora il numero è pari, altrimenti è dispari.
Ciao e buono studio ;)
modulo 2
:D
banryu79
18-03-2008, 09:44
modulo 2
:D
:doh: (sì intendevo quello: fare il modulo 2 del numero da controllare. Pensa che mi sono reso conto in macchina mentre tornavo dal lavoro della svista, lol)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.