Everything seems to run fine, except the tax owed displayed is always 0. I cannot figure out how to correctly get the calculations for the default or the users entries. here is the code I have any help would be appreciated.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestApp
{
class Rates
{
public readonly int incomeLimit;
public readonly double lowTax;
public readonly double highTax;
public Rates()
{
incomeLimit = 30000;
lowTax = .15;
highTax = .28;
}
public Rates(int limit, double lowRate, double highRate)
{
limit = incomeLimit;
lowRate = lowTax;
highRate = highTax;
}
public double CalcTax(double income)
{
double tax;
if (income < incomeLimit)
tax = income * lowTax;
else
tax = income * highTax;
return tax;
}
}
class Taxpayer : IComparable <Taxpayer>
{
public string social;
public double grossincome;
public double taxowed;
public string SSN
{
get
{
return social;
}
set
{
social = value;
}
}
public double grossIncome
{
get
{
return grossincome;
}
set
{
grossincome = value;
}
}
public double taxOwed
{
get
{
return taxowed;
}
}
public int CompareTo(Taxpayer o)
{
return this.taxOwed.CompareTo(o.taxOwed);
}
public static void getRates()
{
Rates rates = new Rates();
Taxpayer tax = new Taxpayer();
int limit = 0;
double lowRate = 0;
double highRate = 0;
char input;
Console
.Write("Do you want default values (enter D) or enter your own (enter O)? ");
input = Char.ToUpper(Convert.ToChar(Console.ReadLine()));
switch (input)
{
case 'D':
Rates def = new Rates();
limit = def.incomeLimit;
lowRate = def.lowTax;
highRate = def.highTax;
tax.taxowed = def.CalcTax(tax.grossIncome);
break;
case 'O':
Rates own = new Rates(limit, lowRate, highRate);
Console.Write("Enter the dollar limit ");
limit = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter the low rate ");
lowRate = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter the high rate ");
highRate = Convert.ToDouble(Console.ReadLine());
tax.taxowed = own.CalcTax(tax.grossIncome);
break;
}
}
}
class Program
{
static void Main(string[] args)
{
Taxpayer[] taxarray = new Taxpayer[5];
for (int x = 0; x < taxarray.Length; ++x)
{
taxarray[x] = new Taxpayer();
Console.Write("Enter Social Security Number for taxpayer {0}: ", x+1);
taxarray[x].SSN = Console.ReadLine().Replace("-", "");
Console.Write("Enter gross income for taxpayer {0}: ", x+1);
taxarray[x].grossIncome = Convert.ToDouble(Console.ReadLine());
//Taxpayer.getRates();
Taxpayer.getRates();
}
Console.WriteLine();
for (int i = 0; i < taxarray.Length; i++)
{
Console.WriteLine("Taxpayer # {0} SSN: {1} income {2:c} Tax is {3:c}",
i+1,taxarray[i].SSN, taxarray[i].grossIncome, taxarray[i].taxOwed);
}
Console.WriteLine("-------------------------------------------------------");
Array.Sort(taxarray);
for (int i = 0; i < taxarray.Length; i++)
{
Console.WriteLine("Taxpayer # {0} SSN: {1} income {2:c} Tax is {3:c}",
i+1,taxarray[i].SSN, taxarray[i].grossIncome, taxarray[i].taxOwed);
}
}
}
}
The primary problem appears to be that you're calling a static method (getRates
). The values you enter get stored in the newly-created TaxPayer
instance in that method, but they never get copied to the instance that you're creating in the array.
I think you want to make that an instance method and in your input loop call it like this:
taxarray[x].getRates();
That will require some changes to your getRates
method, in particular having it use the this
reference rather than creating a new TaxPayer
instance.