Ir ao conteúdo
  • Cadastre-se

C Psquisar por data em c


solracm

Posts recomendados

Oi,

 


Sou reativamente novo em programacao, estou criando um trabalho em c para a escola em que se tem de inserir dados de atividades desportivas realizadas como numero, data de inicio, atividade, etc mas estou tendo algumas dificuldades em pesquisar/ listar por data, ja andei pesquisando e ate agora não encontrei nada similar alguém consegue ajudar? tambem estou com algumas dificuldades em calcular a media de tempos...
 

d

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TAM 100
typedef struct HORA
{
 int h;
 int m;
}hr;
typedef struct data
{
 int dia;
 int mes;
 int ano;
}DATA;
typedef struct dados
{
 int numero;
 char atividade[50];
 char estado;
 float tempo;
 DATA data;
 hr hora;
}Atleta;
int menu()
{
 int op;
 do
 {
 printf("1-Inserir atividade\n");
 printf("2-Quantidade de Praticantes num determinado periodo\n");
 printf("3 -Listagem de Praticantes em um determinado periodo \n");
 printf("4-Atividades Realizadas por praticante em um determinado periodo\n");
 printf("5- Media de tempos de cada praticante\n");
 printf("0-Sair\n");
 printf("Opcao?");
 scanf("%d", &op);
 } while ((op < 0) || (op > 10));
 return(op);
}
int existe(Atleta Guardar[], int quantidade, int numero)
{
 int i;
 for (i = 0; i < quantidade; i++)
 {
 if (Guardar[i].numero == numero) return(i);
 }
 return(-1);
}
int guardar(Atleta Guardar[], int posicao, Atleta a)
{
 if ((posicao >= 0) && (posicao < TAM) && (existe(Guardar, posicao, a.numero) == -1))
 {
 Guardar[posicao] = a;
 return(1);
 }
 else return(0);
}
Atleta lerplaneamento()
{
 Atleta a;
 int res;
 do
 {
 res = 0;
 printf("Numero?"); res += scanf("%d", &a.numero); while ((getchar()) != '\n');
 printf("Data de inicio(dd/mm/ano)?"); res += scanf("%d %d %d", &a.data.dia, &a.data.mes, &a.data.ano); while ((getchar()) != '\n');
 printf("Hora de Inicio?"); res += scanf("%d %d", &a.hora.h, &a.hora.m); while ((getchar()) != '\n');
 printf("Data fim de atividade(dd/mm/ano)?"); res += scanf("%d %d %d", &a.data.dia, &a.data.mes, &a.data.ano); while ((getchar()) != '\n');
 printf("Hora de fim de atividade?"); res += scanf("%d %d", &a.hora.h, &a.hora.m); while ((getchar()) != '\n');
 printf("Atividade?"); res += scanf("%[^\n]", a.atividade); while ((getchar()) != '\n');
 printf("tempo?"); res += scanf("%2f", &a.tempo); while ((getchar()) != '\n');
 a.estado = 1;
  return(a);
 } while (res != 7);
}
int main()
{
 Atleta Dados[TAM];
 Atleta a;
 int quantidade = 0;
 int opcao, resultado;
 do
 {
 opcao = menu();
 switch (opcao)
 {
 case 1:   a = lerplaneamento();
 resultado = guardar(Dados, quantidade, a);
 if (resultado == 1)
 {
 printf("Dados Inseridos\n");
 quantidade++;
 }
 break;
 break;
 case 2: 
 break;
 case 3: 
 break;
 case 4: break;
 case 5: break;
 default:
 ;
 }
 } while (opcao != 0);
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@solracm    creio que seja melhor pegar a data separada  , por exemplo primeiro pega o Dia  depois O Mês , e depois o Ano

printf("Data de inicio(dd/mm/ano) ?  \n");
printf("o Dia ");
res += scanf("%d", &a.data.dia );
printf("o Mes ");
res += scanf("%d", &a.data.mes );
printf("o Ano ");
res += scanf("%d", &a.data.ano);
printf("val Res= %d\n",res);
printf("Data-> %d/%d/%d\n",a.data.dia,a.data.mes,a.data.ano);/// verif se dados estão certos

e na hora de pesquisar  compare com  esses mesmos dados .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@solracm Sem indentação fica mais difícil de ler o código, não dá pra identificar os escopos, não dá pra saber onde começa e onde termina uma chave, etc. Tem que ficar procurando cada coisa, e provavelmente o ambiente que usa já indenta automaticamente, não se esforce pra dificultar a legibilidade.

 

17 horas atrás, solracm disse:
 printf("Numero?"); res += scanf("%d", &a.numero); while ((getchar()) != '\n');
 printf("Data de inicio(dd/mm/ano)?"); res += scanf("%d %d %d", &a.data.dia, &a.data.mes, &a.data.ano); while ((getchar()) != '\n');
 printf("Hora de Inicio?"); res += scanf("%d %d", &a.hora.h, &a.hora.m); while ((getchar()) != '\n');
 printf("Data fim de atividade(dd/mm/ano)?"); res += scanf("%d %d %d", &a.data.dia, &a.data.mes, &a.data.ano); while ((getchar()) != '\n');
 printf("Hora de fim de atividade?"); res += scanf("%d %d", &a.hora.h, &a.hora.m); while ((getchar()) != '\n');
 printf("Atividade?"); res += scanf("%[^\n]", a.atividade); while ((getchar()) != '\n');
 printf("tempo?"); res += scanf("%2f", &a.tempo); while ((getchar()) != '\n');

Você também pode (e deve) pular linhas para separar algumas coisas, e evite colocar mais de uma instrução numa linha, isso só aumenta o comprimento da linha e dificulta a legibilidade, então só coloque se for algo curto.

 

Deixe sempre a main como a primeira função, acima dela só os protótipos das demais.

Agora, sobre a forma que está lendo:

17 horas atrás, solracm disse:
printf("Data de inicio(dd/mm/ano)?"); res += scanf("%d %d %d", &a.data.dia, &a.data.mes, &a.data.ano); while ((getchar()) != '\n');

Colocar espaços na string de formatação da scanf só vai fazer com que ela ignore caracteres de espaço em branco. Se quer ignorar o caractere / ou algum outro, use um especificador assim: %*c. Isso vai ler e ignorar um caractere, não importa qual seja.

Esses loops while chamando a getchar() são desnecessários, colocar um espaço como primeiro caractere na string de formatação da scanf() que já basta, vai ignorar um eventual \n que sobre no fluxo de entrada.

 

#define TAM 100

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct HORA
{
    int h;
    int m;
} hr;

typedef struct data
{
    int dia;
    int mes;
    int ano;
} DATA;

typedef struct dados
{
    int numero;
    char atividade[51];
    char estado;
    float tempo;
    DATA data;
    hr hora;
} Atleta;

int menu(void);
int existe(Atleta Guardar[], int quantidade, int numero);
int guardar(Atleta Guardar[], int posicao, Atleta a);
Atleta lerplaneamento(void);

int main()
{
    Atleta Dados[TAM];
    Atleta a;
    int quantidade = 0;
    int opcao, resultado;
    
    do
    {
        opcao = menu();
        switch (opcao)
        {
            case 1:
                a = lerplaneamento();
                resultado = guardar(Dados, quantidade, a);
                
                if (resultado == 1)
                {
                    printf("Dados Inseridos\n");
                    quantidade++;
                }
                
                break;
            case 2: 
                break;
            case 3: 
                break;
            case 4:
                break;
            case 5:
                break;
            default:
            ;
        }
    } while (opcao != 0);
    
    return 0;
}

int menu(void)
{
    int op;
    
    do
    {
        printf("1 - Inserir atividade\n");
        printf("2 - Quantidade de Praticantes num determinado periodo\n");
        printf("3 - Listagem de Praticantes em um determinado periodo \n");
        printf("4 - Atividades Realizadas por praticante em um determinado periodo\n");
        printf("5 - Media de tempos de cada praticante\n");
        printf("0 - Sair\n");
        printf("Opcao: ");
        scanf("%d", &op);
    } while ((op < 0) || (op > 5));
    
    return(op);
}

int existe(Atleta Guardar[], int quantidade, int numero)
{
    int i;
    for (i = 0; i < quantidade; i++)
    {
        if (Guardar[i].numero == numero) return(i);
    }
    
    return(-1);
}

int guardar(Atleta Guardar[], int posicao, Atleta a)
{
    if ((posicao >= 0) && (posicao < TAM) && (existe(Guardar, posicao, a.numero) == -1))
    {
        Guardar[posicao] = a;
        return(1);
    }
    else return(0);
}

Atleta lerplaneamento(void)
{
    Atleta a;
    int res;
    
    do
    {
        res = 0;
        printf("Numero: ");
        res += scanf(" %d", &a.numero);

        printf("Data de inicio (dd/mm/ano): ");
        res += scanf(" %d%*c%d%*c%d", &a.data.dia, &a.data.mes, &a.data.ano);

        printf("Hora de Inicio (hh:mm): ");
        res += scanf(" %d%*c%d", &a.hora.h, &a.hora.m);

        printf("Data fim de atividade (dd/mm/ano): ");
        res += scanf(" %d%*c%d%*c%d", &a.data.dia, &a.data.mes, &a.data.ano);

        printf("Hora de fim de atividade (hh:mm): ");
        res += scanf(" %d%*c%d", &a.hora.h, &a.hora.m);

        printf("Atividade: ");
        res += scanf(" %50[^\n]", a.atividade);

        printf("tempo?");
        res += scanf(" %2f", &a.tempo);
        
        a.estado = 1;
        
        return(a);
    } while (res != 7);
}

 

17 horas atrás, solracm disse:

estou tendo algumas dificuldades em pesquisar/ listar por data

Peça uma data ao usuário e com um loop, compare a data com as demais já cadastradas. Se tiver alguma equivalente, é só listar.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

 

typedef struct HORA
{
    int h;
    int m;
}hr;
typedef struct data
{
    int dia;
    int mes;
    int ano;
}DATA;
typedef struct dados
{
    int numero;
    char atividade[50];
    char estado;
    float tempo;
    DATA data;
    hr hora;
}Atleta;

 

  • Porque essas estruturas não são todas anônimas? 
  • Porque uma tem o nome todo em minúsculas e outro em todas maiúsculas?
  • Há uma convenção popular em C de reservar apenas a primeira letra em maiúscula para esses nomes. Ou usar algo como um prefixo ou sufixo, como `_t`.

Escreva em torno dos dados

 

Se os dados são Atleta e o grupo de Atletas porque não tem isso no programa? Claro que vai fazer falta. Muita falta.

Todos esses programas para iniciantes a partir dos realmente primitivos giram em torno de uma coleção de dados. com seria chamada em java. Um container, como seria chamado em C++. 

 

Uma pequena mudança em seu programa e ele poderia começar assim:
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM 100

typedef struct {
  char hh;
  char mm;
  char ss;
} Hora;

typedef struct {
  char dia;
  char mes;
  short ano;
} Data;

typedef struct {
  char hh;
  char mm;
  float fss;
} Marca;

typedef struct {
  int numero;
  char atividade[50];
  char estado[2];
  Data data;
  Hora hora;
  Marca marca;
} Atleta;

int existe(Atleta Guardar[], int quantidade, int numero);
int guardar(Atleta Guardar[], int posicao, Atleta a);
Atleta lerplaneamento();
int menu();

 

Dentro de alguma convenção e agora com as funções apenas descritas no início, com `main` como a primeira função, se possível em um arquivo separado.

 

Mas onde estão os atletas?

 

O programa trata um grupo de atletas. Se não tiver isso no programa fica tudo mais difícil...

Composição de dados, encapsulamento, esses são os nomes chiques dessas coisas nos livros.

 

typedef struct
{
    unsigned N;
    unsigned cap;
    Atleta atl[MAX_ATL];
} Atletas;


Imagine a diferença que isso faria ANTES de começar a escrever seu programa.

 

`Atletas` é seu container. Todas as funções operam em Atletas. Encapsulamento.

 

 

    Atleta* fab_atleta();

 

Imagine uma função assim, que a cada vez que você chama retorna um Atleta. Já pode começar a testar o programa em 10 minutos. Antes de tudo

Seu programa não está bom. Tem muitos problemas ainda. Em especial leia sobre scanf() no manual. Está errado o que escreveu. scanf() retorna -1 em caso de erro, ou o TOTAL de especificadores atendidos.

 

Manual: sobre scanf() em português

 

Sugiro reescrever considerando essas coisas.

 

Nunca escreva um programa interativo. Só vai perder tempo.

Não coloque um menu em um programa que não está pronto

Entenda que um printf() de 10 linhas deve ser umas 200x mais rápido e simples que 10 printf() de uma linha
 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, solracm disse:

muito obrigado pelas dicas, ainda estou aprendendo, por isso algumas coisas ainda não percebo muito bem, mas ja consegui ter uma melhor noção para futuros projetos

 

Percebeu as coisas que listei? Conserte esse projeto. Não deixe para os próximos. Só o trabalho que vai ter por continuar com esse assim já compensaria seu esforço.

 

Veja esse programa simples

 

int main(void)
{
    // testa para um atleta
    Atleta exemplo = fab_atleta();
    mostra_atleta(&exemplo, "\n\tteste em main()\n");
    // cria uma equipe e mostra
    Atletas grupo = {.cap = MAX_ATL, .N = 0};
    mostra_atletas(&grupo, "\n\tSem atletas ainda\n");
    // insere ate não caber
    exemplo = fab_atleta();
    while (guarda(&exemplo, &grupo) >= 0)
        exemplo = fab_atleta();  // +1
    // mostra
    mostra_atletas(&grupo, "\n\tGrupo Lotado??\n\n");
    return 0;
}

 

Testa o lance de mostrar um atleta. cria um grupo deles, lista o grupo todo e encerra. 

 

        teste em main()
    Atleta 1 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

        Sem atletas ainda
        0 de 8 atletas



        Grupo Lotado??

        8 de 8 atletas


    Atleta 2 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

    Atleta 3 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

    Atleta 4 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

    Atleta 5 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

    Atleta 6 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

    Atleta 7 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

    Atleta 8 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

    Atleta 9 de AM,
    Prova em: 1/12/2022 0:12:35    Modalidade: lazer
    Marca: 0 1 2.035000

 

Escrito em minutos usando as coisas que te expliquei.  Composição de dados, encapsulamento, nada de interatividade.

 

Aí você escreve as funções e testa uma a uma. no final cria a p. do menu que chama as funções já testadas. É mais produtivo. O que importa é testar logo, mostrar algo logo, pegar o contrato logo, essas coisas.

 

Minha opinião grátis, apenas.

 

Eis o código

 

#include <stdio.h>
#define TAM 100
#define MAX_ATL 8

typedef struct
{
    char hh;
    char mm;
    char ss;
} Hora;

typedef struct
{
    char  dia;
    char  mes;
    short ano;
} Data;

typedef struct
{
    char  hh;   // ate 127h
    char  mm;   // ate 127 min?
    float fss;  // tempos com fracao de segundo
} Marca;

typedef struct
{
    int   numero;
    char  atividade[50];
    char  estado[4];
    Data  data;
    Hora  hora;
    Marca marca;
} Atleta;

typedef struct
{
    unsigned N;             // quantos tem agora
    unsigned cap;           // quantos cabem
    Atleta   atl[MAX_ATL];  // os atletas
} Atletas;

Atleta fab_atleta();
Atleta ler_atleta();
int    mostra_atleta(
       Atleta* atleta, const char* msg);  // mostra o atleta

int existe(int numero, Atletas* eqp);
int guarda(Atleta* um, Atletas* grupo);
int mostra_atletas(
    Atletas* Equipe, const char* msg);  // mostra o grupo

char menu();

int main(void)
{
    // testa para um atleta
    Atleta exemplo = fab_atleta();
    mostra_atleta(&exemplo, "\n\tteste em main()\n");
    // cria uma equipe e mostra
    Atletas grupo = {.cap = MAX_ATL, .N = 0};
    mostra_atletas(&grupo, "\n\tSem atletas ainda\n");
    // insere ate não caber
    exemplo = fab_atleta();
    while (guarda(&exemplo, &grupo) >= 0)
        exemplo = fab_atleta();  // +1
    // mostra
    mostra_atletas(&grupo, "\n\tGrupo Lotado??\n\n");
    return 0;
}

int existe(int numero, Atletas* eqp)
{
    // retorna a posicao do atleta na equipe
    // ou -1 se não tem tal atleta
    if (eqp == NULL) return -1;
    if (eqp->N == 0) return -1;
    for (unsigned i = 0; i < eqp->N; i += 1)
        if (eqp->atl[i].numero == numero) return i;
    return -1;
}

int guarda(Atleta* um, Atletas* grupo)
{
    if (grupo == NULL) return -1;
    if (um == NULL) return -2;
    if (grupo->N == grupo->cap) return -3;
    grupo->atl[grupo->N] = *um;
    grupo->N += 1;  // conta esse
    return 0;
}

Atleta fab_atleta()
{
    Atleta um = {
        .atividade = "lazer",
        .estado    = "AM",
        .data      = {01, 12, 2022},
        .hora      = {0, 12, 35},
        .marca     = {0, 1, 2.035f}};

    static int numero = 1;
    um.numero         = numero;
    numero += 1;
    return um;
}

Atleta ler_atleta()
{
    Atleta a = {.numero = 1};
    return a;
}

char menu() { return 0; }

int mostra_atleta(Atleta* atl, const char* msg)
{
    // mostra a mensagem opcional
    if (atl == NULL) return -1;
    if (msg != NULL) printf("%s", msg);
    printf(
        "\
    Atleta %d de %s,\n\
    Prova em: %d/%d/%d %d:%d:%d\
    Modalidade: %s\n\
    Marca: %d %d %f\n",
        atl->numero, atl->estado, atl->data.dia,
        atl->data.mes, atl->data.ano, atl->hora.hh,
        atl->hora.mm, atl->hora.ss, atl->atividade,
        atl->marca.hh, atl->marca.mm, atl->marca.fss);
    return 0;
}

int mostra_atletas(Atletas* E, const char* msg)
{
    if (E == NULL) return -1;
    // mostra a mensagem se veio
    if (msg != NULL) printf("%s", msg);
    printf("\t%d de %d atletas\n\n", E->N, E->cap);
    for (unsigned i = 0; i < E->N; i += 1)
        mostra_atleta(&E->atl[i], "\n");  // pula 1 linha
    printf("\n");
    return 0;
}

Atleta lerplaneamento()
{
    Atleta a;
    a.numero = 1;
    return a;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto sim ainda estou trabalhando no projeto pois tenho de o entregar, percebi o que voce explicou, mas ainda não consigo implementar em codigo, ainda estou pesquisando mais, tenho 1 mes e meio de c, e da para perceber que o seu codigo é bem mais avancado do que estou aprendendo na escola, 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, solracm disse:

sim ainda estou trabalhando no projeto pois tenho de o entregar, percebi o que voce explicou, mas ainda não consigo implementar em codigo, ainda estou pesquisando mais, tenho 1 mes e meio de c, e da para perceber que o seu codigo é bem mais avancado do que estou aprendendo na escola

 

É muito mais simples escrever como expliquei. Um exemplo é o próprio programa que escrevi em minutos, testei uma única vez e estava ok e postei aqui. Sem interatividade, sem variáveis globais sem nada daquela lista de coisas de que sempre escrevo, como 20 printf de uma linha ou chamadas folclóricas a scanf().

 

Não é preciso e muitas vezes não é esperto usar essas coisas.

 

Usei a mesma linguagem que ensinam na escola, imagino. Nunca fiz um curso de C pra ver como ensinam, mas vejo algo a partir dos programas de estudantes que comecei a ver quando comecei a frequentar esses foruns.

 

O que falta para "implementar" algo que eu expliquei? Escrever em torno dos dados e usar composição para escrever um container é apenas o que está lá no exemplo. Não envolve nenhum recurso especial. 

 

E o uso de funções factory como a fab_atleta() é só o que parece lá: a maneira de testar rápido partes de sistemas.

 

E composição de dados é por exemplo ter uma função para mostrar um grupo que chama uma função que mostra um atleta.

 

Sugiro que leia e rode aquele exemplo em sua máquina. E se tem alguma dúvida sobre isso faça o simples e use o forum, esse mesmo. O objetivo de alguém que responde algo aqui é esse. Ajudar. E se for fazer "uma pesquisa" depois de ler algo aqui e não entender estará fugindo da razão do forum e também impedindo que outros que tenham a mesma dúvida acompanhem a discussão aqui mesmo...

  • Obrigado 1
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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!