Q. 1 (4.50) - Você foi contratado para desenvolver um sistema de gerenciamento de pedidos de uma loja virtual. Cada pedido contém os seguintes dados: código (inteiro), nome do cliente (string de até 50 caracteres), quantidade (inteiro) e preço unitário (float). Além disso, o sistema deverá realizar algumas verificações lógicas sobre o pedido, como: verificar se a quantidade solicitada está acima de um limite mínimo (por exemplo, 10 unidades); verificar se o valor total do pedido ultrapassa R 1.000,00; e verificar se o preço unitário está acima deçáá\mathrm{R} $100,00$. Implemente em C:
(1) Cadastrar pedido (2) Gravar pedido em arquivo (3) Sair.
  1. A struct Pedido com os campos mencionados anteriormente.
  2. A função void cadastrarPedido (Pedido *p), que preenche os dados de um pedido via teclado.
  3. A função float calcularValorTotal(Pedido *p), que retorna o valor total do pedido (quantidade multiplicada pelo preço unitário).
  4. A função int salvarPedidoArquivo (char nomeArquivo[], Pedido *p, int acimaLimite, int valorAlto, int precoAlto), que grava os dados do pedido em um arquivo texto no seguinte formato: código, nome do cliente, quantidade, preço unitário, valor total.
  5. Os três últimos campos devem ser 1 ou 0 , indicando verdadeiro ou falso para: se a quantidade está acima de 10 unidades, se o valor total ultrapassa R$ 1.000,00, e se o preço unitário é superior a R$ 100,00.
  6. No main, implemente um menu com as opções:
O programa deve permitir cadastrar e gravar até 5 pedidos por execução, e deve exibir mensagens adequadas em caso de erro ou sucesso na gravação.

Passo 1

O problema pede um programa em C para gerenciar até cinco pedidos por execução. Cada pedido tem código, nome do cliente, quantidade e preço unitário. Precisamos ainda verificar três condições lógicas: quantidade > 10, valor total > R$1000,00 e preço unitário > R$ 100,00. O programa terá:
  • uma struct Pedido para armazenar os dados,
  • a função cadastrarPedido para ler um pedido do teclado,
  • a função calcularValorTotal para retornar quantidade×preço,
  • a função salvarPedidoArquivo para gravar em arquivo de texto os campos do pedido e três flags (0 ou 1),
  • e o main com menu para cadastrar, salvar e sair, limitando-se a cinco gravações por execução.

Passo 2

Definimos a struct Pedido com os campos indicados. Note que reservamos 51 bytes para o nome (50 caracteres + terminador).
typedef struct {
 int codigo;
 char nome[51];
 int quantidade;
 float precoUnitario;
} Pedido;

Passo 3

Implementamos cadastrarPedido(Pedido *p) usando scanf e fgets para ler cada campo. O fgets captura o nome completo, inclusive espaços. Removemos o final se presente.
void cadastrarPedido(Pedido *p) {
 printf("Digite o codigo do pedido: ");
 scanf("%d", &p->codigo);
 getchar(); // limpar 

 printf("Digite o nome do cliente: ");
 fgets(p->nome, sizeof(p->nome), stdin);
 \(size_t\) len = strlen(p->nome);
 if (len > 0 && p->nome[len-1] \(==\) '
') {
 p->nome[len-1] = '\0';
 }
 printf("Digite a quantidade: ");
 scanf("%d", &p->quantidade);
 printf("Digite o preco unitario: ");
 scanf("%f", &p->precoUnitario);
}

Passo 4

A função calcularValorTotal retorna o produto da quantidade pelo preço unitário.
float calcularValorTotal(Pedido *p) {
 return p->quantidade * p->precoUnitario;
}

Passo 5

A função salvarPedidoArquivo abre o arquivo em modo append. Se a abertura falhar, retorna 0; caso contrário grava uma linha no formato:
codigo,nome,quantidade,precoUnitario,valorTotal,acimaLimite,valorAlto,precoAlto
e retorna 1.
int salvarPedidoArquivo(char nomeArquivo[], Pedido *p,
 int acimaLimite, int valorAlto, int precoAlto) {
 FILE *f = fopen(nomeArquivo, "a");
 if (!f) return 0;
 float total = calcularValorTotal(p);
 fprintf(f, "%d,%s,%d,%.2f,%.2f,%d,%d,%d
",
 p->codigo,
 p->nome,
 p->quantidade,
 p->precoUnitario,
 total,
 acimaLimite,
 valorAlto,
 precoAlto);
 fclose(f);
 return 1;
}

Passo 6

No main, usamos um laço do-while para exibir o menu até o usuário escolher sair. Controlamos quantos pedidos já foram salvos (savedCount) e se há um pedido pendente (hasPedido). Para cada opção, validamos limites e exibimos mensagens de sucesso ou erro conforme requisitado.
#include <stdio.h>
#include <string.h>

#define \(MAX_PEDIDOS\) 5

