AJUDA: LISTAR DATAS EM C [RESOLVIDO]

1. AJUDA: LISTAR DATAS EM C [RESOLVIDO]

Gustavo Samuel Bacagine Azevedo
Bacagine

(usa Arch Linux)

Enviado em 09/07/2020 - 14:47h

Olá a todos
Eu e meus amigos estamos desenvolvendo um programa em C que simula um banco
O programa deve cadastrar as movimentações em uma conta (Saque ou Deposito) e salvá-las em um arquivo binário
Após o cadastro o usuário pode listar as movimentações que ocorreram em uma conta.
A listagem funciona da seguinte forma:
O usuário digita duas datas de um período no qual será mostrado para ele as movimentações que ocorreram nesse período.
Ao digitarmos a primeira data como 07/07/2020 e a segunda como 09/07/2020 o programa nos retorna a seguinte saída:

Não estamos conseguindo entender o motivo de isto estar ocorrendo
A forma como estamos listando as datas é essa:

fprintf(stdout, "\tMovimentacoes Cadastradas\n");
fprintf(stdout, "***********************************************\n");
fprintf(stdout, "#Data Tipo Valor \n");
fprintf(stdout, "***********************************************\n");
count = 0;
// Lê o arquivo e busca pelo codigo digitado
while(fread(&movimentation, sizeof(movimentacao), 1, arq_mov) > 0){
/* Verifica se o número da conta é igual ao numero ditidato
* pelo usuário */
if((movimentation.num_conta == num_conta) != 0){
/* Compara a data da movimentacao com a data inicial */
dt_i = compara_datas(movimentation.dt_movimentacao, dt_inicial);
/* Compara a data da movimentacao com a data final */
dt_f = compara_datas(movimentation.dt_movimentacao, dt_final);
/* Verifica se as datas são
* iguais ou diferentes */
if(dt_i == 0 || dt_f == 0 || dt_f == -1){
/* Se o tipo de movimentacao
* for do tipo 1, será mostrado
* para o usuario saque */
if(movimentation.tipo == 1){
fprintf(stdout, "%02d/%02d/%02d %-8.8s R$%.2f\n",
movimentation.dt_movimentacao.dia, movimentation.dt_movimentacao.mes, movimentation.dt_movimentacao.ano, tipo[0], movimentation.valor);
}
/* Se o tipo de movimentacao
* for do tipo 2, será mostrado
* para o usuário deposito */
else if(movimentation.tipo == 2){
fprintf(stdout, "%02d/%02d/%02d %-8.8s R$%.2f\n",
movimentation.dt_movimentacao.dia, movimentation.dt_movimentacao.mes, movimentation.dt_movimentacao.ano, tipo[1], movimentation.valor);
}
/* Caso seja encontrado
* alguma movimentacao
* será adicionado +1
* ao contador */
count++;
}
}
}
fprintf(stdout, "***********************************************\n");



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/07/2020 - 22:10h

Estou tendo dificuldade de achar a função que analisa as datas.

Enquanto procurava, notei que a função clear_buffer() tem um erro: o tipo da variável c tem de ser int. Caso contrário, a comparação com EOF pode falhar (tanto falsos positivos quanto falsos negativos, dependendo do sistema).

Achei. O bug não está nela (ela poderia ser escrita de modo muito mais sucinto, mas não chega a estar errada).

O bug, portanto, está na forma como você faz o teste das datas. Você usa ou-lógico de três condições. Era de se esperar um e-lógico de apenas duas condições, diferentes das que você usou. Não vou dizer exatamente como deveria ficar porque acho que você pode pensar e descobrir, mas deixo duas dicas adicionais: você *não quer* usar o operador de comparação ==; tem de ser outros operadores.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: AJUDA: LISTAR DATAS EM C

Nick Us
Nick-us

(usa Slackware)

Enviado em 09/07/2020 - 20:25h

Bacagine escreveu:
Não estamos conseguindo entender o motivo de isto estar ocorrendo

1) Dizer exatamente o que está ocorrendo vai te ajudar muito mais, para que outros entendam a pergunta! Nem todos vão adivinhar o resultado da imagem!

2) Postar o Código completo também ajuda! Pq quem vai responder pode debugar para entender melhor porque não está funcionando o seu filtro!

3) Nem mesmo a função que COMPARA datas está presente em seu código! E qual é o problema? DATAS né?

