[Risolto] [c] contare le cifre di un int utilizzando scanf e operatore modulo

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

[Risolto] [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

salve a tutti ho un esercizio che mi chiede di prendere in input un numero intero di 4 cifre e di sostituire ogni cifra del numero con  (cifra + 7) % 10,
volevo sapere
1) se è possibile contare le cifre utilizzando scanf
2)devo scrivere un altro programma che dal numero "crittografato" passa a quello originale quindi come è la formula inversa:
(cifra - 7) ??? (quindi come si ricava il modulo al contrario insomma)??

il codice che ho scritto fin ora è questo:

Codice: Seleziona tutto

#include <stdio.h>

int main(){

	int number; // numero in entrata
	int i; // indice del vettore
	int cifre[4]; // vettore che salva le cifre di number
	int cifre_critt[4]; // cifre crittografate
	int tmp; // variabile temporanea per invertire il vettore
	int state = 1;

	while(state){
		printf("Inserire un numero di 4 cifre: ");
		scanf("%d", &number);
		if(number > 999 && number < 9999){// qua ho sbagliato il controllo solo dopo ho pensato che l'input poteva 
			state = 0;                              //  essere per esempio 0239 
		}
		else{
			printf("in numero inserito non è di 4 cifre\n");
		}
	}

	for(i = 0; i < 4; i++){
		cifre[i] = number % 10;
		cifre_critt[i] = (cifre[i] + 7) % 10;
		number /= 10;
	}

	tmp = cifre_critt[0];
	cifre_critt[0] = cifre_critt[2];
	cifre_critt[2] = tmp;
	tmp = cifre_critt[1];
	cifre_critt[1] = cifre_critt[3];
	cifre_critt[3] = tmp;

	for(i = 0; i < 4; ++i){
		printf("%d", cifre_critt[i]);
	}
 	printf("\n");
	
	return 0;
}
	
Ultima modifica di Anonymous il lunedì 7 giugno 2010, 20:39, modificato 1 volta in totale.
Avatar utente
THeK3nger
Prode Principiante
Messaggi: 228
Iscrizione: domenica 30 settembre 2007, 18:00
Desktop: Unity
Distribuzione: Ubuntu 12.04 LTS (64bit)
Località: Roma
Contatti:

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da THeK3nger »

Non ti conviene convertire l'intero numero, dividerlo in cifre, e poi rimetterlo a stringa.

È più efficiente utilizzare il numero a cifra, dividere i caratteri (sono già divisi essendo un array), convertire i singoli caratteri in cifre, sommare 7 e poi ricostruire la stringa.
SlashCode 2.0 -- Programmazione, Linux e AI
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da Zoff »

Devi fare la stessa cosa sottraendo invece che sommando...
THeK3nger ha scritto: Non ti conviene convertire l'intero numero, dividerlo in cifre, e poi rimetterlo a stringa.

È più efficiente utilizzare il numero a cifra, dividere i caratteri (sono già divisi essendo un array), convertire i singoli caratteri in cifre, sommare 7 e poi ricostruire la stringa.
Non sono d'accordo... Inoltre è contro le specifiche, visto che viene cheisto espresamente l'uso dell'operatore modulo...
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

cioè prendo in input l' array con scanf , ma poi come conto le cifre se immetto un numero con più cifre del vettore va in overflow

quindi la formula rimane quasi invariata ci vuole solo la sottrazione
Ultima modifica di Anonymous il lunedì 7 giugno 2010, 18:25, modificato 1 volta in totale.
margiane
Prode Principiante
Messaggi: 5
Iscrizione: lunedì 7 giugno 2010, 17:18

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da margiane »

non puoi usare un array di caratteri??
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

mi rimane solo il problema di fare il controllo sul numero di cifre che number contiene
idee??
non devo utilizzare scanf??
Avatar utente
THeK3nger
Prode Principiante
Messaggi: 228
Iscrizione: domenica 30 settembre 2007, 18:00
Desktop: Unity
Distribuzione: Ubuntu 12.04 LTS (64bit)
Località: Roma
Contatti:

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da THeK3nger »

Zoff ha scritto: Devi fare la stessa cosa sottraendo invece che sommando...
THeK3nger ha scritto: Non ti conviene convertire l'intero numero, dividerlo in cifre, e poi rimetterlo a stringa.

È più efficiente utilizzare il numero a cifra, dividere i caratteri (sono già divisi essendo un array), convertire i singoli caratteri in cifre, sommare 7 e poi ricostruire la stringa.
Non sono d'accordo... Inoltre è contro le specifiche, visto che viene cheisto espresamente l'uso dell'operatore modulo...
E perché la mia soluzione non lo usa? Cambia solo il modo con cui sono divise le cifre.

Lui converte il numerone in un intero di n cifre. Poi divide le n cifre con un ciclo. Fa la sua somma ( (i+7) % 10 ) e poi riassembla il numero per dare il numero finale.

Io suggerivo di usare l'array di caratteri che automaticamente di restituisce scanf. Convertire le singole cifre in interi.  Fa la sua somma ( (i+7) % 10 ) e poi riassembla il suo numero.

Il cuore del problema è lo stesso. Evita solo un ciclo inutile per spezzare il numero in cifre.
SlashCode 2.0 -- Programmazione, Linux e AI
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

io uso il numerone perche se con scanf inserisco un numero con più di 4 cifre vado in overflow o no?? volevo fare un controllo sulle cifre prima di salvarle nell' array
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da Zoff »

Boh anche senza array si fa benissimo:

Encoder:

Codice: Seleziona tutto

#include <stdio.h>

