C-我想逆时针旋转90度,但输出不是我所需的



我正在尝试旋转正方形矩阵,读取效果很好,最初矩阵的显示功能很好,但是当我调用旋转功能时,输出非常奇怪。我将附加以下代码:

#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);

最新更新