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*/voidFLVazia(TipoLista*Lista){Lista->Primeiro=(TipoApontador) malloc (sizeof(TipoCelula));Lista->Ultimo=Lista->Primeiro;Lista->Primeiro->Prox= NULL;}intVazia(TipoListaLista){return(Lista.Primeiro==Lista.Ultimo);}/*Insere na lista*/voidInsere(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*/voidRetira(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*/voidImprime(TipoListaLista){TipoApontadorAux;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){return1;}}return0;}/*Esta função faz a inserção na lista de maneira ordenada*/void inserirOrdenado(TipoListaLista**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(TipoListaLista,TipoTimeTime,TipoApontador p){TipoItemItemTemp;//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(TipoListaLista,TipoItem*Item,TipoApontador p){TipoItemItemTemp;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;TipoListaCampeonato;TipoItemItemAux;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 ordenadoArqEntrada= 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);}elseif(strcmp("RANKING",Acao)==0){
fprintf(ArqSaida,"%s,%s,%d",TipoDaAcao,NomeDoTime1,ItemAux.Time.classificacao);}}elseif(strcmp("VITORIA",Acao)==0){NomeDoTime1= atoi (strtok (buffer,","));NomeDoTime2= atoi (strtok (buffer,","));if(1){//*pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )*/){
atualizaVitoria(Campeonato,*Item, p);}elseif(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);return0;}
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
Utilizamos cookies e tecnologias semelhantes de acordo com a nossa Política de Privacidade, e ao continuar navegando, você concorda com estas condições.
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.