PDA

View Full Version : Aiuto esercizio (puntatori e funzioni)


gargoyle00
26-05-2011, 01:48
non riesco a capire come funzionano i puntatori!

qui la traccia dell'esercizio:

Si scriva un programma in grado di gestire un listino prezzi, ovvero deve
gestire un elenco di prodotti e i loro relativi prezzi in €. Il programma
utilizza su una matrice di caratteri chiamata warehouse di dimensione
NxM e un vettore di numeri decimali chiamato price di dimensione N.

Nel vettore price, il valore -2 indica linea libera, -1 indica che la linea
contiene un prodotto valido a cui non è stato ancora attribuito un prezzo.
All’avvio del programma, il vettore price è totalmente inizializzato a -2.
Il programma deve permettere all'utente di invocare tramite menu le
seguenti operazioni per manipolare il listino:

a. insert_product: è una funzione che permette di includere un nuovo
prodotto nel listino; restituisce il valore 1 se il prodotto non era ancora
presente, 0 se già inserito in precedenza; il prezzo associato al nuovo
prodotto è -1

int insert_product(char products[][M], float price[], int n, char new_product[]);

b. print_all: è una funzione che permette di visualizzare a video il
contenuto del listino. Inoltre, la funzione restituisce 2 valori: il prezzo
medio ed il prezzo massimo

void print_all(char products[][M], float price[], int n, float *avg, float *max);

c. update_product: è una funzione che permette di aggiornare il prezzo
di uno specifico prodotto; restituisce 1 se l’aggiornamento è avvenuto
con successo, 0 se il prodotto non esiste.

int update_product(char products[][M], float price[], int n, char product[], int new_price);

d. remove_product: è una funzione che permette di rimuovere un
prodotto dal listino; restituisce 1 se la rimozione è avvenuto con
successo, 0 se il prodotto non esiste; la funzione deve impostare il
valore -2 nel vettore prezzi in corrispondenza dell’elemento rimosso

int remove_product(char products[][M], float price[], int n, char old_product[]);


qui la mia risoluzione commentata passo passo:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//definisco le costanti per le righe e le colonne della matrice.
#define N 10
#define M 30

//definisco i prototipi delle funzioni che userò
int insert_product(char products[][M], float price[], char new_product[]);
void print_all(char products[][M], float price[], float *avg, float *max);
int update_product(char products[][M], float price[], char product[], char new_price[]);
int remove_product(char *products[][M], float *price[], char old_product[]);

int main()
{
// definisco gli elementi basilari del programma
char warehouse [N] [M+1], prodotto[M+1];
float prezzo [N];

//definisco alcune variabili di supporto
char linea[3];
int i, comando, exit=0;

//definisco delle variabili che mi serviranno nei vari case dello switch
int caso;
float media, massimo;
char nuovo_prezzo[M+1];

//inizializzo i valori del vettore prezzo a -2 (che indica nessun prodotto ancora inserito)
for(i=0;i<N;i++)
prezzo[i]=-2.00;
//stampo un menu' con le varie opzioni disponibili
// e rimango in loop fintanto che comando sara' != 5
do
{
caso=-1;
printf("- Digita (1) per inserire un nuovo prodotto\n");
printf("- Digita (2) per stampare la lista prodotti\n");
printf("- Digita (3) per modificare il prezzo di un prodotto\n");
printf("- Digita (4) per eliminare un prodotto\n");
printf("- Digita (5) per uscire\n");
printf("\n Inserisci il comando: ");

//acquisisco una stringa di caratteri che poi converto in intero per navigare nel menu'
gets(linea);
comando=atoi(linea);

//in base al valore che assume 'comando' entro in una sezione del menu'
switch(comando)
{
//se comando = 1
case 1:
//salvo il valore di ritorno di 'insert_product'
caso=insert_product(warehouse, prezzo, prodotto);
//se il ritorno è = a 1
if(caso==1)
//vuol dire che ho inserito un nuovo prodotto nel warehouse
puts("\n\tHai inserito un nuovo prodotto.\n");
//se il ritorno è = a 0
else if(caso==0)
//vuol dire che l'elemento è già presente nel warehouse
puts("\n\tHai gia' inserito questo prodotto.\n");
//se si eseguisse mai il seguente caso, vuol dire che c'è un bug nel programma!!!
else if(caso==-1)
puts("\nERRORE!!!\n");
break;
//se comando = 2
case 2:
//eseguo la funzione
print_all(warehouse, prezzo, media, massimo); /* MI DA ERRORRE DI SINTASSI, XKE????*/
//e stampo cio' che ho elaborato in questa, cioe' media e prezzo max
printf("\n\tIl prezzo medio e' %.2f || Quello massimo e' %.2f\n\n", media, massimo);
break;
//se comando = 3
case 3:
//eseguo la funzione
caso=update_product(warehouse,prezzo,prodotto,nuovo_prezzo);
//se ottengo un riscontro, aggiorno il prezzo da dentro e la funzione
if(caso==1)
printf("\n\tPrezzo Aggiornato!\n");
//se non ottengo riscontro e' perche' l'oggetto non e' presente nel warehouse
else if(caso==0)
printf("\n Il prodotto inserito non e' presente nel warehouse.\n\n");
//se si eseguisse mai il seguente caso, vuol dire che c'è un bug nel programma!!!
else if(caso==-1)
puts("\nERRORE!!!\n");
break;
//come [caso 3]
case 4: /* !!!!NON FUNGE!!!!*/
caso=remove_product(warehouse,prezzo,prodotto);
if(caso==1)
printf("\n\tProdotto Rimosso!\n");
else if(caso==0)
printf("\n Il prodotto inserito non e' presente nel warehouse.\n\n");
else if(caso==-1)
puts("\nERRORE!!!\n");
break;
//se comando=5 allora esco
case 5:
exit=1;
break;
//qualsiasi altro valore di comando non sara' accettato e riporterà ad inizio ciclo
default:
puts("\nil comando inserito non e' valido. Riprova!\n");
break;
}
}
while(exit==0);

return 0;
}

