PDA

Visualizza la versione completa : [C] Programma con parola di accesso


marvindcm
12-03-2011, 21:42
Salve a tutti, sono alle prime armi con la programmazione, e mi venuto subito un dubbio.
Volevo creare un piccolo programma sempre che si apre con la finestra di dos, che per richiede una specie di password per rivelare un'informazione per esempio cos:

Mese-Giorno=?
(tu scrivi per esempio Marzo-12)
La diritta via era smarrita, dal cammino mi ritrovai disperso.

Mese e giorno sono all'inizio con il comando printf, quello che devi scrivere il mese e il giorno dovrebbe essere scanf, ma non capisco come scriverlo -.-''
e sempre teoricamente per farne di pi? cio mettendo pi parole chiave e pi risposte??
urgente per favore ;)

Celebron
12-03-2011, 21:51
ti serve un database(preferibilmente) o un file in cui salvi le parole chiave e le relative risposte che il programma deve restituire

visto che i database, essendo un principiante, immagino tu non li sappia ancora usare, salva tutte le informazioni in un file ben strutturato e poi, all'avvio del programma, caricatele in un vettore di struct, dove ogni singola struct formata da una stringa che indica la parola chiave e da un altra che indica la risposta da restituire

a questo punto con un strcmp() confronti la parola chiave inserita dall'utente con tutte quelle presenti nel vettore
se trovi un eguaglianza restituisci la risposta, altrimenti a fine ciclo informi l'utente che la chiave da lui inserita non valida e non ha riscontri

Si tratta di una procedura non ottimizzata a puri fini didattici. Ripeto, per fare qualcosa di serio, dovresti almeno usare un tabella di hash o, meglio ancora, direttamente un db, ma sono cose che apprenderai col tempo.

marvindcm
12-03-2011, 22:00
ma per il file ben strutturato intendi all'interno del main?
oppure all'inizio lo richiami utilizzando #define "nome del file"???
scusa ma ancora non ci capisco moltissimo...
grazie per la risposta velocissima! :)

Celebron
12-03-2011, 22:02
No, intendo che tu crei un file con una struttura fissa

esempio:
in testa al file metti un intero che rappresenta il numero totale di coppie parola_Chiave-Risposta
nella riga iesima ci metti la parola chiave
nella i+1esima ci metti la risposta

e cos via

in questo modo quando avvii il programma, apri il tuo file, leggi il primo numero e lo usi per allocare dinamicamente il tuo vettore di struct

quindi con un semplice ciclo leggi fino a fine file riga per riga, mettendo la prima riga nel campo chiave della struct dell'iesaima casella del vettore e la seconda nel campo risposta della stessa struct, quindi passi alla successiva casella del vettore e continui in questo modo

Il resto del programma per appunto fatto da confronti tra le parole inserite dall'utente e i campi chiave del tuo vettore

marvindcm
12-03-2011, 22:09
cacchio complicatissimo :dh:
ti disturbo molto se ti chiedo se potessi scrivermi appena il primo esempio, e poi lo completo io??

Celebron
12-03-2011, 22:25
sempre mantenendo la struttura del file che ti ho detto sopra:
in testa numero che rappresenta il numero di coppie parolachiave-risposta
quindi dal i in poi una riga per parola chiave e una per risposta

dovrebbe essere qualcosa del genere:


typedef struct{
char* parola_chiave;
char* risposta;
}casella_t;

int main(){
FILE *myfile;
int dim, i;
casella_t **vettore_dati;
casella_t *temp;
char* stringaTemp[1024+1];


myfile = fopen ("dati.txt", "r");

if(myfile == NULL){
printf("errore in lettura o file non trovato\n");
return EXIT_FAILURE;
}

fscanf(myfile, "%d", &dim); // dim il numero in testa al file, rappresenta il numero di coppie di parole_chiave-risposte presenti nel file
vettore_dati = (casella_t**) malloc (dim * sizeof(casella_t*)); //allochi la memoria per il vettore

for(i = 0; i<0; i++){
temp = (casella_t*) malloc (sizeof(casella_t)); //allochi la casella

fgets(stringaTemp, 1024, myfile); //leggi e metti nella stringa temporanea la parola chiave
temp->parola_chiave = (char*) malloc( strlen(stringaTemp) * sizeof(char)); //allochi lo spazio corretto per la stirnga
strcpy(temp->parola_chiave, stringaTemp); //copi

fgets(stringaTemp, 1024, myfile); //leggi la risposta
temp->risposta = (char*) malloc( strlen(stringaTemp) * sizeof(char)); //allochi lo spazio corretto
strcpy(temp->risposta, stringaTemp); //copi

vettore_dati[i] = temp;
}


//tutto il resto del programma...
return EXIT_SUCCESS;
}

marvindcm
12-03-2011, 22:29
grazie mille!!!!!
ah ultimissime cose, cosa vuole dire allocare la memoria per il vettore e allochi spazio corretto??

Celebron
12-03-2011, 22:31
il vettore un vettore di puntatori a struct, non conoscendo la dimensione dello stesso prima di aver letto il file, non puoi definirlo in modo statico. Quindi devi allocarlo a run-time solo dopo aver letto la dimensione dello stesso dal file in questione

La stringa, allo stesso modo, non ha una dimensione definita. Potrebbe essere lunga un carattere o mille. Per non sprecare memoria quindi la leggi interamente, la metti in una stringa ausiliaria che lunga 1024 (ma puoi farla lunga a scelta) e poi tramite strlen ne ricavi la dimensione reale (strlen misura da inizio stringa a carattere di terminazione '\0') e la memorizzi l dove deve stare

se ti servissero dettagli sulle varie funzioni qui (http://www.cplusplus.com/reference/clibrary/cstdio/)

se hai dubbi ti consiglio di studiarti pi a fondo la gestione dei file e dell'allocazione dinamica prima di cimentarti con questo programma

marvindcm
12-03-2011, 22:36
a va bene :zizi: grazie ancora :yuppi:

Loading