Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-03-2008, 10:35   #1
*=Jak=*
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
*=Jak=* è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 11:19   #2
astorcas
Senior Member
 
L'Avatar di astorcas
 
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.
astorcas è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 11:49   #3
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 12:24   #4
*=Jak=*
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?
*=Jak=* è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 12:32   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 12:40   #6
*=Jak=*
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!
*=Jak=* è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 12:57   #7
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 13:12   #8
*=Jak=*
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.
*=Jak=* è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 13:21   #9
astorcas
Senior Member
 
L'Avatar di astorcas
 
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
astorcas è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 13:23   #10
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 13:31   #11
*=Jak=*
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;
}
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...
*=Jak=* è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 13:34   #12
astorcas
Senior Member
 
L'Avatar di astorcas
 
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)
astorcas è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 13:42   #13
*=Jak=*
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!
*=Jak=* è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 13:44   #14
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da *=Jak=* Guarda i messaggi
... 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).
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 13:52   #15
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
In haskell:
Codice:
import Data.Char
numberToList = map digitToInt . show
Scusate...non ho resistito...
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 14:08   #16
*=Jak=*
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.
*=Jak=* è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 14:14   #17
astorcas
Senior Member
 
L'Avatar di astorcas
 
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
Quote:
Originariamente inviato da *=Jak=* Guarda i messaggi
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
astorcas è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 14:35   #18
*=Jak=*
Junior Member
 
Iscritto dal: Nov 2006
Messaggi: 17
Quote:
Originariamente inviato da astorcas Guarda i messaggi
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

ora mi buttero negli esercizi sui cicli... aspettatevi altre domande
*=Jak=* è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 17:17   #19
banryu79
Senior Member
 
L'Avatar di banryu79
 
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
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2008, 17:21   #20
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
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
__________________
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
AMD Ryzen 5 5500F: fino al 16% di presta...
L'ecosistema partner di Microsoft cresce...
Oracle registra un boom nella divisione ...
Amazon Prime Video sfida TikTok con le n...
L'uscita di Rayman Legends Retold &egrav...
Dazio UE sui pacchi extra UE, in Italia ...
La nuova lavatrice smart di Xiaomi ha tr...
Hai una PSP nel cassetto? Questo nuovo p...
Oracle presenta Java 27 con diverse novi...
Il microscopio dell'EPFL vede più...
Volvo avvia la produzione dei nuovi cami...
26 offerte Amazon da non perdere, da iPh...
Google Pixel 10 e 10a a 619€ e 399€: sco...
iPhone 18 Pro e 18 Pro Max prenotabili s...
Anche Sam Altman ha paura: ecco i due sc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:31.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v