Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

spinhei

[Resolvido] Não deu certo de novo

Recommended Posts

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.