【发布时间】: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 的初始问题,这就是所需要的。他们确实需要将问题分解为一个问题。