Ir para conteúdo
Fórum Script Brasil
  • 0

Programa Copa do Mundo


victor_santos

Pergunta

Olá,este é meu primeiro post no fórum..

Estou querendo fazer um programa que simule a copa do mundo, ou seja, que o usuário seja capaz de montar os grupos com os times que quiser, depois dos grupos formados, que o próprio programa monte a grade de jogos de cada grupo para que o usuário possa inserir os valores dos jogos.

Depois dos valores postados, o programa checa o número de pontos e o saldo de gols de cada time e assim monta a classificação para as oitavas de final e assim por diante.

Comecei a fazer usando estruturas, mas como estou aprendendo ainda, acho que me perdí um pouco no meu próprio raciocínio, até agora a única coisa que conseguí fazer foi relacionar as seleções aos grupos, e imprimir os jogos (de forma errada).

O que estou me perdendo é na hora de montar os jogos, criei um vetor de char de tamanho 64 (por causa dos 64 jogos da copa), usando um contador para ir adicionando os jogos na matriz, mas acaba ficando errado, como o programa abaixo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_GRUPO 4

int main()
{
    struct selecao
{
    char *time[100];
    int  pontos;
    int gols_favor;
    int gols_contra;
    int gols_total;
};

struct selecao grupo_a[4]; //grupo a montado
char *jogo_copa[64] = {''}; //total de jogos da copa
int i=0,j=1,h=0;
char entrada[30];

// ********************************************************************

printf("PROGRAMA COPA DO MUNDO 2010.\n");

for (i = 0;i < MAX_GRUPO;i++)
{ //GRUPO A
    printf("Digite o nome da seleção pertencente ao GRUPO A.\n");
    fgets(entrada,sizeof(entrada),stdin);
    sscanf(entrada,"%s",&grupo_a[i].time);
}

printf("\n\n");
for (h=0;h<7;h++) // cada grupo tem 6 jogos
{
    for (i=0;i<3;i++) //quantidade de jogos de modo que não repita
    {
        for (j=1;j<4;j++) //quantidade de adversários
        {
          jogo_copa[h] = grupo_a[i].time;
          strcat(jogo_copa[h]," ");
          strcat(jogo_copa[h],"vs");
          strcat(jogo_copa[h]," ");
          strcat(jogo_copa[h],grupo_a[j].time);
          printf("jogo[%d] = %s\n",h,jogo_copa[h]);
          h++;

        }
    }
}

    return 0;
}

Minha lógica para montar o quadro de jogos foi a seguinte:

Usei como exemplo o Grupo A da copa:África, México, Uruguai e França.

grupo_a[0].time tem que jogar com: grupo_a[1].time

grupo_a[2].time

grupo_a[3].time

grupo_a[1].time tem que jogar com: grupo_a[2].time

grupo_a[3].time

grupo_a[2].time tem que jogar com: grupo_a[3].time

usei o contador h de 0 a 7 só pra montar os jogos do grupo a

o contador i conta de 0 a 2, serve pra pegar os times da esquerda, pegando como exemplo a descrição acima

e o contador j conta de 1 a 3, serve para associar os adversários dos primeiros times.

o printf tá saindo assim:

printf.png

queria que ficasse assim:

jogo [0] = grupo_a[0].time vs grupo_a[1].time;

jogo [1] = grupo_a[0].time vs grupo_a[2].time;

jogo [2] = grupo_a[0].time vs grupo_a[3].time;

jogo [3] = grupo_a[1].time vs grupo_a[2].time;

e assim por diante.

Só queria ajuda na montagem da grade de jogos só, o resto eu me viro.

Quero fazer esse programa justamente pra aprender a mecher com estruturas.

Desculpe pelo texto longo, tentei explicar o máximo do problema para ajudar o entendimento de vocês.

Obrigado.

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Em vez de explicar onde errou, acho que fica mais simples postar o código corrigido...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_GRUPO 4

struct selecao {
    char time[100];
    int pontos;
    int gols_favor;
    int gols_contra;
    int gols_total;
};

int main()
{
    struct selecao grupo_a[4];    //grupo a montado
    char jogo_copa[64][200];    //total de jogos da copa
    int i = 0, j = 1, h = 0;
    char entrada[30];

    printf("PROGRAMA COPA DO MUNDO 2010.\n");

    for (i = 0; i < MAX_GRUPO; i++) {    //GRUPO A
        printf("Digite o nome da seleção pertencente ao GRUPO A.\n");
        fgets(entrada, sizeof(entrada), stdin);
        entrada[strlen(entrada)-1] = '\ 0'; // só pra tirar a quebra de linha da string
        strcpy(grupo_a[i].time, entrada);
    }

    printf("\n\n");
    
    for (h = 0; h < 7; h++)    // cada grupo tem 6 jogos
    {
        for (i = 0; i < 3; i++)    //quantidade de jogos de modo que não repita
        {
            for (j = 1; j < 4; j++)    //quantidade de adversários
            {
                strcpy(jogo_copa[h], grupo_a[i].time);
                strcat(jogo_copa[h], " vs ");
                strcat(jogo_copa[h], grupo_a[j].time);
                printf("jogo[%d] = %s\n", h, jogo_copa[h]);
                h++;

            }
        }
    }

    return 0;
}

