[C] Scindere il numero nelle sue singole cifre

Stato
Discussione chiusa ad ulteriori risposte.

jolly

Utente Attivo
110
4
Salve dovrei scindere un numero nelle sue singole cifre ( utilizzare gli operatori di divisione e di resto ) per poi decidere se esso è un numero palindromo,potete farmi un esempio di come scindere un numero?grazie
 

mark_1

Utente Èlite
1,514
167
CPU
AMD AM3 Phenom II X6 1055t
Scheda Madre
Asus Crosshair IV formula
HDD
ssd Corsair F80 + WD caviar green 500gb
RAM
G.Skill eco 1600mhz cas7
GPU
ASUS Radeon EAH5850 Cu Core/2DIS/1GD5/A
Audio
SupremeFX X-Fi
Monitor
SyncMaster BX2235
PSU
CoolerMaster M620 620W
Case
Cooler Master Storm Scout
OS
Archlinux & Windows7
ti fai la divisione intera "/" e poi salvi il risultato in un array.... credo sia l'unico modo, o comunque il piu' immediato
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Ecco il ragionamento:
Hai un numero tipo 3648. Basta dividerlo per 1000 e ottieni 3 dato che la variabile è di tipo int. Sottrai 3000 e ti rimane 648 che dividi per 100 per ottenere 6 e così via fino all'ultima cifra!
 

jolly

Utente Attivo
110
4
ciao Cawletto,sempre gentilissimo...partiamo dal presupposto che non si sa da quante cifre è formato il numero,io ho fatto un piccolo ragionamento ma non va, ecco:
Codice:
#include <stdio.h>

/* la funzione main è il punto d'inizio dell'esecuzione del programa */
int main( void )
{
	int n , r; /* dichiaro le variabili */
	
	printf( "Inserisci un numero: " ); /* sollecita l'inserimento */
	scanf( "%d" , &n ); /* salva il numero nella variabile n */
	
	while (n > 10 ) { /* inizio del ciclo while,finche n è maggiore di 10 */
		
		r = n % 10; /* r è uguale al resto della divisione di n diviso 10 */

		n = n / 10; /* penso che l'errore sia qua,io volevo fare in modo che n assumi un nuovo valore in modo che la condizione while diventi falsa */
	
	}
	
	printf( "%d\n" , r ); /* visualizza la variabile r */
			
	
	return 0; /* indica che il programma è terminato con successo */
 
} /* fine della funzione main */

Quando eseguo il codice,viene visualizzata solo la seconda cifra cioè se digito in input:254879 esce 5.
Bisogna dichiarare qualche altra variabile?
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Fai così:
Codice:
#include <stdio.h>


/* la funzione main è il punto d'inizio dell'esecuzione del programa */
int main( void )
{
    int n , r; /* dichiaro le variabili */


    printf( "Inserisci un numero: " ); /* sollecita l'inserimento */
    scanf( "%d" , &n ); /* salva il numero nella variabile n */


    int x=10;


    while(n>=x)
    {
        x*=10; // è uguale a x = x*10;
    }
        x /= 10;   
    printf("ord di grandezza : %d\n" , x );


    // Il while di sopra non è proprio il massimo :S


    int cifra=0;


    while(x>=1)
    {
        cifra = n/x;
        printf( "%d\n" , cifra ); /* visualizza la variabile cifra */
        n -= cifra*x;
        x /= 10;
    }




    return 0; /* indica che il programma è terminato con successo */


} /* fine della funzione main */
Con il primo while mi trovo l'ordine di grandezza (se il num è 3261 l'ord di grandezza è 3000);
Con il secondo while mi trovo tutte le cifre:
3261/1000 = 3;
3261 - 3*1000 = 261;
261 /100 = 2
ecc..
Scusa ma stasera non ho avuto molto tempo infatti il primo while non mi piace :nunu: .. comunque l'importante è ke hai capito il ragionamento.. :sisi:
 
Ultima modifica:

jolly

