PDA

View Full Version : [C]sistema per determinare codice segreto


Vincenzoflaminio
22-02-2011, 17:39
Salve devo scrivere un programma che simuli un sistema per determinare un codice segreto. Il programmatore de nisce un codice di 5 lettere dell'alfabeto e in maniera casuale simula dei codici fi no a che non trova quello esatto. Visualizzare il numero di prove e ffettuate.

int confronto_stringhe (char s[],char t[])
{
int i;
for (i=0; i<5 ; i++){
if (s[i] != t[i])
return 0;
else
return 1;
}

}
int main()
{
char codice[6];
char pass[5];
char alfabeto[]={'a','b','c','d','e','f','g','h','i','l','m','n','o','p','q','r','s','t','u','v','z'};
int lungalfabeto=21;
int i,nc;
printf("inserisci il codice a tastiera di 5 caratteri e termina la stringa \n");
gets(codice);

for (i=0;i<5;i++)
{
nc= rand()%lungalfabeto;
pass[i]=alfabeto[nc];
}
confronto_stringhe(codice,pass);


system("PAUSE");
return 0;
}

Qui sopra ho scritto la parte che determina un codice casuale di 5 lettere prese dall'alfabeto , e la function per il confronto stringhe .
Non mi è chiaro però come far riprovare a determinare 5 lettere casuali quando non sono ugali.

malocchio
22-02-2011, 21:40
Io invece non ho capito cosa non ti è chiaro :read:

clockover
23-02-2011, 00:14
Una cosa posso dirtela al volo... Non funzionerà mai.. C'è un erroraccio nella funzione di confronto delle stringhe! Inoltre nella funzione main il valore di ritorno della funzione di confronto non lo utilizzi!

bobbytre
23-02-2011, 19:42
se sai a priori che il codice è di 5 lettere

puoi fare banalmente cosi:


int i,j,k,l,m;
char *s1;
chat *s2;
int counter = 0;

// ... fai quello che devi fare prima ...

// cerca il codice
for(i='a';i<'z';i++)
{
for(j='a';j<'z';j++)
{
for(k='a';k<'z';k++)
{
for(l='a';l<'z';l++)
{
for(m='a';m<'z';m++)
{
sprintf(s1,"%c%c%c%c%c",i,j,k,l,m);
if( ! strcmp(s1,s2) )
{
printf("Trovato !!!");
printf("Tentativi : %d\n",counter);
exit();
}
counter++;
}
}
}
}
}

Vincenzoflaminio
23-02-2011, 22:17
#include <stdio.h>
#include <stdlib.h>

int main()
{
srand(time(NULL));
char codice[6];
char pass[5];
char alfabeto[]={'a','b','c','d','e','f','g','h','i','l','m','n','o','p','q','r','s','t','u','v','z'};
int lungalfabeto=21;
int i,nc,j,k,l,m,contatore;
printf("inserisci il codice a tastiera di 5 caratteri e termina la stringa \n");
gets(codice);

for (i=0;i<5;i++)
{
nc= rand()%lungalfabeto;
pass[i]=alfabeto[nc];
}
printf("pass = %c %c %c" ,pass[0],pass[1],pass[2]);

for(i='a';i<'z';i++)
{
for(j='a';j<'z';j++)
{
for(k='a';k<'z';k++)
{
for(l='a';l<'z';l++)
{
for(m='a';m<'z';m++)
{
printf(pass,"%c%c%c%c%c",i,j,k,l,m);
if( ! strcmp(codice,pass) )
{
printf("Trovato !!!");
printf("Tentativi : %d\n",contatore);
exit();
}
contatore++;
}
}
}
}
}


system("PAUSE");
return 0;
}

Clockover anche se ho risolto il problema utilizzando la funzione strcmp() posso chiederti di spiegarmi l'errorraccio nella mia sono uno studente e te ne sarai grato :D
Grazie anche bobbytre per la cortese risposta ... solo un errore :
"too few arguments to function `exit' " non ho mai studiato questa funzione ma mi sembra di capire che mi permette di uscire dai for .. quale argomento devo mettere tra le parentesi?

malocchio
23-02-2011, 22:35
Clockover anche se ho risolto il problema utilizzando la funzione strcmp() posso chiederti di spiegarmi l'errorraccio nella mia sono uno studente e te ne sarai grato :D

int confronto_stringhe (char s[],char t[])
{
int i;
for (i=0; i<5 ; i++){
if (s[i] != t[i])
return 0;
else
return 1;
}
}
In questa funzione viene controllato solo il primo carattere della stringa: infatti già al primo ciclo vengono eseguite le istruzioni return 0 oppure return 1, ignorando gli altri caratteri. La versione corretta sarebbe questa (ipotizzando che la funzione restituisca 0 se le stringhe sono diverse o 1 se sono uguali:

int confronto_stringhe (char s[],char t[])
{
int i;
for (i=0; i<5 ; i++){
if (s[i] != t[i])
return 0;
}
return 1;
}
Grazie anche bobbytre per la cortese risposta ... solo un errore :
"too few arguments to function `exit' " non ho mai studiato questa funzione ma mi sembra di capire che mi permette di uscire dai for .. quale argomento devo mettere tra le parentesi?exit() prende come unico argomento un intero che rappresenta il valore restituito dal processo terminato. Le convenzioni prevedono che sia 0 se l'esecuzione ha avuto esito positivo o diverso da 0 altrimenti. Nel tuo caso robabilmente vorrai richiamare exit(0) visto che il programma è riuscito a trovare la parola segreta.