Aiuto!!

di il
4 risposte

Aiuto!!

Salve a tutti domani devo consegnare questo progetto...qualcuno mi può dare un'occhiata???
grazie mille


Si supponga di voler gestire un archivio di dischi. Supponiamo di avere n categorie
musicali identificate da un codice numerico e dal nome del genere (jazz, rock, punk,
ecc..) e di disporre di possibili dischi identificati da un titolo, autore e prezzo. Per
gni categoria è possibile inserire fino a m prodotti.
Gestire l’archivio in modo tale che l’utente può
· Data una categoria inserire un nuovo disco se è possibile. Considerare anche
le posizioni dei prodotti eventualmente venduti.
· Dato solo il titolo eliminare un prodotto.
· Restituire il titolo e la categoria del disco con prezzo minore.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 5
#define N     15
typedef struct D
{
char titolo[N];
char autore[N];
int prezzo;
} Disco;
enum Categorie
{
ROCK,
JAZZ,
POP,
HOUSE,
ITALIANO,
LATINO,
CATEGORIE
};
typedef struct C
{
char genere[N];
int codice;
int dischi;
Disco disco[M];
} Categoria;
Categoria categoria[CATEGORIE]; 
Disco disco[M];
int record_inseriti;

void visualizzazione_record();
int elimina_disco(const char * titolo);
int inserimento_nuovo_record();
int trova_prezzo_minore(int * picat);
void assegna_categorie();
int main()
{
   enum {   
         inserimento,
         ordinamento_descrescente,
         visualizzazione,
		 eliminazione,
         uscita
       } operazione;
   do {
      system("cls");
      printf("Che operazione vuoi eseguire? ");
      printf("\n\t 1. Inserisci nuovo disco");
      printf("\n\t 2. Restituisci disco con prezzo minore");
      printf("\n\t 3. Visualizza tutti dischi");
	  printf("\n\t 4. Elimina un disco");
      printf("\n\t 5. Esci\n\t ");
      scanf("%d", &operazione);
      
      getchar();
     
      switch(--operazione) {
         case inserimento:
            inserimento_nuovo_record();
            break;
         case ordinamento_descrescente:
           trova_prezzo_minore();
            printf("\nIl disco con prezzo minore e' ");
            break;
         case visualizzazione:
            visualizzazione_record();
            break;
		 case eliminazione:
			 elimina_disco();
			 printf ("\n");
			 break;
         case uscita:
            break;
         default:
            printf("\nHai effettuato una scelta non valida");
      }
     
      if(operazione != uscita) {
         printf("\n\nPremi INVIO per continuare.");
         getchar();
      }

   } while(operazione != uscita);
   
   printf("\nPremi INVIO per uscire.");
   getchar();
   return 0;
}


//definizione della funzione di visualizzazione dei record
void visualizzazione_record()
{
   int i;
   
   if(!record_inseriti) {
      printf("\nNon sono presenti record all'interno della tabella.");
      return;
   }
   
   printf("\n%-15s %-15s %6s", "Titolo", "Autore", "Prezzo");
   for(i = 0; i < record_inseriti; i++) {
      printf("\n%-15s %-15s %6d", Disco[i].titolo, Disco[i].autore, Disco[i].prezzo);
   }
}


int elimina_disco(const char * titolo)
{
	int icat, idis;
	for (icat=0; icat<CATEGORIE; icat++)
	{
		int dischi = categoria[icat].dischi;
		for (idis=0; idis < dischi; idis++)
		{
			if ( strncmp(titolo, categoria[icat].disco[idis].titolo, N-1) == 0)
			{
				if ( idis != dischi-1)
					memcpy(&(categoria[icat].disco[idis]), &(categoria[icat].disco[dischi-1]), sizeof(Disco));
				categoria[icat].dischi--;
				return categoria[icat].dischi;
			}
		}
	}
	return -1;
}

