Codifique um programa que manipule um arquivo contendo registros descritos pelos seguintes campos: codigo_vendedor, nome_vendedor, valor_da_venda e mes.
A manipulação do arquivo em questão é feita através da execução das operações disponibilizadas pelo seguinte menu:
  • Criar o arquivo de dados;
  • Incluir um determinado registro no arquivo;
  • Excluir um determinado vendedor no arquivo;
  • Alterar o valor de uma venda no arquivo;
  • Imprimir os registros na saída padrão;
  • Excluir o arquivo de dados;
  • Finalizar o programa.
Os registros devem estar ordenados no arquivo, de forma crescente, de acordo com as informações contidas nos campos codigo_vendedor e mes. Não deve existir mais de um registro no arquivo com mesmos valores nos campos codigo_vendedor e mês.

Passo 1

Primeiro, o programa manipula um arquivo binário de registros com os campos codigo_vendedor (int), nome_vendedor (string de até 50 chars), valor_da_venda (float) e mes (int). Precisamos manter esse arquivo sempre ordenado por codigo_vendedor e, em caso de empate, por mes. Vamos usar operações básicas de arquivo em C, structs e um vetor dinâmico em memória para facilitar inserção, exclusão e alteração mantendo a ordem e sem duplicatas.

Passo 2

Criamos uma struct Venda e funções auxiliares para carregar todos os registros do arquivo em um array dinâmico, e para gravar de volta esse array (sempre em ordem). A comparação entre dois registros é feita primeiro pelo codigo_vendedor e, se igual, pelo mes.
No main() fazemos um loop exibindo o menu (1 a 7), lemos a opção com scanf e usamos switch() para chamar cada operação. O loop só termina quando o usuário escolher “Finalizar programa” (opção 7).

Passo 3

Para criar o arquivo de dados (opção 1), abrimos-o em modo “wb” (cria ou zera) e fechamos imediatamente, garantindo que existirá um arquivo vazio.

Passo 4

Para incluir um registro (opção 2), lemos os dados do usuário, carregamos todos os registros no vetor, checamos se já existe o par (codigo_vendedor, mes) para evitar duplicata, então inserimos o novo registro na posição correta (busca linear ou binária pelo ponto de inserção), e gravamos o vetor inteiro de volta ao arquivo.

Passo 5

Para excluir um vendedor (opção 3), pedimos codigo_vendedor e mes, carregamos o vetor, filtramos todos os registros diferentes desse par, e regravamos o arquivo com o vetor filtrado. Se não encontrarmos nada para excluir, informamos ao usuário.

Passo 6

Para alterar o valor de uma venda (opção 4), pedimos codigo_vendedor, mes e novo valor, carregamos o vetor, buscamos o registro correspondente, atualizamos o campo valor_da_venda, e sobrescrevemos o arquivo. Se não achar, avisamos que não existe.

Passo 7

Para imprimir os registros na saída padrão (opção 5), abrimos o arquivo em “rb”, lemos registro a registro e imprimimos formatado (codigo, nome, valor e mes).

Passo 8

Para excluir o arquivo de dados (opção 6), usamos a função remove(nome_arquivo) do C, e informamos se deu certo ou não.

Passo 9

Em cada uma das operações que regravamos o arquivo, garantimos a ordenação usando a comparação por codigo_vendedor e mes antes de fwrite de todo o vetor.
A seguir, o código completo em C com todas essas funções.

Resposta

