《一教学对象计算机科学与技术系新生第二学期二教》由会员分享,可在线阅读,更多相关《一教学对象计算机科学与技术系新生第二学期二教(185页珍藏版)》请在金锄头文库上搜索。
1、C语言程序设计语言程序设计一、教学对象 计算机科学与技术系新生(第二学期) 二、教学目标 程序设计的重要性 程序设计的基本概念与基本方法 编程解题的思路与典型方法 数学模型简介 算法及算法步骤 程序结构与相应语句 编码与上机调试绪论绪论绪论绪论漱徽切挣股芝锗朽隔秒绕狙待滓赎贝潦瞻表挪肃猿啊扣享赂面墓砷临拍故一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计 三、教学重点三、教学重点三、教学重点三、教学重点 1. 1. 1. 1. 程序设计的基本概念,基本方法;程序设计的基本概念,基本方法;程序设计的基本概念,基本方法;程序设计的基
2、本概念,基本方法; 2. 2. 2. 2.在在在在 C C C C语言的环境下,学会如何针对问题进行分析,语言的环境下,学会如何针对问题进行分析,语言的环境下,学会如何针对问题进行分析,语言的环境下,学会如何针对问题进行分析,得出数学模型,理出算法并编程实现;得出数学模型,理出算法并编程实现;得出数学模型,理出算法并编程实现;得出数学模型,理出算法并编程实现; 3. 3. 3. 3.有条有理有根有据的编程实践;有条有理有根有据的编程实践;有条有理有根有据的编程实践;有条有理有根有据的编程实践; 4. 4. 4. 4.养成良好的编程风格与习惯;养成良好的编程风格与习惯;养成良好的编程风格与习惯;
3、养成良好的编程风格与习惯; 5. 5. 5. 5.重在思维方法的学习,鼓励创新。重在思维方法的学习,鼓励创新。重在思维方法的学习,鼓励创新。重在思维方法的学习,鼓励创新。绪论绪论绪论绪论挎认无善骄殆帽墨锹勿茧蹄者殴均始镣泄吏耶鼎圆日咸豪氨扰蒂滨譬磁鼻一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计四、指导思想四、指导思想1. 1. 立足改革,以培养高素质有创造精神的人才为这门课立足改革,以培养高素质有创造精神的人才为这门课的教学目标。的教学目标。2. 2. 以学生为中心,采用与现实生活贴切和具有趣味性的以学生为中心,采用与现实生
4、活贴切和具有趣味性的实例进行讲解,有利于调动学生学习的积极性,引导学生实例进行讲解,有利于调动学生学习的积极性,引导学生主动学习。主动学习。 3. 3. 强化实践,这门课主张程序设计是高强度的脑力劳动,强化实践,这门课主张程序设计是高强度的脑力劳动,不是听会的、也不是看会的,而是练会的。引导学生在解不是听会的、也不是看会的,而是练会的。引导学生在解题编程的实践中探索其中带规律性的认识。将感性认识升题编程的实践中探索其中带规律性的认识。将感性认识升华到理性高度。华到理性高度。绪论绪论绪论绪论薯摹竟啼泌斯右衬缨挨胀圣酱剐疥标毙撵碴楚苫刷舔滔斜弗傀卤堤石背库一教学对象计算机科学与技术系新生第二学期二
5、教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计五、学习方法五、学习方法 1. 1.动手动脑,理论指导下的实践动手动脑,理论指导下的实践 有条有理的实践。有条有理的实践。 2. 2.在编写大量程序之后,才能感到运用自如。在编写大量程序之后,才能感到运用自如。绪论绪论绪论绪论泅改昂极注擂限酵缅水驱郡绷守殆稚誉领衫糜药裁琼课幢式母促牟竭儒祝一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计六、教学内容安排六、教学内容安排 1. 1. 简单简单C C程序设计;程序设计; 2. 2. 分支结构程序设计;分支结构程序
6、设计; 3. 3. 循环结构程序设计;循环结构程序设计; 4. 4. 数组;数组; 5. 5. 函数;函数; 6. 6. 递归及其实现方法递归及其实现方法 7. 7. 指针;指针; 8. 8. 结构体与链表。结构体与链表。绪论绪论绪论绪论秉坞冈寻汞幌预露毡蛮贿赞语惶钻袁搐稼糙褐鞠擦舟送同淌亥湍勃耘好肚一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计1.1 1.1 认识认识C C语言程序语言程序 1.1.程序实例程序实例#include /#include /预编译命令预编译命令, ,将标准输入输出函数将标准输入输出函数 / /作
7、为头文件包扩到用户源文件中作为头文件包扩到用户源文件中 #include /#include /预编译命令预编译命令, ,将系统提供的数学函数将系统提供的数学函数 / /作为头文件包扩到用户源文件中作为头文件包扩到用户源文件中 main main( )( ) / /主函数,名为主函数,名为mainmain, / /函数体函数体. .开始开始 float a,b,c;float a,b,c; / /声明部分声明部分. .定义变量类型定义变量类型 b=30.0;b=30.0; / /执行部分执行部分. .赋值语句赋值语句 a=sin(b*3.14159/180); /a=sin(b*3.14159
8、/180); /执行部分执行部分. .赋值语句赋值语句 printf(printf(“%fn%fn”,a);,a);/执行部分执行部分. .输出语句输出语句 / /函数体函数体. .结束结束第一讲第一讲 简单的简单的C C程序设计程序设计拱框田独怎请茸斯殿万次姚践弃腆箭竭措诡熙帜怕满贤垒股山昏豢崎坏桑一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计1.2 实例总结实例总结 1.C程序结构程序结构预编译命令预编译命令主函数主函数 main( ) 函数体开始函数体开始 声明部分声明部分 执行部分执行部分 函数体结束函数体结束第一讲第
9、一讲 简单的简单的C C程序设计程序设计琴蛮迈翱诧枣盅锹定纽婶荆韭啮糊儒拖像蔑靶撒倦吭嘘偷瘸酥酷故偏揩波一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.2.变量的类型变量的类型 整型:整型:int int 长整型:长整型:longlong 浮点型:浮点型:floatfloat 双精度型:双精度型:doubledouble 字符型:字符型:charchar 用户自定义类型用户自定义类型第一讲第一讲 简单的简单的C C程序设计程序设计覆咨玩铱玻龄恼深其筏救脖穿去乎葱鸭谴屏炳炯崔掂垛戌凄栅屉殿据殿脖一教学对象计算机科学与技术系新生
10、第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计 3.3.声明的作用声明的作用 为变量分配内存单元,变量名作为内存单元的符为变量分配内存单元,变量名作为内存单元的符号地址,这件事是在程序编译链接时完成的。号地址,这件事是在程序编译链接时完成的。 4. 变量变量 其值可以改变的量,是内存单元的符号地址。其值可以改变的量,是内存单元的符号地址。 通过符号通过符号b可以找到相应的存储单元地址,假设为可以找到相应的存储单元地址,假设为1000。 语句语句 b=30.0 b=30.0; 是将值是将值30.030.0存放在地址存放在地址为为1000的的存储单元存储单元。第
11、一讲第一讲 简单的简单的C C程序设计程序设计赠臃灼捍瞬栓计鄙征寡缴旗请冲啄乙国筒削棠寐足拒缅削檀怯盐鲸什接富一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计5.5.对变量的赋值对变量的赋值 赋值符号赋值符号“=” b = 30.0;/ 读作将表达式的值读作将表达式的值30.0赋给变量赋给变量b a=sin(b*3.14159/180); / 读作将表达式(正弦函数)的值赋给变量读作将表达式(正弦函数)的值赋给变量a 第一讲第一讲 简单的简单的C C程序设计程序设计蒋蚜黍伞格秉令龙宦乍宿这锤秀阂冰点莱袭馋汇板民痹赦誉钱揉府谷缠袜
12、一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计6.6.变量赋值特点变量赋值特点 (1)先定义,后使用)先定义,后使用 int d,e,f; 定义三个变量为整数类型定义三个变量为整数类型 如未定义,则在编译时被查出,认为非法如未定义,则在编译时被查出,认为非法 (2)变量未被赋值前,值为)变量未被赋值前,值为未知未知 (3)对变量赋值过程是)对变量赋值过程是“覆盖覆盖”过程,用新值去替换旧过程,用新值去替换旧(4)读出变量的值,该变量保持不变)读出变量的值,该变量保持不变 (5)参与表达式运算的所有变量都保持原来的值不变)参与表
13、达式运算的所有变量都保持原来的值不变第一讲第一讲 简单的简单的C C程序设计程序设计歇彦婪栋护宵纱父腹沧嗓健存踪暂伊掷云本灯佩陶聚薄正鸽爷标皖揉河狠一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计变量赋值过程变量赋值过程 d e f d e f未赋值前未赋值前执行执行d=7执行执行 e=d 执行执行 f=d+e执行执行 d=d+1 000-12349723431607234316077077148714第一讲第一讲 简单的简单的C C程序设计程序设计妒敖检铬催谗诫晌她索璃庙棘食颂叠娄亏孺水尉食传满翻趾蚜斧植妆担皋一教学对象计算机
14、科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计7. 7. 输出语句输出语句 printf printf函数(格式输出函数)函数(格式输出函数) 一般形式为一般形式为 printf(printf(参数参数1 1,参数,参数2 2,参数,参数3 3,参数,参数n n) 其中参数其中参数1 1格式控制格式控制 参数参数2 2,参数,参数3 3,参数,参数n n输出表列输出表列 举例:举例: float a; float a; int b; int b; a = 85.56; a = 85.56; b = 100; b = 100; printf(%
15、f %d, a, b); printf(%f %d, a, b);第一讲第一讲 简单的简单的C C程序设计程序设计摩潞厘饮辉冬炕坛殊霸皿冬押秩脱租储圣时潘骸缀珐锑渺乃稗遁钥拉问搁一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计格式控制是用双引号括起来的字符串,称格式控制是用双引号括起来的字符串,称“转换控制字符转换控制字符串串”%f 第一个输出表列的格式说明,以小数形式输出单、第一个输出表列的格式说明,以小数形式输出单、双精度实数,隐含输出双精度实数,隐含输出6位小数位小数 %d 第二个输出表列的格式说明,以带有符号的十进第二个
16、输出表列的格式说明,以带有符号的十进制形式输出整数(正数不输出符号)制形式输出整数(正数不输出符号) 显然,显然,%f是控制实数是控制实数a的;的;%d是控制整数是控制整数b的的第一讲第一讲 简单的简单的C C程序设计程序设计湃懊冗畔墩晃域砧苹争霸退遥道吻祟铣丸沉差孩皇距亭窟窍幕晓苏淖某玩一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计为了醒目,格式控制项中除格式说明之外可以有为了醒目,格式控制项中除格式说明之外可以有普通字符普通字符例例: printf(: printf(“a=%f b=%d, a, b);a=%f b=%d,
17、 a, b); 输出结果为:输出结果为: a=85.560000 b=100a=85.560000 b=100换行符号换行符号 例例: printf(: printf(“a=%fnb=%da=%fnb=%d”,a,b);,a,b);输出结果为:输出结果为: a=85.560000a=85.560000 b=100 b=100域宽和精度域宽和精度例:例:printfprintf(”%5.3f”%5.3f”,a a);第一讲第一讲 简单的简单的C C程序设计程序设计犹蒜挡实脯数杭巢猾蜘巡夹伶惨盐姬徽砌抓猿琢荒入推驴计馆葬挡号串垮一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术
18、系新生第二学期二教C语言程序设计语言程序设计8. 数学函数数学函数 sin(x)x x为弧度,为弧度,double xdouble x,double sin(x)double sin(x) cos(x) cos(x)exp(x) exlog(x) logexlog10(x) log10xfabs(x) xfmod(x,y) 整除整除x/y的余数的余数floor(x) 求不大于求不大于x的最大整数的最大整数pow(x, y) xysqrt(x) x1/2第一讲第一讲 简单的简单的C C程序设计程序设计匈蒜捅付搁惩赠榆斑残扶衍黍坞弦拆滓啤触思川诽粕铣惠刻瞅捧桅瘪廊玲一教学对象计算机科学与技术系新生
19、第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计9. 算术运算符算术运算符 加加 减减 *乘乘 / 除除 % 模(取余数)模(取余数)第一讲第一讲 简单的简单的C C程序设计程序设计烁昧眶批族开堂车持沫蒂潍斑工邦逾尚谓丈衅瓷镁檬放钻物跃农媚戒晌职一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计1.3 1.3 作业作业第一讲第一讲 简单的简单的C C程序设计程序设计俞玫汝恨为般凳芍民脖播暇粥兄唱蛙镁岭蛀铣偏稠火芝丸闺篱搭园壶帚妻一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术
20、系新生第二学期二教C语言程序设计语言程序设计 我们在日常生活中经常需要处理具有两个分支的问题,例我们在日常生活中经常需要处理具有两个分支的问题,例如,如果明天下雨,则在教室内组织活动,否则去野游。如,如果明天下雨,则在教室内组织活动,否则去野游。 在在C C语言中,这类问题需要使用语言中,这类问题需要使用ifif语句解决,而判断操语句解决,而判断操作通常使用关系运算符。作通常使用关系运算符。关系运算符和关系表达式关系运算符和关系表达式 大于大于 = =大于等于大于等于 = = 小于等于小于等于 = =等于等于 != !=不等于不等于第二讲第二讲 分支结构分支结构九鬼帮纫豺渗贮矮涕锌寅糕岗屿蓑桂
21、迫迈券宾躲驼侗银弹覆佣锨芬绕猪殉一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.1 2.1 掌握掌握ifif语句的使用方法语句的使用方法【实例】编写程序,判断输入的整数是否为实例】编写程序,判断输入的整数是否为6 6,若是,显示,若是,显示“RightRight!”和和“Great!Great!”,否则显示,否则显示“WrongWrong!”和和“SorrySorry!”。 1编程思路:编程思路: 要显示要显示“Right“Right!”和和“Great“Great!”,应执行两条语句,应执行两条语句“printf(”Rig
22、ht“printf(”Right!n“);”n“);”和和“printf(”Great“printf(”Great!n“);”n“);”,要显示,要显示“Wrong“Wrong!”和和“Sorry“Sorry!”,执行两条语,执行两条语句句“printf(”Wrong“printf(”Wrong! n“);” n“);”和和“printf(”Sorry“printf(”Sorry!n“);”n“);”。本题需要根据所输入的值(假设赋给。本题需要根据所输入的值(假设赋给a a)是否为)是否为6 6来选择执行相应的两条语句。来选择执行相应的两条语句。 在在C C语言中判断语言中判断a a中的值是否
23、为中的值是否为6 6,使用,使用“if(a=6)”“if(a=6)”形式。形式。 第二讲第二讲 分支结构分支结构申吭默谜枉矾皋疲晰室圣挚嗓台泡至矣彰辖溃兽蔓草芬渍伞督抛笑晕咳癌一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计本实例的流程图如图所示 开始输入a值a=6显 示 “Right!”显 示 “Great!”显 示 “Wrong!”显 示 “Sorry!”结束假真第二讲第二讲 分支结构分支结构诛秽瘫顾跑隐恰糊也代苞分桌奇盔煞擅暗狙徐境乱猎组哮纱姬场摄嗣任槽一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术
24、系新生第二学期二教C语言程序设计语言程序设计本实例的N-S流程图如图所示输入a的值a=6显示“Right!” 显示“Great!” 显示“Wrong!” 显示“Sorry! ” 第二讲第二讲 分支结构分支结构败径抓衫拷琼眠凳剧炙蝗罩箕寝惺敷达撵风墟技癣煤凝枪最袍钾屉铡曼镍一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2 2程序代码程序代码:#include main() int a=0; printf(Input a:); scanf(%d,&a); printf(a=%dn,a); if(a=6)/* if语句开始语句开始
25、*/ printf(Right!n); printf(Great!n); else printf(Wrong!n); printf(Sorry!n); /* if语句结束语句结束 */第二讲第二讲 分支结构分支结构翠诉悼观盏怠泅尝秘舱戮叫镍磁徐豪熙予丘压澳战每半眺捏喳庙静洞格协一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3 3运行结果:运行结果: 第第1 1次运行结果:次运行结果: Input a:6 Input a:6 a=6 a=6 Right Right! Great Great! 第第2 2次运行结果:次运行结果:
26、Input a:5 Input a:5 a=5 a=5 Wrong Wrong! Sorry Sorry!第二讲第二讲 分支结构分支结构猪贯翱凛雾屁郡辈站缩荒理括科塑悲旗竭尘闻卖旦狼晾蝶货鄂易咳葫榨脂一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计4 4归纳分析:归纳分析: (1 1)程序中的)程序中的“a=6a=6”是关系表达式。是关系表达式。用用关关系系运运算算符符把把两两个个C C语语言言表表达达式式连连接接起起来来的的表表达达式式称称为为关关系系表表达达式式。关关系系运运算算的的判判断断结结果果只只有有“真真”或或“假假
27、”两两种种可可能能,关系成立时为关系成立时为“真真”,不成立时为,不成立时为“假假”。关关系系表表达达式式的的值值只只能能是是1 1或或0 0,当当关关系系运运算算的的判判断断结结果果为为“真真”时时,关关系系表表达达式式的的值值为为 1 1,否否则则,关关系系表表达达式式的的值值为为0 0。例例如如,当当a a的的值值为为6 6时时,关关系系表表达达式式“a=6a=6”的的值值为为1 1,当当a a的的值值为为5 5时,关系表达式时,关系表达式“a=6a=6”的值为的值为0 0。第二讲第二讲 分支结构分支结构纹淖嗣驰偶疗嚎馈搔逛井总臻亨鳖辽铡健玉申肄倔滤鸡昂剪隙污里慎橙卿一教学对象计算机科学
28、与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计(2 2)程序中的)程序中的“if(a=6)if(a=6)”是是ifif语句的开始部分。语句的开始部分。 本本例例题题需需要要根根据据“a=6a=6”是是否否为为“真真”来来选选择择执执行行不不同同的的两两个个输输出出语语句句。处处理理两两个个分分支支的的问问题题时时常常使使用用ifif语语句句。ifif语语句句根据其后面括号中表达式的结果,选择执行某个分支程序段。根据其后面括号中表达式的结果,选择执行某个分支程序段。 if if语句的一般形式如下:语句的一般形式如下: if(if(表达式表达式) )
29、 语句组语句组1 1 else else 语句组语句组2 2 “ifif”和和“elseelse”是关键字。当表达式结果为是关键字。当表达式结果为“真真”(即(即不等不等于于0 0)时,执行语句组)时,执行语句组1 1,表达式结果为,表达式结果为“假假”(即等于(即等于0 0)时,)时,执行语句组执行语句组2 2。在语句组。在语句组1 1和语句组和语句组2 2中只能选择执行一组,而中只能选择执行一组,而后执行整个后执行整个ifif语句后面的语句。语句后面的语句。 第二讲第二讲 分支结构分支结构瑶赂捌搓劳意汐废恋书闹摄光铅瑰耸曹蓖拽糙堆每晶呀僧麦雾坊捐敖啸凄一教学对象计算机科学与技术系新生第二学
30、期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计(3) C语言中允许程序中的if语句不带else部分。省略else的if语句一般形式如下: if(表达式) 语句组 此if语句的执行过程: 当表达式结果为“真”时,执行语句组,表达式结果为“假”时,不处理。 第二讲第二讲 分支结构分支结构锨莎充哪鼎取尘桨医扩红斯伶炊辩蝎朱披玲各嫂蹄凡伐榴列韧傈堂塘呛角一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.2学会使用逻辑运算符 处理问题时经常需要同时判断多个条件。例如,在某学生数学和英语成绩中判断是否至少有一
31、门课程是不及格。这时使用逻辑运算符。逻辑运算符共有三种: & 逻辑与 | 逻辑或 ! 逻辑非这3个运算符按高到低的优先级顺序是“!”、“&”、“|” 一般而言,单目运算符优先级较高,赋值运算符优先级低。 算术运算符优先级较高,关系和逻辑运算符优先级较低。 第二讲第二讲 分支结构分支结构剐奔蚊贪承帘除哺浓胁冀梦恐龚煮济谓骡钓害祷垃胺渔纪涎庐殆罢源递反一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计【实例】编写程序,判断某人的体重是否在50公斤至55公斤之间,若在此范围之内,显示“Ok”,否则显示“No”。1编程思路: 先将体重存放
32、在变量w中,要使w的值在50至55范围内,应同时满足“w=50”和“w=50 & w=50”和“w=50 & w=50 & w=55显示“Ok”显示“No”第二讲第二讲 分支结构分支结构法狸琶摧戌保用庐讼闲踌淤费俗唉招炒争歇给井啼畅厕宠跑裔的奉洽搜社一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2 2程序代码:程序代码:#include main() float w=0.0; printf(Input w:); scanf(%f,&w); printf(w=%.1fn,w); if(w=50&w=55) printf(Okn)
33、; else printf(Non);第二讲第二讲 分支结构分支结构性锗酪阶火跌潮墨拢梅沤膳持牺拇柜柠哉得怪龙舰撇弧嘉七逼感栽丘慰波一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3.运行结果:第1次运行结果:Input w:53.5w=53.5Ok第2次运行结果:Input w:60.7w=60.7No第二讲第二讲 分支结构分支结构然连胡蜘削凶周阳荤耍首勋纹寿闻溪雍篮伟兔奶要禽坪蹄疲嗓粒戮掘幻计一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计4 4归纳分析:归纳
34、分析: 程序中的“w=50 & w0且w0 & w0 & w=50 w=50 w=55) /* /* 内嵌内嵌ifif语句开始语句开始 */ */printf(“Okn);printf(“Okn);elseelseprintf(Non);/* printf(Non);/* 内嵌内嵌ifif语句结束语句结束 */ */ else elseprintf(Data over!n);/* printf(Data over!n);/* 外嵌外嵌ifif语句结束语句结束 */ */ 第二讲第二讲 分支结构分支结构磷帝谗候散链纹妖服辕贱苍丰辑懒榴怂现哮惊阻读铅峡噎茸诛肝呢烂痊两一教学对象计算机科学与技术系新
35、生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3 3运行结果:运行结果:第第1 1次运行结果:次运行结果:Input w:Input w:53.553.5 w=53.5w=53.5OkOk第第2 2次运行结果:次运行结果:Input w:Input w:60.760.7 w=60.7w=60.7NoNo第第3 3次运行结果:次运行结果:Input w:Input w:201.7201.7 w=201.7w=201.7Data over!Data over!第二讲第二讲 分支结构分支结构亲趴枪负深断香之渣夯婉羽箍渤宁民掘巍盘唾樟寨抒遂苫萝野其提郴浮屋一教学对
36、象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计4归纳分析:(1)本程序在一个if语句中包含了另一个if语句。在if语句的语句组1或语句组2中又包含另一个分支结构的if语句称为嵌套的if语句。(2)本程序中出现了两次else。 C语法规定,在if语句中,若多次出现else,则每一个else总是与前面最近的if配对,所以本例题中第一个else与内嵌的if配对,第二个else与最上面的if配对。程序中由于采用了缩进格式,if与else的配对关系一目了然。 第二讲第二讲 分支结构分支结构骄钓怔壬哼九藻酚筛频硼俺互拣克盔平新脐亦耍砍胁悬挠墅猎次
37、践弱疏膘一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.42.4学会使用学会使用if-else ifif-else if形式的嵌套形式的嵌套ifif语句语句 【实例】编写程序,求下面分段函数的值,要求【实例】编写程序,求下面分段函数的值,要求x x的值从键盘输的值从键盘输入。入。 x+2 (0x5)y=0 (x0)x2-3 (5x10)10 (x10)第二讲第二讲 分支结构分支结构喝汹灶逐眶畔蚂开箍今仙茫防槽耳蚌自耘砍册旗普摆靶蒲士莱梆贞乐瘟松一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学
38、期二教C语言程序设计语言程序设计1 1编程思路:编程思路: 开始开始输入输入x值值x00结束结束假假真真真真假假显示显示x x和和y y的值的值x55真真假假x1010y=x+2y=10y=x2-3y=0第二讲第二讲 分支结构分支结构臆捏印踏恨箕银白荚厕烩秒千临舷远串四抄仍宪茶寓住物旱护当典柬骗归一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2 2程序代码:程序代码:#include #include main()main() float x=0,y=0;float x=0,y=0;printf(Input x:);print
39、f(Input x:); scanf(%f,&x); scanf(%f,&x); if(x0) if(x0)y=0;y=0; else else if(x5) y=x+2; if(x5) y=x+2; else else if(x10) y=x*x-3; if(x10) y=x*x-3; else y=10; else y=10; printf(x=%f,y=%fn,x,y); printf(x=%f,y=%fn,x,y); 第二讲第二讲 分支结构分支结构挺毅馆貌昭肄慑又乘邀光炸紫鼓鸯综拷榜祷苇涧婚段湃焰酮技钮措啼廓粳一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生
40、第二学期二教C语言程序设计语言程序设计2.5 switch语句 在日常生活中经常遇到菜单选择操作,例如,用ATM自动取款机取钱时,从菜单中可以选择语种、取款额;用自动服务系统给手机充值时,可以选择查余额还是充值,对本机充值还是对其他号码充值等。这些问题一般使用switch语句解决。 总之,这些问题都是多分支情况。第二讲第二讲 分支结构分支结构辞犁奇堪姜兴奢齐捐肄涅讨畏瞒奉沃勺锄涸门斯丝仿答妄肚陷矾孙捉何紫一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计【实实例例】编编写写程程序序,在在如如下下菜菜单单中中选选择择一一个个运运算算
41、类类型型,并并进行相应的运算。如选择了加法,则进行求和运算。进行相应的运算。如选择了加法,则进行求和运算。Please choose Please choose + : addition+ : addition- : subtraction- : subtraction* : multiplication* : multiplication/ : division/ : division第二讲第二讲 分支结构分支结构椒啸欺念和指蛊厩窜冻陕锡亏荷瓢创话柞脓滑铝悼竖约抡篙缄狱嘛瘦鲸韩一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计1
42、 1程序代码:程序代码:#include #include main()main()float a=5.0,b=2.0,c=0.0;float a=5.0,b=2.0,c=0.0;char sym=0;char sym=0;printf(Please choosen);printf(Please choosen);printf(+ : additionn);printf(+ : additionn);printf(- : subtractionn);printf(- : subtractionn);printf(* : multiplicationn);printf(* : multiplic
43、ationn);printf(/ : divisionn);printf(/ : divisionn);sym=getchar();sym=getchar();printf(%f%c%f=,a,sym,b); printf(%f%c%f=,a,sym,b); /* /* 显示算式显示算式 */ */ 第二讲第二讲 分支结构分支结构捐吱廊窑渐徒杆忌胞帧治酉唬勉垒文矗嘱纂鹰吮还沧微姆善捶厄椅夏瞻摄一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计switch(sym) switch(sym) /* /* 计算算式计算算式 */ */
44、case +: c=a+b; break; case +: c=a+b; break; case -: c=a-b; break; case -: c=a-b; break; case *: c=a*b; break; case *: c=a*b; break; case /: c=a/b; break; case /: c=a/b; break; printf(%fn,c); printf(%fn,c); /* /* 显示结果显示结果 */ */ 第二讲第二讲 分支结构分支结构宦烦闷卤谗缄奋龄禾钒奥厚要毕毙匆咆邹空奴咸匠阅朔抱次痔索忱寂钧抵一教学对象计算机科学与技术系新生第二学期二教一教学对
45、象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2 2运行结果:运行结果:Please choosePlease choose+ : addition+ : addition- : subtraction- : subtraction* : multiplication* : multiplication/ : division/ : division/ 5.000000/2.000000=2.5000005.000000/2.000000=2.500000 第二讲第二讲 分支结构分支结构须官淑姐渊吭抱障漓咙寇屁应趣汞雾借凯胆羌颓启朝樱匡终寞恫拱藤导麻一教学对象计算机科学与技术系
46、新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3 3归纳分析:归纳分析:switchswitch语句的一般形式为:语句的一般形式为:switch(switch(表达式表达式) ) case case 表达式表达式1: 1: 语句组语句组1 break;1 break; case case 表达式表达式2: 2: 语句组语句组2 break;2 break; case case 表达式表达式n: n: 语句组语句组n break;n break; default: default: 语句组语句组n+1 break;n+1 break; 其中其中switch
47、switch、casecase、defaultdefault和和breakbreak是关键字,所有表达式均为是关键字,所有表达式均为整型或字符型。在表达式整型或字符型。在表达式1 1、表达式、表达式2 2、表达式、表达式n n中只能出中只能出现常量和运算符,而且每个表达式的值不能相等。现常量和运算符,而且每个表达式的值不能相等。 第二讲第二讲 分支结构分支结构阶富隧搅腐过策版蹲善烦槐浅札君妒针菩遮截蜜矫圆凑饵琳骚乾护宋悦椎一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.6 2.6 条件运算符及其表达式条件运算符及其表达式 C
48、 C语语言言中中条条件件运运算算符符由由“? ?”和和“: :”组组成成,例例如如“ab ab ? ? a a : : b b”。条件表达式的一般形式为:条件表达式的一般形式为:表达式表达式1 1 ?表达式?表达式2 2 :表达式:表达式3 3当当表表达达式式1 1的的值值为为非非0 0时时,以以表表达达式式2 2的的值值作作为为条条件件表表达达式式的的值值,否否则则,以以表表达达式式3 3的的值值作作为为条条件件表表达达式式的的值值。例例如如,当当abab成成立立时时,条条件件表表达达式式“ab ab ? ? a a : : b b”的的值值为为a a中中的的值值,否否则为则为b b中的值。
49、中的值。 使用条件表达式也可以实现分支结构。使用条件表达式也可以实现分支结构。 第二讲第二讲 分支结构分支结构阻不葱险功哉银浩忱信瀑向甘铬则爽瑟精殿罗敷钾盯毫辖恐咆似氨尺货赡一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计课堂讨论:谁做的好事?课堂讨论:谁做的好事? 忻州师院有四位同学中的一位做了好事,不留名,表扬信来忻州师院有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。了之后,校长问这四位是谁做的好事。 A说:不是我。说:不是我。 B说:是说:是C。 C说:是说:是D。 D说:说:C胡说。胡说。
50、 已知三个人说的是已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。画出好事的人。画出N-S流程图并写出程序。流程图并写出程序。第二讲第二讲 分支结构分支结构拇豢踏岭蒜劝辣匝猪弄掺京吸吐扦头贪狐傅天践磊嗣声映拓聘臂巡其花皋一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计1 1 1 1、编程思路:、编程思路:、编程思路:、编程思路: 如何找到该人,一定是如何找到该人,一定是如何找到该人,一定是如何找到该人,一定是“ “先假设该人是做好事者,然后先假设该
51、人是做好事者,然后先假设该人是做好事者,然后先假设该人是做好事者,然后到每句话中去测试看有几句是真话到每句话中去测试看有几句是真话到每句话中去测试看有几句是真话到每句话中去测试看有几句是真话” ”。“ “有三句是真话就确有三句是真话就确有三句是真话就确有三句是真话就确定是该人,否则换下一人再试定是该人,否则换下一人再试定是该人,否则换下一人再试定是该人,否则换下一人再试” ”。 比如,先假定是比如,先假定是比如,先假定是比如,先假定是A A A A同学,让同学,让同学,让同学,让 thisman=A; thisman=A; thisman=A; thisman=A; 代入到四句话中代入到四句话
52、中代入到四句话中代入到四句话中 A A A A说:说:说:说:thisman!=thisman!=thisman!=thisman!= A A A A ; ; ; ; A A A A !=!=!=!= A A A A 假,值为假,值为假,值为假,值为0 0 0 0。 B B B B说:说:说:说:thisman=thisman=thisman=thisman= C C C C ; ; ; ; A A A A = C C C C 假,值为假,值为假,值为假,值为0 0 0 0。 C C C C说:说:说:说:thisman=thisman=thisman=thisman= D D D D ; ;
53、 ; ; A A A A = D D D D 假,值为假,值为假,值为假,值为0 0 0 0。 D D D D说:说:说:说:thisman!=thisman!=thisman!=thisman!= D D D D ; ; ; ; A A A A !=!=!=!= D D D D 真,值为真,值为真,值为真,值为1 1 1 1。显然,不是显然,不是AA做的好事(四个关系表达式值的和为做的好事(四个关系表达式值的和为1 1)第二讲第二讲 分支结构分支结构帜粮狰艰虫檄络榔诫履画送篡担漱亩烷山张谤誉妙瞒订委肯蕊撅它到泻唱一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二
54、学期二教C语言程序设计语言程序设计再试再试再试再试B B B B同学,让同学,让同学,让同学,让thisman=thisman=thisman=thisman= B B B B ; ; ; ;代入到四句话中代入到四句话中代入到四句话中代入到四句话中A A A A说:说:说:说:thisman!=thisman!=thisman!=thisman!= A A A A ; ; ; ; B B B B !=!=!=!= A A A A 真,值为真,值为真,值为真,值为1 1 1 1。 B B B B说:说:说:说:thisman=thisman=thisman=thisman= C C C C ;
55、; ; ; B B B B = C C C C 假,值为假,值为假,值为假,值为0 0 0 0。C C C C说:说:说:说:thisman=thisman=thisman=thisman= D D D D ; ; ; ; B B B B = D D D D 假,值为假,值为假,值为假,值为0 0 0 0。D D D D说:说:说:说:thisman!=thisman!=thisman!=thisman!= D D D D ; ; ; ; B B B B !=!=!=!= D D D D 真,值为真,值为真,值为真,值为1 1 1 1。显然,不是显然,不是BB所为(四个关系表达式值的和为所为(
56、四个关系表达式值的和为2 2)第二讲第二讲 分支结构分支结构拐楞传蔓弦媒神俺盲盒取婶漓鳃轰帝优泅氖综巳台睛凤柱虚百枚昭痪囊抬一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计再试再试再试再试C C C C同学,让同学,让同学,让同学,让thisman=thisman=thisman=thisman= C C C C ; ; ; ;代入到四句话中代入到四句话中代入到四句话中代入到四句话中A A A A说:说:说:说:thisman!=thisman!=thisman!=thisman!= A A A A ; ; ; ; C C C
57、C !=!=!=!= A A A A 真,值为真,值为真,值为真,值为1 1 1 1。 B B B B说:说:说:说:thisman=thisman=thisman=thisman= C C C C ; ; ; ; C C C C = C C C C 真,值为真,值为真,值为真,值为1 1 1 1。 C C C C说:说:说:说:thisman=thisman=thisman=thisman= D D D D ; ; ; ; C C C C = D D D D 假,值为假,值为假,值为假,值为0 0 0 0。 D D D D说:说:说:说:thisman!=thisman!=thisman!=
58、thisman!= D D D D ; ; ; ; C C C C !=!=!=!= D D D D 真,值为真,值为真,值为真,值为1 1 1 1。显然,就是显然,就是C C做了好事(四个关系表达式值之和为做了好事(四个关系表达式值之和为3 3)这时,我可以理出头绪,要用所谓枚举法,一个人一个人地去这时,我可以理出头绪,要用所谓枚举法,一个人一个人地去试,试,四句话中有三句为真,该人即所求。四句话中有三句为真,该人即所求。第二讲第二讲 分支结构分支结构狂拦邯耍糙谐辉帕乳捉勇燃勇座多栋剔诵束乞弘糖霞漳柞隋排叮韩诀瘁幽一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第
59、二学期二教C语言程序设计语言程序设计 循环结构是程序中一种很重要的结构。其特点循环结构是程序中一种很重要的结构。其特点是,是, 在给定条件成立时,反复执行某程序段,直到在给定条件成立时,反复执行某程序段,直到条件不成立为止。条件不成立为止。 给定的条件称为循环条件,反复给定的条件称为循环条件,反复执行的程序段称为循环体。执行的程序段称为循环体。 语言提供了三种循环语言提供了三种循环语句,可以组成各种不同形式的循环结构语句,可以组成各种不同形式的循环结构, ,它们是它们是: : 语句语句 语句语句 语句语句第三讲第三讲 循环结构循环结构罗幂遥肃斧勃沙馁镭俺灼瓤棉褂禽沃粤脂薪柠孩纳涧喀晴囊枢坤卑兜
60、席粗一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3.1 3.1 简单循环简单循环【实例】古典问题:有一对兔子,从出生后第【实例】古典问题:有一对兔子,从出生后第3 3个月起每个月都个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?如兔子都不死,问每个月的兔子总数为多少?1.1.程序分析:兔子的规律为数列程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.1,1,2,3,5,8,13,21.该数列的规律为该
61、数列的规律为 a a1 1=1=1 a a2 2=1=1 a an n=a=an-1n-1+a+an-2n-2 这里求前这里求前2020项项第三讲第三讲 循环结构循环结构鞠芳古汐偿整猿着翰疹档臃征侈到帆扎诧营械制鳞褪碉剁重富廉鳃娇划株一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计i=20a1=1;a2=1; i=3an=a1+a2输出ani=i+1;a1=a2;a2=an;YendbeginN第三讲第三讲 循环结构循环结构笑吉内篡莆墩救割契闽蒸碉顾蛀拖槽烤事竟酗眺卤馏昭岗桑聪嘱晕咬石缨一教学对象计算机科学与技术系新生第二学期二
62、教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计该题目的该题目的N-SN-S流程图流程图a1=1;a2=1;an=0;i=20an=a1+a2输出ani=i+1a1=a2a2=an第三讲第三讲 循环结构循环结构语产蛋暖垮益魏男瞎门阶攒镊锅挝造类王勘獭闺竿泪纠琉牛守良杖链召栗一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.程序源代码:方法一:for循环语句#include stdio.h#include stdio.hmain( )main( )long a1,a2,an;long a1,a2,an;i
63、nt i;int i;a1=a2=1;a1=a2=1;for(i=3;i=20;i+)for(i=3;i=20;i+) an=a1+a2; an=a1+a2; printf(“a%d=%ld”,i,an); printf(“a%d=%ld”,i,an); a1=a2; a1=a2; a2=an; a2=an; 可否调换?第三讲第三讲 循环结构循环结构酪顶万陆耻发利烂攀维绚聂捐留梨分逼熙腆瘟读瘴践铭诚糯胯改焙塔林勇一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计方法二:while循环语句#include stdio.h#inclu
64、de stdio.hmain( )main( )long a1,a2,an;long a1,a2,an;int i;int i;a1=a2=1;i=3a1=a2=1;i=3; while while(i=20i=20) an=a1+a2; an=a1+a2; printf(“a%d=%ld”,i,an); printf(“a%d=%ld”,i,an); a1=a2; a1=a2; a2=an; a2=an; i+; i+; 第三讲第三讲 循环结构循环结构论祝赶兽巳窒储侨何霄伏坊放由烽宰伦贬痔拓恤劈襄弧斯贴锡锻菱秧确迈一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第
65、二学期二教C语言程序设计语言程序设计方法三:do-while循环语句#include stdio.h#include stdio.hmain( )main( )long a1,a2,an;long a1,a2,an;int i;int i;a1=a2=1;i=3a1=a2=1;i=3; do do an=a1+a2; an=a1+a2; printf(“a%d=%ld”,i,an); printf(“a%d=%ld”,i,an); a1=a2; a1=a2; a2=an; a2=an; i+; i+; whilewhile(i=20);i=20);第三讲第三讲 循环结构循环结构呐毖遵蚂偷辰链盟
66、打网颤刑勒构萨肿淋缕髓半婿氛择倍概惕挠岩亲橙食讽一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3.3.归纳分析归纳分析(1 1)forfor语句格式:语句格式: for ( for ( 表达式表达式1 ; 1 ; 表达式表达式2 ; 2 ; 表达式表达式3 ) 3 ) 语句语句 即:即: for ( for (循环变量赋初值循环变量赋初值 , , 循环结束条件循环结束条件 , , 循环变量增值循环变量增值 ) ) 语句语句 第三讲第三讲 循环结构循环结构盒翼桐下漾疮戏浦牛倍勾初嚣些寿蒂膛计壮矛攘栽棱土耙榆耳钎傈膘会朔一教学对象
67、计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计ForFor语句执行过程语句执行过程表达式1 表达式2 表达式3 语 句 YN第三讲第三讲 循环结构循环结构幸疗寨强坯润挥锚吠箔绦凌泄注丰痒枢汪毫莉照撤解误螟软仍慕尺轻吨雕一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计表达式可以省略,但分号不能省略表达式可以省略,但分号不能省略a) a) 省略表达式省略表达式1 1 i=1 i=1 for ( for ( ;i=50 i=50 ;i+ ) sum=sum+2*ii+ ) su
68、m=sum+2*ib) b) 省略表达式省略表达式22产生死循环产生死循环 for ( i=1 for ( i=1; ;i+ ) sum=sum+2*ii+ ) sum=sum+2*ic) c) 省略表达式省略表达式3 3 for ( i=1 for ( i=1;i=50 i=50 ;) ) sum=sum+2*i; i+; sum=sum+2*i; i+;d) d) 省略表达式省略表达式1 , 1 , 省略表达式省略表达式3 3 i=1 i=1 for ( for ( ;i=50 i=50 ;) ) sum=sum+2*i; i+; sum=sum+2*i; i+; 第三讲第三讲 循环结构循
69、环结构测岗汹佯泊矾来联毛鸥菠极渡匈武四婪盾茂丑宠颓久域瓜阀滨悉揩履卸沉一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计表达式表达式1 1,表达式,表达式3 3可以是:可以是: a) a) 简单的表达式简单的表达式 b) b)逗号表达式逗号表达式表达式表达式2 2 一般是关系表达式或逻辑表达式一般是关系表达式或逻辑表达式例:例:for ( sum=0 for ( sum=0 , , i=1 ; i=50 ; i+ i=1 ; i=50 ; i+, ,i+ )i+ ) sum=sum+2*i; sum=sum+2*i;或:或:for
70、 ( sum=0 for ( sum=0 , , i=1 ; i=50 ; i=i+2 ) i=1 ; i=50 ; i=i+2 ) sum=sum+2*i sum=sum+2*i第三讲第三讲 循环结构循环结构捻捅膘攘边毒霍碗砒竟袍窖颅姑蒜豺势佑茹焉羽蹦吞托具羊绎恤枚迢聘衫一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计(2) while(2) while语句的一般形式为:语句的一般形式为: while( while(表达式表达式) ) 语句;语句; 其中表达式是循环条件,语句为循环体。其中表达式是循环条件,语句为循环体。whi
71、lewhile语句的语义是:语句的语义是: 计算表达式的值,当值为真计算表达式的值,当值为真( (非非0)0)时,执行循环体语句。时,执行循环体语句。第三讲第三讲 循环结构循环结构腔婶壮奉殆酷躯牺垮祝掖帮洽才昨役搞咸佯寞谩西卢灰落娘黑履混积峨殉一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计使用使用whilewhile语句应注意以下几点:语句应注意以下几点:1.while1.while语句中的表达式一般是关系表达或逻辑表达式,只语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真要表达式的值为真( (非非0)0)即可继续
72、循环。即可继续循环。2.2.循环体如包括有一个以上的语句,则必须用循环体如包括有一个以上的语句,则必须用括起来,括起来, 组成复合语句。组成复合语句。3.3.应注意循环条件的选择以避免死循环应注意循环条件的选择以避免死循环, ,一般需要在循环体一般需要在循环体中动态改变循环条件的值。中动态改变循环条件的值。第三讲第三讲 循环结构循环结构茶敏督对葛篷篓客逃院郡矩骨发埔搬氛意善警泣惹糙粘令痕艺希眶疏疮邹一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计(3) do-while(3) do-while语句的一般形式为:语句的一般形式为:
73、 dodo语句;语句; while(while(表达式表达式) ); 其中语句是循环体,表达式是循环条件。其中语句是循环体,表达式是循环条件。do-whiledo-while语句的语义是:语句的语义是:先执行循环体语句一次,先执行循环体语句一次, 再判别表达式的值,若为真再判别表达式的值,若为真( (非非0)0)则继续循环,否则终止循环。则继续循环,否则终止循环。do-whiledo-while语句和语句和whilewhile语句的区别在于语句的区别在于do-whiledo-while是先执行后是先执行后判断,因此判断,因此do-whiledo-while至少要执行一次至少要执行一次循环体。而
74、循环体。而whilewhile是先是先判断后执行,如果条件不满足,则一次循环体语句也不执行。判断后执行,如果条件不满足,则一次循环体语句也不执行。第三讲第三讲 循环结构循环结构疡唆羔芽疯躺聋跑摸清号雄晤艰唾鼻遵谴栅宙左莲衙侨劲滑乒朗饱雌晶谱一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计(4)(4)循环体语句可使用breakbreak 和continuecontinue语句breakbreak:可以用来从循环体内跳出循环体(提前结束循环)continuecontinue:用于跳过循环体中下面尚未执行的语句,接着重新执行循环的判断
75、例:输出100以内能被7整除的数。 int n;int n;for(n=7;n=100;n+)for(n=7;n=100;n+) if (n%7!=0)if (n%7!=0)continue;continue;printf(%d ,n);printf(%d ,n); 第三讲第三讲 循环结构循环结构叹乱靠松梆土浙掀刽厘槛毅卯扼灾亏掘恳鸳保拣淬浓美轰锻署红骆狈俄乃一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计练习:练习:1.1.有一分数序列:有一分数序列:2/12/1,3/23/2,5/35/3,8/58/5,13/813/8,2
76、1/13.21/13.求出这个数列的前求出这个数列的前2020项之和。项之和。2.2.求求1+2!+3!+.+20!1+2!+3!+.+20!的和。的和。3.3.用牛顿切线法求用牛顿切线法求x-sin(x)=0x-sin(x)=0在区间(在区间(0 0,)之间的解。)之间的解。4.4.任意输入两个数,求这两个数的最大公约数。任意输入两个数,求这两个数的最大公约数。5.5.从键盘输入一个数判断其是否为素数。从键盘输入一个数判断其是否为素数。第三讲第三讲 循环结构循环结构机寐膛淌叠韧阵违惋好昨侩落倦郝随湖抄芭窿臼枝瓢敛险粪穷幽漆誉摈逢一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学
77、与技术系新生第二学期二教C语言程序设计语言程序设计作业:作业:1.1.求求s=a+aa+aaa+aaaa+aa.as=a+aa+aaa+aaaa+aa.a的值,其中的值,其中a a是一个数字。例是一个数字。例如如2+22+222+2222+22222(2+22+222+2222+22222(此时共有此时共有5 5个数相加个数相加) ),几个数相,几个数相加由键盘输入控制。加由键盘输入控制。2.2.一球从一球从100100米高度自由落下,每次落地后反跳回原高度的米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第一半;再落下,求它在第1010次落地时,共经过多少米?第次落地时,共经过多
78、少米?第1010次反弹多高?次反弹多高?3.3.求求1+2!+3!+.+20!1+2!+3!+.+20!的和的和4.4.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第下的一半零一个。到第1010天早上想再吃时,见只剩下一个天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?桃子了。求第一天共摘了多少?第三讲第三讲 循环结
79、构循环结构捡给宪甭亢霸湛辜喊扳丁渡翠凭盟质共外盅喇念痪锌练沦舔孕染剃效插淫一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3.23.2循环的嵌套使用循环的嵌套使用【实例】【实例】 搬砖问题。搬砖问题。3636块砖,块砖,3636人搬,男搬人搬,男搬4 4,女搬,女搬3 3,两,两个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干?1.1.分析分析: : 列方程列方程, ,得出问题条件得出问题条件: : w+m+c=36 w+m+c=36 4*m+3*w+c/2=36 4*m+3*
80、w+c/2=36 可以用枚举的方法,让变量可以用枚举的方法,让变量w w在在09 09 、m m在在012 012 、c c在在036036的偶数中取值,形成满足上述条件的的偶数中取值,形成满足上述条件的w w 、m m、c c的组合的组合第三讲第三讲 循环结构循环结构庙专脊茂涯捞挟非娠瘸栗盒亲脖膘已睫逛城剥耿杉领捉栖强肪弊仆面妇搐一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计N-SN-S流程图流程图m9w12c=36-m-w且c%2=04*m+3*w+c/2=36输出m、w、cTrueFalsew=0w=w+1;m=m+1;
81、m=0第三讲第三讲 循环结构循环结构物兑别柱瓤驶匣病寒弗沈质汇屈任陡祁刺裳厘姬榔屯整掸卑谜呼忆咕湖浆一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.2.程序程序mainmain()()int m,w,c;int m,w,c; for(m=0;m9;m+) for(m=0;m9;m+) for(w=0;w12;w+) for(w=0;w12;w+) c=36-w-m; c=36-w-m; if(c%2!=0)continue; if(c%2!=0)continue; if(4*m+3*w+c/2=36) if(4*m+3*w+
82、c/2=36) printf( printf(“m=%d,w=%d,c=%dm=%d,w=%d,c=%d”,m,w,c);,m,w,c); 第三讲第三讲 循环结构循环结构度厅顿剧拖妥琳添诬言漫稀贫区哗每图咕吸嫌袒笼嗅两叭欺蛾时摄砾笆萝一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计练习:练习:1.1.输出输出9*99*9口诀。口诀。2.2.判断判断101-200101-200之间有多少个素数,并输出所有素之间有多少个素数,并输出所有素数。数。3.3.打印出所有的打印出所有的“水仙花数水仙花数”,所谓,所谓“水仙花数水仙花数”是指
83、一个三位数,其各位数字立方和等于该数是指一个三位数,其各位数字立方和等于该数本身。例如:本身。例如:153153是一个是一个“水仙花数水仙花数”,因为,因为153=1153=1的三次方的三次方5 5的三次方的三次方3 3的三次方。的三次方。第三讲第三讲 循环结构循环结构扒询狡搽鸭驯齐夫霞择篷耳去圣起藕须智鸭众捐像招锐脑躲内朝刽呕汀哈一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计作业:作业:1.1.将一个正整数分解质因数。例如:输入将一个正整数分解质因数。例如:输入90,90,打印出打印出90=2*3*3*590=2*3*3*5
84、。程序分析:对程序分析:对n n进行分解质因数,应先找到一个最小的质数进行分解质因数,应先找到一个最小的质数k k,然,然后按下述步骤完成:后按下述步骤完成: (1)(1)如果这个质数恰等于如果这个质数恰等于n n,则说明分解质因数的过程已经结束,则说明分解质因数的过程已经结束,打印出即可。打印出即可。(2)(2)如果如果nknk,但,但n n能被能被k k整除,则应打印出整除,则应打印出k k的值,并用的值,并用n n除以除以k k的商的商, ,作为新的正整数你作为新的正整数你n,n,重复执行第一步。重复执行第一步。(3)(3)如果如果n n不能被不能被k k整除,则用整除,则用k+1k+1
85、作为作为k k的值的值, ,重复执行第一步。重复执行第一步。2.2.一个数如果恰好等于它的因子之和,这个数就称为一个数如果恰好等于它的因子之和,这个数就称为“完数完数”。例如例如6=16=12 23.3.编程找出编程找出10001000以内的所有完数。以内的所有完数。第三讲第三讲 循环结构循环结构甲艰朴借悟妨甜汝豢阴酮沛鞘装死酬至胺班树蝴搐焦邱叮湘尹赋敝董虐采一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计课堂讨论:课堂讨论:五位跳水高手将参加十米高台跳水决赛,有好事者让五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力
86、预测比赛结果。五个人据实力预测比赛结果。 A A选手说:选手说:B B第二,我第三;第二,我第三;B B选手说:我第二,选手说:我第二,E E第四;第四;C C选手说:我第一,选手说:我第一,D D第二;第二;D D选手说:选手说:C C最后,我第三;最后,我第三;E E选手说:我第四,选手说:我第四,A A第一;第一; 决赛成绩公布之后,每位选手的预测都只说对了一半,决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请编程解出比赛的实际名次。即一对一错,请编程解出比赛的实际名次。第三讲第三讲 循环结构循环结构侩蚤漂汗影膏撼滩敷蹿芦铅傈代坞炕国嘎聪羡杯四俊淀卖闷希院格矩步抹一教学对象
87、计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计思路:思路:思路:思路:1 1 首先是将五个人的预测写成逻辑表达式:首先是将五个人的预测写成逻辑表达式:让关系运算符让关系运算符“=”的含义是的含义是“是是”。让数字让数字1 1、2 2、3 3、4 4、5 5分别表示名次第一、第二,分别表示名次第一、第二,第,第五五。 让整型变量让整型变量A A、B B、C C、D D、E E分别表示每个选手所得名次。分别表示每个选手所得名次。 A A选手说:选手说:B=2B=2,A=3A=3;B B选手说:选手说:B=2B=2,E=4E=4;C C选手说
88、:选手说:C=1C=1,D=2D=2;D D选手说:选手说:C=5C=5,D=3D=3;E E选手说:选手说:E=4E=4,A=1A=1;第三讲第三讲 循环结构循环结构削量桌赤葱评来是鸭民箭牡柄斗挡歧哨翘庆血许缓轮瑶幅丸休想来护葛坯一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2 2 考虑到每个人说的话是一对一错,即一真一假,比如考虑到每个人说的话是一对一错,即一真一假,比如A A说说的,若的,若B=2B=2为真,则为真,则A=3A=3为假,为真取值为为假,为真取值为1 1,为假取值,为假取值为为0 0,则两个关系表达式之和必
89、为,则两个关系表达式之和必为1 1。即即(B=2)+(A=3)(B=2)+(A=3)应该是应该是1 1 我们可以归纳出要同时满足五个人所说的话都符合一半对一我们可以归纳出要同时满足五个人所说的话都符合一半对一半错的条件是半错的条件是ta=(B=2)+(A=3)=1; ta=(B=2)+(A=3)=1; 符合符合A A选手的话,则选手的话,则tata为为1 1tb=(B=2)+(E=4)=1; tb=(B=2)+(E=4)=1; 符合符合B B选手的话,则选手的话,则tbtb为为1 1tc=(C=1)+(D=2)=1; tc=(C=1)+(D=2)=1; 符合符合C C选手的话,则选手的话,则t
90、ctc为为1 1td=(C=5)+(D=3)=1; td=(C=5)+(D=3)=1; 符合符合D D选手的话,则选手的话,则tdtd为为1 1te=(E=4)+(A=1)=1; te=(E=4)+(A=1)=1; 符合符合E E选手的话,则选手的话,则tete为为1 1第三讲第三讲 循环结构循环结构疹添却啸屡蚕硕瓮疮渤另正鸯蹦碾喳幻桔窑奎淬蝗腔巢领榨侠毛渝组端培一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3.3.仍然可以用枚举的方法,让变量仍然可以用枚举的方法,让变量A A、B B、C C、D D、E E在在1515中取中
91、取值,形成满足上述条件且值,形成满足上述条件且A A、B B、C C、D D、E E取值均不同的取值均不同的AEAE的组合,即是所求。的组合,即是所求。可以考虑可以考虑A A、B B、C C、D D、E E取值均不同的条件为取值均不同的条件为 A *B*C*D*E=120 A *B*C*D*E=120第三讲第三讲 循环结构循环结构潘酱芹态遍涣机喊夜误纬陕叔岁氓陶翘姓雁相洞丰渍谴肾儿捏犊宵膨狰三一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计第三讲第三讲 循环结构循环结构For(A=1;A=5;A+)For(B=1;B=5;B+)
92、For(C=1;C=5;C+)For(D=1;D=5;D+)E=15-(A+B+C+D)A*B*C*D*E=120求ta、tb、tc、td、tet=ta+tb+tc+td+tet=5输出ABCDETrueTrueFalseFalse呵契囚鸣戚摹峭睡赡羡乱堵薪请睫俞薛琉封嗡毡万混笔腔埃唐捂勾臣尖撒一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计作业作业: : 某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: 1 1)A A、B B至少有一人作案;至少有一人作案; 2 2)A A、D
93、D不可能是同案犯;不可能是同案犯; 3 3)A A、E E、F F三人中至少有两人参与作案;三人中至少有两人参与作案; 4 4)B B、C C或同时作案,或与本案无关;或同时作案,或与本案无关; 5 5)C C、D D中有且仅有一人作案;中有且仅有一人作案; 6 6)如果)如果D D没有参与作案,则没有参与作案,则E E也不可能参与作案。也不可能参与作案。 试编一程序,将作案人找出来。试编一程序,将作案人找出来。第三讲第三讲 循环结构循环结构茅缚赢颧熄虫囊吭舔浙荫氟臃同舱朽粉障查技否恒烘敲缴醇捻熊院凛老暗一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C
94、语言程序设计语言程序设计1 1 1 1 案情分析:将案情的每一条写成逻辑表达式,第一条用案情分析:将案情的每一条写成逻辑表达式,第一条用案情分析:将案情的每一条写成逻辑表达式,第一条用案情分析:将案情的每一条写成逻辑表达式,第一条用CC1CC1CC1CC1表示,第二条用表示,第二条用表示,第二条用表示,第二条用CC2CC2CC2CC2表示,表示,表示,表示,CC1CC1CC1CC1:A A A A和和和和B B B B至少有一人作案至少有一人作案至少有一人作案至少有一人作案 令令令令A A A A变量表示变量表示变量表示变量表示A A A A作案作案作案作案 B B B B变量表示变量表示变量
95、表示变量表示B B B B作案作案作案作案 A A A AB B B BCC1 CC1 CC1 CC1 0 0 0 00 0 0 00 0 0 0 1 1 1 10 0 0 01 1 1 1 0 0 0 01 1 1 11 1 1 1 1 1 1 11 1 1 11 1 1 1 显然这是或的关系,因此有显然这是或的关系,因此有显然这是或的关系,因此有显然这是或的关系,因此有CC1=(A|B)CC1=(A|B)CC1=(A|B)CC1=(A|B)第三讲第三讲 循环结构循环结构插皖点籍锚淘胞晶低地娱插嘉悟饿头浅晒谚缠牵虑钝硷俏掏希醇剩呸炙子一教学对象计算机科学与技术系新生第二学期二教一教学对象计算
96、机科学与技术系新生第二学期二教C语言程序设计语言程序设计CC2CC2CC2CC2:A A A A和和和和D D D D不可能是同案犯不可能是同案犯不可能是同案犯不可能是同案犯 可以分析为:可以分析为:可以分析为:可以分析为: A A A A如果是案犯,如果是案犯,如果是案犯,如果是案犯,D D D D一定不是案犯,写成一定不是案犯,写成一定不是案犯,写成一定不是案犯,写成A&(!D) DA&(!D) DA&(!D) DA&(!D) D如果是案犯,如果是案犯,如果是案犯,如果是案犯,A A A A一定不是案犯,写成一定不是案犯,写成一定不是案犯,写成一定不是案犯,写成D&(!A) D&(!A)
97、D&(!A) D&(!A) 这两者之间是或的关系,因此有这两者之间是或的关系,因此有这两者之间是或的关系,因此有这两者之间是或的关系,因此有 CC2=!(A&D)CC2=!(A&D)CC2=!(A&D)CC2=!(A&D) A A A AD D D D A&D A&D A&D A&D CC2 CC2 CC2 CC2 1 1 1 10 0 0 0 0 0 0 0 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 1 1 1 1 0 0 0 01 1 1 1 0 0 0 0 1 1 1 1第三讲第三讲 循环结构循环结构就猪将
98、鼓莱榜驾漆拂亨饭林忱琼谷赚濒扁氏奈毫操案证吗陇肪揩迸烃徘谍一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计CC3CC3CC3CC3:A A A A、E E E E、F F F F中有两人涉嫌作案,分析有三种可中有两人涉嫌作案,分析有三种可中有两人涉嫌作案,分析有三种可中有两人涉嫌作案,分析有三种可能能能能 第一种,第一种,第一种,第一种,A A A A和和和和E E E E作案,(作案,(作案,(作案,(A&EA&EA&EA&E) 第二种,第二种,第二种,第二种,A A A A和和和和F F F F作案,(作案,(作案,(作案,
99、(A&FA&FA&FA&F) 第三种,第三种,第三种,第三种,E E E E和和和和F F F F作案,(作案,(作案,(作案,(E&FE&FE&FE&F) 这三种可能性是或的关系,这三种可能性是或的关系,这三种可能性是或的关系,这三种可能性是或的关系,因此有因此有因此有因此有 CC3= (A&ECC3= (A&ECC3= (A&ECC3= (A&E)|(A&FA&FA&FA&F)|(E&F)E&F)E&F)E&F)第三讲第三讲 循环结构循环结构阁猩球搬狸鲤佛硼驹酒怔珍涅屎窝逐珐慨劣临嘘善佑圆洋赛茬焙斋辙哥贼一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二
100、教C语言程序设计语言程序设计CC4CC4CC4CC4:B B B B和和和和C C C C或同时作案,或都与本案无关或同时作案,或都与本案无关或同时作案,或都与本案无关或同时作案,或都与本案无关 第一种情况:同时作案(第一种情况:同时作案(第一种情况:同时作案(第一种情况:同时作案(B & CB & CB & CB & C) 第二种情况:都与本案无关(第二种情况:都与本案无关(第二种情况:都与本案无关(第二种情况:都与本案无关(!B & !C!B & !C!B & !C!B & !C) 两者为或的关系,因此有两者为或的关系,因此有两者为或的关系,因此有两者为或的关系,因此有 CC4=(B &
101、C)|(!B & !C)CC4=(B & C)|(!B & !C)CC4=(B & C)|(!B & !C)CC4=(B & C)|(!B & !C)CC5CC5CC5CC5:C C C C、D D D D中有且仅有一人作案中有且仅有一人作案中有且仅有一人作案中有且仅有一人作案 CC5=(C & !D)|(D & !C)CC5=(C & !D)|(D & !C)CC5=(C & !D)|(D & !C)CC5=(C & !D)|(D & !C)CC6CC6CC6CC6:如果如果如果如果D D D D没有参与作案,则没有参与作案,则没有参与作案,则没有参与作案,则E E E E也不可能参与作案。
102、也不可能参与作案。也不可能参与作案。也不可能参与作案。CC6=!D !E=D|!ECC6=!D !E=D|!ECC6=!D !E=D|!ECC6=!D !E=D|!E第三讲第三讲 循环结构循环结构凶嫂缕里寸瓢加悬拔栗育纤搏缚乳咖益蔷宇趟码医夫张机射剑纂铣绷珐咐一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2 2 2 2 采取枚举方法,枚举什么呢?采取枚举方法,枚举什么呢?采取枚举方法,枚举什么呢?采取枚举方法,枚举什么呢? 枚举组合。枚举组合。枚举组合。枚举组合。 6 6 6 6个人每个人都有作案或不作案两种可个人每个人都有作
103、案或不作案两种可个人每个人都有作案或不作案两种可个人每个人都有作案或不作案两种可能,因此有能,因此有能,因此有能,因此有2 2 2 26 6 6 6种组合,从这些组合中挑出符合种组合,从这些组合中挑出符合种组合,从这些组合中挑出符合种组合,从这些组合中挑出符合6 6 6 6条条条条分析的作案者。分析的作案者。分析的作案者。分析的作案者。 定义定义定义定义6 6 6 6个整数变量,分别表示个整数变量,分别表示个整数变量,分别表示个整数变量,分别表示6 6 6 6个个个个人人人人A A A A,B B B B,C C C C,D D D D,E E E E,F F F F。 枚举每个人的可能性枚举
104、每个人的可能性枚举每个人的可能性枚举每个人的可能性: : : : 让让让让0 0 0 0表示不是罪犯;表示不是罪犯;表示不是罪犯;表示不是罪犯; 让让让让1 1 1 1表示就是罪犯。表示就是罪犯。表示就是罪犯。表示就是罪犯。第三讲第三讲 循环结构循环结构靴棉费店窖绸辨他阶阜稻覆享滓涵羡阐徒缔栗泼挡赛诊临珍莽姥丫幽胖拇一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计第三讲第三讲 循环结构循环结构for(A=0;A=1;A+)for(B=0;B=1;B+)for(C=0;C=1;C+)for(D=0;D=1;D+)for(E=0;E
105、=1;E+)for(F=0;F=1;F+)计算CC1 CC2 CC3 CC4 CC5 CC6判断这些值是否都为1TrueFalse输出ABCDEF为1的拘钾窒吵吸联赐翰俄鞭掂惋玩拟夏好蒲锗坡岭宜致囚叹责访舱膏翁训峙琅一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计问题:哪只羊最重?问题:哪只羊最重? 中秋佳节,有贵客来到草原,主人要从羊群中中秋佳节,有贵客来到草原,主人要从羊群中中秋佳节,有贵客来到草原,主人要从羊群中中秋佳节,有贵客来到草原,主人要从羊群中选一只肥羊宴请宾客,当然要选最重者。这样选一只肥羊宴请宾客,当然要选最重
106、者。这样选一只肥羊宴请宾客,当然要选最重者。这样选一只肥羊宴请宾客,当然要选最重者。这样就要记录每只羊的重量,如果有成千上万只羊,就要记录每只羊的重量,如果有成千上万只羊,就要记录每只羊的重量,如果有成千上万只羊,就要记录每只羊的重量,如果有成千上万只羊,不可能用一般变量来记录。可以用带有下标的不可能用一般变量来记录。可以用带有下标的不可能用一般变量来记录。可以用带有下标的不可能用一般变量来记录。可以用带有下标的变量,也就是这里要讲的变量,也就是这里要讲的变量,也就是这里要讲的变量,也就是这里要讲的数组数组数组数组。第四讲第四讲 数组数组聂蛋蕴级雄制蝴搽擎惹赣迹绒钝蘸削淤显暑开悸淖捷钾泪低蹄宣
107、谦坪会荚一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计1.1.程序分析:程序分析:max=0.0 将记录最重的羊的重量for(i=0;i10;i+)提示输入第i只羊的重量输入第i只羊的重量sheepimaxsheepiYesNomax=sheepik=i输出max和k的值第四讲第四讲 数组数组掏楔茁朽肪书筏祈迎颠阀谍贫蔑希峻养庐恶薛瞎虐寇诫挺闷琉拜碱盆狱盈一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.2.程序程序main()main()main()main
108、()/ / / / 主函数主函数主函数主函数 float sheep10;float sheep10;float sheep10;float sheep10;/ / / / 数组,有数组,有数组,有数组,有10101010个浮点类型元素个浮点类型元素个浮点类型元素个浮点类型元素float max;float max;float max;float max;/ / / / 浮点类型变量,存放最肥羊的重量浮点类型变量,存放最肥羊的重量浮点类型变量,存放最肥羊的重量浮点类型变量,存放最肥羊的重量int i,k; /int i,k; /int i,k; /int i,k; /整型变量,整型变量,整型变
109、量,整型变量,i i i i用于计数循环,用于计数循环,用于计数循环,用于计数循环,k k k k用于记录最肥羊的号用于记录最肥羊的号用于记录最肥羊的号用于记录最肥羊的号max = 0.0;max = 0.0;max = 0.0;max = 0.0;/ / / / 赋初值赋初值赋初值赋初值0 0 0 0 for ( i=0; i10; i=i+1 )for ( i=0; i10; i=i+1 )for ( i=0; i10; i=i+1 )for ( i=0; i10; i=i+1 )/ / / / 计数循环计数循环计数循环计数循环 printf( printf( printf( printf
110、(“ “请输入羊的重量请输入羊的重量请输入羊的重量请输入羊的重量sheep%d=sheep%d=sheep%d=sheep%d=” ”, i);, i);, i);, i); scanf( scanf( scanf( scanf(“ “%f%f%f%f” ”, &(sheepi);, &(sheepi);, &(sheepi);, &(sheepi); if ( max sheepi ) if ( max sheepi ) if ( max sheepi ) if ( max sheepi ) max = sheepi; max = sheepi; max = sheepi; max = sh
111、eepi;/ / / / 让第让第让第让第i i i i只羊为当前最肥羊只羊为当前最肥羊只羊为当前最肥羊只羊为当前最肥羊 k=i; k=i; k=i; k=i; printf(printf(printf(printf(“ “max=%fn number=%dnmax=%fn number=%dnmax=%fn number=%dnmax=%fn number=%dn” ”, max , k);, max , k);, max , k);, max , k);第四讲第四讲 数组数组粥展粕桑户御琵趋葬翠披掐灶辛僵俄酒镐抬附捞疵支戳冠业冶叁带界燃顺一教学对象计算机科学与技术系新生第二学期二教一教学对
112、象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3.3.归纳分析归纳分析(1)(1)数组的定义数组的定义 类型说明符类型说明符数组名数组名 常量表达式常量表达式 例:例:float sheep10; float sheep10; int a20011000; int a20011000; 说明说明 数组名的第一个字符应为英文字母;数组名的第一个字符应为英文字母; 用方括号将常量表达式括起;用方括号将常量表达式括起; 常量表达式定义了数组元素的个数;常量表达式定义了数组元素的个数;第四讲第四讲 数组数组鸳黔像革码姬也瘪掏翠郭粘系情屯爽析迈谬颇愧唯以跌晕杯伏蛀的秸荷待一教学对象计算机
113、科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计数组下标从数组下标从数组下标从数组下标从0 0 0 0开始。如果定义开始。如果定义开始。如果定义开始。如果定义5 5 5 5个元素,是从第个元素,是从第个元素,是从第个元素,是从第0 0 0 0个元个元个元个元素至第素至第素至第素至第4 4 4 4个元素;个元素;个元素;个元素; 例如例如例如例如int a5 int a5 int a5 int a5 定义了定义了定义了定义了5 5 5 5个数组元素如下:个数组元素如下:个数组元素如下:个数组元素如下: a0, a1, a2, a3, a4 a0,
114、 a1, a2, a3, a4 a0, a1, a2, a3, a4 a0, a1, a2, a3, a4 这是这是这是这是5 5 5 5个带下标的变量,这个带下标的变量,这个带下标的变量,这个带下标的变量,这5 5 5 5个变量的类型是相同的个变量的类型是相同的个变量的类型是相同的个变量的类型是相同的 常量表达式中不允许包含变量;常量表达式中不允许包含变量;常量表达式中不允许包含变量;常量表达式中不允许包含变量; 例如例如例如例如int n; int n; int n; int n; n = 5; n = 5; n = 5; n = 5; int an; int an; int an; in
115、t an;不合法!不合法!不合法!不合法!第四讲第四讲 数组数组床基同句藻级夫椒策曳猎侦障潍伞袋澡轴撼逢纯顾舒喂搏秘乞普合胺竟出一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计(2)(2)数组初始化数组初始化数组初始化数组初始化 是定义数组完成赋初值的任务是定义数组完成赋初值的任务是定义数组完成赋初值的任务是定义数组完成赋初值的任务 例如例如例如例如 int a5 = 3, 5, 4, 1, 2 ; int a5 = 3, 5, 4, 1, 2 ; int a5 = 3, 5, 4, 1, 2 ; int a5 = 3, 5,
116、4, 1, 2 ; a a a aa0 = 3; a1 = 5; a2 = 4; a0 = 3; a1 = 5; a2 = 4; a0 = 3; a1 = 5; a2 = 4; a0 = 3; a1 = 5; a2 = 4; a3 = 1; a4 = 2;a3 = 1; a4 = 2;a3 = 1; a4 = 2;a3 = 1; a4 = 2;3 5 4 1 2下标 0 1 2 3 4第四讲第四讲 数组数组攘忌虞罪漏传酵荡绦惨难坤溉凌氟硫咕呀懒救第低问龟眷硼冈开栈肝付搜一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计(3)(3)
117、数组在内存中分配一段连续的存储空间数组在内存中分配一段连续的存储空间内存内存地址地址变量名变量名FF02FF01FF00FF03FF04FF05FF06FF07a0a1a2a300000000000000110000000000000101000000000000010000000000000000010000000000000010FF08FF09a4a数组名数组名第四讲第四讲 数组数组抬刨咆身糠厢唐厚按矽肤饥己元拇形敝裳精峡该钻窝致羹疯忍讽我还室槐一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计思考思考: :1.#inclu
118、de 1.#include void main() void main() int a4;int a4;/ / 声明项声明项 printf(printf(“a0=%d; a1=%d; a2=%d; a0=%d; a1=%d; a2=%d; a3=%dna3=%dn”, a0, a1, a2, a3); , a0, a1, a2, a3); 2.2.其他不变,改变声明项为其他不变,改变声明项为 int a4 = 0, 1, 2, 3 ;int a4 = 0, 1, 2, 3 ;第四讲第四讲 数组数组矢尧娠厦弟况盔婚忿琅磷梳枣经掉个在邢频笛隘讨段獭笆徽薪畅潜臭罗垢一教学对象计算机科学与技术系新生第
119、二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3.3.3.3.其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为 int a4 = 3, 8 ; 4.4.4.4.其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为 int a4 = 2, 4, 6, 8, 10 ;5.5.5.5.其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明项为 int a4 = 2, 4, 6, d ;6.6.6.6.其他不变,改变声明项为其他不变,改变声明项为其他不变,改变声明
120、项为其他不变,改变声明项为 int n=4; int an = 0, 1, 2, 3 ;第四讲第四讲 数组数组料祖店更孽竞药攀甭碘禽驰配耘蹈泵蕴颠螟拥咕谗枕赶奢耀脑孰烂骨宇迅一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计第四讲第四讲 数组数组【实例】【实例】将几个数从大到小排序并输出,冒泡排序法将几个数从大到小排序并输出,冒泡排序法 i=1 i=2 i=3 i=4 i=5 i=6a1 a2 a3 a4 a5 a6初始值 1 8 3 2 4 9比较1和8,调换 1 8 3 2 4 9比较1和3,调换 8 1 3 2 4 9比较1
121、和2,调换 8 3 1 2 4 9比较1和4,调换 8 3 2 1 4 9比较1和4,调换 8 3 2 4 1 91到达位置 8 3 2 4 9 1比较8和3,不动 8 3 2 4 9 1比较3和2,不动 8 3 2 4 9 1比较2和4,调换 8 3 2 4 9 1比较2和9,调换 8 3 4 2 9 12到达位置 8 3 4 9 2 1摇厩阵摘闽禄前虽那臀盔涯辛含送角蚂谗马崎嚏哨衬阜搜蕴趁吟饵荣阮馈一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计i=1 i=2 i=3 i=4 i=5 i=6a1 a2 a3 a4 a5 a6
122、中间值 8 3 4 9 2 1比较8和3,不动 8 3 4 9 2 1比较3和4,调换 8 3 4 9 2 1比较3和9,调换 8 4 3 9 2 13到达位置 8 4 9 3 2 1比较8和4,不动 8 4 9 3 2 1比较4和9,调换 8 4 9 3 2 14到达位置 8 9 4 3 2 1比较8和9,调换 8 9 4 3 2 18到达位置 9 8 4 3 2 1第四讲第四讲 数组数组痞嘘酬衡尹陷挤簧耽涟企姜寨挝跟刁桔保粕吊捍全堑萨吮沦扛菱豌漾标闽一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计从表中可以看出最小的一个数第
123、一遍扫描就交换从表中可以看出最小的一个数第一遍扫描就交换从表中可以看出最小的一个数第一遍扫描就交换从表中可以看出最小的一个数第一遍扫描就交换到到到到a6a6a6a6如果将如果将如果将如果将a1a1a1a1视为水底,视为水底,视为水底,视为水底,a6a6a6a6视为水面:视为水面:视为水面:视为水面: 最轻的最轻的最轻的最轻的( ( ( (最小的最小的最小的最小的) ) ) )一个数一个数一个数一个数 1 1 1 1 最先浮到水面,交换到最先浮到水面,交换到最先浮到水面,交换到最先浮到水面,交换到a6;a6;a6;a6;次轻的次轻的次轻的次轻的 2 2 2 2 第二遍扫描交换到第二遍扫描交换到第
124、二遍扫描交换到第二遍扫描交换到a5a5a5a5; 再轻的再轻的再轻的再轻的 3 3 3 3 第三遍扫描交换到第三遍扫描交换到第三遍扫描交换到第三遍扫描交换到a4a4a4a4; 依此类推,有依此类推,有依此类推,有依此类推,有6 6 6 6个数,前个数,前个数,前个数,前5 5 5 5个数到位需个数到位需个数到位需个数到位需5 5 5 5遍扫描,遍扫描,遍扫描,遍扫描,第第第第6 6 6 6个最重的数自然落在个最重的数自然落在个最重的数自然落在个最重的数自然落在a1a1a1a1中。中。中。中。因此,因此,因此,因此,6 6 6 6个数只需个数只需个数只需个数只需5 5 5 5遍扫描,即遍扫描,即
125、遍扫描,即遍扫描,即j=n-1, n=6j=n-1, n=6j=n-1, n=6j=n-1, n=6。 第四讲第四讲 数组数组絮坚饭忆釉悦旱腻蓬希迷末防捡遣彝题烩曾蜕兼填涧列藩来资篮康鸟帧粹一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计再看在每遍扫描中,相邻两数组元素的比较次数。再看在每遍扫描中,相邻两数组元素的比较次数。再看在每遍扫描中,相邻两数组元素的比较次数。再看在每遍扫描中,相邻两数组元素的比较次数。 当当当当j=1j=1j=1j=1时,时,时,时,i=1,2,i=1,2,i=1,2,i=1,2,n-j,n-j,n-j
126、,n-j。n=6n=6n=6n=6时,比较时,比较时,比较时,比较5 5 5 5次之后次之后次之后次之后a6a6a6a6中有一个最小数到达,这时中有一个最小数到达,这时中有一个最小数到达,这时中有一个最小数到达,这时a6a6a6a6不必再参与比较了。不必再参与比较了。不必再参与比较了。不必再参与比较了。 因此在第二遍搜索时,因此在第二遍搜索时,因此在第二遍搜索时,因此在第二遍搜索时,j=2, i=1,2,j=2, i=1,2,j=2, i=1,2,j=2, i=1,2,n-j,n-j,n-j,n-j,即,即,即,即i=1,2,3,4i=1,2,3,4i=1,2,3,4i=1,2,3,4。比较。
127、比较。比较。比较4 4 4 4次之后次小的一个数到达了次之后次小的一个数到达了次之后次小的一个数到达了次之后次小的一个数到达了a5a5a5a5。这时这时这时这时a5a5a5a5不必再参与比较了。不必再参与比较了。不必再参与比较了。不必再参与比较了。 因此,因此,因此,因此,j=3j=3j=3j=3时,时,时,时,i=1,2,3i=1,2,3i=1,2,3i=1,2,3;j=4j=4j=4j=4时,时,时,时,i=1,2i=1,2i=1,2i=1,2;j=5j=5j=5j=5时,时,时,时,i=1i=1i=1i=1第四讲第四讲 数组数组噬芍枕汹趁嚏燕潍噪氏线酶弧尖莉陆散鄂硫颇混篡瓦零屡职节浴张圾
128、墨范一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计为了表述方便,定义以下为了表述方便,定义以下为了表述方便,定义以下为了表述方便,定义以下3 3 3 3个变量:个变量:个变量:个变量: n n n n 待排序的数的个数,这里待排序的数的个数,这里待排序的数的个数,这里待排序的数的个数,这里 n=6 n=6 n=6 n=6 j j j j 扫描遍数,扫描遍数,扫描遍数,扫描遍数,j=1,2,j=1,2,j=1,2,j=1,2,n-1 ,n-1 ,n-1 ,n-1 i i i i 第第第第j j j j遍扫描待比较元素的下标,遍扫
129、描待比较元素的下标,遍扫描待比较元素的下标,遍扫描待比较元素的下标,i=1,2,i=1,2,i=1,2,i=1,2,n-j ,n-j ,n-j ,n-j 第四讲第四讲 数组数组忧搭酿衰辜更乞内曝梗跃症钞证禽冶若土炮粉迢榨砾篓舆诀盈甲联湍虞仑一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计采用两重计数型循环:采用两重计数型循环:采用两重计数型循环:采用两重计数型循环: 步骤步骤步骤步骤1 1 1 1:将待排序的数据放入数组中;将待排序的数据放入数组中;将待排序的数据放入数组中;将待排序的数据放入数组中; 步骤步骤步骤步骤2 2 2
130、 2:置置置置j j j j为为为为1 1 1 1; 步骤步骤步骤步骤3 3 3 3:让让让让i i i i从从从从1 1 1 1到到到到n-jn-jn-jn-j,比较,比较,比较,比较aiaiaiai与与与与ai+1ai+1ai+1ai+1, 如果如果如果如果 ai = ai+1 ai = ai+1 ai = ai+1 ai = ai+1,位置不动;,位置不动;,位置不动;,位置不动; 如果如果如果如果 ai ai+1 ai ai+1 ai ai+1 ai ai+1,位置交换,位置交换,位置交换,位置交换, 即即即即 p=ai; ai=ai+1; ai+1=p; p=ai; ai=ai+1;
131、 ai+1=p; p=ai; ai=ai+1; ai+1=p; p=ai; ai=ai+1; ai+1=p; 步骤步骤步骤步骤3 3 3 3结束后结束后结束后结束后 an-j+1 an-j+1 an-j+1 an-j+1中的数为最小的数中的数为最小的数中的数为最小的数中的数为最小的数 步骤步骤步骤步骤4 4 4 4:让让让让j=j+1j=j+1j=j+1j=j+1;只要;只要;只要;只要jnjnjnjn就返回步骤就返回步骤就返回步骤就返回步骤3 3 3 3,将将将将an-j+1an-j+1an-j+1an-j+1的值排好。当的值排好。当的值排好。当的值排好。当j=nj=nj=nj=n时执行步骤
132、时执行步骤时执行步骤时执行步骤5 5 5 5 步骤步骤步骤步骤5 5 5 5:输出排序结果输出排序结果输出排序结果输出排序结果第四讲第四讲 数组数组沥具蛋阐累肌诀犬唆饿基凰钳允禹艇亮饶请珍桥墓呀秆米塔谜嘉亡除痕池一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2.2.程序程序main()main()main()main()/ / / / 主函数主函数主函数主函数 int i, j, p, a7;int i, j, p, a7;int i, j, p, a7;int i, j, p, a7;/ / / / 整型变量整型变量整型变量
133、整型变量 for (i=1; i=6; i=i+1)for (i=1; i=6; i=i+1)for (i=1; i=6; i=i+1)for (i=1; i=6; i=i+1) / / / / 键入键入键入键入6 6 6 6个数,放入个数,放入个数,放入个数,放入a a a a数组中数组中数组中数组中 printf(printf(printf(printf(“ “请输入待排序的数请输入待排序的数请输入待排序的数请输入待排序的数a%d=a%d=a%d=a%d=” ”, i);, i);, i);, i);scanf (scanf (scanf (scanf (“ “%d%d%d%d” ”, &
134、ai);, &ai);, &ai);, &ai); for ( j=1; j=5; j=j+1)for ( j=1; j=5; j=j+1)for ( j=1; j=5; j=j+1)for ( j=1; j=5; j=j+1)/ / / / 冒泡排序,外层循环冒泡排序,外层循环冒泡排序,外层循环冒泡排序,外层循环 for ( i=1; i=6-j; i=i+1 )for ( i=1; i=6-j; i=i+1 )for ( i=1; i=6-j; i=i+1 )for ( i=1; i=6-j; i=i+1 )/ / / / 内层循环内层循环内层循环内层循环 if ( ai ai+1 ) i
135、f ( ai ai+1 ) if ( ai ai+1 ) if ( ai ai+1 ) p = ai; ai = ai+1; ai+1 = p; p = ai; ai = ai+1; ai+1 = p; p = ai; ai = ai+1; ai+1 = p; p = ai; ai = ai+1; ai+1 = p; for ( i=1; i=6; i=i+1)for ( i=1; i=6; i=i+1)for ( i=1; i=6; i=i+1)for ( i=1; i=6; i=i+1)/ / / / 输出排序结果输出排序结果输出排序结果输出排序结果 printf(printf(print
136、f(printf(“ “%dn%dn%dn%dn” ”, ai);, ai);, ai);, ai); 第四讲第四讲 数组数组痈疲环契帐减坤然漳占靛囚杯舌铁曼槛咀捅腹瓣播骨测混斌穗炉枢职囚服一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计作业:船长与水手的问题: 有载有50个人的大船,突然触礁,船底撞了一个大窟窿,水不停地涌进船里,船不断下沉。这时,聪明的船长把所有人召集到一起,给每人一个编号,手拉手围成一圈,从1号开始报数,报的数为9时,这个人出列,跳入大海,剩下的人继续围成一圈,后面的人从1开始继续报数,重复上面地步骤,聪明
137、的船长却最后留在了船上。问:船长是几号才能最后一个跳入大海?第四讲第四讲 数组数组捌吭苔棍梧潍伐愉吧夯稳菩饲怔叉今娘赴班耙菏旱屹勃欧分亭再音医醇尧一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计讨论问题讨论问题讨论问题讨论问题: : : : 使用筛法求使用筛法求使用筛法求使用筛法求100100100100以内的所有素数以内的所有素数以内的所有素数以内的所有素数思路思路思路思路 1.1.1.1.想象将想象将想象将想象将100100100100个数看作沙子和小石头子,让小石头子当作个数看作沙子和小石头子,让小石头子当作个数看作沙子和
138、小石头子,让小石头子当作个数看作沙子和小石头子,让小石头子当作素数;让沙子当作非素数。弄一个筛子,只要将沙子素数;让沙子当作非素数。弄一个筛子,只要将沙子素数;让沙子当作非素数。弄一个筛子,只要将沙子素数;让沙子当作非素数。弄一个筛子,只要将沙子筛走,剩下的就是素数了。筛走,剩下的就是素数了。筛走,剩下的就是素数了。筛走,剩下的就是素数了。 2.2.2.2.非素数一定是非素数一定是非素数一定是非素数一定是2 2 2 2、3 3 3 3、4 4 4 4 的倍数。的倍数。的倍数。的倍数。 3.3.3.3.使用数组,让下标就是使用数组,让下标就是使用数组,让下标就是使用数组,让下标就是1001001
139、00100以内的数,让数组元素的值以内的数,让数组元素的值以内的数,让数组元素的值以内的数,让数组元素的值作为筛去与否的标志。比如筛去以后让元素值为作为筛去与否的标志。比如筛去以后让元素值为作为筛去与否的标志。比如筛去以后让元素值为作为筛去与否的标志。比如筛去以后让元素值为1 1 1 1。第四讲第四讲 数组数组卓窍胜砰夺毫艘奢铲旷宰谎露驭甫十铅蝉兄备汉烃墨庐崩侈眉财波笔滴譬一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计1 1 1 1至至至至100100100100这些自然数可以分为三类:这些自然数可以分为三类:这些自然数可以分
140、为三类:这些自然数可以分为三类: 单位数:仅有一个数1。 素数: 是这样一个数,它大于1,且只有1和它自身这样两个正因数。 合数: 除了1和自身以外,还有其他正因数。1 1不是素数,除不是素数,除1 1以外的自然数,当然只有素数与合数。以外的自然数,当然只有素数与合数。 筛法实际上是筛去合数,留下素数。筛法实际上是筛去合数,留下素数。 为了提高筛选法效率,注意到:为了提高筛选法效率,注意到: 令令n n为合数(这里是为合数(这里是100100),),c c为为n n的最小正因数,则据初等数论的最小正因数,则据初等数论 只要找到只要找到c c就可以确认就可以确认n n为合数,将其筛去。为合数,将
141、其筛去。第四讲第四讲 数组数组碍乌骆研援赊壹桌伍绑帧杉总益咆搓疼酌今私呢瘟嗜盆翅寺箩耽猛入萤准一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计for(i=2;i=100:i+)primi=0;for(i=3;i=100:i+)a=sqrt(i)for(j=2;j=a:j+)i%j=0primi=1for(i=2;i=100;i+)primi=0输出iYesYesNoNo第四讲第四讲 数组数组瘪斩假磅冲灸航勺旦曙蚤迹名泽刽狼仁茧镁挛穗烘肩伪靴熟廉拦坯土爽蚀一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生
142、第二学期二教C语言程序设计语言程序设计二维数组二维数组问题:求矩阵问题:求矩阵a a的最大值的最大值 1 3 5 1 3 5 a= 7 9 2 a= 7 9 2 4 6 8 4 6 8第四讲第四讲 数组数组见戊嘴稠杀东呢嚏稿膊冠痔宝赫谦现郸懒助伏震逗谆晰庚迭参走准硒怯寡一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计1二维数组定义格式: 类型说明符 数组名常量表达式 常量表达式 例: int a2 3 =3,5,4,1,2,6;说明: a)每一维的下标从0开始,整个数组元素为:23=6个 b)C语言中,二维数组中元素排列的顺序是
143、按行存放。 即:先存放第一行的元素,再存放第二行的元素第四讲第四讲 数组数组控兹睹戏浓鼓零面冀矩猪幂冲具犯壳容悠冀巷铬窿官够绚杉忿抛忱臼矮布一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计二维数组在内存中的分配情况二维数组在内存中的分配情况内存地址变量名FF02FF01FF00FF03FF04FF05FF06FF07a00a01a10a1100000000000000110000000000000101000000000000010000000000000000010000000000000010FF08FF09a20a数组名第
144、四讲第四讲 数组数组私狗庚胜嫂讫颊僳翠饱亏续逻玄枉篆亲柞国均锅槐踞互胆昆愧需镁卧愤汇一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计c)可以计算数组元素在数组中的序号 假设 mn的数组a,计算aij序号的公式: in+j 如33数组中: a01 03+1=1(第二个) a12 13+2=5(第六个) a22 23+2=8(第九个)第四讲第四讲 数组数组填响穴窿叛卡啃牢猫询醛跟辰键樟雪旬蝗惺络溶芜和坟蒸主忽售阮桃翁膊一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计求
145、矩阵求矩阵a a的最大值的最大值 1 3 5 1 3 5 a= 7 9 2 a= 7 9 2 4 6 8 4 6 8问题分析:将矩阵放入二维数组问题分析:将矩阵放入二维数组a33a33中中首先定义变量首先定义变量max=a00max=a00,maxmax与与a01a01比较,若发现比较,若发现maxa01maxa01,则将,则将max=a01max=a01,这样,这样maxmax与数组元素与数组元素逐个比较,最后找到数组中最大的一个。采用二重循环逐个比较,最后找到数组中最大的一个。采用二重循环分别对行和列进行控制。分别对行和列进行控制。外层控制行标,内层控制列标。外层控制行标,内层控制列标。第
146、四讲第四讲 数组数组澜僧五啮朗填晕闺颊右唉易款晤幸殊岔捞禹任眉讲兔曰幌肢申堵娄硒粥初一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计作业作业1.1.打印魔方阵:打印魔方阵:8 1 68 1 63 5 73 5 74 9 24 9 2算法算法: :1.1.将将1 1放到第放到第1 1行的中间。行的中间。2.2.下一个数放在该数的前一行后下一个数放在该数的前一行后一列。一列。3.3.若该位置已经有数若该位置已经有数, ,则放在前则放在前一数的正下方。一数的正下方。4.4.当前数是右上角时当前数是右上角时, ,其下一个其下一个数放在其
147、下方。数放在其下方。5.5.若当前是第若当前是第1 1行行, ,则其前一行为则其前一行为第第n n行行, ,若当前列是第若当前列是第n n列列, ,则其后则其后一列为第一列为第1 1列。列。第四讲第四讲 数组数组握鹃嘘拔冀藐尘矮另蘑祟纬隧尔吴恿抨撑雕辨泥康淳厨尤痒玫鉴邪病颧哇一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计问题:编程求解n n我们用函数来编写这个题的程序,参考程序如下:我们用函数来编写这个题的程序,参考程序如下:我们用函数来编写这个题的程序,参考程序如下:我们用函数来编写这个题的程序,参考程序如下:#includ
148、e /#include /预编译命令预编译命令 #define n 6 /#define n 6 /定义定义n n为为6 6 #define k 4 /#define k 4 /定义定义k k为为4 4 void main() /void main() /主函数主函数 printf(sum of %dth powers of integers from 1 to printf(sum of %dth powers of integers from 1 to %d=,k,n ); %d=,k,n ); printf(%dn,SOP(n,k); printf(%dn,SOP(n,k); / /输出
149、结果输出结果, ,其中其中SOP(n,k)SOP(n,k)为被调用函数为被调用函数 第五讲第五讲 函数函数喇杭港肿详摸烈才投晨邀医掳屈悉此砧宵碴谈鹿点途没翅号啄咸机啸薄湘一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计int SOP(m,l) /int SOP(m,l) /整型自定义函数整型自定义函数,m,l ,m,l 为形参为形参 int m,l; /int m,l; /形参形参m,l m,l 为整型变量为整型变量 int i,sum=0; /int i,sum=0; /整型变量整型变量i,sum i,sum for (i=1
150、; i=m; i=i+1 ) for (i=1; i=m; i=i+1 ) sum=sum+power( i ,l ); sum=sum+power( i ,l ); return (sum) ; /return (sum) ; /返回值返回值sumsum给函数给函数sop(n,k) sop(n,k) / /以下函数是被函数以下函数是被函数sop(n,k)sop(n,k)调用的函数调用的函数 int power(p,q) / int power(p,q) /整型自定义函数整型自定义函数 int p,q; / int p,q; /形参形参p,q p,q 为整型变量为整型变量 int i,prod
151、uct=1; int i,product=1; for(i=1; i=q; i=i+1) for(i=1; i=q; i=i+1) product=product*p; product=product*p; return(product); / return(product); /累乘值累乘值productproduct返回给返回给powerpower第五讲第五讲 函数函数拥殴涵廓海潍匡哦慷燃省耸窗彤静瓮棒窖耘末诀公按噎缘梢冒若农旦抗台一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计 ( ()例例: :int power(p,n
152、) int power(p,n) powerpower为函数名,要以英文字母开头。为函数名,要以英文字母开头。 intint是函数值的数据类型,这里是是函数值的数据类型,这里是intint(整型)。(整型)。 (p,n)(p,n)括号中的括号中的p,np,n为函数的形式参数,形式参数也要定义其数据为函数的形式参数,形式参数也要定义其数据类型。类型。函数定义的一般格式:函数定义的一般格式: ( () ) ; 函数的定义格式:函数的定义格式:第五讲第五讲 函数函数汉聪茫舰萄斟沃瘤稼腐品嘴菏组股泰腐义疵婶于旋隔袋识祥敝泞还甫残魏一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系
153、新生第二学期二教C语言程序设计语言程序设计第五讲第五讲 函数函数1 1、形式参数是在定义函数时放在函数名后括号中的参数。在、形式参数是在定义函数时放在函数名后括号中的参数。在未进行函数调用时,并不对形式参数分配内存单元。在发生未进行函数调用时,并不对形式参数分配内存单元。在发生函数调用时,立刻给形式参数分配内存单元。调用结束后,函数调用时,立刻给形式参数分配内存单元。调用结束后,释放掉行参所占的内存单元。释放掉行参所占的内存单元。 2 2、因此,形参变量属于局部变量,其作用域在它所在的函数、因此,形参变量属于局部变量,其作用域在它所在的函数体内。体内。 3 3、在定义函数的时候,必须指定形参变
154、量的类型,如何指定、在定义函数的时候,必须指定形参变量的类型,如何指定?有二种方法:?有二种方法:形式参数与实在参数形式参数与实在参数(1)intpower(p,n)intp,n;(2)intpower(intp,intn)有些编译系统不认识第(有些编译系统不认识第(2 2)种形式)种形式虐替带怯隧镍闽驭譬诱椭首研粕往硕区渠待桔京聋舟根戴仲髓鳃卯盂慨墟一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计4 4、实在参数是一个具有确定值的表达式。函数在调用时,将实在、实在参数是一个具有确定值的表达式。函数在调用时,将实在参数赋给形式参
155、数。参数赋给形式参数。 比如,主函数调用比如,主函数调用SOP(n,k)SOP(n,k),这时,这时,n,kn,k为实在参数,为实在参数,n n的的值为值为6 6,k k的值为的值为4 4。在被调用函数定义中,。在被调用函数定义中,int SOP(m,l)int SOP(m,l)中的中的m,lm,l为形式参数,在为形式参数,在SOPSOP被调用时,系统给被调用时,系统给m,lm,l这两个形式参数分这两个形式参数分配了内存单元之后,配了内存单元之后,n n的值的值6 6赋给赋给m m,k k的值的值4 4赋给赋给l l。 实在参数的个数及类型应与形式参数一致。赋值时前后对实在参数的个数及类型应与
156、形式参数一致。赋值时前后对应关系不会改变。下面画出主函数与应关系不会改变。下面画出主函数与SOPSOP函数,调用与被调用时函数,调用与被调用时参数传递关系:参数传递关系:第五讲第五讲 函数函数椿街槛兆秃忿点榷悔柬砖棚驾凝冲苟烩裔惠沙茁移汽须胚艰旋危拖亨历谩一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计主函数执行下述语句时,主函数执行下述语句时,主函数执行下述语句时,主函数执行下述语句时, printf(printf(printf(printf(“ “%dn%dn%dn%dn” ”,SOP(n,k); ,SOP(n,k); ,S
157、OP(n,k); ,SOP(n,k); 传值给被调用函数传值给被调用函数传值给被调用函数传值给被调用函数 int SOP(m,l) int SOP(m,l) int SOP(m,l) int SOP(m,l) n n n n的值的值的值的值6 6 6 6传给传给传给传给m, km, km, km, k的值的值的值的值4 4 4 4传给传给传给传给l l l l。 6 6 6 6和和和和4 4 4 4为实在参数,为实在参数,为实在参数,为实在参数,m m m m和和和和l l l l为形式参为形式参为形式参为形式参数。数。数。数。 被调用函数在其形式参数被赋值之后,开始执行函数体,先是被调用函数
158、在其形式参数被赋值之后,开始执行函数体,先是被调用函数在其形式参数被赋值之后,开始执行函数体,先是被调用函数在其形式参数被赋值之后,开始执行函数体,先是让累加器初始化为让累加器初始化为让累加器初始化为让累加器初始化为0 0 0 0(sum=0sum=0sum=0sum=0),接着进入以),接着进入以),接着进入以),接着进入以i i i i为控制变量的计为控制变量的计为控制变量的计为控制变量的计算循环,算循环,算循环,算循环,i i i i从从从从1 1 1 1变到变到变到变到m m m m(m=6m=6m=6m=6),即累加),即累加),即累加),即累加m m m m次(即次(即次(即次(即
159、6 6 6 6次)。循环体次)。循环体次)。循环体次)。循环体为为为为sum=sum+power(i,l)sum=sum+power(i,l)sum=sum+power(i,l)sum=sum+power(i,l)。当。当。当。当6 6 6 6次循环执行完后,实现的是次循环执行完后,实现的是次循环执行完后,实现的是次循环执行完后,实现的是注意注意注意注意这里这里这里这里 x x x xl l l l 是由另一个自定义函数是由另一个自定义函数是由另一个自定义函数是由另一个自定义函数power(i,l)power(i,l)power(i,l)power(i,l)实现的。实现的。实现的。实现的。第五
160、讲第五讲 函数函数柄臼吟辙赚掩府毫袖氯牢兰疹蛛葵希域扣悄召袜厢懂县滚意莽扔脓模之海一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计power(i,l)power(i,l)处在处在SOP(m,l)SOP(m,l)函数中,表示函数中,表示SOPSOP函数去调用函数去调用power power 函函数。其中数。其中i,li,l为实在参数,而为实在参数,而int power(p,q)int power(p,q)中的中的p,qp,q为形式为形式参数。参数。 比如,执行比如,执行SOP(6,4)SOP(6,4)时,时,l=4,m=6, l=
161、4,m=6, 当当i=1i=1时,时, sum=sum+power(1,4) sum=sum+power(1,4) 这里这里1 1,4 4为实在参数,调用为实在参数,调用power(p,q)power(p,q),两个形式参数,两个形式参数p,qp,q分别分别被赋以被赋以1 1,4 4。第五讲第五讲 函数函数届吐屋问橡隋啼惦泵仆川彭猴惭吟勺黎铰郎胸肚赞框杨浙鬃请院瑚带品岂一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计6i=2: sum = sum + power(i,l) = 1 + 16= 17调用返回执行执行power(2,
162、 4):product = 2*2*2*2return(16) = 16i=3: sum = sum + power(i,l)= 17 + 81= 98调用返回执行执行power(3, 4):product = 3*3*3*3return(81) = 81i=4: sum = sum + power(i,l)= 98 + 256= 354调用返回执行执行power(4, 4):product = 4*4*4*4return(256) = 256i=5: sum = sum + power(i,l)= 354 + 625= 979调用返回执行执行power(5, 4):product = 5*5
163、*5*5return(625) = 625执行执行power(6, 4):produ ct = 6*6*6*return(1296) = 1296调用= 0 + 1= 1返回执行执行SOP(6,4) l=4sum=0i=1: sum = sum + power(i,l)执行执行power(1, 4):product = 1*1*1*1return(1) = 1SOP(n,k)调用调用i=6: sum = sum + power(i,l)= 979 + 1296= 2275return (sum)2275返回返回调用返回制药涟血惺岩帜第这败这菏蹈讹檄潦登狮荆湛绎牡魄瑰窍劲榆谈等殖啊洁一教学对象计
164、算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计第五讲第五讲 函数函数Main()调用a函数结束a函数调用b函数结束b函数结束溅亡箩耻秦讳仟铝峨应苇吃匣凋虎利继塌延舱示嘶玩奏拴弛送粘植幢哦咀一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计例: 求函数f(x)=x3+x+5的值,其中x=y3+y2+5y+6,求当y=1,2,3,4,100时f(x)的值。第五讲第五讲 函数函数房凯老嫩途渴马啸簧凡侦吼盼宗硫笆知慈今徊翘遗澄童喀荧舶赡苍萨酿敷一教学对象计算机科学与技术系新生第二学期
165、二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计作业作业: : 1.1.设计一个函数设计一个函数, ,求解求解10001000以内的所有素数以内的所有素数. .第五讲第五讲 函数函数仅嚷唁塘梨笨独嫂金李畦刺再棘袖利歉寅奏侯硼丁白裂硅趾窑仑协练雷拟一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计递归算法递归算法在可计算性理论中占有重要地位,它是算法设计的在可计算性理论中占有重要地位,它是算法设计的有力工具,对于拓展编程思路非常有用。就递归算法而言有力工具,对于拓展编程思路非常有用。就递归算法而言并不涉及高
166、深数学知识,只不过初学者要建立起递归概念并不涉及高深数学知识,只不过初学者要建立起递归概念不十分容易。不十分容易。 我们先从一个最简单的例子导入。我们先从一个最简单的例子导入。用递归算法求用递归算法求n! n! 定义:函数定义:函数 fact(n) = n! fact(n) = n! fact(n-1) = (n-1)! fact(n-1) = (n-1)! 则有则有fact(n) = n*fact(n-1) fact(n) = n*fact(n-1) 已知已知fact(1) = 1fact(1) = 1第六讲第六讲 递归及其实现递归及其实现斧贱侩控劈尖扼僚追前裕鬃学诚紧镑薛梁鹏廉狡槽枚磁勉湛
167、势詹淬淳挑恨一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计下面我们以下面我们以3 3!为例画出了调用和返回的递归示意图!为例画出了调用和返回的递归示意图 Bfact(2)fact(2)=2*fact(1)=2*fact(1)=2*1=2*1=2=2返回返回Afact(3)fact(3)=3*fact(2)=3*fact(2)=3*2=3*2=6=6返回返回Cfact(1)=1调用调用调用调用第六讲第六讲 递归及其实现递归及其实现旭袍题轩掷葫俐扰肌盯声避娠溜底涯延睹鞠胡礼香蛔羌娠庭借审絮罪狐掀一教学对象计算机科学与技术系新生第二
168、学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计从图可以想象:从图可以想象: 欲求欲求fact(3)fact(3),先要求,先要求fact(2)fact(2);要求;要求fact(2)fact(2)先求先求fact(1)fact(1)。 就象剥一颗圆白菜,从外向里,一层层剥下来,到了菜心,就象剥一颗圆白菜,从外向里,一层层剥下来,到了菜心, 遇到遇到1 1的阶乘,其值为的阶乘,其值为1 1,到达了递归的边界。,到达了递归的边界。 然后再用然后再用fact(n)=n*fact(n-1)fact(n)=n*fact(n-1)这个普遍公式,从里向外倒这个普遍公式,从里向
169、外倒推回去得到推回去得到fact(n)fact(n)的值。的值。 为了把这个问题说得再透彻一点。我们画了如下的流程图:为了把这个问题说得再透彻一点。我们画了如下的流程图:第六讲第六讲 递归及其实现递归及其实现敏大迅鳖偷入道渐巩肪央报越扑哪耸财盖裸屡婿滑娥屯弃色挝沏窑紫俗济一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计 2 ) ) 1312*)2121*111)fact(3)真真假假调用调用fact(计算计算3 fact(fact(fact(真真假假调用调用fact( 1计算计算2 fact(真真假假fact(1返回返回返回返回
170、 第六讲第六讲 递归及其实现递归及其实现胜侧酮晋娘迂携钳式营五迷卓霜粥杆缕扁侯毗揪盈挪涩窟挎碘左菩伺慷纂一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计将上图改为下图将上图改为下图 1 )假假真真fact(3)真真假假3=1调用调用fact(2真真假假2=11=1f act(2)=2*fact(1) 返回返回f act(3)=3*fact(2) 返回返回调用调用fact( )fact(1) =1返回返回 第六讲第六讲 递归及其实现递归及其实现壬辞大羽误退芽半俗图煌艰连电弹拳鸡弄捕跋斡追忠扯悯祟免女绰坐彤藤一教学对象计算机科学与技
171、术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计在这个图中在这个图中“内层内层”与与“外层外层”有着相同的结构。有着相同的结构。它们之间它们之间“你中有我,我中有你你中有我,我中有你”,呈现相互依,呈现相互依存的关系。存的关系。 为了进一步讲清递归的概念,将为了进一步讲清递归的概念,将递归递归与与递推递推做一比较。仍以求阶乘为例。做一比较。仍以求阶乘为例。 递推递推是从已是从已知的初始条件出发,逐次去求所需要的阶乘值。知的初始条件出发,逐次去求所需要的阶乘值。 如求如求3 3! 初始条件初始条件 fact(1) = 1 fact(2) = 2*fact
172、(1) = 2 fact(3) = 3*fact(2) = 6 第六讲第六讲 递归及其实现递归及其实现悔惦削烫品沛猫絮宾悍玛邵呐奏梗挖涯至考林抖汗鹅剩譬诊油迪孜磺闸赣一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计 这相当于从菜心这相当于从菜心“推到推到”外层。而外层。而递归递归算法的出发点不放算法的出发点不放在在初始条件上,而放在求解的目标上,从所求的未知项出发逐初始条件上,而放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件)。次调用本身的求解过程,直到递归的边界(即初始条件)。就本例而言
173、,读者会认为递归算法可能是多余的,费力而不就本例而言,读者会认为递归算法可能是多余的,费力而不讨好。讨好。但许多实际问题不可能或不容易找到显而易见的但许多实际问题不可能或不容易找到显而易见的递推递推关系,这时关系,这时递归递归算法就表现出了明显的优越性。算法就表现出了明显的优越性。 下面我们将会看到,递归算法比较符合人的思维方式,逻下面我们将会看到,递归算法比较符合人的思维方式,逻辑性强,可将问题描述得简单扼要,具有良好的可读性,易辑性强,可将问题描述得简单扼要,具有良好的可读性,易于理解,许多看来相当复杂,或难以下手的问题,如果能够于理解,许多看来相当复杂,或难以下手的问题,如果能够使用递归
174、算法就会使问题变得易于处理。使用递归算法就会使问题变得易于处理。第六讲第六讲 递归及其实现递归及其实现闽垣刺苗箩驳哪菱望动出吐雇爵埃莎板喂釉诈遣敬励字沧墅舀伦氛盂促问一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计故事:相传在古代印度的故事:相传在古代印度的BramahBramah庙中,有位僧人整天把三根柱子庙中,有位僧人整天把三根柱子上的金盘倒来倒去,原来他是想把上的金盘倒来倒去,原来他是想把6464个一个比一个小的金盘从个一个比一个小的金盘从一根柱子上移到另一根柱子上去。移动过程中恪守下述规则:一根柱子上移到另一根柱子上去。
175、移动过程中恪守下述规则:每次只允许移动一只盘,且大盘不得落在小盘上面。有人会觉每次只允许移动一只盘,且大盘不得落在小盘上面。有人会觉得这很简单,真的动手移盘就会发现,如以每秒移动一只盘子得这很简单,真的动手移盘就会发现,如以每秒移动一只盘子的话,按照上述规则将的话,按照上述规则将6464只盘子从一个柱子移至另一个柱子上,只盘子从一个柱子移至另一个柱子上,所需时间约为所需时间约为58005800亿年。亿年。CAB第六讲第六讲 递归及其实现递归及其实现宾鸽炔胁抱契叛战描讶踞鉴撼忱始坐柳缎滩绑挝躁脑边茸盗侠沉腔那赐逆一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期
176、二教C语言程序设计语言程序设计怎样编写这种程序?思路上还是先从最简单的情况分析起,搬怎样编写这种程序?思路上还是先从最简单的情况分析起,搬一搬看,慢慢理出思路。一搬看,慢慢理出思路。1 1、在、在A A柱上只有一只盘子,假定盘号为柱上只有一只盘子,假定盘号为1 1,这时只需将该盘从,这时只需将该盘从A A搬至搬至C C,一次完成,记为,一次完成,记为move 1 from A to Cmove 1 from A to CCAB1第六讲第六讲 递归及其实现递归及其实现持纶绞墙嘻审我冷肚泰遁釜秧陨守渭直塌橙及钻琼舜千译广紊鞘韭弦暖砂一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与
177、技术系新生第二学期二教C语言程序设计语言程序设计2 2、在、在A A柱上有二只盘子,柱上有二只盘子,1 1为小盘,为小盘,2 2为大盘。为大盘。 第(第(1 1)步将)步将1 1号盘从号盘从A A移至移至B B,这是为了让,这是为了让2 2号盘能移动;号盘能移动; 第(第(2 2)步将)步将2 2号盘从号盘从A A移至移至C C; 第(第(3 3)步再将)步再将1 1号盘从号盘从B B移至移至C C; 这三步记为:这三步记为: move 1 from A to B; move 1 from A to B; move 2 from A to C; move 2 from A to C; move
178、 1 form B to C;move 1 form B to C;CAB132第六讲第六讲 递归及其实现递归及其实现妨载烟涉痴蠢财儡癸企睛乓歉孺呻深啡壤箕骨断瘸礁葵债汇氰挟信自阴醇一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3 3、在在A A柱上有柱上有3 3只盘子,从小到大分别为只盘子,从小到大分别为1 1号,号,2 2号,号,3 3号号 第(第(1 1)步将)步将1 1号盘和号盘和2 2号盘视为一个整体;先将二者作为整体从号盘视为一个整体;先将二者作为整体从A A移至移至B B,给,给3 3号盘创造能够一次移至号盘创造
179、能够一次移至C C的机会。这一步记为的机会。这一步记为 move( 2, A, C, B) move( 2, A, C, B) 意思是将上面的意思是将上面的2 2只盘子作为整体从只盘子作为整体从A A借助借助C C移至移至B B。 第(第(2 2)步将)步将3 3号盘从号盘从A A移至移至C C,一次到位。记为,一次到位。记为 move 3 from A to Cmove 3 from A to C 第(第(3 3)步处于)步处于B B上的作为一个整体的上的作为一个整体的2 2只盘子,再移至只盘子,再移至C C。这一步记为这一步记为 move( 2, B, A, C) move( 2, B,
180、A, C) 意思是将意思是将2 2只盘子作为整体从只盘子作为整体从B B借助借助A A移至移至C C。第六讲第六讲 递归及其实现递归及其实现栈弟惟椒钳恬亮仿逸邢螟股任孽斑乒靠亥存佛笑词丙颂奋痰迟晓便奔粕锅一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计移动过程如下图ABC132第六讲第六讲 递归及其实现递归及其实现希为查韵智卞踢癣酝趴朴布圣绊编捻杆冷软秆翘抖蜕申歌靶佃挤痔粒为潞一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计4 4、从题目的约束条件看,大盘上可以随
181、便摞小盘,相反、从题目的约束条件看,大盘上可以随便摞小盘,相反则不允许。在将则不允许。在将1 1号和号和2 2号盘当整体从号盘当整体从A A移至移至B B的过程中的过程中move(2, A, C, B)move(2, A, C, B)实际上是分解为以下三步实际上是分解为以下三步 第(第(1 1)步:)步:move 1 form A to C; move 1 form A to C; 第(第(2 2)步:)步:move 2 form A to B; move 2 form A to B; 第(第(3 3)步:)步:move 1 form C to B; move 1 form C to B; 经
182、过以上步骤,将经过以上步骤,将1 1号和号和2 2号盘作为整体从号盘作为整体从A A移至移至B B,为,为3 3号号盘从盘从A A移至移至C C创造了条件。同样,创造了条件。同样,3 3号盘一旦到了号盘一旦到了C C,就要,就要考虑如何实现将考虑如何实现将1 1号和号和2 2号盘当整体从号盘当整体从B B移至移至C C的过程了。的过程了。实际上实际上move(2, B, A, C)move(2, B, A, C)也要分解为三步:也要分解为三步: 第(第(1 1)步:)步:move 1 form B to A; move 1 form B to A; 第(第(2 2)步:)步:move 2 fo
183、rm B to C; move 2 form B to C; 第(第(3 3)步:)步:move 1 form A to C;move 1 form A to C;第六讲第六讲 递归及其实现递归及其实现撬卢伯弓满耸须哭夕堂掷峨暮捌条荒斜奄淖骏恐萎月犯寄男万止贿庆叼勒一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计5 5、看、看move(2, A, C, B)move(2, A, C, B)是说要将是说要将2 2只盘自从只盘自从A A搬至搬至B B,但没有,但没有C C是是不行的,因为第(不行的,因为第(1 1)步就要将)步就要将
184、1 1盘从盘从A A移到移到C C,给,给2 2盘创造条件盘创造条件从从A A移至移至B B,然后再把,然后再把1 1盘从盘从C C移至移至B B。看到这里就能明白借助。看到这里就能明白借助C C的含义了。因此,在构思搬移过程的参量时,要把的含义了。因此,在构思搬移过程的参量时,要把3 3个柱子都个柱子都用上。用上。 6 6、定义搬移函数、定义搬移函数move(n, A, B, C)move(n, A, B, C),物理意义是将,物理意义是将n n只盘子从只盘子从A A经经B B搬到搬到C C move(n, A, B, C) move(n, A, B, C) 分解为分解为3 3步步 (1)m
185、ove(n-1, A, C, B)(1)move(n-1, A, C, B)理解为将上面的理解为将上面的n-1n-1只盘子作为一个整只盘子作为一个整体从体从A A经经C C移至移至B B; (2)(2)输出输出n n:A to CA to C,理解将,理解将n n号盘从号盘从A A移至移至C C; (3)Move(n-1, B, A, C)(3)Move(n-1, B, A, C)理解为将上面的理解为将上面的n-1n-1只盘子作为一个整只盘子作为一个整体从体从B B经经A A移至移至C C。第六讲第六讲 递归及其实现递归及其实现示容针党蔬酌脾野崇沉筷生缸拣字栽洞泌陀家菇学迂斯仙膛围遏蔬谅陆抚一
186、教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计这里显然是一种递归定义,当解这里显然是一种递归定义,当解move(n-1, A, C, B)move(n-1, A, C, B)时又可时又可想到,将其分解为想到,将其分解为3 3步:步: 第第1 1步:将上面的步:将上面的n-2n-2只盘子作为一个整体从只盘子作为一个整体从A A经经B B到到C C,move(n-2, A, B, C)move(n-2, A, B, C); 第第2 2步:第步:第n-1n-1号盘子从号盘子从A A直接移至直接移至B B,即,即输出输出n-1:A to
187、 Bn-1:A to B; 第第3 3步:再将上面的步:再将上面的n-2n-2只盘子作为一个整体从只盘子作为一个整体从C C经经A A移至移至B B,move(n-2, C, A, B)move(n-2, C, A, B); 第六讲第六讲 递归及其实现递归及其实现紊姑殴琳琳穿兆糙鹰闭有烯必吱锄谗酬继揪桃隘殖吱吱穷氯恨犯僧晋剂孪一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计 4 7返回返回move(3,A,B,C)C Bmove(2,A, , ), ,2Amove(B,C), B,move(2A,C) 调用调用返回返回返回返回调
188、用调用调用调用返回返回, ,1move(B C,A), 1,move( A B,C)1move( ,A,B,C)输出输出 1: A to C1,A,move(2C B) 1B Cmove( ,A, , )输出输出 2: A to BC1, ,move( ,A B)21move( ,B,C,A)输出输出 1: B to A5输出输出 2: B to C6输出输出 3: A to C调用调用调用调用返回返回调用调用调用调用输出输出 1: C to B3move (1,C,A,B)输出输出 1: A to Cmove (1,A,B,C) 第六讲第六讲 递归递归某庄嘿鹤窖奇瀑蝶审煤密适圈训族皋怂绥畴玄
189、企虫成摔奥际也膀耪频违钦一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计 B输出输出 3: A to C调用调用move(1,C,A,B)输出:输出:1: C to 输出:输出:A to move(1,C,A,B)调用调用move(1,A,B,C) 1: A to Cmove(1,A,B,C)move(2,A,C,B)调用调用move(2,A,C,B)调用调用move(2,B,A,C)调用调用move(1,A,B,C)输出输出 1: A to C输出:输出: to 调用调用 move(1,B,C,A)输出输出 1: B to A
190、move(1,B,C,A)move(2,B,A,C)move(1,A,B,C)move(3,A,B,C)2: B输出输出2: BC1234567 第第六六讲讲 递递归归及及其其实实现现荐豹阅语参速坯桨倦杠陵闲令秆关敢灰敛控窜挛灸闷价概腰邀囱丛施赌任一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计int step=1 ; int step=1 ; /整型全局变量整型全局变量, ,预置预置1,1,步数步数 void move(int , char ,char,char); /void move(int , char ,char,ch
191、ar); /声明要用到的被调用函数声明要用到的被调用函数 void main() void main() int n; int n; printf( printf(“请输入盘数请输入盘数n=n=” ); ); scanf(%d,&n); scanf(%d,&n); printf( printf(“在在3 3根柱子上移根柱子上移%d%d只盘的步骤为只盘的步骤为:n:n”,n); ,n); move(n,a,b,c); move(n,a,b,c); void move(int m, char p, char q, char r) void move(int m, char p, char q, c
192、har r) if (m=1) if (m=1) printf(%d move 1# from %c to %cn, step, printf(%d move 1# from %c to %cn, step, p,r); p,r); step=step+1; step=step+1; elsemove(m-1,p,r,q); elsemove(m-1,p,r,q); printf(%d move %d# from %c to %cn,step, m,p,r); printf(%d move %d# from %c to %cn,step, m,p,r); step=step+1; step=s
193、tep+1; move(m-1,q,p,r); move(m-1,q,p,r); 罕迹茂祥手尔狼哎呢火头死厉拆栅陋郁淳辰郸权己邪淬炮亲宠停谬戎厨衍一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计 该题是该题是20002000年全国青少年信息学奥林匹克的一道试题。叙述如年全国青少年信息学奥林匹克的一道试题。叙述如下:下: 一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱一石柱L L,面积只容得下一只青蛙落脚,同样右岸也有一石柱,面积只容得下一只青蛙落脚,同样右岸也有一石柱R
194、 R,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比一个小。我们将青蛙从小到大,用一个小。我们将青蛙从小到大,用1 1,2 2,n n编号。规定初编号。规定初始时这队青蛙只能趴在左岸的石头始时这队青蛙只能趴在左岸的石头L L上,当然是按号排一个落上,当然是按号排一个落一个,小的落在大的上面。不允许大的在小的上面。在小溪中一个,小的落在大的上面。不允许大的在小的上面。在小溪中有有S S个石柱,有个石柱,有 y y片荷叶,规定溪中的柱子上允许一只青蛙落片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只同样要求按号排一个落一个,大的在下,小
195、的在脚,如有多只同样要求按号排一个落一个,大的在下,小的在上。对于荷叶只允许一只青蛙落脚,不允许多只在其上。对于上。对于荷叶只允许一只青蛙落脚,不允许多只在其上。对于右岸的石柱右岸的石柱R R,与左岸的石柱,与左岸的石柱L L一样一样 ,允许多个青蛙按号排一,允许多个青蛙按号排一个落一个,小的在上,大的在下。当青蛙从左岸的个落一个,小的在上,大的在下。当青蛙从左岸的L L上跳走后上跳走后就不允许再跳回来;同样,从左岸就不允许再跳回来;同样,从左岸L L上跳至右岸上跳至右岸R R,或从溪中荷,或从溪中荷叶或溪中石柱跳至右岸叶或溪中石柱跳至右岸R R上的青蛙也不允许再离开。问在已知上的青蛙也不允许
196、再离开。问在已知溪中有溪中有S S根石柱和根石柱和y y片荷叶的情况下,最多能跳过多少只青蛙?片荷叶的情况下,最多能跳过多少只青蛙?第六讲第六讲 递归及其实现递归及其实现处秤坚执炼惯涨欧新祭麦艾胆歇酥纵惯舵持鲤赡叼浓畅履五尚范柄康荫捏一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计思路:思路: 1 1、简化问题,探索规律。先从个别再到一般,要善于对多个、简化问题,探索规律。先从个别再到一般,要善于对多个因素作分解,孤立出一个一个因素来分析,化难为易。因素作分解,孤立出一个一个因素来分析,化难为易。 2. 2. 定义函数定义函数
197、Jump(S,y) Jump(S,y) 最多可跳过河的青蛙数最多可跳过河的青蛙数 其中:其中: S S 河中柱子数河中柱子数 y y 荷叶数荷叶数第六讲第六讲 递归及其实现递归及其实现涸篮闺斗炙帅捅千租山懈叉鸣谁凡诅腋驱暑疫秆媳蝎抿究弓傅病冕霞常茶一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3. 3. 先看简单情况,河中无柱子:先看简单情况,河中无柱子:S=0S=0, Jump(0,y) Jump(0,y) 当当y=1y=1时,时,Jump(0,1)=2Jump(0,1)=2; 说明:河中有一片荷叶,可以过两只青蛙,起始时说
198、明:河中有一片荷叶,可以过两只青蛙,起始时L L上有上有两只青蛙,两只青蛙,1#1#在在2#2#上面。上面。 第一步:第一步:1# 1# 跳到荷叶上;跳到荷叶上; 第二步:第二步:2# 2# 从从L L直接跳至直接跳至R R上;上; 第三步:第三步:1# 1# 再从荷叶跳至再从荷叶跳至R R上。上。 如下图:如下图:2#2#1#1#2 21 13 3L L左岸左岸R R右岸右岸第六讲第六讲 递归及其实现递归及其实现悯赶琴辣育臣麦彰骂务逐禽纷命敝撇垄索札昏驭憾搓袍稳泄捍熊贾件词稻一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计当当
199、y=2y=2时,时, Jump(0,2)=3Jump(0,2)=3; 说明:河中有两片荷叶时,可以过说明:河中有两片荷叶时,可以过3 3只青蛙。起始时:只青蛙。起始时: 1#1#,2#2#,3# 33# 3只青蛙落在只青蛙落在L L上,上, 第一步:第一步:1# 1# 从从L L跳至叶跳至叶 1 1上,上, 第二步:第二步:2# 2# 从从L L跳至叶跳至叶 2 2上,上, 第三步:第三步:3# 3# 从从L L直接跳至直接跳至R R上,上, 第四步:第四步:2# 2# 从叶从叶2 2跳至跳至R R上,上, 第五步:第五步:1# 1# 从叶从叶1 1跳至跳至R R上,上, 叶叶1 13 31
200、15 5L LR R叶叶2 22 24 4采用归纳法:采用归纳法:Jump(0,y)=y+1Jump(0,y)=y+1; 意思是:在河中没有石柱的情意思是:在河中没有石柱的情况下,过河的青蛙数仅取决于荷况下,过河的青蛙数仅取决于荷叶数,数目是荷叶数叶数,数目是荷叶数+1+1。 第六讲第六讲 递归及其实现递归及其实现栗烟贰挛毗挣锹钠搀岗徒愿甫壤始释赠械炸羚至秃乎丙馋辗褂仟自宫凯懈一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计再看再看Jump(S, y)Jump(S, y)先看一个最简单情况:先看一个最简单情况: S=1 S=1,
201、y=1y=1。从图上看出需要。从图上看出需要9 9步,跳步,跳过过4 4只青蛙。只青蛙。1# 1# 青蛙从青蛙从 L L Y Y;2# 2# 青蛙从青蛙从 L L S S;1# 1# 青蛙从青蛙从 Y Y S S;3# 3# 青蛙从青蛙从 L L Y Y;4# 4# 青蛙从青蛙从 L L R R;3# 3# 青蛙从青蛙从 Y Y R R;1# 1# 青蛙从青蛙从 S S Y Y;2# 2# 青蛙从青蛙从 S S R R;1# 1# 青蛙从青蛙从 Y Y R R;S SY Y5 54 46 6L LR R1 12 23 37 78 89 91#2#4#3#3#1#2#1#1#第六讲第六讲 递归及
202、其实现递归及其实现酵综偶曼撂势寝准拜昏角古句姑呀绢磐噪耘凌曼虚颖目蛆寸谣赠官豁博淡一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计用用L1 L2 L3 L4L1 L2 L3 L4表示左岸石柱上落在一起的青蛙的高度位置。表示左岸石柱上落在一起的青蛙的高度位置。L1 L1 在最上面,在最上面,L4 L4 在最下面的位置。在最下面的位置。引入这个信息就可比较容易地看出对青蛙占位的约束条件。引入这个信息就可比较容易地看出对青蛙占位的约束条件。同理同理R1 R2 R3 R4R1 R2 R3 R4也是如此。也是如此。对水中石柱对水中石柱S
203、S,也分成两个高度位置,也分成两个高度位置S1 S2S1 S2。对荷叶对荷叶Y Y无须分层,因为它只允许一只青蛙落在其上。无须分层,因为它只允许一只青蛙落在其上。t=0t=0为初始时刻,青蛙从小到大落在石柱为初始时刻,青蛙从小到大落在石柱L L上。上。t=1t=1为第一步:为第一步:1#1#从从L L跳至荷叶跳至荷叶Y Y上;上;L L上只剩上只剩2# 3# 4#2# 3# 4#。T=2 T=2 为第二步;为第二步;2#2#从从L L跳至石柱跳至石柱S S上,处在上,处在S2S2位置上,位置上,L L上只剩上只剩3#3#和和4#4#。T=3T=3为第三步,为第三步,1#1#从从Y Y跳至跳至S
204、 S,将,将Y Y清空。清空。这时可看出,这时可看出,S S上有上有1#1#、2#2#,L L上有上有3#3#、4#4#,好象是原来在,好象是原来在L L上的上的4 4只青蛙,分只青蛙,分成了上下两部分,上面的成了上下两部分,上面的2 2只通过荷叶只通过荷叶y y转移到了转移到了S S上。这一过程是一分为上。这一过程是一分为二的过程。即将二的过程。即将L L上的一队青蛙,分解为两个队,每队各二只,且将上面上的一队青蛙,分解为两个队,每队各二只,且将上面的二只转移到了的二只转移到了S S上。这时我们可以考虑形成两个系统,一个是上。这时我们可以考虑形成两个系统,一个是L L,Y Y,R R系系统,
205、一个是统,一个是S S,Y Y,R R系统。前者二只青蛙号大;后者二只青蛙号小。先跳系统。前者二只青蛙号大;后者二只青蛙号小。先跳号大的,再跳号小的。从第五步到第九步可以看出的确是这么做的。号大的,再跳号小的。从第五步到第九步可以看出的确是这么做的。第六讲第六讲 递归及其实现递归及其实现达耀统扣秆荒忍牟拂昔焚窒讫凭弛棠堰圣记瞧盼爬陀疥倡拳几障颐喷扫刨一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计对于对于LYRLYR系统,相当于系统,相当于Jump(0,1)Jump(0,1)对于对于SYRSYR系统,相当于系统,相当于Jump(
206、0,1)Jump(0,1)两个系统之和为两个系统之和为2*Jump(0,1)2*Jump(0,1),因此有:,因此有:Jump(1,1)=2*Jump(0,1)=2*2=4Jump(1,1)=2*Jump(0,1)=2*2=4。 现在再看现在再看S=2S=2,y=1 Jump(2,1) y=1 Jump(2,1) 我们将河中的两个石柱称作我们将河中的两个石柱称作S1S1和和S2S2,荷,荷叶叫叶叫y y,考虑先将考虑先将L L上的青蛙的一半借助于上的青蛙的一半借助于S2S2和和y y转移到转移到S1S1上,当然是一半小号的青蛙在上,当然是一半小号的青蛙在S1S1上,大的留在上,大的留在L L上
207、。上。y yLR RS1S1S2S2第六讲第六讲 递归及其实现递归及其实现绪霹纤谊济姐耻亭书庚爸仓捅氟茵瓮著念酌踪猴喧远婪尚瞅以确尹岗击酝一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计这样这样 L S1 S2 y R L S1 S2 y R 系统分解为系统分解为 : (L S2 y R L S2 y R 系统)系统) + + (S1 S2 y R S1 S2 y R 系统)系统)= 2 * = 2 * (L S2 y R L S2 y R 系统)系统)= 2 * Jump(1,1)= 2 * Jump(1,1)用归纳法用归纳法
208、Jump(S, y)=2*Jump(S-1, y)Jump(S, y)=2*Jump(S-1, y)第六讲第六讲 递归及其实现递归及其实现润萎戴焙献桶惟市矽济误绕蓟闸睹纠岳饯潞典马郴猩藐笺依怯体郝杨证慈一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计main() int s,y,sum;int s,y,sum;/整型变量整型变量,s,s为河中石柱数为河中石柱数,y,y为荷叶数为荷叶数 printf(printf(请输入石柱数请输入石柱数s= );s= ); scanf(%d,&s);scanf(%d,&s); printf(pr
209、intf(请输入荷叶数请输入荷叶数y= );y= ); scanf(%d,&y);scanf(%d,&y); sum=Jump(s,y);sum=Jump(s,y);/Jump(s,y)/Jump(s,y)为被调用函数为被调用函数 printf(printf(“Jump(%d,%d)=%dnJump(%d,%d)=%dn”,s,y,sum);,s,y,sum);int Jump(int r,int z)int Jump(int r,int z) int k; int k;if (r=0)if (r=0) k=z+1; k=z+1; elsek=2*Jump(r-1,z); elsek=2*Ju
210、mp(r-1,z); return(k);return(k); 第六讲第六讲 递归及其实现递归及其实现钙荷污蔽匈赠侠囚邪颂模湍融潍两腿踢采伐贬逝毗汝狰矽半捷圆黍挟痒毙一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计指针是指针是C C语言中的一个重要概念。掌握指针的用法,可使程序简语言中的一个重要概念。掌握指针的用法,可使程序简洁、高效、灵活,但并不难学。洁、高效、灵活,但并不难学。 为了了解什么是指针,先看一个小故事为了了解什么是指针,先看一个小故事 地下工作者阿金接到上级指令,要去寻找打开密电码的密地下工作者阿金接到上级指令,
211、要去寻找打开密电码的密钥,这是一个整数。几经周折,才探知如下线索,密钥藏在钥,这是一个整数。几经周折,才探知如下线索,密钥藏在一栋三年前就被贴上封条的小楼中。一个风雨交加的夜晚,一栋三年前就被贴上封条的小楼中。一个风雨交加的夜晚,阿金潜入了小楼,房间很多,不知该进哪一间,正在一筹莫阿金潜入了小楼,房间很多,不知该进哪一间,正在一筹莫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿金毫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿金毫不迟疑,抓起听筒,只听一个陌生人说:不迟疑,抓起听筒,只听一个陌生人说:“去打开去打开211211房间,房间,那里有线索那里有线索”。阿金疾步上楼,打开。阿金疾步
212、上楼,打开211211房间,用电筒一照,房间,用电筒一照,只见桌上赫然只见桌上赫然6 6个大字:地址个大字:地址10001000。阿金眼睛一亮,迅速找到。阿金眼睛一亮,迅速找到10001000房间,取出重要数据房间,取出重要数据6666,完成了任务。,完成了任务。第七讲 指针倚腑函惕怠犀面物损叫机敞误尉隔宴荆惮旗授构世殃琐待隆且铬廉九颗鸥一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计2111000P说明:说明: 1 1、数据藏在一个内存地址单元中,地址是、数据藏在一个内存地址单元中,地址是10001000。 2 2、地址、地址
213、10001000又由又由P P单元所指认,单元所指认,P P单元的地址为单元的地址为211211。 3 3、6666的直接地址是的直接地址是10001000;6666的间接地址是的间接地址是211211;211211中存的是直接中存的是直接地址地址10001000。 4 4、称、称P P为指针变量,为指针变量,10001000是指针变量的值,实际上是有用数据藏是指针变量的值,实际上是有用数据藏在存储器中的地址。在存储器中的地址。100066第七讲 指针钉瓮容或峰唬绘裹否阜溜额蟹饲粱桂糖鹅暗纪特疡共柔耘芬方锌愈拭振刘一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二
214、学期二教C语言程序设计语言程序设计指针变量指针变量用来存放另一变量地址的变量用来存放另一变量地址的变量变量的指针就是变量的地址。变量的指针就是变量的地址。 1 1、指针的概念、指针的概念指针指针是一种特殊的变量,特殊性表现在类型和是一种特殊的变量,特殊性表现在类型和值上。值上。 从变量讲,指针也具有变量的三个要素:从变量讲,指针也具有变量的三个要素: (1 1)变量名,这与一般变量取名相同,由英文字符开始。)变量名,这与一般变量取名相同,由英文字符开始。 (2 2)指针变量的类型,是指针所指向的变量的类型,而不是)指针变量的类型,是指针所指向的变量的类型,而不是自身的类型。自身的类型。 (3
215、3)指针的值是某个变量的内存地址。)指针的值是某个变量的内存地址。第七讲 指针檬剪迫贮佩棚敖芹伞磨斥嗜丘咋弃硼而眷渝聪蓝咨锡贾兢网灸须象诲闽蕾一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计从上面的概念可知,指针本身类型是从上面的概念可知,指针本身类型是intint型,因为任何内存地址型,因为任何内存地址都是整型的。但是指针变量的类型却定义成都是整型的。但是指针变量的类型却定义成它所指向的变量它所指向的变量的类型的类型。 2 2、指针的定义(说明,先说明后引用)、指针的定义(说明,先说明后引用) 例如:例如: int *p, *
216、q;int *p, *q; / / 定义定义p,qp,q为指向整数类型变量的指针为指向整数类型变量的指针 float *point; float *point; / / 定义定义pointpoint为指向为指向floatfloat型变量的指针型变量的指针double *pd; double *pd; / / 定义定义pdpd为指向为指向doubledouble型变量的指针型变量的指针 int (*pa)10;int (*pa)10;/ / 定义定义papa为指向为指向intint型数组的指针型数组的指针 int (*pu)();int (*pu)();/ / 定义定义pupu为指向为指向int
217、int型函数的指针型函数的指针 int *qq;int *qq;/ / 定义定义qqqq为指向为指向intint型指针的指针型指针的指针 还有指向结构、联合的指针,后面再介绍还有指向结构、联合的指针,后面再介绍第七讲 指针膏狮臻王印神檀少拿艘肛藐粗啊僚靶信供挤蓉火绷望匙光脯隔口肤帜捂滦一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计3 3、指针赋值、指针赋值 例例 int akey;int akey;/ / 定义一个整型变量定义一个整型变量akey akey int *p,*q;int *p,*q;/ / 定义定义p,qp,q为
218、指向整型变量的指针变量为指向整型变量的指针变量 akey=66;akey=66;/ / 将将6666赋给赋给akey akey p = &akey;p = &akey;/将变量将变量akeyakey的地址赋给的地址赋给p p,这时见图,这时见图1 1 q = p;q = p; / / 将将p p的值赋给的值赋给q q,见图,见图2 266&akeypakey&pp变量的地址变量的地址&akeyakey变量的地址变量的地址图图 1的说明:将的说明:将akey变量的地址赋给指针变量的地址赋给指针p,意味着让指针意味着让指针p指向指向akey图图1第七讲 指针艾笨衷换瞳姑飘碑檬捂敷圾踪匀桓颜坑节甄揉
219、盔开剩播杨咏皱辑血娇审跋一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计第七讲 指针66&apapq图图2的说明:当着执行的说明:当着执行q=p;之后,之后, 中所存的中所存的a变量的变量的地址值,也就被放到地址值,也就被放到 变量中,意味着让指变量中,意味着让指针针q也指向也指向a 图图2&aq&p&qq=p;亨注仙告些焦貌狐邱扑居禽复项澜币挣妖堡谷券皿喀奢崖完荚垫沉胸膳家一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计#include #include voi
220、d main()void main() int a5=0,1,2,3,4; /int a5=0,1,2,3,4; /定义数组,赋初值定义数组,赋初值 int *p1,*p2; /int *p1,*p2; /定义指针变量定义指针变量 p1=&a1; /p1=&a1; /赋值给指针变量,让赋值给指针变量,让p1p1指向指向a1 a1 p2=&a2; /p2=&a2; /赋值给指针变量,让赋值给指针变量,让p2p2指向指向a2a2printf(a1=%d;a2=%dn,*p1,*p2); printf(a1=%d;a2=%dn,*p1,*p2); 第七讲 指针岔截净沼券殉蹭函飘爪聘改惟葬罐隙漾兄庭辉
221、来樊所寺齿毕抗猪曲压扛贱一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计43210&a0&a0&a1&a1&a2&a2&a3&a3&a4&a4&a1&a2&p1&p2p1p2p1p1和和p2p2分别指向分别指向a1,a2a1,a2,这里,这里 & & 取地址运算符取地址运算符 * * 指针运算符(间接访问运算符)指针运算符(间接访问运算符) *p1*p1间接访问间接访问p1p1所指向的内存单元,当然是输出所指向的内存单元,当然是输出a1a1的值的值 *p2*p2间接访问间接访问p2p2所指向的内存单元,当然是输出所指向的内存单元
222、,当然是输出a2a2的值的值第七讲 指针聚京遭裂宜闪波隧涝蓉苫沿住祖涪侗远惜秦屡秆声熔脱海翌摄缉翔歹梯伙一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计4 4、向指针所指向的内存单元赋值、向指针所指向的内存单元赋值void main()void main() int akey,b;int akey,b;int *p,*q; int *p,*q; akey=66; akey=66; p=&akey; p=&akey; q=&b; q=&b; *q=*p; *q=*p; printf(printf(“b=%dnb=%dn”,b);
223、,b); printf(printf(“*q=%dn*q=%dn”,*q); ,*q); 第七讲 指针惶琉悔疙吹粳婶致核牟读懦葬活迷手鸽石孵皋肖糖匠刘翔晒但锁崭遮脚皆一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计66 66 &ak ey p &akey *q=*p &b q &b 第七讲 指针齐责诡睹桂楷痊毅古卞郧莲村根仲饺瘫以回庶呛凹淘柬慷均沮僧眷拖榷儡一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计5 5、指针与数组、指针与数组void main() voi
224、d main() int a5=1,3,5,7,9; int a5=1,3,5,7,9; int *p; int *p; int i; int i; p=a;p=a; for(i=0;i5;i=i+1) for(i=0;i5;i=i+1) printf(a%d=%dn,i,*p); printf(a%d=%dn,i,*p); p=p+1; p=p+1; 第七讲 指针狞朗壕垒抬递慨恐狼沛蛊勃配废冶韭遗午凋屁绣富慢蔚蜡吵肃垃跃栽跌显一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计说明说明 (1) p=a; (1) p=a; 这里数组
225、名作为数组的起始地址,即这里数组名作为数组的起始地址,即a0a0的地址。的地址。因此因此 p=a p=a 等效于等效于 p=&a0; p=&a0; (2) p=p+1; (2) p=p+1; 如如p p指向指向a0, a0, 则则p=p+1p=p+1之后,之后,p p指向指向a1 a1 (3) (3) 如果如果p=a p=a 等效于等效于 p=&a0; p=&a0;则则 p=a+4 p=a+4 等效于等效于 p=&a4; p=&a4;a5a5a4a4a3a3a2a2a1a1*(p+3)*(p+3)*(p+4)*(p+4)*(p+2)*(p+2)*(p+1)*(p+1)*p*ppp+1p+2pp
226、+1p+2等效等效第七讲 指针剃稀拒琳姨招逢烧蛀炽嘲什宗杨帧烛诌氢疯议脱蕉亡窄肆潜咬略促颁馅丘一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计void main() int a5=1,3,5,7,9; int *p; int i=0; for(p=a;pnum来代替即以下三种形式是等价的: a)结构体变量成员名 b)(*p) 成员名 c)p-成员名第八讲 结构体港憾诧纂秆漓渝马俏叮该铱邱黑鲸减坪每朋户杆朝留谈履径桓获晰傻婆铆一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言
227、程序设计用指针处理链表(1)链表的基本概念 链表是一种重要的数据结构,主要用以实现对数据的动态存储,链表中包含若干个结点( 又可称为元素),每个结点包含的数据有两部分:一是用户的实际数据,二是下个结点的地址信息,这样,结点都按这个原则“连接”起来,在这种链式结构中,每个结点只有一个“前驱”和一个“后继”,所以,只要知道链中第一个结点的地址,就可以遍访链中的其他结点。第八讲 结构体沸观弓恒藩需恒逾担迭泰瓤棕瀑恭捻助主嫂袄催背裂钎产灿盒联遇融七颅一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计头指针:存储第一个结点的指针变量 (*h
228、ead)表头: 由头指针指向的结点,有后继而无前驱表尾:表的最后一个结点,有前驱而无后继,其下一个的地址信息为空(NULL)结点的表述:以结构体变量描述: struct student int num; int score; struct student *next; ;第八讲 结构体恰暇忘宝半谣睬油毖呕作铺膨辨缕问孵热秃绩浴奶赡蔽爱痞床帝驴象战熔一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计第八讲 结构体401 102 203 154 NULL头指针head数据指针首地址40首地址10首地址20首地址15如下所示为典型的单链
229、表结构: 鄙爷型烷竿君漏挟延叹雁件锡智蒙蒂栗链聂嗽离演携堵幂睬腔暇瘩款睦魂一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计5 5head6 61010nullnull151512128 8链表的建立链表的建立例子:例子:已有一个如图所示的链表。它是按结点中的整数域从小已有一个如图所示的链表。它是按结点中的整数域从小到大排序的。现在要插入一个结点,该节点中的数为到大排序的。现在要插入一个结点,该节点中的数为1010。待插入结点待插入结点p第八讲 结构体介普售声野预疫焚汹责夸艾船侈民抱摩激勤梭矮粕胯率穗磅潦累嗡略柠痢一教学对象计算机
230、科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计分析:分析: 考虑将结点考虑将结点p p插入链表插入链表headhead中,分如下三种情况:中,分如下三种情况:1 1、第一种情况,链表还未建成(空链表),待插入结点、第一种情况,链表还未建成(空链表),待插入结点p p实实际上是第一个结点。这时必然有际上是第一个结点。这时必然有head=nullhead=null。只要让头指针指向只要让头指针指向p p就可以了。语句为就可以了。语句为head = p; p-next = null;head = p; p-next = null;2 2、第二种情况
231、,链表已建成,待插入结点、第二种情况,链表已建成,待插入结点p p的数据要比头结的数据要比头结点的数据还要小,这时有点的数据还要小,这时有p-num num p-num num 。当然当然p p结点要插在结点要插在headhead结点前。结点前。3 3、第三种情况,链表已建成,待插入结点、第三种情况,链表已建成,待插入结点p p的数据比头结点的数据比头结点的数据大,需要找到正确的插入位置。这时,可以借助两的数据大,需要找到正确的插入位置。这时,可以借助两个结构指针个结构指针r r和和q q,利用循环比较来找到正确位置。然后将,利用循环比较来找到正确位置。然后将结点结点p p插入到链表中正确的位
232、置。插入到链表中正确的位置。第八讲 结构体答澎井俺裕压吨土兽走旬搔舌寒动茎试加馆秤晤啄犬麓双芋足饵柑夺殷辫一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计6 6head8 81212nullnull1313p1515qr说明:说明:这种情况下,这种情况下,p p结点已经与链表的第一个结点比结点已经与链表的第一个结点比较过了,所以从链表的下一个结点开始比较。较过了,所以从链表的下一个结点开始比较。138138,继续比较。,继续比较。第八讲 结构体赎勤旱矗剖闸斗列抚隶晃谗坷介门属隙皖硼瘴榜荚携邀稗庙笼貌锑棍永挪一教学对象计算机科学与
233、技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计说明:说明:13121312,继续比较。,继续比较。6 6head8 81212nullnull1313pnullnull1515qr第八讲 结构体悉各嫩置代比费吹哪晤择蚂斡大龋揉极伍睁疗太宋咋按疲佬沏瑚侨饵抹惟一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计说明:说明:131513next = p; p-next = q;r-next = p; p-next = q;6 6head8 812121313pnullnull1515qr第八
234、讲 结构体久揣屠毁彰挫饵意捧甲醛促佯费屯盂截抵柱露晚谴峭乌磐邻伪煤盒铬甸宜一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计#include #include / / 预编译命令预编译命令 #include #include / / 内存空间分配内存空间分配 #define null 0#define null 0/ / 定义空指针常量定义空指针常量 #define LEN sizeof(struct numST)#define LEN sizeof(struct numST) struct numST struct numST
235、int num;int num; struct numST *next;struct numST *next; ; ; 第八讲 结构体孟轮呀唾哩鸯聂澳匙只惫野瘩凰陶滁汁桐安畏惋垛结文灭兄献赖杉慢凹郁一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计/ / 被调用函数被调用函数insert()insert(),两个形参分别表示链表和待插入的结,两个形参分别表示链表和待插入的结点点 void insert (struct numST *phead, struct numST *p) void insert (struct numST
236、*phead, struct numST *p) struct numST *q,*r;struct numST *q,*r; if (*phead)=null)if (*phead)=null)/ / 第一种情况第一种情况,链表为空,链表为空 *phead = p; *phead = p;/ / 链表头指向链表头指向p p return;return;/ / 完成插入操作,返回完成插入操作,返回 elseelse/ / 链表不为空链表不为空 / / 第二种情况第二种情况,p p结点结点numnum值小于链表头结点的值小于链表头结点的numnum值值 if ( (*phead)-num p-n
237、um)if ( (*phead)-num p-num) / / 将将p p结点插到链表头部结点插到链表头部 p-next = *phead;/ p-next = *phead;/ 将将p p的的nextnext指针指向链表头指针指向链表头(*phead) (*phead) *phead = p; *phead = p;/ / 将链表头赋值为将链表头赋值为p p return;return;/ / 返回返回 第八讲 结构体最涯而觉墟糯朝焉戴烛托放托龄完股旨怂涯冈闽桅背滴拢萤肌滴怂蔬幂叮一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设
238、计/ / 第三种情况第三种情况,循环查找正确位置,循环查找正确位置 r = *phead;r = *phead;/ r/ r赋值为链表头赋值为链表头 q = (*phead)-next;q = (*phead)-next;/ q/ q赋值为链表的下一个结点赋值为链表的下一个结点 while (q!=null) while (q!=null) / / 利用循环查找正确位置利用循环查找正确位置 / / 判断当前结点判断当前结点numnum是否小于是否小于p p结点的结点的num num if (q-num num) if (q-num num) r = q; r = q;/ r/ r赋值为赋值为q
239、 q,即指向,即指向q q所指的结点所指的结点 q = q-next;/ q q = q-next;/ q指向链表中相邻的下一个结点指向链表中相邻的下一个结点 else else/ / 找到了正确的位置找到了正确的位置 break; break;/ / 退出循环退出循环 / / 将将p p结点插入正确的位置结点插入正确的位置 r-next = p; r-next = p; p-next = q; p-next = q; 第八讲 结构体墨红履卿倘款同疽窥恒迎殆档纹驮诧玩碰湛报涟觉瓤椭超辉客的敖矢缺装一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序
240、设计语言程序设计void main()void main()/ / 主函数开始主函数开始 / / 函数体开始函数体开始 struct numST *head, *p;struct numST *head, *p; / ST/ ST型结构指针型结构指针 head = null;/ head = null;/ 分配两个分配两个STST结构的内存空间,用于构造链表结构的内存空间,用于构造链表 head = (struct numST *) malloc(LEN); head = (struct numST *) malloc(LEN); head-next = (struct numST *) ma
241、lloc(LEN); head-next = (struct numST *) malloc(LEN); / / 为链表中的两个结点中的为链表中的两个结点中的numnum赋值为赋值为5 5和和10 10 head-num = 5; head-num = 5; head-next-num = 10; head-next-num = 10; head-next-next = null; head-next-next = null; / / 链表尾赋值为空链表尾赋值为空 / / 构造一个结点构造一个结点p p,用于插入链表,用于插入链表 p = (struct numST *) malloc(LEN
242、); p = (struct numST *) malloc(LEN); p-num = 8; p-num = 8; p-next = null; p-next = null; insert(&head, p);insert(&head, p);第八讲 结构体菊场撬铅圆哄未筋虏稼盒梁劝攒赎潞冻纽规踪哦瘸钙入纂仙遗则挫廊霹慨一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计动态地开辟和释放存储单元的函数 malloc( size ) 在内存的动态存储区中分配一个长度为size的连续空间。 此函数值是一个指向分配域起始地址的指针。 c
243、alloc( n, size ) 在内存的动态存储区中分配n个长度为size的连续空间 此函数值是一个指向分配域起始地址的指针。 free( ptr ) 释放由ptr指向的内存区。 ptr是最近一次调用calloc或malloc函数时返回的值(指针) 第八讲 结构体妄浦斯擎膏玻痈渤片暑埃离贿稚街簇淹露绚翠氦共俭醉统仪恢点情虎籍儡一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教C语言程序设计语言程序设计例: a)p=(float *)malloc(4); 开辟4个字节的存储空间,并把此地址赋给指针p b)new=(struct work *)malloc(struct work); 开辟一个能容纳结构变量work的空间,并把这个空间的首地址赋给结构指针new 第八讲 结构体仆非巷狙谤汽洗缕霜谁提己借扫惟阔韶瑞酥馋崖苛氨阅俭酱潞蒸饿玻坊硒一教学对象计算机科学与技术系新生第二学期二教一教学对象计算机科学与技术系新生第二学期二教