二维阵列功能逻辑

时间:2013-11-05 11:32:49

标签: c function multidimensional-array

我创建了这个程序,扫描2D数组中的垂直和水平对,其中row = 20和column = 30,然后显示输出。

我想我可能在功能2&中搞砸了我的逻辑。 3.任何人都可以帮我查一下,帮我弄清楚我做错了吗? 我会非常感激。

完整的程序代码:

    #include <stdio.h> 
    #include <stdlib.h>
    #include <time.h> 

    #define ROW 20
    #define COLUMN 30

    void intro_msg (void);    
    char function1 (char [ROW] [COLUMN]);
    char function2 (char [ROW] [COLUMN]);
    char function3 (char [ROW] [COLUMN]);
    void function4 (int , int);
    void goodbye_msg (void);

int main( void )
{  // MARKS THE BEGINNING OF THE main( ) BLOCK OF STATEMENTS

   char randchar_array [ROW] [COLUMN]; 
   int hor_pairs = 0 , vert_pairs = 0;
   srandom ( (unsigned) time (NULL) ); 

    intro_msg ( ) ;

    function1 (randchar_array);

    hor_pairs = function2 (randchar_array);

    vert_pairs = function3 (randchar_array);

    function4 (hor_pairs , vert_pairs); 

    goodbye_msg ( ) ;

    return ( 0 ) ;

}    // MARKS THE END OF THE main( ) BLOCK OF STATEMENTS

void   intro_msg   (void) 
{
    printf( "\n Welcome user, this program creates a 2D array of characters " 
            "that has 20 rows\n and 30 columns and then populates it with random"
            " characters. The program then\n displays the number of vertical "
            "and horizontal pairs in the array.\n\n"); 
    return ;
}

char function1 (char randchar_array[ROW] [COLUMN]) 

{
    int r = 0 ;
    int c = 0 ;
    char nextchar = 'A';

     for (r = 0; r < ROW ; r++)
     {
         for (c = 0; c < COLUMN ; c++)
         {
            nextchar = 'A' + random() % 26;
            randchar_array [r] [c] = nextchar;
            printf(" %c", nextchar);
         }

         printf("\n");
      }

      return (randchar_array [ROW] [COLUMN]);
}

char function2 (char randchar_array[ROW] [COLUMN]) 

{
    int r = 0 ;
    int c = 0 ;
    int horpairs = 0;

     for (r = 0; r < ROW -1; r++)
     {
         for (c = 0; c < COLUMN ; c++)
         {
           {
           if(randchar_array[r][c] == randchar_array[r][c+1])
             horpairs++;
           }
         }
      }

      return (horpairs);
}

char function3 (char randchar_array[ROW] [COLUMN]) 

{
    int r = 0 ;
    int c = 0 ;
    int vertpairs = 0;

     for (r = 0; r < ROW ; r++)
     {
         for (c = 0; c < COLUMN -1; c++)
         {
           {
           if(randchar_array[r][c] == randchar_array[r+1][c])
             vertpairs++;
           }
         }
      }

      return (vertpairs);
}

void function4 (int hor_pairs, int vert_pairs) 
{
    printf ( " \n Number of horizontal pairs: %d /n" , hor_pairs ); 
    printf ( " \n Number of vertical pairs: %d /n" , vert_pairs ); 
    return ;
}

void   goodbye_msg   (void) 
{
    printf ( "\n Thank you for using this program.\n\n") ; 
    return ;
}

2 个答案:

答案 0 :(得分:2)

for (r = 0; r < ROW -1; r++)
{
  for (c = 0; c < COLUMN ; c++)
    {
      if(randchar_array[r][c] == randchar_array[r][c+1])
      horpairs++;
    }
}
循环条件中的

ROW-1和循环体中的c+1将产生一个Array-out-of-bounds Exception。要么COLUMN-1而不是ROW-1,要么r+1而不是c+1

function2()function3()共享该问题。我想你想要:

char function2 (char randchar_array[ROW] [COLUMN]) {
  int r = 0 ;
  int c = 0 ;
  int horpairs = 0;
  for (r = 0; r < ROW ; r++){
    for (c = 0; c < COLUMN-1 ; c++){
      if(randchar_array[r][c] == randchar_array[r][c+1])
      horpairs++;
    }
  }
  return (horpairs);
}

char function3 (char randchar_array[ROW] [COLUMN]) {
  int r = 0 ;
  int c = 0 ;
  int vertpairs = 0;
  for (r = 0; r < ROW -1; r++){
    for (c = 0; c < COLUMN ; c++){
      if(randchar_array[r][c] == randchar_array[r+1][c])
        vertpairs++;
    }
  }
  return (vertpairs);
}

答案 1 :(得分:2)

你犯了同样的错误两次:

 for (c = 0; c < COLUMN ; c++)
 {
     if(randchar_array[r][c] == randchar_array[r][c+1])

在这里,并且:

for (r = 0; r < ROW ; r++)
{
    for (c = 0; c < COLUMN -1; c++)
    {
        if(randchar_array[r][c] == randchar_array[r+1][c])

for循环遍历char数组的所有元素,其中cr将分别增加到COLUMN -1ROW -1。但是在上述循环中,您在c语句的右侧操作数中将rif递增1。 你的循环最后一次运行,这意味着你实际上已经超出界限,并且访问(或者试图访问):

randchar_array[r][COLUMN]
//and
randchar_array[ROW][c]

这是错误的。将您的循环更改为:

for(c = 0;c < COLUMN -1;++c)

或者,对于更加微观优化的方式

for(c = COLUMN - 1;c > 0; --c)

当然,后一个循环将字符重复到前面,所以你必须考虑到这一点。
请注意,在最后一个循环(for(c = COLUMN - 1;c > 0; --c))中,c将不会达到0,但这是因为它不需要,因为,当c = 1时,您将它与{ {1}}无论如何......

您的代码可能最终看起来像:

c-1