[RISOLTO][C] Esercizio facile, ma ho bisogno d'aiuto...

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Bio
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 322
Iscrizione: martedì 26 dicembre 2006, 12:24
Località: Molfetta (Ba)

[RISOLTO][C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da Bio »

Sono un aspirante programmatore in C, e sto avendo qualche problema col seguente esercizio:

"Una azienda vuole trasmettere dei dati sulla linea telefonica, ma tutti i suoi responsabili sono preoccupati dal fatto che i propri telefoni potrebberero essere spiati. Tutti i loro dati sono trasmessi come interi di quattro cifre. Vi hanno quindi chiesto di scrivere un programma che crittografi i loro dati cosicchè da trasmetterli in sicurezza. Il vostro programma dovrà  leggere un intero di quattro cifre e crittografarlo nel modo seguente: sostituite ogni cifra on il resto ottenuto dalla divisione di (la somma di quella cifra più 7) per 10. In seguito, scambiate la prima cifra con la terza, e la seconda con la quarta. Visualizzate quindi l'intero crittografato. Scrivete un programma che prenda in input un intero crittografato di quattro cifre e lo decifri, in modo da formare il numero originale."

Ecco i sorgenti che ho scritto, ma che a qunto pare non funzionano:

Programma crittografante (penso funzioni):  :)

Codice: Seleziona tutto

