alphasil Posted June 21, 2012 at 02:39 PM Report #464595 Posted June 21, 2012 at 02:39 PM Olá ppl; É a minha última coisinha que preciso de ajuda Tenho um ficheiro que guarda estes dados Nome % Pontos Tenho de ordená-los, já estou farto de procurar exemplos que possa adaptar mas não encontro nada de jeito Tenho esta função que me lê os registos todos int topJogos() { struct jogoJogado j; int retorno, cont = 0; FILE *f; if ((f= fopen("jogos.dat", "rb")) == NULL) { printf("Erro ao abrir ficheiro\n"); } printf ("\n*=============================================================================*\n"); printf ("| >>>>Top 10 de jogadores<<<< |\n"); printf ("*=============================================================================*\n"); printf (" \n"); printf("\n\t+----------+-----------+------------+"); printf("\n\t| Nome | Pontos | P.Certas |\n"); printf("\n\t+----------+-----------+------------+"); retorno = fread(&j, sizeof j, 1, f); while ( retorno == 1) { cont++; printf("\n\t|%-10s |%-10i |%3.2f \n",j.nome, j.res_final, j.p_certas); printf("\n"); retorno= fread(&j, sizeof j, 1, f); } printf("\n\t+----------+-----------+------------+"); printf(" \n\n %d Top de jogadores \n", cont); printf ("*=============================================================================*\n"); rewind(f); fclose(f); return 0; } Agora, conforme os resultados tenho de ordenar Tenho de ler isso tudo para um array e depois usar o qsort? Poderiam dar-me umas dicas ou exemplo concreto se faz favor'? Obrigado gmc11
Psycop Posted June 21, 2012 at 02:43 PM Report #464598 Posted June 21, 2012 at 02:43 PM Boas Deves carregar toda a informação para a memória, ordená-la usando um método de ordenação, quer seja o bubble sorte ou selection sort. Penso que este seja o método mais simples de resolver essa questão. Cumps
HappyHippyHippo Posted June 21, 2012 at 02:47 PM Report #464602 Posted June 21, 2012 at 02:47 PM algo deste género int comparador(const void * elem1, const void * elem2) { // ordenar pelo valor res_final return ((struct jogoJogado *)elem1)->res_final = ((struct jogoJogado *)elem2)->res_final; } int main(void) { struct jogoJogado lista[10]; // lês toda a informação do ficheiro para a lista // ... // argumentos // 1 - lista a ordenar // 2 - numero de elementos a ordenar (estou a assumir que a lista tem 10 elementos) // 3 - tamanho em bytes de cada elemento em memória // 4 - ponteiro para a função usada para ordenar qsort(lista, 10, sizeof(struct jogoJogado), comparador); // voltas a escrever tudo no ficheiro // ... return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted June 21, 2012 at 03:11 PM Author Report #464617 Posted June 21, 2012 at 03:11 PM (edited) Dá-me um erro e um warning.... int comp() { struct jogoJogado lista[10]; FILE *f; f=fopen("jogos.dat", "rb"); fseek(f, 0, SEEK_END); lista = (jog*) malloc(sizeof(struct jogoJogado) * 10); int i = 0; while(fgets(list, sizeof(struct jogoJogado), f) != NULL) { sscanf(lista,"%s %s", jog[i].nome, jog[i].p_certas, jog[i].res_final); i++; } } Edited June 21, 2012 at 03:18 PM by alphasil gmc11
Flinger Posted June 21, 2012 at 03:41 PM Report #464631 Posted June 21, 2012 at 03:41 PM (edited) sscanf(lista,"%s %s", jog[i].nome, jog[i].p_certas, jog[i].res_final) tens 2 % no filtro, mas 3 argumentos. O warning deve vir daqui. Quanto ao erro, posta aí a mensagem que dá. Sem isso nada feito. struct jogoJogado lista[10]; lista = (jog*) malloc(sizeof(struct jogoJogado) * 10); Estás a alocar memória para um array que já está declarado acima... Se queres declaração dinâmica, passa o array para struct jogoJogado *lista; (podes continuar a usar como array depois de alocado o espaço). fgets(list, sizeof(struct jogoJogado), f) Tens uma estrutura binária e estás a usar uma função que lê uma string... vê o fread. list ou lista? sscanf(lista,"%s %s", jog[i].nome, jog[i].p_certas, jog[i].res_final); lista não é uma string, mas um array de structs... jog devia ser lista, não? Estás a fazer uma salgalhada aí... Edited June 21, 2012 at 03:46 PM by Flinger
alphasil Posted June 21, 2012 at 04:47 PM Author Report #464653 Posted June 21, 2012 at 04:47 PM Já dá sem erros int comp() { struct jogoJogado *listas[10]; FILE *f; f=fopen("jogos.dat", "rb"); if(!f) { printf("Erro"); } else { listas[0] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado)); int i; int retorno=fread(listas[0], sizeof(struct jogoJogado), 1, f); for(i=1;retorno==1;i++) { listas[i]=(struct jogoJogado*)malloc(sizeof(struct jogoJogado)); retorno= fread(listas[i], sizeof(struct jogoJogado), 1, f); } printf("%s %.2f %d", listas[0]->nome,listas[0]->p_certas, listas[0]->res_final ); } qsort(listas, 10, sizeof(struct jogoJogado), comparador); Sleep(4000); return 0; } Faço print e aparece, agora é só usar o que o HHH disse não é? gmc11
alphasil Posted June 21, 2012 at 05:02 PM Author Report #464663 Posted June 21, 2012 at 05:02 PM Oi, erro não dá mas não está a ordenar Faz o print na ordem que estava. int comparador(const void * elem1, const void * elem2) { return ((struct jogoJogado *)elem1)->res_final = ((struct jogoJogado *)elem2)->res_final; } int comp() { struct jogoJogado *listas[10]; FILE *f; f=fopen("jogos.dat", "rb"); if(!f) { printf("Erro"); } else { listas[0] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado)); int i; int retorno=fread(listas[0], sizeof(struct jogoJogado), 1, f); for(i=1;retorno==1;i++) { listas[i]=(struct jogoJogado*)malloc(sizeof(struct jogoJogado)); retorno= fread(listas[i], sizeof(struct jogoJogado), 1, f); } } qsort(*listas, 4, sizeof(struct jogoJogado), comparador); int i; for(i=0; i<4; i++) { printf("%s %d %.2f \n", listas[i]->nome, listas[i]->res_final, listas[i]->p_certas ); } Sleep(4000); return 0; } gmc11
polska Posted June 21, 2012 at 05:17 PM Report #464666 Posted June 21, 2012 at 05:17 PM Eu já tive de fazer um sort de um ficheiro, eu guardava os dados do ficheiro numa struct e depois era só ordenar com um bubble sort.. 👍 Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
HappyHippyHippo Posted June 21, 2012 at 05:20 PM Report #464670 Posted June 21, 2012 at 05:20 PM (edited) o erro foi meu ... o código que está aqui está mal return ((struct jogoJogado *)elem1)->res_final = ((struct jogoJogado *)elem2)->res_final; deverá ser return ((struct jogoJogado *)elem1)->res_final - ((struct jogoJogado *)elem2)->res_final; troca o = por - é o que dá responder a toda a gente e escrever código à pressão ... Edited June 21, 2012 at 05:20 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted June 21, 2012 at 05:59 PM Author Report #464686 Posted June 21, 2012 at 05:59 PM Mesmo assim continua mal Listagem inicial: *=============================================================================* | >>>>Top 10 de jogadores<<<< | *=============================================================================* +----------+-----------+------------+ | Nome | Pontos | P.Certas | +----------+-----------+------------+ |Gil |10 |80.00 |Baby |9 |87.00 |Kill |3 |14.00 |cerdo |6 |87.00 +----------+-----------+------------+ 4 Top de jogadores *=============================================================================* Listagem inicial Gil 10 80.00 Baby 9 87.00 Kill 3 14.00 cerdo 6 87.00 Depois do qsort Baby 9 87.00 Gil 10 80.00 cerdo 6 87.00 Kill 3 14.00 gmc11
HappyHippyHippo Posted June 21, 2012 at 06:10 PM Report #464691 Posted June 21, 2012 at 06:10 PM (edited) este erro já não é meu !!! tu é que inventas mesmo a copiar código //struct jogoJogado *listas[10]; struct jogoJogado listas[10]; //qsort(*listas, 4, sizeof(struct jogoJogado), comparador); qsort(listas, 4, sizeof(struct jogoJogado), comparador); e remove estas linhas : listas[0] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado)); ... listas[i] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado)); neste código não existe malloc's nem free's !!! ps : já agora .. .o código para ler os registos do ficheiro: //listas[0] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado)); //int i; //int retorno=fread(listas[0], sizeof(struct jogoJogado), 1, f); //for(i=1;retorno==1;i++) //{ //listas[i]=(struct jogoJogado*)malloc(sizeof(struct jogoJogado)); //retorno= fread(listas[i], sizeof(struct jogoJogado), 1, f); //} n_elementos = fread(listas, sizeof(struct jogoJogado), 10, f); Edited June 21, 2012 at 06:16 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted June 21, 2012 at 07:30 PM Author Report #464724 Posted June 21, 2012 at 07:30 PM Tive de fazer uma alteração na função comparar visto que começava do menor para o maior No entanto, já está tudo. Muito obrigado a todos os que me ajudaram e revelaram uma enorme paciência. Obrigadão gmc11
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