范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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用得了。对于不
利空逐渐消退!北向资金大举加仓,新能源赛道这次会是反转吗?年初以来,伴随着股市的调整,作为机构心头好的赛道股也是轮番回调,包括宁德时代比亚迪阳光电源等在内的多只赛道股股价大幅回调,宁王也在这一调整中被万亿俱乐部除名。此前风光无两的赛道股一拦截风险网站,360手机卫士新功能强力反击网购诈骗随着双十一的结束,在未来的几天至十几天的时间里,往往是网络诈骗的高峰期。钓鱼网站挂马网站冒充网站二维码扫描或冒充店铺工作人员等诈骗方式层出不穷。例如,用户在双十一期间预定或订购打折互联互通升级微信小程序支付自助开通云闪付功能上线中国青年报客户端讯(中青报中青网记者张均斌)银联云闪付与腾讯互联互通迎来升级。近日,微信小程序支付自助开通云闪付功能正式上线,这意味着微信支付商户可以在微信支付商户平台开通云闪付付AppleWatch好用吗?你这还把人问住了,我想如果不考虑个人喜好因素,确实好用,但毕竟就是个表,applewatch的功能已经很完美了,这么说吧,是国产各种watch的天花板,质量没得说,体验也好,但价格苹果称在骚扰问题上不限制言论自由前员工它在撒谎北京时间11月24日消息,苹果前工程师谢尔斯嘉丽(CherScarlett)表示,虽然苹果向美国证券交易委员会(以下简称SEC)称涉及骚扰歧视和其他违法状况时公司不会与员工签订保密2。1秒破百!马斯克特斯拉ModelSPlaid最快明年3月在中国交付凭借2。1秒零百加速,最高时速322公里时,特斯拉ModelSPlaid号称地表最快电动车。今日,有网友通过社交平台询问特斯拉CEO埃隆马斯克,ModelSPlaid什么时候在中国爬虫的紧箍咒网络爬虫技术本为互联网行业的常用技术之一,被广泛应用到各个领域。人们对于数据的采集和分析能力,获得了大幅的提升。但客观现实是,技术的应用,特别是市场化大规模的应用,往往具有明确的目蔚来汽车完成增发5329万股ADS融资20亿美元进行补血蔚来开启融资补血模式。11月19日,蔚来发布公告称,已经完成之前宣布的美国存托股票(ADS)在市场上的发行,每股相当于公司一股A类普通股。此次共出售5329万股ADS,筹集20亿美数智观察两年融资200亿元,AI医疗赛道为何吸金能力强人工智能逐渐渗透人们的生活,医疗保健行业也发生了很大变化,近年来AI医疗迅速兴起。那么,AI医疗是什么呢?人工智能医疗,是人工智能技术对医疗相关领域应用场景的赋能现象,即利用最先进华为官方开卖二手机,鸿蒙新电池一年质保,却因价格遭网友吐槽众所周知,从iPhone12系列开始苹果不再附送充电器和耳机,美曰其名是为了环保,但这一举动遭到了大多数人的反对,因为苹果所谓的环保方案就是充电器不再标配,而是需要格外购买,明白人买空调,为什么中国人认格力外国人认海尔?你这个问题很值得探讨。在国内,海尔格力都是不错的空调。格力起步最早,术业有专攻,产品好技术硬,一直是老大哥的身份,深受国人喜爱。然而到了国外,对老外来说,大家都是新品牌,一切清零,