#include<stdio.h>
int num,c1,c2,c3,c4;
int cp,cp2;
main(){
printf("Inserisci un intero di quattro cifre: ");
scanf("%d",&num);
c4= num % 10;                             */ Assegno il valore di ogni singola cifra alle variabili cX */
c3=(num % 100 -c4)/10;
c2=(num % 1000 -c3)/100;
c1=(num % 10000 -c2)/1000;
printf("Le quattro cifre sono : %d %d %d %d.\n",c1,c2,c3,c4); */ Verifico che l'assegnazione precedente sia esatta */
c1=(c1+7)%10;         */Inizio la fase di criptazione*/
c2=(c2+7)%10;
c3=(c3+7)%10;
c4=(c4+7)%10;
printf("Le 4 cifre sono: %d %d %d %d.\n",c1,c2,c3,c4); */Verifico quali sono le 4 cifre criptate */
cp=c1;    */ Sostituisco la prima con la terza e la seconda con la quarta */
c1=c3;
c3=cp;
cp2=c2;
c2=c4;
c4=cp2;
printf("Il numero crittografato è: %d%d%d%d.\n",c1,c2,c3,c4);
return 0;
}
Mentre ecco il sorgente del programma di decifrazione (quello che non funziona):  >:(

Codice: Seleziona tutto

int num,c1,c2,c3,c4;
int cp,cp2;
int p1,p2,p3,p4;
int d1,d2,d3,d4;
main(){
printf("Inserisci un intero di quattro cifre: ");
scanf("%d",&num);
c4= num % 10;                         */Assegno alle variabili cX il valore di ogni singola cifra */
c3=(num % 100 -c4)/10;
c2=(num % 1000 -c3)/100;
c1=(num % 10000 -c2)/1000;
printf("Le quattro cifre sono : %d %d %d %d.\n",c1,c2,c3,c4);
cp=c1;    */Sostituisco la prima cifra con la terza e la seconda con la quarta (procedendo in modo inverso al programma precedente */
c1=c3;
c3=cp;
cp2=c2;
c2=c4;
c4=cp2;
printf("Le 4 cifre invertite sono: %d %d %d %d.\n",c1,c2,c3,c4); */Mi accerto che le cire siano state invertite */                  
p1=(c1+7)%10; */Ora calcolo il resto della divisione di cX e 10*/
p2=(c2+7)%10;
p3=(c3+7)%10;
p4=(c4+7)%10;
d1=(c1+7)/10;   */Ora calcolo il quoziente della divisione cX/10*/
d2=(c2+7)/10;
d3=(c3+7)/10;
d4=(c4+7)/10;
c1=((d1*10)+p1)-7; */Conoscendo il quoziente ed il resto, risalgo al dividendo */
c2=((d2*10)+p2)-7;
c3=((d3*10)+p3)-7;
c4=((d4*10)+p3)-7;
printf("Il numero decifrato è: %d%d%d%d.\n",c1,c2,c3,c4); */Visualizzo il numero decirato*/
return 0;
}
Per favore, sapreste dirmi cosa sbaglio???  ???

Ciao e grazie per un eventuale aiuto...
Ultima modifica di Bio il sabato 30 giugno 2007, 17:21, modificato 1 volta in totale.
Membro Della Lega Batteristi Autodidatti
Avatar utente
ubuntu_of_fortune
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 415
Iscrizione: venerdì 4 maggio 2007, 23:07

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da ubuntu_of_fortune »

Scusa ma il programma di decifrazione ripete le operazioni di crittazione o e' per fare una prova? perche' mi sembra che manchi una parte rispetto al primo listato ;)
Quella subito prima della scambio:

Codice: Seleziona tutto

c1=(c1+7)%10;
c2=(c2+7)%10;
c3=(c3+7)%10;
c4=(c4+7)%10;
printf("Le 4 cifre sono: %d %d %d %d.\n",c1,c2,c3,c4);
Ciao ha tt sn nuovo dl forum.... o appena installato leenux ma dv s trova 1 pulsante start????? 
~ Bimbominkia su forum di Linux
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da menelicte »

premetto che non ho capito il secondo programma,

ma se una cifra è criptata con:

Codice: Seleziona tutto

c1=(c1+7)%10
non basta decriptare con:

Codice: Seleziona tutto

c1=(c1+3)%10
?
"Tentare è il primo passo verso il fallimento" Homer J.
gforresu

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da gforresu »

un consiglio: inserisci i commenti...non si capisce nulla se non vedi il testo del problema.
Avatar utente
Bio
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 322
Iscrizione: martedì 26 dicembre 2006, 12:24
Località: Molfetta (Ba)

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da Bio »

Ok, fatto. Scusate se il tutto è un po' disordinato ma non ho molta dimestichezza con la programmazione, e soprattutto con la pulizia del codice sorgente...

Spero che possiate aiutarmi ora che ho inserito i commenti.. (yes)
Membro Della Lega Batteristi Autodidatti
SuperAxel
Prode Principiante
Messaggi: 113
Iscrizione: mercoledì 8 marzo 2006, 17:25
Località: Minturno

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da SuperAxel »

Credo che tu debba usare i puntatori per scambiare i dati e una funzione di supporto, perchè così come hai fatto perdi i valori di alcune variabili.
Avatar utente
Bio
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 322
Iscrizione: martedì 26 dicembre 2006, 12:24
Località: Molfetta (Ba)

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da Bio »

SuperAxel ha scritto: Credo che tu debba usare i puntatori per scambiare i dati e una funzione di supporto, perchè così come hai fatto perdi i valori di alcune variabili.
Non so con precisione cosa siano i puntatori, ma sul mio libro che sto studiando "C: corso completo di programmazione" scritto da Deiter, sono al capitolo dove si parla della funzione while, e l'esercizio che non riesco a svolgere si trova proprio alla fine di ciò, come esercizio per ricapitolare gli argomenti svolti finora. In poche parole, non devo utilizzare funzioni che non ho studiato (ho studiato praticamente tutte quelle di base, o quasi tutte, e il capitolo dei puntatori si trova più avanti, pertanto sono da escludere).

Comunque potrei sapere in modo maggiormente preciso dove c'è l'errore?  >:( >:( >:( >:(
Membro Della Lega Batteristi Autodidatti
gforresu

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da gforresu »

printf("Inserisci un intero di quattro cifre: ");
scanf("%d",&num);
c4= num % 10;                        /*Assegno alle variabili cX il valore di ogni singola cifra */
c3=(num % 100 -c4)/10;
c2=(num % 1000 -c3)/100;
c1=(num % 10000 -c2)/1000;
di questo non te ne fai nulla...  crea una matrice con le 4 cifre: cifre[4]. gli già inizializzare i valori , se vuoi: cifre[]={valori......}.
poi inizializzi a 0 il tuo flag (i) e con un ciclo di for (dove hai inizializzatofai inserire il valore richiesto nella matrice e hai già tutto fatto

Codice: Seleziona tutto

pintf("Inserisci un intero di quattro cifre: ");

for(i=0; i<4; i++)
scanf("%d", cifre[i]);
così le 4 cifre ti vengono pure belle attaccate come se fosse un unico numero..ma le puoi anche separare....

una cosa: i commenti si fanno così /*commento*/ e non così: */commento*/ mettili più che altro quando definisci le variabili
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da menelicte »

mah, l'utilizzo di un solo numero invece di un vettore di 4 interi ci può anche stare secondo me...

quello che non ho capito è come non ti funziona il secondo programma: non dà i risultati attesi o restituisce il numero senza decifrarlo o dà qualche errore?

nei primi due casi io controllerei la matematica alla base della decodifica, e non il codice vero e proprio
"Tentare è il primo passo verso il fallimento" Homer J.
gforresu

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da gforresu »

perde molto in velocità di esecuzione  ;)
Avatar utente
Bio
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 322
Iscrizione: martedì 26 dicembre 2006, 12:24
Località: Molfetta (Ba)

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da Bio »

gforr ha scritto: una cosa: i commenti si fanno così /*commento*/ e non così: */commento*/ mettili più che altro quando definisci le variabili
Si lo so...ho sbagliato a scrivere per la fretta. Riguardo la matrice, non so cosa sia poichè si trova a qualche capitolo più in la. Devo risolverlo utilizzando i comandi molto basilari.

Il secondo programma semplicemente non mi da i risultati attesi.

Esempio esecuzione primo programma:

Codice: Seleziona tutto

Inserisci un intero di quattro cifre: 1234
Le quattro cifre sono : 1 2 3 4.
Le 4 cifre crittografate sono: 8 9 0 1.
Il numero crittografato e': 0189.
Esempio di esecuzione secondo programma:

Codice: Seleziona tutto

Inserisci un intero di quattro cifre: 0189
Le quattro cifre sono : 0 1 8 9.
Le 4 cifre invertite sono: 8 9 0 1.
Il numero decifrato è: 8900.
Riguardo la velocità di esecuzione, siccome sono agli inizi come esperienza da programmatore, non do molta importanza. Per il momento mi esercito nella creazione di algoritmi ed esercizi come questo per imparare e fissare bene i concetti in mente.

Ciò che proprio vorrei capire, è dove sta l'errore nel codice del secondo programma???  >:(
Membro Della Lega Batteristi Autodidatti
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da menelicte »

la codifica crea queste associazioni (non considerando lo scambio di posizione):

Codice: Seleziona tutto

0    1    2     3     4     5     6     7     8     9
7    8    9  [1]0  [1]1  [1]2  [1]3  [1]4  [1]5  [1]6
non ho capito su che proprietà si basa la decodifica:
prendi il numero codificato e lo codifichi ulteriormente (p1, p2, p3, p4) ?

per esempio:
- hai 0;
- nella codifica diventa 7;
- nella decodifica p diventa 4;
- d diventa 1;
- il nuovo numero è ((1*10)+4)-7=14-7 = 7;
e non riottieni il numero originale ma il numero codificato

ribadisco:
menelicte ha scritto: ma se una cifra è criptata con:

Codice: Seleziona tutto

c1=(c1+7)%10
non basta decriptare con:

Codice: Seleziona tutto

c1=(c1+3)%10
?
e spiego:
( (x+7)%10 + 3 )%10 = (x+7+3)%10 = (x+10)%10 = x%10

comunque c'è un p3 di troppo in questo punto...

Codice: Seleziona tutto

c3=((d3*10)+p3)-7;
c4=((d4*10)+p3)-7;
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
Bio
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 322
Iscrizione: martedì 26 dicembre 2006, 12:24
Località: Molfetta (Ba)

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da Bio »

Mi sa che ci stiamo comfondendo un pò.
Nel primo programma, quello di cifrazione, l'algoritmo per effettuare la cifratura è:

c1=(c1+7)%10

Nel secondo, ho trovato il seguente algoritmo di decifratura che dovrebbe funzionare:

c1=((d1*10)+p1)-7

Dove:
c1=cifra da trovare;
d1=quoziente dell'operazione c1/10;
p1=resto dell'operazione c1/10;

Sapendo il quoziente ed il resto, posso così calcolarmi il numero iniziale.

Esempio:

Codice: Seleziona tutto


12/10=1 col resto di 2

quindi d1=1e p1=2;

numero iniziale=((d1*10)+p1)= 10+2= 12.

Mi seguite?

Ho applicato l'algoritmo nel secondo programma, e ribadisco che dx sono i vari quozienti mentre px i diversi resti.
menelicte ha scritto: comunque c'è un p3 di troppo in questo punto...

Codice: Seleziona tutto

c3=((d3*10)+p3)-7;
c4=((d4*10)+p3)-7;
Ho corretto l'errore, ma non ottengo ugualmente i risultati sperati... >:(
Membro Della Lega Batteristi Autodidatti
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da menelicte »

ho capito...
tu usi c1 come se fosse il numero decodificato, ma inizialmente è il numero codificato

se tu applichi quell'algoritmo su un numero x non puoi che riottenere lo stesso numero x....

in quell'algoritmo di decodifica tu fai una ricodifica sul numero in input c1 e la salvi in p1
poi decodifichi non c1, ma il numero p1, ritornando praticamente a copiare in c1 il valore che conteneva prima c1 stesso...

EDIT: l'operazione inversa di y=(x+7)%10 dovrebbe essere x=(y-7)%10, ma se y     x=(y+3)%10, essendo la funzione % antisimmetrica e periodica a tratti (in questo caso con periodo 10) nei due domini (positivo e negativo)
Ultima modifica di menelicte il sabato 30 giugno 2007, 15:23, modificato 1 volta in totale.
"Tentare è il primo passo verso il fallimento" Homer J.
gforresu

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da gforresu »

mi è sfuggita una cosa:
se tu ottieni Dx devi sapere il risultato di (Cx+7)/10 altrimenti hai che può essere 0 oppure 1. ma tu come fai a conoscere Dx=(Cx+7) se sai solo il resto ?
non ho capito questa cosa..mi è sfuggita  :-X
Avatar utente
Bio
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 322
Iscrizione: martedì 26 dicembre 2006, 12:24
Località: Molfetta (Ba)

Re: [C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da Bio »

RISOLTO!!!! Ho letto bene con calma tutto il codice, e in effetti la mia difficoltà era trovare l'algoritmo di decriptazione, che successivamente Menelicte mi ha fatto comprendere. Ho semplicemente inserito l'algoritmo:

c1=(c1+3)%10

al posto del mio disordine tra resti e quozienti.....
Ringrazio tutti coloro che mi hanno aiutato...graziEEE!!! Era da settimane che non riuscivo a trovare l'errore e stavo letteralmente impazzendo...

Beh, allora ci sentiamo alla prossima...

Bye Bye..  ;D (b2b)

Ps: semplice curiosità: secondo voi sono un pò piccolo (ho 15 anni) per entrare nel mondo della programmazione?
Membro Della Lega Batteristi Autodidatti
gforresu

Re: [RISOLTO][C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da gforresu »

Ps: semplice curiosità: secondo voi sono un pò piccolo (ho 15 anni) per entrare nel mondo della programmazione?
no assolutamente...non sei mica scemo! io ho iniziato a 14 con l'assembly per x86
Avatar utente
Bio
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 322
Iscrizione: martedì 26 dicembre 2006, 12:24
Località: Molfetta (Ba)

Re: [RISOLTO][C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da Bio »

Ma ho fatto male a iniziare col C?
Membro Della Lega Batteristi Autodidatti
gforresu

Re: [RISOLTO][C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da gforresu »

no..secondo me
Avatar utente
Bio
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 322
Iscrizione: martedì 26 dicembre 2006, 12:24
Località: Molfetta (Ba)

Re: [RISOLTO][C] Esercizio facile, ma ho bisogno d'aiuto...

Messaggio da Bio »

Ok.  ;D
Allora grazie ancora per l'aiuto.  (good)

Ciao!!!  (b2b)
Membro Della Lega Batteristi Autodidatti
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti