Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    programma in C per "utenti fedeli": strutture e file binari

    ciao. Il programma compila ma purtroppo nel momento in cui dovrebbe stampare a video gli utenti il cui nome inizia con "me" non funziona, così come non stampa a video gli utenti che hanno un punteggio maggiore di una soglia minima inseriti da input.

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define DIM 32
    
    
    typedef struct {
       char name[DIM];
       int points;
    } user;
    
    int readPoints (char usersFile[], user results[], int maxDim, int
    minPoints);
    
    int readPoints (char usersFile[], user results[], int maxDim, int
    minPoints){
    
       FILE *f;
       int i=0, stop=0, temp_1=0;
    char temp[33];
    
       f= fopen(usersFile, "wb");
       if (f == NULL)
           return -1;
    
    do{
    printf ("Inserire il nome: ");
    scanf("%s", temp);
    if (strcmp(temp,"fine")==0)
    stop= 1;
    else
    fwrite(temp, sizeof(char[33]), 1, f);
    printf("Inserire il punteggio: ");
    scanf("%d", &temp_1);
    fwrite(&temp_1, sizeof(int), 1, f);
    } while (!stop && (strcmp(temp,"fine") != 0));
    
       while (i<maxDim && (fread(&results[i], sizeof(user), 1, f)>0)){   /*
    fin tanto che i è minore della dim max inserita da utente e c'è qualcosa da
    leggere */
           if (results[i].points >= minPoints)
           printf ("s", results[i].name);
           i++;
       }
    
       fclose(f);
       return i;
    }
    
    int main()
    {
       user *v;
       int x=0, y=0, l=0, i;
    
       printf ("Inserire il numero di clienti salvati su file: ");
       scanf ("%d", &x);
    
       v= (user*) malloc(sizeof(user)*x);
    
       printf ("Inserire il punteggio minimo: ");
       scanf ("%d", &y);
    
       l= readPoints("punti.dat", v, x, y);
    
       for (i=0; i<l; i++){
       if ((v[i].name[0] == 'm') && (v[i].name[1] == 'e'))
           printf("L'utente %s ha %d punti.\n", v[i].name, v[i].points);}
    
       free (v);
    return 0;
    
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    La cosa più difficile da fare non è il programma ma il debugging.

    Quando scrivi il programma e non funziona, dedica un po' di tempo alla sua correzione, non scrivere subito sul forum.

    Hai fatto un po' di debugging? Hai eseguito linea per linea e hai controllato che ogni linea facesse quello che pensavi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ciao. l'ho copiato in visual studio e l'ho fatto... purtroppo però non capisco dov'è l'errore! mi sembra corretto. ho passato tutto oggi a vedere come aggiustarlo perché tra poco ho l'esame ma non so dove diavolo sbaglio!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Mah ... guarda ... per capire qualcosa bisognerebbe sapere (anche a grandi linee) cosa fai con le varie parti di codice ...

    Insomma, dei commenti sulle varie linee sarebbero utili per capire se sei sulla strada che intendi seguire.

    Anche logicamente ...

    Ad esempio, perché utilizzi una funzione in cui scrivi e leggi un file e che chiami readPoints?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Una società di telefonia cellulare gestisce un programma di premiazione per “utenti fedeli”. In particolare, per ogni cliente viene salvato su un file binario “punti.dat” il nome del cliente (al massimo 31 caratteri) e un numero intero che rappresenta i punti accumulati. Tali informazioni sono organizzate come una struttura user, opportunamente definita dal candidato:

    #define DIM 32
    typedef struct {
    char name[DIM];
    int points;
    } user;


    1) Si scriva una funzione:
    int readPoints (char usersFile[], user results[], int maxDim, int minPoints)
    che, ricevuto in ingresso il nome di un file usersFile, un array results di strutture user, la dimensione massima dell’array maxDim, e un limite inferiore di punti minPoints, copi nell’array results i dati dei clienti che hanno almeno i punti specificati da minPoints
    La funzione deve restituire come risultato il numero di utenti con almeno minPoints; si noti che tale risultato rappresenta anche la dimensione logica dell’array results. Qualora il file non sia accessibile, la funzione deve restituire il valore -1;

    2) Si scriva poi un programma main() che chieda all’utente il numero di clienti salvati sul file (tale numero sarà noto solo a tempo di esecuzione), e allochi dinamicamente un vettore V di user sufficientemente grande per poter contenere, nel caso peggiore, i dati di tutti gli utenti salvati in usersFile. Il programma dovrà poi chiedere all’utente il minimo punteggio e, utilizzando la funzione readPoints(), leggere da file e memorizzare in V i dati degli utenti che hanno almeno il punteggio minimo specificato. Il programma infine deve stampare a video il nome ed il punteggio degli utenti contenuti in V se e solo se il nome comincia per “Me”


  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da lollinof19sm
    1) Si scriva una funzione:
    int readPoints (char usersFile[], user results[], int maxDim, int minPoints)
    che, ricevuto in ingresso il nome di un file usersFile, un array results di strutture user, la dimensione massima dell’array maxDim, e un limite inferiore di punti minPoints, copi nell’array results i dati dei clienti che hanno almeno i punti specificati da minPoints
    La funzione deve restituire come risultato il numero di utenti con almeno minPoints; si noti che tale risultato rappresenta anche la dimensione logica dell’array results. Qualora il file non sia accessibile, la funzione deve restituire il valore -1;
    Quindi questa funzione deve solamente leggere e non scrivere il file.

    Si presuppone che il file sia già esistente (in quanto scritto in altra occasione).

    Già con quel codice saresti "fuori tema".

    2) Si scriva poi un programma main() che chieda all’utente il numero di clienti salvati sul file (tale numero sarà noto solo a tempo di esecuzione), e allochi dinamicamente un vettore V di user sufficientemente grande per poter contenere, nel caso peggiore, i dati di tutti gli utenti salvati in usersFile. Il programma dovrà poi chiedere all’utente il minimo punteggio e, utilizzando la funzione readPoints(), leggere da file e memorizzare in V i dati degli utenti che hanno almeno il punteggio minimo specificato. Il programma infine deve stampare a video il nome ed il punteggio degli utenti contenuti in V se e solo se il nome comincia per “Me”
    Attenzione al nome (Me) che comincia con M maiuscola non minuscola ... e al fatto che la funzione può restituire -1 al main indicando che il file non esiste.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    i nomi degli utenti li inserisco io (metto tutte minuscole). Poi: si li ho sbagliato (nel mettere l'apertura del file nella funzione), ma ciò non dovrebbe impedire il corretto funzionamento del programma intero.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    E invece può, dato che il file è aperto per la scrittura e quando leggi il puntatore è alla fine del file non all'inizio.

    In ogni caso è logicamente sbagliato ... scrivi esattamente il codice richiesto e non altro. E' importante all'esame.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define DIM 32
    
    
    typedef struct {
        char name[DIM];
        int points;
    } user;
    
    int readPoints (char usersFile[], user results[], int maxDim, int
                    minPoints);
    
    int readPoints (char usersFile[], user results[], int maxDim, int
                    minPoints){
        
        int i=0, stop=0, temp_1=0;
        char temp[33];
        
        do{
            printf ("Inserire il nome: ");
            scanf("%s", temp);
            if (strcmp(temp,"fine")==0)
                stop= 1;
            else
                fwrite(&temp, sizeof(char[33]), 1, usersFile);
            printf("Inserire il punteggio: ");
            scanf("%d", &temp_1);
            fwrite(&temp_1, sizeof(int), 1, usersFile);
        } while (!stop && (strcmp(temp,"fine") != 0));
        
        while (i<maxDim && (fread(&results[i], sizeof(user), 1, usersFile)>0)){   /*
                                                                           fin tanto che i è minore della dim max inserita da utente e c'è qualcosa da
                                                                           leggere */
            if (results[i].points >= minPoints)
                printf ("s", results[i].name);
            i++;
        }
        
        fclose(usersFile);
        return i;
    }
    
    int main()
    {
        user *v;
        FILE* f;
        int x=0, y=0, l=0, i;
        
        f= fopen("punti.dat", "wb");
        if (f == NULL)
            return -1;
        
        printf ("Inserire il numero di clienti salvati su file: ");
        scanf ("%d", &x);
        
        v= (user*) malloc(sizeof(user)*x);
        
        printf ("Inserire il punteggio minimo: ");
        scanf ("%d", &y);
        
        l= readPoints(f, v, x, y);
        
        for (i=0; i<l; i++){
            if ((v[i].name[0] == 'm') && (v[i].name[1] == 'e'))
                printf("L'utente %s ha %d punti.\n", v[i].name, v[i].points);}
        
        free (v);
        return 0;
        
    }
    Ora però sono incasinato con "usersFile" usato nella funzione per riferirmi al file, che però nel prototipo c'è scritto che è un array di caratteri...

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Non hai fatto nulla di quanto ti ho detto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.