I don’t know why my program doesn’t work!! EM C

Asked

Viewed 228 times

1

In the exercise I need to create a struct and send it to the function that checks if the number is even, if yes it sends to another function that returns the number /2.

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

struct dados{
int numero;
char nome[5];
};

void manipula_um_par (int *a){
    *a = *a/2;
}

int *manipula_pares (struct dados x[10], int w){
    int z;
    for(z=0;z<w;z++){
        if (x[z].numero %2==0){
            manipula_um_par(&x[z].numero);
        }
    }
    return x[10].numero;
}

int main(){
    struct dados v[10];
    int a[10];
    int x;
    for(x=0;x<10;x++){
        printf("\nDigite o nome do %d aluno: ",x+1);
        fflush(stdin);
        fgets(v[x].nome, 20, stdin);
        printf("\nDigite o %d numero: ",x+1);
        scanf("%d",&v[x].numero);
        }
    *a = manipula_pares(&v.numero,10);
    for(x=0;x<10;x++){
    printf("--- %d ",a[x]);
    }

    return 0;
}
  • x[10] there is no. x is an array of ten elements: x[0], x[1], ...x[9].

1 answer

1


Arthur,

I corrected my mistake and made some suggestions for improvement.

I commented on the code improvements to get a better reference on what I’m talking about.

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

    // É uma boa prática de programação definir os números que são usados em vários lugares, com um define, vocÊ pode alterar a quantia sem risco de esquecer algum lugar
    #define NUM_ALUNOS 10

    struct dados{
      int numero;
      char nome[5]; // Não alterei, mas 5 é pouco para um nome, sugeriria utilizar um vetor maior
    };

    // É uma boa prática de programação definir os protótipos das funções no início do programa (aconselho pesquisar sobre)
    void manipula_um_par (int *a);
    void manipula_pares (struct dados *x, int w);

    int main()
    {
        struct dados v[NUM_ALUNOS];
        // int a[10]; Neste caso, não será necessário utilizar este vetor
        int x;

        for(x = 0; x < NUM_ALUNOS; x++)
        {        
            printf("\nDigite o nome do %d aluno: ",x+1);
            // fflush(stdin);
            // fgets(v[x].nome, 20, stdin);
            scanf("%s", v[x].nome); // Acredito que o scanf servirá bem neste caso 

            printf("\nDigite o %d numero: ",x+1);
            scanf("%d",&v[x].numero);
        }

        // *a é a mesma coisa que a[0], então neste caso, você não estará mudando todo o vetor de inteiros, você só estará mudando o primeiro vetor
        // Já que você já passa o struct v, não tem necessidade de utilizar o vetor a, pois você já esta passando os dados dentro do vetor e só precisa imprimir
        // Se você quisesse utilizar o "a", você teria que passado como parâmetro manipula_pares(&v.numero, 10, a) e trocaria o protótipo da função para void manipula_pares (struct dados *x, int w, int *a); e modificaria dentro da função o vetor a
        // Foi trocado o retorno da sua função, pois não precisaremos mais do retorno, já que alteramos tudo dentro da própria função
        // Como o *a é a mesma coisa que o a[0], então isso é um inteiro e sua função estava retornando um porteiro de inteiro e colocando um inteiro
        // *a = manipula_pares(&v.numero,10);
        manipula_pares(v, NUM_ALUNOS);

        for(x=0;x<NUM_ALUNOS;x++) 
        {
          // Como foi falado, troquei para ao invés de imprimir o vetor a, imprimir direto a struct
          printf("--- %d ", v[x].numero);
        }

        return 0;
    }

    void manipula_um_par (int *a)
    {
        *a = *a/2;
    }

    void manipula_pares(struct dados *x, int w)
    {
        int z;
        for(z=0;z<w;z++)
        {
            if (x[z].numero % 2 == 0){
                manipula_um_par(&x[z].numero);
            }
        }
    }

One last comment, it is good practice to put more representative names in their variables/functions, so it is easier for other people to read and understand the flow of their code and what serves each piece of code.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.