Ir ao conteúdo
  • Cadastre-se
GustavoSoaresLima

C Programa em C para cadastrar aluno

Recommended Posts

Boa noite/tarde/dia, eu preciso fazer um programa para calcular IMC e cadastrar alunos, mas não estou conseguindo, não entendo nada de C.

 

Isso é o que pede no enunciado:

* Uma função separada para calcular o imc, ela recebe dois valores em ponto flutuante (peso e altura) e retorna um valor (o imc) em ponto flutuante.
* Uma estrutura chamada Aluno onde será armazenado nome, e-mail, peso e altura.
* Um vetor de 20 posições que armazenará as estruturas.
* Uma tela de menu, que terá as seguintes opções:

1. Cadastra aluno (apenas 1, escolhendo a posição de 1 a 20).
2. Listar alunos.
3. Apagar aluno (pode apagar pela posição na lista).
4. Listar IMC de alunos (lista todos os nomes, com o valor do IMC e a condição para o IMC de acordo com a tabela acima).
0. Sair.

O programa deve permanecer em execução até o usuário escolher a opção "Sair".

 

Isso é o que eu fiz até agora, quando eu compilo não da erro nenhum, o programa roda, mas quando eu escolho uma das opções me retorna o erro "Segmentation fault".

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

struct Aluno
{
          char nome[30];
          char email[30];
          float peso;
		  float altura;
		  float IMC;
};

          struct Aluno cad_aluno[20];

float calculaimc(float p, float a){
    float resultado = p / (a*a);
    return resultado;
}

int main (){
	int opcao, i;
	setlocale(LC_ALL, "Portuguese");

	do {
        printf("Cadastro dos Alunos: \n");
        printf("Digite o numero de uma das opções: \n");
        printf("1- Cadastrar aluno \n");
        printf("2- Listar alunos \n");
        printf("3- Apagar alunos \n");
        printf("4- Listar IMC de alunos \n");
        printf("0- Sair \n");
        scanf("%d", opcao);

        switch(opcao) {

		case 1:
			for (i = 0; i <20; i++){
				fflush(stdin);
				printf ("\n Nome do aluno:");
				scanf ("%s", &cad_aluno[i].nome);
				fflush(stdin);
				printf ("\n Email do aluno:");
				scanf ("%s", &cad_aluno[i].email);
				fflush(stdin);
				printf ("\n Peso do aluno: ");
				scanf ("%f", &cad_aluno[i].peso);
				fflush(stdin);
				printf ("\n Altura do aluno: ");
				scanf ("%f", cad_aluno[i].altura);
				fflush(stdin);
				cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
				fflush(stdin);

			}
			break;
		case 2:
			for (i = 0; i <20; i++) {
				printf("d: %s | %s | %.2f | %.2f | %.2f",
				i,
                cad_aluno[i].nome,
                cad_aluno[i].email,
                cad_aluno[i].peso,
				cad_aluno[i].altura,
				cad_aluno[i].IMC
				);
			}
			break;
		case 3 :
			break;
		case 4 :
            for (i = 0; i <20; i++) {
				printf("%.2f",
				cad_aluno[i].IMC
				);
            }
            break;
		case 0 : exit(0);
		default:
			printf ("Opção invalida\n");
			break;
	}

} while (1);

	return 0;
}

 

adicionado 6 minutos depois

Consertei o:

scanf("%d", &opcao);

mas quando iria executar o:

cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);

O erro volta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeira coisa, não é pra o programa ficar rodando 20 vezes, o switch só roda uma vez, quando terminar de cadastrar deve voltar pro menu.

Segundo para que o programa fique mais organizado, estruture ele em funções: uma função para o menu, uma para o switch, uma pra listar os alunos; uma para apagar um aluno e uma para calcular o imc.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Sobre:

7 horas atrás, GustavoSoaresLima disse:

mas quando iria executar o:


cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);

 

Então, seria necessário verificar de fato onde está ocorrendo o erro. O que já dá para verificar é que é após ler a altura! Mas não necessariamente é no calculoimc(). Fiz assim para descobrir:

                    printf ("\n Altura do aluno: ");
                    scanf ("%f", cad_aluno[i].altura);
                    fflush(stdin);
                    cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
                    fflush(stdin);
                    printf ("\n xxx");

Deu erro na mesma linha... (não chegou no "xxx"). Depois assim:

                    printf ("\n Altura do aluno: ");
                    scanf ("%f", cad_aluno[i].altura);
                    fflush(stdin);
                    //cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
                    fflush(stdin);
                    printf ("\n xxx");
                }

