我试图使用(DisplayMessage)方法调用一个方法(ChooseDecoration)并返回1,2或其他值的值但是现在方法只是每次都返回0告诉。
我尝试了各种方法,例如在DisplayMessage方法中获取装饰值,但程序规范需要一个单独的方法来查找它们。
namespace ConsoleApp6
{
public class ChristmasCard : ChristmasCardTesting
{
static void Main()
{
ToAndFrom();
double decorate = ChooseDecoration();
DisplayMessage(decorate);
Console.ReadLine();
}
public static void ToAndFrom()
{
Console.WriteLine("Please enter who you are sending the card to");
string to = Console.ReadLine();
Console.WriteLine("Please enter who it is from");
string from = Console.ReadLine();
}
public static void SetBorderCharacter()
{
}
static double ChooseDecoration()
{
Console.WriteLine("Please Choose decoration 1 or 2 ");
double decoration = Convert.ToDouble(Console.Read());
return decoration;
}
public static void DisplayMessage(double decoration)
{
if (decoration == 1)
{
ChristmasCardTesting.SantaA();
}
else if (decoration == 2)
{
ChristmasCardTesting.SantaB();
}
// else
// ChristmasCardTesting.SantaA();
}
public static void DoPromt()
{
}
public static void AddMessage()
{
}
public static void ClearMessage()
{
}
}
public class ChristmasCardTesting
{
public static void SantaA()
{
Console.WriteLine(@" ||::|:|| .--------, ");
Console.WriteLine(@" |:||:|:| |_______ / .-. ");
Console.WriteLine(@" ||::|:|| .'` ___ `'. \|('v')|/ ");
Console.WriteLine(@" \\\/\///: .'` `'. ;____`( )'____ ");
Console.WriteLine(@" \====/ './ o o \|~ ^' '^ // ");
Console.WriteLine(@" \\// | ())) . | Season's \ ");
Console.WriteLine(@" || \ `.__.' /| // ");
Console.WriteLine(@" || _{``-.___.-'\| Greetings \ ");
Console.WriteLine(@" || _.' `-.____.- '`| ___ // ");
Console.WriteLine(@" ||` __ \ |___/ \_______\ ");
Console.WriteLine(@" .' || (__) \ \| / ");
Console.WriteLine(@" / `\/ __ vvvvv'\___/ ");
Console.WriteLine(@" | | (__) | ");
Console.WriteLine(@" \___/\ / ");
Console.WriteLine(@" || | .___. | ");
Console.WriteLine(@" || | | | ");
Console.WriteLine(@" ||.-' | '-. ");
Console.WriteLine(@" || | ) ");
Console.WriteLine(@" || ----------'---------' ");
Console.ReadLine();
}
public static void SantaB()
{
Console.WriteLine(@" ");
Console.WriteLine(@" .------, ");
Console.WriteLine(@" .\/. |______| ");
Console.WriteLine(@" _\_}{_/_ _|_Ll___|_ ");
Console.WriteLine(@" / }{ \ [__________] .\/. ");
Console.WriteLine(@" '/\' / \ _\_\/_/_ ");
Console.WriteLine(@" () o o () / /\ \ ");
Console.WriteLine(@" \ ~~~ . / '/\' ");
Console.WriteLine(@" _\/ \ '...' / \/_ ");
Console.WriteLine(@" \\ {`------'} // ");
Console.WriteLine(@" \\ /`---/',`\\ // ");
Console.WriteLine(@" \/' o | |\ \`// ");
Console.WriteLine(@" /' | | \/ /\ ");
Console.WriteLine(@" __,. -- ~~ ~| o `\| |~ ~~ -- . __ ");
Console.WriteLine(@" | | ");
Console.WriteLine(@" \ o / ");
Console.WriteLine(@" `._ _.' ");
Console.WriteLine(@" ^~- . - ~^ ");
Console.WriteLine(@" ");
Console.ReadLine();
}
}
}
答案 0 :(得分:7)
Console.Read
会返回int
,但这不是数字键 - 它是char
值,或-1
表示EOF 。所以:问题不在于它返回零。问题是它返回密钥的ASCII值。你需要转换。例如:
int i = Console.Read();
if(i < 0) return 0;
char c = (char)i;
return (int)(c - '0');
答案 1 :(得分:3)
使用Console.Read
方法时应谨慎,因为它只读取标准输入流中的下一个键,但会阻塞,直到用户按下Enter
。然后,通过后续调用Console.Read
返回第一个之后的任何其他字符。
看看下面的例子:
Console.WriteLine("Enter 1 or 2: ");
int i = Console.Read(); // Here the user types: 12[Enter]
// The value of 'i' is now 49 (the ASCII value of 1)
// Later we do this:
Console.WriteLine("Enter 3 or 4:");
int j = Console.Read();
// The value of 'j' is now 50 (the ASCII value of 2), and the code keeps running!
// There is no pause to wait for user input, since there was already some in the cache
你应该做什么
有两种更常见的方式可以从用户那里获得输入:Console.ReadLine()
,它返回用户输入的整个字符串(按'Enter'后),或Console.ReadKey()
,返回{ {1}}他们按下的键的表示。
您可以将ConsoleKeyInfo
与您的代码完全一致地使用,这可能是最好的:
ReadLine
但是,如果您不希望他们必须按'Enter',您可以执行以下操作,通过调用{{1}上的double decoration = Convert.ToDouble(Console.ReadLine());
获取用户键入的下一个字符的字符串表示形式ToString()
对象的属性:
KeyChar
添加一些验证
但是如果用户输入的字符串无法转换为double,会发生什么?在这种情况下,ConsoleKeyInfo
将抛出异常。为避免这种情况,我们可以使用double decoration = Convert.ToDouble(Console.ReadKey().KeyChar.ToString());
,如果转换成功则返回Convert.ToDouble
并将double.TryParse
参数设置为转换后的值。现在我们可以这样做,检查输入是否有效:
true
但我们现在必须要求他们再次输入,对吗?如果它再次失败......好吧,我们需要一个循环:
out
现在它将继续循环,直到用户输入有效的双精度。
使代码可重复使用
好的,好的,现在我们有办法验证输入,但是每次我们需要从用户那里获得双倍时,我们是否真的想编写该循环代码?一个更好的想法可能是创建一个为我们做的方法,它接受一个字符串提示显示给用户,并返回正确的类型。我们甚至可以添加一些“边界”参数,以强制数字介于最小值和最大值之间:
double decoration;
if (!double.TryParse(Console.ReadLine(), out decoration))
{
Console.WriteLine("The value you entered is not a valid double.");
}
现在,使用此代码,我们需要做的就是:
double decoration;
while (!double.TryParse(Console.ReadLine(), out decoration))
{
Console.WriteLine("The value you entered is not a valid double.");
Console.Write("Please Choose decoration 1 or 2: ");
}