Utente Attivo
110
4
grazie,ma purtroppo non ho capito il ragionamento,con questi ultimi esercizi sto trovando un po di difficoltà :(.
Non capisco come si ottiene l'ordine di grandezza:
Codice:
int x=10;


    while(n>=x)
    {
        x*=10; // è uguale a x = x*10;
    }
        x /= 10;   
    printf("ord di grandezza : %d\n" , x );
Allora,
Dichiariamo e inizializziamo la variabile x a 10;

Finchè n è maggiore o uguale a 10;
x è uguale a x * 10 cioè 10 è uguale a 10 * 10;

x è uguale a x / 10 cioè nel passaggio di sopra lo moltiplichiamo e ora dividiamo,quindi dovremmo essere punto a capo,il fatto è che non capisco perchè funziona.
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Codice:
  while(n>=x)     {         x*=10; // è uguale a x = x*10;     }
x si moltiplica per 10 fino a quando non si raggiuge il numero appena superiore.
Se il numero è 500 il risultato sarà il numero appena superiore ovvero 1000.

Ma noi non vogliamo 1000 ma 100 e allora dividiamo semplicemente per 10.
Codice:
x /= 10;
Ma come ti ho già detto questo while l'ho scitto un pò con i piedi dato l'orario e magari potevi ottenere lo stesso con un procedimento migliore..
 
  • Mi piace
Reazioni: jolly

e_ale92

Utente Èlite
17,011
5,013
CPU
Intel® Core™ i7-920 Processor - @3.33GHz
Dissipatore
Stock Intel
Scheda Madre
Asus P6T - socket LGA 1366
HDD
Samsung 830 128GB + Samsung Spinpoint F4 320GB + Seagate Barracuda 1,5 TB
RAM
Corsair DDR3 1333MHz CL9 XMS3 DHX (3x2GB) - @1674MHz
GPU
MSI R6970 Lightning
Audio
Realtek ALC 1200
Monitor
HP 2310i
PSU
XFX Pro 750W Core Edition
Case
Cooler Master HAF 922
Periferiche
R.A.T. 5 Cyborg Mad Catz - Keycool KC84
OS
Arch Linux + Windows 10 Pro
tieni presente che il numero 3456 verrà diviso e tu a stampa avrai
6
5
4
3

se poi vuoi ristamparlo come 3 4 5 6 dovrai usare strutture più complicate :sisi:

---------- Post added at 19:27 ---------- Previous post was at 19:12 ----------

studio da un mese il C e quindi se sparo cavolate ditemelo.

potresti farlo così

main() {


leggi n


se n >= 10


ciclo fin quando n > 0
r = n % 10;
x = n - (r * 10);
stampa x
n = r;




altrimenti stampa n


}


cmq ora lo scrivo in C e se funziona posto altrimenti vedo cosa non va :lol:


---------- Post added at 19:54 ---------- Previous post was at 19:52 ----------

Codice:
/*
  Name: Scomponimento in singole cifre
  Copyright: nessuno
  Author: e_ale92
  Date: 11/11/11 19.38
  Description: Il programma scinde un numero nelle sue singole cifre
*/


#include <stdio.h>
#include <stdlib.h>
main() {
       int n,r,x;
       printf("Il programma scinde un numero nelle sue singole cifre! \n");
       printf("\n\n\n");
       printf("Inserisci un numero intero positivo: ");
       scanf("%d", &n);
       printf("\n");
       if (n >= 10) {
             while (n > 10) {
                   r = n % 10;
                   x = (n - (r*10) );
                   printf("Singola cifra : %d", x);
                   printf("\n");  
                   n = r;
                   }                             
             }
       else if ( (n<10) &&  (n>=0) ) {
            printf("La singola cifra e': %d", n);
            printf("\n");      
            }
       else if (n < 0) {
            printf("Hai inserito un numero negativo! \n");
            printf("\n"); 
            }
       system("pause");
}

il programma fatto così funziona in parte, nel senso che se metto un numero > 10 (ad esempio 3456) mi fa un ciclo infinito.
l'algoritmo dovrebbe essere quello, la cosa che sbaglio è la condizione del while, credo :look:
 
Ultima modifica:

jolly

Utente Attivo
110
4
Grazie mille Cawletto ora ho capito :) ti volevo fare i miei complimenti sei sei veramente in gamba e riesci a spiegare il tutto in modo semplice e veloce.

Una piccola parentesi,da come ho capito calcolare l'ordine di grandezza ci permette di trovare la x,che serve in seguito per ottenere le singole cifre ma...per scindere un numero nelle sue singole cifre,bisogna per forza calcolare prima l'ordine di grandezza o ci sono altri metodi?

Bhe ora che ho capito questo concetto non mi resta che verificare se il numero inserito è palindromo o meno,spero di riuscirci da solo :)

Anche leggendo il libro,e capendo i concetti a volte ci sono degli esercizi che per me sono un po difficili da risolvere e capita che dopo un po che non trovo la soluzione,o peggio ancora che non riesco a capire un ragionamento o pezzo di codice,mi blocco e mi demoralizzo e penso che programmare non è cosa per me,ma grazie al tuo aiuto e quello di tutto il forum che lo trovo fantastico,con persone molto preparate in materia e gentili mi date la forza di continuare e andare avanti con lo studio.
Spero di farcela anche se so che il peggio deve ancora venire :) ma io vado avanti con il mio motto "Niente è impossibile".
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Beh quello è il metodo che mi è venuto in mente appena ho letto il problema..poi ovviamente ci saranno altri metodi..:)
P.s comunque l'importante è allenarsi!
 

jolly

Utente Attivo
110
4
Finalmente ci sono riuscito a scrivere un codice che almeno funziona :) anche se penso che il procedimento non è quello ottimale.
Lo scopo dell'esercizio era quello di verificare se un numero è palindromo,quindi scindere un intero di 5 cifre,il procedimento per scindere un intero visto in precedenza era con un ciclo while,però ci sta un problema,perchè i valori delle singole cifre vengono salvati in una sola variabile ovvero cifra,e quindi non posso risalire ad ogni singolo numero,quindi la prima cosa che mi è venuta in mente è di usare dei cicli if.
Il programma funziona,ma credo che ci sono troppe righe di codice. Ecco:
Codice:
#include <stdio.h>