Deu erro na mesma linha, ou seja, o erro não está no calculaimc().

 

 

Pronto! O erro está no scanf() da altura. Analisando verás que não colocou o &.

 

obs.: claro que se já analisasse o scanf() iria achar, tentei demonstrar da forma que eu fiz.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 horas atrás, Luís Roberto C. da Silva disse:

Primeira coisa, não é pra o programa ficar rodando 20 vezes, o switch só roda uma vez, quando terminar de cadastrar deve voltar pro menu.

Segundo para que o programa fique mais organizado, estruture ele em funções: uma função para o menu, uma para o switch, uma pra listar os alunos; uma para apagar um aluno e uma para calcular o imc.

 

Arrumei isso de rodar 20 vezes, sobre deixar o programa mais organizado, como esse é um trabalho que eu tenho prazo para entrega não quero tentar fazer muito, com medo de não conseguir fazer nada e não entregar, mas obrigado pelas observações.

adicionado 5 minutos depois
4 horas atrás, Simon Viegas disse:

Olá.

 

Sobre:

 

Então, seria necessário verificar de fato onde está ocorrendo o erro. O que já dá para verificar é que é após ler a altura! Mas não necessariamente é no calculoimc(). Fiz assim para descobrir:


                    printf ("\n Altura do aluno: ");
                    scanf ("%f", cad_aluno[i].altura);
                    fflush(stdin);
                    cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
                    fflush(stdin);
                    printf ("\n xxx");

Deu erro na mesma linha... (não chegou no "xxx"). Depois assim:


                    printf ("\n Altura do aluno: ");
                    scanf ("%f", cad_aluno[i].altura);
                    fflush(stdin);
                    //cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
                    fflush(stdin);
                    printf ("\n xxx");
                }

Deu erro na mesma linha, ou seja, o erro não está no calculaimc().

 

 

Pronto! O erro está no scanf() da altura. Analisando verás que não colocou o &.

 

obs.: claro que se já analisasse o scanf() iria achar, tentei demonstrar da forma que eu fiz.

Olá.

Mudei o código, e agora ele cadastra, mostra a lista de alunos e a lista de IMC dos alunos, mas ele não esta mostrando o float direito, eu coloco valores neles, mas quando peço pra mostrar só aparece "0.00".

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

struct Aluno{
          char nome[20];
          char email[20];
          float peso;
		  float altura;
		  float IMC;
};

          struct Aluno cad_aluno[20];

float calculaimc(float p, float a){
    float resultado = p / (a*a);
    return resultado;
}

int main (){
	int opcao, i, l;
	setlocale(LC_ALL, "Portuguese");

        for (i = 1; i <=20;){
            printf("\n\nCadastro dos Alunos: \n");
            printf("Digite o numero de uma das opções: \n");
            printf("1- Cadastrar aluno \n");
            printf("2- Listar alunos \n");
            printf("3- Apagar alunos \n");
            printf("4- Listar IMC de alunos \n");
            printf("0- Sair \n");
            scanf("%d", &opcao);

            switch(opcao) {

            case 1:

                    fflush(stdin);
                    printf ("\n Nome do aluno:");
                    scanf ("%s", &cad_aluno[i].nome);
                    fflush(stdin);
                    printf ("\n Email do aluno:");
                    scanf ("%s", &cad_aluno[i].email);
                    fflush(stdin);
                    printf ("\n Peso do aluno: ");
                    scanf ("%f", &cad_aluno[i].peso);
                    fflush(stdin);
                    printf ("\n Altura do aluno: ");
                    scanf ("%f", &cad_aluno[i].altura);
                    fflush(stdin);
                    cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
                    fflush(stdin);
                    i++;
                break;
            case 2:
                for (l = 1; l <=20; l++) {
                    if(l < i){
                        printf("\n\nNome: %s", &cad_aluno[l].nome);
                        printf("\nEmail: %s", &cad_aluno[l].email);
                        printf("\nPeso: %1.2f", &cad_aluno[l].peso);
                        printf("\nAltura: %1.2f", &cad_aluno[l].altura);
                        printf("\nIMC: %1.2f", &cad_aluno[l].IMC);
                    }
                    else{
                        l = 20;
                    }
                }
                break;
            case 3 :
                break;
            case 4 :
                for (l = 0; l <20; l++) {
                    if(l < i){
                        printf("IMC do aluno %d: %1.2f", &l, &cad_aluno[l].IMC);
                    }
                    else{
                        l = 20;
                    }
                }
                break;
            case 0 : exit(0);
            default:
                printf ("Opção invalida\n");
                break;
        }
	}

	return 0;
}

 

