Spiegazioni esercizio C

di il
9 risposte

Spiegazioni esercizio C

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?

9 Risposte

  • Re: Spiegazioni esercizio C

    Usa i tag CODE, che altrimenti parte il corsivo e non si capisce nulla
  • Re: Spiegazioni esercizio C

    Weierstrass ha scritto:


    Usa i tag CODE, che altrimenti parte il corsivo e non si capisce nulla
    Mi servirebbe aiuto per l’esercizio postato qui sopra.
  • Re: Spiegazioni esercizio C

    delietta88 ha scritto:


    Weierstrass ha scritto:


    Usa i tag CODE, che altrimenti parte il corsivo e non si capisce nulla
    Mi servirebbe aiuto per l’esercizio postato qui sopra.
    Appunto. metti il codice qui dentro (tasto </>)
  • Re: Spiegazioni esercizio C

    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: ingrediente unita di misura quantita . Le unita di misura possibili sono l
    (litri), g (grammi) e u (unita). 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 unita (ad
    esempio le uova). Le unita di misura di riferimento sono le stesse utilizzate nel file della ricetta. Non e
    previsto l’uso ne di multipli (es. kg) ne 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 unita di misura di riferimento sono le stesse utilizzate nel file della
    ricetta. Non e previsto l’uso ne di multipli (es. kg) ne 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.


    ora si visualizza?
  • Re: Spiegazioni esercizio C

    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 modularita, la ricerca di un ingrediente nel vettore e delegata ad una
    funzione ausiliaria.
    Si noti inoltre che, per maggiore generalita, si e supposto che l’unita di misura possa essere anche piu
    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);

    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)
    {
    70FILE *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
    {

    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;
    }



    per avere il risultato di 847.5 che ci devo mettere nella riga printf?
  • Re: Spiegazioni esercizio C

    Non lo vedi che il codice non viene visualizzato correttamente?

    Dovevi fare semplicemente questo:
    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;
    }
    Hai fatto un main che richiede gli argomenti, quindi o glieli passi tramite la linea di comando della console o modifichi il main per usarlo senza argomenti
    int main (int argc, char *argv[]){
    	struct PesiSpecifici pesi[4] = {
    		{"latte", 1000},
    		{"olio", 950},
    		{"acqua", 1000},
    		{"uova", 75.0}
    	};
    
    	char nomefile[] = "c:\\test.txt";
    	printf("Peso totale: %f\n", PesoTotale(nomefile, pesi, 4));
    	return 0;
    }
  • Re: Spiegazioni esercizio C

    Weierstrass ha scritto:


    Non lo vedi che il codice non viene visualizzato correttamente?

    Dovevi fare semplicemente questo:
    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;
    }
    Hai fatto un main che richiede gli argomenti, quindi o glieli passi tramite la linea di comando della console o modifichi il main per usarlo senza argomenti
    int main (int argc, char *argv[]){
    	struct PesiSpecifici pesi[4] = {
    		{"latte", 1000},
    		{"olio", 950},
    		{"acqua", 1000},
    		{"uova", 75.0}
    	};
    
    	char nomefile[] = "c:\\test.txt";
    	printf("Peso totale: %f\n", PesoTotale(nomefile, pesi, 4));
    	return 0;
    }
    se ho chiesto aiuto essendo alle primissime armi. quindi devo sostituire con quello che mi hai scritto nel secondo quadro? ricorda che mi deve dare come risultato 847.50
  • Re: Spiegazioni esercizio C

    Ti ho risposto alla domanda iniziale spiegando perché il programma si fermava subito, ma ovviamente devi andare avanti tu... compreso il nome del file giusto
  • Re: Spiegazioni esercizio C

    Spero di riuscirci
    grazie per l’aiuto
Devi accedere o registrarti per scrivere nel forum
9 risposte