Manipulação de Texto / Ordenar

1. Manipulação de Texto / Ordenar

Carlos Eduardo
carlodeduardo

(usa Outra)

Enviado em 16/01/2017 - 04:25h

Ola, estou desenvolvendo um jogo basico e simples em #C para um trabalho do curso, em uma das etapas desse trabalho eu tenho que desenvolver um Ranking que armazene as informações em um arquivo .txt. Eu estou conseguindo armazenar os resultados dos jogos e visualizar com uma opção do menu tambem, eu gostaria da ajuda de vocês de como fazer para ordenar em ordem crescente pelo DINHEIRO que é exibido. Alguem tem uma ideia +/- como eu consigo deixar na ordem. Agradeço quem puder ajudar.

Esse é o código que eu uso para VISUALIZAR o arquivo no menu, eu preciso ordenar na hora de visualizar(Da quantia maior até a menor) o "rank.txt"
fp= fopen("rank.txt","r");

printf("---- RANKING DOS JOGADORES ----\n");
while(!feof(fp)) {
fgets(string,99,fp);
printf("%s",string);
}


arquivo .txt fica +/- assim as informações
JUNIOR  | R$     200.00 | 



PEDRO | R$ 2000.00 |



CARLOS | R$ 100.00 |



JOAO | R$ 820.00 |


Se as informações estivessem em um Vetor seria facil ordenar, o problema é que fica armazenado em um txt e eu tenho pouca experiencia de manipulação de arquivos. Alguem consegue me ajudar?



  


2. Re: Manipulação de Texto / Ordenar

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 16/01/2017 - 08:55h

Olá, bom dia.

Supondo que você tenha uma estrutura:


struct jogador {
char *nome;
float dinheiro;
};


Você precisa analisar cada linha lida do arquivo e criar um novo elemento de lista:


struct jogador *novo_jogador(char *nome, float dinheiro)
{
struct jogador *jogador = malloc(sizeof *jogador);
jogador->nome = nome;
jogador->dinheiro = dinheiro;
return jogador;
}

struct jogador *analisa_linha(char *linha)
{
char *nome = malloc(...);
float dinheiro;
...
return novo_jogador(nome, dinheiro);
}


No corpo da função analisa linha, você precisa definir regras para encontrar o nome do jogador e o dinheiro do jogador.
Por exemplo, supondo que uma linha SEMPRE começa com o nome do jogador, e que o nome termina quando o caractere '|' é encontrado, e que também os únicos números na string são os que representam o dinheiro do jogador, você pode utilizar uma sequencia similar a:


for(int i = 0; i < strlen(linha); i++)
if(linha[i] == '|') break;

/* pega o nome */
nome = strndup(linha, i - 1);

for( ; i < strlen(linha); i++)
if(isdigit(linha[i])) break;

/* pega dinheiro */
dinheiro = atof(linha + i);



Cada chamada a analisa_linha() retorna um elemento do tipo (struct jogador*) que você poderá inserir em um vetor, lista encadeada, pilha, ou qualquer outra estrutura de dados que goste para fazer a ordenação. Tenha em mente que nenhum desses códigos foi testado. Estou te dando apenas uma sequência genérica de instruções. Modifique-as e tente fazer funcionar.

Qualquer dúvida, posta denovo.

Enzo Ferber
[]'s


$ indent -kr -i8 src.c

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right."
- linux/Documentation/CodingStyle - TORVALDS, Linus.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts