C语言中条件编译函数的递归与面向接口编程的流程
1.条件编译#ifdef与#endif,#ifndef与#endif,#if与#endif
测试存在
测试不存在
根据表达式定义
#ifdef 标识符
程序段1
#else
程序段2
#endif #ifndef 标识符
程序段1
#else
程序段2
#endif #if 表达式
程序段1
#else
程序段2
#endif #define _CRT_SECURE_NO_WARNINGS #include #include #include //1、 头文件包含 #include "" 自定义头文件 <> 系统头文件 //2、 宏定义 // 不重视作用域 可以利用 undef 卸载宏 // 宏定义的常量 没有数据类型的 static void test01() { #define MAX 1024 //#undef MAX } //3、条件编译 //#define DEBUG #ifdef DEBUG //如果是 DEBUG版本 走下面代码 static void func() { printf("debug版本调用 "); } #else #if 0 //自定义条件编译 static void func() { printf("release1版本调用 "); } #else static void func() { printf("release2版本调用 "); } #endif #endif int main() { //printf("MAX = %d ", MAX); //func(); test02(); system("pause"); return EXIT_SUCCESS; }
2.特殊的宏
__FILE__ 文件
__LINE__ 行
__DATE__ 日期
__TIME__ 时间static void doWork(char* p) { if (p == NULL) { printf(" 文件 : %s 的 %d 行 出错了! ", __FILE__, __LINE__); printf("日期:%s ", __DATE__); printf("时间:%s ", __TIME__); return; } } static void test02() { doWork(NULL); } int main() { //printf("MAX = %d ", MAX); //func(); test02(); system("pause"); return EXIT_SUCCESS; }
3.回调函数的使用,对任意数组进行排列#define _CRT_SECURE_NO_WARNINGS #include #include #include static void selectSort(void* arr, int eleSize, int len, int(*myCompare)(void*, void*)) { char* temp = malloc(eleSize); for (int i = 0; i < len; i++) { int minOrMax = i; //定义最小值 或者最大值下标 for (int j = i + 1; j < len; j++) { //j下标的数据地址 char* pJ = (char*)arr + j * eleSize; char* pMinOrMax = (char*)arr + minOrMax * eleSize; /* //从小到大 if (*num1 < *num2) { return 1; } return 0; */ if (myCompare(pJ, pMinOrMax)) { minOrMax = j; //更新 真实最小值 或者 最大值的下标 } //if (arr[j] < arr[minOrMax]) } if (i != minOrMax) { //交换数据 char* pI = (char*)arr + i * eleSize; char* pMinOrMax = (char*)arr + minOrMax * eleSize; memcpy(temp, pI, eleSize); memcpy(pI, pMinOrMax, eleSize); memcpy(pMinOrMax, temp, eleSize); } } if (temp != NULL) { free(temp); temp = NULL; } } static int myCompareInt(void* data1, void* data2) { int* num1 = data1; int* num2 = data2; //if (*num1 < *num2) //{ // return 1; //} //return 0; return *num1 < *num2; } static void test01() { int arr[] = { 10, 40, 30, 20, 50 }; int len = sizeof(arr) / sizeof(int); selectSort(arr, sizeof(int), len, myCompareInt); for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } } struct Person { char name[64]; int age; }; static int myComparePerson(void* data1, void* data2) { struct Person* p1 = data1; struct Person* p2 = data2; //按照年龄 进行从大到小 降序 return p1->age > p2->age; } static void test02() { struct Person pArray[] = { { "aaa", 10 }, { "bbb", 60 }, { "ccc", 20 }, { "ddd", 40 }, { "eee", 30 }, }; int len = sizeof(pArray) / sizeof(struct Person); //按照年龄实现从大到小排序 selectSort(pArray, sizeof(struct Person), len, myComparePerson); for (int i = 0; i < len; i++) { printf("姓名:%s , 年龄: %d ", pArray[i].name, pArray[i].age); } } int main() { //test01(); test02(); system("pause"); return EXIT_SUCCESS; }
4.递归函数的使用#define _CRT_SECURE_NO_WARNINGS #include #include #include #include //1、递归函数 函数自己调用自己,须有结束条件跳出循环 reversePrint(char*p) { if (*p == "/0") { return;//退出条件 } reversePrint(p + 1); printf("%c ", *p); } static void test01() { char* str = "abcde"; reversePrint(str); } //2、斐波那契数列 1 1 2 3 5 8 13 从第三个数字开始等于前两个数字相加 int fibonacci(int pos) { if (pos == 1 || pos == 2) { return 1; } return fibonacci(pos - 1) + fibonacci(pos - 2); } static void test02() { int ret = fibonacci(7); printf("%d ", ret); } int main() { //test01(); test02(); return 0; }
5.面向接口编程一个游戏#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include"GameCommany.h" //初始化游戏 typedef void* (INIT_GAME)(void** gameHandle, char* name); //游戏战斗 返回游戏战斗结果 返回:1代表胜利 0代表失败 typedef int(*FIGHT_GAME)(void* gameHandle, int gameLevel); //玩家信息 typedef void(*PRINT_GAME)(void* gameHandle); //离开游戏 typedef void(*CLOSE_GAME)(void* gameHandle); void playgame(INIT_GAME init, FIGHT_GAME fight, PRINT_GAME printGame, CLOSE_GAME closeGame) { //初始化游戏 void* gameHandle = NULL; printf("请输入玩家姓名: "); char name[64]; scanf("%s", name); init(&gameHandle, name); //游戏战斗 int level = -1; while (1) { getchar(); system("cls");//清屏 printf("请选择游戏难度: "); printf("1:普通 "); printf("2:中等 "); printf("3:困难 "); scanf("%d", &level); getchar(); int ret = fight(&gameHandle, level);// ret=0 or 1 成功or失败 if (ret == 0) { printf("挑战失败 "); break; } else { printf("挑战成功 "); printGame(gameHandle); } } //离开游戏 closeGame(&gameHandle); } int main() { srand((unsigned int)time(NULL)); playgame(INIT_GAME_COMPANY, FIGHT_GAME_COMPANY, PRINT_GAME_COMPANY, CLOSE_GAME_COMPANY); return 0; } #define _CRT_SECURE_NO_WARNINGS #include #include #include #include struct player { char name[64];//姓名 int level;//等级 int exp;//经验 }; //初始化游戏 void INIT_GAME_COMPANY(void** gameHandle, char* name); //游戏战斗 返回游戏战斗结果 返回:1代表胜利 0代表失败 int FIGHT_GAME_COMPANY(void* gameHandle, int gameLevel); //玩家信息 void PRINT_GAME_COMPANY(void* gameHandle); //离开游戏 void CLOSE_GAME_COMPANY(void* gameHandle); //判断游戏是否胜利 参数1胜率 参数2难度 返回值是胜利后的经验,返回0代表失败 int isWin(int winRate, int diff); #include"GameCommany.h" //初始化游戏 void INIT_GAME_COMPANY(void** gameHandle, char* name) { struct player* player = malloc(sizeof(struct player)); if (player == NULL) { return; } //玩家初始化操作 strcpy(player->name,name); player->level = 0; player->exp = 0; *gameHandle = player; } //游戏战斗 返回游戏战斗结果 返回:1代表胜利 0代表失败 int FIGHT_GAME_COMPANY(void* gameHandle, int gameLevel) { struct player* player = gameHandle; int addExp = 0;//累加经验值 switch (gameLevel) { case1: //内部提供一个函数,判断游戏是否胜利 addExp = isWin(90, 1); break; case2: addExp = isWin(70, 2); break; case3: addExp = isWin(40, 3); break; defaule: break; } //将获取的经验给到人物 player->exp += addExp; player->level = player->exp / 10;//每10经验升一级 if (addExp == 0) { return 0;//战斗失败 } else { return 1;//战斗成功 } } //玩家信息 void PRINT_GAME_COMPANY(void* gameHandle) { struct player* player = gameHandle; printf("玩家<%s>-------当前等级<%d>-------当前经验<%d> ", player->name, player->level, player->exp); } //离开游戏 void CLOSE_GAME_COMPANY(void* gameHandle) { if (gameHandle == NULL) { return; } free(gameHandle); gameHandle = NULL; } //判断游戏是否胜利 参数1胜率 参数2难度 返回值是胜利后的经验,返回0代表失败 int isWin(int winRate, int diff) { int random = rand() % 100 + 1;//随机1~100 if (random <= winRate) { //代表胜利 return 10 * diff; } else { return 0; } }
数字功放和模拟功放的五大区别声拓电子音爵士KTV功放怎么选择数字功放和模拟功放的五大区别声拓电子音爵士随着功放技术的不断更新发展,目前,KTV功放有数字功放和模拟功放两个种类。这两种功放类型常常被拿来比较,到底哪个好呢?而
原来我们都错了,微信是一个生活方式最近,因为长安福特员工的不幸,微信工作群再次被推上风头浪尖。对于微信工作群,想必大家都是敢怒不敢言,在经济低迷的大环境下,还是先保住工作吧,毕竟连华为都开始裁员了。而今天,给新电脑
成都车展终于确认时间!最新车型先来一睹为快成都车展是国内的四大车展之一,虽然因为一些原因延后了2天,但是现在的时间终于确认了,将会在本月的8月29日9月7日举行!本次车展有不少好车已经陆续被曝出,下面就和大家说几款,关注度
吴亦凡事件最新进展就目前我手中的东西,我们可以至少给您十年的牢饭吗?7月18日晚,微博和V用户杜美柱爆料说吴一凡有诱惑或迷奸,并声称吴义范曾强奸未成年女孩。7月19日,吴一凡发表文章对此事作出回应我
吴亦凡事件最新进展吴亦凡最新整理昨天又有了新进展,据说是反转?首先是警方通报后续仍在调查中中间竟然来了个诈骗犯?太梦幻了警方通报出来后,LV宣布解约简单说,就是出现了一个骗子冒充女方身份和吴亦凡接触
一个老司机收藏已久的网站,准备发车一年一度的毕业季刚刚过去,大学生们也踏入了工作的岗位。刚进入岗位发现自己什么也不会,一天下来什么都做不来。想要去改变,却以失败告终。如果你不想在工作中浑浑噩噩地度过,那这个网站你一
老马自从员工用了这款软件,工资涨了两千,你还不用吗在日常工作中,我们有时需要将各种文件转换成PDF,PDF是一种便携式文件格式,方便我们进行发送使用。但是查阅起来却不是很方便,这又需要我们转换成别的文件形式。这时候我们就需要一个能
1K出头就有30寸大屏享受艾尔莎EA303B显示器体验前言最近表弟准备自主创业,由于手上并不宽裕,因此采取了开源节流的方式去布置新的办公室。其中当然少不了会用上电脑。自然而然就会找到我这个整体瞎折腾电脑却还是折腾不出什么软妹币的表哥,
电脑打不开图片?别着急,教你一招轻松解决在日常工作和生活学习中,我们经常会用到各种图片,而有的图片格式只能在特定的设备上打开,就比如说Heic格式。它是苹果手机独有的图片储存格式,别的设备无法打开Heic格式,只能在苹果
完美录制你磁性的声音,电脑录音软件推荐在工作生活和学习中,有的小伙伴由于工作和学习需要,要进行声音的录制。我们会从网上找一下录音软件,但是有些录音软件操作过于繁琐,经常让人摸不着头脑。什么录音软件比较好呢,在小编测试了
不懂DIY又不想做整机烈士墙?微星宙斯盾Z5准系统可以考虑前言就最近一两年来说,对于游戏党PC玩家是一段黑暗的日子,但对于刚需党来说,该买的还是要买,大不了先不用显卡,舍弃游戏,随便买个亮机卡凑合用或者直接买个带核显的CPU用得了。对于不