C语言编写函数交换数组a和数组b中的对应元素

任务描述

本关任务:编写函数交换数组 a 和数组 b 中的对应元素,要考虑到数组 a 和数组 b 中数组元素的个数不同。

相关知识

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,完成三个子函数的定义,交换数组 a 和数组 b 中的对应元素,具体要求如下:

函数 inputarr()实现数组的输入,当遇到数字-1时,结束输入;
函数 swaparr()实现数组元素的交换;
函数 outputarr()实现数组元素的输出。
测试说明

平台会对你编写的代码进行测试:

测试输入:
91 1 42 32 9 57 6 33 2 88 -1
41 13 25 32 29 74 68 30 5 48 57 6 33 62 81 -1

预期输出:
41 13 25 32 29 74 68 30 5 48 57 6 33 62 81
91 1 42 32 9 57 6 33 2 88

初始代码


#include<stdio.h>
#define N 20
void inputarr (int *p, int *n);
void outputarr (int *p,int n);
void swap(int *a, int *b);
void swaparr(int *a, int n, int *b,int m);
int main()
{
    int i,n=0,m=0;
    int a[N],b[N];
    //printf("请输入数组a,以-1结束:\n");
    inputarr(a,&n);    
    //printf("请输入数组b,以-1结束:\n");
      inputarr(b,&m);
    swaparr(a, n, b, m);
    //printf("数组a中所有元素:\n");
    outputarr (a,m); 
    //printf("数组b中所有元素:\n");
     outputarr (b,n); 
     return 0;

}

/********** Begin **********/

    
    
/********** End **********/


我的代码


#include <stdio.h>
#define M 3
#define N 4

void input(int (*a)[N], int m, int n);
void output(int (*b)[N], int m, int n);
void outputarr(int array[], int n);
void fun(int x[][N], int *y, int m, int n);

int main()
{
    int a[M][N];
    int b[M * N];

    input(a, M, N);
    fun(a, b, M, N);
    output(a, M, N);
    outputarr(b, M * N);

    return 0;
}

void input(int (*a)[N], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
}

void fun(int x[][N], int *y, int m, int n)
{
    for (int j = 0; j < n; j++)
    {
        for (int i = 0; i < m; i++)
        {
            y[j * m + i] = x[i][j];
        }
    }
}

void output(int (*b)[N], int m, int n)
{
    printf("二维数组:\n");
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }
}

void outputarr(int array[], int n)
{
    printf("一维数组:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", array[i]);
    }
    printf("\n");
}

错误,求解!


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

void inputarr(int *a, int *n);
void swaparr(int *a, int *n, int *b, int *m);
void outputarr(int *a, int n);

int main()
{
    int a[100], b[100], n = 0, m = 0;
    inputarr(a, &n);
    inputarr(b, &m);
    swaparr(a, &n, b, &m);
    outputarr(a, n);
    outputarr(b, m);
    return 0;
}

void inputarr(int *a, int *n)
{
    int num;
    int i = 0;
    scanf("%d", &num);
    while (num != -1)
    {
        a[i] = num;
        i++;
        scanf("%d", &num);
    }
    *n = i;
}

