Si scriva un programma in grado di gestire un listino prezzi, ovvero un
programma con cui sia possibile gestire un elenco di prodotti e i loro
relativi prezzi in €. Il programma utilizza una matrice di caratteri chiamata
warehouse di dimensione NxM per memorizzare i nomi dei prodotti
(massimo N prodotti) e un vettore di numeri decimali chiamato price di
dimensione N usato per memorizzare i prezzi dei prodotti (il prezzo
presente nell’i-esima cella di price corrisponde al prezzo del prodotto il cui
nome è memorizzato nell’i-esima riga di warehouse). Di seguito la
visualizzazione logica dei dati definiti.
Nel vettore price, il valore -2 indica linea libera (ossia nessun prodotto
nella riga corrispondente in warehouse), mentre un valore positivo indica
che la linea corrispondente in warehouse contiene un prodotto valido a cui
è stato associato un prezzo. All’avvio del programma, il vettore price è
totalmente inizializzato a -2 (ossia il listino è vuoto/non contiene prodotti).
Il programma propone all’utente un elenco di operazioni possibili
sottoforma di menu. L’utente decide quale operazione eseguire
selezionando il numero associato all’operazione di suo interesse.
Le operazioni possibili sono:
1) Inserimento di un nuovo prodotto e relativo prezzo
2) Stampa listino attuale (elenco dei prodotti con i relativi prezzi)
3) Uscita dal programma
Le prime due operazioni devono essere realizzate tramite l’invocazione
delle seguenti due funzioni di cui si forniscono prototipo e funzionalità:
? insert_product: è una funzione che permette di inserire un nuovo
prodotto e il suo prezzo nel listino (il nome del prodotto deve essere di
max M-1 caratteri). La funzione restituisce il valore 1 se il prodotto
non era ancora presente nel listino e il suo inserimento nel listino è
avvenuto con successo, 0 se già presente (ossia prodotto già inserito in
precedenza), 2 se il listino è pieno (e quindi non risulta possibile
inserire il nuovo prodotto). Se il prodotto non era ancora presente nel
listino la funzione deve inserire il suo nome nella prima cella libera
presente in warehouse e il prezzo a lui associato nella cella
corrispondente di price.
int insert_product(char warehouse[][M], float price[], int n, char new_product[],
float price_new_product);
Il parametro n corrisponde al numero di righe della matrice
warehouse, che corrisponde anche al numero di celle del vettore price
(in fase di invocazione nel nostro caso passeremo il valore N).
? print_all: è una funzione che permette di visualizzare a video il
contenuto del listino (elenco prodotti e relativi prezzi). Inoltre, la
funzione restituisce due valori (tramite due parametri passati per
indirizzo): il prezzo medio ed il prezzo massimo dei prodotti presenti
nel listino. Visualizzare a video i due valori restituiti.
void print_all(char warehouse[][M], float price[], int n, float *avg, float *max);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
#define M 50
int inserire_prodotto(char prodotti[][M], float prezzi[], int n, char nuovo_prodotto[]);
void stampa_tutto(char prodotti[][M], float prezzi[], int n, float *media, float *prezzo_max);
int main()
{
char prodotti[N][M];
float prezzi[N], *media, *prezzo_max, somma;
int menu, i, j, condizione, nprodotti, prezzo_nuovo_prodotto;
char nuovo_prodotto[M-1];
for(i=0; i<N; i++)
{
prezzi[i]=-2;
}
printf("Inserire numero prodotti : ");
scanf("%d", &nprodotti);
printf("listino prezzi annuale:\n\n");
for(i=0; i<nprodotti; i++)
{
scanf("%s %f", prodotti[i], &prezzi[i]);
}
if(nprodotti>=N)
{
printf("\n Raggiunto Numero massimo di elementi consentiti");
}
do
{
printf("\n1--> inserire nuovo prodotto e nuovo prezzo");
printf("\n2--> stampare prodotti e relativi prezzi acquisiti");
printf("\n3--> uscire dal programma\n");
scanf("%d", &menu);
switch(menu)
{
case 1:
{
condizione = inserire_prodotto(prodotti, prezzi, nprodotti, nuovo_prodotto);
if(condizione==1)
{
printf("\nlistino non ancora pieno,inserimento avvenuto");
printf("\ninserire nuovo prodotto:");
scanf("%s", nuovo_prodotto);
scanf("%d", &prezzo_nuovo_prodotto);
nprodotti++;
nuovo_prodotto[M-1] = prodotti[nprodotti][M];
prezzi[nprodotti++] = prezzo_nuovo_prodotto;
}
else
{
if(condizione==0)
printf("inserimento prodotto non possibile!\nNOME GIA' PRESENTE!");
else
printf("listino pieno");
}
break;
}
case 2:
{
prezzo_max=0;
media=0;
somma = 0;
for(i=0; i<nprodotti; i++)
{
somma = somma + prezzi[i];
}
*media = somma/nprodotti;
for(i=0; i<nprodotti-1; i++)
{
for(j=1; j<nprodotti; j++)
{
if(prezzi[i]<prezzi[j])
*prezzo_max = prezzi[j];
}
}
stampa_tutto(prodotti, prezzi, nprodotti, media, prezzo_max);
break;
}
case 3:
{
printf("fine del programma");
break;
}
default:
{
printf("\nERRORE digitazione nel menù\n");
}
}
}
while (menu!=3);
return 0;
}
int inserire_prodotto(char prodotti[][M], float prezzi[], int n, char nuovo_prodotto[])
{
int i, m;
if(n<N)
{
printf("\ninserisci nuovo prodotto:");
scanf("%s", nuovo_prodotto);
for(i=0; i<n; i++)
{
if(strcmp(prodotti[i], nuovo_prodotto)==0)
{
m=0;
break;
}
else
{
m=1;
break;
}
}
}
else
{
m=2;
}
return m;
}
void stampa_tutto(char prodotti[][M], float prezzi[], int n, float *media, float *prezzo_max)
{
int i;
for(i=0; i<n; i++)
{
printf("\n%s\t%f", prodotti[i], prezzi[i]);
}
printf("\nmedia = %f", *media);
printf("\nprezzo massimo = %f", *prezzo_max);
return;
}
Qui ho scritto il testo dell'esercizio e ciò che ho scritto io per eseguire il programma. Ci sono alcuni problemi che ho notato, come:
l'inserimento della nuova stringa nella matrice, l'esecuzione del case 2 e la quantità di nprodotti (poiché se il numero massimo di prodotti fosse 4, io ne inserisco 2, me ne fa aggiungere solo un altro con il case 1 invece che 2)