在一行上给出一串数字,用空格分隔

Posted

技术标签:

【中文标题】在一行上给出一串数字,用空格分隔【英文标题】:Give a string of numbers on a single line, separated by a space 【发布时间】:2022-01-21 01:16:21 【问题描述】:

编辑:现在它工作正常,对于需要代码的每个人,这里是正确的版本。

我试图解决这个问题,我认为我的代码 99% 好,但我仍然有一些错误,我不知道如何解决它。 第 20 行:Program.CheckIfSortedAscending(int[])':并非所有代码路径都返回值;

在一行中给出一串数字,用空格分隔。 接下来的 N 个操作将字符串的一个元素移动到第一个位置。每次移动都在输入要移动到第一个位置的元素的索引的行上指定。字符串的所有其他元素保持相同的顺序。

在所有移动操作都应用到第一个位置后,将修改后的字符串打印到控制台。如果字符串的元素按升序排列,则在下一行打印 True,否则打印 False。

例子:

对于输入数据:

1 2 3 4 5 6
2
1
5

控制台会显示:

6 2 1 3 4 5

错误

代码如下:

使用系统;

命名空间 MoveFirst 课堂节目 静态无效主要(字符串 [] 参数) int[] 值 = ReadValuesList(); int[] positionToMove = ReadPositions();

        for (int i = 0; i < positionsToMove.Length; i++)
            MoveFirst(values, positionsToMove[i]);

        PrintValuesList(values);
        Console.WriteLine(CheckIfSortedAscending(values));
        Console.Read();
    

    static bool CheckIfSortedAscending(int[] values)
    

        var result = true;
        for (int i = 0; i <= values.Length - 2; i++)
        
            if (values[i] > values[i + 1])
            
                result = false;
            
        
        return result;
    

    static void MoveFirst(int[] values, int index)
    

        if (index == 1)
        
            int aux = values[index - 1];
            values[0] = values[index];
            values[index] = aux;
        
        else
        
            int aux = values[index];
            for (int i = index; i > 0; i--)
            
                values[i] = values[i - 1];
            
            values[0] = aux;
        
    

    static int[] ReadPositions()
    
        int positionsNumber = Convert.ToInt32(Console.ReadLine());
        int[] positions = new int[positionsNumber];

        for (int i = 0; i < positionsNumber; i++)
            positions[i] = Convert.ToInt32(Console.ReadLine());

        return positions;
    

    static int[] ReadValuesList()
    
        string[] inputValues = Console.ReadLine().Split(' ');
        int[] values = new int[inputValues.Length];

        for (int i = 0; i < values.Length; i++)
            values[i] = Convert.ToInt32(inputValues[i]);

        return values;
    

    static void PrintValuesList(int[] valuesList)
    
        for (int i = 0; i < valuesList.Length; i++)
            Console.Write(valuesList[i] + " ");
        Console.Write('\n');
    

【问题讨论】:

你不需要break;。您收到此错误是因为不清楚如果根本不执行 for 循环将返回什么。如果 values.Length 为 1、2 或 0,则不会执行 for 循环。你需要在 for 循环之后有 return 语句来处理这种情况 如果您的循环根本不运行会怎样?这是编译器可以看到的。此外,包含 if/else 且双方都返回的循环作为循环有点毫无意义,因为它永远不会循环 不幸的是,编译的程序远未完成。没有语法错误是工作中比较容易的部分,让它做正确的事情是困难的部分。 @Chetan 即使我删除了break,我仍然会收到错误; @CaiusJard 好的,但我怎样才能写它来返回真或假?当我得到错误时,它应该停止。 【参考方案1】:

首先,您会收到一个编译错误,因为并非所有代码路径都返回一个值,正如它所说的那样。想象一下你的数组长度为 0,程序永远不会进入循环。这种情况会带来什么回报?您还应该在循环之外返回一些东西,但无论如何这不是您想要的。您的代码将仅检查前两个值,因为您已将其设置为在第一次比较后返回某些内容。你需要的是:

var result = true;
for (int i = 0; i <= values.Length-2; i++)

  if (values[i]>values[i+1])
  
    result = false;
  

return result;

这将检查整个数组,因为它在检查后返回一个值。我也改变了循环中的比较。想象一个有 10 个元素的数组。当 i=8 时,需要比较元素 9 和 10(values[8],values[9])。最后,这将适用于数组有 2 个元素的边缘情况,如果它有一个元素,它将返回 true。

编辑:您还可以执行以下操作,效率更高:

for (int i = 0; i <= values.Length-2; i++)

  if (values[i]>values[i+1])
  
    return false;
  

return true;

但因为我认为这是某种家庭作业,所以第一种方法可能更好。

【讨论】:

不客气。

以上是关于在一行上给出一串数字,用空格分隔的主要内容,如果未能解决你的问题,请参考以下文章

读取以逗号分隔的一串数字

将一串空格分隔的单词拆分为多行[重复]

C语言中输入一串以空格分隔的整型数据,怎么办?

C语言输入一行字符 统计其中有多少个单词,单词之间用空格分隔开

C语言输入一行字符 统计其中有多少个单词,单词之间用空格分隔开

把一串数字按照n用逗号分隔