void swaparr(int *a, int *n, int *b, int *m)
{
    int min = (*n < *m) ? *n : *m;
    for (int i = 0; i < min; i++)
    {
        int temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
    
    if (*n < *m)
    {
        for (int i = min; i < *m; i++)
        {
            a[*n] = b[i];
            (b[i]=-1);
            (*n)++;
        }
        *m = *n;
    }
    else if (*n > *m)
    {
        for (int i = min; i < *n; i++)
        {
            b[*m] = a[i];
            a[i]=-1;
            (*m)++;
        }
        *n = *m;
    }
}

void outputarr(int *a, int n)
{
    for (int i = 0; i < n; i++)
    {
       if(a[i]!=-1) printf("%d ", a[i]);
        
    }
    printf("\n");
}

根据你提供的代码,可能出现的错误有:

  1. fun()函数中,获取b数组长度的方式不正确:
    c
for (len2 = 0; scanf("%d", &y[len2]) != -1; len2++); 

这段代码的问题在于,scanf()读取到-1结束循环前,b数组中会包含-1这个元素,影响数组长度的计算。
正确的方式应该是:
c

scanf("%d", &num);
while (num != -1) {
    y[len2++] = num; 
    scanf("%d", &num);
}

这样只有读取到-1时才结束循环,不会包含-1在数组中。
2. fun()函数中,数组交换的结束条件判断不正确:
c

int min = len1 < len2 ? len1 : len2; 
for (int i = 0; i < min; i++) {
    // ...
}

这里的min表示a和b数组的最小长度,但是数组下标是从0开始的,所以交换应该继续到min-1。
正确的写法是:
c

int min = len1 < len2 ? len1 : len2;
for (int i = 0; i < min - 1; i++) {
    // ...
}

  1. input()和fun()函数的参数(*(a)[N])形式不正确,应该是**a。
    正确的函数定义应为:
    c
void input(int **a, int m, int n);  
void fun(int **x, int *y, int m, int n);  

传入二维数组的参数应使用双指针**a,而不是(*a)[N]这种形式。
除此之外,代码的逻辑和结构没有其他重大问题
完整代码

#include <stdio.h>
#define M 3  
#define N 4

void input(int **a, int m, int n);
void output(int **b, int m, int n);
void outputarr(int *array, int n); 
void fun(int **x, int *y, int m, int n);   

int main()   
{
    int a[M][N];
    int b[M * N];

    input(a, M, N);
    fun(a, b, M, N);
    output(a, M, N); 
    outputarr(b, M * N);

    return 0;
}

void input(int **a, int m, int n)   
{ 
    int num;
    for (int i = 0; i < m; i++) {   
        for (int j = 0; j < n; j++) {
            scanf("%d", &num);
            if (num == -1) return;
            a[i][j] = num;
        }
    }
}  

void fun(int **x, int *y, int m, int n)   
{
    int len1 = m * n;       
    int len2 = 0;              
    int num;
    scanf("%d", &num);
    while (num != -1) {
        y[len2++] = num;  
        scanf("%d", &num);
    }
    
    int min = len1 < len2 ? len1 : len2;
    for (int i = 0; i < min - 1; i++) {
        int temp = x[i / n][i % n];
        x[i / n][i % n] = y[i];
        y[i] = temp;
    }
}    

void output(int **b, int m, int n)
{
   printf("二维数组:\n"); 
   for (int i = 0; i < m; i++) {
       for (int j = 0; j < n; j++) {
           printf("%d ", b[i][j]); 
       }
       printf("\n");
   }
}

void outputarr(int *array, int n)  
{
   printf("一维数组:\n");
   for (int i = 0; i < n; i++) {
      printf("%d ", array[i]); 
   }
   printf("\n");
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:
    ### 解决方案
    
    首先,我们需要确定交换数组元素的方法。我们可以通过循环遍历数组,对于每个位置,将a和b中对应位置的元素交换即可。
    
    代码如下:
    
    ```c
    void swaparr(int a[], int b[], int n, int m) {
        int i, min_len;
        if (n > m) {
            min_len = m;
        } else {
            min_len = n;
        }
        for (i = 0; i < min_len; i++) {
            int tmp = a[i];
            a[i] = b[i];
            b[i] = tmp;
        }
    }
    

    以上代码首先比较a和b数组的长度,找到较短的那个,然后循环遍历数组,并将对应位置的元素交换。

    接下来是完整的代码实现:

    #include <stdio.h>
    
    void inputarr(int a[], int n) {
        int i;
        for (i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
    }
    
    void outputarr(int a[], int n) {
        int i;
        for (i = 0; i < n; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    
    void swaparr(int a[], int b[], int n, int m) {
        int i, min_len;
        if (n > m) {
            min_len = m;
        } else {
            min_len = n;
        }
        for (i = 0; i < min_len; i++) {
            int tmp = a[i];
            a[i] = b[i];
            b[i] = tmp;
        }
    }
    
    int main() {
        int a[100], b[100], n, m;
        scanf("%d", &n);
        inputarr(a, n);
        scanf("%d", &m);
        inputarr(b, m);
        printf("a:");
        outputarr(a, n);
        printf("b:");
        outputarr(b, m);
        swaparr(a, b, n, m);
        printf("After swap:\n");
        printf("a:");
        outputarr(a, n);
        printf("b:");
        outputarr(b, m);
        return 0;
    }
    

    输入样例:

    4
    1 2 3 4
    3
    5 6 7
    

    输出样例:

    a:1 2 3 4 
    b:5 6 7 
    After swap:
    a:5 6 7 4 
    b:1 2 3
    

    注意事项

    在编写函数swaparr()时,需要注意数组a和b的长度可能不同,因此要比较数组的长度,找到较短的那个,并以短的那个数组长度为循环遍历的次数。 ```


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^