C, es1, proposta di correzione esercitazione n.1 su elenco libri.
-
Classi quarte TPSIT,
prima esercitazione per casa in linguaggio C:
a) gestire i dati di un libro
1. titolo
2. autore
3. numero pagine
4. casa editrice
5. prezzo
b) gestire un elenco di libri
c) dato un titolo trovare se il libro è presente nell'elenco
d) ordinamento per titolo
e) ordinamento per autore
f) trovare libro con più pagine
g) trovare libro meno costoso
-
Definizione della struct.
typedef struct libro {
char titolo[30];
char autore[30];
int numeropagine;
float prezzo;
char editore[30];
} t_libro;
-
Procedura per l'inserimento dei dati in elenco (array).
Si utilizza gets per gestire le stringhe con spazi all'interno.
void inserimento(t_libro elenco[], const int n) {
int i=0;
for(i=0; i<n; i++) {
printf("\ninserire titolo libro ");
//scanf("%s", elenco[i].titolo);
gets(elenco[i].titolo);
printf("\ninserire autore libro ");
//scanf("%s", elenco[i].autore);
gets(elenco[i].autore);
printf("\ninserire editore libro ");
//scanf("%s", elenco[i].editore);
gets(elenco[i].editore);
printf("\ninserire numero pagine libro ");
scanf("%d", &elenco[i].numeropagine);
printf("\ninserire prezzo libro ");
scanf("%f", &elenco[i].prezzo);
}
}
-
Metodo di ricerca di un libro nell'elenco.
Il metodo restituisce un puntatore a struct anziché una struct
per evitare di avere gli stessi dati inutilmente ripetuti.
t_libro *ricerca(t_libro elenco[], const int n,
char *titolo) {
t_libro *ret = NULL;
if (titolo != NULL) {
if (strlen(titolo) > 0) {
int i=0;
int trovato = 0;
while(i<n && trovato==0) {
if (strcmp(elenco[i].titolo, titolo) == 0) {
trovato = 1;
ret = &elenco[i];
}
i++;
}
}
}
return ret;
}
-
Procedura per la stampa dei dati del libro ricercato.
Avento come parametro un puntatore a strcut e non una struct
si utilizza l'operatore -> per leggere i campi.
void stampalibro(t_libro *lib) {
if (lib != NULL) {
printf("\n dati libro trovato \n");
printf("titolo: %s\n", lib->titolo);
printf("autore: %s\n", lib->autore);
printf("editore: %s\n", lib->editore);
printf("numero pagine: %d\n", lib->numeropagine);
printf("prezzo: %f\n", lib->prezzo);
}
}
-
Procedura di ordinamento per titolo del libro.
void ordinamentoTitolo(t_libro elenco[], const int n) {
int i=0;
int j=0;
for(i=0; i<n-1; i++) {
for(j=i+1; j<n; j++) {
if (strcmp(elenco[i].titolo, elenco[j].titolo) > 0) {
t_libro app = elenco[i];
elenco[i] = elenco[j];
elenco[j] = app;
}
}
}
}
-
Procedura di ordinamento per autore del libro.
void ordinamentoAutore(t_libro elenco[], const int n) {
int i=0;
int j=0;
for(i=0; i<n-1; i++) {
for(j=i+1; j<n; j++) {
if (strcmp(elenco[i].autore, elenco[j].autore) > 0) {
t_libro app = elenco[i];
elenco[i] = elenco[j];
elenco[j] = app;
}
}
}
}
-
Funzione che restituisce i dati del libro con più pagine.
Il metodo restituisce un puntatore a struct anziché una struct
per evitare di avere gli stessi dati inutilmente ripetuti.
t_libro *libromaxpagine(t_libro elenco[], const int n) {
t_libro *ret = NULL;
int i=0;
int max = -1;
for(i=0; i<n; i++) {
if (elenco[i].numeropagine > max) {
max = elenco[i].numeropagine;
ret = &elenco[i];
}
}
return ret;
}
-
Funzione che restituisce i dati del libro meno costoso.
Il metodo restituisce un puntatore a struct anziché una struct
per evitare di avere gli stessi dati inutilmente ripetuti.
La costante INT_MAX che indica il valore massimo tra gli interi
è presente includendo la libreria "limits.h"
t_libro *librominprezzo(t_libro elenco[], const int n) {
t_libro *ret = NULL;
int i=0;
int min = INT_MAX;
for(i=0; i<n; i++) {
if (elenco[i].prezzo < min) {
min = elenco[i].prezzo;
ret = &elenco[i];
}
}
return ret;
}