Problema con struct

di il
4 risposte

Problema con struct

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?

4 Risposte

  • Re: Problema con struct

    Ciao,
    se vuoi che la tua funzione inserisci possa modificare i campi della struttura, allora le devi passare un puntatore alla struttura!
    
    #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 e' %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);*/
    
        return 0;
    }
    
    
    
    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);
    
    
    }*/
    
    Altrimenti, dato che l'array di strutture è condiviso, la funzione inserisci può ricevere in ingresso solamente "i", cioè la posizione all'interno dell'array.
  • Re: Problema con struct

    Grazie, adesso funziona! Mi chiedo solo una cosa: perchè nella funzione che ho dato io le stringhe venivano salvate? Cioè il problema era solo per gli interi, e addirittura solo al termine della funzione; provando a printare il prezzo di uno dei libri, ad esempio, prima che la funzione terminasse, il prezzo veniva visualizzato correttamente! Solo all'uscita della funzione i valori int "ritornavano" a 0...
  • Re: Problema con struct

    Il fatto che all'interno della funzione il prezzo venisse letto correttamente è normale. Però tu i cambiamenti li facevi su una COPIA della struct: una volta uscito dalla funzione questi scomparivano. Le stringhe invece erano già puntatori, quindi i cambiamenti fatti nella funzione erano persistenti.
  • Re: Problema con struct

    Grazie, adesso mi è decisamente chiaro! Io non modificavo i campi semplicemente perchè non passavo un reale indirizzo di memoria alla funzione, che quindi non possedeva i mezzi per cambiare i contenuti delle locazioni. Ottime risposte, grazie ancora
Devi accedere o registrarti per scrivere nel forum
4 risposte