Da forma como vc postou, somente pessoas que tenham um conhecimento mais avançado, vão calcular matematicamente o seu código e saber analisar o porque seu filtro não funciona, IMAGINANDO que seja possível analisar sem a função que faz a comparação de datas!


4. Re: AJUDA: LISTAR DATAS EM C [RESOLVIDO]

Gustavo Samuel Bacagine Azevedo
Bacagine

(usa Arch Linux)

Enviado em 09/07/2020 - 20:51h

Nick-us escreveu:

Bacagine escreveu:
Não estamos conseguindo entender o motivo de isto estar ocorrendo

1) Dizer exatamente o que está ocorrendo vai te ajudar muito mais, para que outros entendam a pergunta! Nem todos vão adivinhar o resultado da imagem!

2) Postar o Código completo também ajuda! Pq quem vai responder pode debugar para entender melhor porque não está funcionando o seu filtro!

3) Nem mesmo a função que COMPARA datas está presente em seu código! E qual é o problema? DATAS né?

Da forma como vc postou, somente pessoas que tenham um conhecimento mais avançado, vão calcular matematicamente o seu código e saber analisar o porque seu filtro não funciona, IMAGINANDO que seja possível analisar sem a função que faz a comparação de datas!


Aqui está o código fonte completo: https://github.com/Bacagine/LP-Trab02-2020-1


