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.

Rispondi quotando