/* la funzione main è il punto di inizio dell'esecuzione del programma */
int main( void ) 
{
	/* dichiarazione e inizializzazione delle variabili */
	int cifra_a = 0;
	int cifra_b = 0;
	int cifra_c = 0;
	int cifra_d = 0;
	int cifra_e = 0;
	int x = 10000;	
	int n;
	
	printf( "Inserisci un intero di cinque cifre: " ); /* sollecita l'inserimento */
	scanf( "%d" , &n ); /* memorizza il numero inserito dall'utente nella variabile n */

	/* Scindere il valore di n in singole cifre */

	if ( x >= 10000 ) { /* inizio del ciclo if */
		
		cifra_a = n / x; /* cifra_a è uguale a n diviso x */
		
		printf( "%d\t" , cifra_a ); /* stampa la variabile cifra_a */

		n -= cifra_a * x; /* ora aggiorniamo il valore di n,sottraendo al valore di n iniziale il prodotto di cifra_a che abbiamo calcolato sopra e il valore di x */
	
		x /= 10; /* x è uguale a x diviso 10,questo è il nuovo valore di x */
	} /* fine del ciclo if */

	if ( x >= 1000 ) {
		
		cifra_b = n / x;
		
		printf( "%d\t" , cifra_b );

		n -= cifra_b * x;
	
		x /= 10;
	}

	if ( x >= 100 ) {
		
		cifra_c = n / x;
		
		printf( "%d\t" , cifra_c );

		n -= cifra_c * x;
	
		x /= 10;
	}

	if ( x >= 10 ) {
		
		cifra_d = n / x;
		
		printf( "%d\t" , cifra_d );

		n -= cifra_d * x;
	
		x /= 10;
	}

	if ( x >= 1 ) {
		
		cifra_e = n / x;
		
		printf( "%d\n" , cifra_e );

		n -= cifra_e * x;
	
		x /= 10;
	}

	/* Verificare se n è un numero palindromo */

	if ( cifra_a == cifra_e && cifra_b == cifra_d ) {
		
		printf( "Il numero è palindormo\n" );
	}
	
	else {
		printf( "Non è palindromo\n" );
	}
	
	return 0; /* indica che il programma è terminato con successo */

} /* fine della funzione main */

Qualche suggerimento o modifica oppure va bene cosi ?
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Beh si c'è un pò troppo codice..Comunque prima di scrivere un programma ti consiglio ti pensare prima a quello che devi fare per risolvere il problema magari aiutandoti con carta e penna che non è mai una cattiva abitudine, anzi..
E se io voglio sapere se è palindromo una parola di 7 cifre ??
E se voglio sapere se è palindroma la frase "Ai lati d'italia"?
Io ti consiglio di fare una bella cosa..cancella tutto e riparti da capo seguendo il mio suggerimento iniziale..perchè devi programmare sapendo quello che stai facendo e non andando a tentativi perchè alla fine il problema come avrai notato non è nella programmazione in se ma nella logica del procedimento..
 

e_ale92

Utente Èlite
17,011
5,013
CPU
Intel® Core™ i7-920 Processor - @3.33GHz
Dissipatore
Stock Intel
Scheda Madre
Asus P6T - socket LGA 1366
HDD
Samsung 830 128GB + Samsung Spinpoint F4 320GB + Seagate Barracuda 1,5 TB
RAM
Corsair DDR3 1333MHz CL9 XMS3 DHX (3x2GB) - @1674MHz
GPU
MSI R6970 Lightning
Audio
Realtek ALC 1200
Monitor
HP 2310i
PSU
XFX Pro 750W Core Edition
Case
Cooler Master HAF 922
Periferiche
R.A.T. 5 Cyborg Mad Catz - Keycool KC84
OS
Arch Linux + Windows 10 Pro
esatto, ti consiglio di pensare all'algoritmo magari scrivendolo come ho fatto i nel mio post, poi passare al diagramma di flusso e solo dopo aver delineato il programma su carta e in mente tradurlo in codice C.

cmq chiedo a cawletto se la soluzione proposta da me andrebbe bene... non ho studiato il codice di jolly, però mi sembra abbastanza lungo e complicato...
nel mio andrebbe solo aggiunta la parte del palindromo...
che dici??
 

jolly

Utente Attivo
110
4
Infatti immaginavo che non fosse il metodo corretto,comunque è l'esercizio che dici di inserire 5 numeri interi.
Ma infatti,io ho preso spunto dal tuo suggerimento,ma nel tuo esempio come faccio a sapere il valore di ogni singola cifra,se salviamo tutto in una sola variabile "cifra" ?
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili