Ir para conteúdo
Fórum Script Brasil
  • 0

[Ajuda] Struct - Cadastro de alunos


RS25

Pergunta

O programa deverá cadastrar alunos de uma determinada disciplina

e devera ser implementada uma função que imprima o número de matrícula, o nome, a turma e a média de todos os alunos aprovados na disciplina.

E deverá seguir o seguinte modelo de estrutura

struct aluno
{
char nome[81];
char matricula[8];
char turma;
float p1;
float p2;
float p3;

};
E o critério de aprovação é dado pelas media das três provas (p1,p2 e p3). A função devera obedecer ao seguinte protótipo: void imprime_aprovados (int n, Aluno** turmas); E também deverá ser feita uma função para imprimir a média dos alunos de uma determinada turma. E deverá seguir o seguinte protótipo: float media_turma (int n, Aluno** turmas, char turma); Fiz o seguinte:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct aluno
{
   char nome[81];
   char matricula[8];
   char turma;
   float p1;
   float p2;
   float p3;
   
}; 

typedef struct aluno Aluno;

#define MAX 3
Aluno* turmas[MAX];

void inicializa (int n, Aluno** turmas) /*funçãos para imprimir os aprovados*/
{
int i;
for (i=0; i<n; i++)
turmas[i] = NULL;
}

void preenche (int n, Aluno** turmas, int i)
{
     
     if (i<0 || i>=n) {
     printf("Indice fora do limite do vetor\n");
     exit(1);
     }
     
     if (turmas[i]==NULL)
     turmas[i] = (Aluno*)malloc(sizeof(Aluno));
     
     printf("Entre com o nome");
     scanf("%80[^\n]", &turmas[i]->nome);
     printf("Entre com a matricula");
     scanf("%c", &turmas[i]->matricula);
     printf("Entre com a turma");
     scanf("%120[^\n]", &turmas[i]->turma);
     printf("Entre com a primeira nota");
     scanf("%f", &turmas[i]->p1);
     printf("Entre com a segunda nota");
     scanf("%f", &turmas[i]->p2);
     printf("Entre com a terceira nota");
     scanf("%f", &turmas[i]->p3);
     
}

void imprime (int n, Aluno** turmas, int i)
{
    
     if (i<0 || i>=n) {
     printf("Indice fora do limite do vetor\n");
     exit(1);
     }
     
     if (turmas[i]!=NULL)
    { 
    printf("\n\nMatricula: %d\n", turmas[i]->matricula);
    printf("\n\nNome: %s\n", turmas[i]->nome);
    printf("\n\nTurma: %s\n", turmas[i]->turma);
  printf("\n\n");
    }
}     
     

void imprime_aprovados (int n, Aluno** turmas)
{

int i;
float media;
float p1,p2,p3;

media = (p1+p2+p3)/3;

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

{

if (media>6.0)
 {
 imprime(n,turmas,i);    
 }   
}
   
} 
     
/*programa principal*/
main(){
       
       Aluno* turmas[10];
       preenche(10,turmas,0);
       preenche(10,turmas,1);
       preenche(10,turmas,1);
       imprime_aprovados(10,turmas);
       system("pause");
       return 0;
       
}

Só que esta com erro para cadastrar a matrícula e também no final o programa não mostra os resultado esperado que e mostrar a média dos alunos aprovados

e mostrar os alunos aprovados.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

O problema da matricula eu vi logo de cara:

char matricula[8];
Matricula é pra ser um INT, não? e não precisa ser um vetor! um mero INT daria conta do serviço! (a não ser que você tenha mais de, se não me engano, 1milhao400mil alunos, dai você precisaria de um LONG INT...!) Então, muda na declaracao, pra: int matricula; ou long int matricula; dai, eminentemente, tem que arrumar na "captação" da matricula:
scanf("%c", &turmas[i]->matricula);
tem que por com %d. E, na impressão, você já considerou como sendo int!!
rintf("\n\nMatricula: %d\n", turmas[i]->matricula);
Então não precisa mudar nada... Agora, quanto o final do programa, não sei... não achei nenhum erro, de cara... precisaria saber exatamente o que ta acontecendo! Sei la, coloca um "else" na "imprime aprovados", pra ele imprimir tambem os não aprovados, só que de maneira diferente, algo assim:
else
{
    printf("aluno não aprovado\n");
    imprime(n,turmas,i);
}

