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)