Как насчет этого? Сначала я перечисляю все штаты (да, вас волнуют только два из них, но любое из них является действительным):
public enum ResidentState
{
AL,
AK,
AZ,
AR,
CA,
CO,
CT,
DE,
FL,
GA,
HI,
ID,
IL,
IN,
IA,
KS,
KY,
LA,
ME,
MD,
MA,
MI,
MN,
MS,
MO,
MT,
NE,
NV,
NH,
NJ,
NM,
NY,
NC,
ND,
OH,
OK,
OR,
PA,
RI,
SC,
SD,
TN,
TX,
UT,
VT,
VA,
WA,
WV,
WI,
WY,
}
Затем я начинаю свой класс страхования автомобилей:
class CarInsurance
{
public int DriverAge { get; private set; }
public ResidentState Residency { get; private set; }
public int TotalPremium { get; private set; }
private bool _ageOk = false;
private bool _residencyOk = false;
}
Имеет общедоступные свойства для DriverAge, ResidentState и TotalPremium. Они могут быть установлены только из класса. Он также имеет несколько флагов учета для возраста и срока действия резидентности.
Затем я добавляю пару функций-членов в этот класс для установки DriverAge и Residency. Они делают проверку ошибок. У них обоих одинаковый рисунок. Они вернут false, если вы не установите их правильно:
public bool SetResidency(ResidentState residency)
{
if (residency != ResidentState.OH && residency != ResidentState.MI)
{
Console.WriteLine("You can only enter states of OH or MI");
return false;
}
Residency = residency;
_residencyOk = true;
return true;
}
public bool SetDriverAge(int age)
{
if (age < 16 || age > 80)
{
Console.WriteLine("The driver's age must between 16 and 80.");
return false;
}
_ageOk = true;
DriverAge = age;
return true;
}
Если вызывающий использует их правильно, тогда _ageOk и _residencyOk будут истинными. В противном случае они могут быть ложными.
Затем я создаю функцию CalculatePremium для этого класса (и нескольких констант) (обратите внимание, я переименовал ее в существительное глагола, я думаю, что это имеет больше смысла):
private const int PremiumOhio = 100;
private const int PremiumMichigan = 250;
public int CalculatePremium()
{
if (!_residencyOk)
{
throw new ArgumentException("The driver's residency must first be entered, and only Ohio and Michigan are valid states");
}
if (!_ageOk)
{
throw new ArgumentException("The driver's age must first be entered, and it must be between 16 and 80");
}
int premium;
switch (Residency)
{
case ResidentState.MI:
premium = PremiumMichigan;
break;
case ResidentState.OH:
premium = PremiumOhio;
break;
default:
premium = 10_000;
break;
}
TotalPremium = (100 - DriverAge) * 3 + premium;
Console.WriteLine($"Your total premium is {TotalPremium:C}");
return TotalPremium;
}
Наконец, я написал класс Program, который имеет функцию Main:
class Program
{
static void Main(string[] args)
{
CarInsurance insurance = new CarInsurance();
bool ageOk = false;
do
{
Console.Write("Enter the age of the driver: ");
var response = Console.ReadLine();
ageOk = int.TryParse(response, out var age);
if (!ageOk)
{
Console.WriteLine("You must enter an integer for age");
}
else
{
ageOk = insurance.SetDriverAge(age);
}
} while (!ageOk);
bool stateOk = false;
do
{
Console.Write("Enter the state the driver lives in: ");
var stateStr = Console.ReadLine();
stateOk = Enum.TryParse<ResidentState>(stateStr, true, out var state);
if (!stateOk)
{
Console.WriteLine($"The state you entered ({stateStr}) is not a valid two-letter state abbreviation");
}
else
{
stateOk = insurance.SetResidency(state);
}
} while (!stateOk);
var premium = insurance.CalculatePremium();
}
}
Обратите внимание, что я проверяю, что введенные данные являются действительным целым числом (или действительным сокращением состояния) в этом код. Затем я проверяю (используя класс страхования), что он действителен для этого расчета. Как написано, это не приведет к выбрасыванию ни одного из исключений в CalculatePremium. Тем не менее, может иметь смысл заключить вызов CalculatePremium в попытку / улов. Я оставлю это на ваше усмотрение - вам действительно нужно прочитать об исключениях.
Я написал, что это способ (и объяснил это в некотором смысле), который позволит вам изучить некоторые особенности язык. Пройдите через это в отладчике. Введите недопустимые записи для обеих величин (что-то, что не является целым числом, а затем что-то, что находится за пределами диапазона по возрасту, и что-то, что не является состоянием, а затем не MI или OH) и посмотрите, что произойдет. Попробуйте вызвать функцию расчета премии с недопустимыми значениями и посмотрите, что произойдет (и попытайтесь поймать результат).