我的C#代码中有一个逻辑错误,我该怎么办?

我的C#代码中有一个逻辑错误,我该怎么办?,c#,C#,我有一个逻辑错误。我提供了以下信息作为输入: 薪水是30000英镑 孩子9岁 因此,净工资将为: 家庭奖金+工资-税 (750) + (30000) - (3000) 但是我的程序把它们算作 (1500) + (30000) + (6000) 我的计划使家庭奖金和税收增加了一倍。有人能解释为什么吗 class Program { static void Main(string[] args) { Employee e = n

我有一个逻辑错误。我提供了以下信息作为输入:

  • 薪水是30000英镑
  • 孩子9岁
因此,净工资将为:

  • 家庭奖金+工资-税

     (750)       + (30000) - (3000)
    
  • 但是我的程序把它们算作

      (1500)    + (30000) + (6000)
    
我的计划使家庭奖金和税收增加了一倍。有人能解释为什么吗

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());
    }
}
类程序
{
静态void Main(字符串[]参数)
{
员工e=新员工();
e、 ReadEmployee();
e、 PrintEmployee();
}
}
班级员工
{
私有字符串n;
私人内特拜耳;
私人双萨尔;
私人布尔根;
私人布尔马尔;
私生子女;
公共静态双重税=0;
公共静态双家庭总线=0;
公共字符串名称
{
获取{返回此.n;}
设置
{
这.n=值;
}
}
公众生日
{
获取{返回this.byear;}
设置
{
如果(值>=1970&&value=5000&&value=0&&value=3)familybonus+=450;
回归家庭责任;
}
公共双getTax()
{
如果(工资<10000)
税=0;
如果(工资=20000)
税费+=工资*0.05;
其他税费+=工资*0.1;
退税;
}
公开作废ReadEmployee()
{
控制台。写入(“输入员工姓名:”);
Ename=Console.ReadLine();
控制台。写入(“输入员工出生日期:”);
Birthyear=int.Parse(Console.ReadLine());
而(出生年份<1970 | |出生年份>1990)
{
Console.WriteLine(“无效的生日!”);
控制台。写入(“输入员工出生日期:”);
Birthyear=int.Parse(Console.ReadLine());
}
字符串g=null;
而(g!=“M”&g!=“M”&g!=“F”&g!=“F”)
{
控制台。写入(“输入员工性别(男/女)”;
g=Convert.ToString(Console.ReadLine());
}
如果(g==“M”| g==“M”)
性别=正确;
其他的
性别=假;
控制台.写入(“输入员工工资:”);
Salary=Double.Parse(Console.ReadLine());
同时(工资<5000 | |工资>50000)
{
Console.WriteLine(“无效工资!”);
控制台.写入(“输入员工工资:”);
Salary=int.Parse(Console.ReadLine());
}
字符串m=null;
而(m!=“真”与&m!=“真”与&m!=“假”与&m!=“假”)
{
控制台。写(“已婚(对/错)”;
m=控制台.ReadLine();
}
如果(m==“真”)
这是真的;
其他的
这个。已婚=假;
Console.Write(“输入员工子女计数:”);
NChildren=int.Parse(Console.ReadLine());
而(儿童<0 | |儿童>12)
{
Console.WriteLine(“无效儿童!”);
Console.Write(“输入员工子女计数:”);
NChildren=int.Parse(Console.ReadLine());
}
}
公共部门雇员()
{
控制台。写(“你好”);
{
如果(性别==真)
控制台。写下(“先生”);
其他的
控制台。写下(“女士”);
控制台写入线(Ename);
}
WriteLine(“您已经{0}岁了”,getAge());
WriteLine(“Salary={0}”,Salary);
WriteLine(“Tax={0}”,getTax());
WriteLine(“家庭奖金={0}”,getFamilyBonus());
WriteLine(“Net={0}”,getNet());
}
}

另一个问题似乎在于,当你说familybonus+=300时,你没有初始化familybonus。因此,每次你调用GetFamilybonus时,它都会添加到前面的结果中。你在PrintEmployee函数中调用它两次,一次是直接调用getNet,一次是通过调用getNet间接调用;

我使用了现有的代码,并将其硬连接到放置(而不是使用Console.ReadLine()),我得到:

你已经28岁了薪水=30000 税收=3000家庭奖金=750净=25500

主要问题似乎不是初始化值-即将字段视为变量:

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

税=3000税=6000税=9000


我的建议是:不要存储计算值,除非你知道数学非常复杂,值得这么做。只需根据需要计算它们(根本没有字段)。

这不是很类似吗?我强烈建议你在试图找到错误代码之前先进行重构!@Discartous-同意。这很“有趣”如果可能的话,请有人把问题的标题改成更能描述问题的标题。你们是对的,伙计们,我是初学者,我还在不断地学习我的技能guys@john-另请参见我用粗体突出显示的部分
    Console.WriteLine("Tax= {0}", getTax());
    Console.WriteLine("Tax= {0}", getTax());
    Console.WriteLine("Tax= {0}", getTax());