/* inclui aqui as definições de Pedido, cadastrarPedido,
 calcularValorTotal e salvarPedidoArquivo */

int main() {
 Pedido p;
 int opc;
 int savedCount \(=0\);
 int hasPedido \(=0\);
 char arquivo[] = "pedidos.txt";

 do {
 printf("
*** Menu ***
");
 printf("1. Cadastrar pedido
");
 printf("2. Gravar pedido em arquivo
");
 printf("3. Sair
");
 printf("Escolha uma opcao: ");
 scanf("%d", &opc);

 switch (opc) {
 case 1:
 if (savedCount < \(MAX_PEDIDOS\)) {
 cadastrarPedido(&p);
 hasPedido \(=1\);
 } else {
 printf("Limite de %d pedidos alcançado.
", \(MAX_PEDIDOS\));
 }
 break;
 case 2:
 if (!hasPedido) {
 printf("Nenhum pedido cadastrado. Use a opcao 1 primeiro.
");
 } else if (savedCount >= \(MAX_PEDIDOS\)) {
 printf("Nao e possivel gravar mais pedidos.
");
 } else {
 float total = calcularValorTotal(&p);
 int acimaLimite = (p.quantidade > 10);
 int valorAlto = (total > 1000.0f);
 int precoAlto = (p.precoUnitario > 100.0f);
 if (salvarPedidoArquivo(arquivo, &p,
 acimaLimite, valorAlto, precoAlto)) {
 printf("Pedido gravado com sucesso.
");
 savedCount\(++\);
 hasPedido \(=0\);
 } else {
 printf("Erro ao abrir o arquivo para gravacao.
");
 }
 }
 break;
 case 3:
 printf("Encerrando o programa.
");
 break;
 default:
 printf("Opcao invalida.
");
 }
 } while (opc !\(=3\));

 return 0;
}

Resposta

#include <stdio.h>
#include <string.h>

typedef struct {
 int codigo;
 char nome[51];
 int quantidade;
 float precoUnitario;
} Pedido;

void cadastrarPedido(Pedido *p) {
 printf("Digite o codigo do pedido: ");
 scanf("%d", &p->codigo);
 getchar();
 printf("Digite o nome do cliente: ");
 fgets(p->nome, sizeof(p->nome), stdin);
 \(size_t\) len = strlen(p->nome);
 if (len > 0 && p->nome[len-1] \(==\) '
') {
 p->nome[len-1] = '\0';
 }
 printf("Digite a quantidade: ");
 scanf("%d", &p->quantidade);
 printf("Digite o preco unitario: ");
 scanf("%f", &p->precoUnitario);
}

float calcularValorTotal(Pedido *p) {
 return p->quantidade * p->precoUnitario;
}

int salvarPedidoArquivo(char nomeArquivo[], Pedido *p,
 int acimaLimite, int valorAlto, int precoAlto) {
 FILE *f = fopen(nomeArquivo, "a");
 if (!f) return 0;
 float total = calcularValorTotal(p);
 fprintf(f, "%d,%s,%d,%.2f,%.2f,%d,%d,%d
",
 p->codigo,
 p->nome,
 p->quantidade,
 p->precoUnitario,
 total,
 acimaLimite,
 valorAlto,
 precoAlto);
 fclose(f);
 return 1;
}

int main() {
 Pedido p;
 int opc;
 int savedCount \(=0\);
 int hasPedido \(=0\);
 char arquivo[] = "pedidos.txt";

 do {
 printf("
*** Menu ***
");
 printf("1. Cadastrar pedido
");
 printf("2. Gravar pedido em arquivo
");
 printf("3. Sair
");
 printf("Escolha uma opcao: ");
 scanf("%d", &opc);

 switch (opc) {
 case 1:
 if (savedCount < 5) {
 cadastrarPedido(&p);
 hasPedido \(=1\);
 } else {
 printf("Limite de 5 pedidos alcançado.
");
 }
 break;
 case 2:
 if (!hasPedido) {
 printf("Nenhum pedido cadastrado. Use a opcao 1 primeiro.
");
 } else if (savedCount >\(=5\)) {
 printf("Nao e possivel gravar mais pedidos.
");
 } else {
 float total = calcularValorTotal(&p);
 int acimaLimite = (p.quantidade > 10);
 int valorAlto = (total > 1000.0f);
 int precoAlto = (p.precoUnitario > 100.0f);
 if (salvarPedidoArquivo(arquivo, &p,
 acimaLimite, valorAlto, precoAlto)) {
 printf("Pedido gravado com sucesso.
");
 savedCount\(++\);
 hasPedido \(=0\);
 } else {
 printf("Erro ao abrir o arquivo para gravacao.
");
 }
 }
 break;
 case 3:
 printf("Encerrando o programa.
");
 break;
 default:
 printf("Opcao invalida.
");
 }
 } while (opc !\(=3\));

 return 0;
}

Exercícios relacionados