Не дает правильный вывод - PullRequest
0 голосов
/ 21 апреля 2011

Программа должна создать 2D-таблицу 8 * 8, которая состоит из o случайных 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 голосов
/ 21 апреля 2011

Правильно ли я понимаю, что с учетом матрицы A вы хотите получить матрицу C в SumThemUp, где каждая ячейка в C является суммой смежных с ней ячеек?В этом случае эти строки выглядят подозрительно, когда вы изменяете счетчики циклов

A[i][j]=C[i++][j];

и

C[i][j]+=A[i][j++];

.

В любом случае, простой пример того, как я бы сделалсуммирующая часть.NB!Обратите внимание, что я использую тип int для матрицы C. Учитывая, что вы хотите преобразовать ее в шестнадцатеричное и вы должны иметь значения 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];
        }
      }
    }
  }
}

Кроме того, я не тестировал этот код, поэтому он может содержать ошибки, но, возможно, онпоможет вам завершить суммирование.

Внимание!И обратите внимание на комментарии @ Dan.

0 голосов
/ 21 апреля 2011

Итак - я не совсем уверен, что знаю, что вы хотите, чтобы вывод был - но есть несколько проблем с тем, что у вас есть:

0: для ваших массивов имена должны описывать то, что массив в действительности содержит, A и C довольно неоднозначны.

1: используйте {} для определения области действия и ставьте {} в свои строки. (Возможно, он плохо вставлен в переполнение стека)

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. Кроме того, у вас есть встроенный i ++ при доступе к столбцам в C. Это на самом деле меняет значение, используемое вашим циклом 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? Если он содержит сумму целых чисел, он, вероятно, должен быть объявлен как 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 

Надеюсь, это направит вас в правильном направлении.

- Дан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...