só pra diferenciar dos não aprovados e testar, efetivamente, a funcao "imprime"

E.. .quanto a imprimir a média dos aprovados... bom, não achei em nenhum lugar do código algo que imprimisse a média!

Só achei a função "imprime", que imprime nome, matricula e turma, não?

Ve ai se não ta faltando algo...

E, só um detalhe, mas você está atribuindo, no seu programa principal, duas vezes um mesmo aluno na posicao turmas[1]... Você está chamando duas vezes a funçao "preenche" com os mesmos argumentos! Da uma arrumada nisso tb...

E faça estes testes que eu disse, e poste exatamente o que a função está imprimindo, ou se ela não imprime nada, nem com o "else" que eu sugeri...

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz as correções e o programa agora esta erro para colocar a matrícula do aluno

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 2

struct aluno
{
   char nome[81];
   int matricula[8];
   char turma;
   float p1;
   float p2;
   float p3;
   
}; 

typedef struct aluno Aluno;


Aluno* turmas[MAX];

void inicializa (int n, Aluno** turmas) /*funçãos para imprimir os aprovados*/
{
int i;
for (i=0; i<n; i++)
turmas[i] = NULL;
}

void preenche (int n, Aluno** turmas, int i)
{
     
     if (i<0 || i>=n) {
     printf("Indice fora do limite do vetor\n");
     exit(1);
     }
     
     if (turmas[i]==NULL)
     turmas[i] = (Aluno*)malloc(sizeof(Aluno));
     
     printf("Entre com o nome\n");
     scanf("%c", &turmas[i]->nome);
     printf("Entre com a matricula\n");
     scanf("%d", &turmas[i]->matricula);
     printf("Entre com a turma\n");
     scanf("%c", &turmas[i]->turma);
     printf("Entre com a primeira nota\n");
     scanf("%f", &turmas[i]->p1);
     printf("Entre com a segunda nota\n");
     scanf("%f", &turmas[i]->p2);
     printf("Entre com a terceira nota\n");
     scanf("%f", &turmas[i]->p3);
     
}

void imprime (int n, Aluno** turmas, int i)
{
    
     if (i<0 || i>=n) {
     printf("Indice fora do limite do vetor\n");
     exit(1);
     }
     
     if (turmas[i]!=NULL)
    { 
    printf("\n\nMatricula: %d\n", turmas[i]->matricula);
    printf("\n\nNome: %s\n", turmas[i]->nome);
    printf("\n\nTurma: %s\n", turmas[i]->turma);
    printf("\n\n");
    }
}     
     
void imprime_aprovados (int n, Aluno** turmas)
{

int i;
float media;
float p1,p2,p3;

media = (p1+p2+p3)/3;

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

{

if (media>6.0)
 {
 imprime(n,turmas,i);     
 }   

   
} 
}
     
/*programa principal*/
main()
{
       
       Aluno* turmas[10];
       preenche(10,turmas,0);
       imprime_aprovados(10,turmas);
       system("pause");
       return 0;
       
}
O problema da matricula eu vi logo de cara:
char matricula[8];
Matricula é pra ser um INT, não? e não precisa ser um vetor! um mero INT daria conta do serviço! (a não ser que você tenha mais de, se não me engano, 1milhao400mil alunos, dai você precisaria de um LONG INT...!) Então, muda na declaracao, pra: int matricula; ou long int matricula; dai, eminentemente, tem que arrumar na "captação" da matricula:
scanf("%c", &turmas[i]->matricula);
tem que por com %d. E, na impressão, você já considerou como sendo int!!
rintf("\n\nMatricula: %d\n", turmas[i]->matricula);
Então não precisa mudar nada... Agora, quanto o final do programa, não sei... não achei nenhum erro, de cara... precisaria saber exatamente o que ta acontecendo! Sei la, coloca um "else" na "imprime aprovados", pra ele imprimir tambem os não aprovados, só que de maneira diferente, algo assim:
else
{
    printf("aluno não aprovado\n");
    imprime(n,turmas,i);
}

