Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    26

    [C] Telefonate in uscita

    Salve ragazzi, non riesco a capire perchè questo programma nun funzioni.

    Deve acquisire da file dei dati nel formato:

    <numero di telefono> <gg/mm/yyyy> <durata in secondi> <E/U>

    E/U significa che la chiamata è in entrata o in uscita.

    Deve prendere da tastiera un numero, trovare quel numero nel file e stampare:

    1) minuti totali in uscita verso quel numero
    2)data della chiamata più lunga in uscita verso quel numero
    3) costo totale delle chiamate considerando uno scatto alla risposta di €0,20 e €0,12 al minuto che scattano al primo secondo del nuovo minuto;

    posto direttamente il codice, spero che qualcuno possa aiutarmi:

    codice:
     #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    int main()
    {
    
        char num[11];                // numero da acquisire
        char tel[11];                  // numero telefonico
        char date[10];               //data gg/mm/yyyy
        int sec;                        // secondi
        int sec_tot=0;               // secondi totali
        int sec_max=0;             //secondi massimi
        char date_max[10];       //data della chiamata di durata massima
        char EorU;                   //in Entrata o in Uscita
        float price;                   // prezzo della chiamata
        float price_tot;             //somma dei prezzi delle chiamate
        float min;                    //minuti (convertiti dai secondi)
    
        
        FILE* fp;
        
        printf("NUMERO: ");
        gets(num);
        
        fp=fopen("/Users/alessandro/Desktop/Telefonate_File/Telefonate_File/input.txt", "r");
        
        while (fscanf(fp, "%s %s %d %c",&tel,&date,&sec,&EorU)!=EOF) {
            
            
            if (strcmp(tel,num)==0) {
                
            if (EorU=='U') {                   // controlla se in entrata o in uscita
                
                if (sec>sec_max) {
                    sec_max=sec;               // cerca la chiamata più lunga e salva la data
                    strcpy(date_max, date);
                    }
                
                sec_tot=sec_tot+sec;            // tempo di chiamate totali
                
                min=sec/60.0;       // divide per 60.0 in modo che si aspetti un risultato float
               
                price= 0.20 + (ceil(min)*0.12);  //ceil: 12 cent al primo secondo del nuovo minuto
                price_tot=price_tot+price;     //calcola il prezzo totale
                
               } 
                
            }
        }
        
        fclose(fp);
        
        printf("\nMINUTI TOTALI IN USCITA: %f" ,sec_tot/60.0);
        
        printf("\nCHIAMATA PIÙ LUNGA: %f min del %s",sec_max/60.0,date_max);
        
        printf("\nCOSTO TOTALE: %f",price_tot);
    
        
    
    }



    il file è questo:


    3468403598 22/11/2011 100 U
    3939464677 23/11/2011 30 E
    3465674346 23/11/2011 40 U
    0997451020 30/12/2011 50 U
    0997451020 01/01/2012 100 E
    3468403598 03/02/2012 200 U
    3468403598 01/04/2011 100 U
    3939464677 23/05/2011 30 E
    3465674346 23/05/2011 40 U
    0997451020 11/05/2011 50 E
    0997451020 22/06/2012 300 E
    3468403598 19/06/2012 50 U

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    14
    esattamente che tipo di errore dà?

    inoltre se sei alle prime armi, non userei con tanta allegria la funzione gets() ._.
    se dai qualche informazione in più sull'erorre o sul comportamento anonimo dell'esecuzione del programma, forse si riesce a capire quale parte del codice è buggato.

    Inoltre consiglio: nel main() ci va il minimo ed indispensabile. il main è solo il punto di partenza, non il programma intero. oltre al fatto che suddividendo il codice in più funzioni, il programma 1- è più leggibile e 2- è più facile da capire dove sono eventuali errori, in quanto li isoli dal resto del programma.

  3. #3
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Quoto quanto scritto sopra, inoltre suddividendo in funzioni ti potrebbe risultare più facile trovare l'errore/errori

    Prova a mettere la fscanf nel corpo del while , e nella condizione metti solo "!feof(fp)". Inoltre credo che nella fscanf quando si legge una stringa non vada messa la &..

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Devi fare attenzione alla dimensione delle stringhe.

    Per le date non consideri il terminatore e non inizializzi la "data massima"
    Deve essere quindi

    char date[11];

    e

    char date_max[11]={0};

    Inoltre devi inizializzare anche il "prezzo totale"

    float price_tot=0;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    26
    Grazie a tutti per le precisazioni, provo se il programma va e vi faccio sapere.

    Se qualcuno ha tempo mi può spiegare una cosa? Non capisco perchè il Deitel, il libro di esercizi e Xcode, etichettino "gets" come unsafe, o rischiosa.

    Ed ora me lo ha confermato nakunita. Quale è il problema con questa funzione, che in fin dei conti è l'unica che mi permette di prendere una stringa fino allo '\n' e non fino allo spazio.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    E' rischiosa per il semplice fatto che non controlla se il buffer di destinazione è abbastanza grande per contenere tutto quello che sta leggendo oppure se sta scrivendo i dati letti "sporcando" zone di memoria non di sua pertinenza.

    E' il classico rischio di buffer overflow.

    Al suo posto puoi usare la funzione gets_s
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    26
    La data massima comunque non penso ci sia bisogno di inizializzarla, tanto non confronta le date, confronta i secondi di quella data, e se i secondi sono massimi semplicemente sovrascrive quella stringa alla stringa casuale che c'è. infatti funziona, ho solo qualche problema con il prezzo adesso, forse è "ceil" che è sbagliata. Mi conta solo lo scatto alla risposta, provo a darci un'occhiata

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Nel caso in cui inserisci un numero di telefono inesistente, per la data massima sono visualizzati dei caratteri casuali. Devi inizializzare la stringa se vuoi evitare.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    26
    Vero. Ci metto un messaggio di errore se il numero non è in registro

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    26
    Comunque quello che mi interessava era non aver fatto grossi errori logici.

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.