2008-11-14 3 views
0

J'ai une erreur logique. J'ai fourni les éléments suivants en entrée:Un bug de logique dans mon code C#, que dois-je faire?

  • le salaire est 30000
  • l'enfant n ° est 9

Ainsi, le salaire net sera:

  • la prime familiale + salaire - impôt

    (750)  + (30000) - (3000) 
    
  • mais mon programme leur compte comme

    (1500) + (30000) + (6000) 
    

Mon programme a doublé (cumulé) le bonus de la famille et la taxe. Quelqu'un peut-il expliquer pourquoi?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Employee e = new Employee(); 
     e.ReadEmployee(); 
     e.PrintEmployee(); 
    } 
} 

class Employee 
{ 
    private string n; 
    private int byear; 
    private double sal; 
    private bool gen; 
    private bool mar; 
    private int child; 
    public static double tax = 0; 
    public static double familybonus = 0; 
    public string Ename 
    { 
     get { return this.n; } 
     set 
     { 
      this.n = value; 

     } 
    } 
    public int Birthyear 
    { 
     get { return this.byear; } 
     set 
     { 
      if (value >= 1970 && value <= 1990) this.byear = value; 
      else this.byear = 0; 
     } 
    } 
    public double Salary 
    { 
     get { return this.sal; } 
     set 
     { 
      if (value >= 5000 && value <= 50000) this.sal = value; 
      else this.sal = 0; 
     } 
    } 

    public bool Gender 
    { 
     get { return this.gen; } 
     set { this.gen = value; } 
    } 
    public bool Married 
    { 
     get { return this.mar; } 
     set { this.mar = value; } 
    } 
    public int NChildren 
    { 
     get { return this.child; } 
     set 
     { 
      if (value >= 0 && value <= 12) this.child = value; 
      else this.child = 0; 
     } 
    } 

    public double getAge() 
    { 
     return 2008 - this.Birthyear; 
    } 
    public double getNet() 
    { 
     double net = getFamilyBonus() + this.Salary - getTax(); 
     return net; 
    } 

    public double getFamilyBonus() 
    { 

     if (this.Married == true) 
      familybonus += 300; 
     if (this.NChildren == 1) familybonus += 200; 
     else if (this.NChildren == 2) familybonus += 350; 
     else if (this.NChildren >= 3) familybonus += 450; 
     return familybonus; 
    } 

    public double getTax() 
    { 
     if (Salary < 10000) 
      tax = 0; 
     if (Salary <= 10000 && Salary >= 20000) 
      tax += Salary * 0.05; 
     else tax += Salary * 0.1; 
     return tax; 

    } 

    public void ReadEmployee() 
    { 
     Console.Write("Enter Employee Name: "); 
     Ename = Console.ReadLine(); 
     Console.Write("Enter Employee birth date: "); 
     Birthyear = int.Parse(Console.ReadLine()); 

     while (Birthyear < 1970 || Birthyear > 1990) 
     { 
      Console.WriteLine("Invalid Birthyear!"); 
      Console.Write("Enter Employee Birth date: "); 

      Birthyear = int.Parse(Console.ReadLine()); 
     } 
     string g = null; 
     while (g != "M" && g != "m" && g != "F" && g != "f") 
     { 
      Console.Write("Enter Employee Gender (M/F)"); 
      g = Convert.ToString(Console.ReadLine()); 
     } 

     if (g == "M" || g == "m") 
      Gender = true; 
     else 
      Gender = false; 
     Console.Write("Enter Employee Salary: "); 
     Salary = Double.Parse(Console.ReadLine()); 
     while (Salary < 5000 || Salary > 50000) 
     { 
      Console.WriteLine("Invalid Salary!"); 
      Console.Write("Enter Employee Salary: "); 
      Salary = int.Parse(Console.ReadLine()); 
     } 
     string m = null; 
     while (m != "true" && m != "True" && m != "false" && m != "False") 
     { 
      Console.Write("Married (true/false)"); 
      m = Console.ReadLine(); 

     } 
     if (m == "true") 
      this.Married = true; 
     else 
      this.Married = false; 

     Console.Write("Enter Employee Children count: "); 
     NChildren = int.Parse(Console.ReadLine()); 

     while (NChildren < 0 || NChildren > 12) 
     { 
      Console.WriteLine("Invalid NChildren!"); 
      Console.Write("Enter Employee Children count: "); 

      NChildren = int.Parse(Console.ReadLine()); 
     } 

    } 
    public void PrintEmployee() 
    { 
     Console.Write("Hello "); 
     { 
      if (Gender == true) 
       Console.Write("Mr. "); 
      else 
       Console.Write("Mrs. "); 
      Console.WriteLine(Ename); 
     } 
     Console.WriteLine("You are {0} years old", getAge()); 
     Console.WriteLine("Salary= {0}", Salary); 
     Console.WriteLine("Tax= {0}", getTax()); 
     Console.WriteLine("Family bonus= {0}", getFamilyBonus()); 
     Console.WriteLine("Net= {0}", getNet()); 
    } 
} 
+0

N'est-ce pas très similaire à http://stackoverflow.com/questions/287011/c-help-with-properties? –

+0

Je vous recommande fortement de faire un refactoring avant même d'essayer de trouver le code défectueux! – Bluenuance

+0

@Calamitous - convenu. Quelques trucs "amusants" là-bas ... –

Répondre

2

Je pris le code existant, et par câble les entrées (plutôt que d'utiliser Console.ReadLine()), je reçois:

Vous êtes 28 ans Salaire = 30000 = 3000 taxe bonus famille = 750 net = 25500

Le principal problème semble ne pas initialiser les valeurs - à savoir le traitement des champs comme variables:

public double getTax() 
{ 
    if (Salary < 10000) 
     tax = 0; 
    if (Salary <= 10000 && Salary >= 20000) 
     tax += Salary * 0.05; 
    else tax += Salary * 0.1; 
    return tax; 
} 

OK - et w Le chapeau tax commence à Salary >= 10000, etc. familyBouns dans getFamilyBonus. Par ailleurs, comment salaire peut être à la fois <= 10000 et >= 20000?

Pour illustrer, j'ai changé la sortie:

Console.WriteLine("Tax= {0}", getTax()); 
    Console.WriteLine("Tax= {0}", getTax()); 
    Console.WriteLine("Tax= {0}", getTax()); 

qui montre:

taxe = 3000 = impôt 6000 = impôt 9000

Mon conseil serait : ne stockez pas de valeurs calculées à moins de savoir que les maths sont si complexes qu'elles en valent la peine. Il suffit de les calculer au besoin (pas de champ du tout).

+0

oui et c'est faux le net devrait être 27750 –

+0

@john - J'ai ajouté des détails à ce sujet ... –

+0

merci beaucoup marc qui a résolu le problème –

0

Un autre problème semble résider dans le fait que vous n'initialisez pas familybonus quand vous dites familybonus + = 300. Donc, chaque fois que vous appelez GetFamilybonus il est ajouté au résultat précédent. Vous l'appelez deux fois dans la fonction PrintEmployee, une fois directement et une fois indirectement en appelant getNet;

Questions connexes