Jump to content
  • Sign Up

C dificuldade em completar exercício em C


Recommended Posts

Crie um registro para armazenar informações de um jogador de futebol contendo:

nome;
idade;
número de jogos;
número de gols.

Escreva um programa que obtenha os dados para jogadores titulares de um time de futsal (5 jogadores; utilize um vetor de registros).

Por fim imprima o nome e a média de gols de cada jogador.

Eu não consegui fazer a media, alguém poderia me mostrar como é?

#include<stdio.h>
#include<stdlib.h>
struct jogador{
	char nome [50];
	char idade [3];
	int njogos [50];
	int ngols [6];
}atleta[5];

 main(){
 	
	int i;
	float media;
	
	for(i=0;i<5;i++){
		printf("Digite o nome do jogador: \n");
		scanf("%s", &atleta[i].nome);
		printf("Digite a idade do jogador: \n");
		scanf("%s", &atleta[i].idade);
		printf("Digite o numero de jogos do jogador: \n");
		scanf("%d", &atleta[i].njogos);
		printf("Digite o numero de gols do jogador: \n");
		scanf("%d", &atleta[i].ngols);
	}
	printf("Numeros de gols de cada jogador: \n");
	for(i=0;i<5;i++){
		media=(atleta[i].ngols)/(atleta[i].njogos);
		printf("%s:",atleta[i].nome); 
		printf("%f gol(s).\n",media);
	}
}

 

Link to comment
Share on other sites

@Helio Junnior Sartor Dalmolin      na struct voce nao precisa colocar vetor , nao , pois voce irah adicionar um vettor para a struct toda ,  e a media eh assim mesmo o total de gols dividido pela qtd de jogos , e ai o que esta errado eh por que voce colocou  a variavel ngols como vetor e no calculo usou como variavel simples , e ate funcionaria assim mesmo se voce colocar um colchete depois da variavel ngols assim  :

scanf("%d",&atleta[ i ] .ngols[0]);

media = atleta[ i ] .ngols[ 0 ];

Link to comment
Share on other sites

@devair1010

Mudei do jeito como entendi, agora ele esta calculando, porém aparece a media como 0 dos cinco atletas. o que estou errando ainda?

#include<stdio.h>
#include<stdlib.h>
struct jogador{
	char nome [50];
	char idade [3];
	int njogos [50];
	int ngols [6];
}atleta[5];

 main(){
	int i;
	float media;
	
	for(i=0;i<5;i++){
		printf("Digite o nome do jogador: \n");
		scanf("%s", &atleta[i].nome);
		printf("Digite a idade do jogador: \n");
		scanf("%s", &atleta[i].idade);
		printf("Digite o numero de jogos do jogador: \n");
		scanf("%d", &atleta[i].njogos[i]);
		printf("Digite o numero de gols do jogador: \n");
		scanf("%d", &atleta[i].ngols[i]);
	}
	printf("Numeros de gols de cada jogador: \n");
	for(i=0;i<5;i++){
		media=(atleta[i].ngols[i])/(atleta[i].njogos[i]);
		printf("%s:",atleta[i].nome); 
		printf("%f gol(s).\n",media);
	}
}

 

  • Obrigado 1
Link to comment
Share on other sites

2 horas atrás, Helio Junnior Sartor Dalmolin disse:

Mudei do jeito como entendi, agora ele esta calculando, porém aparece a media como 0 dos cinco atletas

 

Mas...

 

struct jogador{
	char nome [50];
	char idade [3];
	int njogos [50];
	int ngols [6];
}atleta[5];

 

Entenda o que você declarou:

 

O que é atleta

 

atleta é jogador[5]. Um vetor de 5 jogador, de jogador[0] a jogador[4]

 

E o que é njogos

 

njogos é int[50], 50 int numerados de njogos[0] a njogos[49] !

 

E o que é ngols?

 

ngols é int[6], 6 int numerados de ngols[0] a ngols[5]

 

