Jump to content
Fórum Script Brasil
  • 0

Programa Copa do Mundo


Question

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 to post
Share on other sites

6 answers to this question

Recommended Posts

  • 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.

Edited by Mnemonic
Link to post
Share on other 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 to post
Share on other 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 to post
Share on other 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;
}

Edited by victor_santos
Link to post
Share on other 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 to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      149296
    • Total Posts
      645693
×
×
  • Create New...