O sair também funciona, e eu também não sei como vou fazer para apagar os alunos.

Obrigado desde já.

Editado por GustavoSoaresLima

Compartilhar este post


Link para o post
Compartilhar em outros sites
34 minutos atrás, GustavoSoaresLima disse:

Olá.

Mudei o código, e agora ele cadastra, mostra a lista de alunos e a lista de IMC dos alunos, mas ele não esta mostrando o float direito, eu coloco valores neles, mas quando peço pra mostrar só aparece "0.00".

 

Acho que na hora de imprimir não usa o &. Pelo menos aqui funcionou:

                        printf("\n\nNome  : %s", cad_aluno[l].nome);
                        printf("\nEmail : %s", cad_aluno[l].email);
                        printf("\nPeso  : %1.2f", cad_aluno[l].peso);
                        printf("\nAltura: %1.2f", cad_aluno[l].altura);
                        printf("\nIMC   : %1.2f", cad_aluno[l].IMC);

 

Qualquer coisa dá uma olhada em como imprimir esses tipos numéricos.

 

adicionado 22 minutos depois

 

Sobre a indentação, tentei dar uma reorganizada no código original-:

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

struct Aluno {
    char nome[20];
    char email[20];
    float peso;
    float altura;
    float IMC;
};

struct Aluno cad_aluno[20];

float calculaimc(float p, float a) {
    float resultado = p/(a*a);
    return resultado;
}

