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

需求:实现将数组中所有元素调整为左右两部分,左边为奇数,右边为偶数。(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]);
}
}

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

阅读 2.6k
3 个回答
  1. 这并不是排序,只能说是按照某种顺序进行打印输出。
  2. 不能,两者并不是等价的。前者在条件表达式为 false 时,什么都不会做,但在后者中,会导致另一种输出出现。

举几个测试例子:

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

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

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

能不能换成一下这个?

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

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

  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]);
  }

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