Olá, estou com um problema: tenho que ler um arquivo de .csv que contem simulações de jogos entre dois times e/ou consultas ao ranking. Foi especificado que o numero de consultas é muito maior que o numero de simulações de jogos. Para não ficar muito custoso pensei em sempre inserir os times após cada simulação já de maneira ordenada, e se o time já tiver feito algum outro jogo, eu removo e insiro novamente ordenado.
/*Função que faz uma lista vazia*/
void FLVazia (TipoLista *Lista){
Lista -> Primeiro = (TipoApontador) malloc (sizeof(TipoCelula));
Lista -> Ultimo = Lista -> Primeiro;
Lista -> Primeiro -> Prox = NULL;
}
int Vazia(TipoLista Lista){
return (Lista.Primeiro == Lista.Ultimo);
}
/*Insere na lista*/
void Insere (TipoItem x, TipoLista *Lista){
Lista -> Ultimo -> Prox = (TipoApontador) malloc (sizeof (TipoCelula));
Lista -> Ultimo = Lista -> Ultimo -> Prox;
Lista -> Ultimo -> Item = x;
Lista -> Ultimo -> Prox = NULL;
}
/*Remove da lista*/
void Retira (TipoApontador p, TipoLista *Lista, TipoItem *Item){
TipoApontador q;
if ( (Vazia(*Lista)) || (p == NULL) || (p -> Prox == NULL) ){
printf ("\nErro: lista vazia ou posicao nao existe!!\n");
return;
}
q = p -> Prox;
*Item = q -> Item;
p -> Prox = q -> Prox;
if (p -> Prox == NULL){
Lista -> Ultimo = p;
}
free (q);
}
/*Imprime a lista*/
void Imprime (TipoLista Lista){
TipoApontador Aux;
Aux = Lista.Primeiro -> Prox;
while (Aux != NULL){
printf ("%d \n" , Aux -> Item.Chave);
Aux = Aux -> Prox;
}
}
/*void ImprimeNoArquivoDeSaida (TipoLista Lista){
TipoApontador Aux;
Aux = Lista.Primeiro -> Prox;
while (Aux != NULL){
fprintf (ArqSaida,"%d, \n" , Aux -> Item.Chave);
Aux = Aux -> Prox;
}
}*/
//pesquisa se já existem o time na lista.
int pesquisarTime(tlista *L,char *nome, TipoCelula *Celula){
TipoCelula *p;
TipoTime *Time;
while (p !=NULL){
Time = L->nome;
if (strcmp(nome,Time->nome)==0){
return 1;
}
}
return 0;
}
/*Esta função faz a inserção na lista de maneira ordenada*/
void inserirOrdenado(TipoLista Lista **p, *Time)
{
lista *atual, *novo, *anterior;
int num;
novo = (lista *) malloc(sizeof(lista));
atual = *p;
anterior = NULL;
novo->valor = Time;
if(atual == NULL){
novo->prox = NULL;
*p = novo;
} else{
while(atual != NULL && atual->valor < num){
anterior = atual;
atual = atual->prox;
}
novo->prox = atual;
if(anterior == NULL){
*p = novo;
} else{
anterior->prox = novo;
}
}
}
/*A função recebe o time vitorioso, copia para um time temporário.
chama a função Retira, para remover o item da lista
soma os 3 pontos da vitória e insere novamente de maneira ordenada*/
void atualizaVitoria(TipoLista Lista, TipoTime Time, TipoApontador p){
TipoItem ItemTemp;
//Copia o time para um TipoTime temporário.
ItemTemp.Time.nome = Item.Time.nome;
ItemTemp.Time.classificacao = Item.Time.classificacao;
ItemTemp.Time.pontos = Item.Time.pontos+3;//Ponteiro ou conteudo ?
Retira ( p, *Lista, *Item);
inserirOrdenado( Lista **p, *ItemTemp);
}
/*A função recebe os times que empataram(um por vez), copia para um time temporário.
chama a função Retira, para remover o item da lista
soma o 1 ponto da vitória e insere novamente de maneira ordenada*/
void atualizaEmpate(TipoLista Lista, TipoItem *Item, TipoApontador p){
TipoItem ItemTemp;
ItemTemp.Time.nome = Item.Time.nome;
ItemTemp.Time.classificacao = Item.Time.classificacao;
ItemTemp.Time.pontos = Item.Time.pontos+3;//Ponteiro ou conteudo ?
Retira ( p, *Lista, *Item);
inserirOrdenado( Lista **p, *ItemTemp);
}
int main(){
/************************** VARIAVEIS *****************************/
char buffer[100];
int i = 0;
int flag = 1;
TipoLista Campeonato;
TipoItem ItemAux;
char *Acao;
char *TipoDaAcao;
char *NomeDoTime1;
char *NomeDoTime2;
/************************ LEITURA ARQUIVOS *******************************/
FILE *ArqEntrada; // leitura dos comandos
FILE *ArqSaida; // resultado dos comandos
FILE *ArqRanking; // arquivo do ranking ordenado
ArqEntrada = fopen("entrada.csv","r");
ArqSaida = fopen("saida.csv", "w");
ArqRanking = fopen("ranking.csv","r");
if (ArqEntrada == NULL) {
printf ("\nERRO: Arquivo de entrada incorreto!");
}
if (ArqSaida == NULL){
printf("\nERRO: Arquivo de saida incorreto!");
}
if (ArqRanking == NULL){
printf("\nERRO: Ranking nao encontrado. Sera gerado um novo.");
ArqRanking = fopen("ranking.csv","w");
flag = 0;
}
/************************ CARREGANDO SIMULAÇÕES ANTERIORES *******************************/
if (flag==1){
fgets (buffer, 100, ArqRanking);
while (!feof(ArqRanking)){
printf ("\n");
ItemAux.Time.nome = atoi (strtok (buffer, ","));
printf ("\nNome: %s", ItemAux.Time.nome);
ItemAux.Time.classificacao = atoi (strtok (buffer, ","));
printf ("\nClassificacao: %d", ItemAux.Time.classificacao );
ItemAux.Time.pontos = atoi(strtok (NULL, ","));
printf ("\nPontuacao: %d", ItemAux.Time.pontos);
fgets (buffer, 100, ArqRanking);
}
}
/************************ LEITURA DA ENTRADA *******************************/
while (!feof(ArqEntrada)){
Acao = strtok (NULL, ",");
if (strcmp("CONSULTA", Acao)==0){
TipoDaAcao = atoi (strtok (buffer, ","));
NomeDoTime1 = atoi (strtok (buffer, ","));
//if (pesquisarTime(&Campeonato, *NomeDoTime1, ItemAux )==0){
if (1){
printf("/nERRO: Time nao encontrado para consulta.");
}
if (strcmp("PONTUACAO", Acao)==0){
fprintf(ArqSaida, "%s,%s,%d", TipoDaAcao, NomeDoTime1, ItemAux.Time.pontos);
}
else if (strcmp("RANKING", Acao)==0){
fprintf(ArqSaida, "%s,%s,%d", TipoDaAcao, NomeDoTime1, ItemAux.Time.classificacao);
}
}
else if(strcmp("VITORIA", Acao)==0){
NomeDoTime1 = atoi (strtok (buffer, ","));
NomeDoTime2 = atoi (strtok (buffer, ","));
if (1){//*pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )*/){
atualizaVitoria(Campeonato, *Item, p);
}
else if(1){ //(pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )==0){
//Como somar os 3 pontos para inserir ordenado?
inserirOrdenado(Campeonato p, *Time);
}
if (1){ //(pesquisarTime(*NomeDoTime2, Campeonato, ItemAux )==0){
inserirOrdenado(Campeonato p, *Time);
}
/* else if(strcmp("EMPATE", Acao)==0){
NomeDoTime1 = atoi (strtok (buffer, ","));
NomeDoTime2 = atoi (strtok (buffer, ","));
/* pesquisarTime retorna 1 se o time for encontrado e 0 se não.
if (pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )){
atualizaEmpate(Campeonato, *Item, p);
}
/* pesquisarTime retorna 1 se o time for encontrado e 0 se não.
else if (pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )==0){
//Como somar o 1 ponto para inserir ordenado?
inserirOrdenado(Campeonato p, *Time);
}
/* pesquisarTime retorna 1 se o time for encontrado e 0 se não.
if (pesquisarTime(NomeDoTime2, Campeonato, ItemAux )){
atualizaEmpate(Campeonato, *Item, p);
}
/* pesquisarTime retorna 1 se o time for encontrado e 0 se não.
else if (pesquisarTime(*NomeDoTime2, Campeonato, ItemAux )==0){
//Como somar o 1 ponto para inserir ordenado?
inserirOrdenado(Campeonato p, *Time);
}
*/
}
else{
printf("/nErro: Primeiro argumento invalido.");
}
}
/************************ IMPRIME RANKING *******************************/
ImprimeNoArquivoDeSaida(Campeonato);
fclose(ArqEntrada);
fclose(ArqSaida);
fclose(ArqRanking);
return 0;
}
Fiz o código desta maneira porém estou com muitas duvidas quanto as passagens dos parâmetros para as funções. Vocês podem me ajudar ? Obrigado
Pergunta
otaviohpf
Olá, estou com um problema: tenho que ler um arquivo de .csv que contem simulações de jogos entre dois times e/ou consultas ao ranking.
Foi especificado que o numero de consultas é muito maior que o numero de simulações de jogos.
Para não ficar muito custoso pensei em sempre inserir os times após cada simulação já de maneira ordenada, e se o time já tiver feito algum outro jogo, eu removo e insiro novamente ordenado.
Fiz o código desta maneira porém estou com muitas duvidas quanto as passagens dos parâmetros para as funções. Vocês podem me ajudar ? Obrigado
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.