Jump to content

Problema "Associações"


DaniCV

Recommended Posts

Olá a todos,

Eu e alguns colegas meus necessitávamos aqui de uma ajuda. Estamos à 3 dias a matar a cabeça com este problema no entanto não chegamos a conclusão nenhuma.

 

Enunciado:

Citação

Considere os tipos de dados definidos abaixo:

#define MAX_ELEM 100

typedef struct{
 int dia, mes, ano;
} tipoData;

typedef struct{
 int numero;
  char nome[20];
  char apelido[20];
 tipoData dataNascimento;
} tipoCartao;

Crie um tipo TipoAssociacao contendo dois campos:

numeroAssociados – um inteiro representando o número de associados existentes na associação num determinado momento.

associados – um vector com MAX_ELEM do tipo tipoCartao para representar a informação de todos os associados

Considere o ficheiro de texto em anexo com uma listagem de associados, com informação do seu nome, numero e data de emissão.

Construa um programa que faça o seguinte:

Leia o ficheiro associados.txt e preencha a estrutura devidamente.

Através de um menu, o utilizador deverá especificar se quer que a lista de associados seja ordenda pelo numero de associado usando o algoritmo de ordenação por seleção ou por bolha.

Registe num novo ficheiro a listagem ordenada.

Indique no ecrã quantas iterações foram necessárias para ordenar de acordo com o algoritmo escolhido.

Ficheiro anexo:

Pedro Tamen  1 1 1 1934
Almeida Garrett  2 4 2 1799
Camilo Pessanha  4 7 9 1867
Almada Negreiros 3 7 5 1893
Ibn Bassam  19 21 11 1058
Antonio Aleixo  16 18 2 1899
Ricardo Reis  18 19 9 1887
Mario Sá-Carneiro 17 19 5 1890
Mario Cesariny  7 9 9 1923
Luis Camões  8 10 6 1524
Miguel Torga  10 12 8 1907
Natália Correia  11 12 9 1923
Tolentino Mendonça 13 15 12 1965
Alberto Caeiro  14 16 5 1889
Jose Saramago  15 16 11 1922
Cesario Verde  21 25 2 1855
Luiz Pacheco  5 7 5 1925
Manuel Alegre  9 12 5 1936
Fernando Pessoa  12 13 6 1888
Herberto Helder  20 23 11 1930
Florbela Espanca 6 8 12 1894

Começamos assim:

Imagem (temos um erro na linha 41 e não percebemos ao que se deve)

E como não chegamos a nada mudamos o rumo e agora estamos assim no entanto isto não esta a dar nada de jeito.

#include <stdio.h>
#include<string.h>
#include<math.h>
#define MAX_ELEM 25

typedef struct{
	
	int dia, mes, ano;
	
}tipoData;

typedef struct{
	
	int num;
	char nome[61];
        char apelido[200];
	tipoData dataEmissao;
}tipoCartao;

	

typedef struct{
	
	int numeroassociados;
	tipoCartao associados[MAX_ELEM];
	
}associacao;



main(void){
	
		
FILE*leitura;
FILE*escrita;
int i, j, aux;	
int menor;	
int escolha;
associacao associacao[MAX_ELEM];

char nome2[200];
char apelidos[200];
int numeroassociado[20];
int dias;
int messes;
int anos;

	leitura = fopen("associados.txt", "r");
	escrita = fopen("ordenados.txt", "a");
	
	
	printf("Quer ordenar a lista selecionada, por selecao por bolha ou por selecao por ordenacao?\nEscreva 0 para escolher bolha, e 1 para escolher ordenacao\n");
	scanf("%d",&escolha);
	
	if(escolha == 0){
		
while((fscanf(leitura,"%s %s %d %d %d %d", nome2, apelidos, &numeroassociado, &dias ,&messes,&anos)!=EOF) )
	{		
			
for (i= 0; i< MAX_ELEM; i++)		
for (j = MAX_ELEM-1; j > i; j--)
if (numeroassociado[j] < numeroassociado[j-1])
{
aux = numeroassociado[j];
numeroassociado[j] = numeroassociado[j-1];
numeroassociado[j-1]= aux;
}
for (i= 0; i< MAX_ELEM; i++){

fprintf(escrita,"%s %s %d %d %d %d\n", nome2, apelidos, &numeroassociado, &dias,&messes,&anos);	
		
	}
		
	}
}
	
else if(escolha == 1){
	
while((fscanf(leitura,"%s %s %d %d %d %d ", nome2, apelidos, &numeroassociado, &dias ,&messes,&anos)!=EOF) )
	{
	for (i= 0; i< MAX_ELEM-1; i++)
{

	
	
menor= i;
for (j = i+1; j < MAX_ELEM; j++)
if (numeroassociado[j] < numeroassociado[menor])
menor= j;
aux = numeroassociado[i];
numeroassociado[i] = numeroassociado[menor];
numeroassociado[menor] = aux;
}
	for (i= 0; i< MAX_ELEM; i++){
		
fprintf(escrita,"%s %s %d %d %d %d\n", nome2, apelidos, &numeroassociado, &dias ,&messes,&anos);		
}
	}
}

int n = MAX_ELEM;
int a;

a= ((log(n))/log(2));

printf("O numero de iteracoes necessarias foram : %d",a);
	

		
	fclose(leitura);
	fclose(escrita);
	}