int main () {
    setlocale(LC_ALL, "Portuguese");
    int opcao, i, l;
    
    for (i = 1; i <=20;) {
        printf("\n\nCadastro dos Alunos: \n");
        printf("Digite o numero de uma das opções: \n");
        printf("1- Cadastrar aluno \n");
        printf("2- Listar alunos \n");
        printf("3- Apagar alunos \n");
        printf("4- Listar IMC de alunos \n");
        printf("0- Sair \n");
        scanf("%d", &opcao);        
        switch(opcao) {
            case 1:
                fflush(stdin);
                printf ("\n Nome do aluno:");
                scanf ("%s", &cad_aluno[i].nome);
                fflush(stdin);
                printf ("\n Email do aluno:");
                scanf ("%s", &cad_aluno[i].email);
                fflush(stdin);
                printf ("\n Peso do aluno: ");
                scanf ("%f", &cad_aluno[i].peso);
                fflush(stdin);
                printf ("\n Altura do aluno: ");
                scanf ("%f", &cad_aluno[i].altura);
                fflush(stdin);
                cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
                fflush(stdin);
                i++;
                break;
            case 2:
                for (l = 1; l <=20; l++) {
                    if(l < i) {
                        printf("\n\nNome: %s", &cad_aluno[l].nome);
                        printf("\nEmail: %s", &cad_aluno[l].email);
                        printf("\nPeso: %1.2f", &cad_aluno[l].peso);
                        printf("\nAltura: %1.2f", &cad_aluno[l].altura);
                        printf("\nIMC: %1.2f", &cad_aluno[l].IMC);
                    } else {
                        l = 20;
                    }
                }
                break;
            case 3 :
                break;
            case 4 :
            for (l = 0; l <20; l++) {
                if(l < i) {
                    printf("IMC do aluno %d: %1.2f", &l, &cad_aluno[l].IMC);
                } else {
                    l = 20;
                }
            }
            break;
            case 0 :
                exit(0);
            default:
                printf ("Opção invalida\n");
                break;
        }
    }
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Citação:

Spoiler
35 minutos atrás, Simon Viegas disse:

 

Acho que na hora de imprimir não usa o &. Pelo menos aqui funcionou:



                        printf("\n\nNome  : %s", cad_aluno[l].nome);
                        printf("\nEmail : %s", cad_aluno[l].email);
                        printf("\nPeso  : %1.2f", cad_aluno[l].peso);
                        printf("\nAltura: %1.2f", cad_aluno[l].altura);
                        printf("\nIMC   : %1.2f", cad_aluno[l].IMC);

 

Qualquer coisa dá uma olhada em como imprimir esses tipos numéricos.

 

adicionado 22 minutos depois

 

Sobre a indentação, tentei dar uma reorganizada no código original-:



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

struct Aluno {
    char nome[20];
    char email[20];
    float peso;
    float altura;
    float IMC;
};

struct Aluno cad_aluno[20];

float calculaimc(float p, float a) {
    float resultado = p/(a*a);
    return resultado;
}

int main () {
    setlocale(LC_ALL, "Portuguese");
    int opcao, i, l;
    
    for (i = 1; i <=20;) {
        printf("\n\nCadastro dos Alunos: \n");
        printf("Digite o numero de uma das opções: \n");
        printf("1- Cadastrar aluno \n");
        printf("2- Listar alunos \n");
        printf("3- Apagar alunos \n");
        printf("4- Listar IMC de alunos \n");
        printf("0- Sair \n");
        scanf("%d", &opcao);        
        switch(opcao) {
            case 1:
                fflush(stdin);
                printf ("\n Nome do aluno:");
                scanf ("%s", &cad_aluno[i].nome);
                fflush(stdin);
                printf ("\n Email do aluno:");
                scanf ("%s", &cad_aluno[i].email);
                fflush(stdin);
                printf ("\n Peso do aluno: ");
                scanf ("%f", &cad_aluno[i].peso);
                fflush(stdin);
                printf ("\n Altura do aluno: ");
                scanf ("%f", &cad_aluno[i].altura);
                fflush(stdin);
                cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
                fflush(stdin);
                i++;
                break;
            case 2:
                for (l = 1; l <=20; l++) {
                    if(l < i) {
                        printf("\n\nNome: %s", &cad_aluno[l].nome);
                        printf("\nEmail: %s", &cad_aluno[l].email);
                        printf("\nPeso: %1.2f", &cad_aluno[l].peso);
                        printf("\nAltura: %1.2f", &cad_aluno[l].altura);
                        printf("\nIMC: %1.2f", &cad_aluno[l].IMC);
                    } else {
                        l = 20;
                    }
                }
                break;
            case 3 :
                break;
            case 4 :
            for (l = 0; l <20; l++) {
                if(l < i) {
                    printf("IMC do aluno %d: %1.2f", &l, &cad_aluno[l].IMC);
                } else {
                    l = 20;
                }
            }
            break;
            case 0 :
                exit(0);
            default:
                printf ("Opção invalida\n");
                break;
        }
    }
    return 0;
}

 

 

Nossa muito obrigado, tudo funcionou perfeitamente, a unica coisa que ainda não sei como fazer é o apagar alunos, de resto ta certinho, meu código esta assim agora:

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

struct Aluno{
          char nome[20];
          char email[20];
          char grau[20];
          float peso;
		  float altura;
		  float IMC;
};

    struct Aluno cad_aluno[20];

float calculaimc(float p, float a){
    float resultado = p / (a*a);
    return resultado;
}

int main (){
	int opcao, i, l;
	setlocale(LC_ALL, "Portuguese");

        for (i = 1; i <=20;){
            printf("\n\nCadastro dos Alunos: \n");
            printf("Digite o numero de uma das opções: \n");
            printf("1- Cadastrar aluno \n");
            printf("2- Listar alunos \n");
            printf("3- Apagar alunos \n");
            printf("4- Listar IMC de alunos \n");
            printf("0- Sair \n");
            scanf("%d", &opcao);

            switch(opcao) {

            case 1:

                    fflush(stdin);
                    printf ("\n Nome do aluno: ");
                    scanf ("%s", &cad_aluno[i].nome);
                    fflush(stdin);
                    printf ("\n Email do aluno: ");
                    scanf ("%s", &cad_aluno[i].email);
                    fflush(stdin);
                    printf ("\n Peso do aluno: ");
                    scanf ("%f", &cad_aluno[i].peso);
                    fflush(stdin);
                    printf ("\n Altura do aluno: ");
                    scanf ("%f", &cad_aluno[i].altura);
                    fflush(stdin);
                    cad_aluno[i].IMC = calculaimc(cad_aluno[i].peso, cad_aluno[i].altura);
                    fflush(stdin);
                    if (cad_aluno[i].IMC < 18.5){ //esse desvio define a condicao do aluno
                        strcpy(cad_aluno[i].grau, "Baixo peso");
                    }

                    else if (cad_aluno[i].IMC >=18.5 &&  cad_aluno[i].IMC <25){
                        strcpy(cad_aluno[i].grau, "Peso ideal");
                    }

                    else if (cad_aluno[i].IMC >=25 &&  cad_aluno[i].IMC<30){
                        strcpy(cad_aluno[i].grau, "Sobrepeso");
                    }

                    else if (cad_aluno[i].IMC >=30 &&  cad_aluno[i].IMC<35){
                        strcpy(cad_aluno[i].grau, "Obesidade Grau 1");
                    }

                    else if (cad_aluno[i].IMC >=35 &&  cad_aluno[i].IMC<=40){
                        strcpy(cad_aluno[i].grau, "Obesidade Grau 2");
                    }

                    else if (cad_aluno[i].IMC > 40){
                        strcpy(cad_aluno[i].grau, "Obesidade Grau 3");
                    }
                    i++; //incrementa o laco para contar somente os alunos cadastrados
                break;
            case 2:
                for (l = 1; l <=20; l++) { //contador diferente para nao atrapalhar na contagem cadastros
                    if(l < i){
                        printf("\n\nNome: %s", cad_aluno[l].nome);
                        printf("\nEmail: %s", cad_aluno[l].email);
                        printf("\nPeso: %1.2f", cad_aluno[l].peso);
                        printf("\nAltura: %1.2f", cad_aluno[l].altura);
                        printf("\nIMC: %1.2f", cad_aluno[l].IMC);
                    } else{
                        l = 20;
                    }
                }
                break;
            case 3 :

                break;
            case 4 :
                for (l = 1; l <=20; l++) {
                    if(l < i){
                        printf("\nIMC do aluno %s:", cad_aluno[l].nome);
                        printf(" %1.2f ", cad_aluno[l].IMC);
                        printf(" Condição: %s", cad_aluno[l].grau);
                    }
                    else{
                        l = 20;
                    }
                }
                break;
            case 0 :
                exit(0); //encerra o programa
            default:
                printf ("Opção invalida(Somente numeros de 0 a 4)\n");
                break;
        }
	}
	return 0;
}

 

Editado por Simon Viegas
Inserir tag SPOILER na citação

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os dados do IMC não precisam ser armazenados... e creio eu que nem deve. Veja:

 

Sobre:

22 minutos atrás, GustavoSoaresLima disse:

struct Aluno{
          char nome[20];
          char email[20];
          char grau[20];
          float peso;
		  float altura;
		  float IMC;
};

 

Mas olha o que diz o enunciado:

13 horas atrás, GustavoSoaresLima disse:

* Uma estrutura chamada Aluno onde será armazenado nome, e-mail, peso e altura.


Ou seja, a struct só tem 4 itens. O IMC pode ser (deveria ser) calculado na hora. Essa informação não precisa ser armazenada, pois seria redundante... E o grau nada mais é que uma tradução, ou seja, quando precisar do IMC, vai calcular usando a fórmula, assim como sugerido pelo enunciado:

13 horas atrás, GustavoSoaresLima disse:

* Uma função separada para calcular o imc, ela recebe dois valores em ponto flutuante (peso e altura) e retorna um valor (o imc) em ponto flutuante.

 

Tendo o IMC, "traduz" o seu grau... poderia, por exemplo, criar outra função que recebe um float e retorna uma "string" (char[]).

 

Entende? O IMC e o grau é uma "informação" que pode ser obtida através de cálculos (fórmula IMC) e verificações (seleção de acordo com o valor). Seria análogo a notas de alunos... é necessário apenas obter as notas, a média é calculada através destas... (não é necessário armazenar as notas e a média).

 

 

 

adicionado 5 minutos depois

Em relação ao apagar... o enunciado fala:

13 horas atrás, GustavoSoaresLima disse:

3. Apagar aluno (pode apagar pela posição na lista).

 

Ou seja, não diz muito coisa. É necessário verificar o que significa "apagar". Existem várias formas, por exemplo:

- substituir todos os dados por valores nulos, como "" ou 0;

- deslocar todos os cadastros posteriores uma posição para trás;

- apenas marcar a posição como "apagada", algo como colocar um "#" no início do nome, ai antes de utilizar a posição, verificaria se tem ou não um #...

etc

 

RESUMINDO:

Sugiro que primeiro verifique essa questão da struct, depois, para apagar, inicialmente trabalhe como apenas "apagando os dados", ou seja, sobrescrevendo com valores "nulos". Aí, posteriormente vai tentando reformular como deveria ser esse "apagar".

adicionado 11 minutos depois

PS:

Para tentar exemplificar, na hora de imprimir o IMC, faria algo como:

printf("\nIMC: %1.2f", calculaimc(cad_aluno[l].peso, cad_aluno[l].altura));

 

Na hora de imprimir o grau:

printf("\nGrau: %s", grauIMC(calculaimc(cad_aluno[l].peso, cad_aluno[l].altura)));

Entende?

A depender, poderia usar uma variável auxiliar para armazenar o IMC temporariamente, já está sendo utilizada 2 vezes.

Editado por Simon Viegas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×