PDA

View Full Version : [C] menu


VendeR
06-05-2006, 19:43
ciao a tutti! ho un probleme: devo creare un programma con il seguente menù (ve ne riporto solo una parte):

- I <Cognome_Nome> <Matricola> <Voto> per inserire i dati di uno studente.
- C <Cognome_Nome> per cancellare i dati dello studente con
- M per visualizzare i dati della media.
- PC per stampare tutto il database, ordinato per Cognome.

come posso fare??
io avevo pensato di fare:
c=getchar();
switch(c){
case 'I': ...
case 'PC':...
}

(scusate se ho commesso qualche errore nella sintassi dello switch, ma lo uso di rado, cmq era per farvi capire la mia idea)

il problema (ho provato) che ad esempio non gli piace il case 'PC', perchè è di due lettere.. ho provato a sostituire char c con un vettore (ed a mettere scanf("%c",&c) al posto della getchar) ma non gli paice lo stesso..
come posso fare?? oltretutto dovrebbe prendere anche dei parametri (come Cognome_Nome> <Matricola>) dopo il comando, ma solo con alcuni comandi...
sono proprio in tilt non so come farre...

ah per le voci del menù , non voglio che siano parametri da passare al programma quando lo lancio, io lancio il programma poi mi deve accettare i vari comandi...
grazie mille in anticipo a tutti!

andbin
06-05-2006, 20:45
ciao a tutti! ho un probleme: devo creare un programma con il seguente menù (ve ne riporto solo una parte):

- I <Cognome_Nome> <Matricola> <Voto> per inserire i dati di uno studente.
- C <Cognome_Nome> per cancellare i dati dello studente con
- M per visualizzare i dati della media.
- PC per stampare tutto il database, ordinato per Cognome.

come posso fare??Ciao, puoi fare una cosa del genere:
char buffer[200];
char *comando;

while (fgets (buffer, sizeof (buffer), stdin) != NULL)
{
if ((comando = strtok (buffer, " \n")) != NULL)
{
if (strcmp (comando, "I") == 0)
{
/* fai altre strtok per prendere i parametri */
}
else if ....

.... altri test ....
}
}

VendeR
07-05-2006, 02:30
grazie mille...
solo una cosa: strtok di preciso cosa fa? mi scrive in "comando" tutto quello che c'è in buffer prima del newline?? volendo potrei farlo con lo spazio?!!?

andbin
07-05-2006, 11:22
grazie mille...
solo una cosa: strtok di preciso cosa fa? mi scrive in "comando" tutto quello che c'è in buffer prima del newline?? volendo potrei farlo con lo spazio?!!?No, strtok serve per "spezzare" una stringa in più "token" usando dei caratteri di delimitazione che vengono specificati nel secondo parametro della strtok.

VendeR
07-05-2006, 14:28
ah ok ho capito... ma potrei usare come carattere delimitatore lo spazio^??

andbin
07-05-2006, 14:56
ah ok ho capito... ma potrei usare come carattere delimitatore lo spazio^??In generale sì, l'unico problema sarebbe, nel tuo caso specifico, il Cognome_Nome. Se Cognome e Nome sono separati da uno spazio, avresti 2 token separati ma potresti comunque vederli come un unico parametro (li unisci di nuovo).
Altrimenti puoi usare un altro carattere come separatore, ad esempio la virgola.
Vedi tu cosa devi fare e cosa ti sembra meglio.

VendeR
07-05-2006, 21:24
in quel caso mi va benissimo avere due token separati, tanto cognome e nome fanno parte devono essere due elementi di una struttura :D
solo avrei ancora un ultimo dubbio: ad esempio con il comando C, lui dopo dovrebbe accettare o una stringa contenente Cognome e Nome, oppure il numero di matricola (sempre come stringa), cè un modo poi per capire se l'utente ha scritto dei numero o delle lettere, se i valori letti da tastiera sono salvati in una stringa?? cioè se il token è formato da numeri o da caratteri...

andbin
07-05-2006, 21:31
solo avrei ancora un ultimo dubbio: ad esempio con il comando C, lui dopo dovrebbe accettare o una stringa contenente Cognome e Nome, oppure il numero di matricola (sempre come stringa), cè un modo poi per capire se l'utente ha scritto dei numero o delle lettere, se i valori letti da tastiera sono salvati in una stringa?? cioè se il token è formato da numeri o da caratteri...Non c'è una funzione apposita, nella libreria del "C", per determinare se una stringa contiene solo numeri. Ma puoi crearne una davvero semplice:
#include <ctype.h>

int is_str_numeric (char *p)
{
while (*p != '\0')
if (isdigit (*p++) == 0)
return 0;

return 1;
}

VendeR
08-05-2006, 00:22
domani implemento la funzione... grazie mille!!! :) :) :)