#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#define MAX_NOME 50\n#define ARQUIVO “vendas.dat”\n\ntypedef struct {\n int codigo_vendedor;\n char nome_vendedor[MAX_NOME];\n float valor_da_venda;\n int mes;\n} Venda;\n\nint comparar(const void *a, const void *b) {\n const Venda *v1 = a;\n const Venda v2 = b;\n if (v1->codigo_vendedor != v2->codigo_vendedor)\n return v1->codigo_vendedor - v2->codigo_vendedor;\n return v1->mes - v2->mes;\n}\n\n// Carrega todos os registros do arquivo em um vetor dinâmico. Retorna número de registros via ponteiro e vetor via retorno.\nVenda carregar(int *n) {\n FILE *f = fopen(ARQUIVO, “rb”);\n Venda *vet = NULL;\n *n = 0;\n if (!f) return NULL;\n fseek(f, 0, SEEK_END);\n long tam = ftell(f);\n int qtd = tam / sizeof(Venda);\n rewind(f);\n vet = malloc(qtd * sizeof(Venda));\n if (qtd > 0) fread(vet, sizeof(Venda), qtd, f);\n fclose(f);\n *n = qtd;\n return vet;\n}\n\n// Grava vetor de vendas no arquivo, sobrescrevendo tudo.\nvoid gravar(Venda *vet, int n) {\n qsort(vet, n, sizeof(Venda), comparar);\n FILE *f = fopen(ARQUIVO, “wb”);\n if (!f) { perror(“Erro ao abrir arquivo”); return; }\n fwrite(vet, sizeof(Venda), n, f);\n fclose(f);\n}\n\nvoid criar_arquivo() {\n FILE *f = fopen(ARQUIVO, “wb”);\n if (!f) perror(“Erro ao criar arquivo”);\n else fclose(f), printf(“Arquivo criado/zerado com sucesso!\n”);\n}\n\nvoid incluir() {\n Venda nova;\n printf(“Codigo do vendedor: “); scanf(”%d”, &nova.codigo_vendedor);\n printf(“Nome do vendedor: “); scanf(” %49[^”]", nova.nome_vendedor);\n printf(“Valor da venda: “); scanf(”%f”, &nova.valor_da_venda);\n printf(“Mes da venda (1-12): “); scanf(”%d”, &nova.mes);\n int n;\n Venda *vet = carregar(&n);\n // verifica duplicata\n for (int i = 0; vet && i < n; i++) {\n if (vet[i].codigo_vendedornova.codigo_vendedor && vet[i].mesnova.mes) {\n printf(“Registro ja existe!\n”); free(vet); return;\n }\n }\n vet = realloc(vet, (n+1)*sizeof(Venda));\n vet[n++] = nova;\n gravar(vet, n);\n free(vet);\n printf(“Registro incluido!\n”);\n}\n\nvoid excluir_registro() {\n int cod, mes;\n printf(“Codigo do vendedor a excluir: “); scanf(”%d”, &cod);\n printf(“Mes da venda a excluir: “); scanf(”%d”, &mes);\n int n, j = 0;\n Venda *vet = carregar(&n), *aux;
if (!vet) { printf(“Arquivo nao encontrado!\n”); return; }
aux = malloc(n * sizeof(Venda));
for (int i = 0; i < n; i++) {
if (!(vet[i].codigo_vendedorcod && vet[i].mesmes)) {
aux[j++] = vet[i];
}
}
free(vet);
if (j==n) { printf(“Registro nao existe!\n”); free(aux); return; }
gravar(aux, j);
free(aux);
printf(“Registro excluido!\n”);
}
void alterar() {
int cod, mes;
float novo;
printf(“Codigo do vendedor a alterar: “); scanf(”%d”, &cod);
printf(“Mes da venda a alterar: “); scanf(”%d”, &mes);
printf(“Novo valor da venda: “); scanf(”%f”, &novo);
int n;
Venda *vet = carregar(&n);
if (!vet) { printf(“Arquivo nao encontrado!\n”); return; }
int achou = 0;
for (int i = 0; i < n; i++) {
if (vet[i].codigo_vendedorcod && vet[i].mesmes) {
vet[i].valor_da_venda = novo;
achou = 1;
break;
}
}
if (!achou) { printf(“Registro nao encontrado!\n”); free(vet); return; }
gravar(vet, n);
free(vet);
printf(“Valor alterado com sucesso!\n”);
}
void imprimir() {
FILE *f = fopen(ARQUIVO, “rb”);
if (!f) { printf(“Arquivo nao existe!\n”); return; }
Venda v;
printf("— Registros de vendas —\n");
while (fread(&v, sizeof(Venda), 1, f)==1) {
printf(“Codigo: %d | Nome: %s | Valor: %.2f | Mes: %d\n”,
v.codigo_vendedor, v.nome_vendedor, v.valor_da_venda, v.mes);
}
fclose(f);
}
void excluir_arquivo() {
if (remove(ARQUIVO)==0) printf(“Arquivo removido!\n”);
else printf(“Erro ao remover arquivo ou arquivo nao existe.\n”);
}
int main() {
int opc;
do {
printf("\n----- Menu -----\n");
printf(“1. Criar arquivo de dados\n”);
printf(“2. Incluir registro\n”);
printf(“3. Excluir registro\n”);
printf(“4. Alterar valor da venda\n”);
printf(“5. Imprimir registros\n”);
printf(“6. Excluir arquivo de dados\n”);
printf(“7. Finalizar programa\n”);
printf(“Escolha uma opcao: “); scanf(”%d”, &opc);
switch(opc) {
case 1: criar_arquivo(); break;
case 2: incluir(); break;
case 3: excluir_registro(); break;
case 4: alterar(); break;
case 5: imprimir(); break;
case 6: excluir_arquivo(); break;
case 7: printf(“Finalizando…\n”); break;
default: printf(“Opcao invalida!\n”);
}
} while(opc != 7);
return 0;
}

Exercícios relacionados