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
\mathrm{R} $100,00$. Implemente em C:
(1) Cadastrar pedido (2) Gravar pedido em arquivo (3) Sair.
- A struct Pedido com os campos mencionados anteriormente.
- A função void cadastrarPedido (Pedido *p), que preenche os dados de um pedido via teclado.
- A função float calcularValorTotal(Pedido *p), que retorna o valor total do pedido (quantidade multiplicada pelo preço unitário).
- 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.
- 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$
, e se o preço unitário é superior a R$ 100,00.
- 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.
(1) Cadastrar pedido (2) Gravar pedido em arquivo (3) Sair.
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 Pedidopara armazenar os dados, - a função
cadastrarPedidopara ler um pedido do teclado, - a função
calcularValorTotalpara retornar quantidade×preço, - a função
salvarPedidoArquivopara gravar em arquivo de texto os campos do pedido e três flags (0 ou 1), - e o
maincom 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;
}