创建一个do while循环,该循环可以在给出特定用户输入时结束

时间:2019-03-28 16:13:47

标签: c# arrays

我正在尝试创建一个可以为人们收据的程序。控制台将询问商品名称,价格和数量;之后,它应该打印出数组(希望格式化)。但是这里的问题是我一直坚持试图弄清楚如何自然地破坏数组。因为我应该在用户输入0时结束循环,但是我找不到将其放入布尔语句的方法。

我已经检查了Microsoft文档,但无法找到针对此特定问题的解决方案。我也在这里检查,但无济于事。

public class InitArray
{
    // create and output rectangular and jagged arrays
    public static void Main(string[] args)
    {

        string[,] items = new string[100, 4];
        do
        {

            for (int row = 0; row < items.GetLength(0); row++)
            {
                // loop through columns of current row
                double price = 0;
                double subtotal = 0;
                Console.WriteLine("Item Name(enter 0 to stop): ");
                items[row, 0] = Convert.ToString(Console.ReadLine());
                Console.WriteLine("Item Price(enter 0 to stop): ");
                items[row, 1] = Convert.ToString(Console.ReadLine());
                Console.WriteLine("Quantity(enter 0 to stop): ");
                items[row, 2] = Convert.ToString(Console.ReadLine());
                items[row, 3] = Convert.ToString(price + subtotal);
            }
            Console.WriteLine(); // start new line of output

        }
        while ();
    } // end method OutputArray
} // end class InitArray

3 个答案:

答案 0 :(得分:1)

您已经有了for语句的循环。您不需要额外的循环。当用户输入“ 0”时,使用break打破循环。

public static void Main(string[] args)
{

    string[,] items = new string[100, 4];

    for (int row = 0; row < items.GetLength(0); row++)
    {
        // loop through columns of current row
        string input;

        Console.WriteLine("Item Name(enter 0 to stop): ");
        input = Console.ReadLine();
        if (input == "0") break;
        items[row, 0] = input;

        Console.WriteLine("Item Price(enter 0 to stop): ");
        input = Console.ReadLine();
        if (input == "0") break;
        items[row, 1] = input;

        Console.WriteLine("Quantity(enter 0 to stop): ");
        input = Console.ReadLine();
        if (input == "0") break;
        items[row, 2] = input;


        // ...
    }
}

答案 1 :(得分:1)

您应该使用更方便的方式来存储您的信息。最好使用List<Product>而不是二维数组。使用特定类的列表将使您不必担心数组的维数,但也将使您的所有数据都具有正确的数据类型而不是一堆字符串。

只要您的用户请求停止输入,就可以通过返回布尔值的泛型函数来解决您每次从用户那里获得“ 0”时就停止输入的问题。

因此,首先定义一个Product类

public class Product
{
    public string Name {get;set;}
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    ... other field if you need them...
}

现在编写一个布尔函数,该信号通知调用代码意图停止输入

public bool getInput(string message, out string result)
{
    Console.WriteLine(message);
    result = Console.ReadLine();
    return (!result.Equals("0"))
}

在上面的函数中,我们在out变量中返回用户的输入,如果用户要求停止输入,则返回false。

现在将所有内容放在一起,我们就可以编写

List<Product> products = new List<Product>();

bool ok = true;
while(ok)
{
    string input;
    Product p = new Product();
    ok = getInput("Item Name(enter 0 to stop): ", out input);
    if (ok) p.Name = input;
    if (ok) ok = getInput("Item Price(enter 0 to stop): ", out input);
    if (ok) p.Price = Convert.ToDecimal(input);
    if (ok) ok = getInput("Quantity(enter 0 to stop): ", out input);
    if (ok) { p.Quantity = Convert.ToInt32(input); products.Add(p);}
}
decimal totalPrice = products.Sum(p => p.Price);
Console.WriteLine(totalPrice);

答案 2 :(得分:1)

根据@Steve的回答,您还可以使用逻辑AND。

List<Product> products = new List<Product>();

while (getInput("Item Name(enter 0 to stop): ", out var name)
        && getInput("Item Price(enter 0 to stop): ", out var price)
        && getInput("Quantity(enter 0 to stop): ", out var quantity))
{
    products.Add(new Product
    {
        Name = name,
        Price = Convert.ToDecimal(price),
        Quantity = Convert.ToInt32(quantity)
    });
}
decimal totalPrice = products.Sum(p => p.Price);
Console.WriteLine(totalPrice);