Link to comment
Share on other sites

só vou comentar o primeiro erro, porque o segundo código não dá para perceber (além de estar mal indentado)

while ((fscanf(leitura, "%s %s %d %d %d %d ", Associacao.associados[i].nome, & Associacao.associados.apelido, ...
//                                            A                              A                      A
//                                            |                              |                      |
//                                   Associacao ou associacao ?              |                      |
//                                                                           |                      |
//                                                        estás a ler uma string ou não?            |
//                                                                                           não falta nada aqui ?
{
  fprintf(...);
  // qual o valor de "i" em cada leitura do fscanf ?
}

ps : os '...' é porque não tenho tempo para copiar tudo da imagem

Edited by HappyHippyHippo
bugs, bugs and more bugs
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Olá HappyHippyHippo,.

Obrigado pela ajuda! Entretanto já avançamos um pouco...

Ao fazer da "primeira" forma simplesmente ele não esta a ordenar :/

 

Spoiler

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_ELEM 100


//Definição do logaritmo de 2
//int Log2(int x){
//int a;

//a= ((log(x)/log(2)));


//}	
	
//Declaração de estruturas	
	
typedef struct{
int dia, mes, ano;
} tipoData;
	
	
	
typedef struct{
int numero;
char nome[20];
char apelido[20];
tipoData dataNascimento;
} tipoCartao;


typedef struct{
	
int numeroAssociados;
tipoCartao associados[MAX_ELEM];	
	
}TipoAssociacao;

//vetor associaçao
tipoData dataNascimento[MAX_ELEM];
TipoAssociacao numeros[MAX_ELEM];
tipoCartao associados[MAX_ELEM];
// Declaração de Variaveis


FILE*leitura;
FILE*escrita;
FILE*escrita2;
int i, j, aux;	
int menor;	
int escolha;



main (void){
	
	leitura = fopen("associados.txt", "r");
	escrita = fopen("ordenados.txt", "a");
	escrita2 = fopen("OrdenadosB.txt","a");
	
	printf("Escolha o metodo de ordenacao que deseja usar:\n1 para ordenacao por selecao e 2 para ordenacao por bolha\n");	
	scanf("%d", &escolha);
while (fscanf(leitura, "%s %s %d %d %d %d",associados[i].nome, associados[i].apelido, &numeros[i].numeroAssociados,&dataNascimento[i].dia, &dataNascimento[i].mes,&dataNascimento[i].ano)!= EOF){
	

	if(escolha == 1){
		
for (i= 1; i< MAX_ELEM-1; i++){
	menor=i;
	for (j = i+1; j < MAX_ELEM; j++)
		if(numeros[i].numeroAssociados<numeros[menor].numeroAssociados)
			menor=j;
	aux=numeros[i].numeroAssociados;
	numeros[i].numeroAssociados=numeros[menor].numeroAssociados;
	numeros[menor].numeroAssociados=aux;
}
}

    fprintf(escrita, "%s %s %d %d %d %d\n",associados[i].nome, associados[i].apelido, numeros[i].numeroAssociados, dataNascimento[i].dia, dataNascimento[i].dia, dataNascimento[i].mes, dataNascimento[i].ano);
	
	// numero de iteraçoes:	Tamanho -1 IMPORTANTE
		
	
	
	
	if (escolha == 2){
	

	
	
for (i= 0; i< MAX_ELEM; i++)
for (j = MAX_ELEM-1; j > i; j--)
if(numeros[j].numeroAssociados< numeros[menor].numeroAssociados)
{
aux = numeros[i].numeroAssociados;
numeros[i].numeroAssociados = numeros[menor].numeroAssociados;
numeros[menor].numeroAssociados = aux;
}
for (i= 0; i< MAX_ELEM; i++){

    fprintf(escrita2, "%s",associados[i].nome);
	fprintf(escrita2, " %s", associados[i].apelido);
	fprintf(escrita2, " %d", numeros[i].numeroAssociados);
	fprintf(escrita2, " %d",dataNascimento[i].dia);
	fprintf(escrita2, " %d", dataNascimento[i].mes);
	fprintf(escrita2, " %d\n",dataNascimento[i].ano);
}
}

	//i final menos inicial = numero iteracoes!!!!!!!!!!	
	
	
	//printf("O numero de iteracoes necessarias para esta ordenacao e de: %d",Log2(MAX_ELEM));	
	}
printf("O numero de iteracoes necessario para fazer a ordenacao foram: %d", MAX_ELEM - 1);
}

 

Link to comment
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.