Em C não pode fazer associação direta de strings... precisa usar a função strcpy.

Em alguns casos você tava usando array de ponteiros... mas pra usar eles pra guardar strings você teria que alocar memória antes.

Você tem ainda no código o problema dos jogos entre times iguais.

Basta colocar um IF alí no meio que resolve.

Lá no primeiro FOR, eu coloquei um caracter nulo (barra-zero), mas por algum bug no forum ele não tava aparecendo... então coloquei um espaço pra consertar. Tire o espaço antes de compilar.

Editado por Mnemonic
Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Mnemonic, entendí as mudanças que você fez no código, realmente agora tá funcionando do jeito que queria, já fiz até o if pra evitar que os jogos se repitam..

Uma única coisa que não intendí foi o uso daquela matriz jogo_copa ser bidimensional [64][200].

Por que não pode ser uma matriz simples?

Link para o comentário
Compartilhar em outros sites

  • 0

A vetor simples que você usou era um vetor de ponteiros:

char *jogo_copa[64];

Como uma string nada mais é que um ponteiro pra um vetor de char, isso daí funcionaria pra guardar cópia de outras strings já criadas... mas pra guardar strings próprias nela teria que alocar espaço antes. Um ponteiro guarda apenas o endereço, e não o valor real da string. Então usando a matriz bidimensional, você tem o mesmo resultado só que com espaço reservado pra guardar as strings...

Link para o comentário
Compartilhar em outros sites

  • 0

Entendí Mnemonic, obrigado por esclarescer a dúvida..

Inclusive hoje na aula meu professor explicou o porque de usar a matriz bidimensional e acabei entendendo sem problemas :D

Seguinte, o código base está quase pronto, fiz o sistema de emparelhamento de jogos, o esquema de pontuação, saldo de gols, e gols pró (esses dois últimos se houver empate na pontuação e coisa e tal)..

O que tá pegando agora é que não estou conseguindo pensar em algum algoritmo pra ter o segundo, terceiro e quarto colocados do grupo..

O primeiro colocado conseguí fazer sem problemas, passei à tarde toda tentando bolar algo pra ter as outras posições da chave mas não conseguí pensar em nada, se alguém puder me ajudar, fico muito agradecido, é o que falta pra terminar a base do programa..

abaixo segue o código de como está o programa no momento,

abraço a todos!

#include <stdio.h>
#include <stdio_ext.h>
#include <stdlib.h>
#include <string.h>
#define MAX_GRUPO 4


/*****Estrutura***********/
struct selecao {
    char time[100];
    int pontos;
    int gols;
    int gols_total;
    int gols_saldo;
};
struct selecao grupo_a[4];    //grupo A montado
/***************************/

