在一行上给出一串数字,用空格分隔
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语言输入一行字符 统计其中有多少个单词,单词之间用空格分隔开