Ir ao conteúdo

Posts recomendados

Postado

Olá, boa noite, espero que estejam todo bem.

 

Olha só, estou tentando resolver a questão do vetor, que vai para Struct e depois ele tem que entrar na Função "media_notas", eu não consigo fazer a conexão entre o que é lido e o que é entrada na função.

 

A ordem do exercício é o seguinte:

" Implemente uma base de dados (utilizando estruturas) de alunos. Esta devem conter as informações de matrícula, curso, nome do aluno, idade, endereço e notas. Após, implemente um programa que o usuário passe essas informações e calcule a média e retorne a situação do aluno (aprovado ou reprovado), utilizando uma mensagem adequada."

 

Se alguém puder me ajudar, agradeço muito mesmo.

 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#include <math.h>
#include <string.h>

#define SIZE 10

typedef struct ALUNO
{
	int   matricula;
	char  curso[40];
	char  nome_aluno[40];
	int   idade;
	char  endereco[50];
	float notas[SIZE];
	int   num;
	float media_geral;
	
}ALUNO;

void printar(ALUNO *MATRICULA, ALUNO *CURSO, ALUNO *NOME_ALUNO, ALUNO *IDADE, ALUNO *ENDERECO)
{
	setlocale(LC_ALL,"Portuguese");
	
	printf("\n Matrícula....: %d \n", MATRICULA->matricula);
	printf("\n Curso........: %s \n", CURSO->curso);
	printf("\n Nome.........: %s \n", NOME_ALUNO->nome_aluno);
	printf("\n Idade........: %i \n", IDADE->idade);
	printf("\n Endereço.....: %s \n", ENDERECO->endereco);
}

void media_notas(ALUNO * NOTAS[], ALUNO *N)
{
	int i = 0;
	float soma_notas = 0, nota_media = 0;
	
	for(i = 0; i < N->num; i++)
	{
		soma_notas = soma_notas + NOTAS[i]->notas[i];
	}
		
	nota_media = soma_notas/ i;
	
	printf("\n A média das Notas do Aluno é igual a: %0.2f \n", nota_media);
	
	if(nota_media >= 5.00)
	{
		printf("\n O aluno está APROVADO! \n");
	} 
	
	else 
	{
		printf("\n O aluno está REPROVADO! \n");
	}
}

int main()
{
	setlocale(LC_ALL,"Portuguese");
	
	ALUNO MATRICULA, CURSO;
	ALUNO NOME_ALUNO;
	ALUNO IDADE, ENDERECO;
	ALUNO NOTAS[SIZE], N;
	ALUNO MEDIA;
	
	
	printf("\n Digite o Número de Matrícula d@ Alun@: ");
	scanf("%d", &MATRICULA.matricula);
	
    fflush(stdin);
	printf("\n Digite seu Curso: ");
	fgets(CURSO.curso, 39, stdin);
	
    fflush(stdin);
	printf("\n Digite seu Nome: ");
	fgets(NOME_ALUNO.nome_aluno, 39, stdin);
	
	printf("\n Digite sua Idade: ");
	scanf("%d", &IDADE.idade);
	
    fflush(stdin);	
	printf("\n Digite seu Endereço: ");
	fgets(ENDERECO.endereco, 49, stdin);
	
  
    int i = 0;
    printf("\n Digite o Número de Avaliações Realizadas \n");
    scanf("%i", &N.num);
    
    printf("\n Digite as Notas desse Aluno nas respectivas Avaliações: \n");
    
    for (i = 0; i < N.num; i++)
    {
    	scanf("%f", NOTAS[i].notas[SIZE]);
	}
	
	printar(&MATRICULA, &CURSO, &NOME_ALUNO, &IDADE, &ENDERECO);

	media_notas(&NOTAS &N);
	
	printf("\n");
	system("pause");
	return 0;	
}

 

 

Postado
void printar(ALUNO *MATRICULA, ALUNO *CURSO,
 ALUNO *NOME_ALUNO, ALUNO *IDADE, ALUNO *ENDERECO){};


@Liara K A ideia de ter uma estrutura é justamente acessar as informações como um conjunto. Qual o sentido de usar uma lista de argumentos e declarar uma série de ponteiros para ALUNO ao invés de apenas um?

 

Use apenas 
 

void     printar( Aluno*   aluno){}

 

Evite o vício de declarar coisas como
 

ALUNO               *aluno;

 

