Ir ao conteúdo

Dúvida - Linguagem C


samoel_oliveira

Posts recomendados

Postado

Galera eu sou um iniciante em linguagem C e estava revisando o assunto de estruturas de condições e resolvi fazer a seguinte questão:

Ler as notas das provas de LAPRO I: p1, p2; as notas dos exercícios: e1, e2, e3, e4, e5 e a

nota do trabalho final: tf. A seguir, o programa deve calcular e escrever:

· A média aritmética dos exercícios.

· A média de G1: G1 = (p1+p2+media dos exercícios+trabalho final)/4.

Se a média de G1 for inferior a 4.0, o programa deve exibir a mensagem “Reprovado”. Se a

média for maior ou igual a 7.0, o programa deve exibir a mensagem “Aprovado”. Caso contrário,

deve solicitar ao usuário a nota de G2 e calcular e escrever sua nota final, de acordo com a

fórmula abaixo:

media final = (G1+G2)/2.

Neste caso, se media final for maior ou igual a 5.0, escrever “Aprovado”; senão “Reprovado”.

Bom, eu quase consegui fazer o programa o problema é que ele está mostrando a frase: "O aluno esta reprovado definitivamente!" (eu que criei essa frase para o programa) em momentos certos e momentos errados, se possível eu queria que alguém me explicasse onde errei e porque errei.Grato.



#include <stdio.h>
main()
{
float p1,p2,e1,e2,e3,e4,e5;
float med_e,tf,med_g1,med_g2,mf;

printf("Digite as notas das duas provas:\n");
scanf("%f %f",&p1,&p2);

printf("Digite as notas dos cinco exercicios:\n");
scanf("%f %f %f %f %f",&e1,&e2,&e3,&e4,&e5);

printf("Digite a nota do trabalho final:\n");
scanf("%f",&tf);

med_e=(e1+e2+e3+e4+e5)/(5);
printf("A media dos exercicios e: %.2f \n",med_e);

med_g1= (p1+p2+med_e+tf)/(4);
printf("A media de G1 e: %.2f \n",med_g1);

if (med_g1<4){
printf("Reprovado!\n");
}

if (med_g1>=7){
printf("Aprovado!\n");
}

if (med_g1>=4&&med_g1<7){
printf("Digite a nota G2:\n");
scanf("%f",&med_g2);
}

if (med_g1>=4&&med_g1<7){
mf=(med_g1+med_g2)/(2);
}

if (mf>=5){
printf("O aluno esta aprovado definitivamente!\n");
} else{
printf("O aluno esta reprovado definitivamente!\n");
}

system ("pause");
}






Postado

Bom, vamos lá...

Minha primeira sugestão seria tratar estas condicionais. Por exemplo, se o aluno tiver uma média maior ou igual a 7,0 bastaria imprimir na tela 'Aprovado' e não ter que verificar cada um dos outros if's que estão no código. Alías, é neste ponto que está o erro. Primeiramente para ilustrar o que acabei de dizer:


if (med_g1<4){
printf("Reprovado!\n");
}

else if (med_g1>=7){
printf("Aprovado!\n");
}

else{
....
.....
Calculo de G1
}

Neste caso, só entrará no cálculo de G1 se não satisfazer o primeiro e nem o segundo if. Caso o primeiro if seja válido, ele imprimirá na tela 'Reprovado!' e não entrará nos else's


if (med_g1>=4&&med_g1<7){
printf("Digite a nota G2:\n");
scanf("%f",&med_g2);
}

if (med_g1>=4&&med_g1<7){
mf=(med_g1+med_g2)/(2);
}

São dois if's com condições idênticas, poderia ter colocado em um if somente.

Seu erro consistia em que, por exemplo, um aluno com média 8.0, apareceria na tela 'Aprovado' e não entraria neste condicional:


if (med_g1>=4&&med_g1<7){
mf=(med_g1+med_g2)/(2);
}

onde você atribui algum valor para a variável mf. Se não entrar neste condicional, caso mais para frente você use o valor de mf isto lhe trará problemas pois mf estará carregando o que chamamos de lixo.

Chegando ao centro do problema, um aluno que foi aprovado com média maior ou igual a 7, ao entrar neste condicional:

if (mf>=5){
}

mf terá lixo, sendo uma verificação inconsistente. Para testes depois, crie um programinha simples em que você crie uma variável, e imprima o valor dela, por exemplo:


int num;
printf("Valor de num sem inicializar: %d\n",num);

Rode várias vezes e verá que apresentará valores diferentes.

Acredito que este código solucione o problema. Infelizmente não posso testar, qualquer problema responda.


