Ir ao conteúdo

C Relatório de produtos de supermercado


Ir à solução Resolvido por Julia_Lucia,

Posts recomendados

Postado

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?

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...