//Da qui in poi definisco le funzioni

// CASE 1 - INSERIRE UN NUOVO PRODOTTO
int insert_product(char products[][M], float price[], char new_product[])
{
//'duplicato' mi segnalerà se ho elementi già presenti nel warehouse
//'risultato' rappresenterà il valore di ritorno della funzione
//'i' è un contatore per il ciclo for
int duplicato=0, risultato=-1, i;
//chiedo di inserire l'elemento e lo acquisisco
printf("\nInserisci il nuovo prodotto: ");
gets(new_product);
//tramite ciclo for scandisco il warehouse finché non arrivero' alla fine del warehouse
//o scoprirò che l'elemento immesso è un doppione o ancora se ho stabilito che non è doppione
for( i=0 ;(i<N) && (duplicato==0) && (risultato==-1); i++ )
{
//se il prezzo è diverso da -2 vuol dire che è stato già immesso un rispettivo elemento 'i' nel warehouse
if(price[i]!=-2)
{
//controllo se il nuovo elemento e' gia' presente fra tutti gli elementi immessi
if(strcmp(new_product, products[i])==0)
{
//se e' cosi, vuol dire che ho un doppione:
//con 'duplicato=1' esco dal ciclo for e ritorno 'risultato=0' a significare che ho un doppione
duplicato=1; risultato=0;
}
}
//se arrivo ad un elemento con prezzo = a 2, vuol dire che non ho trovato alcun doppione
else if(price[i]==-2)
{
//dunque copio il nuovo elemento nel warehouse
strcpy(products[i],new_product);
//mi segno che ho assegnato questa posizione ad un elemento e ritorno l'acquisizione di un nuovo elemento.
price[i]=-1; risultato=1;
}
}
return risultato;
}

// CASE 2 - STAMPARE LISTA PRODOTTI E CALCOLO MEDIA
void print_all(char products[][M], float price[], float *avg, float *max)
{
//'i' è un contatore per il ciclo for
int i;
//stampo una tabella prodotto/prezzo
printf("\n\t[prodotto]\t[prezzo]\n\n");
for(i=0;price[i]!=-2;i++)
{
//riga per riga con elemento del warehouse e prezzo
printf("\t[%s]\t\t[%.2f euro]\n", products[i], price[i]);
//sommo tutti i prezzi e li vado a memorizzare nella cella di memoria puntata
avg=avg+price[i];
//e vado ad analizzare qual'e' il prezzo max confrontandolo passo passo
if(price[i]>max)
max=price[i];
}
//dunque divido il contenuto del puntatore (la media) per il numero di interazioni (elementi)
avg=avg/i;
//non ritorno niente, perché ho riscritto i valori direttamente nelle celle di memoria di avg, la variabile dichiarata nel main.
return;
}

// CASE 3 - MODIFICARE PREZZI
int update_product(char products[][M], float price[], char product[], char new_price[])
{
//'i' è un contatore per il ciclo for
//'risultato' rappresenterà il valore di ritorno della funzione
int i, risultato=-1;

printf("\n Inserisci prodotto di cui si vuole modificare il prezzo: ");
gets(product);
//scandisco la matrice di caratteri e vedo se il prodotto inserito e' nel warehouse
for(i=0 ; (i<N) && ((strcmp(product,products[i]))!=0) && (price[i]!=-2) ; i++);
//verifico se sono uscito dal for perche' ho effettivamente trovato il prodotto inserito
if((strcmp(product,products[i]))==0)
{
//se si, chiedo di modificare il prezzo
printf("\n Inserisci il prezzo in euro: ");
gets(new_price);
//converto il prezzo in un valore float e ritorno '1' in quanto ho avuto un riscontro
price[i]=atof(new_price);
risultato=1;
}
//altrimenti ritorno '0' poiche' non ho avuto alcun riscontro
else
risultato=0;

return risultato;
}

// CASE 4 - ELIMINARE VOCI !!!NON VA!!!
int remove_product(char *products[][M], float *price[], char old_product[])
{
//'i' è un contatore per il ciclo for
//'risultato' rappresenterà il valore di ritorno della funzione
int i, risultato=-1;


printf("\n Inserisci prodotto che si vuole eliminare: ");
gets(old_product);
//scandisco la matrice di caratteri e vedo se il prodotto inserito e' nel warehouse
for(i=0 ; (i<N) && ((strcmp(old_product,products[i]))!=0) && (price[i]!=-2) ; i++);
//verifico se sono uscito dal for perche' ho effettivamente trovato il prodotto inserito
if((strcmp(old_product,products[i]))==0)
{
for( ;price[i]==-2;i++)
{
strcpy(products[i],products[i+1]);
price[i]=price[i+1];
}
risultato=1;
}
//altrimenti ritorno '0' poiche' non ho avuto alcun riscontro
else
risultato=0;

return risultato;
}



i problemi nel mio codice sono relativi:
- al case 4: (non riesco a cancellare le stringhe)... il mio ragionamento è di "scalare" di una posizione tutte le stringhe della matrice successive a quella scelta, in maniera da sovrascriverla

- al case 2: mi da errori di compilazione che non riesco a capire! come funzionano sti maledetti puntatori??? :\

in più ci sono warning un po' sparsi dappertutto :\... grazie mille a chi tenterà di aiutarmi :P


EDIT - RISOLTO!!! potete chiudere