Sto riscontrando un problema nella risoluzione di quest'esercizio:
Far immettere all'utente gli attributi di N libri in N variabili di tipo libro. Realizzare una funzione che:
-Calcola e visualizza la media del prezzo dei libri.
-Determina il libro dal prezzo maggiore,
-Determina il libro dal prezzo inferiore,
-Determina il libro dal titolo con il maggior numero di caratteri
vi posto il programma:
#include "stdio.h"
#include "malloc.h"
#include "locale.h"
#include "string.h"
#include "stdlib.h"
#define MAX 200
struct libro {
char *titolo;
char *autore;
char *editore;
int anno_edizione;
int ISBN;
int prezzo;
} biblio[MAX];
void inserisci(struct libro, int);
void calcoli(struct libro *, int);
char pausa;
int main()
{
int i, n;
struct libro *punt=biblio;
setlocale(LC_ALL, "");
printf("Benvenuto. Questo è il programma di gestione della tua libreria.\nQuanti libri vuoi caricare in memoria? ");
scanf("%d", &n);
for(i=0; i<n ; i++){
biblio[i].titolo = (char*) malloc(50);
biblio[i].autore = (char*) malloc(30);
biblio[i].editore = (char*) malloc(30);
inserisci(biblio[i], i);
printf("il prezzo dato è %d", biblio[0].prezzo);
}
printf("\n\n\n\nCaricamento avvenuto con successo. \n\n....Premere Invio per ulteriori dettagli sui libri inseriti!");
scanf("%2c", &pausa);
calcoli(punt, n);
}
void inserisci(struct libro l, int i){
printf("\n\n\n\n\n\n%d libro: ", i+1);
printf("\n\nTitolo: ");
scanf("\n%[^\n]s", l.titolo);
printf("\nAutore: ");
scanf("\n%[^\n]s", l.autore);
printf("\nEditore: ");
scanf("\n%[^\n]s", l.editore);
printf("\nAnno di edizione: ");
scanf("%d", &l.anno_edizione);
printf("\nCodice ISBN: ");
scanf("%d", &l.ISBN);
printf("\nPrezzo: ");
scanf("%d", &l.prezzo);
}
void calcoli(struct libro *ptr, int n)
{
struct libro *aux=ptr;
int i;
float sommaprezzi=0.0;
float mediaprezzi;
struct libro *libmax=ptr;
struct libro *libmin=ptr;
struct libro *maxchar=ptr;
for(i=0; i<n; i++, ptr++){
sommaprezzi=sommaprezzi + ptr->prezzo;
}
mediaprezzi = sommaprezzi/n;
for(i=0, ptr=aux; i<n;i++, ptr++){
if(libmax->prezzo<ptr->prezzo)
libmax = ptr;
}
for(i=0, ptr=aux; i<n;i++, ptr++){
if(libmin->prezzo>ptr->prezzo)
libmin = ptr;
}
for(i=0, ptr=aux; i<n;i++, ptr++){
if(strlen(maxchar->titolo)<strlen(ptr->titolo))
maxchar = ptr;
}
printf("\n\n\n\n\n\n\n\n\nLa media dei prezzi di ogni libro è: %f", mediaprezzi);
printf("\n\nIl libro più caro è %s, di %s.", libmax->titolo, libmax->autore);
printf("\n\nIl libro più economico è %s, di %s", libmin->titolo, libmin->autore);
printf("\n\nIl libro con il titolo più lungo è %s, di %s", maxchar->titolo, maxchar->autore);
}
Il programma compila e fa la gran parte delle cose che ho progettato, solo in una cosa non funziona: non riempie i membri int, ovvero prezzo, anno edizione e ISBN. Appena il programma termina con la funzione inserisci, viene assegnato il valore 0 a tutti gli int del membro biblio[0], e così via..sospetto che il problema sia nell'allocazione dinamica della memoria, ma non riesco a risolvere! Qualche idea?