在 C 中反转二维数组

Reverse a 2D array in C

我正在尝试反转我的二维数组,我的代码有两个函数,第一个创建一个由行和列组成的随机矩阵,第二个必须反转它,但我不太明白我在那里做错了什么,因为最后它只打印了一排数字。示例:矩阵中的最后一个数字是,比方说,12,所以它打印我:“0 12 0”

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

int ar[100][100];

void create_mat(int a)
{
    srand(time(NULL));
    for (int i=0; i<a; i++)
    {
        printf("\n");
        for (int j=0; j<a; j++)
        {
            ar[a][a]=rand()%15+1;
            printf("%d\t", ar[a][a]);
        }
    }
}
void reverse_mat(int a)
{
    printf("\nReversed: ");
    for (int i=0; i<a/2; i++)
    {
        printf("\n");
        for (int j=0; j<a; j++)
        {
            int temp = ar[a][a];
            ar[a][a]=ar[a-i-1][a];
            ar[a-i-1][a]=temp;
            printf("%d\t", ar[a][a]);
        }
    }
}

int main()
{
    int (*funcptr)(int);
    int (*rev)(int);
    funcptr = &create_mat;
    rev = &reverse_mat;
    int a;
    printf("Introduce the number of rows and columns: ");
    scanf("%d", &a);
    funcptr(a);
    rev(a);

    return 0;
}

首先,生成矩阵的逻辑有错误。尽管打印结果看起来不错,但您并未将随机值分配给矩阵中的正确位置。为了避免这种混乱,最好将打印逻辑分离到一个新函数中。

其次,您正在为反向功能做类似的事情。确保将值分配到矩阵中的正确位置。

void print_matrix(int a)
{
    printf("\n*********************\n");
    for (int i=0; i<a; i++)
    {
        for (int j=0; j<a; j++)
        {
            printf("%d\t", ar[i][j]);
        }
        printf("\n");
    }
}

void reverse_mat(int a)
{
    printf("\nReversed: ");
    for (int i=0; i<a/2; i++)
    {
        for (int j=0; j<a; j++)
        {
            int temp = ar[i][j]; // this line had the error
            ar[i][j]=ar[a-i-1][j]; // this line had the error
            ar[a-i-1][j]=temp; // this line had the error
        }
    }
}
void create_mat(int a)
{
    srand(time(NULL));
    for (int i=0; i<a; i++)
    {
        for (int j=0; j<a; j++)
        {
            ar[i][j]=rand()%15+1; // this line had the error
        }
    }
}

感谢大家的帮助!由于我暂停了一个月的编码,我犯了一些错误导致了我的问题,例如 ar[a][a], rand()%15+1 等。在您的帮助和提示下,我修复了程序,现在它正在做我想要它做的事情。

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

int ar[100][100];

void create_mat(int a)
{
    srand(time(NULL));
    for (int i=0; i<a; i++)
    {
        printf("\n");
        for (int j=0; j<a; j++)
        {
            ar[i][j]=rand()%16;
            printf("%d\t", ar[i][j]);
        }
    }
}
void reverse_mat(int a)
{
    for (int i=0; i<a/2; i++)
    {
        printf("\n");
        for (int j=0; j<a; j++)
        {
            int temp = ar[i][j];
            ar[i][j]=ar[a-i-1][j];
            ar[a-i-1][j]=temp;
        }
    }
}

void print_reversed(int a)
{
    printf("\nMatricea in forma inversa: ");
    for (int i=0; i<a; i++)
    {
        printf("\n");
        for (int j=0; j<a; j++)
        {

            printf("%d\t", ar[i][j]);
        }
    }
}

int main()
{
    int (*funcptr)(int);
    int (*rev)(int);
    int (*ptr_rev)(int);
    funcptr = &create_mat;
    rev = &reverse_mat;
    ptr_rev = &print_reversed;
    int a;
    printf("Introduceti nr de linii si coloane: ");
    scanf("%d", &a);
    funcptr(a);
    rev(a);
    ptr_rev(a);

    return 0;
}

对于初学者来说,这些代码行

int (*funcptr)(int);
int (*rev)(int);
funcptr = &create_mat;
rev = &reverse_mat;

是多余的,而且由于return类型不同,指针的类型与分配给指针的函数的函数类型不兼容。

在 for 循环中,您总是使用不正确的索引。例如在函数 create_mat 中有嵌套循环

for (int i=0; i<a; i++)
{
    printf("\n");
    for (int j=0; j<a; j++)
    {
        ar[a][a]=rand()%15+1;
        printf("%d\t", ar[a][a]);
    }
}

您使用变量 a 作为索引,表示矩阵的大小,而不是使用变量 ij.

for (int i=0; i<a; i++)
{
    printf("\n");
    for (int j=0; j<a; j++)
    {
        ar[i][j]=rand()%15+1;
        printf("%d\t", ar[i][j]);
    }
}

如果变量a的值是奇数那么函数内reverse_mat中间行的元素不会因为外层循环[=22=的条件而反转]

for (int i=0; i<a/2; i++)

您再次使用无效索引。

程序可以如下面的演示程序所示

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

#define N   100

int a[N][N];

void create_mat( size_t n, int max_value )
{
    srand( time( NULL ) );
    
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            a[i][j] = rand() % max_value + 1;
        }
    }
}

void reverse_mat( size_t n )
{
    if ( n )
    {
        for ( size_t i = 0, j = n * n; i < --j; i++ )
        {
            int tmp = a[ i / n] [ i % n ];
            a[ i / n ][ i % n ] = a[ j / n][ j % n ];
            a[ j / n][ j % n ] = tmp;
        }
    }       
}

void display( size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            printf( "%2d ", a[i][j] );
        }
        
        putchar( '\n' );
    }
}

int main(void) 
{
    size_t n = 0;
    
    printf( "Introduce the number of rows and columns: " );
    
    scanf( "%zu", &n );
    
    if ( N < n ) n = N;
    
    putchar( '\n' );
    
    create_mat( n, 15 );
    display( n );
    
    putchar( '\n' );
    
    reverse_mat( n );
    display( n );
    
    return 0;
}

程序输出可能看起来像

Introduce the number of rows and columns: 3

10  4 14 
12 14  7 
 6  8  3 

 3  8  6 
 7 14 12 
14  4 10