提示:本文仅供C语言初学者参考使用,文章代码部分来源网络,如有侵权,请尽快私信删除!
前言
提示:为加深对C语言中指针的理解,分析了几道C语言指针的经典案例,一起来看看吧!
提示:以下是本篇文章正文内容,下面案例可供参考
一、幻方
案例简介:
它是将从一到若干个数的自然数排成纵横各为若干个数的正方形,使在同一行、同一列和同一对角线上的几个数的和都相等。
编写程序,实现奇数阶的幻方(偶数阶的算法非常难,博主能力有限,暂不做讨论。感兴趣的读者可以查阅中南大学信息科学与工程学院某教授和研究生撰写的论文)
这个游戏相信小时候大家都玩过,就算没有,数独总该玩过吧?懂得都懂,不懂的返回上一级读题
各位读者看到这里请先自己思考一下子该如何编写程序。
我把最简单最易懂的思路贴在下面
⑴ 将1放在第一行中间一列;
⑵ 从2开始直到n×n为止各数依次按下列规则存放:
按 45°方向行走,如向右下.
每一个数存放的行比前一个数的行数减1,列数加1
⑶ 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最上一行,列数同样加1;
⑷ 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的上面。
闲话少叙,直接贴代码!
//函数声明
void array();
/* 在C语言当中,使用函数时如果写的函数放在了主函数的前面,不需要进行函数声明,如果写在主函数后面,必须加上函数的声明! */
//主函数
int main() {
array(); //函数调用
return 0;
}
/* 把执行的代码打包成函数,以便拥有更好的可移植性 */
void array()
{
int n, i, j, idx, num, MAX;
int* M; //定义一个一维数组指针,按行优先存储矩阵中的元素
/* 一维数组的数组名就是该一维数组的首地址,而指针刚好指向首地址,因此可以定义指针来表示一维数组 */
printf("请输入n:");
input: //***
scanf("%d", &n);
if (n%2==0) //n是偶数则重新输入
{
printf("n不为奇数,请重新输入:");
goto input;
}
/* goto :goto语句是一种无条件转移语句,与:构成C语言
中的关键词。如上述代码,进入if语句后goto input 会无条
件返回到 *** 的位置。*/
MAX = n * n; //MAX为幻方中的最大值,也是元素个数,想想为什么?这点很重要!
M = (int*)malloc(sizeof(int) * MAX); //分配存储空间
/*想真正的玩指针必须要会的一个函数。 这个mal