清华大学C语言谭浩强第3章.ppt_第1页
清华大学C语言谭浩强第3章.ppt_第2页
清华大学C语言谭浩强第3章.ppt_第3页
清华大学C语言谭浩强第3章.ppt_第4页
清华大学C语言谭浩强第3章.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章结构化程序设计,第3章 结构化程序设计,3.1结构化程序设计的思想及流程图 3.2结构化程序设计的三种基本结构 3.3 几种转移控制语句 3.4 C程序语句 3.5 C程序举例,3.1结构化程序设计的思想及流程图,3.1.1结构化程序设计思想 3.1.2流程图,3.1.1结构化程序设计思想,“结构化程序设计”设计思想的核心是“逐步求精”,即将可执行程序的编制分为若干步,第一步编制出的程序抽象程度最高,第二步编制出的程序抽象程度有所降低,最后一步编出的程序即为可执行程序。 结构化程序设计方法又称为“自顶向下”法或“逐步求精”法。,3.1.2流程图,流程图是用一些图框表示各种操作 。 美国国家标准化协会(ANSI)规定了一些常用的流程图符号(如图3-1所示),已为世界各国程序工作者普遍采用。,3.2结构化程序设计的三种基本结构,3.2.1顺序结构 3.2.2选择结构 3.2.3循环控制 3.2.4循环的嵌套 3.2.5几种循环的比较,顺序结构、选择结构、循环结构三种基本结构的示意如图3-2所示。,3.2.1顺序结构,顺序结构是程序中的语句按照书写的顺序,自上而下地执行。如图3-2(a)所示,S1和S2是语句或语句序列,S1、S2依次被执行,但只有S1执行完时,S2才被执行。这种结构的特点是程序总是从第1条语句开始执行,依次执行完所有的语句后结束程序。因此顺序结构用来描述依次执行的操作运算。,例3.1输入一个三位整数,依次输出该数的正(负)号和百位、十位、个位数字。 #include main() char c1,c2,c3,c4; int x; scanf(“%d“, ,在运行时,从键盘输入: -345 则输出为: - 3 4 5 接着从键盘输入: 678 则输出为: + 6 7 8,例3.2输入三角形的三边长,求三角形面积。 分析:只要给出三角形的三边a、b、c,即可根据公式area=s(s-a)(s-b)(s-c)1/2计算该三角形的面积,其中s=(a+b+c)/2。 #include main() float a,b,c,s,area; printf(“please input three border of the triangle: “); scanf(“%f,%f,%f“, ,该程序的运行结果如下: please input trigon of three border:3,4,5 a=3.00 b=4.00 c=5.00 s=6.00 area=6.00,3.2.2 选择结构,选择结构有三种形式:单分支结构、双分支结构、多分支结构。 C语言中能够实现选择结构设计的语句有if语句和switch语句,其中switch语句可以用if语句来替代。,下面是一个最常用的双分支的例子: if(m0) n=-1; else n=1; 上述程序段表示:如果m小于0,则n等于-1,否则n等于1。,1if语句,C语言提供了三种形式的if语句: 1)if单分支选择语句if语句。 2)双向分支语句ifelse语句。 3)if多向分支语句else if语句。,1)if单分支选择语句if语句,if语句的语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。 if语句的流程图如图3-3所示。,if语句的功能是:首先计算的值,当的值为真(非0)时,执行;否则,表达式值为假(0),执行后面的命令。,例3.3求两个数中的较大者并输出。 main() int m,n,max; printf(“n input two numbers:“); scanf(“%d%d“, /*输出较大的数*/ ,该程序的运行情况如下: input two numbers:3443 max=43,2)双向分支语句ifelse语句,ifelse语句在C语言中称为双向分支语句,也就是根据用户设置的条件表达式的值,选择两个操作中的一个来执行。 该语句的语法格式为: if(条件表达式) 语句1; else 语句2;,例如: if(a0) a=0; else a=-11;,ifelse语句的流程图如图3-4所示。,ifelse语句也可以表示为: if(测试表达式) 语句1; 语句2; else 语句n; 语句n+1; ,例如: if(a0) b=a+b; a=0; c+; else c=0; b=0; ,3)if多向分支语句else if语句,当有多个分支选择时,可以采用如右所示的多向分支语句来实现:,if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else if(表达式n) 语句n; else 语句n+1; 下一条语句;,这种if语句在执行时,依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n+1。然后继续执行后续程序。多向分支语句的流程图如图3-5所示。,例如: if(a=1) c=A; else if(a=2) c=B; else if(a=3) c=C; else if(a=4) c=D; else c=E;,使用分支结构语句时应注意以下几个问题: (1)三种形式的if语句中,在if关键字之后均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其他表达式,如赋值表达式等,甚至也可以是一个变量。 (2)在if语句中,条件判断表达式必须用括号括起来。 (3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用大括号“”和“”括起来组成一个复合语句。但要注意的是在“”之后不能再加分号。,4)多层嵌套的if else语句使用,例3.4 输入一个字符,如果是数字则输出A,如果是大写字母则输出B;如果是小写字母则输出C;如果是空格则输出D;如果是回车换行符则输出E,是其他符号时则输出F。 main() char c; scanf(“%c“, /* 如果输入的是数字,则输出字符A */,else if (A %cn“,c,B); /* 如果输入的是大写字母,则输出字符B */ else if (a %cn“,c,C); /* 如果输入的是小写字母,则输出字符C */ else if (c= ) printf(“c=%c- %cn“,c,D); /* 如果输入的是空格,则输出字符D */ else if (c=n) printf(“c=%c- %cn“,c,E); /* 如果输入的是回车换行,则输出字符E */ else printf(“c=%c- %cn“,c,F); /* 以上都不是,则输出字符F */ ,下面是输入一个字符后程序的运行结果: 5 c=5- A H c=H- B & c=&- F 上述程序中的前4个“ifelse语句”结构中else后面的语句又是一个“if else语句”,这种结构在C语言中称为多层嵌套的if else语句。,在嵌套中,if和else总是成对出现的,所以在设计嵌套的“if else语句”时,要弄清楚else和前面的哪个if相配对。 C语言规定: “else总是和前面最近的if相配对”。 例如,下面的程序段: if(a=c,2.switch语句,switch语句是多向分支选择语句,即根据多个条件表达式的值,从多个操作中选择一个满足条件的操作来执行。 其语句格式如右所示:,switch(表达式) case常量表达式1: 语句1;break; case常量表达式2: 语句2;break; case常量表达式n: 语句n;break; default: 语句n+1;break; ,switch语句中的“表达式”可以是任何类型,常用的是字符型或整型表达式。 “常量表达式”是由常量组成的表达式,所有的常量表达式的值必须互不相同。 break语句用来跳出switch语句,若语句i后面没有break语句,则不用判断常量表达式i+1,继续执行语句i+1,这样有可能影响程序的执行结果,因此一般情况下,break语句不要省略。 switch语句的执行过程是:首先判断表达式的值;然后在常量表达式i中找到与表达式匹配的常量表达式,并执行该常量表达式后面对应的语句;若没有找到与表达式匹配的常量表达式,则执行default语句后面的语句n+1。default语句可以省略。,switch语句的流程图如图3-6所示.,例3.5编写一个程序,用来显示某一星期。 #include main() int x; printf(“please input integer number(17):-“); scanf(“%d“, ,下面是上述程序的运行情况。 please input integer number(17):- 4 Thursday Friday Saturday Sunday you are wrong!,说明: 在switch语句中,“case 常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句。 所以这道程序出现了输入4之后,执行了case 4以及后面的所有语句,输出了“Thursday”及以后的所有单词的情况。 为了避免输出不应有的结果,可在每一个case语句之后增加一个break语句,使每一次执行之后均可跳出switch语句。,因此上述switch结构可改为: switch(x) case 1:printf(“Mondayn“);break; case 2:printf(“Tuesdayn“); break; case 3:printf(“Wednesdayn“); break; case 4:printf(“Thursdayn“); break; case 5:printf(“Fridayn“); break; case 6:printf(“Saturdayn“); break; case 7:printf(“Sundayn“); break; default:printf(“ you are wrong!n“); 这样一来,如果输入的是4,则只输出“Thursday”。,注意:break语句只能跳出一层,如: main() int x=1, y=0; switch(x) case 1: switch(y) case 0: printf(“*1*n“); break; case 1: printf(“*2*n“); break; case 2: printf (“*3*n“); ,在程序中,可以看到switch语句中又有一个switch语句,这种情况属于switch的嵌套。 程序在执行时,首先,根据x的值,找到其标号处,此处为1,而case 1后面又是一个switch语句,根据y的值,找到其标号处为0。 在输出“*1*”后,跳出内层的switch语句,接着执行外层switch语句后面的语句。 程序的最后运行结果为:,*1* *3*,使用switch语句时应注意以下几点: (1)在case后的各常量表达式不能出现相同的值,否则系统不知道该执行哪个case,会出现错误 (2)在case后,允许有多个语句,可以不用“”和“”括起来。 (3)各case和default子句的先后顺序可以变动,而不会影响程序执行结果。例如,可以先在程序中出现“default:”,再出现“case 5:”,然后是“case 2:”等。 (4)default子句可以省略不用。 (5)多个case可以共用一组执行语句,例如: case b: case c:printf(“hello!“);,3.2.3循环控制,1.while语句 2.dowhile语句 3.for语句,1.while语句,while语句也称为“当”型循环控制语句,直观地讲就是根据条件表达式的值,决定循环体内语句的执行次数。其语句格式如下: while(表达式) 语句; 其中的“表达式”是循环条件;“语句”是while的循环体。 while语句的执行过程是:计算表达式的值,当值为真(非0)时,执行循环体语句。特点是先判断后执行。,while语句的流程图如图3-7所示。,例3.6从键盘上连续输入若干个字符,并且以回车换行符作为结束标记,统计字符的个数,其中不包括回车键。 #include main() int n=0; char c; printf(“Please input a string:n“); while(getchar()!=n) /* 输入的字符不是回车符时统计 */ n+; printf(“The characters number of the string is %d.“,n); ,程序的运行情况为: Please input a string: Helloworld The characters number of the string is 10. 本例程序中的循环条件为getchar()!=n,其意义是:只要从键盘输入的字符不是回车就继续循环。循环体n+完成对输入字符个数的计数。从而程序实现了对输入一行字符的字符个数的计数。,例3.7用while语句来实现1*2*3*10的乘积。 #include main() long int i=1,mul=1; while(i=10)/*用while 语句求1*2*3*10的乘积*/ mul=mul*i; i+; printf(“n%dn“, mul); ,该程序的运行结果如下: 3628800,注意:在循环体中应有使循环趋向结束的语句,否则会无限制地运行下去,在C语言中这种无限运行的情况称为“死循环”。例如,在上面的例子中循环结束的条件是“i=10”,所以在循环体中使用了使循环结束的语句“i+”,从而达到了此目的。,使用while语句时应注意以下几点: (1)while语句中的表达式可以是任何类型,常用的是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。 (2)循环体如包括有一个以上的语句,则必须用括起来,组成复合语句。如果没有加大括号,则while语句范围只到while后面的第一个分号处。,2.dowhile语句,dowhile语句的一般形式为: do 语句; while(表达式); 这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。而while语句是先进行条件判断,满足条件才去执行循环体。因此,dowhile循环至少要执行一次循环语句;而while语句有可能一次也不执行。,dowhile语句的流程图如图3-8所示。,例3.8用dowhile语句求1*2*3*10的乘积。 #include main() long int i,mul=1; i=1; do/*用dowhile语句求1*2*3*10的乘积*/ mul = mul *i; i+; while(i=10); printf(“%ldn“, mul); ,该程序的运行结果如下: 3628800,在使用dowhile语句编写程序时,应注意以下几点: (1)条件表达式可以是任何类型,常用的是关系型或逻辑型表达式。要注意表达式必须用括号括住,且“while(表达式)”后面必须有一个分号。 (2)若循环体中又含有“循环语句”,则称为嵌套的循环语句,有时也称为多重循环。 (3)在书写格式上,建议按上述格式书写,do和while对齐,以便识别反复执行的操作。,3. for语句,for语句的一般形式为: for(表达式1;表达式2;表达式3) 语句; 其执行过程为:先计算表达式1;再计算表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句;然后再计算表达式3;接着再计算表达式2,若其值为假(0),则结束循环,执行for语句下面的一条语句。,for语句的流程图如图3-9所示。,常见的for语句形式如下所示: for(循环变量赋初值;循环条件;循环变量增值) 语句; 一个关于for语句的例子: mul=1; for(i=1;i=10;i+) mul=mul*i; for语句的一般形式可改写成如下所示的while循环的形式: 表达式1; while(表达式2) 语句; 表达式3; ,对于上述for语句的程序段也可以用while语句来改写,即: i=1; mul=1; while(i=10) mul=mul*i; i+; ,使用for循环时需要注意以下几点: (1)for循环中的“表达式1”即循环变量赋初值、“表达式2”即循环条件、“表达式3”即循环变量增量,三者都是可选项, 可以缺省,但是中间的两个分号“;”不能缺省。例如: for( ; ;)语句; 相当于:while(1)语句; (2)省略“表达式1”,表示不对循环控制变量赋初值。这种情况在C语言中也是允许的,但是,必须在for语句之前给循环变量赋初值。例如: i=1; mul=1; for(;i=10;i+)mul=mul*i;,(3)省略“表达式2”,即省略循环条件,此时不判断循环条件,如果在循环体内没有使循环结束的语句,那么循环将无终止地进行下去,即出现所谓的死循环。例如: mul=1; for(i=1; ;i+) if(i10)break; mul=mul*i; 相当于: i=1; mul=1; while(1) if(i10)break; mul=mul*i; i+; ,(4)省略“表达式3”,则不能对循环控制变量进行操作,此时为了保证循环正常结束,需在语句体中加入修改循环控制变量的语句。例如: mul=1; for(i=1;i=10;) mul=mul*i; i+; (5)可以省略“表达式1”和“表达式3”,只有表达式2,即只给出循环条件。此种情况下,完全等同于while语句,例如: i=1; mul=1; for(;i=10;) mul=mul*i; i+; ,相当于: i=1; mul=1; while(i=10) mul=mul*i; i+; (6)表达式1可以是设置循环变量初值的赋值表达式,也可以是其他表达式。例如: i=0; for(mul=1;i=10;i+) mul=mul*i; (7)表达式2可以是任何类型的,但一般是关系表达式或逻辑表达式,只要其值非零,就继续执行循环体。例如: for(i=0;getchar()!=n;i+) ; 说明:只有分号“;”组成的语句称为空语句,表示什么也不执行。,例3.9从键盘上输入5个数,求其平均值。 #include main() int a; float b,sum; for(a=1,sum=0.0;a6;a+) printf(“please input number:n“); scanf(“%f“, /*求5个数的平均值,并将其输出*/ ,该程序的运行情况如下: please input number: 34.4 please input number: 28.1 please input number: 56.2 please input number: 71.9 please input number: 32.7 average=44.660001,3.2.4循环的嵌套,如果一个循环体中又含有另一个完整的循环结构,则称为循环的嵌套。 当内嵌的循环中含有另一个嵌套的循环时,称为多重循环。 例3.10循环嵌套的举例 #include main() int m, n, k; printf(“m n kn“); for(m=0; m2; m+),/*用三重循环输出m、n、k的8个组合值*/ for(n=0; n2; n+) for(k=0; k2; k+) printf(“%d %d %dn“, m, n, k); 该循环的运行效果如下: m n k 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1,while循环、dowhile循环和for循环三种结构可以互相嵌套。例如: while() do for(;) while(); 使用循环的嵌套编写程序时应注意以下几点问题: (1)外层循环执行一次,内层循环执行一轮。 (2)内层循环控制直接引入外层循环的相关变量。 (3)内循环不要随意改变外循环控制的变量。 (4)可以使用各类循环语句相互嵌套以解决复杂问题。,3.2.5几种循环的比较,第一、几种循环都可以用来处理同一个问题,一般情况下它们之间是可以互相代替的。 第二、while和dowhile循环的循环体中应包括使循环趋于结束的语句。在三种循环体中,for语句功能最强。 第三、用while和dowhile循环时,循环变量初始化的操作应在while和dowhile语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。,3.3 几种转移控制语句,3.3.1 break语句 3.3.2 continue语句 3.3.3 break语句与continue语句的区别 3.3.4 goto语句 3.3.5 return语句,3.3.1 break语句,break语句的一般形式为: break; 通常情况下,在循环语句中break语句总是和if语句连在一起使用,即满足条件时便跳出循环。 例3.11break语句应用举例。 #include main() int i; for(i=1;i10;i+), i=i+1; printf(“%dn“,i); if(i%2=0) /*如果i能被2整除,则跳出for循环*/ break; 该程序的输出结果为: 2 上述程序中for循环本应该执行5次,但因为break语句的存在,当i%2=0时,程序流程被迫退出循环。,使用break语句时应注意以下几点: (1)当break位于循环体内的switch结构中时,break只是强迫程序流程退出switch结构,而不是退出switch所在的循环体。 (2)在嵌套的循环结构中,break只退出它所在的那层循环。 (3)当需要直接退出多层循环时,可通过赠加标记的方法逐层退出。也可以用3.3.4节介绍的goto语句来完成。,3.3.2 continue语句,continue语句用来结束本次循环,即跳过循环体中continue语句下面尚未执行的语句,接着进行下一次是否执行循环的判定,即结束本次循环。 continue语句的语法形式为: continue; 例3.12continue语句应用举例。 #include main() int i;,for(i=1;i10;i+) if(i%2=0) continue; /*如果i能被2整除,则结束本 次循环,进入下次循环的判定*/ else printf(“%dn“,i); 上述程序在执行过程中,凡是能被2整除的数均不输出,因此最后的输出结果为:,1 3 5 7 9,continue语句在使用中应注意以下几点: (1)continue语句通常和if语句联用,只能提前结束一轮循环,不能使整个循环终止。 (2)当continue语句位于处在循环体中的switch结构中时,continue语句只对循环起作用,即退出一轮循环,进入下一次是否循环的判定。 (3)continue语句用在while、dowhile中与用在for循环中有些不同。在for循环中终止本次循环运行时,要计算表达式3的值。,3.3.3 break语句与continue语句的区别,break语句和continue语句都可以用在while、dowhile、for循环体中,都有退出循环的功能。 但是break语句用来退出循环体,执行循环体后面的第1条语句。而continue语句用来退出本次循环,提前进入下次循环的判定。 例3.13输出两位数中所有能同时被3和5整除的数。 分析:能同时被3和5整除的数应满足 (j%3=0)&(j%5=0)不能同时被3或5整除的数应满足(j%3!=0)|(j%5!=0),#include main() int j; for(j=10;j100;j+) if(j%3!=0)|(j%5!=0) continue; /*不能被3或5整除时,结束本次循环进入下次循环的判定*/ printf(“%5d“,j); /*输出能同时被3和5整除的数*/ printf(“n“); ,程序的输出结果为: 15 30 45 60 75 90,3.3.4 goto语句,goto语句的一般格式为: goto lable; 其中,lable是语句标号。标号用标识符表示,即以字母或下划线开头,后跟字母或数字或下划线,并以冒号结尾;且标号可以和变量同名。 在多重循环中,如果需要从最内层循环一次退出,或者程序的执行速度至关重要时,使用goto语句的效果将非常显著。,3.3.5 return语句,return语句是函数返回语句,可以带参数也可以不带参数。 具体将在后面讲解函数时进行介绍,此处将不作详细的说明。,3.4 C程序语句,1.表达式语句 2.函数调用语句 3.控制语句 4.复合语句 5.空语句,1.表达式语句,表达式语句在第2章已经作了介绍,即表达式语句由表达式加上分号“;”组成。执行表达式语句就是计算表达式的值。 例如: x=y+z; /*赋值语句*/ y+z; /*加法运算语句,计算结果不能保留,无实际意义*/ i+; /*自增1语句,i值增1*,2.函数调用语句,函数调用语句由函数名、实际参数加上分号“;”组成。例如: printf(“%fn%fn“,a,b); 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,从而求出函数值。 有关函数的知识在后续的章节中将详细介绍。,3.控制语句,控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。 语言有9种控制语句,具体可以将其细分为如表3-1所示的三类。,表3-1 C语言的9种控制语句,4.复合语句,用大括号 括起来的相互关联的若干语句的集合称为“复合语句”,又称为“分程序”。 例如下面的语句就是一条复合语句: x=y+z; a=b+c; printf(”%d%d”,x,a); 注意:在程序中应把复合语句看成是单条语句,而不是多条语句。复合语句内的各条语句都必须以分号“;”结尾,在大括号“”外不能再加分号。,5.空语句,只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用作空循环体。例如: while(getchar()!=n) ; 上述程序段的功能是,只要从键盘输入的字符不是回车则继续输入,这里的循环体为空语句。,3.5 C程序举例,1.实例一 2.实例二 3.实例三,1.实例一,某个服装店经营套服,也单件出售。如果整套买服装,一次买的多于50套,每套80元;如果一次买的不足50套,每套90元;如果只买上衣,每件60元;如果只买裤子,每条45元。输入需要买的上衣和裤子的件数,计算应付金额。 分析:首先判断购买的形式,即买套装(此时买的上衣和裤子件数相同),还是分件买,根据购买的形式计算金额。,main() int c; /*变量c代表买上衣的件数, */ int t; /* t代表买裤子的件数*/ int m; /*变量m表示应付金额*/ printf(“Please input the number of c and t:n“); scanf(“%d,%d“, /*买50套以下,每套90元*/ else /*不成套买*/, if(ct) /*买的上衣比裤子多*/ if(t=50

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论