【问题标题】:Code showing wrong output显示错误输出的代码
【发布时间】:2013-02-18 14:48:54
【问题描述】:

我用c#开发了一个“插入排序”的程序,代码接受元素的最大值和元素的值,然后一一显示排序值的步骤。

代码:

    static void insertionSort(int[] ar)
    {
        for (int i = 1; i < ar.Length; i++)
        {
            int temp = ar[i];
            int j = i - 1;

            while (j >= 0 && ar[j] > temp)
            {
                ar[j + 1] = ar[j];

                foreach (int val in ar)
                    Console.Write(val + " ");
                Console.WriteLine();

                j--;
            }
        }


    }

    static void Main(String[] args)
    {

        int ar_size;
        ar_size = Convert.ToInt32(Console.ReadLine());
        int[] ar = new int[ar_size];
        for (int i = 0; i < ar_size; i++)
        {
            ar[i] = Convert.ToInt32(Console.Read());
        }

        insertionSort(ar);
        Console.ReadKey();
    }

我提供的示例输入:

5
2 4 6 8 3

输出结果:

谁能解释一下为什么会这样!

任何帮助将不胜感激! :)

【问题讨论】:

  • 除非我今天下午真的很蠢交换它们,您只需覆盖较低的值。
  • 如何实现? @Kobunite
  • 您的 while 循环正在“腾出空间”,但您从未将 temp 复制到其最终位置。
  • 提示:用int[] ar = { 4, 6, 1, 9, 7 };代替ReadLine()进行测试

标签: c# sorting insertion-sort


【解决方案1】:

除了排序本身的问题之外,结果中出现奇怪数字的原因是您使用 Console.Read 非常错误。它返回用户输入的字符的 ASCII 值。此外,它将返回所有输入字符的 ASCII 值,而不仅仅是数字。

因此,第一次调用 Console.Read() 将返回 50('2' 的 ASCII 值)。
第二次调用将返回 32(空格的 ASCII 值)。
第三次调用将返回 52('4' 的 ASCII 值)。
等等

要解决此问题,请像这样初始化 ar

var numbers = Console.ReadLine().Split(' ');
for (int i = 0; i < ar_size; i++)
    ar[i] = Convert.ToInt32(numbers[i]);

请注意,此代码缺少错误处理。以下情况会抛出异常:

  1. 用户输入了除空格和数字之外的任何内容
  2. 用户输入的数字少于他在第一行中指定的数字

【讨论】:

  • @AreebSiddiqui:我的答案包含修复此特定问题的代码。
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多