Jump to content

Erro teimoso vs estudante iniciante


Sofia-Fonseca
 Share

Recommended Posts

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

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

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

      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

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.