Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    1

    Aiuto per i cicli while e fscanf

    Salve a tutti, sono alle prime armi con la programmazione in linguaggio C, e vorrei qualche aiuto per risolvere un programmino il cui testo è il seguente:

    Con la struttura del c, variabili, cicli iterativi, array, strutture, strutture di array, strutture annidate.[ NEL PROGRAMMA NON DEVONO ESSERE USATI I PUNTATORI (SOLO PER APRIRE IL FILE )]

    Caricare un file di testo così strutturato :

    NOME COGNOME ETA CITTA
    ANNO NOME SESSO
    ANNO NOME SESSO
    ANNO NOME SESSO

    in un array di struct composto da una struttura principale contenente i dati dei nominativi e da un array di strutture annidato contenente i dati degli anni.

    Al termine del caricamento produrre un file di testo con i seguenti risultati :

    a) chi ha avuto più figli nel 1974 e nel 2000
    b) chi ha più figli
    c) chi ha più figli maschi e più figli femmine

    Soluzione :

    IPOTESI :

    a) Vi sono al più 50 nominativi
    b) Vi possono essere elementi ripetuti che verranno scartati
    c) Vi possono essere da 0 a 5 figli per ogni nominativo
    d) Il file di testo non presenta errori di sintassi e di semantica
    e) Il file di testo si presente in formato di caratteri MAIUSCOLI

    QUINDI:
    Devo creare un ciclo (con il while o il for o if, o altro ), che analizzi i dati da un file di testo così strutturato:

    ESEMPIO:

    NOME COGNOME ETA CITTA (PRIMO ELEMENTO)
    ANNO NOME SESSO (Figlio del primo elemento)
    ANNO NOME SESSO (Figlio del primo elemento)
    ANNO NOME SESSO (Figlio del primo elemento)
    NOME COGNOME ETA CITTA (SECONDO ELEMENTO)
    ANNO NOME SESSO (Figlio del secondo elemento)
    ANNO NOME SESSO (Figlio del secondo elemento)
    ANNO NOME SESSO (Figlio del secondo elemento)
    ANNO NOME SESSO (Figlio del secondo elemento)
    NOME COGNOME ETA CITTA (TERZO ELEMENTO (Lui non ha figli))
    NOME COGNOME ETA CITTA (QUARTO ELEMENTO)
    ANNO NOME SESSO (Figlio del quarto elemento)
    NOME COGNOME ETA CITTA (QUINTO ELEMENTO)
    ANNO NOME SESSO (Figlio del quinto elemento)
    ANNO NOME SESSO (Figlio del quinto elemento)

    Esempio:

    ALESSANDRO SALVI 56 PESCARA
    1974 MARCO MASCHIO
    1976 ELISABETTA FEMMINA
    1980 STEFANO MASCHIO
    ALBERTO BIANCHI 48 BOLOGNA
    ALBERTO BIANCHI 48 BOLOGNA (Elemento ripetuto, quindi deve essere eliminato)
    1974 STEFANO MASCHIO
    1976 FABRIZIO MASCHIO
    1980 PIERO MASCHIO
    PIERO BRAMANTE 50 BARI
    LUIGI SCIORTINO 42 MILANO
    LUIGI SCIORTINO 42 MILANO (Elemento ripetuto, quindi deve essere eliminato)
    1978 FILIPPO MASCHIO
    1974 ENRICO MASCHIO
    1988 PAOLO MASCHIO
    VINCENZO GATTO 63 ROMA
    1972 GIOVANNI MASCHIO
    1974 LUIGI MASCHIO
    2000 GIANCARLO MASCHIO
    1974 ELISABETTA FEMMINA
    1978 MARTA FEMMINA
    1980 ALESSANDRA FEMMINA
    Ecc..
    Ecc..
    Ecc..


    Nel file da dove acquisisce i dati non si sa quante persone ci sono e quanti figli hanno sempre che ne abbiamo e ci possono essere elementi principali ripetuti che vanno scartati
    Però il ciclo deve prendere al massimo 50 elementi principali e il sottociclo al massimo 5 figli di ogni elemento principale (sempre che abbia figli!).

    NEL PROGRAMMA NON DEVONO ESSERE USATI I PUNTATORI (MA SOLO PER APRIRE IL FILE )

    Io ho provato a creare quattro righe di codice ma mi blocco nel creare i cicli per l’acquisizione del dati, visto che non devo usare i puntatori.
    Quello che ho creato è questo: (ci sono errori a causa di infinite modifiche, quindi guardatelo giusto per farvi un’idea)

    ************************************************** ****************
    ************************************************** ****************
    int LoadData()
    {
    FILE *lpFile; //puntatore a File

    struct sPerson lCurrentPerson; // contiene il nominativo corrente

    struct sYearDetail lCurrentYear; // contiene l'anno corrente

    enum eBoolean Skip = False; // impostato a 1 se un elemento e' ripetuto

    int lPersonIndex = 0;

    int lDetailIndex = 0;

    int lScanResult = 0;

    if ((lpFile=fopen(gFileName,"rt"))!=NULL)
    {
    // caricamento dei dati del nominativo su struttura locale
    while (fscanf(lpFile,"%s %s %d %s",
    &lCurrentPerson.Name,
    &lCurrentPerson.SurName,
    &lCurrentPerson.Age,
    &lCurrentPerson.City)!=EOF && lPersonIndex<=MAX_CUSTOMERS-1)
    {

    // ricerca duplicati,viene chiamata la funzione "enun eBoolean Exists"
    if (Exists(lCurrentPerson.Name,lCurrentPerson.SurName )==True)
    Skip=True;
    else
    Skip=False;
    // se non e'un duplicato viene caricato in memoria il nominativo
    // e inizia l'acquisizione dei dati.
    if (Skip==False)
    {
    // assegnazione ad elemento dell'array
    strcpy(gPersons[lPersonIndex].Name,lCurrentPerson.Name);
    strcpy(gPersons[lPersonIndex].SurName,lCurrentPerson.SurName);
    strcpy(gPersons[lPersonIndex].City,lCurrentPerson.City);
    gPersons[lPersonIndex].Age=lCurrentPerson.Age;
    }
    lDetailIndex=0;
    // caricamento dei dettagli dei figli del nominativo
    // lScanResult deve essere uguale al numero di argomenti passati a fscanf
    // in base alla struttura del file di input se fscanf non riesce a formattare correttamente
    // tutti i dati, nel caso specifico, restituisce 0 in quanto la conversione
    // fallisce al primo parametro.
    while ((lScanResult=fscanf(lpFile,"%d %s %d",
    &lCurrentYear.Year,
    &lCurrentYear.Name,
    &lCurrentYear.Sex))!=EOF && lDetailIndex<=MAX_SONS-1 && lScanResult==3)
    {
    // se e' un duplicato, deve scartare anche le righe dei dati
    if (Skip==False)
    {
    gPersons[lPersonIndex].Details[lDetailIndex].Year=lCurrentYear.Year;
    strcpy(gPersons[lPersonIndex].Details[lDetailIndex].Name,lCurrentYear.Name);
    gPersons[lPersonIndex].Details[lDetailIndex].Sex=lCurrentYear.Sex;
    gPersons[lPersonIndex].Sons++;
    lDetailIndex++;
    }
    }
    if (Skip==False)
    {
    lPersonIndex++;
    // Assegnazione numero di nominativi trovati
    gPersonsCount=lPersonIndex;
    }
    }
    fclose(lpFile);
    return 0;
    }
    else
    {
    RaiseError(cErrInputFile); // viene chiamata la funzione RaiseError
    return 1;
    }
    } // Of LoadData

    ************************************************** ********************
    ************************************************** ********************

    Spero che mi aiutiate a risolvere a risolvere il problema e quindi a chiarire i miei bubbi, quindi vi ringrazio anticipatamente,
    Alessandra.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Originariamente inviato da c.aless
    Salve a tutti, sono alle prime armi con la programmazione in linguaggio C
    Ciao e benvenuta nel forum di Programmazione.

    Ti segnalo la lettura del Regolamento per conoscere tutte le norme per utilizzare correttamente quest'area del forum.

    In particolare, il linguaggio di programmazione va sempre indicato nel titolo della discussione; prendi eventualmente spunto dalle discussioni esistenti.

    Modifico io il titolo di questa discussione.

    Ciao e buon forum!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.