【问题标题】:stack sum elements (Beginer C#) [duplicate]堆栈和元素(初学者C#)[重复]
【发布时间】:2021-01-06 12:06:21
【问题描述】:

我目前正在学习 C# 语言。我有以下任务:

编写程序:

读取整数的输入并将它们添加到堆栈中

  • 读取命令直到收到“end”

  • 打印堆栈中剩余元素的总和

输入

  • 在第一行,您将收到一个整数数组
  • 在接下来的几行中, 在给出“结束”命令之前,您将收到命令 - 单个命令和命令后的一或两个数字,具体取决于您收到的命令
  • 如果命令是“添加”,您将始终在需要添加到堆栈的命令之后收到正好两个数字
  • 如果命令是“删除”, 您将始终在命令之后收到一个数字,该数字代表您需要从堆栈中删除的数字的计数。如果没有足够的元素跳过该命令。 输出
  • 收到“end”命令后,需要打印栈中剩余元素的总和

输入

1 2 3 4

添加 5 6

删除 3

结束

输出

总和:6

输入:

3 5 8 4 1 9

加 19 32

删除 10

加 89 22

删除 4

删除 3

结束

输出:

总和:16

我写了这段代码。从一开始它就可以工作,我输入了一些数字并将它们放入堆栈中,没有任何问题。从现在开始,输入我想做的“添加”、“删除”或“结束”后,添加数字后出现错误。在我决定添加一个元素后,程序允许我无限期地输入数字,直到我尝试使用其他两个选项之一更改数字的加法,我收到此错误:System.FormatException:'输入字符串格式不正确。 '

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace Stack_Sum
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Stack<int> numbers = new Stack<int>();
            string input = Console.ReadLine();
            string[] number = Regex.Split(input, @"\D+");
            foreach (string value in number)
            {
                if (!string.IsNullOrEmpty(value))
                {
                    int i = int.Parse(value);
                    numbers.Push(i);
                }
            }

            string option = Console.ReadLine();

            while (true)
            {
                switch (option.ToLower())
                {
                case "add":
                        int addToStack = Int32.Parse(Console.ReadLine());
                        for (int i = 0; i < 2; i++)
                        {
                            numbers.Push(addToStack);
                        }
                        continue;
                case "remove":
                        int popItem = Convert.ToInt32(Console.ReadLine());
                        for (int i = 0; i < popItem; i++)
                        {
                            numbers.Pop();
                        }
                            continue;
                case "end":
                        foreach (var Stack_Sum in numbers)
                        {
                            int sum = 0;
                            sum += Stack_Sum;
                        }
                        break;
                }              
            }
        }
    }
}

【问题讨论】:

  • "...添加数字后出现错误。" - 请提供有关错误的信息。另外,我强烈建议您查看stackoverflow.com/help/how-to-ask 谢谢!
  • 在我决定添加一个元素后,程序允许我无限期地输入数字,直到我尝试使用其他两个选项之一更改数字的添加,我收到此错误:System.FormatException: 'Input字符串格式不正确。'
  • 首先,您的代码需要与命令分开的行中的数字。其次,您在添加后读取一个整数,然后将相同的整数添加到堆栈中两次,而不是添加两个不同的数字。此外,您没有检查删除是否删除了比堆栈中更多的数字,如果是这种情况,您应该跳过。
  • 为了将来参考,不要做代码转储。写一个minimal reproducible example 可靠地重现您所询问的一个问题。您可以通过使用不同的方法来解析字符串(即TryParse(),这将允许您以您认为合适的方式对错误输入做出反应)或首先不输入错误输入来解决您看到的错误。毫无疑问,您将遇到此代码的其他问题。这是您学习在 Visual Studio(或您正在使用的任何 IDE)中使用内置调试器的绝佳机会。只发布符合 SO 标准的问题。
  • @CoolBots:他们完全有可能不理解,你是对的。但这并没有改变他们在代码中唯一的抱怨是抛出异常的事实。这意味着需要回答的第一件事是该异常意味着什么以及如何处理它。而且 Stack Overflow 不适合解构充满错误的整个程序,帮助逐点修复它。如果我们希望超越 OP 的初始问题,这就是所需要的。他们确实需要将问题分解为一个问题。

标签: c# stack


【解决方案1】:

您只要求在while(true) 循环之前选择选项一次

string option = Console.ReadLine();

之后,您将所有用户输入视为整数,因此用户(您)没有机会更改选项。一个简单的解决方法是将该行放在循环中,最好再添加一些说明:

//... Your code... 

while(true)
{
   Console.Write("Add, Remove, End: “);
   string option = Console.ReadLine();
  
   switch(option.ToLower())
   {
      //... Your code... 
   } 
}

现在,我不相信您的程序的其余部分可以正常工作,但那是另一回事了。一旦克服了这个障碍,您就可以使用断点对其进行调试。

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2011-04-13
    • 2011-09-25
    • 2015-02-11
    相关资源
    最近更新 更多