提问人:Codi 提问时间:4/22/2022 最后编辑:Lee TaylorCodi 更新时间:4/22/2022 访问量:138
使用整数和字符串的布尔逻辑
Boolean logic using integers and strings
问:
如果申请人符合所有标准,我希望它回答“真”,如果申请人不符合标准,我希望它回答“假”。这是我在 VS 中的内容:
namespace Boolean_Logic
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("What is your age?");
string yourAge = Console.ReadLine();
Console.WriteLine("Have you ever had a DUI? Answer with true or false");
string yourDuis = Console.ReadLine();
Console.WriteLine("How many speeding tickets do you have?");
string yourTickets = Console.ReadLine();
Console.ReadLine();
int applicantAge = 18;
bool applicantDui = false;
int applicantTickets = 3;
bool isQualified = (applicantAge >= 18 && !applicantDui && applicantTickets <= 3);
Console.WriteLine(isQualified);
Console.ReadLine();
}
}
}
答:
您需要将读取的字符串转换为适当的类型。
Console.WriteLine("What is your age?");
string yourAgeStr = Console.ReadLine();
int applicantAge = Int32.Parse(yourAgeStr);
对于布尔值 你可能想要
string yourDuisStr = Console.ReadLine();
bool applicantDui = yourDuisStr == "Y" || yourDuisStr == "y";
门票也一样
请注意,如果您为年龄提示输入非数字信息,您将感到格外兴奋。看看你是否能想出如何解决这个问题(有 2 种主要方法或这样做,看看你是否能解决它们)
编辑 - 我注意到您提示用户回答“true”或“false”(一个非常奇怪的 UI )
所以这是必要的
bool applicantDui = yourDuisStr == "true";
或
bool applicantDui = bool.Parse(youDuiStr);
评论
您需要解析字符串。使用 int。TryParse 和 bool。尝试解析
static void Main(string[] args)
{
Console.WriteLine("What is your age?");
string yourAgeResponse = Console.ReadLine();
if (!int.TryParse(yourAgeResponse, out var yourAge))
{
Console.WriteLine($"{yourAgeResponse} is not a valid age (must be an integer)");
return;
}
//do the same type of thing for the other parameters.
}
对你有很大帮助的事情(不仅从设计的角度来看,而且因为它可以防止这种问题)是在构建块中构建你的代码,而不是将所有内容都转储到 main 中。问问自己代码在做什么,并将其分解为多个步骤:
- 从用户那里获取年龄
- 了解用户是否曾经有过酒驾
- 从用户处获取超速罚单的数量
- 检查用户是否合格
- 告诉用户他们是否合格。
对于其中每个步骤,编写一个方法签名。让我们从第 1 步开始:我们需要一个整数(用户的年龄),并且没有参数:
int GetAgeFromUser()
如果我们对所有步骤都这样做,我们会得到如下结果:
int GetAgeFromUser()
bool HasUserHadDuis()
int GetSpeedingTicketsFromUser()
bool IsUserQualified(int age, bool hasDuis, int speedingTickets)
void TellUserIfTheyAreQualified(bool isQualified)
您的 Main 方法变得更加可读和易于理解:
static void Main(string[] args)
{
int age = GetAgeFromUser();
bool hasDuis = HasUserHadDuis();
int speedingTickets = GetSpeedingTicketsFromUser();
bool isQualified = IsUserQualified(age, hasDuis, speedingTickets);
TellUserIfTheyAreQualified(isQualified);
}
除了可读性之外,这还有许多其他好处:
你的一个大问题已经分解成多个小问题
您创建的每个方法都是可重用的。(如果您需要再次询问一些信息,则无需重写相同的代码即可完成)
现在,您的所有数据类型都保证正确无误
最后一点是与您当前问题的相关部分。现在,您已经定义了 IsUserQualified 的签名,您知道参数将始终是预期类型。
最后要做的是编写每个方法。因为你会想做这样的事情:GetAgeFromUser
static int GetAgeFromUser()
{
int age;
while (!TryGetAgeFromUser(out age))
{
Console.WriteLine("Invalid age! age must be an integer.");
}
return age;
static bool TryGetAgeFromUser(out int age)
{
Console.WriteLine("What is your age?");
string response = Console.ReadLine();
return int.TryParse(response, out age);
}
}
至少我会这样做。上面的代码可能有点超出你的脑海,但没关系。你可以用自己的方式写,也可以通过尝试理解我写的内容来学习
评论
感谢大家的帮助!我能够想出一些办法让它工作。对我有用的代码是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Boolean_Logic
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("What is your age?");
int yourAge = Convert.ToInt32(Console.ReadLine());
Console.ReadLine();
Console.WriteLine("Have you ever had a DUI? Please answer true/false.");
bool yourDuis = Convert.ToBoolean(Console.ReadLine());
Console.WriteLine("How many speeding tickets do you have?");
int yourTickets = Convert.ToInt32(Console.ReadLine());
Console.ReadLine();
bool isQualified = (yourAge >= 18 && !yourDuis && yourTickets <= 3);
Console.WriteLine(isQualified);
Console.ReadLine();
}
}
}
评论
下一个:和/或评估的捷径
评论
yourDuis
isQualified
applicantDui