E acho que sabe que não é isso que o enunciado diz. ngols é um número, quantos gols o cara marcou. njogos é um número, o número de jogos que o cara jogou. A média, claro, é o popular quociente de um pelo outro, ngols / njogos.

 

De seu programa

 

	for(i=0;i<5;i++){
		media=(atleta[i].ngols[i])/(atleta[i].njogos[i]);
		printf("%s:",atleta[i].nome); 
		printf("%f gol(s).\n",media);
	}

 

Não escreva assim. Declare i DENTRO do for. Nunca deixe uma variável com um nome ingênuo como i solta pelo programa. Nem todo programa que você escrever vai ter 10 linhas e isso sempre cai na sua cabeça. NÃO use variáveis globais. Nunca.

 

Escreva
 

	for(int i=0;i<5;i++) // ...

 

Esse cálculo da média não faz sentido... o índice que controla o acesso a atleta[] nada tem a ver com os índices dos vetores internos ngols e njogos, que já estão errados. 

 

Calcular a média é apenas dividir o número de gols pelo número de jogos e pode mostrar isso direto no printf() e encerrar o programa. Muito mais simples

 

Link to comment
Share on other sites

@Helio Junnior Sartor Dalmolin   fazendo cálculos com variáveis int e float  misturadas  ,   precisa usar um "cast" , mais ou menos assim :

media = ((float)atleta[i].ngols[0] / (float)atleta[i].njogos[0]); 
// media já é float , então converte os dois int's em dois float's
// mas talvez os ++ experientes não gostem de usar isso , e com 
// certeza exitem outros modos de se fazer , mas Ainda sou iniciante
// i vou deixar desse jeito mesmo 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
struct jogador
{
    char nome [50];
//	char idade[3];  normalmente seria um int
    int idade     ;
    int njogos[50];
    int ngols  [6];
}atleta        [5];
int  main        ()
{
    int i;
    float media;
    strcpy(atleta[0].nome ,"lolipop");
    atleta[0].idade     = 21;
    atleta[0].njogos[0] =  2;
    atleta[0].ngols [0] = 15;

    strcpy(atleta[1].nome ,"kiko");
    atleta[1].idade     = 54;
    atleta[1].njogos[0] = 30;
    atleta[1].ngols [0] = 11;

    // aqui só para testar
/*
    for( i=0; i<2;i++ )
    {
        printf("Digite o nome do jogador ------------: ");
        scanf("%s", atleta[i].nome); //  não precisa desse & pois é string
        printf("Digite a idade do jogador -----------: ");
        scanf("%d",& atleta[i].idade);
        printf("Digite o numero de jogos do jogador %s -: ",atleta[i].nome);
        scanf("%d", &atleta[i].njogos[0]);
        printf("Digite o numero de gols do jogador %s --: \n",atleta[i].nome);
        printf("nesses %d JoGos ",atleta[i].njogos[0]);
        scanf("%d", &atleta[i].ngols[0]);
       }
*/
    printf("\nNumeros de gols de cada jogador\n\n");
    for( i=0; i<2; i++ )
    {
        media = ((float)atleta[i].ngols[0] / (float)atleta[i].njogos[0]);
        printf("-------------------------------\n");
        printf("Nome ------------: %s\n" , atleta[i].nome     );
        printf("IdaDe -----------: %d\n" , atleta[i].idade    );
        printf("numero de Gols --: %d\n" , atleta[i].ngols[0] );
        printf("numero de joGos -: %d\n" , atleta[i].njogos[0]);
        printf("MediA -----------: %.2f gol(s).",    media    );
        printf(" por PartiDa\n\n");
    }
    printf("\n\n\n");
    return 0;
}

aqui no Dev C++ e no codeblocks ,   @arfneto  ,   precisa declarar a variável  int i , antes do loop for , pois dentro dele o compilador dá mensagem de erro e não nem compila, não .

codeblocks_11.thumb.jpg.64b9a42306a656d7dc0eadb77917701b.jpg

