C 如何将两个二维数组中的整数添加到用户指定长度的新二维数组中?
我是一个新手,今年是我第一次学习c。我遇到了一个关于2D数组之类的问题。问题是:编写一个程序,求两个二维矩阵的和 我可以很容易地做到这一点,但我遇到了一个问题。例如,我将为第一组数组指定3x3的长度 如果我的第一个二维阵列和第二个阵列具有:C 如何将两个二维数组中的整数添加到用户指定长度的新二维数组中?,c,arrays,function,loops,C,Arrays,Function,Loops,我是一个新手,今年是我第一次学习c。我遇到了一个关于2D数组之类的问题。问题是:编写一个程序,求两个二维矩阵的和 我可以很容易地做到这一点,但我遇到了一个问题。例如,我将为第一组数组指定3x3的长度 如果我的第一个二维阵列和第二个阵列具有: {1,2,3;4,5,6;7,8,9}(第一个数组) {0,0,0;0,0,0;0,0,0}(第二数组) 我还得到了一个用户提供的行数和列数。(用户输入3x2)然后它应该显示为 {1,2;3,4;5,6}(输出) 但是我越来越 {1,2;3,5;6
- {1,2,3;4,5,6;7,8,9}(第一个数组)
- {0,0,0;0,0,0;0,0,0}(第二数组)
- {1,2;3,4;5,6}(输出)
- {1,2;3,5;6,8}
- 用户输入2x4输出应为{1,2,3,4;5,6,7,8}
#include <stdio.h>
#include <stdlib.h>
#define MAXROW 3
#define MAXCOL 3
int main() {
int ray1[MAXROW][MAXCOL], ray2[MAXROW][MAXCOL];
int r, c;
printf("Enter the number of ROWS: ");
scanf("%d", &r);
printf("Enter the number of COLUMNS: ");
scanf("%d", &c);
int sumRay[r][c];
printf("\n");
printf("Input integers for Array %d.\n", 1);
arrayIN(ray1);
printRay(ray1);
printf("Input integers for Array %d.\n", 2);
arrayIN(ray2);
printRay(ray2);
arraySUM(ray1, ray2, r, c, sumRay);
printSumRay(r, c, sumRay);
//printRay(sumRay);
}
void arrayIN(int ray[MAXROW][MAXCOL]) {
int r, c;
for (r = 0; r < MAXROW; r++) {
for (c = 0; c < MAXCOL; c++) {
printf("Enter Number for [ROW:%d COL:%d]: ", r, c);
scanf("%d", &ray[r][c]);
}
}
}
void arraySUM(int ray1[MAXROW][MAXCOL], int ray2[MAXROW][MAXCOL],
int r, int c, int sumRay[r][c]) {
int i, j;
int x, y;
i = j = 0;
int sum;
for (x = 0; x <= r; x++, i++) {
if (i < MAXROW) {
for (y = 0; y <= c; y++, j++) {
if (j < MAXCOL) {
sum = ray1[i][j] + ray2[i][j];
sumRay[x][y]= sum;
} else {
j = 0;
}
}
} else {
i = 0;
}
}
printf("\n");
}
void printSumRay(int r, int c, int sumRay[r][c]) {
int i, j;
for (i = 0; i < r; i++) {
printf("\n");
for (j = 0; j < c; j++) {
printf("%d\t", sumRay[i][j]);
}
}
}
void printRay(int ray[MAXROW][MAXCOL]) {
int i, j;
for (i = 0; i < 3; i++) {
printf("\n");
for (j = 0; j < 3; j++) {
printf("%d\t", ray[i][j]);
}
}
printf("\n");
}
#包括
#包括
#定义MAXROW 3
#定义MAXCOL 3
int main(){
int ray1[MAXROW][MAXCOL],ray2[MAXROW][MAXCOL];
int r,c;
printf(“输入行数:”);
scanf(“%d”、&r);
printf(“输入列数:”);
scanf(“%d”、&c);
int sumRay[r][c];
printf(“\n”);
printf(“数组%d的输入整数。\n”,1);
arrayIN(ray1);
printRay(ray1);
printf(“数组%d的输入整数。\n”,2);
arrayIN(ray2);
printRay(ray2);
arraySUM(ray1,ray2,r,c,sumRay);
printSumRay(r,c,sumRay);
//printRay(sumRay);
}
void arrayIN(int-ray[MAXROW][MAXCOL]){
int r,c;
对于(r=0;r 对于(x=0;x首先,您需要将函数原型放在main()
之前,或者至少将函数定义移到main()
之前。我一点也不清楚为什么要将VLA用于sumRay[]
,而将恒定尺寸的数组用于ray1[]
和ray2[][]
。除非您有令人信服的理由这样做,否则最好全面使用VLA
对于包含数组索引的变量,应该使用size\t
类型。然后必须修改处理size\t
变量的scanf()
和printf()
语句,以使用%zu
转换说明符
arraySum()
函数迭代两对重复的数组索引,原因不明。此处的逻辑错综复杂。您报告的虚假输出可追溯到此函数;很难读取和理解,这应该是需要重写的迹象。如果您打算添加nput阵列只是部分,名称并不反映这一意图。我简化了此功能,收紧了逻辑并消除了重复。有关部分阵列添加的版本,请参阅下面的更新
printSumRay()
函数似乎是多余的,因为printRay()
函数可以做同样的工作,所以我删除了它,重写了printRay()
使用VLA并收紧代码。原始代码在这里循环的控制表达式中使用了幻数3
,而不是利用MAXROW
和MAXCOL
。但是,即使不使用VLA,也最好将维度传递给任何将使用a的函数雷
以下是原始代码的修改版本:
#include <stdio.h>
#include <stdlib.h>
void arrayIN(size_t r, size_t c, int ray[r][c]);
void arraySUM(size_t r, size_t c, int ray1[r][c], int ray2[r][c], int sumRay[r][c]);
void printRay(size_t r, size_t c, int ray[r][c]);
int main(void)
{
size_t r,c;
printf("Enter the number of ROWS: ");
scanf("%zu", &r);
printf("Enter the number of COLUMNS: ");
scanf("%zu", &c);
int ray1[r][c], ray2[r][c], sumRay[r][c];
printf("\n");
printf("Input integers for Array %d.\n", 1);
arrayIN(r, c, ray1);
putchar('\n');
printRay(r, c, ray1);
putchar('\n');
printf("Input integers for Array %d.\n", 2);
arrayIN(r, c, ray2);
putchar('\n');
printRay(r, c, ray2);
putchar('\n');
arraySUM(r, c, ray1, ray2, sumRay);
printRay(r, c, sumRay);
putchar('\n');
return 0;
}
void arrayIN(size_t r, size_t c, int ray[r][c])
{
for(size_t i = 0; i < r; i++) {
for(size_t j = 0; j < c; j++) {
printf("Enter Number for [ROW:%zu COL:%zu]: ", i, j);
scanf("%d", &ray[i][j]);
}
}
}
void arraySUM(size_t r, size_t c, int ray1[r][c],int ray2[r][c], int sumRay[r][c])
{
for(size_t i = 0; i < r; i++) {
for(size_t j = 0; j < c; j++) {
sumRay[i][j] = ray1[i][j] + ray2[i][j];
}
}
}
void printRay(size_t r, size_t c, int ray[r][c])
{
for(size_t i = 0; i < r; i++) {
for(size_t j = 0; j < c; j++) {
printf("%8d",ray[i][j]);
}
putchar('\n');
}
}
样本交互:
Enter the number of ROWS: 2
Enter the number of COLUMNS: 2
Input integers for Array 1.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 2
Enter Number for [ROW:0 COL:2]: 3
Enter Number for [ROW:1 COL:0]: 4
Enter Number for [ROW:1 COL:1]: 5
Enter Number for [ROW:1 COL:2]: 6
Enter Number for [ROW:2 COL:0]: 7
Enter Number for [ROW:2 COL:1]: 8
Enter Number for [ROW:2 COL:2]: 9
1 2 3
4 5 6
7 8 9
Input integers for Array 2.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 1
Enter Number for [ROW:0 COL:2]: 1
Enter Number for [ROW:1 COL:0]: 1
Enter Number for [ROW:1 COL:1]: 1
Enter Number for [ROW:1 COL:2]: 1
Enter Number for [ROW:2 COL:0]: 1
Enter Number for [ROW:2 COL:1]: 1
Enter Number for [ROW:2 COL:2]: 1
1 1 1
1 1 1
1 1 1
2 3
5 6
只需要一个小改动。在arraySUM()中,在else部分中,您已重新初始化
i=0,j=0
但在重新初始化之后,它们会递增。因此,它将变为1,因此在执行时,它将读取光线[1],而不是光线[0]
只需将它们重新初始化为-1
i=-1和j=-1
嗯,我希望@CristianG--我已经用一个新函数对我的答案进行了更新,该函数只合并了输入数组的初始行和列。+1嗨,看起来我误解了这个问题,用户指定的维度适用于所有数组,这是你的第一个答案。无论如何,谢谢你的帮助!仍然在学习C的一些怪癖所以请原谅我,哈哈,再次谢谢你!
Enter the number of ROWS: 2
Enter the number of COLUMNS: 2
Input integers for Array 1.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 2
Enter Number for [ROW:0 COL:2]: 3
Enter Number for [ROW:1 COL:0]: 4
Enter Number for [ROW:1 COL:1]: 5
Enter Number for [ROW:1 COL:2]: 6
Enter Number for [ROW:2 COL:0]: 7
Enter Number for [ROW:2 COL:1]: 8
Enter Number for [ROW:2 COL:2]: 9
1 2 3
4 5 6
7 8 9
Input integers for Array 2.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 1
Enter Number for [ROW:0 COL:2]: 1
Enter Number for [ROW:1 COL:0]: 1
Enter Number for [ROW:1 COL:1]: 1
Enter Number for [ROW:1 COL:2]: 1
Enter Number for [ROW:2 COL:0]: 1
Enter Number for [ROW:2 COL:1]: 1
Enter Number for [ROW:2 COL:2]: 1
1 1 1
1 1 1
1 1 1
2 3
5 6