当前位置: 首页 > 知识库问答 >
问题:

c++ - 请教一下c语言数组问题?是什么问题导致程序一会能行一会不行?

韦嘉颖
2023-09-10

需求:实现将数组中所有元素调整为左右两部分,左边为奇数,右边为偶数。(c语言)

int main(){int size;printf("enter the size of arr:");scanf("%d",&size);int arr[size];for(int i;i<size;i++){    scanf("%d",&arr[i]);}printf("that is old one:\n");for(int j=0;j<size;j++){    printf("%d",arr[j]);}printf("\n");printf("that is the new:\n");for(int i=0;i<size;i++){    if(arr[i]%2!=0){        printf("%d",arr[i]);    }for(int j=0;j<size;j++){    if(arr[j]%2==0){    printf("%d",arr[j]);        }}printf("\n");printf("03dengsimin");return 0;}

中这段代码:

for(int i=0;i<size;i++){    if(arr[i]%2!=0){        printf("%d",arr[i]);    }for(int j=0;j<size;j++){    if(arr[j]%2==0){    printf("%d",arr[j]);        }}

能不能换成一下这个?

for(int i=0;i<size;i++){    if(arr[i]%2!=0){        printf("%d",arr[i]);    }else{        printf("%d",arr[i]);}}

想问问为什么可换/为什么不能换?
谢谢指导,菜鸟万分感激。

共有3个答案

葛驰
2023-09-10

不可换, 语义不同
第一种是打印所有奇数, 然后打印所有偶数
第二种是如果是奇数, 打印, 偶数也打印.

鄢飞鸾
2023-09-10
  1. 这并不是排序,只能说是按照某种顺序进行打印输出。
  2. 不能,两者并不是等价的。前者在条件表达式为 false 时,什么都不会做,但在后者中,会导致另一种输出出现。

举几个测试例子:

// 两者表现一致[1, 3, 5, 2, 4, 6];// 两者表现不一致[1, 2, 3, 4, 5, 6];

可以看出来,除非数组本身已经达成了一种顺序(奇数在一端,偶数在一端),否则这种修改就会导致程序表现「不对劲」。

乐正峰
2023-09-10
能不能换成一下这个?

不能。原因是,这样确实能够区分出奇数和偶数,但是无法达到左边为奇数,右边为偶数的效果。

就目前而言,你的代码中存在两个问题:

  1. 你没有为i进行初始化。未初始化的i中的值是不确定的,因此接下来代码的行为是不确定的

    for (int i = 0; i < size; i++) {    scanf("%d", &arr[i]);  }
  2. 你的代码块错了。输出偶数的循环实际上包含在了输出奇数的循环中:

    for(int i=0;i<size;i++){    if(arr[i]%2!=0){        printf("%d",arr[i]);    }    // <-------------这里应当是循环的结束    for(int j=0;j<size;j++){        if(arr[j]%2==0){        printf("%d",arr[j]);        }} // <--------------将这个反花括号挪到上面注释的地方

这是修改后的代码:

#include <stdio.h>int main() {  int size;  printf("enter the size of arr:");  scanf("%d", &size);  int arr[size];  for (int i = 0; i < size; i++) {    scanf("%d", &arr[i]);  }  printf("that is old one:\n");  for (int j = 0; j < size; j++) {    printf("%d", arr[j]);  }  printf("\n");  printf("that is the new:\n");  for (int i = 0; i < size; i++) {    if (arr[i] % 2 != 0) {      printf("%d ", arr[i]);    }  }  printf("\n");  for (int j = 0; j < size; j++) {    if (arr[j] % 2 == 0) {      printf("%d ", arr[j]);    }  }  printf("\n");  printf("03dengsimin");  return 0;}

如果你不仅需要将数组中的元素按照左边奇数右边偶数的格式输出,还需要将他们按照这样的格式排序的话,你的代码并不能满足你的要求。你需要撰写别的代码。

最简单的方法是直接将满足要求的数字放到一个新的数组中:

int new_arr[size];int new_arr_index = 0;for (int index = 0; index < size; ++index) {  if (arr[index] % 2 == 1) {    new_arr[new_arr_index++] = arr[index];  }}for (int index = 0; index < size; ++index) {  if (arr[index] % 2 == 0) {    new_arr[new_arr_index++] = arr[index];  }}printf("that is new one:\n");for (int index = 0; index < size; ++index) {  printf("%d ", new_arr[index]);  }
 类似资料:
  • 想问一下一个C语言的位运算小问题. 有没有一个简单的表达式的写法,可以得到一个32位无符号数,只保留其最左侧或者最右侧的1的结果? 比如35=(000..0100011),得到32或者1? 用循环写的话不难,但,用一个简洁的表达式能写出来吗?

  • 问题内容: 我是ORMLite的主要作者,它使用类上的Java注释来构建数据库模式。我们的程序包最大的启动性能问题是在Android 1.6下调用注释方法。直到3.0我都看到了相同的行为。 我们看到以下简单的注释代码 难以置信地 占用大量GC,这是一个实际的性能问题。在快速的Android设备上,对注释方法的1000次调用几乎耗时一秒。Macbook Pro上运行的相同代码可以同时进行2800万次

  • 第一次运行flutter程序,这是什么问题? 修改FLUTTER_STORAGE_BASE_URL还是提示这

  • 问题内容: 我正在尝试在do while循环中发送多个帖子,但未添加结果 输出为:5、5、5、5、5, 我需要的输出是:1、2、3、4、5 问题答案: 由于AJAX的异步特性,当您的成功函数针对任何产生的AJAX请求运行时,循环已完成并将其设置为5。您需要捕获每个请求开始时的状态并使用捕获的状态方法中的状态。关闭值是最简单的方法: 但是,请理解,一个或多个请求可能会挂在服务器上,从而使后一个请求先

  • 我已经实现了极大极小算法(带有阿尔法-贝塔剪枝),但是它的行为方式很有趣。我的球员将创造一个巨大的领先优势,但当它是时候做出最后的,获胜的举动,它不采取这一举措,只是继续拖延游戏。 这是我的极小极大函数: } 起初,我认为问题出在我的评估功能上,但如果是,我找不到它。在这个游戏中,两个玩家都有一个分数,我的函数只是从分数差中计算启发式值。在这里: 我已经把我的代码“翻译”成了英语,所以可能会有错别