Link to comment
Share on other sites

5 horas atrás, devair1010 disse:

aqui no Dev C++ e no codeblocks ,   @arfneto  ,   precisa declarar a variável  int i , antes do loop for , pois dentro dele o compilador dá mensagem de erro e não nem compila, não

 

Isso que citou, Dev  C++ e Code::Blocks, são IDE (sim, singular). Não são compiladores. Então tem que procurar a razão do erro no seu compilador e em como está usando dentro desses ambientes.

 

O que te expliquei e sempre escrevo aqui 
 

11 horas atrás, arfneto disse:

Não escreva assim. Declare i DENTRO do for. Nunca deixe uma variável com um nome ingênuo como i solta pelo programa. Nem todo programa que você escrever vai ter 10 linhas e isso sempre cai na sua cabeça. NÃO use variáveis globais. Nunca.

 

Isso levou uma década para ser corrigido em C. Só que foi a década de 80. Se você continuar usando seu compilador configurado para a década de 80 nada vai mudar. Esses ambientes, Dev-C++ e Code::Blocks, não são assim uma beleza hoje em dia. E tem problemas sérios. Mas permitem ao menos que se possa configurar o compilador.

 

Imagino que esteja usando o gcc. Ele tem dezenas e dezenas de opções de compilação, e MUITAS delas são bem importantes, para quem está aprendendo, ensinando ou apenas precisa do resultado, um código operante.

 

Usando seu programa como exemplo
 

Isso 
 

    strcpy(atleta[0].nome ,"lolipop");
    atleta[0].idade     = 21;
    atleta[0].njogos[0] =  2;
    atleta[0].ngols [0] = 15;

    strcpy(atleta[1].nome ,"kiko");
    atleta[1].idade     = 54;
    atleta[1].njogos[0] = 30;
    atleta[1].ngols [0] = 11;

    // aqui só para testar

 

pode ser escrito assim nos tempos modernos

 

    Jogador     atleta[5] =
    {
        [1] = {
            .idade = 21, .nome = "lolipop",
            .njogos = 2, .ngols = 15
        },
        [0] = {
            .nome = "kiko", .njogos = 30,
            .ngols = 11, .idade = 54,
        }
    };

 

 

Você pode escrever os valores direto na declaração, para todos ou alguns campos, em qualquer ordem.

 

Isso

 

    {
        media = ((float)atleta[i].ngols[0] / (float)atleta[i].njogos[0]);
        printf("-------------------------------\n");
        printf("Nome ------------: %s\n" , atleta[i].nome     );
        printf("IdaDe -----------: %d\n" , atleta[i].idade    );
        printf("numero de Gols --: %d\n" , atleta[i].ngols[0] );
        printf("numero de joGos -: %d\n" , atleta[i].njogos[0]);
        printf("MediA -----------: %.2f gol(s).",    media    );
        printf(" por PartiDa\n\n");
    }

 