int trova_prezzo_minore(int * picat)
{
	int prezzo_minore = INT_MAX;
	int icat, idis, idis_trovato=-1;
	*picat = -1;
	for (icat=0; icat<CATEGORIE; icat++)
	{
		int dischi = categoria[icat].dischi;
		for (idis=0; idis < dischi; idis++)
		{
			if ( prezzo_minore > categoria[icat].disco[idis].prezzo )
			{
				prezzo_minore = categoria[icat].disco[idis].prezzo;
				idis_trovato = idis;
				*picat = icat;
			}
		}
	}
	return idis_trovato;
} 

void assegna_categorie()
{
categoria[ROCK].codice = ROCK;
strncpy(categoria[ROCK].genere, "rock", N-1);
categoria[ROCK].dischi = 0;

categoria[JAZZ].codice = JAZZ;
strncpy(categoria[JAZZ].genere, "jazz", N-1);
categoria[JAZZ].dischi = 0;

categoria[POP].codice = POP;
strncpy(categoria[POP].genere, "pop", N-1);
categoria[POP].dischi = 0;

categoria[HOUSE].codice = HOUSE;
strncpy(categoria[HOUSE].genere, "house", N-1);
categoria[HOUSE].dischi = 0;

categoria[ITALIANO].codice = ITALIANO;
strncpy(categoria[ITALIANO].genere, "italiano", N-1);
categoria[ITALIANO].dischi = 0;

categoria[LATINO].codice = LATINO;
strncpy(categoria[LATINO].genere, "latino", N-1);
categoria[LATINO].dischi = 0;
} 
//definizione della funzione di inserimento di un nuovo record

int inserimento_nuovo_record()
{
	int iCat;
	int iCatScelta;
	int prezzo;
	char titolo[256];
	char autore[256];
	printf("scegli la categoria: \n");
	for (iCat=0; iCat<CATEGORIE; iCat++)
	{
		printf("%d) %s\n", iCat, categoria[iCat].genere);
	for(;;)
	{
		scanf("%d", &iCatScelta);
		if ( iCatScelta >= 0 || iCatScelta < CATEGORIE) break;
		printf("categoria non valida\n");
	}
	printf("inserisci il titolo: ");
	scanf("%s", titolo);
	printf("\ninserisci l'autore: ");
	scanf("%s", autore);
	printf("\ninserisci il prezzo: ");
	scanf("%d", & prezzo);
	return aggiungi_disco(categoria[iCatScelta].codice,titolo, autore, prezzo);
	} 
}

int aggiungi_disco(int codice, const char * titolo, const char * autore, int prezzo)
{
	int indice;
	if (codice < 0 || codice >= CATEGORIE) return -1;

	if (categoria[codice].dischi >= M) return -2;
	indice = categoria[codice].dischi;
	strncpy(categoria[codice].disco[indice].autore, autore, N-1);
	strncpy(categoria[codice].disco[indice].titolo, titolo, N-1);
	categoria[codice].disco[indice].prezzo = prezzo;
	categoria[codice].dischi++;
	return categoria[codice].dischi;
} 






ERRORI
C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(64) : error C2198: 'trova_prezzo_minore' : too few actual parameters
C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(71) : error C2198: 'elimina_disco' : too few actual parameters
C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(105) : error C2059: syntax error : 'type'
C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(132) : error C2065: 'INT_MAX' : undeclared identifier
C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(202) : warning C4013: 'aggiungi_disco' undefined; assuming extern returning int
Error executing cl.exe.

dd.obj - 4 error(s), 1 warning(s)

