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 for
In 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.
Related question (not duplicate): http://answall.com/q/99604/132
– Victor Stafusa