spinhei 0 Denunciar post Postado Abril 10, 2011 dessa vez eu quero por "APROVADO" se o conceito for A, B, ou C e "REPROVADO" se conceito for D ou E. só que quando a MA da 10 por exemplo, então aparece conceito A, B, C if (MA >= 9.0) printf ("\n Conceito A\n"); if (MA >= 9.0) printf ("Aprovado"); if (MA >9.0|| MA >=7.5) printf ("\n Conceito B\n"); if (MA >9.0|| MA >=7.5) printf ("Aprovado"); if (MA >7.5|| MA >=6.0) printf ("\n Conceito C\n"); if (MA >7.5|| MA >=6.0) printf ("Aprovado"); if (MA >6.0|| MA >=4.0) printf ("\n Conceito D\n"); if (MA >6.0|| MA >=4.0) printf ("Reprovado"); if (MA<4.0) printf("\n Conceito\n E\n\n"); if (MA<4.0) printf ("Reprovado"); oque está errado dessa vez? ;~ Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Abril 10, 2011 Olá! Isso é pela lógica do seu cálculo. Como eu acabei de comentar no seu último tópico (escreva no mesmo tópico mesmo... não precisa criar outro se for o mesmo programa =P), se MA >= 9.0 - Ou seja se for A, vai dicionar Aprovado. Se MA for > 9.0 OU >= 7.5, adicionaria aprovado. Não seria a lógica abaixo não? Acho que você trocou os operadores relacionais: if (MA >= 9.0) { printf("\n Conceito A\n"); // Maior que 9.0 printf("Aprovado"); } if (MA < 9.0 && MA >=7.5) { printf("\n Conceito B\n"); // Menor que 9.0 E maior ou igual a 7.5 printf("Aprovado"); } if (MA < 7.5 && MA >=6.0) { printf("\n Conceito C\n"); // Menor que 7.5 E maior ou igual a 6.0 printf("Aprovado"); } if (MA < 6.0 && MA >=4.0) { printf("\n Conceito D\n"); // Menor que 6.0 E maior ou igual a 4.0 printf("Reprovado"); } if (MA < 4.0) { printf("\n Conceito\n E\n\n"); // Menor que 4.0 printf("Reprovado"); } Agora, vamos à questão de velocidade de execução: Para quê fazer DOIS if's para chegar ao mesmo conceito? Se o teste de validade do if for igual ao do próximo, coloque em um bloco só. Aconteceria que antes, 2 ifs seriam executados - teria-se que testar DUAS vezes a validade de tal expressão, olhe que perda de tempo! Se você testar só uma vez, ganha no desempenho. Mas ainda tem outro problema. Suponha que você usou 7.6 para testar. O que acontece? Passa no primeiro if. O valor 7.6 é testado contra a expressão e o if não é executado, pois não é verdadeira. Então pula para o próximo if. O teste dá resultado verdadeiro e o que está dentro das chaves é executado. Mas agora, veja só, o programa vai continuar a testar o valor 7.6 contra os próximos if's, mesmo que o 2º tenha dado verdadeiro. Veja que perda de desempenho! 4 ifs a mais executados, sendo que pode ter certeza que vão dar resultado fácil! Como resolvemos isso? Usamos a escada if-else-if. Ao usar essa escada, o próximo if só será executado caso o if anterior der resultado falso. Caso um if der resultado verdadeiro e o conteúdo do seu bloco for executado, o próximo não será nem testado, e você não perderá desempenho com isso. O programa ficaria assim então: if (MA >= 9.0) { printf("\n Conceito A\n"); // Maior que 9.0 printf("Aprovado"); } else if (MA < 9.0 && MA >=7.5) { printf("\n Conceito B\n"); // Menor que 9.0 E maior ou igual a 7.5 printf("Aprovado"); } else if (MA < 7.5 && MA >=6.0) { printf("\n Conceito C\n"); // Menor que 7.5 E maior ou igual a 6.0 printf("Aprovado"); } else if (MA < 6.0 && MA >=4.0) { printf("\n Conceito D\n"); // Menor que 6.0 E maior ou igual a 4.0 printf("Reprovado"); } else if (MA < 4.0) { printf("\n Conceito\n E\n\n"); // Menor que 4.0 printf("Reprovado"); } Veja, você pode até pensar que isso é uma perda de tempo, pois seu programa é muito pequeno e o ganho com isso é quase nulo. Mas, imagine que você tivesse 1 milhão de linhas de códigos em um jogo. Você quer ganhar o máximo de desempenho possível para ter um jogo que rode mais rápido (e em mais computadores, o que resultaria em mais vendas - visão de marketing). Seu código tem que ser o mais bem desenhado possível e o mais eficiente possível também. Em 1 milhão de linhas de códigos, a quantidade de if's chega a ser absurdamente imensa (lol XD), e o ganho de desempenho colocando o else pode ser igualmente imenso. Espero que tenha entendido... Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
spinhei 0 Denunciar post Postado Abril 10, 2011 sabe o que é... eu tinha posto && antes de criar o primeiro tópico mais quando compilei aparecia && nao sei porque mais agora deu certo, me responde mais uma coisa? if (MA >= 9.0) { printf("\n Conceito A\n"); // Maior que 9.0 printf("\nAprovado\n"); } essas chaves são obrigatorias? se sim, porque? obrigada ;D aaaah tá! eu ja vi porque saia o && era porque eu nao usava {} né? brigada!! Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Abril 11, 2011 Olá! As chaves { e } depois do if não são obrigatórias. Elas agrupam comandos. Por exemplo, se você irá usar somente um comando após o if, você pode fazer de 2 jeitos: Colocando a chave, que mostra que todo o código entre as chaves é da estrutura if anterior... if (MA >= 9.0) { printf("\n Conceito A\n"); // Maior que 9.0 } Ou sem colocar a chave, sendo que o if só executará o próximo comando. if (MA >= 9.0) printf("\n Conceito A\n"); // Maior que 9.0 Mas, se você tiver que executar 2 ou mais comandos depois do if, você agrupa eles entre as chaves. Tudo o que estiver dentro das chaves será executado caso a instrução if for verdadeira. if (MA >= 9.0) { printf("\n Conceito A\n"); // Maior que 9.0 printf("Aprovado"); } Aí, se você remover as chaves, o if só executará a primeira instrução após ele se sua condição for avaliado como verdadeira. Mesmo que você idente direitinho seu código, deixando as 2 instruções com TAB, a identação não muda nada no seu código (nem qualquer espaço fora das aspas), é só uma forma de deixar seu código mais legível e organizado. Por exemplo, o código a seguir só irá dar printf("\n Conceito A\n"); se a instrução if for avaliada como verdadeira, mas a próxima instrução printf("Aprovado"); será sempre executada, pois como não há chaves delimitando o bloco de código que será executado pelo if, ele só vai executar a instrução mais próxima. if (MA >= 9.0) printf("\n Conceito A\n"); // Será executada caso o if for verdadeiro printf("Aprovado"); // Será SEMPRE executada Para evitar problemas como esses, SEMPRE adicione chaves após um if, colocando o código que será executado por ele ENTRE as duas chaves, mesmo que seja só uma instrução. Enquanto você está aprendendo, você pode esquecer de colocar, e aprendendo a colocar todas as vezes, não terá problemas com isso e o código ficará mais fácil de ler, pois o bloco do if está delimitado claramente. Mais uma coisa, as chaves não mudam nada no desempenho, apenas delimitam o que a instrução if executará. Isso vale para qualquer instrução condicional, como while, for, do-while, etc. Veja também que é usada em funções. A função main() começa com uma { e termina com uma }. As duas chaves marcam o código que ela executa. Espero que tenha entendido! Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
spinhei 0 Denunciar post Postado Abril 11, 2011 eu quero que n1 nao seja negativo e esteja no intervalo de 0 até 10 porque nao dá certo?? obs só da certo o negativo o intervalo nao dá! do{ printf("Digite o valor de n1\n"); scanf("%f", &n1); }while (n1 <0 && (n1<=10); Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Abril 11, 2011 Olá! Sugiro que dê uma olhada nessa seção do fórum: Lógica de Programação e Algoritmos. Dê uma olhada em Portugol, aprenda a lógica de programação em si, antes de aprender qualquer linguagem de programação, senão você não vai para frente. do { printf("Digite o valor de n1\n"); scanf("%f", &n1); } while(n1 >= 0 && (n1<=10); n1 tem que ser maior ou igual a zero, enquanto tem que ser menor ou igual a 10. Assim se consegue o intervalo que você quer. Antes estava: n1 tem que ser menor que zero, enquanto tem que ser menor ou igual a 10. Ou seja: só funcionava caso fosse menor que 0 (número negativo). São só críticas construtivas, ok? Eu mesmo já passei por isso quando comecei a aprender a programar, você vai ver que ajuda muito. Você precisa ter uma base sólida de lógica antes de começar a aprender a programar, principalmente em uma linguagem complexa como a C ou a C++. E quando for aprender C ou C++ em si, sugiro que compre um livro que seja bom e recomendado para iniciantes, ou você não vai dar conta. Fui tentar aprender C++ por um guia completo, mas complexo, isso até me desanimou para aprender. Quando comprei um livro para iniciantes de um autor que é muito recomendado e conhecido, aprendi facilmente. Depois pude passar para o tal livro completo e complexo, que era do criador da C++. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
spinhei 0 Denunciar post Postado Abril 11, 2011 o jeito que você disse nao funcionou eu coloco } while((n1 <= 0) pois eu nao quero que o programa leia numero menor que 0, do jeito que você me deu ele lê e o n1<=0 continua sem fincionar... as noas tem que ficar no intervalo [0,10] do{ printf("Digite o valor de n1\n "); scanf("%f", &n1); } while((n1 <= 0) && (n1<=10));; Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Abril 11, 2011 Olá! Lol, me desculpe, eu tratei como um if. O erro estava no segundo algoritmo seu... Coloque assim: do { printf("Digite o valor de n1\n"); scanf("%f", &n1); } while(n1 < 0 && n1 > 10; Porque o loop continuará enquanto for menor que 0 ou maior que 10. Ele só parará quando estiver entre 0 e 10, incluindo os 2. Desculpe-me o erro. Isso acontece nas melhores famílias ;D Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
spinhei 0 Denunciar post Postado Abril 11, 2011 naao sei por que mais ainda continua sem funcionar colo 11 por exemplo e lê normalmente, o que nao era pra acontecer quando eu colacasse 11 era pra aparecer a mensagem digite o valor de n1 novamente, o mesmo que acontece quando ponho um numero negativo ;~~~~ deu ceeeerto ficou assim do { printf("Digite o valor de n1\n"); scanf("%f", &n1); } while(n1 < 0 || n1 > 10); brigada pela ajuda! Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Abril 11, 2011 Olá! Isso, me desculpe... a patroa tava brigando aqui para eu ir dormir e não deu tempo para olhar se estava feito certinho... Desculpe-me, estou envergonhado =X Já errei um monte de vezes isso, e espero não errar mais... Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites