在 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
作为索引,表示矩阵的大小,而不是使用变量 i
和 j
.
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
我正在尝试反转我的二维数组,我的代码有两个函数,第一个创建一个由行和列组成的随机矩阵,第二个必须反转它,但我不太明白我在那里做错了什么,因为最后它只打印了一排数字。示例:矩阵中的最后一个数字是,比方说,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
作为索引,表示矩阵的大小,而不是使用变量 i
和 j
.
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