Ir ao conteúdo
  • Cadastre-se

C dificuldade em completar exercício em C


Posts recomendados

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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

@Helio Junnior Sartor Dalmolin    sempre na posição zero do vetor ngols ,assim :

printf("Digite o numero de jogos do jogador: \n");
scanf("%d", &atleta[i].njogos[0]);
printf("Digite o numero de gols do jogador: \n");
scanf("%d", &atleta[i].ngols[0]);
media = atleta[i].ngols[0]) / atleta[i].njogos[0];

 

Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

×
×
  • Criar novo...