【问题标题】:2D array function logic二维数组功能逻辑
【发布时间】:2013-11-05 11:32:49
【问题描述】:

我创建了这个程序,它扫描二维数组以查找垂直和水平对,其中 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 ;
}

【问题讨论】:

标签: c function multidimensional-array


【解决方案1】:
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 将产生数组越界异常。要么你想要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);
}

【讨论】:

    【解决方案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。但在上述循环中,您可以在 if 语句的右侧操作数中将 cr 加 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 &gt; 0; --c)) 中,c 永远不会达到 0,但那是因为它不需要,因为当 c = 1 时,无论如何你正在将它与 c-1 进行比较......

    您的代码最终可能类似于:

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

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2020-02-02
      相关资源
      最近更新 更多