Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: [C] Lettura Info

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33

    [C] Lettura Info

    Ciao a tutti ! ho un problema nel capire il senso della lettura di una coda ! mi spiego meglio, intanto
    ecco la traccia :

    Si scriva un programma che simuli l’accodamento di clienti di un call center di una compagnia telefonica. I clienti possono scegliere tra 3 tipi di richieste:

    1. Informazioni sui piani tariffari
    2. Informazioni sul traffico telefonico
    3. Informazioni sulle promozioni

    Ogni cliente rimane in attesa in una opportuna coda (tariffe, traffico, promozioni) tutte con la stessa priorità. Ogni coda può accodare al massimo 20 clienti e viene servita da un solo operatore.
    I dati relativi ad ogni cliente sono i seguenti:

    • Numero telefonico (Una stringa di 10 caratteri).
    • Cognome Cliente (Una stringa di 20 caratteri).
    • Nome Cliente (Una stringa di 20 caratteri).

    La struttura coda è definita cosi :

    codice:
    typedef struct SQueue{
       TInfo info[SIZE];
       int head;
       int tail;
       }TQueue;
    dove Tinfo è

    codice:
    struct SInfo {
      char telefono [MAXTEL]; //Codice Fiscale del Paziente
      char cognome[MAXCHAR];     //Cognome del Paziente
      char nome[MAXCHAR];        //Nome del Paziente
    };
    ora la lettura me la svolge in questo modo :

    codice:
    TInfo read_info()
    {
       TInfo info;
    
       do
       {
         printf ("Numero di telefono del cliente ");
         scanf ("%s", info.telefono);
       }
       while (strlen(info.telefono)!=MAXTEL-1);
    
       do
       {
         printf ("Inserisci il cognome del cliente ");
         scanf ("%s", info.cognome);
       }
       while (strlen(info.cognome)>MAXCHAR-1);
    
       do
       {
         printf ("Inserisci il nome del cliente ");
         scanf ("%s", info.nome);
       }
       while (strlen(info.nome)>MAXCHAR-1);
    
       return info;
    }
    quello che non capisco sono le condizioni del while ! qualcuno potrebbe chiarirmi il ragionamento ? grazie in anticipo per l'aiuto

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Le condizioni si occupano:
    1) controllare che il numero di telefono sia lungo esattamente MAXTEL-1 (l'ultimo carattere è riservato per il terminatore di stringa)
    2) 3) controllare che la lunghezza della stringa inserita non superi MAXLEN-1 (l'ultimo carattere è riservato per il terminatore di stringa), dovrebbe servire per prevenire un array out of bounds, che però a questo punto si sarà già verificato in quanto se l'utente inserisce una stringa più lunga di MAXLEN-1 questa sarà prima salvata nella memoria e poi si effettuerà questo controllo che sarà quindi del tutto inutile!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Originariamente inviato da Scara95 dovrebbe servire per prevenire un array out of bounds, che però a questo punto si sarà già verificato in quanto se l'utente inserisce una stringa più lunga di MAXLEN-1 questa sarà prima salvata nella memoria e poi si effettuerà questo controllo che sarà quindi del tutto inutile!
    Appunto ! per questo non capisco il senso di mettere la condizione a lettura effettuata! Ma questo errore non dovrebbe verificarsi anche nel primo caso ?
    mettere la condizione prima della lettura è comunque inutile, perche non avendo ancora letto non si puo verificare niente, come mi consigli di fare ?

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Utilizza fgets e un buffer al posto di scanf, ti posto un codice d'esempio...
    codice:
    #include <stdio.h>
    #include <string.h>
    #define BUFF_LEN 80
    
    
    void inserimento(char *out, unsigned max_len) {
    	char buff[BUFF_LEN];
    	while(1) {
    		fgets(buff, BUFF_LEN, stdin);
    		if((buff[strlen(buff)-1] == '\n') && (strlen(buff) <= (max_len)))
    			break;
    		printf("Lunghezza massima consentita %u, reinserire: ", (max_len-1));
    	}
    	buff[strlen(buff)-1] = '\0';
    	strcpy(out, buff);
    }
    
    
    int main(int argc, char ** argv) {
    	char nome[20];
    	inserimento(nome, 20);
    	printf("%s\n", nome);
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Credo sia un po troppo avanzato per me
    qualcosa di più semplice ?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Ehm, scusa
    codice:
    #include <stdio.h>
    #include <string.h>
    #define BUFF_LEN 80
    
    void pulisci_buffer() {
    	while(getchar() != '\n');
    }
    void inserimento(char *out, unsigned max_len) {
    	char buff[BUFF_LEN];
    	while(1) {
    		fgets(buff, BUFF_LEN, stdin);
    		if((buff[strlen(buff)-1] == '\n') && (strlen(buff) <= (max_len)))
    			break;
    		if(buff[strlen(buff)-1] != '\n')
    			pulisci_buffer();
    		printf("Lunghezza massima consentita %u, reinserire: ", (max_len-1));
    	}
    	buff[strlen(buff)-1] = '\0';
    	strcpy(out, buff);
    }
    
    
    int main(int argc, char ** argv) {
    	char nome[20];
    	inserimento(nome, 20);
    	printf("%s\n", nome);
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Se vuoi te lo spiego, un qualcosa di più semplice non è mai sicuro...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Inanzi tutto ti ringrazio per la disponibilità a parte la funzione "pulisci buffer()" credo di aver capito la sostanza, ma è che mi serve qualcosina da fare "in fretta" perchè ho un esame di algoritmi e non mi interessa andare troppo nello specifico visto che non sono un informatico
    avevo pensato di fare un getc fin quando non fosse pieno il vettore e poi svuotare il flusso stdin se si eccede.
    Puoi dirmi cosa succede nel codice che ho riportato all'inizio se si eccede la dimensione della stringa ?

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Se si eccede la dimensione della stringa si rischia di accedere ad aree di memoria riservate, il programma genererà un errore di accesso alla memoria e terminerà.

    Per quanto riguarda il codice che ti ho postato, fgets è una funzione di libreria che legge un numero massimo di caratteri da un file (stdin rappresenta lo standard input), a questa segue un controllo che:
    1)controlla che l'ultimo carattere inserito sia un a capo ('\n') per verificare che sia stata letta tutta la stringa;
    2)controlla che la stringa inserità sia lunga esattamente il massimo voluto (escluso il terminatore di stringa)
    se risulta vero, si sotituisce il '\n' con il '\0' (terminatore di stringa) e si copia il tutto nella stringa di output (facendo la sostituizione del '\n' risulterà che la stringa finale, compreso il terminatore di stringa, sarà esattamente lunga quanto i caratteri richiesti)
    se invece non si verifica il primo if si controlla che sia stata riportata tutta la stringa nel buffer, sempre verificando che l'ultimo carattere sia un '\n', se non è così si procede a leggere ogni carattere sull'stdin fino ad un '\n' e ad eliminarli, si richiede il reinserimento e il ciclo ricomincia.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Volendo puoi usare un buffer eccessivamente lungo per leggere i dati con scanf e poi controllare con strlen che i dati inseriti risultino della lunghezza voluta, in questo casò però c'è sempre il rischio che l'utente superi il limite di caratteri imposto dal tuo buffer.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.