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.