在嵌套在 IF/ELSE
循环中的 for
语句中,我找不到我的错误所在。我确实尝试使用 while
循环来使我的 IF/ELSE
语句起作用,但它没有按预期工作。
即使是我的 Console.Writeline
声明也无法捕捉到正确的价格和尺寸。
我的代码:
static void Main(string[] args)
{
string[] size = { "S", "M", "L", "X"};
decimal[] price = { 6.99M, 8.99M, 12.50M, 15.00M};
Console.WriteLine("Please enter a pizza size : ");
string pizzaSize = Console.ReadLine();
int i;
for (i = 0; i < size.Length; i++)
{
if (size[i] == pizzaSize)
{
Console.WriteLine("Your pizza size is " + pizzaSize + ". The price is " + price[i].ToString("C"));
} else
{
Console.WriteLine("Please enter a valid pizza size");
return;
}
}
Console.ReadKey();
}
答案 0 :(得分:11)
如果 pizzaSize
的值为 "L"
,则在 for
循环中,第一个检查将是 if ("L" == "M")
,即 false
然后 {{1} } 分支在第一次迭代中执行,else
子句中的 return;
导致函数立即返回。所以如果要检查 else
值是否有效,可以使用以下解决方案:
pizzaSize
答案 1 :(得分:2)
else 块会在每次测试条件为假时执行,这至少会执行 3 次,即使条件为真,也就是如果您没有 return
语句,则不会允许循环继续,一旦代码命中 else
,它将立即返回并退出程序。
给定的答案已经解决了这些问题,我要更改的是比较,您希望代码能够识别输入的大小写,使用 Equals
将是一种更可靠的方法:
static void Main(string[] args)
{
string[] size = { "S", "M", "L", "X" };
decimal[] price = { 6.99M, 8.99M, 12.50M, 15.00M };
Console.Write("Please enter a pizza size : ");
string pizzaSize;
var exists = false;
while (!exists && (pizzaSize = Console.ReadLine()) != null)
{
for (int i = 0; i < size.Length; i++)
{
if (size[i].Equals(pizzaSize, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("Your pizza size is " + size[i] + ". The price is " + price[i].ToString("C"));
exists = true;
break;
}
}
if (!exists)
{
Console.Write("Please enter a valid pizza size: ");
}
}
Console.ReadKey();
}
还有一些细微的调整,使您的 I/O 更加用户友好。
答案 2 :(得分:1)
看来,您在第一个不匹配时返回 else 分支,因此离开了整个函数。
有几种方法可以修复您的代码。在不涉及太多代码的情况下,您可以在 if 分支中的 WriteLine 之后引入 break 语句以离开循环(您已经完成,无需检查其他大小)并在 else 中添加额外的 if 语句-分支,包装其内容,以检查当前循环迭代是否是最后一次。如果是最后一次迭代,仍然不匹配,则只能是无效大小。
但实际上,最好使用简单的 switch-case 而不是手动迭代。