我想每次用户尝试约会时都要填写该值。约会有两种类型:约会a和约会b。每次约会一天只能做4次。因此,我的维度将有两列用于约会类型,而四行则包含四个约会。我只是尝试如果用户只键入“ a”。 如果用户第一次键入“ a”,则我的2D数组将如下所示:
1111
1000
如果用户第二次键入“ a”,则2D数组将如下所示:
1111
1200
以此类推...因此,最终2D数组将如下所示:
1111
1234
int[,] slots = new int[4,2];
string appt_type;
string choice = "Y";
while (choice == "Y")
{
Console.WriteLine("Please enter a or b");
appt_type = Console.ReadLine();
if (appt_type == "a")
{
for (int i=0; i<slots.GetLength(0); i++)
{
for (int j=0; j<slots.GetLength(1); j++)
{
slots[i,0] = 1;
slots[i,j] = i+1;
}
}
int q = 0;
foreach (int i in slots)
{
if ((q%2) == 1)
Console.WriteLine(i + " ");
else
Console.Write(i + " ");
q++;
}
}
}
我的最终输出是我所期望的。但是,我希望每次用户输入“ a”时都填充第二列。
首先输入“ a”
1111 1000
第二次输入“ a”
1111 1200
第三次输入“ a”
1111 1230
第四次输入“ a”
1111 1234
答案 0 :(得分:0)
首先,您的for循环不是您想要的,因为在用户输入您已经在for循环内的for循环中初始化的“ a”或“ b”之前,该数组应该放在最后在for循环之后,数组为1111 1234。
您可以创建一个计数器变量,以计算每次获得输入时用户输入“ a”的次数。在这种情况下,数组的行与“用户已输入a”,因此即使只有再次输入“ a”它的值才会增加,我仍将计数器初始化为0。用户输入“ a”的数量为1,因为肯定是1在它进入forloop之后,这就是为什么您还可以将其设置为要更改的数组元素的原因。
此外,您可以使用while(true)而不是创建变量并将其保持不变。 几乎是这样的:(试图用您的方式打印它)
int[,] slots = new int[4, 2];
string appt_type;
int counter = 0;//counts how many times the user had enter the letter "a"
while (true)
{
Console.WriteLine("Please enter a or b");
appt_type = Console.ReadLine();
if (appt_type == "a")
{
counter++;
for (int i = 0; i < slots.GetLength(0); i++)
{
for (int j = 0; j < slots.GetLength(1); j++)
{
slots[i, 0] = 1;
slots[counter - 1,1 ] = counter;//note:all of the elements that you want to change are in column 1 of the array
}
}
int q = 1;//the position of i in the array
foreach (int i in slots)
{
if(q%2!=1)
Console.WriteLine(i+" " );
else
Console.Write(i);
q++;
}
答案 1 :(得分:0)
为了使您的代码允许用户输入他/她的选择并使代码根据该选择执行某项操作,您需要检查元素的值是否为0或其他,然后根据该值执行某项操作值。这是一个未经测试的快速修复程序,但是您可以获取要点:
for (int i=0; i<slots.GetLength(0); i++)
{
for (int j=0; j<slots.GetLength(1); j++)
{
if (slots[i,j] == 0)
{
slots[i,j] = i+1;
break;
}
}
}
我认为您的代码仍可以通过许多其他方式进行改进。这是我的建议:
break
可以轻松退出循环并消除花括号
使代码看起来更简洁。a != A
。这里是建议和经过测试的重构。在while(true)
上添加一个断点,使其在调试模式下运行,并查看代码在每个用户输入上的流向:
class Program
{
static void Main(string[] args)
{
var slots = new int[4, 2];
while (true)
{
Console.Write("Do you want to proceed? [Y/N]");
var choice = Console.ReadLine();
if (!choice.Equals("y", StringComparison.CurrentCultureIgnoreCase))
break;
Console.WriteLine("Please enter a or b: ");
var appt_type = Console.ReadLine();
if (appt_type.Equals("a", StringComparison.CurrentCultureIgnoreCase))
slots = AssignScheduleA(slots);
else if (appt_type.Equals("b", StringComparison.CurrentCultureIgnoreCase))
AssignScheduleB(slots);
DisplaySlotsValue(slots);
}
}
private static int[,] AssignScheduleA(int[,] slots)
{
if (slots[0,0] != 1)
{
for(int idx1 = 0; idx1 < slots.GetLength(0); idx1++)
slots[idx1, 0] = 1;
}
for(int idx2 = 0; idx2 < slots.GetLength(0); idx2++)
{
if (slots[idx2, 1] == 0)
{
slots[idx2, 1] = idx2 + 1;
break;
}
}
return slots;
}
private static void AssignScheduleB(int[,] slots)
{
throw new NotImplementedException();
}
private static void DisplaySlotsValue(int[,] slots)
{
for (int idx1 = 0; idx1 < slots.GetLength(0); idx1++)
Console.Write(slots[idx1, 0]);
Console.WriteLine();
for (int idx2 = 0; idx2 < slots.GetLength(0); idx2++)
Console.Write(slots[idx2, 1]);
Console.WriteLine();
}
}
如果在调试模式下进行此操作,您将了解代码如何使用户每次都能做出选择并根据选择填写数组。仍然可以改进此代码,并且可以在学习有关C#的知识时做一些事情。编码愉快!