E:\arithmetic\PrintRotateArray
思路:以圈为单位打印(k),每圈又分4部分。计算好每圈的起始位置((k,k)),和每圈每部分的终止条件。
注意:1.二维数组的传参。2.宏定义加括号。3。临界终止条件。
#include <stdio.h>
#define MIN(a, b) ( (a) < (b) ? a : b )
void printArray(int **arr, int row, int col);
int main(int argc, char *argv[])
{
int arr[4][4];
int i = 0 , j = 0;
for(i = 0 ; i<4; i++){
for(j=0 ; j<4 ; j++){
arr[i][j] = 4*i+j ;
}
}
int arr2[5][4];
for(i = 0 ; i<5; i++){
for(j=0 ; j<4 ; j++){
arr2[i][j] = 4*i+j ;
}
}
printf("row = %d \t, col = %d\n", sizeof(arr2)/sizeof(int), sizeof(arr2[0])/sizeof(int));//20 4看来在内存中是当成一维数组
int arr3[5][5];
for(i = 0 ; i<5; i++){
for(j=0 ; j<5 ; j++){
arr3[i][j] = 5*i+j ;
}
}
printArray(arr3, 5, 5);
return 0;
}
void printArray(int **arr, int row, int col){
int m, n, k;
m = 0; n = 0; k = 0;
while(k<(float)(MIN(row, col) / 2.0)){
// printf("*********%d\n", k);
m = k;
n = k;
while(n<col-k){
// printf("%d\t", arr[m][n]);
printf("%d\t", *(arr+m*row+n));
n++;
}
n--;//!!!!! 别忘了!!!
m++;
while(m<row-k){
// printf("%d\t", arr[m][n]);
printf("%d\t", *(arr+m*row+n));
m++;
}
m--;//!!!!!
n--;
while(n>=k){
// printf("%d\t", arr[m][n]);
printf("%d\t", *(arr+m*row+n));
n--;
}
n++;//!!!!!
m--;
while(m>=k+1){
// printf("%d\t", arr[m][n]);
printf("%d\t", *(arr+m*row+n));
m--;
}
k++;
}
}