上一篇文章讲了C语言的随机数函数,那么我们可以用这个随机数函数来写一个好玩的程序,可以用易经 八 |卦来问事。
在讲这个程序前,先讲一个重大的关键字:typedef。
1、typedef
typedef是C语言中的一个关键字,用于为现有的数据类型创建一个新的名字,也可以说创建一个别名。
它的核心思想是:创建一个你喜爱的、更有意义的新名字来代表某个已有的类型,但它并不会创建一个全新的数据类型。
简单来说,typedef 就像一个“外号”,给你熟悉的类型起一个更好听、更实用的名字,让代码写起来更顺手,读起来更清楚。
语法格式:
typedef 原有类型名 新类型名;
如:
typedef int ABC;
这里给整型int起了一个别名ABC,那么在程序中就可以用ABC来取代int了。
此时
int a,b;
和:
ABC a,b;
是等价的。
但是typedef最常用的是简化复杂声明,提高代码可读性。
也就是说, typedef一般不会给int这样的类型另外起一个别名,但是常常在处理结构体类型时,另外起个别名。
为什么呢?
由于结构体类型太长了,不方便。
就好像目前的人们就习惯看短文章,不习惯看太长的文章一样。
我们来看看没有typedef的例子:
// 定义一个结构体
struct Point {
int x;
int y;
};
struct Point p1;
struct Point p2;
每次声明这个结构体变量时,都必须带上 'struct' 关键字,太长。
使用typedef的例子:
// 在定义结构体的同时,为其创建一个别名 ‘Coordinate’
typedef struct Point {
int x;
int y;
} AAA; // 给struct Point起了一个别名叫AAA
声明变量时,可以直接使用简洁的别名AAA:
AAA p1;
AAA p2;
在用typedef时,甚至可以不用结构体类型名,直接用关键字struct和成员名就行了,列如:
typedef struct {
int x;
int y;
} AAA;
2、遇事不决,看看易经
目前我们来写一个有关易经的程序了。
先定义两个结构体:
// 八 | 卦结构体

// 64 |卦结构体

初始化八| 卦数组:

再初始化64 |卦解释

//全部解释都列出来
}
有了上述两个函数,就很容易得到64 | gua索引

在主函数中,用随机数函数生成gua象:

rand()%8+1 保证了随机数在1-8之间。
显示gua| 象信息:

完整的主函数如下:

运行结果:

