Problems with result precision

0

I have a problem where I made a program to calculate the average of a student, where the condition is:

  

AVERAGE = NOTE1 + NOTE2 / 2 (the result should be> 7 for the student to be approved)

The program is running fine, the problem is that when I use decimal values close to 7 it does not return the condition response ...

For example; the mean was: 6.9 . The right thing was to show the message (REJECTED), but it does not appear ... if I use values.

The most curious thing is that if it is any decimal number below 6, it works normally ... for example: media = 5.9 prints REPROVED successfully

string NomeDoAluno, disciplina, RA;
int NumeroDeFaltas;
double NP1, NP2, MEDIA_FINAL;


Console.Write("\nDIGITE O SEU NOME: "); 
NomeDoAluno = Console.ReadLine();

Console.Write("DIGITE O SEU RA: ");
RA = Console.ReadLine();

Console.Write("DIGITE A DISCIPLINA: ");
disciplina = Console.ReadLine();

Console.Write("DIGITE O SEU NÚMERO DE FALTAS: ");
NumeroDeFaltas = int.Parse(Console.ReadLine());

Console.Write("DIGITE SUA NP1 E SUA NP2: ");
NP1 = Double.Parse (Console.ReadLine());
NP2 = Double.Parse (Console.ReadLine());

MEDIA_FINAL = (NP1 + NP2) / 2;


Console.WriteLine("\nNome:  {0} \tRA:  {1}", NomeDoAluno, RA);
Console.WriteLine("\nDisciplina: {0}   \t Número de Faltas:  {1}", disciplina,NumeroDeFaltas);
Console.WriteLine("\nNotas\tP1:  {0}  \tP2: {1}   \tMEDIA FINAL:  {2}", NP1, NP2,MEDIA_FINAL);

//CONDIÇÃO PARA APROVAÇÃO DO ALUNO 

if (MEDIA_FINAL >= 7 & NumeroDeFaltas <= 10)
{
    Console.Write("\nPARABÉNS VOCÊ FOI APROVADO !");
}


else if (NumeroDeFaltas > 10 & MEDIA_FINAL <= 6)
{
    Console.Write("\nVOCÊ FOI REPROVADO POR FALTA E NOTA!");
}

else if (NumeroDeFaltas > 10 & MEDIA_FINAL >=7)
{
    Console.Write("\nVOCÊ FOI REPROVADO POR FALTA !");
}

else if (MEDIA_FINAL <= 6 & NumeroDeFaltas <= 10) 
{
    Console.Write("\nVOCÊ FOI REPROVADO POR NOTA!");
}
    
asked by anonymous 18.08.2017 / 01:35

3 answers

1

The range less than 7 is not set, the system is only failing note

18.08.2017 / 01:54
1

Certainly your problem is in the mix of types ( double , int , etc) in the average calculation. You can read here about what is the correct way to use float, double and decimal .

I was in a good mood, and I decided to write a more elaborate code to do the same, but with object orientation.

Have fun!

Calculating Media Like a Boss

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        Console.Write("\nDIGITE O SEU NOME: ");
        var nome = Console.ReadLine();

        Console.Write("DIGITE O SEU RA: ");
        var ra = Console.ReadLine();

        var aluno = new Aluno(nome, ra);

        Console.Write("DIGITE A DISCIPLINA: ");
        var nomeDisciplina = Console.ReadLine();
        var disciplina = aluno.AdicionarDisciplina(nomeDisciplina);

        Console.Write("DIGITE O SEU NÚMERO DE FALTAS: ");
        var faltas = int.Parse(Console.ReadLine());
        disciplina.AdicionarFaltas(faltas);

        foreach (var prova in disciplina.Provas)
        {
            Console.Write("DIGITE A NOTA DA PROVA "+ prova.Tipo +": ");
            var nota = decimal.Parse(Console.ReadLine());
            prova.DarNota(nota);
        }

        Console.WriteLine("\nNome:  {0} \tRA:  {1}", aluno.Nome, aluno.RA);
        Console.WriteLine("\nDisciplina: {0}   \t Número de Faltas:  {1}", disciplina.Nome, disciplina.Faltas);
        foreach (var prova in disciplina.Provas) Console.WriteLine("\nNotas\t{0}: {1}", prova.Tipo, prova.Nota);
        Console.WriteLine("\nMEDIA FINAL: {0}", disciplina.CalcularMedia());

        if (disciplina.AprovadoGeral())
            Console.Write("\nPARABÉNS VOCÊ FOI APROVADO !");
        else
        {
            if (!disciplina.AprovadoPorNota())
                Console.Write("\nOOPS! FOI REPROVADO POR NOTA!");
            if (!disciplina.AprovadoPorPresenca())
                Console.Write("\nOOPS! FOI REPROVADO POR FALTA!");
        }
    }
}

public class Aluno
{
    public string Nome { get; private set; }
    public string RA { get; private set; }
    public List<Disciplina> Disciplinas { get; }

    public Aluno(string nome, string ra)
    {
        Nome = nome;
        RA = ra;
        Disciplinas = new List<Disciplina>();
    }

    public Disciplina AdicionarDisciplina(string nomeDisciplina)
    {
        var disciplina = new Disciplina(nomeDisciplina);
        Disciplinas.Add(disciplina);
        return disciplina;
    }
}


public class Disciplina
{
    public string Nome { get; private set; }
    public int Faltas { get; private set; }
    public List<Prova> Provas { get; }

    private const int _faltasMaximasParaAprovar = 10;
    private const decimal _notaMinimaParaAprovar = 7m;

    public Disciplina(string nome)
    {
        Nome = nome;
        Faltas = 0;
        Provas = new List<Prova>
        {
            new Prova(TipoProva.NP1),
            new Prova(TipoProva.NP2),
        };
    }

    public void AdicionarFaltas(int faltas)
    {
        Faltas += faltas;
    }

    public decimal CalcularMedia()
    {
        var total = 0m;
        foreach (var prova in Provas) total += prova.Nota;

        var media = total / Provas.Count;
        return media;
    }

    public bool AprovadoPorNota()
    {
        var media = CalcularMedia();
        return media >= _notaMinimaParaAprovar;
    }

    public bool AprovadoPorPresenca()
    {
        return Faltas <= _faltasMaximasParaAprovar;
    }

    public bool AprovadoGeral()
    {
        var aprovadoPorNota = AprovadoPorNota();
        var aprovadoPorPresenca = AprovadoPorPresenca();

        return aprovadoPorNota && aprovadoPorPresenca;
    }
}

public class Prova
{
    public TipoProva Tipo { get; }
    public decimal Nota { get; private set; }

    public Prova(TipoProva tipo)
    {
        Tipo = tipo;
    }

    public void DarNota(decimal nota)
    {
        Nota = nota;
    }
}

public enum TipoProva
{
    NP1,
    NP2
}

See it working here

    
18.08.2017 / 10:32
1

You are mixing the data types to compare (Int and double). Ideally, you should only use decimal or double. Examples:

  • 10 (Int)
  • 10.0 (double)
  • 10m (decimal)

    double MEDIA_FINAL = (NP1 + NP2) / 2.0;

Another problem is that the conditions do not meet the interval between 6 and 7. The correct would be:

if (MEDIA_FINAL >= 7 & NumeroDeFaltas <= 10)
{
Console.Write("\nPARABÉNS VOCÊ FOI APROVADO !");
}

else if (NumeroDeFaltas > 10 & MEDIA_FINAL < 7)
{
Console.Write("\nVOCÊ FOI REPROVADO POR FALTA E NOTA!");
}
    
18.08.2017 / 01:52