Selection structure, use of the for

Asked

Viewed 54 times

-5

I need to select animals older than (60 months), and return their consumption and monthly production, as I tried to idealize in the equations. However, it does not return any number correctly.

 for(i=0; i<3; i++)
 {

     printf("\n\nInforme o codigo do animal: ");
     scanf("%d", &num_vacas[i].cod);

        if(num_vacas[i].cod!=0)
            {

                 printf("Sua producao de leite (litros) semanal: ");
                 scanf("%d", &num_vacas[i].prod_leite_semanal);

                 printf("Quantidade (quilos) de alimento consumido por semana: ");
                 scanf("%d", &num_vacas[i].alim_consumido);

                 printf("Informe a idade (meses) do animal:");
                 scanf("%d", &num_vacas[i].idade);

                         qtde_leite_mensal= num_vacas[i].prod_leite_semanal*4;
                         printf("\n\tSua producao mensal (litros) de leite e: %d", qtde_leite_mensal);

                         qtde_alim_mes=num_vacas[i].alim_consumido*4;
                         printf("\n\tQuantidade (quilos) de alimento consumido (mensal): %d ", qtde_alim_mes);

            }
        else
            break;

 }

 if(num_vacas[i].cod!=0)
 {

             for(i=0; i<3; i++)
             {
                  cont_vaca= num_vacas[i].idade/12;
                  if(cont_vaca>=5)
                  {
                    cont++;

                  }
            }
         printf("Numero de vacas que podem ser vendidas (5 anos ou mais): %d", cont);
         }
         soma_prod=0;
         soma_consumo=0;
    for(i=0; i<3; i++)
        {
            if(num_vacas[i].idade>=60)
            {
              soma_prod= soma_prod + (num_vacas[i].prod_leite_semanal*4);
              soma_consumo= soma_consumo + (num_vacas[i].alim_consumido*4);
            }
        }

        printf(" A producao de leite das vacas com possibilidade de venda: %d ", soma_prod);
        printf(" O gasto com alimento das mesmas: %d ", soma_consumo)
  • Related question (not duplicate): http://answall.com/q/99604/132

1 answer

0


Well, let’s try to fix your code.

First thing, instead of this:

if (condicao) {
     // Um monte
     // de linhas
     // aqui
     // a perder
     // de vista.
} else
    break;

Makes it easier to understand like this:

if (!condicao) break;
// Continua o fluxo aqui
// sem precisar se preocupar com um
// else que vem depois.
// O código fica bem mais fácil de
// entender.

That said, after re-biting your code, we have this:

for (i = 0; i < 3; i++) {

    printf("\n\nInforme o codigo do animal: ");
    scanf("%d", &num_vacas[i].cod);

    if (num_vacas[i].cod == 0) break;
    printf("Sua producao de leite (litros) semanal: ");
    scanf("%d", &num_vacas[i].prod_leite_semanal);
    printf("Quantidade (quilos) de alimento consumido por semana: ");
    scanf("%d", &num_vacas[i].alim_consumido);

    printf("Informe a idade (meses) do animal:");
    scanf("%d", &num_vacas[i].idade);

    qtde_leite_mensal = num_vacas[i].prod_leite_semanal * 4;
    printf("\n\tSua producao mensal (litros) de leite e: %d", qtde_leite_mensal);

    qtde_alim_mes = num_vacas[i].alim_consumido * 4;
    printf("\n\tQuantidade (quilos) de alimento consumido (mensal): %d ", qtde_alim_mes);
 }

 if (num_vacas[i].cod != 0) {
     for (i = 0; i < 3; i++) {
         cont_vaca = num_vacas[i].idade / 12;
         if (cont_vaca >= 5) cont++;
     }
     printf("Numero de vacas que podem ser vendidas (5 anos ou mais): %d", cont);
 }
 soma_prod = 0;
 soma_consumo = 0;
 for (i = 0; i < 3; i++) {
     if (num_vacas[i].idade >= 60) {
         soma_prod = soma_prod + (num_vacas[i].prod_leite_semanal * 4);
         soma_consumo = soma_consumo + (num_vacas[i].alim_consumido * 4);
     }
 }

 printf(" A producao de leite das vacas com possibilidade de venda: %d ", soma_prod);
 printf(" O gasto com alimento das mesmas: %d ", soma_consumo)

Well, let’s focus on this excerpt:

 for (i = 0; i < 3; i++) {
     // Um pouco de código...
     if (num_vacas[i].cod == 0) break;
     // Um monte de código...
 }
 if (num_vacas[i].cod != 0) {
     for (i = 0; i < 3; i++) {
         cont_vaca = num_vacas[i].idade / 12;
         if (cont_vaca >= 5) cont++;
     }
     printf("Numero de vacas que podem ser vendidas (5 anos ou mais): %d", cont);
 }

First, look at that if shortly after the for. He uses the value i. Who is i? The answer is that if the for previous reached the end, then i is worth 3, and in this case access num_vacas[i].cod probably won’t do what you want. On the other hand, if the break has been executed, so what is inside this if won’t run. IE, in all cases, probably the program won’t do what you want.

whereas within the if there is a for, I think the if should not be there. So my suggestion is to simply delete the if and leave the code like this:

 for (i = 0; i < 3; i++) {
     // Um pouco de código...
     if (num_vacas[i].cod == 0) break;
     // Um monte de código...
 }
 for (i = 0; i < 3; i++) {
     cont_vaca = num_vacas[i].idade / 12;
     if (cont_vaca >= 5) cont++;
 }
 printf("Numero de vacas que podem ser vendidas (5 anos ou mais): %d", cont);
 soma_prod = 0;
 soma_consumo = 0;
 for (i = 0; i < 3; i++) {
     if (num_vacas[i].idade >= 60) {
         soma_prod = soma_prod + (num_vacas[i].prod_leite_semanal * 4);
         soma_consumo = soma_consumo + (num_vacas[i].alim_consumido * 4);
     }
 }

Finally, the three loops are iterating from 0 to 2, and if the code is 0, everything should be stopped. In this way, one can combine the three ties into one and they can be simplified like this:

int soma_prod = 0;
int soma_consumo = 0;
int i = 0;
int cont = 0;

for (i = 0; i < 3; i++) {
    printf("\n\nInforme o codigo do animal: ");
    scanf("%d", &num_vacas[i].cod);

    if (num_vacas[i].cod == 0) break;
    printf("Sua producao de leite (litros) semanal: ");
    scanf("%d", &num_vacas[i].prod_leite_semanal);
    printf("Quantidade (quilos) de alimento consumido por semana: ");
    scanf("%d", &num_vacas[i].alim_consumido);

    printf("Informe a idade (meses) do animal:");
    scanf("%d", &num_vacas[i].idade);

    int qtde_leite_mensal = num_vacas[i].prod_leite_semanal * 4;
    printf("\n\tSua producao mensal (litros) de leite e: %d", qtde_leite_mensal);

    int qtde_alim_mes = num_vacas[i].alim_consumido * 4;
    printf("\n\tQuantidade (quilos) de alimento consumido (mensal): %d ", qtde_alim_mes);

    if (num_vacas[i].idade >= 60) {
        cont++;
        soma_prod += num_vacas[i].prod_leite_semanal * 4;
        soma_consumo += num_vacas[i].alim_consumido * 4;
    }
}

And also note that it is best to declare the variables in the smallest possible scope when you need them, as I did above. I recommend you do the same with all other variables.

There are still a few more details that can be improved. Note that the num_vacas[i].prod_leite_semanal * 4 and the num_vacas[i].alim_consumido * 4 appear repeated. We can delete the repetitions, and this is the final resulting code:

int soma_prod = 0;
int soma_consumo = 0;
int i = 0;
int cont = 0;

for (i = 0; i < 3; i++) {
    printf("\n\nInforme o codigo do animal: ");
    scanf("%d", &num_vacas[i].cod);

    if (num_vacas[i].cod == 0) break;
    printf("Sua producao de leite (litros) semanal: ");
    scanf("%d", &num_vacas[i].prod_leite_semanal);
    printf("Quantidade (quilos) de alimento consumido por semana: ");
    scanf("%d", &num_vacas[i].alim_consumido);

    printf("Informe a idade (meses) do animal:");
    scanf("%d", &num_vacas[i].idade);

    int qtde_leite_mensal = num_vacas[i].prod_leite_semanal * 4;
    printf("\n\tSua producao mensal (litros) de leite e: %d", qtde_leite_mensal);

    int qtde_alim_mes = num_vacas[i].alim_consumido * 4;
    printf("\n\tQuantidade (quilos) de alimento consumido (mensal): %d ", qtde_alim_mes);

    if (num_vacas[i].idade >= 60) {
        cont++;
        soma_prod += qtde_leite_mensal;
        soma_consumo += qtde_alim_mes;
    }
}

There are more simplifications possible, especially if you put &num_vacas[i] in a pointer type variable at the beginning of this for.

And also note another detail: When joining the three forIn one, I eliminated a bug. What happened was that if the user entered the code 0 after putting the data of cow 0 and cow 1, for example, when accessing the num_vacas[2].prod_leite_semanal and the num_vacas[2].alim_consumido in the third for, these values that were not filled (and therefore the content would be some garbage dropped in memory) would be added to the soma_prod and soma_consumo, corrupting your calculation. By joining all in one for, this problem goes away.

  • 1

    Dear Victor thank you so much! You helped me so much! Hug!

Browser other questions tagged

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