Ir ao conteúdo
  • Cadastre-se

C Relatório de produtos de supermercado


Julia_Lucia
Ir à solução Resolvido por Julia_Lucia,

Posts recomendados

Olá, estou com dificuldade para resolver o seguinte problema:

Um supermercado possui vários relatórios antigos em formato de texto (.txt) e precisa modificá-los de uma forma eficiente. Cada arquivo de relatório contém uma lista de produtos, onde cada linha representa um produto. Cada produto têm 3 atributos, nome (sem espaços), código, e preço unitário, separados por espaço. Cada relatório terá o formato como do exemplo abaixo:

cafe 11 6.42

leite 43 3.2

feijao -1 6.7 o

leo 234 6.0

peixe 1 38383749.2

 

Entretanto muitos produtos de cada relatório estão corrompidos, código igual a -1 ou valores absurdos (valor acima de 9999.0). Você foi contratado para solucionar esse problema, para isso você deve construir um programa que execute os seguintes passos:

• Inicializar um vetor que representa uma lista de produtos;

• Ler um relatório chamado “relatorio_corrompido.txt”

• Imprimir os produtos válidos;

• Salvar a lista de produtos válidos no arquivo “relatorio_processado.txt”.

 

Apresente um programa em C que solucione o problema do supermercado segundo as regras abaixo:

1) Criar uma estrutura para representar os produtos do supermercado, esta estrutura deve conter: Nome – string, Código – int, e Preço unitário – float

2) Criar uma função para imprimir uma lista de produtos. Produtos inválidos não devem ser impressos.

3) Criar uma função que lê os produtos de um arquivo txt e coloca em um vetor de produtos. A função deve receber como entrada um vetor de produtos e uma string que representa o nome do arquivo.

4) Criar uma função que escreve para um arquivo txt os produtos válidos e não corrompidos presentes na lista do mercado. A função deve receber como entrada um vetor de produtos e uma string que representa o nome do arquivo.

5) Realizar os passos para solucionar o problema do mercado usando a estrutura “produto” e chamando as funções criadas nos tópicos 1 a 4 na função main:

   a. Inicializar um vetor que possui uma lista de produtos;

   b. Ler um relatório chamado “relatorio_corrompido.txt” e armazenar em um vetor de produtos;

   c. Imprimir os produtos válidos;

   d. Salvar a lista de produtos validos e não corrompidos no arquivo “relatorio_processado.txt”.

 

Restrições do seu programa:

• O tamanho máximo do nome de um produto é 128 caracteres considerando o caractere ‘\0’. Ou seja 127 + ‘\0’.

• A capacidade máxima do supermercado é de 32768 produtos;

• Os vetores devem ser passados para as funções por referência.

 

Desenvolvi isso aqui:

#include <stdio.h>

#define MAX_PRODUTOS 2064
#define PRODUTO_INVALIDO -1

typedef struct
{
    char nome[128];
    int codigo;
    float preco;
}produto;


void imprime_produto(produto pr)
{
    printf("%s ", pr.nome);
    printf("%d ", pr.codigo);
    printf("Preço unitário: %.2f\n", pr.preco);
}

void leitura_produtos(char *relatorio_corrompido, produto*produtos)
{
    FILE *ac = fopen(relatorio_corrompido, "r");

    if (ac != NULL)
    {
        int elements = 0;
        for(int i = 0 ; i < MAX_PRODUTOS ; i++, elements++)
        {
            produto pr;
            int retorno = fscanf(ac, "%s %d %f", pr.nome, &pr.codigo, &pr.preco);
            produtos[i] = pr;
            if (feof(ac) || retorno != 5)
            {
                break;
            }
        }
        for(int i = elements; i < MAX_PRODUTOS; i++)
        {
            produtos[i].codigo = PRODUTO_INVALIDO;
        }
        fclose(ac);
        }
        else
        {
            printf("Arquivo %s nao foi aberto\n", relatorio_corrompido);
            exit(-1);
        }
    }

void imprime_produtos(produto *produtos)
    {
        for(int i = 0; i < MAX_PRODUTOS; i++)
        {
            if (produtos[i].codigo != PRODUTO_INVALIDO && produtos[i].preco <= 9999.0)
            {
            imprime_produto(produtos[i]);
            }
        }
    }

void escreve_produtos(char *relatorio_processado, produto *produtos)
    {
        FILE *ap = fopen(relatorio_processado, "w");

        if (ap !=NULL)
        {
            for(int i = 0 ; i < MAX_PRODUTOS; i++)
            {
                produto a = produtos[i];

                if (a.codigo != PRODUTO_INVALIDO && a.preco <= 9999.0)
                {
                    fprintf(ap, "%s %d %.2f", a.nome, a.codigo, a.preco);
                }
            }
            fclose(ap);
        }
        else
        {
            printf("Arquivo %s nao foi aberto\n", relatorio_processado);
            exit(-1);
        }
    }


int main(){
    char nome_entrada[] = "relatorio_corrompido.txt";
    char nome_saida[] = "relatorio_processado.txt";

    produto produtos[MAX_PRODUTOS];
    leitura_produtos(nome_entrada, produtos);
    imprime_produtos(produtos);
    escreve_produtos(nome_saida, produtos);
return 0;
}

Alguém sabe o que estou errando?

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...