没有给出正确的输出

时间:2011-04-21 01:29:45

标签: c

程序应创建一个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;  
}

2 个答案:

答案 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的评论。