5. Re: AJUDA: LISTAR DATAS EM C [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 09/07/2020 - 21:54h

Bacagine escreveu:Aqui está o código fonte completo: https://github.com/Bacagine/LP-Trab02-2020-1

Vou tentar te ajudar, mas to vendo que vai dar trabalho! Visto que cada pessoa programa do seu próprio jeito né! Não é uma crítica isso!
Já compilei, fiz um teste rápido cadastrando 1 conta com 2 datas de movimentação!
Vou isolar o pedaço agora necessário para filtrar o range das datas e ver porque ele está ignorando o filtro e capturando toda a movimentação!




6. Re: AJUDA: LISTAR DATAS EM C [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 09/07/2020 - 22:48h

Bom com o Source ficou mais fácil estudar! Mas vc vai ficar surpreso! Pq EU fiquei!

1) Vc pede ao usuário para definir o período que deseja ser mostrado! Então... Se entendi o que vc quer fazer é que seja mostrado apenas as transações dentro desse período! E no caso de sua imagem abaixo, Entendi que não deveria estar exibindo a data 05/07/2020!

Se entendi correto acima, me INFORMA, pois estou respondendo baseado no que entendi acima!

Agora vamos ao trecho que vc mostrou abaixo!
Bacagine escreveu:
            /* Compara a data da movimentacao com a data inicial */
dt_i = compara_datas(movimentation.dt_movimentacao, dt_inicial);
/* Compara a data da movimentacao com a data final */
dt_f = compara_datas(movimentation.dt_movimentacao, dt_final);
/* Verifica se as datas são
* iguais ou diferentes */
if(dt_i == 0 || dt_f == 0 || dt_f == -1){
/* Se o tipo de movimentacao
* for do tipo 1, será mostrado
* para o usuario saque */
if(movimentation.tipo == 1){
fprintf(stdout, "%02d/%02d/%02d %-8.8s R$%.2f\n",
movimentation.dt_movimentacao.dia, movimentation.dt_movimentacao.mes, movimentation.dt_movimentacao.ano, tipo[0], movimentation.valor);
}
/* Se o tipo de movimentacao
* for do tipo 2, será mostrado
* para o usuário deposito */
else if(movimentation.tipo == 2){
fprintf(stdout, "%02d/%02d/%02d %-8.8s R$%.2f\n",
movimentation.dt_movimentacao.dia, movimentation.dt_movimentacao.mes, movimentation.dt_movimentacao.ano, tipo[1], movimentation.valor);

Você quer o resultado FILTRADO, mas ONDE você colocou o filtro no seu código dentro do trecho acima??? Que Filtro? Ele não existe!
Pois é! Fiquei SURPRESO! Você não criou nenhum FILTRO! Apenas mandou imprimir TODAS as Movimentações! Entendeu agora????

ANTES de vc mandar imprimir a movimentação, SEJA saque ou dépósito, você precisa informar que é para imprimir SOMENTE entre as datas escolhidas! Vai precisar que a Data de Movimentação seja MAIOR ou IGUAL a Data inicial digitada pelo usuário e a Data de movimentação final seja MENOR ou IGUAL a data final digitada pelo usuário!

É isso que está errado no seu programa! Está faltando esse pedacinho de código (Criar o Filtro) antes de imprimir!


7. Re: AJUDA: LISTAR DATAS EM C [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 09/07/2020 - 22:58h

Apenas uma dica de como trabalhar com Data, mas isso você já sabe, mas serve para ajudar outras pessoas visto que sua pergunta é sobre data!
#include <stdio.h>
#include <string.h>
int main() {
char Data1[] = "2020-07-05";
char Data2[] = "2020-07-09";

if(strcmp(Data1 , Data2 ) < 0)
puts("Data1 é Menor que Data2");
else
puts("Data1 é Maior que Data2");
}

Existem muitas formas de comparar datas, a forma acima estão em um vetor de char que muitos acham fácil de usar!


8. Re: AJUDA: LISTAR DATAS EM C [RESOLVIDO]

Gustavo Samuel Bacagine Azevedo
Bacagine

(usa Arch Linux)

Enviado em 09/07/2020 - 23:02h

Nick-us escreveu:

Bom com o Source ficou mais fácil estudar! Mas vc vai ficar surpreso! Pq EU fiquei!

1) Vc pede ao usuário para definir o período que deseja ser mostrado! Então... Se entendi o que vc quer fazer é que seja mostrado apenas as transações dentro desse período! E no caso de sua imagem abaixo, Entendi que não deveria estar exibindo a data 05/07/2020!

Se entendi correto acima, me INFORMA, pois estou respondendo baseado no que entendi acima!

Agora vamos ao trecho que vc mostrou abaixo!
Bacagine escreveu:
            /* Compara a data da movimentacao com a data inicial */
dt_i = compara_datas(movimentation.dt_movimentacao, dt_inicial);
/* Compara a data da movimentacao com a data final */
dt_f = compara_datas(movimentation.dt_movimentacao, dt_final);
/* Verifica se as datas são
* iguais ou diferentes */
if(dt_i == 0 || dt_f == 0 || dt_f == -1){
/* Se o tipo de movimentacao
* for do tipo 1, será mostrado
* para o usuario saque */
if(movimentation.tipo == 1){
fprintf(stdout, "%02d/%02d/%02d %-8.8s R$%.2f\n",
movimentation.dt_movimentacao.dia, movimentation.dt_movimentacao.mes, movimentation.dt_movimentacao.ano, tipo[0], movimentation.valor);
}
/* Se o tipo de movimentacao
* for do tipo 2, será mostrado
* para o usuário deposito */
else if(movimentation.tipo == 2){
fprintf(stdout, "%02d/%02d/%02d %-8.8s R$%.2f\n",
movimentation.dt_movimentacao.dia, movimentation.dt_movimentacao.mes, movimentation.dt_movimentacao.ano, tipo[1], movimentation.valor);

Você quer o resultado FILTRADO, mas ONDE você colocou o filtro no seu código dentro do trecho acima??? Que Filtro? Ele não existe!
Pois é! Fiquei SURPRESO! Você não criou nenhum FILTRO! Apenas mandou imprimir TODAS as Movimentações! Entendeu agora????

ANTES de vc mandar imprimir a movimentação, SEJA saque ou dépósito, você precisa informar que é para imprimir SOMENTE entre as datas escolhidas! Vai precisar que a Data de Movimentação seja MAIOR ou IGUAL a Data inicial digitada pelo usuário e a Data de movimentação final seja MENOR ou IGUAL a data final digitada pelo usuário!

É isso que está errado no seu programa! Está faltando esse pedacinho de código (Criar o Filtro) antes de imprimir!


Sim, era exatamente isto que estava querendo dizer
Muito obrigado pela ajuda. Consegui terminar o trabalho a tempo
Nos não tinhamos entendido como deveria ter sido feito o filtro, muito obrigado a todos



9. Re: AJUDA: LISTAR DATAS EM C [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 09/07/2020 - 23:04h

Apenas também para esclarecer:
if(dt_i == 0 || dt_f == 0 || dt_f == -1){ 

Esse trecho acima não é um Filtro de Datas! Os Valores de retorno das datas anterior a isso é -1.
Então não existe uma Data Inicial e nem uma Data Final definida ou Filtrada para imprimir!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts