Alguns produtos são elaborados utilizando-se para isso uma receita com quantidades fixas de cada ingrediente. Para esse exercício, pede-se:
a. Crie a estrutura Produto. Essa estrutura é composta por um Código (número inteiro somente para controle do sistema), um Nome e uma Unidade. Exemplo de valores para cada campo dessa estrutura: 1, “Farinha de Trigo”, “gramas”.
b. Crie a estrutura Estoque. Essa estrutura é composta por um Produto e uma Quantidade (número do tipo real).
c. Crie um vetor de Estoque para representar o estoque total de sua cozinha. Cada elemento Estoque deve ser inserido na posição do vetor que corresponde ao código de seu Produto;
d. Crie a estrutura Ingrediente. Um ingrediente é composto por um Produto e uma Quantidade (número do tipo real).
e. Crie uma estrutura para representar uma receita. Uma receita é composta por um Nome e um vetor de ingredientes.
f. Crie um vetor de receitas para representar todas as receitas existentes em sua cozinha.
g. Crie uma função que receba uma receita e o estoque total da cozinha. Essa função deve retornar 1 se existir estoque suficiente para a receita ou 0 se o estoque for insuficiente.
h. Crie uma função que receba uma receita e o estoque total da cozinha. Essa função deve subtrair do estoque da cozinha as quantidades dos respectivos itens da receita.
i. Crie uma função principal que permita ao usuário digitar o índice da receita desejada. Se existir estoque suficiente para que a receita seja feita (função criada em (e)), o sistema deve imprimir “Receita liberada!” e deve subtrair o estoque de cada ingrediente do estoque da cozinha (função criada em (f)). Se não houver estoque suficiente para a receita, o sistema deve apresentar a mensagem “Estoque insuficiente!”. O sistema deve continuar solicitando o índice da receita e tratando o estoque até que receba um índice inválido.
a. Crie a estrutura Produto. Essa estrutura é composta por um Código (número inteiro somente para controle do sistema), um Nome e uma Unidade. Exemplo de valores para cada campo dessa estrutura: 1, “Farinha de Trigo”, “gramas”.
b. Crie a estrutura Estoque. Essa estrutura é composta por um Produto e uma Quantidade (número do tipo real).
c. Crie um vetor de Estoque para representar o estoque total de sua cozinha. Cada elemento Estoque deve ser inserido na posição do vetor que corresponde ao código de seu Produto;
d. Crie a estrutura Ingrediente. Um ingrediente é composto por um Produto e uma Quantidade (número do tipo real).
e. Crie uma estrutura para representar uma receita. Uma receita é composta por um Nome e um vetor de ingredientes.
f. Crie um vetor de receitas para representar todas as receitas existentes em sua cozinha.
g. Crie uma função que receba uma receita e o estoque total da cozinha. Essa função deve retornar 1 se existir estoque suficiente para a receita ou 0 se o estoque for insuficiente.
h. Crie uma função que receba uma receita e o estoque total da cozinha. Essa função deve subtrair do estoque da cozinha as quantidades dos respectivos itens da receita.
i. Crie uma função principal que permita ao usuário digitar o índice da receita desejada. Se existir estoque suficiente para que a receita seja feita (função criada em (e)), o sistema deve imprimir “Receita liberada!” e deve subtrair o estoque de cada ingrediente do estoque da cozinha (função criada em (f)). Se não houver estoque suficiente para a receita, o sistema deve apresentar a mensagem “Estoque insuficiente!”. O sistema deve continuar solicitando o índice da receita e tratando o estoque até que receba um índice inválido.
Passo 1
O enunciado pede que a gente modele em C:
– Uma estrutura
– Uma estrutura
– Um vetor de
– Uma estrutura
– Uma estrutura
– Um vetor de
– Duas funções: uma que verifica se há estoque suficiente para uma receita e outra que subtrai as quantidades do estoque.
– Uma função
– Uma estrutura
Produto com campos inteiro codigo, string nome e string unidade.– Uma estrutura
Estoque que contenha um Produto e um double quantidade.– Um vetor de
Estoque indexado pelo código do produto, representando o estoque total.– Uma estrutura
Ingrediente com um Produto e um double quantidade.– Uma estrutura
Receita com um nome e um vetor de Ingrediente (mais um contador de quantos ingredientes).– Um vetor de
Receita para todas as receitas da cozinha.– Duas funções: uma que verifica se há estoque suficiente para uma receita e outra que subtrai as quantidades do estoque.
– Uma função
main que em loop lê o índice da receita desejada, usa as funções acima e imprime “Receita liberada!” ou “Estoque insuficiente!”, até receber índice inválido.Passo 2
Definimos as constantes de tamanhos máximos e as estruturas
Produto e Estoque em C:#include <stdio.h>
#include <string.h>
#define \(MAX_PRODUTOS\) 10
#define \(MAX_RECEITAS\) 10
#define \(MAX_INGREDIENTES\) 10
typedef struct {
int codigo;
char nome[50];
char unidade[20];
} Produto;
typedef struct {
Produto produto;
double quantidade;
} Estoque;
Passo 3
Criamos o vetor
estoqueCozinha e inicializamos alguns produtos para exemplo:Estoque estoqueCozinha[\(MAX_PRODUTOS\)];
void inicializarEstoque() {
// Exemplo com 2 produtos: código 0 e 1
estoqueCozinha[0].produto.codigo \(=0\);
strcpy(estoqueCozinha[0].produto.nome, "Farinha de Trigo");
strcpy(estoqueCozinha[0].produto.unidade, "gramas");
estoqueCozinha[0].quantidade \(=1000.0\);
estoqueCozinha[1].produto.codigo \(=1\);
strcpy(estoqueCozinha[1].produto.nome, "Acucar");
strcpy(estoqueCozinha[1].produto.unidade, "gramas");
estoqueCozinha[1].quantidade \(=500.0\);
// Zera os demais
for (int i \(=2\); i < \(MAX_PRODUTOS\); i\(++\)) {
estoqueCozinha[i].quantidade \(=0.0\);
estoqueCozinha[i].produto.codigo = i;
estoqueCozinha[i].produto.nome[0] = '\0';
estoqueCozinha[i].produto.unidade[0] = '\0';
}
}
Passo 4
Definimos a estrutura
Ingrediente:typedef struct {
Produto produto;
double quantidade;
} Ingrediente;
Passo 5
Definimos
Receita, criamos um vetor de receitas e inicializamos um exemplo:typedef struct {
char nome[50];
Ingrediente ingredientes[\(MAX_INGREDIENTES\)];
int numIngredientes;
} Receita;
Receita receitas[\(MAX_RECEITAS\)];
int numReceitas \(=0\);
void inicializarReceitas() {
// Exemplo: receita \(0=\) "Bolo Simples", usa farinha e acucar
strcpy(receitas[0].nome, "Bolo Simples");
receitas[0].numIngredientes \(=2\);
receitas[0].ingredientes[0].produto = estoqueCozinha[0].produto;
receitas[0].ingredientes[0].quantidade \(=200.0\); // 200 g farinha
receitas[0].ingredientes[1].produto = estoqueCozinha[1].produto;
receitas[0].ingredientes[1].quantidade \(=100.0\); // 100 g açúcar
numReceitas \(=1\);
}
Passo 6
Implementamos a função que verifica se há estoque suficiente para uma receita:
int verificaEstoque(const Receita *r, Estoque estoque[]) {
for (int i \(=0\); i < r->numIngredientes; i\(++\)) {
int cod = r->ingredientes[i].produto.codigo;
double qtdNecessaria = r->ingredientes[i].quantidade;
if (estoque[cod].quantidade < qtdNecessaria) {
return 0; // insuficiente
}
}
return 1; // suficiente
}
Passo 7
Implementamos a função que, assumindo estoque suficiente, subtrai as quantidades:
void usarReceita(const Receita *r, Estoque estoque[]) {
for (int i \(=0\); i < r->numIngredientes; i\(++\)) {
int cod = r->ingredientes[i].produto.codigo;
estoque[cod].quantidade -= r->ingredientes[i].quantidade;
}
}
Passo 8
Montamos a função
main que faz o loop de interação com o usuário:int main() {
inicializarEstoque();
inicializarReceitas();
while (1) {
printf("Digite o indice da receita (0 a %d) ou -1 para sair: ", numReceitas - 1);
int idx;
if (scanf("%d", &idx) !\(=1\) || idx < 0 || idx >= numReceitas) {
break; // índice inválido ou fim de arquivo -> sai
}
if (verificaEstoque(&receitas[idx], estoqueCozinha)) {
printf("Receita liberada!\
");
usarReceita(&receitas[idx], estoqueCozinha);
} else {
printf("Estoque insuficiente!\
");
}
}
printf("Sistema encerrado.\
");
return 0;
}
Resposta
Segue o código completo reunindo todos os passos acima:
#include <stdio.h>
#include <string.h>
#define \(MAX_PRODUTOS\) 10
#define \(MAX_RECEITAS\) 10
#define \(MAX_INGREDIENTES\) 10
typedef struct {
int codigo;
char nome[50];
char unidade[20];
} Produto;
typedef struct {
Produto produto;
double quantidade;
} Estoque;
typedef struct {
Produto produto;
double quantidade;
} Ingrediente;
typedef struct {
char nome[50];
Ingrediente ingredientes[\(MAX_INGREDIENTES\)];
int numIngredientes;
} Receita;
Estoque estoqueCozinha[\(MAX_PRODUTOS\)];
Receita receitas[\(MAX_RECEITAS\)];
int numReceitas \(=0\);
void inicializarEstoque() {
estoqueCozinha[0].produto.codigo \(=0\);
strcpy(estoqueCozinha[0].produto.nome, "Farinha de Trigo");
strcpy(estoqueCozinha[0].produto.unidade, "gramas");
estoqueCozinha[0].quantidade \(=1000.0\);
estoqueCozinha[1].produto.codigo \(=1\);
strcpy(estoqueCozinha[1].produto.nome, "Acucar");
strcpy(estoqueCozinha[1].produto.unidade, "gramas");
estoqueCozinha[1].quantidade \(=500.0\);
for (int i \(=2\); i < \(MAX_PRODUTOS\); i\(++\)) {
estoqueCozinha[i].quantidade \(=0.0\);
estoqueCozinha[i].produto.codigo = i;
estoqueCozinha[i].produto.nome[0] = '\0';
estoqueCozinha[i].produto.unidade[0] = '\0';
}
}
void inicializarReceitas() {
strcpy(receitas[0].nome, "Bolo Simples");
receitas[0].numIngredientes \(=2\);
receitas[0].ingredientes[0].produto = estoqueCozinha[0].produto;
receitas[0].ingredientes[0].quantidade \(=200.0\);
receitas[0].ingredientes[1].produto = estoqueCozinha[1].produto;
receitas[0].ingredientes[1].quantidade \(=100.0\);
numReceitas \(=1\);
}
int verificaEstoque(const Receita *r, Estoque estoque[]) {
for (int i \(=0\); i < r->numIngredientes; i\(++\)) {
int cod = r->ingredientes[i].produto.codigo;
if (estoque[cod].quantidade < r->ingredientes[i].quantidade) {
return 0;
}
}
return 1;
}
void usarReceita(const Receita *r, Estoque estoque[]) {
for (int i \(=0\); i < r->numIngredientes; i\(++\)) {
int cod = r->ingredientes[i].produto.codigo;
estoque[cod].quantidade -= r->ingredientes[i].quantidade;
}
}
int main() {
inicializarEstoque();
inicializarReceitas();
while (1) {
printf("Digite o indice da receita (0 a %d) ou -1 para sair: ", numReceitas - 1);
int idx;
if (scanf("%d", &idx) !\(=1\) || idx < 0 || idx >= numReceitas) {
break;
}
if (verificaEstoque(&receitas[idx], estoqueCozinha)) {
printf("Receita liberada!\
");
usarReceita(&receitas[idx], estoqueCozinha);
} else {
printf("Estoque insuficiente!\
");
}
}
printf("Sistema encerrado.\
");
return 0;
}