每次出来的随机数不一样,即每次运行出来的gua| 象也不一样,所以一个问题只能问一次。
这也契合《易经·蒙卦》里说的:”初筮告,再三渎,渎则不告。”
这句话原文是:”匪我求童蒙,童蒙求我。初筮告,再三渎,渎则不告。利贞。”
含义:
初筮告:第一次占问,真诚请教,会得到启示。
再三渎,渎则不告:如果一而再、再三地占问同样的事情,就是对shen明的亵渎(渎),这样就不会得到真正的启示
这句话体现了中国古代天人感应的哲学思想,强调心诚则灵,反对将占卜当作儿戏或者盲目迷信的态度。
在程序设计中的逻辑体现:
记录用户占问的问题,对同一问题限制占问次数,强调第一次占问结果的重大性。
完整程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef struct {
int id;
char name[10];
char nature[10];
char attribute[10];
} Bagua;
typedef struct {
char name[20];
char explanation[500];
} Gua64;
void initBagua(Bagua bagua[8]) {
Bagua qian = {1, “乾”, “天”, “健”};
Bagua dui = {2, “兑”, “泽”, “悦”};
Bagua li = {3, “离”, “火”, “丽”};
Bagua zhen = {4, “震”, “雷”, “动”};
Bagua xun = {5, “巽”, “风”, “入”};
Bagua kan = {6, “坎”, “水”, “陷”};
Bagua gen = {7, “艮”, “山”, “止”};
Bagua kun = {8, “坤”, “地”, “顺”};
bagua[0] = qian; bagua[1] = dui; bagua[2] = li;
bagua[3] = zhen; bagua[4] = xun; bagua[5] = kan;
bagua[6] = gen; bagua[7] = kun;
}
// 初始化解释
void initGua64(Gua64 gua64[64]) {
// 乾
strcpy(gua64[0].name, “乾为天”);
strcpy(gua64[0].explanation, “元亨利贞。象征强劲的创造力和领导力。代表刚健不息,自强不息的精神。”);
strcpy(gua64[1].name, “天风姤”);
strcpy(gua64[1].explanation, “女壮,勿用取女。象征相遇和邂逅,但也暗示着短暂和不稳定。”);
strcpy(gua64[2].name, “天山遁”);
strcpy(gua64[2].explanation, “亨,小利贞。象征退避和隐退,宜守不宜进。”);
strcpy(gua64[3].name, “天地否”);
strcpy(gua64[3].explanation, “否之匪人,不利君子贞。象征闭塞不通,需要耐心等待时机。”);
strcpy(gua64[4].name, “风地观”);
strcpy(gua64[4].explanation, “盥而不荐,有孚颙若。象征观察和审视,宜静观其变。”);
strcpy(gua64[5].name, “山地剥”);
strcpy(gua64[5].explanation, “不利有攸往。象征剥落和衰落,事物处于衰退期。”);
strcpy(gua64[6].name, “火地晋”);
strcpy(gua64[6].explanation, “康侯用锡马蕃庶,昼日三接。象征前进和晋升,光明在前。”);
strcpy(gua64[7].name, “火天大有”);
strcpy(gua64[7].explanation, “元亨。象征大丰收和大成功,充满光明和希望。”);
// 兑
strcpy(gua64[8].name, “兑为泽”);
strcpy(gua64[8].explanation, “亨,利贞。象征喜悦和沟通,宜交流和分享。”);
strcpy(gua64[9].name, “泽水困”);
strcpy(gua64[9].explanation, “亨,贞,大人吉,无咎。象征困境和考验,需要坚持和耐心。”);
strcpy(gua64[10].name, “泽地萃”);
strcpy(gua64[10].explanation, “亨。王假有庙。象征聚集和汇集,人才和资源汇聚。”);
strcpy(gua64[11].name, “泽山咸”);
strcpy(gua64[11].explanation, “亨,利贞,取女吉。象征感应和互动,人际关系和谐。”);
strcpy(gua64[12].name, “水山蹇”);
strcpy(gua64[12].explanation, “利西南,不利东北。利见大人,贞吉。象征困难和阻碍,前进艰难。”);
strcpy(gua64[13].name, “地山谦”);
strcpy(gua64[13].explanation, “亨,君子有终。象征谦虚和谦逊,以柔克刚。”);
strcpy(gua64[14].name, “雷山小过”);
strcpy(gua64[14].explanation, “亨,利贞。可小事,不可大事。象征小有过错,宜谨慎行事。”);
strcpy(gua64[15].name, “雷泽归妹”);
strcpy(gua64[15].explanation, “征凶,无攸利。象征婚姻和结合,但也暗示着不当的匹配。”);
// 离
strcpy(gua64[16].name, “离为火”);
strcpy(gua64[16].explanation, “利贞,亨。畜牝牛,吉。象征光明和依附,如火焰般明亮温暖。”);
strcpy(gua64[17].name, “火山旅”);
strcpy(gua64[17].explanation, “小亨,旅贞吉。象征旅行和漂泊,不安定的状态。”);
strcpy(gua64[18].name, “火风鼎”);
strcpy(gua64[18].explanation, “元吉,亨。象征稳固和革新,如鼎般稳定而能烹煮新物。”);
strcpy(gua64[19].name, “火水未济”);
strcpy(gua64[19].explanation, “亨,小狐汔济,濡其尾,无攸利。象征未完成和过渡,事情尚未成功。”);
strcpy(gua64[20].name, “山水蒙”);
strcpy(gua64[20].explanation, “亨。匪我求童蒙,童蒙求我。象征启蒙和教育,需要指导和学习。”);
strcpy(gua64[21].name, “风水涣”);
strcpy(gua64[21].explanation, “亨。王假有庙,利涉大川,利贞。象征涣散和解散,但也意味着新的开始。”);
strcpy(gua64[22].name, “天水讼”);
strcpy(gua64[22].explanation, “有孚,窒惕,中吉,终凶。象征争议和诉讼,宜避免冲突。”);
strcpy(gua64[23].name, “天火同人”);
strcpy(gua64[23].explanation, “同人于野,亨。利涉大川,利君子贞。象征团结和合作,志同道合。”);
// 震
strcpy(gua64[24].name, “震为雷”);
strcpy(gua64[24].explanation, “亨。震来虩虩,笑言哑哑。象征震动和行动,如雷般有力而突然。”);
strcpy(gua64[25].name, “雷地豫”);
strcpy(gua64[25].explanation, “利建侯行师。象征愉悦和预备,做好准备迎接未来。”);
strcpy(gua64[26].name, “雷水解”);
strcpy(gua64[26].explanation, “利西南。无所往,其来复吉。有攸往,夙吉。象征解决和缓解,困难得到化解。”);
strcpy(gua64[27].name, “雷风恒”);
strcpy(gua64[27].explanation, “亨,无咎,利贞,利有攸往。象征持久和恒常,稳定发展。”);
strcpy(gua64[28].name, “地风升”);
strcpy(gua64[28].explanation, “元亨,用见大人,勿恤,南征吉。象征上升和成长,稳步前进。”);
strcpy(gua64[29].name, “水风井”);
strcpy(gua64[29].explanation, “改邑不改井,无丧无得。往来井井。象征源泉和不变,提供稳定的支持。”);
strcpy(gua64[30].name, “泽风大过”);
strcpy(gua64[30].explanation, “栋桡,利有攸往,亨。象征过度和过分,需要调整和平衡。”);
strcpy(gua64[31].name, “泽雷随”);
strcpy(gua64[31].explanation, “元亨利贞,无咎。象征跟随和随从,顺应时势。”);
// 巽
strcpy(gua64[32].name, “巽为风”);
strcpy(gua64[32].explanation, “小亨,利有攸往,利见大人。象征顺从和进入,如风般无孔不入。”);
strcpy(gua64[33].name, “风天小畜”);
strcpy(gua64[33].explanation, “亨。密云不雨,自我西郊。象征小有积蓄,等待时机。”);
strcpy(gua64[34].name, “风火家人”);
strcpy(gua64[34].explanation, “利女贞。象征家庭和亲情,注重家庭和谐。”);
strcpy(gua64[35].name, “风雷益”);
strcpy(gua64[35].explanation, “利有攸往,利涉大川。象征增益和受益,得到协助和支持。”);
strcpy(gua64[36].name, “天雷无妄”);
strcpy(gua64[36].explanation, “元亨利贞。其匪正有眚,不利有攸往。象征无妄之灾,意外和偶然。”);
strcpy(gua64[37].name, “火雷噬嗑”);
strcpy(gua64[37].explanation, “亨。利用狱。象征咬合和克服,解决困难和障碍。”);
strcpy(gua64[38].name, “山雷颐”);
strcpy(gua64[38].explanation, “贞吉。观颐,自求口实。象征养育和修养,注重自我提升。”);
strcpy(gua64[39].name, “山风蛊”);
strcpy(gua64[39].explanation, “元亨,利涉大川。先甲三日,后甲三日。象征腐败和革新,需要整治和改革。”);
// 坎
strcpy(gua64[40].name, “坎为水”);
strcpy(gua64[40].explanation, “习坎,有孚,维心亨,行有尚。象征险陷和挑战,如水流般充满险阻。”);
strcpy(gua64[41].name, “水泽节”);
strcpy(gua64[41].explanation, “亨。苦节不可贞。象征节制和调节,适度而为。”);
strcpy(gua64[42].name, “水雷屯”);
strcpy(gua64[42].explanation, “元亨利贞。勿用有攸往,利建侯。象征初生和困难,万物初生时的艰难。”);
strcpy(gua64[43].name, “水火既济”);
strcpy(gua64[43].explanation, “亨,小利贞。初吉终乱。象征完成和成功,但需警惕后续问题。”);
strcpy(gua64[44].name, “泽火革”);
strcpy(gua64[44].explanation, “己日乃孚,元亨利贞,悔亡。象征变革和革新,破除旧立新。”);
strcpy(gua64[45].name, “雷火丰”);
strcpy(gua64[45].explanation, “亨,王假之,勿忧,宜日中。象征丰盛和盛大,如日中天。”);
strcpy(gua64[46].name, “地火明夷”);
strcpy(gua64[46].explanation, “利艰贞。象征光明被遮蔽,处境困难,需要忍耐。”);
strcpy(gua64[47].name, “地水师”);
strcpy(gua64[47].explanation, “贞,丈人吉,无咎。象征军队和战争,需要纪律和领导。”);
// 艮
strcpy(gua64[48].name, “艮为山”);
strcpy(gua64[48].explanation, “艮其背,不获其身。行其庭,不见其人。无咎。象征停止和静止,宜止不宜进。”);
strcpy(gua64[49].name, “山火贲”);
strcpy(gua64[49].explanation, “亨。小利有攸往。象征装饰和美化,注重外表和礼仪。”);
strcpy(gua64[50].name, “山天大畜”);
strcpy(gua64[50].explanation, “利贞。不家食吉。利涉大川。象征大积蓄和大储备,厚积薄发。”);
strcpy(gua64[51].name, “山泽损”);
strcpy(gua64[51].explanation, “有孚,元吉,无咎,可贞。利有攸往。象征损失和减损,有失必有得。”);
strcpy(gua64[52].name, “火泽睽”);
strcpy(gua64[52].explanation, “小事吉。象征背离和对立,意见不合,需要沟通。”);
strcpy(gua64[53].name, “天泽履”);
strcpy(gua64[53].explanation, “履虎尾,不咥人,亨。象征实践和履行,谨慎行事。”);
strcpy(gua64[54].name, “风泽中孚”);
strcpy(gua64[54].explanation, “豚鱼吉。利涉大川,利贞。象征诚信和信任,内心真诚。”);
strcpy(gua64[55].name, “风山渐”);
strcpy(gua64[55].explanation, “女归吉,利贞。象征渐进和发展,逐步前进。”);
// 坤
strcpy(gua64[56].name, “坤为地”);
strcpy(gua64[56].explanation, “元亨。利牝马之贞。象征柔顺和包容,如大地般承载万物。”);
strcpy(gua64[57].name, “地雷复”);
strcpy(gua64[57].explanation, “亨。出入无疾,朋来无咎。象征回复和循环,阴阳交替。”);
strcpy(gua64[58].name, “地泽临”);
strcpy(gua64[58].explanation, “元亨利贞。至于八月有凶。象征临近和督导,监督和管理。”);
strcpy(gua64[59].name, “地天泰”);
strcpy(gua64[59].explanation, “小往大来,吉亨。象征通达和顺利,天地交而万物通。”);
strcpy(gua64[60].name, “雷天大壮”);
strcpy(gua64[60].explanation, “利贞。象征强劲和旺盛,但需防止过度。”);
strcpy(gua64[61].name, “泽天夬”);
strcpy(gua64[61].explanation, “扬于王庭,孚号有厉。象征决断和决定,需要果断行动。”);
strcpy(gua64[62].name, “水天需”);
strcpy(gua64[62].explanation, “有孚,光亨,贞吉。利涉大川。象征等待和需要,耐心等待时机。”);
strcpy(gua64[63].name, “水地比”);
strcpy(gua64[63].explanation, “吉。原筮,元永贞,无咎。不宁方来,后夫凶。象征亲附和谐,团结合作。”);
}
// 根据上下| gua获取六十四gua索引
int getGuaIndex(int lower, int upper) {
// 六十四gua的排列顺序:乾宫、兑宫、离宫、震宫、巽宫、坎宫、艮宫、坤宫
// 每宫8 gua共64gua
return (upper – 1) * 8 + (lower – 1);
}
int main() {
Bagua bagua[8];
Gua64 gua64[64];
printf(”
八gua程序
“);
printf(“===============
“);
printf(”
静心,默念3遍你的问题
“);
printf(“按任意键看答案。
“);
printf(“祝你好运。
“);
getchar();//等待用户按任意键往下执行
initBagua(bagua); //初始化八gua
initGua64(gua64); //初始化六十四gua
srand(time(NULL)); //初始化随机数种子
// 生成随机下gua和上gua(1-8)
int lower_gua = rand() % 8 + 1;
int upper_gua = rand() % 8 + 1;
// 显示gua象信息
printf(“下: %s (%s, %s)
“,
bagua[lower_gua-1].name,
bagua[lower_gua-1].nature,
bagua[lower_gua-1].attribute);
printf(“上: %s (%s, %s)
“,
bagua[upper_gua-1].name,
bagua[upper_gua-1].nature,
bagua[upper_gua-1].attribute);
printf(”
“);
// 获取六十四gua索引和名称
int gua_index = getGuaIndex(lower_gua, upper_gua);
printf(“卦象: %s
“, gua64[gua_index].name);
printf(”
“);
// 显示解释
printf(“解释:
%s
“, gua64[gua_index].explanation);
return 0;
}
以上程序可以直接复制运行。


专业
谢谢品鉴官
写些dll外部调用的代码
这个好
收藏了,感谢分享