Ir ao conteúdo

C Como pegar o Nome certo em uma struct?


Ir à solução Resolvido por Visitante,

Posts recomendados

Postado

Bom dia/tarde/noite.

 

#include <stdio.h>
#include <string.h>
# define n 3

typedef struct fichaaluno
{
  int matricula;
  char nome [30];
  int nota1 ;
  int nota2 ;
  int nota3 ;
  float media;
} ;
struct fichaaluno aluno[n];

void main() {

float maiormedia;
int a,b,c;
 int tam,maiorno1,x1,x2,x3;
 int nomenota1aluno,mediasoma,nomemediaaluno;

for (a=0;a<n;a++)
{
 // printf("matricula: ");
 //   scanf("\n%d",&aluno[a].matricula);

  printf("nome:");
    fflush(stdin);
    fgets(aluno[a].nome,25,stdin);
     tam=strlen(aluno[a].nome);
     if(aluno[a].nome[tam-1]=='\n')
     aluno[a].nome[--tam]='\0';

       fflush(stdin);

  printf("nota1: ");
    scanf("\n%d",&aluno[a].nota1);
  printf("nota2: ");
    scanf("\n%d",&aluno[a].nota2);
  printf("nota3: ");
    scanf("\n%d",&aluno[a].nota3);
    printf("\n");
    while ( (c = getchar()) != '\n' && c != EOF );
}
maiorno1=aluno[0].nota1;
printf("\naluno com maior nota na primeira prova: ");
for (a=0;a<n;a++)
{
  if (maiorno1<aluno[a].nota1)
  maiorno1=aluno[a].nota1;
  nomenota1aluno=a;
//printf("\nmatricula: %d\nnome: %s\nnota1: %d\nnota2: %d\nnota3: %d\n", aluno[a].matricula, aluno[a].nome, aluno[a].nota1, aluno[a].nota2, aluno[a].nota3 );
}
printf("\nnota:%i aluno: %s\n",maiorno1,aluno[nomenota1aluno].nome);

printf("\naluno com maior media: ");
for (a=0;a<n;a++){

    x1=aluno[a].nota1;
    x2=aluno[a].nota2;
    x3=aluno[a].nota3;
    aluno[a].media= (x1+x2+x3)/3;
}
maiormedia=0;
for (a=0;a<n;a++)
{
  if (maiormedia<aluno[a].media)
  maiormedia=aluno[a].media;
  nomemediaaluno=a;
}
printf("\nmedia: %.2f aluno: %s\n",maiormedia,aluno[nomemediaaluno].nome);

printf("\naluno com a menor media: ");
float menormedia=maiormedia;
int menormediaaluno;
for (a=0;a<n;a++)
{
  if (menormedia>aluno[a].media) 
  menormedia=aluno[a].media;
  menormediaaluno=a;
}
printf("\nmedia: %.2f aluno: %s",menormedia,aluno[menormediaaluno].nome);

}

O problema de logica é nessa parte: 

maiormedia=0;
for (a=0;a<n;a++)
{
  if (maiormedia<aluno[a].media)
  maiormedia=aluno[a].media;
  nomemediaaluno=a; //<--------------
}
printf("\nmedia: %.2f aluno: %s\n",maiormedia,aluno[nomemediaaluno].nome);

printf("\naluno com a menor media: ");
float menormedia=maiormedia;
int menormediaaluno;
for (a=0;a<n;a++)
{
  if (menormedia>aluno[a].media) 
  menormedia=aluno[a].media;
  menormediaaluno=a; // <------------ 
}
printf("\nmedia: %.2f aluno: %s",menormedia,aluno[menormediaaluno].nome);

Tanto o 'nomemedialuno' quanto o 'menormediaaluno' apenas mostram o ultimo imput lido, em vez de mostrarem o que tem a maior media e menor media respectivamente.

As medias são mostradas corretamentes, só o nome que sempre sai errado, não consigo pensar numa logica para arrumar isso.

 

qualquer ajuda agradeço : ) .

  • Solução
Postado

@Lucas Pelepek Olá. O principal erro q você está cometendo é na falta de usar as chaves no if dentro do for. Veja um exemplo com seu código dessa forma funcionando:

