浙江大学刘加海C语言课件2.docx
- 文档编号:18320651
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:53
- 大小:191.46KB
浙江大学刘加海C语言课件2.docx
《浙江大学刘加海C语言课件2.docx》由会员分享,可在线阅读,更多相关《浙江大学刘加海C语言课件2.docx(53页珍藏版)》请在冰点文库上搜索。
浙江大学刘加海C语言课件2
第2章程序的控制结构
◆本章重点
1.if语句和用if语句构成的选择结构。
2.if语句的嵌套。
3.switch语句。
4.while循环。
5.do~while循环。
6.for循环。
7.循环的嵌套。
◆本章难点
1.if语句中的条件表达式的理解。
2.if与else的配对问题。
3.switch语句的程序流向。
4.while、do~while、for循环的特点。
5.for循环中的执行过程及for循环的变化形式。
6.循环嵌套中的执行过程。
在程序的编写过程中常常会碰到程序的流向问题,C语言中控制程序流向的语句结构叫控制结构,而控制结构中的条件表达式含有关系运算和逻辑运算,C语言提供了可以进行逻辑判断的选择语句,根据逻辑判断的结果决定程序的不同流程,任何复杂的程序都是由顺序结构、分支结构及循环结构构成。
程序的这三种结构是程序设计中最基本的问题,也是程序设计的基础。
程序设计中要决定程序的流向、是否重复地执行某项任务等都要涉及到程序的流程控制。
本章将重点介绍程序控制结构语句及其使用方法。
2.1程序的分支结构
2.1.1if语句和用if语句构成的选择结构
if语句的作用是使程序在运行过程中,根据判断指定的条件是否满足来决定是否执行某操作。
if语句的运用能使程序针对不同情况作不同的处理,增加了程序的灵活性。
if语句是一种选择结构,它的基本形式有如下三种。
1.if选择结构
语句格式:
if(表达式)
语句块
这里的语句块可以是简单语句、空语句或复合语句,复合语句用用’{‘开始,符号’}’结束,在逻辑上复合语句作为一条语句来使用。
语句的功能:
如果表达式的值为真(非0),则执行语句块,否则不执行该语句块。
程序流程图如2.1所示。
图2.1程序流程图
例如学生的成绩grade大于等于60,在屏幕上显示“恭喜你,通过了!
”,则可用以下语句描述。
if(grade>=60)
printf("恭喜你,通过了!
\n");
如果学生的成绩grade大于等于60,除了在屏幕上显示“恭喜你,通过了!
”,还要使已取得总学分score加2,则修改以上语句为如下:
if(grade>=60)
{/*把多个语句用{}括起来组成一个复合语句*/
printf("恭喜你,通过了!
\n");
score+=2;
}
如果以上语句写成:
if(grade>=60)
printf("恭喜你,通过了!
\n");/*只能有一条语句属于if语句结构*/
score+=2;/*这条语句不在if语句结构中*/
其程序流程图变为如图2.2所示,这样使“score加2”操作在学生成绩小于60时也执行了,这与要求不符,程序结果是错的。
图2.2程序流程图
所以if语句结构中,若需要用多条语句实现操作时,必须把多条语句用{}括起来组成一条复合语句。
同样,在以后介绍的选择结构和循环结构语句中也都有类似的情况。
if语句中的表达式(包括循环语句中的表达式)通常是逻辑表达式或关系表达式,但也可以是其他表达式,如赋值表达式等,甚至可以只是一个简单变量。
如:
if(i)
printf("i≠0");
判断i的值是否不为0,来决定语句printf("i≠0");是否执行。
if((ch=getchar())!
='\n')
printf("%c",ch);
从键盘输入一个字母赋给ch,如果ch的值不为换行符,执行语句printf("%c",ch);输出该值。
思考:
定义一字符变量ch并从键盘读入,如为小写字母转化为大写字母后输出,否则什么也不做,程序结束。
提示:
判断是否为小写字母可写为:
(ch>=’a’&&ch<=’z’),小写字母转化为大写字母、输出构成一个复合语句,此复合语句为:
{ch-=32;printf(“%c”,ch);}
2.if~else选择结构
语句格式:
if(表达式)
语句块1
else
语句块2
语句的功能:
如果表达式的值为真(非0),则执行语句块1,否则执行语句块2。
程序流程图如图2.3所示。
图2.3程序流程图
如果根据学生的成绩grade是否大于等于60,决定在屏幕上显示“恭喜你,通过了!
”或“很抱歉,没通过!
”,则可用语句描述如下:
if(grade>=60)
printf("恭喜你,通过了!
\n");
else
printf("很抱歉,没通过!
\n");
根据编程者的喜好或程序结构方面的考虑,可以修改表达式,调整语句为:
if(grade<60)
printf("很抱歉,没通过!
\n");
else
printf("恭喜你,通过了!
\n");
如果也要增加学分的话,可以描述成:
if(grade>=60)
{printf("恭喜你,通过了!
\n");
score+=2; }
else
printf("很抱歉,没通过!
\n");
或:
if(grade<60)
printf("很抱歉,没通过!
\n");
else
{printf("恭喜你,通过了!
\n");
score+=2; }
思考:
定义二个整型变量x、y,并从键盘读入一个整型数给x,如此数大于等于0,把此数的平方赋给y,否则把此数的绝对值赋给y。
提示:
可用程序段:
if(x>=0)
y=x*x;
else
y=-x;
例2.1输入三个整数,并输出最大数。
算法设计:
(1)输入三个整数x、y、z;
(2)先比较x和y的大小,把大的数赋值给max;
(3)再比较max和z的大小,把大的数再赋值给max。
此时max的值就是三个整数的最大值;
(4)输出max。
程序流程图如图2.4所示。
图2.4程序流程图
#include
voidmain()
{
intx,y,z,max;
printf("pleaseinputx,y,z:
");
scanf("%d%d%d",&x,&y,&z);
if(x>y)
max=x;
else
max=y;
if(max max=z; printf("Themaxnumberis%d\n",max); } 运行情况如下: pleaseinputx,y,z: 87-6 325 Themaxnumberis: 325 思考: 定义三个实型变量x、y、z,并从键盘读入,求出这三个数中的最小值。 3.if~elseif结构 语句格式: if(表达式1) 语句块1 elseif(表达式2) 语句块2 . . . elseif(表达式n-1) 语句块n-1 else 语句块n 语句的功能: 从上到下依次判断表达式的值,当出现某个值为真(非0)时,执行与其相对应的语句,并跳过其余条件的判别;如果所有的表达式均为假(0),则执行语句n。 程序流程图如图2.5所示。 图2.5程序流程图 假如我们把学生的成绩分成等级优(grade>89)、良(79 if(grade>89) printf("恭喜你,你的成绩是优! \n"); elseif(grade>79) printf("恭喜你,你的成绩是良! \n"); elseif(grade>69) printf("恭喜你,你的成绩是中! \n"); elseif(grade>59) printf("恭喜你,你的成绩是及格! \n"); else printf("很抱歉,你的成绩是不及格! \n"); 2.1.2if语句嵌套 if语句允许嵌套,即在一个if语句中包含有另一个if语句。 上一节介绍的if~elseif结构也是if语句的嵌套结构。 例如要表示分段函数 可以表示如图2.6所示的流程图。 图2.6程序流程图 用if语句的嵌套表示为: if(x>=0) if(x==0) y=0; else y=1; else y=-1; 当然用条件运算符表示为: y=x>0? x==0? 0: 1: -1; 但if~elseif结构很规范,很好理解,而一般if语句的嵌套结构相对比较复杂,经常由于不正确的if与else配对理解导致程序功能的错误。 C语言中规定,在有多个if...else语句的结构中,else总是与最近的尚未配对的if配对。 例2.2分析以下程序段输出的结果为() intx=-10,y=5; if(x>=0) if(x>0)y=0; elsey=-1; printf(“y=%d\n”,y); 分析: 因if(x>=0)非真,所以if(x>0)y=0;elsey=-1;不执行,打印结果为5。 例2.3编写一个程序,由键盘输入三个整数作为三角形的三条边,判断是否能构成一个三角形,如能并判断是等边三角形、等腰三角形,还是其它三角形。 分析: 设三个整数分别为: a、b、c,构成三角形的条件为: a+b>c&&a+c>b&&b+c>a 构成等边三角形的条件为: a==b&&b==c 构成等腰三角形的条件为: a==b||b==c||a==c 对于判断是否能构成三角形,什么样的三角形的语句结构为: if(a+b>c&&a+c>b&&b+c>a) { printf(“能构成一个三角形\n”); 进一步判断构成什么三角形 } else printf(“不能构成一个三角形\n”); 完整的程序设计为: #include voidmain() { inta,b,c; scanf("%d%d%d",&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) { printf("能构成一个三角形\n"); if(a==b&&b==c) printf("能构成一个等边三角形\n"); elseif(a==b||b==c||a==c) printf("能构成一个等腰三角形\n"); else printf("能构成一个一般的三角形\n"); } else printf("不能构成一个三角形\n"); } 2.1.3switch语句 if语句只能处理从两者间选择其中之一,用if-else-if或多重嵌套if语句可以实现多分支选择,但程序冗长,可读性差。 C语言提供switch语句专门处理多分支选择,使程序结构简洁、清晰。 语句格式: switch(表达式) { case常量表达式1: 语句序列1 [break;] case常量表达式2: 语句序列2 [break;] . . . case常量表达式n; 语句序列n [break;] default: 语句序列n+1 } 当执行switch语句时,首先计算紧跟其后一对括号中的表达式的值,然后在switch语句体内寻找与该值吻合的case标号,如果有与该值相等的标号,则执行该标号后开始的各语句,包括在其后的所有case和default中的语句,直到break语句或switch语句体结束。 如果没有与该值相等的标号,并且存在default标号,则从default标号后的语句开始执行,直到switch语句 体结束。 如果没有与该值相等的标号,且不存在default标号,则跳过switch语句体,什么也不做。 图2.7语句执行的流程图 注意 (1)switch、case、default是关键字。 (2)switch语句后面用花括号括起来的部分称为switch语句体。 (3)switch的表达式可以是整型表达式、字符表达式、枚举型表达式等。 (4)case中常量表达式的类型必须与switch的表达式类型相同,各case语句标号的值应该互不相同。 (5)default代表所有case标号之外的那些标号,default标号可以出现在语句体中任何标号位置上,在switch语句体中也可以没有default标号。 (5)每个选择支路都以case开头,case的标号后要有': ',每个支路后可以有多个语句。 (6)必要时,case语句标号后的语句可以省略不写。 (7)在关键字case和常量表达式之间一定要有空格。 例如case10: 不能写成case10: 。 例2.4求执行下列程序段后k的值。 charc=’2’;intk=1; switch(c+1-‘0’) {case2: k+=1; case2+1: k+=2; case4: k+=3; } 分析: switch中表达式的值为3,从case2+1入口,执行语句k+=2;得k=3,由于此语句后无break;语句,继续执行case4后语句: k+=3;最后k=6。 例2.5求执行下列程序段后k的值。 charc; intk=2; scanf(“%d”,&c); switch(c-‘A’) { case0: k++; case1: k+=2;break; default: k*=k; case4: k*=3; } 问: 当程序执行时输入分别为: A、B、C、E时k的值。 分析: 当输入’A’时,从case0入口,k为3,由于k++;后无break;又从case1: 入口k为5,然后退出switch语句;同理当输入’B’时,k为4;当输入’C’时,转入default: k为4;k*=k;后无break;语句,继续执行case4后语句: k*=3;最后k=12。 当输入’E’时,从case4入口,k为6。 例2.6输入一个字符,如果是Y、N或y、n,则分别执行一输出语句;如果是其他字母则执行另一输出语句。 程序如下所示: #include voidmain() { charch; printf("pleaseinputY/N(y/n): "); scanf("%c",&ch); switch(ch) { case'y': case'Y': printf("\nthisis'Y'or'y'.\n"); break; case'n': case'N': printf("\nthisis'N'or'n'.\n"); break; default: printf("\nthisisotherchar.\n"); } } 例2.7编写一个菜单显示程序,输入1表示: 添加记录、2表示: 显示记录、3表示: 读取记录、4表示: 保存记录、0表示: 结束运行,输入0~4可以进行相应的选择。 #include voidmain() { inta; printf("1.添加记录\n2.显示记录\n3.读取记录\n4.保存记录\n0.结束运行\n"); printf("\n请选择0~4: "); scanf("%d",&a); switch(a) { case1: printf("你的选择是: 1\n"); break; case2: printf("你的选择是: 2\n"); break; case3: printf("你的选择是: 3\n"); break; case4: printf("你的选择是: 4\n"); break; default: printf("输入错误! \n"); } } 这个例子只是一个简单的框架,它体现了编写控制菜单的基本思想。 思考: 键盘输入学生的百分制成绩,输出相应的等级,等级的划分为: 90~100: 优、80~89: 良、70~79: 中、60~69: 及格、0~59: 不及格,用switch语句实现。 提示: 假定分数用x表示,可用: switch(x/10) { case10: case9: printf(“优\n”);break; case8: printf(“良\n”);break; …… 另外请读者思考如何避免非法数据的输入? 2.2程序的循环结构 在实际应用中,需要程序根据给定条件时,重复执行某程序段,直到条件不满足为止;或重复执行某程序段的指定次数,这就是程序的循环结构。 C语言提供了以下三种基本的循环语句: while语句、do~while语句和for语句。 对于C语言的三种循环语句有以下几点需加以注意: 1.while循环语句和for循环语句在初始时,首先测试循环条件,如果满足则执行循环体,如不满足则退出循环语句;do-while循环语句则是先执行循环体,后测试循环条件,所以循环体不管怎样都必然会被执行至少一次。 2.此三种循环语句都是根据循环条件来决定是否继续执行,所以在循环体内部或循环条件中必须存在改变循环条件的动作,否则,可能会出现死循环等异常情况; 3.C语言的for语句并不同于一般的狭义计数循环语句,其循环条件包含的内容可以不是单一的计数,而可以有其他的形式和动作,如getch()一类的取值动作。 2.2.1while循环 语句格式: while(条件表达式) 循环体 其流程控制如图2.8所示。 循环执行的步骤如下: (1)计算条件表达式的值; (2)当值为真(非0)时,执行循环体,然后转到 (2),值为假(0)时退出循环。 图2.8流程图 例2.8从键盘输入若干个数求和,当和大于200时停止执行。 分析: 此程序的流程如图所示,循环的条件为sum<=200,循环块中的语句有: scanf(“%d”,&x); sum+=sum; 整个程序的代码为: #include voidmain() { intx,sum=0; while(sum<=200) {scanf(“%d”,&x); sum+=x; } printf(“sum=%d\n”,sum); } 思考: 在main函数中输入一个大于0的自然数n,调用函数add,计算1+2+3+…+n,在main函数中输出结果,请完成填空。 #include intadd(intn)/*求1+2+3+…+n和*/ { } voidmain() { intx,sum; scanf(“%d”,&x); sum=add(x); printf(“sum=%d\n”,sum); } 例2.9有20个同学顺序编号为0~19,同时把他们的英语成绩存放在数组A中,编写一个查分的函数。 算法设计: (1)输入学生号; (2)判断学生号是否在0和19之间,若是,继续下一步,不是则查询结束; (3)显示该学生成绩; (4)输入学生号,转第 (2)步继续执行。 程序的流程图如图2.9所示。 图2.9程序的流程图 #include voidquery(inta[],intn)/*数组名a作为形参,数组a代表数组st*/ { intnum; printf("PleaseinputstudentNO.: "); scanf("%d",&num); while(num>=0&&num { printf("\ttheenglishscoreis%d: \n",a[num]); printf("PleaseinputstudentNO.: "); scanf("%d",&num); } printf("thequeryover! \n"); } voidmain() { intst[20]={78,92,56,82,74,76,51,73,62,88,54,69,77,64,79,78,65,74,71,83}; query(st,20);/*数组名st作为实参,传递给数组a*/ } 程序运行情况: PleaseinputstudentNO.: 5 theenglishscoreis76: PleaseinputstudentNO.: 0 theenglishscoreis78: PleaseinputstudentNO.: 19 theenglishscoreis83: PleaseinputstudentNO.: 25 thequeryover! while循环语句先判别循环条件,只有条件满足才执行循环体,即存在循环体一次也不执行的可能。 如在上例运行时,第一次输入20,则循环体一次都不执行。 PleaseinputstudentNO.: 20 thequeryover! 例2.10从键盘输入10个数,正数赋给数组b[],负数显示在屏幕上,最后再输出数组b的元素值。 #include voidmain() { intx,k,b[10],i=0,j=0; while(i<10) { scanf("%d",&x); if(x>0) b[j++]=x; else printf("%d\n",x); i++; } k=0; while(k printf("b[%d]=%d\n",k,b[k++]); } 例2.11编一程序使某数相反顺序输出。 如输入3456,输出6543。 程序分析: 某数对10取余数,先输出最低位,然后使这个整数除10,再取余数输出,再除10,直到这个数为0。 #include voidmain() { intnum; intdigit; printf("inputanumber\b"); scanf("%d",&num); while(num! =0) {digit=num%10; printf("%d",digit); num=num/10; } printf("\n"); } 思考: 有一个数组a,具有以下规律: a[0]=1;a[1]=2;a[2]=a[0]+a[1];a[i]=a[i-2]+a[i-1]; 求a[50]。 提示: 考虑程序段: a[0]=1; a[1]=2; i=2; while(i<=50) { a[i]=a[i-2]+a[i-1]; i++; } 2.2.2do~while循环 语句格式: do 循环体 while(表达式); 语句的功能: 先执行循环体一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环。 其中语句是循环体,表达式是循环条件。 语句执行流程图如图2.11所示。 图2.10语句执行流程图 do~while语句是先执行后判断,因此它至少要执行一次循环
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 浙江大学 刘加海 语言 课件