provavelmente seria escrito assim (mesmo nos 80)

 

        printf("\
\t-------------------------------\n\
\tNome ------------: %s\n\
\tIdade -----------: %d\n\
\tNumero de gols --: %d\n\
\tNumero de jogos -: %d\n\
\tMedia de gols por jogo: %.2f\n",

               // ...

 

É mais fácil de ler e alterar e não há sentido em chamar 5 vezes a mesma função.

 

Isso
 

        media = ((float)atleta[i].ngols[0] / (float)atleta[i].njogos[0]);

 

seria algo como 

 

    (float)atleta[i].ngols / atleta[i].njogos // media so vai ser usada aqui afinal

 

direto no printf() já que só é usado uma vez e basta um cast para float.

 

A estrutura como você mesmo já disse está declarada errado: ngols e njogos são escalares e não vetores. Usar apenas o primeiro elemento do vetor não corrige o problema.

 

A estrutura podia ser declarada assim hoje em dia 

 

typedef struct
{
    char nome [50];
    int idade     ;
    int njogos;
    int ngols;

}   Jogador;

 

E seria bem mais conveniente ter um time assim declarado

 

typedef struct 
{
    unsigned    n_jogadores;
    Jogador     atleta[5];

}   Equipe;

 

Escrevendo em torno dos dados e entendendo que os atletas estão organizados em times fica tudo mais fácil.

 

Um exemplo completo usando seu código como protótipo:

 

#include <stdio.h>
#include <memory.h>

typedef struct
{
    char nome [50];
    int idade     ;
    int njogos;
    int ngols;

}   Jogador;

typedef struct 
{
    unsigned    n_jogadores;
    Jogador     atleta[5];

}   Equipe;


int  main(void)
{
    Jogador     atleta[5] =
    {
        [1] = {
            .idade = 21, .nome = "lolipop",
            .njogos = 2, .ngols = 15
        },
        [0] = {
            .nome = "kiko", .njogos = 30,
            .ngols = 11, .idade = 54,
        }
    };

    // outro jeito, mais flexivel
    Equipe      alfa = { .n_jogadores = 0 };
    // coloca os jogadores do vetor atleta na tal equipe
    alfa.atleta[0] = atleta[0];
    alfa.atleta[1] = atleta[1];
    alfa.n_jogadores = 2; // claro, acabou de copiar os dois

    // testa
    printf( "Nome do primeiro jogador na equipe: %s\n", alfa.atleta[0].nome);
    printf( "O ultimo jogador da equipe --- %s --- marcou %d gols em %d partidas\n", 
        alfa.atleta[alfa.n_jogadores-1].nome, 
        alfa.atleta[alfa.n_jogadores-1].ngols, 
        alfa.atleta[alfa.n_jogadores-1].njogos);

    // completa a equipe com os mesmos caras, so um teste afinal
    alfa.atleta[alfa.n_jogadores++] = atleta[0]; // o 3
    alfa.atleta[alfa.n_jogadores++] = atleta[0]; // o 4
    alfa.atleta[alfa.n_jogadores++] = atleta[0]; // o ultimo

    // redefine os gols a partir de 10 para ficar arrumadinho no loop
    for( int i=0; i<alfa.n_jogadores; i+=1 ) alfa.atleta[i].ngols = 10+i;
    
    printf("\nA equipe (%d atletas):\n\n", alfa.n_jogadores );
    for( int i=0; i<alfa.n_jogadores; i+=1 )
    {
        printf("\
\t[%d] ------------------------------------\n\
\tNome -----------------: %s\n\
\tIdade ----------------: %d\n\
\tNumero de gols -------: %d\n\
\tNumero de jogos ------: %d\n\
\tMedia de gols por jogo: %.2f\n",
            1+i,
            alfa.atleta[i].nome,
            alfa.atleta[i].idade,
            alfa.atleta[i].ngols,
            alfa.atleta[i].njogos,
            (float) alfa.atleta[i].ngols/alfa.atleta[i].njogos // media so vai ser usada aqui afinal
        );
    };  // for()
    return 0;
}

 

E pode ver como usar a estrutura sózinha e também o Jogador dentro da Equipe e como copiar e inicializar do jeito mais comum nesse século.

 

Eis a saída do programa
 

Nome do primeiro jogador na equipe: kiko
O ultimo jogador da equipe --- lolipop --- marcou 15 gols em 2 partidas

A equipe (5 atletas):

        [1] ------------------------------------
        Nome -----------------: kiko
        Idade ----------------: 54
        Numero de gols -------: 10
        Numero de jogos ------: 30
        Media de gols por jogo: 0.33
        [2] ------------------------------------
        Nome -----------------: lolipop
        Idade ----------------: 21
        Numero de jogos ------: 2
        Media de gols por jogo: 5.50
        [3] ------------------------------------
        Nome -----------------: lolipop
        Idade ----------------: 21
        Numero de gols -------: 12
        Numero de jogos ------: 2
        Media de gols por jogo: 6.00
        [4] ------------------------------------
        Nome -----------------: lolipop
        Idade ----------------: 21
        Numero de gols -------: 13
        Numero de jogos ------: 2
        Media de gols por jogo: 6.50
        [5] ------------------------------------
        Nome -----------------: lolipop
        Idade ----------------: 21
        Numero de gols -------: 14
        Numero de jogos ------: 2
        Media de gols por jogo: 7.00

 

Preste atenção ao código para entender a saída...

 

Como compilar isso?

 

Acrescente os parâmetros corretos na compilação e use um compilador dessa década ao menos.

 

PS C:\Users\toninho\source\repos\chc21-0606-pilha> gcc -v
Using built-in specs.
...
COLLECT_GCC=C:\bin\sys64\mingw64\bin\gcc.exe
...
COLLECT_LTO_WRAPPER=C:/bin/sys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/lto-wrapper.exe       
Target: x86_64-w64-mingw32
...
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (Rev6, Built by MSYS2 project)  
PS C:\Users\toninho\source\repos\chc21-0606-pilha> 

 

gcc -v mostra a versão do compilador que está usando. Apenas rode isso em sua m'`aquina e saberá o que tem.

 

No site do gcc pode ver as datas de liberação das versões, mas acho que algo além de 7 estará bem. 9.3 é uma versão comum.

Os ... são porque eu cortei umas linhas da saída porque não acrescentam nada aqui.

 

Compilando com gcc 10.2 por exemplo

 

PS C:\Users\toninho\source\repos\chc21-0606-pilha> gcc -c -Wall  main.c        
PS C:\Users\toninho\source\repos\chc21-0606-pilha> 

 

-c é para não gerar código, só compilar. E -Wall é para mostrar todos os erros, mesmo aqueles de baixa prioridade, os tais avisos.

 

Mas usando a versão de C de 89...

 

PS C:\Users\toninho\source\repos\chc21-0606-pilha> gcc -c -Wall -std=c89 main.c
main.c: In function 'main':
main.c:35:5: error: C++ style comments are not allowed in ISO C90
   35 |     // outro jeito, mais flexivel
      |     ^
main.c:35:5: note: (this will be reported only once per input file)
main.c:55:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   55 |     for( int i=0; i<alfa.n_jogadores; i+=1 ) alfa.atleta[i].ngols = 10+i;
      |     ^~~
main.c:55:5: note: use option '-std=c99', '-std=gnu99', '-std=c11' or '-std=gnu11' to compile your code
main.c:58:14: error: redefinition of 'i'
   58 |     for( int i=0; i<alfa.n_jogadores; i+=1 )
      |              ^
main.c:55:14: note: previous definition of 'i' was here
   55 |     for( int i=0; i<alfa.n_jogadores; i+=1 ) alfa.atleta[i].ngols = 10+i;
      |              ^
main.c:58:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
   58 |     for( int i=0; i<alfa.n_jogadores; i+=1 )
      |     ^~~

 

Pode ver tudo que deu erro e também como corrigir... Então faça isso...

 

É preciso acompanhar a evolução da linguagem nesses 60 anos para poder produzir e ler os programas modernos nas empresas e escolas de hoje em dia.

 

Se certificando...
 

PS C:\Users\toninho\source\repos\chc21-0606-pilha> gcc -c -Wall -std=c17 main.c
PS C:\Users\toninho\source\repos\chc21-0606-pilha> 

 

RESUMO: acrescente -std=c17 e -Wall nas opções de compilação do Dev-C++ e desse Code::Blocks.

 

Considere usar ambientes IDE mais modernos.

https://gcc.gnu.org/releases.html

 

Esse é o site do compilador gcc. A versão corrente é 11.3 lançada em abril de 2021. Isso nada tem a ver com o IDE.

 

outros compiladores importantes são o clang, o CL, os compiladores da Intel e da IBM

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Create New...

Redes-Wi-Fi-capa-3d-newsletter.png

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!