我正在尝试旋转正方形矩阵,读取效果很好,最初矩阵的显示功能很好,但是当我调用旋转功能时,输出非常奇怪。我将附加以下代码:
#include <stdio.h>
#include <stdlib.h>
// reading and allocation function
int *citire_matrice (int *dim) {
int i,j;
int *m;
if (* dim==0) {
printf ("Introduceti numarul de linii si coloane al matricei (este o matrice patratica)=");
scanf ("%d", dim);
}
m=(int*)malloc ( (*dim)*(*dim)*sizeof(int));
if (!m) {
printf ("Memoria nu a putut fi alocata.Iesire.");
exit (1);
}
printf ("n Citire valori matrice:n");
for (i=0;i<*dim;i++)
for (j=0; j<*dim; j++) {
printf("m[%d][%d]=",i+1,j+1);
scanf("%d",m+*dim*i+j);
}
return m;
}
//display function
void afisare_matrice (int *m,int dim) {
int i,j;
for (i=0;i<dim;i++) {
for (j=0;j<dim;j++)
printf ("%8d",*(m+dim*i+j));
printf ("n");
}
}
//rotate function
int* rotire_matrice (int*m,int dim) {
int i,j,temp;
int*p;
p= (int*)malloc (dim*dim*sizeof (int));
if (!p) {
printf ("nu s-a putut aloca memoria. Iesire");
exit (1);
}
for (i=0;i<dim;i++) {
temp=0;
for (j=0;j<dim;j++) {
*(m+dim*(temp++)+i)=*(m+dim*(--dim)+i);
*(p+dim*i+j) = *(m+dim*(temp++)+i);
}
}
return p;
}
//free memory
void eliberare_matrice (int *m) {
if (m!= NULL)
free(m);
}
int main () {
int *m,*p;
int dim=0,i,j;
m=citire_matrice(&dim);
printf ("nmatricea initialan");
afisare_matrice(m,dim);
p = rotire_matrice(m,dim);
printf ("nmatricea rotitan");
afisare_matrice(p,dim);
eliberare_matrice (m);
eliberare_matrice (p);
system ("PAUSE");
return 0;
}
输出:
Introduceti numarul de linii si coloane al matricei (este o matrice patratica)=3
Citire valori matrice:
m[1][1]=1
m[1][2]=2
m[1][3]=3
m[2][1]=4
m[2][2]=5
m[2][3]=6
m[3][1]=7
m[3][2]=8
m[3][3]=9
matricea initiala
1 2 3
4 5 6
7 8 9
matricea rotita
3 4 9961808
0 0 0
0 0 0
Press any key to continue . . .
您想要此:
int *rotire_matrice(int*m, int dim)
{
int *p = (int*)malloc(dim*dim * sizeof(int));
if (!p)
{
printf("nu s-a putut aloca memoria. Iesire");
exit(1);
}
for (int x = 0; x<dim; x++) {
for (int y = 0; y<dim; y++) {
int nx = y;
int ny = dim - 1 - x;
*(p + nx*dim + ny) = *(m + x*dim + y);
}
}
return p;
}
或更多可读性:
定义此宏:
#define MAT(m,dim,x,y) (*((m) + (x)*(dim) + (y)))
并更换
*(p + nx*dim + ny) = *(m + x*dim + y);
MAT(p, dim, nx, ny) = MAT(m, dim, x, y);