第五章 基本语句.ppt_第1页
第五章 基本语句.ppt_第2页
第五章 基本语句.ppt_第3页
第五章 基本语句.ppt_第4页
第五章 基本语句.ppt_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章 基本语句,前面已介绍了顺序结构,本章介绍选择结构和循环结构。 C语言中,基本语句包括下列语句: (1)赋值语句 (2)条件语句 (3)循环语句 (4)转移语句 (5)函数语句,5.1 赋值语句,5.1.1 简单赋值语句,运算符加上“=”,语句格式:r=v;,5.1.2 特殊赋值语句,5.1.3 连续赋值语句,例5.2 从键盘输入一个任意的小写字母,将其转换成大写字母输出。,main() char ch,chep; int bu; printf(“please input a little letter:”); scanf(“%c”, ,5.2 条件语句和分支选择结构,C语言中有三类选择

2、语句:,(1) 条件语句(if语句),(2) 条件赋值语句,(3) 开关语句(switch语句),5.2.1 条件语句(if语句),1、 if的三种形式,功能: 当表达式值非0时, 执行语句A,否则不执行语句A.,例如: if (xy) printf( %d, x);,形式1 if(表达式) 语句A,其流程图:,例5.5 计算y=|x|,绝对值计算公式如下:,main() float x; printf(“please input x:”) ; scanf(“%f”,可将其改为:,形式2 if(表达式) 语句A else 语句B,功能: 表达式为非0,执行语句A 表达式为0,执行语句B,例:

3、if(xy) printf(%d, x); else printf(%d, y);,例5.6 用键盘输入3个数(a、b、c),确定其中最大值。,设max为a、b中最大者, 公式如下:,main() float a,b,max; printf(“please input a,b,c:”) ; scanf(“%f%f%f”,再令max为max和c中最大者,此时公式如下:,假设a就是三个数的最大者,并且始终让a中存放三个数中的最大者,计算过程如下:,先找a、b中真正大者,并存于a中,公式如下:,main() float a,b,c; printf(“please input a,b,c:”) ; s

4、canf(“%f%f%f”,再找a和c中的大者并存于a中,此时公式如下:,形式3 if(表达式1) 语句1,else if (表达式2) 语句2,else if (表达式3) 语句3, ,else if(表达式n) 语句n,else 语句n+1,流程:,表达1,表达2,表达3,表达n,语句1,语句2,语句3,语句n,语句n+1,语句1, 0,= 0,= 0, 0, 0, 0,如: if (3) printf(o.k); if (a),1. 表达式可以是逻辑、关系,甚至是算术表达式。,2. 上述形式中的语句必须以分号结束,3. 上述形式中的语句可以是由 括起来的复合语句。此时,在 外可以不用分号

5、.,注意的问题:,main ( ) float a, b, t; scanf(%f, %f, ,补充例1 输入两个实数,按代数值由大到小次序输出这两个数。,3.2 , 3.60 3.60 , 3.20,运行情况如下:,例5.7 输入三个数,按从大到小顺序输出。,main ( ) float a, b, c,t; scanf(%f,%f,%f, ,if (bc) t=b; b=c; c=t; printf(%5.2f, %5.2f, %5.2f, a, b, c); ,运行情况如下:,3,7,1 7.00, 3.00, 1.00,5.2.2 条件赋值语句,格式如下:,例5.9 用条件赋值语句编写

6、程序,找三个数中最大者。,main ( ) float a, b, c,max; printf(“please input a,b,c:”); scanf(%f,%f,%f, ,5.2.3 if语句的嵌套,if (表达式1),内嵌if,else,内嵌if,注意: else总是与它上面的最近的未配对的if 配对.,一般形式,在上述形式的if语句中, 又可以是if语句称为嵌套。,if (表达式2) 语句1,if (表达式3) 语句3,else 语句2,else 语句4,例: if ( ),if ( ) 语句2 else 语句3,if ( ) if ( ) 语句1 else ,所以:必要时加 .,i

7、f ( ) 语句1 else,补充例2 有一函数,y=,1 (x0),编一程序,输入一个x值,输出y值。,有以下几种写法,请判断哪些是正确的?,程序1: main ( ) int x, y; scanf(d, ,if (x0) y= 1; else if (x= =0) y=0; else y=1; printf (x=%d, y=%dn, x, y); ,程序2:将上面程序的if语句改为: if (x=0) if (x0) y=1; else y=0; else y= 1;,程序3: 将上述if语句改为: y= 1; if (x! =0) if (x0) y=1; else y=0;,程序4

8、: y=0; if (x=0) if (x0) y=1; else y= 1;,5.2.3 switch语句,1、语句形式:,switch (表达式) case 常量1: 语句1; case 常量2: 语句2; case 常量3: 语句3; . case 常量n: 语句n; default : 语句n+1; ,根据表达式的不同值,选择不同的程序分支,又称开关语句。,数值型 或 字符型,常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案。,2、语句执行流程:,指语句的最后一条是否为break,简单语句或复合语句,case语句出 现的次序并 不影响执行 结果。,例

9、3:假设用0、1、2.6分别表示星期日、星期一.星期六。现输入一个数字,输出对应的星期几的英文单词。如果输入3,输出“Wednesday”。,#include stdio.h void main() int n; scanf(%d, ,程序运行情况如下: 3 Wednesday Thursday Friday Saturday error,在“switch”语句中,“case 常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,因此会继续执行所有后面语句的情况。,为此,语言提供了一种break语句,其功能是可以跳

10、出它所在的switch语句。,将上面的例3修改如下:,#include stdio.h void main() int n; scanf(%d, ,程序运行情况如下: 3 Wednesday,3、说明,多个case语句可以共用一组执行语句。,switch(grade) case A: case B: case C:printf(grade=60n);break; default:printf(grade60); ,各case和default子句的先后顺序可以变动,而不会影响程序执行结果。,default语句可以省略不用。,case和default与其后面的常量表达式间至少有一个空格。,swit

11、ch语句可以嵌套,break语句只跳出它所在的switch语句。,如 case B:,例4 企业发放的奖金根据利润提成。从键盘输入当月利润,求应发放奖金总数?,利润x x=10 10x20 20x40 40x60 60x100 100x,(int )x/10,常量 0,1 1,2 2,3,4 4,5,6 6,7,8,9,10 10以上,用这种方法转换后,n出现了在不同区域有重复数字的情况。解决的方法有很多,其中一种是可以采用当x为10的整数倍时,将计算出的n值减1。,使用switch解题的关键,通过分析找到表达式,将问题分成几种情况。,#include stdio.h void main()

12、float x,y; int n; scanf(%f, ,程序如下:,程序举例,例1 写一程序,输入年号,判断是否为闰年。,1. 算法: 根据闰年的判断条件, 当年号能被4整除但不能被100整除时,它为闰年。, 当年号能被100整除又能被400整除时,它为闰年。,设用变量year表示年号,leap为待置值变量,当year为闰年:leap1, 否则leap0.,2. 流程图,leap%400=0,leap1,leap=0,打印非闰年,打印是闰年,结束,leap,yes,No,yes,No,A,3. 程序:,main ( ) int year, leap; scanf(%d, else leap=

13、0;,else leap=1; else leap=0; if (leap) printf(%d is, year); else printf(%d is not, year); printf (a leap yearn); ,运行情况如下:,2000 2000 is a leap year,1989 1989 is not a leap year,上述条件也可用一个逻辑表达式表示: if ( ( year%4=0),例2 给一个不多于4位的正整数,求出它是几位数,逆序打印出各位数字。,#include stdio.h void main() int x,a,b,c,d; /*a,b,c,d代

14、表千位、百位、十位、个位*/ scanf(%d, ,例3 任意输入三个数,判断能否构成三角形?若能构成三角形,是等边三角形、等腰三角形还是其它三角形?,#include stdio.h void main() float a,b,c; scanf(%f,%f,%f, ,课堂练习,1.main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0:a+;break; case 1:b+;break; case 2: a+;b+;break; case 3: a+;b+; printf(“a=%d,b=%dn”,a,b); ,结果: a

15、=2,b=1,2.程序填空: 以下程序判断输入的整数能否被3或7整除. main() int x,f=0; scanf( “%d”, ,在C语言中可以用以下语句来实现循环: 1. 用goto语句和if语句构成循环; 2. 用while语句; 3. 用do-while语句; 4. 用for语句。,循环:就是在给定的条件成立时反复执行某一程 序段,被反复执行的程序段称为循环体。,5.3 循环语句,S=1+2+3+100,0,S,1,2,100,S+1,S,S+2,S,S+100,S,作100次加法,S+i,S,累加器,计数器,1、语句形式: goto 语句标号;,例如: goto label; l

16、abel: .,语句标号用标识符表示,它的定名规则与变量名相同。,5.3.1 goto语句及与if语句构成循环,2、语句执行流程: 在程序执行过程中,如果遇到goto语句,则程序执行流程无条件地转向语句标号后的语句继续执行。,3、说明,语句标号仅仅对goto 语句有效,对其它语句不影响。,同一个程序中,不允许有同名标号。,goto语句通常与条件语句配合使用。可用来实现条件转移、构成循环、跳出循环体等功能,main ( ) int i, sum=0; i=1; loop: if (i=100) sum=sum+i; i+; goto loop; printf(%d, sum); ,运行结果如下:

17、 5050,例: 求,main ( ) int sum=0, i=1; loop: sum=sum+i; i + +; if (i=100) goto loop; printf (sum=%d , sum); ,本例相当于当型循环,若改为直到型:,5.3.2 while语句,真(非零),循环体,假(零),1、while 语句的形式: while (表达式) 循环体;,2 、 while 语句 常称为“当型”循环语句。,3、说明:,先判断表达式,后执行语句。,表达式同if语句后的表达式一样,可以是任何类型的表达式。,循环体多于一句时,用一对 括起。,while循环结构常用于循环次数不固定,根据是

18、否满足某个条件决定循环与否的情况。,i=1; s =0; while (i=100) s=s+i; i+; printf(“n1+2+3+100=%d”,s);,循环变量的初始化 (循环先导语句),累加器的初始化,循环控制条件,累加,修改循环变量,循环语句的三要素,循环次数不固定的循环语句,例5.18 计算,当s最接近且不大于10000为止。,main ( ) int i, s; s=i=0; while(s+i*i=10000) s=s+i*i; i+; printf(%d, s); ,运行结果如下: 9455,辗转相除法的自然语言表述: 不断地用除数作为被除数,余数作为除数再求余数,直到余

19、数为0,此时除数即为所求最大公约数。,例5.19 利用辗转相除法计算两个数的最 大公约数。,main ( ) int m,n,r; printf(please input two data:); scanf(%d%d, ,运行结果如下: please input two data:34 12 The max common facter is:2,#include stdio.h void main() int x; scanf(%d,【补充 例1】输入一系列整数,判断其正负号,当输入0时,结束循环。,输入数据,为第一次判断做准备,while(x!=0),判断是否结束, if(x0) print

20、f( + ); else printf( - ); scanf(%d, ,判断正负号,修改循环变量的值,#include stdio.h void main() char ch;int num=0; ch=getchar();,【补充 例2】 统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。,while(ch!=n),判断是否输入结束,num+; ch=getchar(); ,printf(num=%dn,num); ,注意,表达式在判断前,必须要有明确的值。,循环体中一般有改变条件表达式的语句。,while (表达式)后面没有分号。,5.3.3 do-while语句,1、 do-

21、while的形式: do 循环体; while (表达式);,2、 do-while语句 常称为“直到型”循环语句。,真(非零),循环体,假(零),main ( ) int i, sum=0; i=1; do sum=sum+i; i+; while (i=100); printf(%d,sum); ,例:用do-while语句求,3、说明:,先执行语句,后判断表达式。,第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。,计算公式为:,例5.21 输入若干个正整数,求其和,直到所输 入数大于10为止(该数不在求和之列)。,用while语句编写的程序如下:,main

22、 ( ) int x, s=0; printf(“please input first integer:); scanf(“%d“, ,用do-while语句编写的程序如下:,main ( ) int x, s=0; printf(“please input first integer:); scanf(“%d“, ,注意,在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。,do-while和while语句相互替换时,要注意修改循环控制条件 。,5.3.4 for语句,1、for的形式: for (初始表达式1;条件表达式2;循环表达式3) 循环

23、体 ;,表达式1:用于循环开始前为循环变量设置初始值。,表达式2:控制循环执行的条件,决定循环次数。,表达式3:循环控制变量修改表达式。,循环体语句: 被重复执行的语句。,表达式3,计算表达式1,循环体,零,非零,for的下一条语句,2、执行过程,for(i=1;i=100;i+) sum=sum+i;,例如:,它相当于以下语句: i=1; while (i=100) sum=sum+i; i+; ,表达式1;,while(表达式2),表达式3;,3、 说明,三个表达式都可以是逗号表达式。,三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。,4. for语句中表达式省

24、略的形式,(1)for语句一般形式中的“表达式1”可以省略;此时应在for语句之前给循环变量赋初值 如: sum=0;i=1; for ( ; i=100;i+) sum=sum+i;,(2)表达式2省略,即不判断循环条件,循环无终止地进行下去; 如: for(sum=0,i=1;i+) if(i100) break; sum=sum+i; ,(3)表达式3也可以省略,但此时应保证循环能正常结束如: for(sum=0,i=1;i=100;) sum=sum+i; i+; ,(4) 可以省略表达式1和表达式3,只有表达式2,如: i=1; sum=0; for (;i=100;) sum=su

25、m+i; i+; ,i=1;sum=0; while (i=100) sum=sum+i; i+; ,相当于,while (1) 循环体; 即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。,(5)三个表达式都可省略,如 for ( ; ; ) 循环体;,如: sum=0,i=1; for(;) if(i100) break; sum=sum+i; i+; ,相当于,(6)循环体为空语句 对for语句,循环体为空语句的一般形式为: for (表达式1;表达式2;表达式3) ; 如:for(sum=0,i=1;i=100;sum+=i, i+) ;,表达式2可以是关系表达式,也可以是数

26、值表达式或字符表达式。只要值0.即执行循环体. for (i=0; (c=getchar( )!=n; i+=c);,(1)在进入累加前先给累加器赋初值(一般为0); (2)用循环语句实现累加; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体语句的设计。 累加器当前值=累加器原值+循环变量当前值 ;,典型例题分析,例: 求累加和1+2+3+1000,基本方法:,属于“累加器”类型问题。,累加器赋初值,求偶数和 2+4+6+100,参考程序:,void main() long int k,s;,s=0;,for(k=1;k=1000;k+) s=s+k;,printf( s=

27、%ld ,s); ,累加,思考,(1)给累乘器赋初值,一般为1; (2)用循环语句实现累乘; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体设计。 累乘器当前值=累乘器原值*循环变量当前值;,例: 求累乘积。 如:123.100,基本方法:,属于“累乘器”类型问题。,累乘器赋初值,求n!=1 2 3 n,参考程序:,void main() double s=1;,int k;,for(k=1;k=100;k+) s=s*k;,printf( s=%lf ,s); ,累乘,思考,1.break语句,(1) 语句形式: break;,(2)作用: 1.结束break所在的 sw

28、itch语句。 2.结束当前循环,跳出break所在的循 环结构。,5.3.5 break语句和continue语句,【例】 求300以内能被17整除的最大的数。,#include stdio.h void main() int x,k; for(x=300;x=1;x-) if(x%17=0) break; printf(x=%dn,x); ,(1)语句形式: continue;,(2)语句作用: 结束本次循环。,2、continue 语句,(3)语句执行流程: continue语句可以结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。,【例】

29、 求300以内能被17整除的所有整数。,#include stdio.h void main() int x,k; for(x=1;x=300;x+) if(x%17!=0) continue; printf(%dt,x); ,while(条件) 语句A; break; 语句 B; ,真,语句B,条件,语句A,break,假,结束循环,4、break语句与continue语句的区别,至此位置,while(条件) 语句A; continue; 语句 B; ,真,语句B,条件,语句A,continue,假,结束循环,至此位置,#include stdio.h void main() int a,

30、b; for(a=1,b=1; a=10) break; if(b%3=1) b+=3; continue; printf(%dn,a); ,【例5】 分析以下程序的运行结果。,程序运行结果: 4,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。,5.3.6 循环的嵌套,嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。,while 、do-while、for三种循环都可以互相嵌套。,循环语句之间的关系,真,真,外循环初始条件,内循环初始条件,内循环体,外循环条件,假,内循环条件,假,内循环循环条件,外循环循环条件,循环

31、结束,二重循环嵌套结构执行流程,例:输出图形:,* * * *,编程分析:,采用双重循环,一行一行输出。,每一行输出步骤:一般3步。 1)光标定位,3)每输完一行光标换行(n),2)输出图形。 例如本题:共4行,若行号用k表示,则每一行有2*k-1个*号。,#include stdio.h void main() int k1,k2; for(k1=1;k1=4;k1+) putchar(t); for(k2=1;k2=k1;k2+) putchar(b);,for(k2=1;k2=k1*2-1;k2+) putchar(*);,putchar(n);, ,定位(还可以用空格的方法),输出,几

32、种循环的比较,1. 对于同一问题, 四种循环可相互替代。但不提倡用goto.,2. for循环功能强于while, dowhile.但若不是明显地给出循环变量初终值(或修改条件),则应用while 或do while.以增强程序的结构化和可读性。,3. 要防止无限循环死循环。,4. 循环过程中,为了结束本次循环或跳出整个循环。分别要用到continue和break语句。,5.3.7 循环结构程序设计举例,【例5-1】 求,#include stdio.h void main() float s=0,f1=2,f2=1,f=1,t,n; /*累加器赋初值*/ for(n=1;n=10;n+) s

33、=s+f*f1/f2; /*累加器当前值=累加器原来的值+新的要加的数据*/ f=f*(-1);t=f2;f2=f1;f1=f1+t; /*为求下一个要加的数据做准备*/ printf(“s=%fn”,s);必考 我的弱点 ,【例5-2】输入任意一个整数,将其逆序输出,例如输入1234,输出4321我的弱点。,include stdio.h void main() long y,n; scanf(%ld, ,【例5-3】求Fibonacci数例: 1, 1, 2, 3, 5, 8, 前40个数。,程序要点:, 每输出4个数时换行。, f1=f1+f2; f2=f1+f2; 交替的结果正好为一序列,规律: F1=1, F2=1 Fn=Fn 1 + Fn 2 (n2),程序如下:,main ( ) long int f1, f2; int i; f1=1; f2=

温馨提示

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

评论

0/150

提交评论