710 likes | 806 Views
第 二 章 程序基本结构. 控制语句. 目 录. 2.1 分支结构. 2.2 关系运算和逻辑运算. 2.3 循环结构. 2.4 break 和 continue 语句. 2.5 语句标号和 goto 语句. 实验 2 - 5 题改进: main() {float a,b,c,s,area; scanf("%f%f%f",&a,&b,&c); if( a+b>c && a+c>b && b+c>a ) { s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c));
E N D
控制语句 目 录 2.1 分支结构 2.2 关系运算和逻辑运算 2.3 循环结构 2.4 break和continue语句 2.5 语句标号和goto语句
实验2 -5题改进: main() {float a,b,c,s,area; scanf("%f%f%f",&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) { s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“area is %f\n”,area); } } 分支体
观察下面分支程序,模仿编程。 main() { float a,b; printf("Please input a:"); scanf("%f",&a); if(a<0) printf(“input error!”); } 预备学习1 输入a a<0? 成立 不成立 printf 单分支 分支体由一条语句构成时,大括号可省略。
观察下面分支程序,模仿编程。 main() { float a,b; printf("Please input a:"); scanf("%f",&a); if(a<0) b=-a; else b=a; printf("result is: %f",b); } 预备学习2 a<0? 成立 不成立 输入a b=-a b=a 输出b 双分支
预备练习1 从键盘上输入两个整数,输出较小的那个数。
程序源代码: main() { int a,b,min; printf("Please two data:"); scanf("%d%d",&a,&b); if(a<b) { min=a; } else { min=b; } printf("result is: %d",min); } 预备练习1
格式1: if (表达式) 分支体; if语句的三种形式(1) 括号后没有分号 • 分支体里可以包含多条程序语句,用一对{ }扩起来,做为整体。这种由 { }扩起来的语句叫做复合语句。括号之外不再加 “;” • else必须和if配对使用,不能单独出现。 格式2: if (表达式) 分支体1; else 分支体2; else后没有表达式
知识点-如何表达条件 选择条件通常是关系表达式或逻辑表达式。放在括号中。 逻辑运算符:&&、||、! 表达式值为0代表条件不成立(假) 表达式值为非0代表条件成立(真) 例如:100<a<999 100<a && a<999 × √
if语句扩展 表达式可为任意表达式,只要值为0就认为条件不成立,值为非0就认为条件成立。例如: if(1)…… if(-4+3) …… if(‘a’)…… flag=3; if(flag)……
关系表达式的运算 • 算术运算优先级高于关系运算,关系运算优先级高于逻辑运算。 • 逻辑运算符优先级: !、&&、|| • 参与逻辑运算的数据理解:值为非零即是真,值为零即是假。例如: • 3 && 0 结果为0; • -7 || 0 结果为1; • !800 结果为0
表达多种情况的选择 常用if语句嵌套实现 规则的多分支语句可用switch语句实现 多分支结构
格式3: if (表达式1) 语句序列1; else if (表达式2) 语句序列2; else 语句序列3; if 语句的三种形式(3) 例3 设有分段函数: -1(x<0) y= 0 (x=0) 1 (x>0) 编一个程序,输入x,输出y。 …
简单算法流程图 假(0) x<0? 假(0) x=0? 真(非0) 真(非0) y=0 y=1 y=-1 #include <stdio.h> main() { int x,y; scanf(“%d”,&x); if(x<0) y=-1; else if(x==0) y=0; else y=1; }
if 语句嵌套 注意: if语句或if……else语句虽然书写在多行,但语法逻辑上是一条语句。 else总是与它上面最近的那个if 配对。 必要时可加大扩号“{ }”,改变匹配关系。
if 语句嵌套 if与else的配对关系并不依赖于书写程序时用户根据程序的层次性逐渐内缩的梯形结构,而else总是与它上面最近的那个if 配对。 例如: if (表达式1) if (表达式2) 语句序列1; else 语句序列2; if (表达式3) 语句序列3; else 语句序列4;
举例 求一元二次方程ax2+bx+c=0的解 流程图见教材2.4
本例题学到一个实数的比较方法: 实型数据,由于采用浮点数的形式存储于计算机中,在存储与读取的过程中有精度损失,就是说实数经过存储后再读取出来,就不能精确等于原来的数值了。这样一个实数与其他数进行相等比较时,不能用==表达相等关系,例如实数a==0是不能正确比较的。而应该用它与其他数相减的差的绝对值在某一个小数范围内来表示近似相等。如本例中的fabs(a)<=1e-6,表示如果a小于10-6,就算是近似为0了。
分支结构编程练习 从键盘上输入一个小于10000的数,判断它是几位数,并输出判断结果。
使用形式: switch(表达式) { case 常量1: 语句序列1; break; case 常量2: 语句序列2; break; case 常量n: 语句序列n; break; default: 语句序列n+1; } switch (多分支) 语句 观察语法格式 ? ? … …
说明: • switch 语句的执行部分是由若干个case语句和一个可缺省的default语句组成的复合语句,整个要用大括号括起来.语句序列1~n+1中,如果某个语句是由两个以上的语句组成,可以不用大括号。 • switch后的表达式和case后的常量值可以为任何类型,但一般情况下为整型和字符型。
当表达式的值与case后的常量值相等时,则执行该case后的语句序列。执行完后退出switch语句,跳转到整个switch语句之后的下一个语句执行。如果所有的case语句的常量值与switch之后的表达式不匹配,则执行default之后的语句序列。当表达式的值与case后的常量值相等时,则执行该case后的语句序列。执行完后退出switch语句,跳转到整个switch语句之后的下一个语句执行。如果所有的case语句的常量值与switch之后的表达式不匹配,则执行default之后的语句序列。 • 各case语句之后的常量值不能相同。 • 如果某个case语句最后的break语句被省略,则执行完该case语句之后,系统则会继续执行下一个case语句。 • 多个case语句可以共用一组执行语句
例5 在学生成绩管理中,经常要将成绩的百分制转换成对应的等级制。90分以上为A等,80-89为B等,70-79为C等,60-69分为D等,其余为E等。 编制程序,根据输入的百分制成绩,输出对应的等级。 【分析】成绩的可能取值是多种多样的,但case后面的常量值只能是一个具体的值,不能表达为一个值的范围;因此需将原成绩值进行某种运算转换为相应的一个具体值,这样才能进行case的匹配。 请大家思考??? 提示:将原成绩值与10做整除运算,可得到一个具体值。
#include <stdio.h> main() { int score ,temp; printf(“Input score of student:”); scanf(“%d”,&fscore); temp=fscore/10; switch(temp) { case 10: case 9: printf(“A”); break; case 8: printf(“B”); break; case 7: printf(“C”); break; case 6: printf(“D”); break; default: printf(“E”); } } 参考程序
简单的条件选择可以使用条件运算符。 格式:表达式1?表达式2:表达式3 例如:a>b?a-b;b-a; 条件运算符的优先级高于赋值运算符,低于关系运算符和算术运算符。 例如:max=a>b?a:b 详细语法见P38页。 条件运算符
例:输入一个字符,如果是大写字母,转换为小写,如果不是则不转换。例:输入一个字符,如果是大写字母,转换为小写,如果不是则不转换。 main() { char ch; scanf(“%c”,&ch); ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch; printf(“%c”,ch); }
小节分支语句使用形式: 单分支(if……) 双分支(if……else……) 三分支和多分支(用if语句嵌套实现) 规整的多分支形式:switch语句
循 环 语 句 2.2
2.2循环语句 while语句 do while 语句 for语句 循环嵌套
实验2 -5题改进: main() {float a,b,c,s,area; scanf("%f%f%f",&a,&b,&c); while(!(a+b>c&&a+c>b&&b+c>a)) { scanf("%f%f%f",&a,&b,&c); } s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“area is %f\n”,area); } 循环体 随机次数循环
观察下面循环程序,模仿编程。 求全班同学成绩的平均分。 main() { float a,sum=0; int i,num; scanf(“%d”,&num); for(i=1;i<=num;i=i+1) { printf("input score:"); scanf("%f",&a); sum=sum+a; } printf("result is: %f",sum/num); } 预备学习 固定次数循环 程序lianxi2.c
循环结构的适用情况 • 循环结构比较适合解决多次重复执行相同的操作运算。 • 分析以上这句话,用循环结构来解决问题的时候我们需要关注哪些? 1. 多次重复→这就需要考虑一个循环的执行次数如何控制? 2. 相同的操作运算→这就是循环体,就是循环控制结构内的操作语句。
三种C语言循环控制结构语句 1、for(循环变量=初值;循环变量<=终值;循环变量增值) { 循环体语句 } 2、while(循环条件) { 循环体语句 } 3、do { 循环体语句 } while(循环条件); 说明:三种语句的功能大体上是一样的,都能实现循环结构控制,只是具体的语法结构不同,编程时有些细节处理不同。 注意分号 说明:当循环体由若干语句组成时,应用大括号括起来。
编程练习 从键盘上输入10个整数,输出每个数的平方。使用for语句编程。 3分钟
参考程序: main() { int a,i; printf("input an integer:"); for(i=1;i<=10;i=i+1) { scanf("%d",&a); printf(": %d\n",a*a); } }
补充:自增运算符 ++ 自减运算符 -- 例如:i++ 、 ++i i-- 、 --i 例如: for(i=1;i<=10;i++) { scanf("%d",&a); printf(": %d\n",a*a); } }
扩展知识,复合的赋值运算符: i+=1; i+=2; 类似的还有:i*=2; i-=2; i/=3; i%=3;等 • 变量的自增语句有三种: • i=i+1; i=i+2; • i++; • i+=1; i+=2;
补充:循环控制过程中,步长的修正是灵活多样的 ,可正、可负;步长可为1,也可为2、3、10等。 例如: for( i=10;i>=1;i--) for(i=3;i<=100;i+=2) i=100; while(i>10) { …… i=i-10; }
main() { float a,sum=0; int i,num; scanf(“%d”,&num); for(i=1;i<=num;i=i+1) { printf("input score:"); scanf("%f",&a); sum=sum+a; } printf("result is: %f",sum/num); } 循环语句转换 i =1; while(i<=num) { printf("input score:"); scanf("%f",&a); sum=sum+a; i++; }
main() { float a,sum=0; int i,num; scanf(“%d”,&num); for(i=1;i<=num;i++) { printf("input score:"); scanf("%f",&a); sum=sum+a; } printf("result is: %f",sum/num); } 循环语句转换 i=1; do { printf("input score:"); scanf("%f",&a); sum=sum+a; i++; } while(i<=num);
总结 使用while和do…while循环,注意: 1、赋初值:循环变量 i =1;累乘之积 m=1; 2、循环变量要修正值,i++;或i- -; 否则造成死循环。 Ctrl+Break 结束死循环
使用while语句或do…while语句实现随机次数的循环举例。使用while语句或do…while语句实现随机次数的循环举例。
【例2.12】输入一个字符,如果是大写字母,转换为小写,如果不是则不转换。输入“0”结束程序。【例2.12】输入一个字符,如果是大写字母,转换为小写,如果不是则不转换。输入“0”结束程序。 #include <stdio.h> void main( ) { char ch; while (1) { ch=getchar( ) if (ch==‘0’) break; ch= (ch>='A'&&ch<='Z') ? (ch+32) : ch; printf("%c",ch); } } 永真循环。表面上看是死循环,实际在循环体里有if语句进行条件判断,可以执行到break语句退出循环。
总结 • 循环情况分类: • 固定次数的循环;(适合用for语句实现) • 随机次数的循环。(适合用while和do…while语句) • 举例: • 固定次数:for(i=100;i<=999;i++) …… • 随机次数:while(ch!=13) ……
以上只是常用方法,不绝对,例如也可以用for语句实现随机次数的循环;也可用while 和do while实现固定次数的循环。 #include <stdio.h> void main( ) { char ch; for(;(ch=getchar( ))!='0 ';) { ch= (ch>='A'&&ch<='Z') ? (ch+32) : ch; printf("%c",ch); } }
说明: • 如果在for语句之前已经给循环变量赋初值,则for语句的循环 变量赋初值部分可以省略。但其后得分号不省略。 • 例: i=1; • for( ;i<=10;i++) m=m*i; • 也可以将循环变量修正值的工作纳入到循环体中去做. • 例: for (i=1;i<=10; ) • { m=m*i; i++;} • 第二部分“循环条件表达式”不能缺省,否则将陷入死循环。
也可以省略for语句的第一和第三部分 • 例: i=1; • for( ; i<=10; ) • { m=m*i ; i++; } • 如果有多个循环变量赋初值,或多个循环变量值要修正,应在各 变量之间用逗号隔开。 • 例: for(i=1,j=10;i<=j;i++,j- -) • k=i+j;
编程练习 从键盘输入若干整数,以0结束,判断并输出其中最大的数。 • 分析: • 循环次数随机。循环条件控制 • while(n!=0) • 求最大值的算法:反复比较,设定一个最大值变量max,则 • if (max<n) max=n; • 循环语句构成: • 比较;输入; • 循环开始前的处理工作: • 变量n的初值?max的初值? main() { int n,max; scanf(“%d”,&n); max=-32768; while (n!=0) { if (max<n) max=n; scanf(“%d”,&n); } printf("%d\n",max);
比较两种循环实际执行过程中的不同 main() { int n,max; scanf(“%d”,&n); max=-32768; while (n!=0) { if (max<n) max=n; scanf(“%d”,&n); } printf("%d\n",max); while循环有可能一次也不执行,而do while循环至少要执行一次。 main() { int n,max; scanf(“%d”,&n); max=-32768; do { if (max<n) max=n; scanf(“%d”,&n); } while (n!=0); printf("%d\n",max);