学生成绩与硬币分配问题:C#代码输出异常求助
学生成绩硬币分配问题的代码修复方案
问题1:输出语句用法错误,导致仅显示姓名
你最后输出的代码行写法有误:
Console.WriteLine(studentNames[i], " ", numberCoins[i]);
C# 中Console.WriteLine的多参数版本需要通过格式化字符串指定参数位置,否则只会输出第一个参数。正确写法二选一:
- 字符串插值(C# 6及以上版本支持):
Console.WriteLine($"{studentNames[i]} {numberCoins[i]}");
- 占位符写法:
Console.WriteLine("{0} {1}", studentNames[i], numberCoins[i]);
问题2:硬币分配逻辑存在两处缺陷
缺陷1:未初始化所有硬币的初始值
你仅给numberCoins[0]赋值为1,但数组其他元素默认是0。根据需求,每个学生至少应获得1枚硬币,所以初始化时要给所有元素设为1:
var numberCoins = new int[n]; for (int i = 0; i < n; i++) { numberCoins[i] = 1; }
或者用LINQ简化(需添加using System.Linq;):
var numberCoins = Enumerable.Repeat(1, n).ToArray();
缺陷2:反向遍历的赋值逻辑错误
反向遍历检查左边成绩高于右边时,直接赋值numberCoins[i] = numberCoins[i+1] + 1会覆盖正向遍历得到的正确值。比如示例中的Dan,正向遍历后硬币数是2(比John高),反向遍历若直接赋值会变成2,而正确值需要同时满足比左右邻居多,因此要取当前值和numberCoins[i+1]+1的最大值:
for (int i = n - 2; i >= 0; i--) { if (grades[i] > grades[i + 1]) { numberCoins[i] = Math.Max(numberCoins[i], numberCoins[i + 1] + 1); } }
修复后的完整代码
using System; class Program { private static void Main(string[] args) { int n = Convert.ToInt32(Console.ReadLine()); var numberCoins = new int[n]; string[] studentNames = new string[n]; // 初始化所有学生至少1枚硬币 for (int i = 0; i < n; i++) { numberCoins[i] = 1; } for (int i = 0; i < n; i++) { studentNames[i] = Console.ReadLine(); } int[] grades = new int[n]; for (int i = 0; i < n; i++) { grades[i] = Convert.ToInt32(Console.ReadLine()); } // 正向遍历:处理右边比左边成绩高的情况 for (int i = 1; i < n; i++) { if (grades[i] > grades[i - 1]) { numberCoins[i] = numberCoins[i - 1] + 1; } } // 反向遍历:处理左边比右边成绩高的情况,取最大值确保符合要求 for (int i = n - 2; i >= 0; i--) { if (grades[i] > grades[i + 1]) { numberCoins[i] = Math.Max(numberCoins[i], numberCoins[i + 1] + 1); } } // 正确输出姓名和硬币数 for (int i = 0; i < n; i++) { Console.WriteLine($"{studentNames[i]} {numberCoins[i]}"); } Console.ReadLine(); } }
测试验证
输入:
3 John Dan Sam 9 10 8
输出:
John 1 Dan 3 Sam 1
内容的提问来源于stack exchange,提问作者Bogdan Dragoş
相关产品推荐
相关产品推荐

