最近复习完C语言,想做点可以锻炼自己的小项目,于是发现了一本叫《C语言程序设计实例精粹》的书,感觉很适合我,于是就
打了几个感觉比较好玩的程序吧,也是锻炼自己读代码和写代码的能力,我也会不定期的更新一些适合新手练习的程序以及算法,
程序上边有比较详细的注释和讲解,有共同爱好的可以交流一下。
这个程序为设计魔方数组的一段程序,也是设计魔方数组的一种算法,其实我感觉这本书上的这种算法不好用,比较复杂,
而且书上也有很多小错误例如 malloc的返回值是void型的 而明mtrx是整型的,不能画等号,要(int*malloc)才行。
//① 在第一行中间放1;
//② 假定当前元素的下标为(i,j),则对其余的2~n方个数,基本的放置位置为当前位置的右上方,即下标为(i-1,j+1);
// 与此同时,若当前的数是n的倍数,则放在当前位置的正下方;
// 即下标为(i+1,j);若i-1小于1,则将这个数放在本列最下端;
// 若j+1大于n,则将这个数放在本行最左端。
#include<stdio.h>
#include<malloc.h>//动态存储分配函数头文件,当对内存区进行操作时,调用相关函数.
void main()
{
int array(int n);
int n;
printf("Enter the number,please:\n");
scanf_s("%d", &n);
array(n);
getchar();
getchar();
}
int array(int n)
{
int i, j, no, num, max;
int *mtrx;//指向存放魔方矩阵一维数组
if (n % 2 == 1)
{
n = n + 1;
}
max = n*n;
//开始构建魔方矩阵
mtrx = (int*)malloc(max*max);
mtrx[max / 2] = 1;//第一个数
i = 0;
j = n / 2;
for (num = 2; num <= max; num++)
{
i = i - 1;
j = j + 1;
if ((num - 1) % n == 0)//由于上边已经执行一次循环,所以要num-1,i,j位置随上次循环的变动,判断是不是特殊情况。
{
i = i + 2;
j = j - 1;
}
if (i < 0)//i上边已经减过一次,所以不用再减
{
i = n - 1;
}
if (j > n - 1)
{
j = 0;
}
no = i*n + j;
mtrx[no] = num;//对一位数组进行赋值
}
printf("The magic matrix is:");//对mtrx进行输出
no = 0;
for (i = 0; i < n;i++)
{
printf("\n");
for (j = 0; j < n; j++)
{
printf("%3d", mtrx[no]);
no++;
}
}
free(mtrx);
return *mtrx;
}