int main()
{
    int decoded, encoded=0, encoded_rev = 0;
    printf("Inserisci un numero di 4 cifre: ");
    scanf("%d",&decoded);
    while(decoded>0){
        encoded_rev = encoded_rev*10 + ((decoded%10)+7)%10;
        decoded /= 10;
    }
    //Ri-inverto le cifre
    while(encoded_rev>0){
        encoded = encoded*10 + encoded_rev%10;
        encoded_rev/=10;
    }
    printf("Encoded: %d\n",encoded);
    return 0;
}
Decoder:

Codice: Seleziona tutto

#include <stdio.h>

int main()
{
    int decoded, encoded=0, decoded_rev = 0;
    printf("Inserisci un numero di 4 cifre: ");
    scanf("%d",&encoded);
    while(encoded>0){
        decoded_rev = decoded_rev*10 + ((encoded%10)-7<0?(encoded%10)+3:(encoded%10)-7);
        encoded /= 10;
    }
    //Ri-inverto le cifre
    while(decoded_rev>0){
        decoded = decoded*10 + decoded_rev%10;
        decoded_rev/=10;
    }
    printf("Encoded: %d\n",decoded);
    return 0;
}
I controlli per le 4 cifre si devono aggiungere ovviamente...
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
THeK3nger
Prode Principiante
Messaggi: 228
Iscrizione: domenica 30 settembre 2007, 18:00
Desktop: Unity
Distribuzione: Ubuntu 12.04 LTS (64bit)
Località: Roma
Contatti:

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da THeK3nger »

Scanf non esegue nessun controllo. Quindi o crei un buffer con parecchie più cifre o usi altri metodi.

Ad esempio semplicemente la read:

Codice: Seleziona tutto

ssize_t read(int fd, void *buf, size_t count);
Dove al posto di count metti 4 (così sei sicuro che legge solamente 4 caratteri).

EDIT: o fai senza array (vedi su) e fine.
Ultima modifica di THeK3nger il lunedì 7 giugno 2010, 18:46, modificato 1 volta in totale.
SlashCode 2.0 -- Programmazione, Linux e AI
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

forse mi è sfuggita una cosa uso gli array anche perche devo invertire la prima cifra con la terza e la seconda con la quarta si può fare anche senza array??
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da Zoff »

ienaplinsky ha scritto: forse mi è sfuggita una cosa uso gli array anche perche devo invertire la prima cifra con la terza e la seconda con la quarta si può fare anche senza array??
Con dei giochetti si ma a quel punto conviene l'array...
E una volta che usi l'array tanto vale leggere un carattere alla volta...
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

ok ho capito uso getchar e vi faccio sapere
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

ragazzi l' ho fatto così, il controllo comunque non mi è riuscito, intendo tipo un messaggio di errore in caso di input non valido che ne pensate suggerimenti??

Codice: Seleziona tutto

#include <stdio.h>

int main(){
	
	
	int cifre_in[100]; // possibili cifre in input
	int cifre_critt[4]; // cifre crittografate
	int i = 0; // indice
	int c; // carattere in entrata

	printf("Inserire un numero di 4 cifre: "); 	
	while(( c = getchar()) != '\n'){	
		if( c > '0' && c < '9'){
			cifre_in[i++] = c;
		}
	}
	
	for(i = 0; i < 4; i++){
		cifre_critt[i] = (cifre_in[i] + 7) % 10;
	}
	
	c = cifre_critt[0];
	cifre_critt[0] = cifre_critt[2];
	cifre_critt[2] = c;
	c = cifre_critt[1];
	cifre_critt[1] = cifre_critt[3];
	cifre_critt[3] = c;
	
	for(i = 0; i < 4; ++i){
		printf("%d", cifre_critt[i]);
	}
	printf("\n");
	
	return 0;
}	 
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da Zoff »

Così risolvi gli errori e mostri messaggi di errore in caso di input sbagliato:

Codice: Seleziona tutto

    while(( c = getchar()) != '\n'){    
        if( c >= '0' && c <= '9'){    //<<<----- Nota gli =
            cifre_in[i++] = c-'0';    //<<<----- Nota il -'0'
        }else{
            printf("Hai inserito un numero non valido!\n");
            return 1;
        }
        if(i>4){
            printf("Hai inserito troppe cifre!\n");
            return 1;
        }
    }
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

grazie zoff ho anche aggiunto un altro else

Codice: Seleziona tutto

if(i > 4 ){
   printf("Hai inserito troppe cifre\n");
   return 1;
}
else{
   printf(" non hai inserito 4 cifre!\n");
   return 1;
}
cosi se si immetono meno di 4 cifre stampa un altro messaggio

grazie a tutti ragazzi metto risolto
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Risolto] [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da Zoff »

ienaplinsky ha scritto: grazie zoff ho anche aggiunto un altro else

Codice: Seleziona tutto

if(i > 4 ){
   printf("Hai inserito troppe cifre\n");
   return 1;
}
else{
   printf(" non hai inserito 4 cifre!\n");
   return 1;
}
cosi se si immetono meno di 4 cifre stampa un altro messaggio

grazie a tutti ragazzi metto risolto
Non penso che quell'else funzioni... Secondo me ti da sempre errore...
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [Risolto] [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

hai ragione :-[ :-[ va be dai va bene cosi
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Risolto] [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da Zoff »

Quelo controllo però lo puoi fare subito dopo al ciclo while:

Codice: Seleziona tutto

if(i<4){
   printf(" non hai inserito 4 cifre!\n");
   return 1;
}
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [Risolto] [c] contare le cifre di un int utilizzando scanf e operatore modulo

Messaggio da ienaplinsky »

fatto!! grande, grazie ancora
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti