Selection structure, use of for

-5

I need to select animals over (60 months), and return their consumption and monthly production, as I have tried to idealize in the equations. However, it does not return any numbers 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)
    
asked by anonymous 22.11.2015 / 22:48

1 answer

0

Well, let's try to sort out your code.

First thing, instead:

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

It's 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 reidentar 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 section:

 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 just after for . It uses the i value. Who is i ? The answer is that if for previous reached the end, then i is 3, and in this case access num_vacas[i].cod probably will not do what you want. On the other hand, if break has been executed, then what is inside this if will not run. That is, in all cases, the program will probably not do what you want.

Considering that within if there is for , I think 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 must be stopped. In this way, you can combine the three loops 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 variables in the smallest possible scope when you need them, just as I did above. I recommend that you do the same with all other variables.

There are still some more details that can be improved. Note that the num_vacas[i].prod_leite_semanal * 4 and num_vacas[i].alim_consumido * 4 appear repeated. We can eliminate the reps, and this is the resulting final 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 variable at the beginning of this for .

And note another detail: By combining the three% s of% s into one, I deleted a bug. What happened was that if the user entered code 0 after putting the data of cow 0 and cow 1, for example, when accessing for and num_vacas[2].prod_leite_semanal in the third num_vacas[2].alim_consumido , these values that were not filled (and therefore the content would be some garbage left in memory) would be added to for and soma_prod , corrupting its calculation. Putting everything together in a single soma_consumo , this problem disappears.

    
23.11.2015 / 00:58