Sofia-Fonseca Posted March 13, 2012 Report Share Posted March 13, 2012 Ora bolas! Sei que não percebo muito de programação pois só estou a aprender à 3 meses em video aulas... Mas aquilo que aprendi até agora tem funcionado (quase sempre) nas minhas ideias. 😄 Este programa está a dar um erro que aparece nas três versões do mesmo: Versão 1: #include<stdio.h> #include<conio.h> main() { int agua_sn, adubo_sn, s_adubo_sn; char nome_evento[20]; char nome_semente[20]; double S, N, duracao_evento, tempo_normal, tipo_terreno, qt_terrenos, tempo_total, agua, adubo, s_adubo, vezes_semeio, qt_sementes, semeio_base, tempo_geral; //printf("Escreva o nome do evento? "); //scanf("%19[^\n]", nome_evento); printf("Qual a duração do evento em minutos? (Só acima de 20 minutos!) "); scanf("%lf", &duracao_evento); //printf("Qual o nome da semente? "); //scanf("%s", nome_semente); printf("Qual o tempo de crescimento da semente em condições normais? (Em minutos!) "); scanf("%lf", &tempo_normal); printf("De quantas sementes precisa? "); scanf("%lf", &qt_sementes); printf("Qual o tipo de terreno? (Escreva 5 para 4x4, 3 para 2x2) "); scanf("%lf", &tipo_terreno); printf("Quantos terrenos vai usar? "); scanf("%lf", &qt_terrenos); agua=(tempo_normal*10)/100; adubo=(tempo_normal*5)/100; s_adubo=(tempo_normal*50)/100; semeio_base=qt_sementes/(qt_terrenos*tipo_terreno); vezes_semeio=(semeio_base*qt_terrenos)/(qt_terrenos*tipo_terreno)+semeio_base; printf("\nSe usar agua, poupa: %3.0lf minutos em cada colheita", agua); printf("\nSe usar adubo, poupa: %3.0lf minutos em cada colheita", adubo); printf("\nSe usar super adubo, poupa: %3.0lf minutos em cada colheita", s_adubo); printf("\n\n\nVai usar agua? Digite: 1 para responder sim, 0 para não: ", agua_sn); scanf("%lf", &agua_sn); printf("Vai usar adubo? Digite: 1 para responder sim, 0 para não: ", adubo_sn); scanf("%lf", &adubo_sn); printf("Vai usar super adubo? Digite: 1 para responder sim, 0 para não: ", adubo_sn); scanf("%lf", &s_adubo_sn); if ((agua_sn==1) && (adubo_sn==1) && (s_adubo_sn==1)) tempo_total==tempo_normal-agua-adubo-s_adubo; else if ((agua_sn==1) && (adubo_sn==1) && (s_adubo_sn==0)) tempo_total==tempo_normal-agua-adubo; else if ((agua_sn==1) && (adubo_sn==0) && (s_adubo_sn==0)) tempo_total==tempo_normal-agua; else if ((agua_sn==1) && (adubo_sn==0) && (s_adubo_sn==1)) tempo_total==tempo_normal-agua-s_adubo; else if ((agua_sn==0) && (adubo_sn==1) && (s_adubo_sn==1)) tempo_total==tempo_normal-adubo-s_adubo; else if ((agua_sn==0) && (adubo_sn==0) && (s_adubo_sn==1)) tempo_total==tempo_normal-s_adubo; else if ((agua_sn==0) && (adubo_sn==1) && (s_adubo_sn==0)) tempo_total==tempo_normal-adubo; if ((agua_sn==0) && (adubo_sn==0) && (s_adubo_sn==0)) tempo_total==tempo_normal-agua-s_adubo; printf("\n\nCom as condições de adubação e rega escolhidas, a semente demorará %3.0lf minutos a ficar pronta a colher.", tempo_total); printf("\nNumero de vezes que precisa semear: %3.0lf", vezes_semeio); printf("\n\nBoas colheitas!"); printf("\n\nPrima qualquer tecla para fechar."); getch(); } Versão 2: #include<stdio.h> #include<conio.h> main() { char nome_evento[20]; char nome_semente[20]; double agua_sn, adubo_sn, s_adubo_sn, rega, adubacao, fertilizacao, S, N, duracao_evento, tempo_normal, tipo_terreno, qt_terrenos, tempo_total, agua, adubo, s_adubo, vezes_semeio, qt_sementes, semeio_base, tempo_geral; //printf("Escreva o nome do evento? "); //scanf("%19[^\n]", nome_evento); printf("Qual a duração do evento em minutos? (Só acima de 20 minutos!) "); scanf("%lf", &duracao_evento); //printf("Qual o nome da semente? "); //scanf("%s", nome_semente); printf("Qual o tempo de crescimento da semente em condições normais? (Em minutos!) "); scanf("%lf", &tempo_normal); printf("De quantas sementes precisa? "); scanf("%lf", &qt_sementes); printf("Qual o tipo de terreno? (Escreva 5 para 4x4, 3 para 2x2) "); scanf("%lf", &tipo_terreno); printf("Quantos terrenos vai usar? "); scanf("%lf", &qt_terrenos); agua=(tempo_normal*10)/100; adubo=(tempo_normal*5)/100; s_adubo=(tempo_normal*50)/100; semeio_base=qt_sementes/(qt_terrenos*tipo_terreno); vezes_semeio=(semeio_base*qt_terrenos)/(qt_terrenos*tipo_terreno)+semeio_base; printf("\nSe usar agua, poupa: %3.0lf minutos em cada colheita", agua); printf("\nSe usar adubo, poupa: %3.0lf minutos em cada colheita", adubo); printf("\nSe usar super adubo, poupa: %3.0lf minutos em cada colheita", s_adubo); printf("\n\n\nVai usar agua? Digite: 1 para responder sim, 0 para não: "); scanf("%lf", &agua_sn); printf("Vai usar adubo? Digite: 1 para responder sim, 0 para não: "); scanf("%lf", &adubo_sn); printf("Vai usar super adubo? Digite: 1 para responder sim, 0 para não: "); scanf("%lf", &s_adubo_sn); if (agua_sn==1) rega=agua; else rega=0; /* else if (adubo_sn==1) adubacao=adubo; else adubacao=0; else if (s_adubo_sn==1) fertilizacao=s_adubo; else fertilizacao=0;*/ tempo_total=tempo_normal-rega-adubacao-fertilizacao; printf("\n\nCom as condições de adubação e rega escolhidas, a semente demorará %3.0lf minutos a ficar pronta a colher.", tempo_total); printf("\nNumero de vezes que precisa semear: %3.0lf", vezes_semeio); printf("\n\nBoas colheitas!"); printf("\n\nPrima qualquer tecla para fechar."); getch(); } Versão 3: #include<stdio.h> #include<conio.h> main() { int agua_sn, adubo_sn, s_adubo_sn; char nome_evento[20]; char nome_semente[20]; double S, N, duracao_evento, tempo_normal, tipo_terreno, qt_terrenos, tempo_total, agua, adubo, s_adubo, vezes_semeio, qt_sementes, semeio_base, tempo_geral; //printf("Escreva o nome do evento? "); //scanf("%19[^\n]", nome_evento); printf("Qual a duração do evento em minutos? (Só acima de 20 minutos!) "); scanf("%lf", &duracao_evento); //printf("Qual o nome da semente? "); //scanf("%s", nome_semente); printf("Qual o tempo de crescimento da semente em condições normais? (Em minutos!) "); scanf("%lf", &tempo_normal); printf("De quantas sementes precisa? "); scanf("%lf", &qt_sementes); printf("Qual o tipo de terreno? (Escreva 5 para 4x4, 3 para 2x2) "); scanf("%lf", &tipo_terreno); printf("Quantos terrenos vai usar? "); scanf("%lf", &qt_terrenos); agua=(tempo_normal*10)/100; adubo=(tempo_normal*5)/100; s_adubo=(tempo_normal*50)/100; semeio_base=qt_sementes/(qt_terrenos*tipo_terreno); vezes_semeio=(semeio_base*qt_terrenos)/(qt_terrenos*tipo_terreno)+semeio_base; printf("\nSe usar agua, poupa: %3.0lf minutos em cada colheita", agua); printf("\nSe usar adubo, poupa: %3.0lf minutos em cada colheita", adubo); printf("\nSe usar super adubo, poupa: %3.0lf minutos em cada colheita", s_adubo); printf("\n\n\nVai usar agua? Digite: 1 para responder sim, 0 para não: ", agua_sn); scanf("%lf", &agua_sn); printf("Vai usar adubo? Digite: 1 para responder sim, 0 para não: ", adubo_sn); scanf("%lf", &adubo_sn); printf("Vai usar super adubo? Digite: 1 para responder sim, 0 para não: ", adubo_sn); scanf("%lf", &s_adubo_sn); if ((agua_sn==adubo_sn) && (agua_sn==s_adubo_sn) && (adubo_sn==s_adubo_sn)) if (agua_sn==1) tempo_total==tempo_normal-agua-adubo-s_adubo; else tempo_total==tempo_normal; if ((agua_sn==adubo_sn) && (agua_sn!=s_adubo_sn)) if (agua_sn==1) tempo_total==tempo_normal-agua-adubo; else tempo_total==tempo_normal-s_adubo; if ((agua_sn!=adubo_sn) && (agua_sn==s_adubo_sn)) if (agua_sn==1) tempo_total==tempo_normal-agua-s_adubo; else tempo_total==tempo_normal-adubo; if ((agua_sn!=adubo_sn) && (agua_sn!=s_adubo_sn)) if (agua_sn==1) tempo_total==tempo_normal-agua; else tempo_total==tempo_normal-adubo-s_adubo; printf("\n\nCom as condições de adubação e rega escolhidas, a semente demorará %3.0lf minutos a ficar pronta a colher.", tempo_total); printf("\nNumero de vezes que precisa semear: %3.0lf", vezes_semeio); printf("\n\nBoas colheitas!"); printf("\n\nPrima qualquer tecla para fechar."); getch(); } O erro acontece aqui: printf("\n\nCom as condições de adubação e rega escolhidas, a semente demorará %3.0lf minutos a ficar pronta a colher.", tempo_total); Resposta: http://img854.imageshack.us/img854/6842/capturarwx.png ? Desde já muito agradeço a ajuda. 😄 Link to comment Share on other sites More sharing options...
bubulindo Posted March 13, 2012 Report Share Posted March 13, 2012 Na versão 3, estás a usar "==" em vez de "=" para atribuir um valor a tempo_total. Na versão 2 estás a ler um %lf quando na realidade pretendes ler um int. Experimenta, trocar %lf por %d nos scanfs que perguntam se pretendem usar água, adubo ou super adubo. Isto pode não resolver nada, mas não vi nada mais quando olhei para o código. Na versão 1 tens o mesmo erro da versão 3. include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
Dr_Lion Posted March 13, 2012 Report Share Posted March 13, 2012 Na versão 3, estás a usar "==" em vez de "=" para atribuir um valor a tempo_total. Na versão 2 estás a ler um %lf quando na realidade pretendes ler um int. Experimenta, trocar %lf por %d nos scanfs que perguntam se pretendem usar água, adubo ou super adubo. Isto pode não resolver nada, mas não vi nada mais quando olhei para o código. Na versão 1 tens o mesmo erro da versão 3. Concordo com a tua observação, estava a ler enquanto respondeste. Essa atribuição está repetida em muitos if's, há que ter cuidado com os copy paste. Link to comment Share on other sites More sharing options...
pmg Posted March 13, 2012 Report Share Posted March 13, 2012 double tempo_total; printf("\n\nCom as condições de adubação e rega escolhidas, a semente demorará %3.0lf minutos a ficar pronta a colher.", tempo_total); A conversao "%lf" no printf() requer um valor de tipo long double. Atencao: o printf() e o scanf() sao funcoes diferentes que interpretam as conversoes diferentemente! Solucao: 1) Usa a conversao "%f" (com "width", precisao, e flags) 2) Altera o tipo de tempo_total What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Sofia-Fonseca Posted March 13, 2012 Author Report Share Posted March 13, 2012 Uff resolveu-se esta parte. 😁 Tirei os == de onde estavam errados e mudei todos os valores numéricos para int (%d) Isto na versão 3 que prefiro, embora a 2 me pareça interessante. As diferentes versões referem-se as diferenças de uso do (if, else e else if) que tenho adado a explorar. Sei que há outras formas mais simples de fazer estas cadeias, mas ainda não as entendo. Obrigada a todos! 😄 :D Link to comment Share on other sites More sharing options...
bubulindo Posted March 14, 2012 Report Share Posted March 14, 2012 As diferentes versões referem-se as diferenças de uso do (if, else e else if) que tenho adado a explorar. Sei que há outras formas mais simples de fazer estas cadeias, mas ainda não as entendo. Acho que nisto, o que deves praticar não é tanto o uso do if ... else mas condições lógicas. Lógica de Boole para ser mais concreto. Talvez conseguisses encadear alguns dos ifs uns nos outros, etc... não que esteja mal como está, mas por vezes é nestas situações que aparecem bugs chatos de corrigir. include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
KTachyon Posted March 14, 2012 Report Share Posted March 14, 2012 Não tem nada que saber. São três operadores condicionais que podem ser facilmente traduzidos para português: if (Se) else if (Senão, se) else (Senão) Mas, no teu caso, podes utilizar multiplicações simples para obteres o resutado: tempo_total = tempo_normal - agua*agua_sn - adubo*adubo_sn - s_adubo*s_adubo_sn Ou seja, aquela cadeia de condições poderia ser resumida numa linha de código. Portanto, não é tanto a forma de fazeres o if que está mal pensada. É apenas o facto de não teres pensado em resolver o problema matematicamente. De facto, na versão 2, quase que chegaste lá 😄 Até podias resolver logo esse problema mal pedes a informação ao utilizador: double tempo_total = 0; //... printf("\n\n\nVai usar agua? Digite: 1 para responder sim, 0 para não: ", agua_sn); scanf("%lf", &agua_sn); tempo_total += agua * agua_sn; // ou if (agua_sn == 1) tempo_total += agua; // ou if (agua_sn) tempo_total += agua; // Neste caso, qualquer valor diferente de zero equivale a verdade // ou tempo_total += agua_sn?agua:0; // Pedes a próxima informação ao utilizador “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now