int main()
{
    /*****Arvuivo*******/
    const char GRUPO_A[] = "/home/victor/Desktop/grupo_a.txt";
    FILE *fp;
    /*******************/
    char jogo_copa[64][200];    //total de jogos da copa - 64 jogos com tamanho de 200 caracteres por jogo
    int i = 0, j = 1, h = 0;
    char entrada[30];
    int n_temp = 0;
    int grupo_a_primeiro = 0,indice_primeiro = 0,indice_segundo = 0,grupo_a_segundo = 0;
    /********************/

    printf("PROGRAMA COPA DO MUNDO 2010.\n");

    fp = fopen(GRUPO_A, "r");
    if (fp == NULL)
    exit(1);

    printf("Digite o nome da seleção pertencente ao GRUPO A.\n");
    for (i = 0; i < MAX_GRUPO; i++) {    //GRUPO A

        n_temp = fgets(entrada, sizeof(entrada),fp);
        //entrada[strlen(entrada)-1] = ''; // só pra tirar a quebra de linha da string
        if (n_temp == EOF) {
        break;
    }   entrada[strlen(entrada)-1] = '';
        strcpy(grupo_a[i].time,entrada);
        //n_selecao += n_temp;
    }

    printf("\n\n");
                                /*jogos do grupo A*/ /************MONTA A GRADE DE JOGOS DO GRUPO A*******************/
    for (h = 0; h < 6; h++)    // cada grupo tem 6 jogos
    {
        for (i = 0; i < 3; i++)    //quantidade de jogos de modo que não repita
        {
            for (j = i + 1; j < 4; j++)    //quantidade de adversários
            {
                strcpy(jogo_copa[h], grupo_a[i].time);
                if (strcmp(jogo_copa[h],grupo_a[j].time) != 0) //faz com que um time não jogue contra ele mesmo
                {
                    strcat(jogo_copa[h], " vs ");
                    strcat(jogo_copa[h], grupo_a[j].time);
                    printf("jogo[%d] = %s\n", h, jogo_copa[h]);
                    h++;

                }


            }
        }
    }

                                                    /***********ENCERRA A GRADE DE JOGOS DO GRUPO A**************************/


                                                    /**********INICIA A MONTAGEM DOS PLACARES***************************/
printf("\n\tPLACAR DOS JOGOS:\n");
for (h = 0; h < 6; h++)
{
    for (i = 0;i<3;i++)
{
    for (j = i + 1;j < 4; j++)
    {
    printf("\n%s\n\n",jogo_copa[h]);
    printf("Digite o placar do jogo no formato: 0 x 0\n");

      fgets(entrada,sizeof(entrada),stdin);
      sscanf(entrada,"%d x %d",&grupo_a[i].gols, &grupo_a[j].gols);
      grupo_a[i].gols_total += grupo_a[i].gols;
      grupo_a[j].gols_total += grupo_a[j].gols;

             if (grupo_a[i].gols > grupo_a[j].gols)
    {
        grupo_a[i].gols_saldo += (grupo_a[i].gols - grupo_a[j].gols);
        grupo_a[j].gols_saldo += (grupo_a[j].gols - grupo_a[i].gols);
        grupo_a[i].pontos +=3;                                             /****VITÓRIA****/
        grupo_a[j].pontos+=0;

               }else if ( grupo_a[i].gols == grupo_a[j].gols)
        {
            grupo_a[i].pontos+=1;
            grupo_a[j].pontos+=1;                           /****EMPATE****/

        }else if (grupo_a[j].gols > grupo_a[i].gols)
        {
        grupo_a[j].gols_saldo += (grupo_a[j].gols - grupo_a[i].gols);
        grupo_a[i].gols_saldo += (grupo_a[i].gols - grupo_a[j].gols);
        grupo_a[j].pontos +=3;
        grupo_a[i].pontos +=0;                             /***DERROTA****/
        }
        h++;

}
}
}
                                      /************TERMINA A MONTAGEM DOS PLACARES*****************/


                                       /************IMPRIME A TABELA DE PONTOS**********************/
printf("\n\n\tCLASSIFICAÇÃO DO GRUPO A: \n");
for (i = 0;i<4;i++)
{
    printf("\n%s tem %d pontos.\n",grupo_a[i].time,grupo_a[i].pontos);

}

                                       /*************************************************************/

                                      /********GOLS PRÓ**************/
printf("\n\n\tGols PRÓ GRUPO A: \n");
for (i=0;i<4;i++)
{
    printf("\n%s tem %d gols\n", grupo_a[i].time, grupo_a[i].gols_total);
}
                                       /********FIM GOLS PRÓ*********************/


                                       /******* SALDO DE GOLS***************/
printf("\n\n\tSALDO DE GOLS GRUPO A: \n");
for (i=0;i<4;i++)
{
    printf("\n%s tem %d gols de saldo\n", grupo_a[i].time, grupo_a[i].gols_saldo);
}
                                       /******FIM SALDO DE GOLS************/

                                       /*****PRIMEIRO E SEGUNDO DO GRUPO******/

                                    /**PRIMEIRO**/
for (i = 0; i < 4; i++) {
    if (grupo_a[i].pontos > grupo_a_primeiro) {
        grupo_a_primeiro = grupo_a[i].pontos;
        indice_primeiro = i;
    }
    }
                     /**SEGUNDO**/
for (h = 0; h < 4; h++) {
    if (grupo_a[indice_primeiro].pontos > grupo_a[h].pontos)
    {
       segundo_temp = grupo_a[h].pontos;                          //essa parte do código está errada, só está aqui pra encher linguiça mesmo

    indice_segundo = h;
    }
    }



    printf("\nO PRIMEIRO COLOCADO DO GRUPO A É %s.\n", grupo_a[indice_primeiro].time);
    printf("\nO SEGUNDO COLOCADO DO GRUPO A É %s.\n",grupo_a[indice_segundo].time);

    return 0;
}

Editado por victor_santos
Link para o comentário
Compartilhar em outros sites

  • 0

Bom, Desculpem o intrometimento... mais me interecei pelo programa... queria poder compila-lo aqui, mais o ultimo post não deixa pois ele programou algumas partes para partes especificas so para o seu computador... poderia me passar o Algorito que desse para mim compilar aqui ? gostaria de ve-lo e tentar entender direito algumas coisas que voce fez ! obrigado !

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...