#include <stdio.h>
main()
{
float p1,p2,e1,e2,e3,e4,e5;
float med_e,tf,med_g1,med_g2,mf;

printf("Digite as notas das duas provas:\n");
scanf("%f %f",&p1,&p2);

printf("Digite as notas dos cinco exercicios:\n");
scanf("%f %f %f %f %f",&e1,&e2,&e3,&e4,&e5);

printf("Digite a nota do trabalho final:\n");
scanf("%f",&tf);

med_e=(e1+e2+e3+e4+e5)/(5);
printf("A media dos exercicios e: %.2f \n",med_e);

med_g1= (p1+p2+med_e+tf)/(4);
printf("A media de G1 e: %.2f \n",med_g1);

if (med_g1<4){
printf("Reprovado!\n");
}

else if (med_g1>=7){
printf("Aprovado!\n");
}
//Se não é menor do que 4 e não é maior ou igual a 7, então só poderia
//estar neste intervalo, não necessita de uma verificação, basta usar o
//else
else{
printf("Digite a nota G2:\n");
scanf("%f",&med_g2);
mf=(med_g1+med_g2)/(2)

if (mf>=5){
printf("O aluno esta aprovado definitivamente!\n");
}
else{
printf("O aluno esta reprovado definitivamente!\n");
}
}
system ("pause");
}

Postado
Bom, vamos lá...

Minha primeira sugestão seria tratar estas condicionais. Por exemplo, se o aluno tiver uma média maior ou igual a 7,0 bastaria imprimir na tela 'Aprovado' e não ter que verificar cada um dos outros if's que estão no código. Alías, é neste ponto que está o erro. Primeiramente para ilustrar o que acabei de dizer:


if (med_g1<4){
printf("Reprovado!\n");
}

else if (med_g1>=7){
printf("Aprovado!\n");
}

else{
....
.....
Calculo de G1
}

Neste caso, só entrará no cálculo de G1 se não satisfazer o primeiro e nem o segundo if. Caso o primeiro if seja válido, ele imprimirá na tela 'Reprovado!' e não entrará nos else's


if (med_g1>=4&&med_g1<7){
printf("Digite a nota G2:\n");
scanf("%f",&med_g2);
}

if (med_g1>=4&&med_g1<7){
mf=(med_g1+med_g2)/(2);
}

São dois if's com condições idênticas, poderia ter colocado em um if somente.

Seu erro consistia em que, por exemplo, um aluno com média 8.0, apareceria na tela 'Aprovado' e não entraria neste condicional:


if (med_g1>=4&&med_g1<7){
mf=(med_g1+med_g2)/(2);
}

onde você atribui algum valor para a variável mf. Se não entrar neste condicional, caso mais para frente você use o valor de mf isto lhe trará problemas pois mf estará carregando o que chamamos de lixo.

Chegando ao centro do problema, um aluno que foi aprovado com média maior ou igual a 7, ao entrar neste condicional:

if (mf>=5){
}

mf terá lixo, sendo uma verificação inconsistente. Para testes depois, crie um programinha simples em que você crie uma variável, e imprima o valor dela, por exemplo:


int num;
printf("Valor de num sem inicializar: %d\n",num);

Rode várias vezes e verá que apresentará valores diferentes.

Acredito que este código solucione o problema. Infelizmente não posso testar, qualquer problema responda.


#include <stdio.h>
main()
{
float p1,p2,e1,e2,e3,e4,e5;
float med_e,tf,med_g1,med_g2,mf;

printf("Digite as notas das duas provas:\n");
scanf("%f %f",&p1,&p2);

printf("Digite as notas dos cinco exercicios:\n");
scanf("%f %f %f %f %f",&e1,&e2,&e3,&e4,&e5);

printf("Digite a nota do trabalho final:\n");
scanf("%f",&tf);

med_e=(e1+e2+e3+e4+e5)/(5);
printf("A media dos exercicios e: %.2f \n",med_e);

med_g1= (p1+p2+med_e+tf)/(4);
printf("A media de G1 e: %.2f \n",med_g1);

if (med_g1<4){
printf("Reprovado!\n");
}

else if (med_g1>=7){
printf("Aprovado!\n");
}
//Se não é menor do que 4 e não é maior ou igual a 7, então só poderia
//estar neste intervalo, não necessita de uma verificação, basta usar o
//else
else{
printf("Digite a nota G2:\n");
scanf("%f",&med_g2);
mf=(med_g1+med_g2)/(2)

if (mf>=5){
printf("O aluno esta aprovado definitivamente!\n");
}
else{
printf("O aluno esta reprovado definitivamente!\n");
}
}
system ("pause");
}

Muito obrigado Vítor Tozzi com a sua resposta eu entendi qual era o meu erro.

  • 2 semanas depois...

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!