C 奇数行反转矩阵转置
我知道如何转换矩阵,但是如何转换奇数行反转形式的矩阵 示例3*3矩阵C 奇数行反转矩阵转置,c,arrays,algorithm,matrix,C,Arrays,Algorithm,Matrix,我知道如何转换矩阵,但是如何转换奇数行反转形式的矩阵 示例3*3矩阵 1 2 3 4 5 6 7 8 9 输出 1 6 7 2 5 8 3 4 9 如果我正确理解了作业,那么程序可以按照以下方式运行 #include <stdio.h> #define MAX_VALUE 100 int main(void) { while ( 1 ) { printf( "Enter the size of an array (0 - Exit):
- 1 2 3
- 4 5 6
- 7 8 9
- 1 6 7
- 2 5 8
- 3 4 9
#include <stdio.h>
#define MAX_VALUE 100
int main(void)
{
while ( 1 )
{
printf( "Enter the size of an array (0 - Exit): " );
size_t n;
if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;
putchar('\n');
n %= MAX_VALUE;
int a[n][n];
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ )
{
a[i][j] = n * i + j;
}
}
for (size_t i = 0; i < n; i++)
{
for (size_t j = 0; j < n; j++)
{
printf("%3d ", a[i][j]);
}
putchar('\n');
}
putchar('\n');
for (size_t i = 0; i < n; i++)
{
for (size_t j = i; j < n; j++)
{
if (j % 2 == 1 && i < n / 2)
{
int tmp = a[j][i];
a[j][i] = a[j][n - i - 1];
a[j][n - i - 1] = tmp;
}
if (i != j)
{
int tmp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = tmp;
}
}
}
for (size_t i = 0; i < n; i++)
{
for (size_t j = 0; j < n; j++)
{
printf("%3d ", a[i][j]);
}
putchar('\n');
}
putchar('\n');
}
return 0;
}
编译器应该支持可变长度数组。否则,您可以为固定大小的数组重写程序。这里有一个解决方案,可以将问题分解为更小的子问题。函数
reverse_row()
是一个反转在位数组的函数,函数transpose_array()
是一个在位转置数组的函数
第一个函数,reverse\u row()
在具有奇数索引的2d数组行上以循环方式调用,然后在生成的数组上调用transpose\u array()
函数。注意,测试if(i%2){}
用于确定数组索引是奇数还是偶数,因为i%2
仅在i
为偶数时才计算为0
;您也可以避免此测试,只需在每次迭代时(从1开始)将i
增加2,如注释中所示:
for (size_t i = 1; i < MATRIX_SZ; i += 2) {
reverse_row(MATRIX_SZ, array[i]);
}
编写一个函数来反转行,并在将函数应用于转置之前应用它。问题是,我只想反转(size_t I=0;I
的奇数行。若要就地反转数组,可以交换第一个和最后一个元素,然后交换第二个和下一个元素,依此类推,直到到达数组的中间。谢谢,我将尝试@DavidBowling@DavidBowling将i++
更改为i++=2
将避免对模的需要
for (size_t i = 1; i < MATRIX_SZ; i += 2) {
reverse_row(MATRIX_SZ, array[i]);
}
#include <stdio.h>
#define MATRIX_SZ 4
void print_array(size_t n, int arr[n][n]);
void reverse_row(size_t n, int arr[n]);
void transpose_array(size_t n, int arr[n][n]);
int main(void)
{
int array[MATRIX_SZ][MATRIX_SZ] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
puts("Before transformation:");
print_array(MATRIX_SZ, array);
putchar('\n');
for (size_t i = 0; i < MATRIX_SZ; i++) {
if (i % 2) {
reverse_row(MATRIX_SZ, array[i]);
}
}
transpose_array(MATRIX_SZ, array);
puts("After transformation:");
print_array(MATRIX_SZ, array);
putchar('\n');
return 0;
}
void print_array(size_t n, int arr[n][n])
{
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < n; j++) {
printf("%5d", arr[i][j]);
}
putchar('\n');
}
}
void reverse_row(size_t n, int arr[n])
{
size_t mid = n / 2;
for (size_t i = 0; i < mid; i++) {
size_t swap_dx = n - 1 - i;
int temp = arr[i];
arr[i] = arr[swap_dx];
arr[swap_dx] = temp;
}
}
void transpose_array(size_t n, int arr[n][n])
{
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < i; j++) {
int temp = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = temp;
}
}
}