DaniCV Posted December 3, 2016 at 10:42 PM Report Share #601001 Posted December 3, 2016 at 10:42 PM 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 More sharing options...
HappyHippyHippo Posted December 4, 2016 at 10:23 AM Report Share #601002 Posted December 4, 2016 at 10:23 AM (edited) 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 December 4, 2016 at 10:25 AM by HappyHippyHippo bugs, bugs and more bugs IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
DaniCV Posted December 4, 2016 at 03:08 PM Author Report Share #601008 Posted December 4, 2016 at 03:08 PM 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 More sharing options...
HappyHippyHippo Posted December 5, 2016 at 08:48 AM Report Share #601022 Posted December 5, 2016 at 08:48 AM mas que mania que as pessoas tem de tentar fazer tudo ao mesmo tempo ... quando tiveres o código de leitura completa do ficheiro, diz alguma coisa IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now