版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/9/11,C与C+程序设计 第三章 程序的流向控制,李堂秋 厦门大学计算机科学系,2020/9/11,3.1语句和程序块,简单语句 C中,任何表达式的后面加一个分号就成了语句: x = 0; i+; printf(“%d %dn”,a,b); 分号是语句的终结符(而不是分隔符),即每一个 单语句的后面一定要有一个 分号。 把0-n个语句用 括起来组成复合语句,称程序块: 因为复合语句本身已是一个完整的语句,所以大括符的后面不用加分号。,1,3.2 if - else,if-else语句用于表达决策,一般的格式为:if () /*如果表达式成立*/ /* 执行语句1*/ else /*
2、 否则*/ /* 执行语句2*/ 由于else部分是可选的,在组成复合语句时往往会引起歧义: if (n 0) if(n 0) if (n 0) if (a b) if(a b) if (a b) z = a; 对比 z = a; 对比 z = a; else else z = b; z = b; else z = b;,2,if - else(续),下面是一个很难发现的错误:if (n = 0) for ( I = 0; I 0) printf(“.”); retun I; else printf(“error - n is negativen”);因为C编译器会认为else是和内层的if配
3、对的,3,3.3 else -if,多分叉选择结构:if ( ) ;else if () ;else if () ;else if () ;else ;,4,else -if (续),下面是多分支选择的一个典型应用:/*binsearch: find x in v0 vmid) low = mid + 1; else /* found match*/ return mid; return -1; /*no match*/,5,3.4 switch,switch语句是一个多分支选择的语句,它测试表达式的值是否能与一个常数表达式的值相匹配,一般的格式如下:switch () case : case
4、 : . default: 如果与其中的一个常数表达式的值匹配,程序就从它后面的语句开始执行,直到遇到break语句;如果没有break语句,执行到switch语句的结束; 如果没有匹配的常数表达式,就执行default后面的语句。 default 是可有可无的,如果没有这语句,则什么也不做。,6,switch (续),#include main( ) /* count digits, white space, others*/ int c, i, nwhite,nother,ndigit10;nwhite = nother = 0;for (i=0;i 10;i+) ndigiti = 0;
5、while (c = getchar( ) != EOF) switch (c ) case 0: case 1: case 2:case 3:case 4: case 5:case 6:case 7:case 8:case 9: ndigitc - 0+; break; case :case n:case t: nwhite+; break; default: nother+; break; printf(“digits = “);for (i = 0; i 10; i+) printf(“ %d”, ndigiti);printf(“, white space = %d, other =
6、%dn”, nwhte, nother); ,7,3.5循环-while, for,while 循环格式如下:while () 如果的值是非0,执行语句,再重复计算循环直到的值为0,while语句结束转去执行它后面的语句。 for语句的格式如下:for (;) 它相当于:;while () ;,8,循环-while, for(续1),for 循环的三个表达式的功能不同,但均可省略,省略时表示永真,要通过循环体内的break语句才能结束循环,如:for ( ; ;) 用while还是for主要根据个人的爱好,但一般在不用初始化和重修改变量是用while是恰当的:while (c = getcha
7、r( ) = | c = n | c = t) ;反之,使用for更好些:for (i = 0; i n; i+) ; for 语句与其他语言中的for有不同的地方 三个表达式都可以是任意的表达式 循环变量和循环条件可在循环体内修改 循环变量的值在循环结束时仍保持着,9,循环-while, for(续2),for 循环的例子,类似与库函数strtol#include /* atoi: convert s to integer; version2*/int atoi(char s ) int i, n, sign; for (i = 0; isspace(si) ;i+) ; sign = (s
8、i = -) ? -1 : 1; if (si = +) | si = -) i+; for (n = 0; isdigit(si); i+) n = 10 * n + (si - 0); return n * sign;,10,循环-while, for(续3),for 循环的例子,shell排序/* shellsort: sort v0,v1,.,vn-1*/void shellsort(int v , int n) int gap, i, temp; for (gap = n/2; gap 0 ;gap /=2) for (i = gap; i = 0 ,11,循环-while, for
9、(续4),逗号运算符,在for 循环的使用使之功能更大,例子:/* reverse: reverse a string s in place*/void reverse(char v ) int c, i, j;for (i = 0, j = strlen(s) - 1; i ,.,,其含义是:依次运算各表达式,最后返回的值作为整个表达式的值。它与变量定义中的逗号,以及变量表中的逗号含义是不同的。 逗号表达式的另一种用法:for (i = 0, j = strlen(s) -1; i j; i+, j-) c = si, si = j, sj = c;,12,3.6 循环-do-while,d
10、o-while 循环格式如下:do while () 先执行,再检查的值是否为非0,是,继续执行语句,再重复计算循环直到的值为0,do-while语句结束转去执行它后面的语句。它与while语句的不同之处是它至少执行一次。 do-while 用的不如 while 语句多。,13,循环-do-while(续),下面的例子是do-while一种比较合理的用法:/* itoa: convert n to characters in s */void itoa(int n, char s ) int i, sign; if (sign = n) 0); if (sign 0) si+ = -; si
11、= 0; reverse(s):,14,3.7 break和continue,break使最内层的循环终止退出;使最内层switch语句结束,执行后续的语句。/* trim: remove trailing blanks,tabs,newlines */int trim(char s ) int n; for (n = strlen(s) - 1; n = 0; n-) if (sn != ; . /*想一想在while, do-while,for 等不同循环中的作用*/,15,3.8 goto和标号,goto 和标号的配合,可以是程序从很深的嵌套中跳转出来: for( . ) for( .
12、) for( . ) . if () goto error; error: 标号是任意合法标识符后面加一个:,如上述的error:对于goto来说,标号的可见范围是一个函数内部。,16,goto和标号(续1),C提供goto语句,在一些特定的情况下,使用goto使程序变个比较精练:for (i = 0; i n; i+) for (j = 0; j m; j+) if (ai = bj) goto found; /*找到共同的元素*/ . /* 没找到处理 */found: ./*找到后的处理*/ 使用goto的程序总能找到不用的替代品,可能会增加一些变量和测试:found = 0;for (i = 0; i n if (found) ./*找到后的处理*/else ./* 没找到处理 */,17,注意:goto不是必需的,为使程序有良好的接构, 应尽量避免使用goto,练习,写一个程序htoi(s),它把一个表示16进制数的字符串(前面可能有0 x或0X)转换成对应的整数,16进数字符串中允许的数字是0-9,a-f 或A-F. 写一个函数any(s1,s2), 它返回s1中第一个包含在s2中的任何字符的位置,如果s1中不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年新疆中考语文真题含答案
- 2026年青海小升初语文真题考试试题及答案
- 2026年四川专升本(计算机基础)真题带答案
- 智能公交站台建设项目可行性研究报告
- 2026年山东省济宁市重点学校初一入学数学分班考试试题及答案
- 2026年宁夏(小升初)数学历年真题及答案
- 光伏模拟考试题及答案
- 第26讲 暑假预习成果测试卷(第1-4章)(教师版)-新九年级数学暑假讲义(北师大版)
- 2026年山东省青岛市高三下学期第一次联考语文试卷含解析
- 2026届临沧市高考仿真卷语文试卷含解析
- 电源基础知识培训资料课件
- DBS教材11大部屋系统
- 农村兄弟分户协议书样本
- 2025年宪法知识竞赛试题库(含答案)
- 河道管理范围内建设项目技术审查导则(试行)
- 改造消防申请书
- 婚前教育手册
- 高效能人士的七个习惯(课件)
- DL∕T 397-2010 电力地理信息系统图形符号分类与代码
- 全国疾病预防控制机构工作规范
- 2024年四川省农作物植保员技能竞赛参考试题库(含答案)
评论
0/150
提交评论