我的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());