4 Risposte

  • Re: Aiuto!!

    Quali sono gli errori?

    ~Max~


    EDIT:
    Ok visto in fondo al codice...
  • Re: Aiuto!!

    Aspetta te li riscrivo...


    ERRORI
    C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(64) : error C2198: 'trova_prezzo_minore' : too few actual parameters
    C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(71) : error C2198: 'elimina_disco' : too few actual parameters
    C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(105) : error C2059: syntax error : 'type'
    C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(132) : error C2065: 'INT_MAX' : undeclared identifier
    C:\Users\Rita\Desktop\Nuova cartella (2)\dd.c(202) : warning C4013: 'aggiungi_disco' undefined; assuming extern returning int
    Error executing cl.exe.

    dd.obj - 4 error(s), 1 warning(s)
  • Re: Aiuto!!

    Gli errori sono chiaramente evidenziati.
    Rifermenti a funzioni definite in un modo e chiamate in un altro
    INT_MAX non dichiarata - si trova in <limits.h> -

    Il sorgente non mi è piaciuto per niente. Oltre agli errori identificati dal compilatore vi sono errori logici sul funzionamento.
    Io non l'ho corretto, ma modificato quasi interamente senza volerlo fare. Riconosco che sono caduto in trappola. Sistemare una funzione per controllarne una seconda, mentre scopri che la terza e la quarta non funzionano. Mi riferisco a: aggiungi_disco, trova_prezzo_minore, visualizzazione_record e main - l'unica funzione che sembra funzionare è elimina_disco.

    Ora il codice bene o male funziona pur rimanendo scritto male in partenza. Ti allego il codice corretto, sperando che tu voglia controllare e non presentare per quello che è...
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>  
    
    #define M 5
    #define N     15
    typedef struct D
    {
      char titolo[N];
      char autore[N];
      int prezzo;
    } Disco;
    enum Categorie
    {
      ROCK,
      JAZZ,
      POP,
      HOUSE,
      ITALIANO,
      LATINO,
      CATEGORIE
    };
    typedef struct C
    {
      char genere[N];
      int codice;
      int dischi;
      Disco disco[M];
    } Categoria;
    Categoria categoria[CATEGORIE]; 
    Disco disco[M];
    int record_inseriti;
    
    void assegna_categorie()
    {
      categoria[ROCK].codice = ROCK;
      strncpy(categoria[ROCK].genere, "rock", N-1);
      categoria[ROCK].dischi = 0;
    
      categoria[JAZZ].codice = JAZZ;
      strncpy(categoria[JAZZ].genere, "jazz", N-1);
      categoria[JAZZ].dischi = 0;
    
      categoria[POP].codice = POP;
      strncpy(categoria[POP].genere, "pop", N-1);
      categoria[POP].dischi = 0;
    
      categoria[HOUSE].codice = HOUSE;
      strncpy(categoria[HOUSE].genere, "house", N-1);
      categoria[HOUSE].dischi = 0;
    
      categoria[ITALIANO].codice = ITALIANO;
      strncpy(categoria[ITALIANO].genere, "italiano", N-1);
      categoria[ITALIANO].dischi = 0;
    
      categoria[LATINO].codice = LATINO;
      strncpy(categoria[LATINO].genere, "latino", N-1);
      categoria[LATINO].dischi = 0;
    } 
    
    void dsp (int cat, int dis)
    {
      printf("\n%-15s %-15s %6d", categoria[cat].disco[dis].titolo, 
                                  categoria[cat].disco[dis].autore,
                                  categoria[cat].disco[dis].prezzo);
    }
    
    int foundreks (void)
    {
      if(!record_inseriti) 
      {
        printf("\nNon sono presenti record all'interno della tabella.");
        return 0;
       }
       return 1;
    }
    
    void visualizzazione_record()
    {
      int cat,dis;
       
      if(!foundreks()) 
        return;
       
      printf("\n%-15s %-15s %6s", "Titolo", "Autore", "Prezzo");
      for (cat=0; cat<CATEGORIE; cat++)
      {
        for (dis=0; dis < categoria[cat].dischi; dis++)
          dsp (cat, dis);
       }
    }
    
    int elimina_disco()
    {
      char titolo[N];
      int icat, idis;
    
      if(!foundreks()) 
        return -1;
    
      printf ("digita il titolo:");
      scanf ("%s",titolo);
         
      for (icat=0; icat<CATEGORIE; icat++)
      {
        int dischi = categoria[icat].dischi;
        for (idis=0; idis < dischi; idis++)
        {
          if ( strncmp(titolo, categoria[icat].disco[idis].titolo, N-1) == 0)
          {
            if ( idis != dischi-1)
              memcpy(&(categoria[icat].disco[idis]), &(categoria[icat].disco[dischi-1]), sizeof(Disco));
            categoria[icat].dischi--;
            return categoria[icat].dischi;
          }
        }
      }
      
      return 0;
    }
    
    int trova_prezzo_minore()
    {
      int icat, idis;
       
      int icat_sav=0;
      int idis_sav=0;
      int prezzo_minore = INT_MAX;
       
      if(!foundreks()) 
        return -1;
    
      for (icat=0; icat<CATEGORIE; icat++)
      {
        int dischi = categoria[icat].dischi;
        for (idis=0; idis < dischi; idis++)
        {
          if ( prezzo_minore > categoria[icat].disco[idis].prezzo )
          {
            prezzo_minore = categoria[icat].disco[idis].prezzo;
            idis_sav = idis;
            icat_sav = icat;
          }
        }
      }
       
      printf("\nIl disco con prezzo minore e':\n");
      printf("\n%-15s %-15s %6s", "Titolo", "Autore", "Prezzo");
      dsp (icat_sav, idis_sav);
    
      return 0;
    } 
    
    int aggiungi_disco(int codice, const char * titolo, const char * autore, int prezzo)
    {
       int indice;
       if (codice < 0 || codice >= CATEGORIE) return -1;
       if (categoria[codice].dischi >= M) return -2;
       
       indice = categoria[codice].dischi;
       strncpy(categoria[codice].disco[indice].autore, autore, N-1);
       strncpy(categoria[codice].disco[indice].titolo, titolo, N-1);
       categoria[codice].disco[indice].prezzo = prezzo;
       categoria[codice].dischi++;
       record_inseriti++; // <---------------$$MAX
       
       return categoria[codice].dischi;
    } 
    
    int inserimento_nuovo_record()
    {
       int iCat;
       int iCatScelta;
       int prezzo;
       char titolo[N];
       char autore[N];
       
       printf("scegli la categoria: \n");
       for (iCat=0; iCat<CATEGORIE; iCat++)
       {
          printf("%d) %s\n", iCat, categoria[iCat].genere);
       }
       for(;;)
       {
          scanf("%d", &iCatScelta);
          if ( iCatScelta >= 0 || iCatScelta < CATEGORIE) break;
          printf("categoria non valida\n");
       }
       
       printf("inserisci il titolo: ");
       scanf("%s", titolo);
       printf("\ninserisci l'autore: ");
       scanf("%s", autore);
       printf("\ninserisci il prezzo: ");
       scanf("%d", & prezzo);
       return aggiungi_disco(categoria[iCatScelta].codice,titolo, autore, prezzo);
        
    }
    
    int main()
    {
      int operazione;
      enum {   
        inserimento,
        ordinamento_descrescente,
        visualizzazione,
        eliminazione,
        uscita
      };
           
      assegna_categorie ();    
       
      do {
        system("cls");
        printf("Che operazione vuoi eseguire? ");
        printf("\n\t 1. Inserisci nuovo disco");
        printf("\n\t 2. Restituisci disco con prezzo minore");
        printf("\n\t 3. Visualizza tutti dischi");
        printf("\n\t 4. Elimina un disco");
        printf("\n\t 5. Esci\n\t ");
        
        scanf("%d", &operazione);
          
        getchar();
         
        switch(--operazione) 
        {
          case inserimento:
            inserimento_nuovo_record();
            break;
          case ordinamento_descrescente:
            trova_prezzo_minore();
            break;
          case visualizzazione:
            visualizzazione_record();
            break;
          case eliminazione:
            elimina_disco();
            break;
          case uscita:
            break;
          default:
            printf("\nHai effettuato una scelta non valida");
        }
         
        if(operazione != uscita) 
        {
             printf("\n\nPremi INVIO per continuare.");
             getchar();
        }
    
      }while(operazione != uscita);
       
      printf("\nPremi INVIO per uscire.");
      getchar();
      
      return 0;
    }
    
    
  • Re: Aiuto!!

    Grazie mille!!!!
Devi accedere o registrarti per scrivere nel forum
4 risposte