Uma empresa armazena seu cadastro de produtos no arquivo produtos.txt, que contém os seguintes dados: código do produto (int), código do fornecedor (int) e preço de venda (float). Esta empresa armazena no arquivo fornecedores.txt os seguintes dados dos fornecedores: código do fornecedor (int), código do produto fornecido (int) e preço do produto fornecido (float). Observar que um fornecedor pode fornecer mais de um produto. Escrever um programa que lê do usuário um número de produto e mostra:
Produto: xxx Fornecedor: xxx Compra: xxxx.xx Venda: xxxx.xx
ou, caso o produto não exista no arquivo produtos.txt:
O produto xxx nao existe!

Passo 1

O enunciado pede um programa em C que, dado um código de produto digitado pelo usuário, procure esse produto no arquivo produtos.txt (que contém: código do produto, código do fornecedor e preço de venda), e, se existir, recupere também o preço de compra no arquivo fornecedores.txt (que contém: código do fornecedor, código do produto e preço de compra). O conteúdo da matéria é manipulação de arquivos em C, leitura de registros com fscanf e estruturas de controle para busca.

Passo 2

Lemos do usuário um inteiro com scanf, que será o código do produto que queremos buscar. Armazenamos esse valor em uma variável (por exemplo,
inputproduto).

Passo 3

Abrimos o arquivo produtos.txt em modo leitura (fopen com “r”). Se fopen retornar NULL, encerramos com mensagem de erro. Caso contrário, lemos linha a linha com
fscanf(fprod, "%d %d %f", &codigoproduto, &codfornecedor, &precovenda) == 3
Em cada iteração comparamos codigoproduto lido com inputproduto. Se iguais, marcamos que o produto foi encontrado, guardamos codfornecedor e precovenda, e saímos do loop. Após o loop, fechamos o arquivo. Se não encontramos o produto, imprimimos
O produto %d nao existe!
e retornamos.

Passo 4

Se o produto existe, abrimos fornecedores.txt em modo leitura da mesma forma. Lemos cada linha com
fscanf(fforn, "%d %d %f", &codfornecedorf, &codprodutof, &precocompra) == 3
e comparamos codfornecedorf com o fornecedor obtido anteriormente e codprodutof com inputproduto. Quando ambos coincidem, guardamos precocompra e saímos do loop. Depois fechamos o arquivo.

Passo 5

Por fim, usamos printf para exibir exatamente:
Produto: %d Fornecedor: %d Compra: %.2f Venda: %.2f
Onde imprimimos inputproduto, o fornecedor, o preço de compra com duas casas decimais e o preço de venda com duas casas decimais.
O programa trata de erros de abertura de arquivo, verifica existência do produto e formata corretamente a saída conforme enunciado.

Resposta

#include <stdio.h>
#include <stdlib.h>
int main() {
int input_produto;
int codigo_produto, cod_fornecedor;
float preco_venda, preco_compra;
FILE *fprod, *fforn;
int encontrado = 0;
printf("Digite o codigo do produto: ");
scanf("%d", &input_produto);

fprod = fopen("produtos.txt", "r");
if (fprod == NULL) {
    printf("Erro ao abrir arquivo produtos.txt\n");
    return 1;
}

while (fscanf(fprod, "%d %d %f", &codigo_produto, &cod_fornecedor, &preco_venda) == 3) {
    if (codigo_produto == input_produto) {
        encontrado = 1;
        break;
    }
}
fclose(fprod);

if (!encontrado) {
    printf("O produto %d nao existe!\n", input_produto);
    return 0;
}

fforn = fopen("fornecedores.txt", "r");
if (fforn == NULL) {
    printf("Erro ao abrir arquivo fornecedores.txt\n");
    return 1;
}

int cod_fornec_f, cod_produto_f;
int achou = 0;
while (fscanf(fforn, "%d %d %f", &cod_fornec_f, &cod_produto_f, &preco_compra) == 3) {
    if (cod_fornec_f == cod_fornecedor && cod_produto_f == input_produto) {
        achou = 1;
        break;
    }
}
fclose(fforn);

if (!achou) {
    printf("Fornecedor %d nao fornece o produto %d\n", cod_fornecedor, input_produto);
    return 0;
}

printf("Produto: %d Fornecedor: %d Compra: %.2f Venda: %.2f\n",
       input_produto, cod_fornecedor, preco_compra, preco_venda);

return 0;
}

Exercícios relacionados