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.

Passo 1

O enunciado pede que a gente modele em C:
– 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;
}

Exercícios relacionados