Passing data from a struct within the function

3

To do a college job where I have a separate function that gets two values (WEIGHT and HEIGHT) and returns the BMI.

I also have a struct called ALUNO where weight and height are stored and a vector of 20 positions that will store the structures.

The program has a little box where in option 1 the user will register the weight and height, and in option 4 I have to show the Name, BMI and condition according to a table that was passed to me. (The condition I know how to do)

I made the program almost whole but arriving at the part of calculating the IMC I can not pass the struct inside the function. I know it has to pass through value or reference but I have already tried and I can not.

Can anyone help me? Thank you in advance!

//DECLARANDO ESTRUTURA 
struct aluno {

    char nome[100];
    char email[100];
    float altura;
    float peso;
};

//VETOR 
struct aluno info[21];


//FUNÇÃO SEPARADA DE IMC
float calculaImc(float altura, peso) {


    float resultado;

    resultado = peso / (altura*altura);
    return resultado;
}

//FUNÇÃO PRICIPAL
int main() {

    setlocale(LC_ALL,"portuguese");

    //DECLARANDO OUTRAS VARIAVEIS NECESSARIAS
    int i, op, posicao, excluir;

    do{

        system("cls");
        printf("\nCADASTRANDO ALUNOS NA ACADEMIA\n");
        printf("\n\t MENU \n");
        printf("\n1. Cadastrar aluno.\n");
        printf("2. Listar alunos.\n");
        printf("3. Apagar aluno.\n");
        printf("4. Listar IMC de alunos.\n");
        printf("0. Sair.\n");

        printf("\nEscolha uma das opções do menu: ");
        scanf("%i", &op);
        printf("\n");

        switch(op) {

            case(1):

                printf("Posições que já possuem cadastro: ");
                for(i=0; i<21; i++) {
                    if (info[i].nome[0] == '
//DECLARANDO ESTRUTURA 
struct aluno {

    char nome[100];
    char email[100];
    float altura;
    float peso;
};

//VETOR 
struct aluno info[21];


//FUNÇÃO SEPARADA DE IMC
float calculaImc(float altura, peso) {


    float resultado;

    resultado = peso / (altura*altura);
    return resultado;
}

//FUNÇÃO PRICIPAL
int main() {

    setlocale(LC_ALL,"portuguese");

    //DECLARANDO OUTRAS VARIAVEIS NECESSARIAS
    int i, op, posicao, excluir;

    do{

        system("cls");
        printf("\nCADASTRANDO ALUNOS NA ACADEMIA\n");
        printf("\n\t MENU \n");
        printf("\n1. Cadastrar aluno.\n");
        printf("2. Listar alunos.\n");
        printf("3. Apagar aluno.\n");
        printf("4. Listar IMC de alunos.\n");
        printf("0. Sair.\n");

        printf("\nEscolha uma das opções do menu: ");
        scanf("%i", &op);
        printf("\n");

        switch(op) {

            case(1):

                printf("Posições que já possuem cadastro: ");
                for(i=0; i<21; i++) {
                    if (info[i].nome[0] == '%pre%'){ 
                        continue;                 
                    }
                    printf("%d " , i);
                }

                printf("\nEscolha de 1 a 20: ");
                scanf("%d", &posicao);
                i=posicao;

                if(posicao > 20){
                    printf("\nVocê digitou um valor invalido, tente novamente!\n");
                }else{

                    printf("\n Posição escolhida: %d. \n", i);
                    printf("\n");

                    printf("Nome : ");
                    fflush(stdin);
                    gets(info[i].nome);

                    printf("Email : ");
                    fflush(stdin);
                    gets(info[i].email);

                    printf("Altura (m): ");
                    scanf("%f", &info[i].altura);
                    fflush(stdin);

                    printf("Peso (kg): ");
                    scanf("%f", &info[i].peso);
                    fflush(stdin);

                    if(info[i].nome[0] == '%pre%') {
                        printf("\nErro. Você não colocou um Nome.\n");
                    }else{
                    printf("\nAluno cadastrado com sucesso!\n");
                    }
                }
                break;

            case(2):

                printf("Alunos cadastrados.\n");

                for(i=0; i<21 ; i++){
                    if (info[i].nome[0] == '%pre%'){
                        continue;
                    }
                    printf("\nAluno %d \n", i);
                    printf("Nome: %s \n" , info[i].nome);
                    printf("Email: %s \n" , info[i].email);
                    printf("Altura: %.2f m \n", info[i].altura);
                    printf("Peso: %.2f kg \n", info[i].peso);
                }

                break;

            case(3):

                printf("Apagar aluno: ");
                scanf("%d", &excluir);

                if(info[excluir].nome[0] != '%pre%') {
                    printf("\nEssa posição corresponde ao seguinte aluno: %s.\n", info[excluir].nome);

                break;

            case(4):
                for(i=0; i<21; i++) {
                    if (info[i].nome[0] == '%pre%'){ 
                        continue;               
                    }
                    printf("\nAluno %d \n", i);
                    printf("Nome: %s\n", info[i].nome);
                }

                break;
        }

    }while(op!=0);

   return 0;
}
'){ continue; } printf("%d " , i); } printf("\nEscolha de 1 a 20: "); scanf("%d", &posicao); i=posicao; if(posicao > 20){ printf("\nVocê digitou um valor invalido, tente novamente!\n"); }else{ printf("\n Posição escolhida: %d. \n", i); printf("\n"); printf("Nome : "); fflush(stdin); gets(info[i].nome); printf("Email : "); fflush(stdin); gets(info[i].email); printf("Altura (m): "); scanf("%f", &info[i].altura); fflush(stdin); printf("Peso (kg): "); scanf("%f", &info[i].peso); fflush(stdin); if(info[i].nome[0] == '%pre%') { printf("\nErro. Você não colocou um Nome.\n"); }else{ printf("\nAluno cadastrado com sucesso!\n"); } } break; case(2): printf("Alunos cadastrados.\n"); for(i=0; i<21 ; i++){ if (info[i].nome[0] == '%pre%'){ continue; } printf("\nAluno %d \n", i); printf("Nome: %s \n" , info[i].nome); printf("Email: %s \n" , info[i].email); printf("Altura: %.2f m \n", info[i].altura); printf("Peso: %.2f kg \n", info[i].peso); } break; case(3): printf("Apagar aluno: "); scanf("%d", &excluir); if(info[excluir].nome[0] != '%pre%') { printf("\nEssa posição corresponde ao seguinte aluno: %s.\n", info[excluir].nome); break; case(4): for(i=0; i<21; i++) { if (info[i].nome[0] == '%pre%'){ continue; } printf("\nAluno %d \n", i); printf("Nome: %s\n", info[i].nome); } break; } }while(op!=0); return 0; }
    
asked by anonymous 26.05.2018 / 04:51

1 answer

4

The most common would be to pass a pointer to the structure you want to access in the function, and in many cases it will be more efficient because it avoids copying content unnecessarily.

The function would look like this:

//FUNÇÃO SEPARADA QUE RECEBE PESO E ALTURA E RETORNA O IMC
float calculaImc(struct aluno *al) {
//                            ^--- Tipo ponteiro para struct aluno
    float resultado;

    resultado = al->peso / (al->altura * al->altura);
    //            ^-----------^------------^-- acede com ponteiro -> campo
    return resultado;
}

And the call to the main function would be:

calculaImc(&info[i]);

Notice that I put &info[i] , because & accesses the position in the element's memory. This is necessary because the function receives a pointer, that is, the location in memory where the structure is.

By typing in your case 4 would be:

case(4):
    for(i=0; i<21; i++) {
        if (info[i].nome[0] == '
float calculaImc(float altura, peso) {
//                            ^---- aqui
'){ //SE A PRIMEIRA POSIÇÃO DA STRING FOR IGUAL A
//FUNÇÃO SEPARADA QUE RECEBE PESO E ALTURA E RETORNA O IMC
float calculaImc(struct aluno *al) {
//                            ^--- Tipo ponteiro para struct aluno
    float resultado;

    resultado = al->peso / (al->altura * al->altura);
    //            ^-----------^------------^-- acede com ponteiro -> campo
    return resultado;
}
continue; //ENTÃO PULA PARA O PROXIMO } printf("\nAluno %d \n", i); printf("Nome: %s\n", info[i].nome); printf("IMC: %f\n", calculaImc(&info[i])); //<--imc aqui com & para ser o ponteiro }

Recommendations:

  • Avoid using the getch function because it is specific to windows which makes your program less portable.
  • Do not mix gets with scanf . Better yet, do not use gets of the whole, as it is a dangerous function and susceptible to buffer overflow attacks. In addition, using the two creates pass-by problems with what's left in the input buffer. This is what led you to use multiple fflush(stdin) , which is not only not ideal, it is not even guaranteed that all implementations will in fact clean the buffers with this call.

Note:

In the declaration of the calculaImc function you have in the question, the type for the peso parameter was missing:

calculaImc(&info[i]);
    
26.05.2018 / 11:00