Como o próprio compilador vai te dizer muitas vezes, na linha acima está declarando aluno. Apenas aluno. E aluno é o que? Um ponteiro para ALUNO. No popular em C aluno é ALUNO*. Então declare como tal:
 

	ALUNO*    	aluno;

 

afinal está declarando aluno como ALUNO*.

 

Considere a convenção quase universal (nos tempos pós Microsoft windows anos 90 porque nessa época a Microsoft declarava estruturas assim  --- de usar uma única maiúscula no início do nome de suas estruturas e tipos, e reservar nomes em maiúsculas para constantes, como em #define, como INT_MAX por exemplo. 

 

Já te disse isso antes em outro programa: teste o retorno de scanf() sempre. É ingênuo não fazer isso. Qual o propósito de seguir com o programa sem saber se scanf() conseguiu ler algo?????

 

Sobre esse trecho:

 

 fflush(stdin);
	printf("\n Digite seu Nome: ");
	fgets(NOME_ALUNO.nome_aluno, 39, stdin);
	
	printf("\n Digite sua Idade: ");
	scanf("%d", &IDADE.idade);
	
    fflush(stdin);	
	printf("\n Digite seu Endereço: ");
	fgets(ENDERECO.endereco, 49, stdin);

 

Está errado. Bem errado. 

  • não use fflush() na entrada. Em geral sequer funciona. Essa função existe para arquivos de saída apenas. Não use isso.
     
  • Que tenta fazer com NOME_ALUNO.nome_aluno por exemplo? Isso sequer existe. Se quer acessar um campo da estrutura ALUNO use como nesse programa de exemplo
     
    #define SIZE 5
    #include <stdio.h>
    #include <string.h>
    
    typedef struct
    {
    	int   matricula;
    	char  curso[40];
    	char  nome_aluno[40];
    	int   idade;
    	char  endereco[50];
    	float nota[SIZE];
    	int   num;
    	float media_geral;
    	
    }	Aluno;
    
    int         mostra(Aluno*);
    
    int main(void)
    {
        Aluno aluno[2]; // dois alunos
    
        aluno[0].matricula = 20;
        aluno[0].media_geral = 7.6;
        strcpy(aluno[0].nome_aluno, "Forum");
        aluno[0].nota[4] = 5.5;
    
        aluno[1].matricula = 200;
        aluno[1].media_geral = 8.3;
        strcpy(aluno[1].nome_aluno, "Clube do Hardware");
        aluno[1].nota[4] = 7.25;
    
        mostra(&aluno[0]);
        mostra(&aluno[1]);
        return 0;
    
    };  // main()
    
    int     mostra(Aluno* A)
    {
        printf( "Aluno:  '%s' media: %.3f ultima nota: %.2f\n",
            A->nome_aluno,
            A->media_geral,
            A->nota[4]);
        return 0;
    };  // mostra()

que preenche e mostra um vetor com dois alunos. E mostra
 

Aluno:  'Forum' media: 7.600 ultima nota: 5.50
Aluno:  'Clube do Hardware' media: 8.300 ultima nota: 7.25
  • Repito: teste o retorno de scanf().


    Rode esse programa em sua máquina e entenda como declarar e referenciar os campos. E poste seu novo código!
  • Obrigado 1
Postado

@Liara K Tome isso como base, está incompleto, mas funciona:

Spoiler

#include <stdio.h>
#include <stdlib.h>

#define QTD_NOTAS 2

typedef struct {
    char matricula[256];
    char nome[256];
    char endereco[256];
    char curso[256];
    double notas[QTD_NOTAS];
    double media;
    int idade;
} Aluno;

void calcularMediaAlunos(Aluno* alunos, size_t tamanho) {
    for(int i = 0; i < tamanho; i++) {
        alunos[i].media = 0;
        
        for(int j = 0; j < QTD_NOTAS; j++) {
            alunos[i].media += alunos[i].notas[j];
        }
        
        alunos[i].media /= QTD_NOTAS;
    }
}

void imprimirAlunos(Aluno* alunos, size_t tamanho){
    for(int i = 0; i < tamanho; i++) {
        printf("Media: %.2f \n", alunos[i].media);
    }
}

int main() {
    const size_t tamanho = 2;
    Aluno alunos[] = {
        (Aluno){"", "", "", "", {10 ,5}, 0.0, 0},
        (Aluno){"", "", "", "", {3, 2}, 0.0, 0}
    };
    
    calcularMediaAlunos(alunos, tamanho);
    imprimirAlunos(alunos, tamanho);
    
    return EXIT_SUCCESS;
}

 

 

  • Obrigado 2

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