|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 17
|
[C] scomporre un numero nelle sue cifre singole
salve a tutti!
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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
personalmente userei un for/while con l'operazione modulo e divisione....
Ultima modifica di astorcas : 17-03-2008 alle 11:22. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Puoi pensare di stampare i 5 caratteri della stringa...
Tutto in un'unica printf ben formattata
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 17
|
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? |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 17
|
le stringhe? no no...
cosa intendi per cucinare la singola cifra? e che non capisco perche il programma termina subito dopo che chiede l'input... almeno dovrebbe restituire qualcosa, anche se sbagliato! |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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 %
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 17
|
non riesco a seguirti... scusa ma ho appena iniziato a programmare
un esempio? divisore*10 è l'incremento... Ultima modifica di *=Jak=* : 17-03-2008 alle 13:18. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
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 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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?)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 17
|
e appunto non so che operazione devo fare!
comunque ho risolto cosi: Codice:
#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;
}
ora... perche modulo 10 da come risultato proprio la cifra cercata? allora quello che non ho capito è l'operazione matematica in se mi sa... |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
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) |
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 17
|
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! |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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).
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
In haskell:
Codice:
import Data.Char numberToList = map digitToInt . show
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#16 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 17
|
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? Ultima modifica di *=Jak=* : 17-03-2008 alle 14:13. |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
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 |
|
|
|
|
|
|
#18 | |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 17
|
Quote:
quello che cerco di capire è in se la logica di perche questo giochetto col modulo 10 funziona, ma credo di esserci arrivato ora mi buttero negli esercizi sui cicli... aspettatevi altre domande |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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 |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:31.




















