【问题标题】:Can't seem to understand why this array won't reverse in C似乎无法理解为什么这个数组不会在 C 中反转
【发布时间】:2020-09-22 22:29:05
【问题描述】:

我无法理解为什么我的 reverseArray 函数不能正确交换索引处的值。

我想要的是最后一个值一直与第一个值交换,直到 i 弃用为 0。我相信 [(SIZE - i) - 1] 有问题但我似乎无法理解为什么。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MIN 0
#define MAX 100
#define SIZE 40

void fillArray(int arr[]);
int findWithRange(int arr[], int low, int high);
int findMaxInArray(int arr[], size_t arr_size);
void printArray(int arr[], size_t arr_size);
void reverseArray(int arr[]);


int main(void){

  srand((unsigned)time(NULL));
  int arr[SIZE], low, high;
  
  fillArray(arr);
  printArray(arr, SIZE);
  puts("\n");
  puts("\n");
  reverseArray(arr);
  printArray(arr, SIZE);
  puts("\n");
}

void fillArray(int arr[]){
  for (int i = 0; i < SIZE; i++){
    arr[i] = rand() % (MAX + 1) + MIN;
  }
}

void reverseArray(int arr[]){
  int temp;
  for (int i = SIZE - 1; i > 0; i--){
    temp = arr[i];
    arr[i] = arr[(SIZE - i) - 1];
    arr[(SIZE - i) - 1] = temp;
  }
}

输出(底部是“反转”数组):

预期输出(类似):

【问题讨论】:

  • 您不应该交换数组的所有元素,而应该只交换其中的一半。否则,您会将它们放回原来的位置(首先将最后一个与第一个交换,然后将“第一个”与“最后一个”交换回)。

标签: arrays c loops


【解决方案1】:

我得到的第一个线索是你得到的输出,你会注意到只有第一个和最后一个数字被交换了,而不是中间的数字。在反向函数的 for 循环中,您走得太远了。您需要做的是运行一半的 for 循环,因为中间是您开始将数字交换回其原始位置的地方。所以:

void reverseArray(int arr[]){
  int temp;
  for (int i = SIZE - 1; i > SIZE/2; i--){ // Changed code here
    temp = arr[i];
    arr[i] = arr[(SIZE - i) - 1];
    arr[(SIZE - i) - 1] = temp;
  }
}

【讨论】:

  • 谢谢,是的,我确实注意到它在中途停止交换,只是不知道该怎么办。
  • 请考虑指出没有必要向后遍历数组,并且仅交换第一个和最后一个元素的原因在于 OP 的条件i &gt; 0
  • 向前或向后都无所谓,原因不是i &gt; 0 原因是i &gt;=0 会交换所有内容
猜你喜欢
  • 2018-06-25
  • 1970-01-01
  • 2017-04-24
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 2022-12-12
  • 2018-06-29
相关资源
最近更新 更多