Ciao ragazzi, mi ritrovo sempre a preparare un esame per l'università e sto svolgendo vari compiti, riscontrando un po' di problemi in quei compiti dove si devono usare più strutture in cui qualcuna deve fare riferimento ad un'altra. Dato che trovo pochi esercizi e poca teoria a riguardo chiedo il vostro aiuto, così da chiarirmi alcuni procedimenti.
Posto sempre il testo del compito per essere più chiaro possibile:
Si realizzi un programma in linguaggio C in grado di gestire un sistema di pubblicazioni scientifiche. Il
programma dovrà leggere da un file
“pub.txt” le informazioni relative ad alcuni articoli strutturate nel
seguente modo:
TITOLO1 (Titolo dell’articolo 1)
NUM_AUTORI (Numero degli autori dell articolo 1)
AUT1
… (Elenco autori)
AUT N
TITOLO2 (Titolo dell articolo 2)
…
Inoltre, il programma dovrà leggere da un file
“cit.txt” le informazioni relative alle citazioni fatte da ogni
articolo. Tali informazioni saranno strutturate nel seguente modo
TITOLO (Titolo dell’articolo 1)
NUM_CITAZIONI (Numero degli articoli citati dall’articolo 1)
TITOLO1
… (Elenco dei titoli degli articoli citati dall’articolo 1)
TITOLOM
TITOLO (Titolo dell’articolo 2)
…
Assumendo che:
- gli autori siano indicati utilizzando esclusivamente il cognome
- non ci siano casi di omonimia
- non esistano due titoli uguali
il programma dovrà leggere il file e svolgere le seguenti funzioni:
1. Stampa della lista di articoli di un autore
2. Stampa del numero totale di citazioni ricevute da un autore
3. Stampa del numero di citazioni di un articolo
Sono riuscito a svolgere solo il primo punto fino adesso, non capisco come dopo aver scritto il nome dell'autore, nel secondo punto, mi possa dare il numero di citazioni(che sarebbero i titoli che lui ha contribuito a scrivere) che sono presenti in un'altra struttura.
Poi quando voglio visualizzare la stampa del numero di citazioni del secondo file non mi funziona perfettamente perché fgets non mi va a capo a leggere l'altra linea come fscanf che però qui non posso usare perché devo leggere stringhe con spazi.
Come posso fare?
Ecco il mio codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct nomeaut_s{
char elencoaut[60];
}nomeaut;
typedef struct titolocit_s{
char elencocit[100];
}titolocit;
typedef struct libro_s{
char titolo[100];
int num_aut;
nomeaut autori[60];
}libro;
typedef struct citazioni_s{
char tit[100];
int num_cit;
titolocit cit[100];
}citazioni;
libro elenco[100];
citazioni elenco2[100];
int main(){
int i, j,n, cont, cont2, index2=0, num=0;
int index=0, scelta;
char autore[30], citaz[100];
FILE *fp1, *fp2;
fp1=fopen("pub.txt","r");
i=0;
while(!feof(fp1)){fflush(stdin);
fgets(elenco[i].titolo, 100, fp1);
fscanf(fp1,"%d", &(elenco[i].num_aut));
for(cont=0;cont<elenco[i].num_aut;cont++){
fscanf(fp1,"%s\n",elenco[i].autori[cont].elencoaut);
}
i++;
index++;
}
fclose(fp1);
fp2=fopen("cit.txt","r");
j=0;
while(!feof(fp2)){fflush(stdin);
fgets(elenco2[j].tit, 100, fp2);
fscanf(fp2,"%d", &(elenco2[j].num_cit));
for(cont2=0;cont2<elenco2[j].num_cit;cont2++){
fgets(elenco2[j].cit[cont2].elencocit, 100 ,fp2);
fgets(elenco2[j].cit[cont2].elencocit, 100 ,fp2);
}
j++;
index2++;
}
fclose(fp2);
do{
printf("1-Visualizza file pub.txt\n");
printf("2-Visualizza file cit.txt\n");
printf("3-Stampa lista articoli di un autore\n");
printf("4-Stampa il numero di citazioni ricevute da un autore\n");
printf("5-Stampa numero di citazioni di un articolo\n");
printf("0-Esci\n");
scanf("%d", &scelta);
switch(scelta){
case 1:
printf("Stampa del file pub.txt\n\n");
for(i=0;i<index;i++){
printf("Titolo:%s",elenco[i].titolo);
printf("Numero di autori: %d\n", elenco[i].num_aut);
for(cont=0; cont<elenco[i].num_aut;cont++){
printf("Cognome autore:%s\n", elenco[i].autori[cont].elencoaut);
}
}
printf("\n\n");
break;
case 2:
printf("Stampa del file cit.txt\n\n");
for(j=0;j<index2;j++){
printf("Titolo:%s",elenco2[j].tit);
printf("Numero di citazioni: %d\n", elenco2[j].num_cit);
for(cont2=0; cont2<elenco2[j].num_cit;cont2++){
printf("Citazione:%s", elenco2[j].cit[cont2].elencocit);
num++;
}
}
printf("\n\n");
break;
case 3:
printf("\nStampa lista articoli di un autore\n\n");
printf("Scrivi cognome autore:");
scanf("%s", autore);
for(i=0;i<index;i++){
for(cont=0; cont<elenco[i].num_aut;cont++){
if(strcmp(elenco[i].autori[cont].elencoaut, autore)==0)
printf("Titolo:%s\n", elenco[i].titolo);
}
}
printf("\n\n");
break;
case 4:
break;
case 5:
break;
default:printf("Hai inserito una scelta non valida");
break;
}
}while(scelta!=0);
}