任务描述
本关任务:编写函数交换数组 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");
}
根据你提供的代码,可能出现的错误有:
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++) {
// ...
}
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");
}
不知道你这个问题是否已经解决, 如果还没有解决的话:### 解决方案
首先,我们需要确定交换数组元素的方法。我们可以通过循环遍历数组,对于每个位置,将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的长度可能不同,因此要比较数组的长度,找到较短的那个,并以短的那个数组长度为循环遍历的次数。 ```