程序应创建一个2D表8 * 8,其中包含随机number<3
它应该打印那张桌子
另一项任务是将此表翻译成另一个表
例如
120个
210个
111
中心的数字应更改为其周围所有数字的总和1 + 2 + 0 + 2 + 0 + 1 + 1 + 1 = 8
应该为一切做好;
那么程序应该打印出来
如果有任何大于9的数字,它应转换为十六进制.....
我还没有做十六进制。但它仍然没有用......
#include <stdio.h>
#include <stdlib.h>
#define cols 8
#define rows 8
void printA(int A[][cols]);
void printC(char C[][cols]);
void SumThemUp(int A[][cols], char C[][cols]);
int main()
{
srand(time(NULL));
int A[rows][cols];
char C[rows][cols];
int i, j;
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
A[i][j]=rand()%3;
printA(A);
SumThemUp(A,C);
printC(C);
return 0;
}
void printA(int A[][cols])
{ int i, j;
for(i=0;i<rows;i++)
{for(j=0;j<cols; j++)
{printf("%d ", A[i][j]);}
printf("\n");}
return ;
}
void printC(char C[][cols])
{
int i, j;
for(i=0;i<rows;i++)
{for(j=0;j<cols; j++)
{printf("%ch ", C[i][j]);}
printf("\n");}
return ;
}
void SumThemUp(int A[][cols], char C[][cols])
{
int i,j;
for(i=0;i<rows;i++)
{for(j=0;j<cols; j++)
C[i][j]=0;}
for(i=0;i<rows;i++)
{for(j=0;j<cols; j++)
A[i][j]=C[i++][j];
}
for(j=0;j<cols; j++)
{for(i=0;i<rows;i++)
C[i][j]+=A[i][j++];
}return;
}
答案 0 :(得分:0)
所以 - 我不完全确定我知道你想要的输出是什么 - 但是你有什么问题:
0:对于你的数组,名称应描述数组实际拥有的内容,A和C非常模糊。
1:使用{}进行范围界定,并将{}放在自己的行上。 (也许它只是在Stack Overflow中粘贴得很差)
2:你有一组循环基本上将C中的所有内容设置为0:
for(i=0;i<rows;i++)
{
for(j=0;j<cols; j++)
{
C[i][j]=0;
}
}
然后在那之后你就有了:
for(i=0;i<rows;i++)
{
for(j=0;j<cols; j++)
{
A[i][j]=C[i++][j]; // <--- problem here
}
}
所以在那之后,A和C都满了全0。最重要的是,在访问C中的列时,你有i ++内联。这实际上会改变你的for循环使用的值,所以我每行和的每一行都会增加。大概你想要:
A[i][j]=C[i+1][j];
3:你有类似的问题:
for(j=0;j<cols; j++)
{
for(i=0;i<rows;i++)
{
C[i][j]+=A[i][j++]; // Presumably you want j+1
}
}
4:你为什么在C中使用char数组?如果它持有整数之和,它应该被声明为int。如果您打算将整数打印为十六进制(或仅仅是简单的整数),那么简单地使用printf以整数形式输出整数就更容易了:
// use %d to print the integer "normally" (base 10)
// use %x if you want a hex value with lowercase letters
// use %X if you want a hex value with capital letters
printf("125 as hex is: 0x%x", 125); // 0x7d
我希望指出你正确的方向。
- 丹
答案 1 :(得分:0)
我是否理解正确,给定矩阵A,您希望在SumThemUp
中得到矩阵C,其中C中的每个单元格是其相邻单元格的总和?在这种情况下,当您修改循环计数器
A[i][j]=C[i++][j];
和
C[i][j]+=A[i][j++];
无论如何,一个简单的例子,我将如何做求和部分。
NB!请注意,我对矩阵C使用int
类型。鉴于您要将其转换为十六进制,并且您发生的某个地方的所有相邻单元格中的值为3,则得到的小数值为3 * 8 = 24,这需要更多比一个字符代表。因此,您应该在打印期间转换为十六进制。 (我知道char
也可以包含最多255的整数值,但为了保持一致性)
void SumThemUp(int A[][cols], int C[][cols]) {
int i, j, di, dj, i2, j2;
// iterate through all the rows
for (i=0 ; i<rows ; ++i) {
for (j=0 ; j<cols ; ++j) {
// initialize the cell to zero
C[i][j] = 0;
// iterate over nearby cells
for (di=-1 ; di<=1 ; ++di) {
for (dj=-1 ; dj<=1 ; ++dj) {
// do not count in the center
if (di == 0 && dj == 0) {
continue;
}
// make sure, we do not try to count in cells
// outside the matrix
i2 = i + di;
j2 = j + di;
if (i2 < 0 || j2 < 0 || i2 >= rows || j2 >= cols) {
continue;
}
// append the score here
C[i][j] += A[i2][j2];
}
}
}
}
}
另外,我没有测试这段代码,所以它可能包含错误,但也许它可以帮助你完成你的求和部分。
NB!并注意@Dan的评论。