só pra diferenciar dos não aprovados e testar, efetivamente, a funcao "imprime"

E.. .quanto a imprimir a média dos aprovados... bom, não achei em nenhum lugar do código algo que imprimisse a média!

Só achei a função "imprime", que imprime nome, matricula e turma, não?

Ve ai se não ta faltando algo...

E, só um detalhe, mas você está atribuindo, no seu programa principal, duas vezes um mesmo aluno na posicao turmas[1]... Você está chamando duas vezes a funçao "preenche" com os mesmos argumentos! Da uma arrumada nisso tb...

E faça estes testes que eu disse, e poste exatamente o que a função está imprimindo, ou se ela não imprime nada, nem com o "else" que eu sugeri...

Link para o comentário
Compartilhar em outros sites

  • 0

nossa, fiz um tópico enorme ontem, e não salvou...!!!

enfim, vou falar resumidamente:

int matricula[8];
você aqui ta usando matricula como um vetor! deve usa-la como um int normal, ou, no maximo, como um long int...!! E outro ponto: ao fazer tal atribuição
scanf("%c", &turmas[i]->nome);

voce ta cometendo um erro, que ainda não deve ter aparecido, mas vai aparecer!

como "nome" é um vetor, passar o argumento "&nome" é errado.

quando uma variavel ("nome", por exemplo) é declarada como um vetor, se voce usar "nome" no programa, o que você está escrevendo é exatamente igual a "&nome[0]", ou seja, "nome" representa o endereço do primeiro elemento do vetor "nome".

Portanto, quando voce passa "nome" prum argumento de scanf, voce deve armazenar um VETOR nesse argumento, e voce está armazenando somente um caractere! então, vai dar erro!

o certo seria voce armazenar um vetor ali, e, portanto, deveria digitar "%s" ao invés de "%c", alem do que, não deve ser "&turmas->nome", e sim "turmas->nome"

(na verdade, o que eu falo acima vale, com certeza absoluta, sem ser o caso da struct! mas não imagino que mude, deve ser isso mesmo...

tente fazer essas modificações e poste os resultados!

Link para o comentário
Compartilhar em outros sites

  • 0

boa noite galera tenho um problemao vi os códigos aí e não consegui compilar nenhum.

preciso fazer um trabalho linguagem c e está especificado devic++ esse é:

Um professor de Ensino Fundamental precisa de um sistema para cadastrar as notas dos seus alunos.Ele tem que registrar as notas de quatro provas (p1,p2,p3 e p4 ) além de uma prova substitutiva (para substituir a menor nota).

O sistema deve calcular a média de cada um dos alunos, que é igual a media ponderada das quartos provas. Caso a média seja inferior a 5,0 O aluno é reprovado.

O sistema deve ser composto das seguintes partes:

1 cadastro de aluno:nome do aluno e matricula.

2cadastro de notas:cadastro de nota das provas p1,p2,p3,p4,e da prova substitutiva .

3calculo das médias: O sistema deve conter uma função de calcular médias de cada um dos alunos, depois de todas as notas cadastradas. A função de mediaexeculta o calculo da media ponderada, isto é cada nota possui um peso (p1,peso1,p2,peso2,p3,peso3,p4,peso4).

4 relatorio de desempenho : O sistema deve imprimir (em tela) um relatorio com o nome de todos os alunos,suas notas e médias e a media da sala.    alguém pode me ajudar

 

Captura de Tela (185).png

Captura de Tela (186).png

Captura de Tela (187).png

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...