Salve a tutti mi sto approcciando al linguaggio C e sbirciando degli esercizi ho trovato questo.
Un file contiene l’elenco degli ingredienti di una ricetta con i relativi pesi,
nel seguente formato: h ingrediente unit`a di misura quantit`a i. Le unit`a di misura possibili sono l
(litri), g (grammi) e u (unit`a). Come esempio si consideri il seguente file.
latte l 0.25
farina g 300
olio l 0.05
uova u 2
burro g 50
yogurt g 50
Si consideri inoltre la seguente dichiarazione, con un esempio di vettore di record del tipo, che contiene
i pesi specifici (in grammi) degli ingredienti liquidi e i pesi medi degli ingredienti misurati in unit`a (ad
esempio le uova). Le unit`a di misura di riferimento sono le stesse utilizzate nel file della ricetta. Non `e
previsto l’uso n´e di multipli (es. kg) n´e di sottomultipli (es. ml).
struct PesiSpecifici
{
char ingrediente[32];
float peso;
};
struct PesiSpecifici V[4] = {{"latte", 1000}, {"olio", 950}, {"acqua", 1000}, {"uova", 75.0} };
che contiene i pesi specifici (in grammi) degli ingredienti liquidi e i pesi medi degli ingredienti misurati
in unit`a (ad esempio le uova). Le unit`a di misura di riferimento sono le stesse utilizzate nel file della
ricetta. Non `e previsto l’uso n´e di multipli (es. kg) n´e di sottomultipli (es. ml).
Si scriva una funzione C che riceva come parametri:
1. il nome del file che contiene l’elenco degli ingredienti della ricetta
2. il vettore di pesi specifici
3. la lunghezza del vettore dei pesi specifici
e restituisce il peso totale del composto.
Nell’esempio, supponendo che il vettore dei pesi specifici passato alla funzione sia il vettore V sopra
dichiarato la funzione deve restituire il valore 847.5.
La soluzione è la seguente sempre leggendo la dispensa
La funzione che risolve l’esercizio, chiamata PesoTotale(), si compone di un semplice ciclo di lettura dal
file, in cui ad ogni iterazione si legge una riga e si calcola il peso dell’ingrediente.
Si noti che, per una buona modularit`a, la ricerca di un ingrediente nel vettore `e delegata ad una
funzione ausiliaria.
Si noti inoltre che, per maggiore generalit`a, si `e supposto che l’unit`a di misura possa essere anche pi`u
lunga di un carattere (fino a tre caratteri).
Si noti infine che non c’`e differenza tra ingredienti espressi in unit`a oppure in litri: per entrambi si
moltiplica il peso per il loro peso specifico.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 32
struct PesiSpecifici
{
char ingrediente[DIM];
float peso;
};
float PesoTotale(char nomefile[], struct PesiSpecifici pesi[], int n_pesi);
int CercaIngrediente(char nome_ingrediente[], struct PesiSpecifici pesi[], int n_pesi);
/* non richiesto per il compito in classe */
int main (int argc, char *argv[])
{
struct PesiSpecifici pesi[4] = {
{"latte", 1000},
{"olio", 950},
{"acqua", 1000},
{"uova", 75.0}
};
if (argc != 2)
{
printf("E‘ richiesto il nome del file\n");
exit(1);
}
printf("Peso totale: %f\n", PesoTotale(argv[1], pesi, 4));
return 0;
}
float PesoTotale (char nomefile[], struct PesiSpecifici pesi[], int n_pesi)
{
FILE *fp;
float quantita, peso_totale = 0.0;
char ingrediente[DIM], unita[4];
int indice_ingrediente;
fp = fopen (nomefile, "r");
while (fscanf (fp, "%s %s %f", ingrediente, unita, &quantita) != EOF)
{
if (strcmp(unita,"g") == 0)
peso_totale += quantita;
else
{
/* cerca il peso specifico */
indice_ingrediente = CercaIngrediente(ingrediente, pesi, n_pesi);
peso_totale += pesi[indice_ingrediente].peso * quantita;
}
}
fclose (fp);
return peso_totale;
}
int CercaIngrediente(char nome_ingrediente[], struct PesiSpecifici pesi[], int n_pesi)
{
int i;
for (i = 0; i < n_pesi; i++)
if (strcmp(nome_ingrediente, pesi.ingrediente) == 0)
return i;
return -1;
}
Andando a sviluppare il tutto invece del risultato chiesto nella console mi appare è richiesto il nome del file. Mi potete aiutare?