关于矩阵比较大小的故事

写在前面

以为这个博客会永远的荒芜下去…没想到这时候可以用来自己做一些关于代码作业的小的记录用。做好了几年以后回头不可思议的看着负基础的自己认真的记录这些可能很简单的事情的准备,开始吧。

题目部分

//主函数部分 
int main() {
  size_t total = 0, size = 0;
  scanf("%zu%zu", &total, &size);
  int matrixArr[MAX_TOTAL][MAX_SIZE][MAX_SIZE] = {};
  for (size_t matrixIndex = 0; matrixIndex < total; ++matrixIndex) {
    inputMatrices(matrixArr[matrixIndex],size);
  }
  qsort_r(matrixArr, total, sizeof(matrixArr[0]), &cmpMatrices, &size);
  for (size_t matrixIndex = 0; matrixIndex < total; ++matrixIndex) {
    printMatrices(matrixArr[matrixIndex], size);
  }
  return 0;
}
  • 首先是过编译的问题:传入的指针到底如何匹配函数的形参呢。其实回头看来传入的就是一个简单的数组首元素的指针而已。所以在函数形参中写arry[]就已经足够了,如果是一行或者一张表的指针,是需要定义如int *ptr[num]的…唔,其实是很简单的问题。多维数组指针的应用还需要多了解啊。
  • 传入了一个void型的指针,强制转换类型才能对其进行递增递减的操作。大概是因为递增递减是要看数据类型来增加字节数的,所以没有明确的数据类型,就不知道加一时要偏移多少个字节。
  • 还有qsort_r这个陌生的函数,第四个参数是指向定义比较大小规则的函数的指针,而第五个参数是要用的size的地址,在写比较大小的函数的时候也要先强制转换数据类型才能取到里面的值。
  • 还有为了代码更加具有可移植性的size_t。记一下他的定义所在的头文件:stddef.h。

声明部分

#define MAX_TOTAL 10
#define MAX_SIZE 4
#include 

//.h里面的声明内容 
void inputMatrices(int matrixArr[],size_t size);
void printMatrices(int matrixArr[],size_t size);
int cmpMatrices(const void *firstMatrixPtr, const void *secondMatrixPtr, void *sizePtr);
  • 大概是…函数声明怎么声明各种形参的格式的问题。数据类型+形参的名字。很不熟练啊。返回值类型也要注意。

函数定义的部分

 //.c里面的定义内容
#include 

void inputMatrices(int matrixArr[],size_t size){
    int x=0,y=0,count=0;
    for(x=0;xfor(y=0;yscanf("%d",(matrixArr+count++));
        }
    }
    getchar();
    return;
}

void printMatrices(int matrixArr[],size_t size){
    int x=0,y=0,count=0;
    for(x=0;xfor(y=0;y1;y++){
            printf("%d ",*(matrixArr+count++));
        }
        printf("%d\n",*(matrixArr+count++));
    }
    printf("\n");
    return;
}

int cmpMatrices(const void *firstMatrixPtr, const void *secondMatrixPtr, void *sizePtr){
    size_t *matrixSizePtr = (size_t *)sizePtr;
    size_t matrixSize = *matrixSizePtr;
    int * use;
    int usenum=0,count=0;
    int sumfirst=0,sumsecond=0,x=0,y=0;
    for(x=0;xfor(y=0;yif(x==y || x+y==matrixSize-1){
            use = ((int *)(firstMatrixPtr)+count++);
            usenum = *use;
            sumfirst+=usenum;}
            else count++;
        }
    }
    count=0;
    for(x=0;xfor(y=0;yif(x==y || x+y==matrixSize-1){
            use = ((int *)(secondMatrixPtr)+count++);
            usenum = *use;      
            sumsecond+=usenum;}
            else count++;
        }
    }
    if(sumfirst==sumsecond){
        return 0;
    }else if(sumfirst>sumsecond){
        return 1;
    }else{
        return -1;
    }
}
  • 首先是一个强制转换类型再偏移指针的问题!
  • 还有一个思维上的坑点:在main函数中,定义了的一张张数组表都是4x4形式的,所以传入的数组表也是4x4形式的。如果输入的数组小于4x4的规模,这张表中就会有空出来的位置。那么…空在哪里呢。按一瞬间的反应来说,一定是空出了右边和下面,然后数字按矩阵排好。这时候输入输出以及判断大小的函数都要有跳过那些空出来的位置才可以得到正确的sum值。然而…
    完全没有考虑到还有空位的我直接把输入的矩阵的数据连续储存起来,虽然在形式上这些数字看起来完全不是一个矩阵,但是只要输入输出和判断大小的函数中保持一样的操作地址的思维,用x、y递增来把这些连续数字看成正方形的矩阵,也是可以得到正解的…
    如果一开始我就知道他传入的是4x4的矩阵…我肯定也会努力去凑出矩阵看上去要排列的样子。嘛…这说明有些时候虽然数据连续,但是用循环也可以把他们“看成”各种各样的排列的形状吧。数据结构可能也是这么一件事情吧…虽然大家都是被连续存储在一条内存空间里面,但是有了其他人为添加的变量限制,以及语句的功能,才成为了想象中不同的结构类型。
    …好像说了不得了的话。

最后

希望自己能常常记起来有这么一个博客呢…不要偷懒,把学到的东西都写一写吧。

你可能感兴趣的:(关于矩阵比较大小的故事)