maiormedia = aluno[0].media;
for (i = 0; i < n; i++)
{
    if (maiormedia < aluno[i].media) {
        maiormedia = aluno[i].media;
        nomemediaaluno = i;
    }
}
printf("\nmedia: %d aluno: %s\n", maiormedia, aluno[nomemediaaluno].nome);

Veja se consegue perceber a diferença no if dentro do for

Dica: Se você está começando com programação faça uso das chaves mesmo que seja só para uma linha dentro de um if, for, etc... Com isso você não é induzido ao erro, como está acontecendo em seu código

Sugiro também nomes mais adequados para suas variáveis :thumbsup:

Mas, de maneira geral, bem interessante seu código!

 

Obs: Defina sua struct assim:

struct fichaaluno
{
    int matricula;
    char nome [30];
    int nota1 ;
    int nota2 ;
    int nota3 ;
    float media;
};

E também mude o que colocou como float para int, ou mude nota1, nota2, maiormedia, etc... para float

adicionado 39 minutos depois

@Lucas Pelepek Segue seu código:

#include <stdio.h>
#include <string.h>
# define n 3

struct ficha_aluno
{
    char nome[30];
    float nota1;
    float nota2;
    float nota3;
    float media;
};

struct ficha_aluno aluno[n];

void limpa_linha() { // função para substituir o comando fflush(stdin);
    scanf("%*[^\n]");
    scanf("%*c");
}

int main(void) {

    float maior_media = 0, menor_media = 0, maior_n1 = 0;
    int nome_nota = 0, nome_media = 0, i;

    for (i = 0; i < n; i++) {

        printf("nome: ");
        fgets(aluno[i].nome, 30, stdin);

        printf("nota1: ");
        scanf("%f", &aluno[i].nota1);
        limpa_linha();

        printf("nota2: ");
        scanf("%f",&aluno[i].nota2);

        printf("nota3: ");
        scanf("%f",&aluno[i].nota3);
        limpa_linha();

        printf("\n");
    }

    printf("\naluno com maior nota na primeira prova: ");

    maior_n1 = aluno[0].nota1;
    for (i = 0; i < n; i++) {
        if (maior_n1 < aluno[i].nota1) {
            maior_n1 = aluno[i].nota1;
            nome_nota = i;
        }
    }
    printf("\nnota: %.2f aluno: %s\n", maior_n1, aluno[nome_nota].nome);

    printf("\naluno com maior media: ");

    for (i = 0; i < n; i++) {
        aluno[i].media = (aluno[i].nota1 + aluno[i].nota2 + aluno[i].nota3) / 3;
    }

    maior_media = aluno[0].media;
    for (i = 0; i < n; i++) {
        if (maior_media < aluno[i].media) {
            maior_media = aluno[i].media;
            nome_media = i;
        }
    }
    printf("\nmedia: %.2f aluno: %s\n", maior_media, aluno[nome_media].nome);

    printf("\naluno com a menor media: ");

    menor_media = aluno[0].media;
    for (i = 0; i < n; i++)
    {
        if (menor_media > aluno[i].media) {
            menor_media = aluno[i].media;
            nome_media = i;
        }
    }
    printf("\nmedia: %.2f aluno: %s", menor_media, aluno[nome_media].nome);

    return 0;
}

Inda dá para melhorar mais!

Postado

Opa, era isso mesmo, hahaha, valeu pela ajuda, vou aplicar sua dica nos proximos.

adicionado 5 minutos depois

já tinha mandado antes de ver sua edição.

ficou mil vezes melhor do jeito que voce ajeitou hahaha, tenho que usar como exemplo.

 

valeu pelo limpa linha, irei usar futuramente.

adicionado 26 minutos depois

@giu_d um pequeno erro aqui:

 

 menor_media = aluno[0].media;
    for (i = 0; i < n; i++)
    {
        if (menor_media > aluno[i].media) {
            menor_media = aluno[i].media;
            nome_media = i;
        }
    }

mudando o menor_media para:
 

 menor_media = maior_media;
    for (i = 0; i < n; i++)
    {
        if (menor_media > aluno[i].media) {
            menor_media = aluno[i].media;
            nome_media = i;
        }
    }

arruma.

:thumbsup:

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...