Jump to content
Knot

Listar utilizadores pelo aniversário

Recommended Posts

Knot

Boas!

O que eu pretendo é listar e "printar" aniversariantes pelo dia e mês.

As estruturas que tenho são:

typedef struct
{
int dia;
int mes;
int ano;
}tempo;

//Estrutura para obter data actual
struct tm* data_actual()
{
time_t tempo;

time(&tempo);
return localtime(&tempo);

}

//Estrutura com dados do socio
typedef struct Palavra {
char nome[50];
int idade;
char sexo;
int escalao;
int num_socio;
tempo t_entrada;
tempo t_atual;
int tipo;
int ano;
int mes;
int dia;
} *PALAVRA;

//Estrutura do elemento da lista
typedef struct Elemento {
PALAVRA inf;
struct Elemento *seg;
} *ELEMENTO;

//Estrutura da lista
typedef struct Lista {
int nelementos; 
ELEMENTO inicio; 
} *LISTA;

Os elementos são guardados numa unica lista, odenados pela ordem alfabetica do nome.

O que eu queria fazer era:

Escalão 1:
Dia 11 do 7 - Joao
Dia 15 do 7 - Manel

A parte de listar por escalões eu tenho, não é problema, se for preciso listar pelo mês também não há crise, só não sei é como fazer para correr toda a lista e ordenar dentro de cada mês os dias.

Share this post


Link to post
Share on other sites
pmg

Usa a "bubble sort".

Com este método nunca precisas de comparar, e eventualmente trocar, elementos da lista que não sejam contíguos.

Depois de teres a lista ordenada, "printa-a" :D


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
Knot

Por exemplo eu tenho aqui nos apontamentos esta versão do bubblesort, mas é aplicada a vectores, como tenho uma lista não sei bem como fazer...

void bubbleSort(TipoDados vetor[], int tamanho)
{
int i, j;
for (i=0; i < tamanho-1; i++) //passagens
for (j=0; j<tamanho-1-i; j++) //percorre apenas os que faltam
if (vetor[j] > vetor[j+1]) //compara elementos adjacentes, se estão fora ordem
troca(&vetor[j], &vetor[j+1]); //troca-os
}

O tamanho será nelementos caso liste a lista completa ou então posso ver quantos utilizadores há em cada escalão e usar esse valor para o tamanho, mas o resto não estou a ver como aplicar...

void bubbleSort(LISTA L, int tamanho)

{

int i, j;

for (i=0; i < tamanho-1; i++) //passagens

for (j=0; j<tamanho-1-i; j++) //percorre apenas os que faltam

//Aqui não sei como utilizar os indices i e j...

}

Share this post


Link to post
Share on other sites
Knot

Por exemplo para listar pelos meses já fiz uma função simples

void aniversario(LISTA L, int mes)
{
int a=0;
ELEMENTO p=L->inicio;
while (p) 
{
	if(p->inf->mes==mes)
	{
			printf("O Socio %s faz anos a %d-%d-%d\n",p->inf->nome,p->inf->dia,p->inf->mes,p->inf->t_atual.ano);
			a++;
	}
	p = p->seg;
}
if (a==0)
	printf("Nao ha aniversariantes este mes!\n");
}

Só que os dia não ficam ordenados como é óbvio...

Share this post


Link to post
Share on other sites
pmg

Demorei mais do que estava a espera ate conseguir acertar todos os detalhes, mas acho que ficou 100%, com uma primeira parte recursiva e uma segunda parte "normal".

Pus o codigo (pouco comentado, em ingles! sorry) no pastebin.

Em principio so precisas da funcao bubblesort() e de a ajeitar para as tuas estruturas. Qualquer coisa apita ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.