C语言程序设计基础课件 第4章 程序结构_第1页
C语言程序设计基础课件 第4章 程序结构_第2页
C语言程序设计基础课件 第4章 程序结构_第3页
C语言程序设计基础课件 第4章 程序结构_第4页
C语言程序设计基础课件 第4章 程序结构_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

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

文档简介

回顾

数据类型标识符变量常量运算符与表达式输入与输出程序设计基础114.1顺序结构4.2选择结构(分支结构)4.3循环结构一组逐条执行的可执行语句。按照书写顺序,自上而下的执行。结构化程序设计的三种基本结构一种先对给定条件进行判断,并根据判断的结果执行相应命令的结构。指多次重复执行同一组命令的结构。第4章程序结构第4章程序结构顺序结构程序设计基础3AB第4章程序结构选择结构程序设计基础4PAB真假二分支选择结构kA1A2AiAnk=k2k=k1k=knk=ki......多分支选择结构第4章程序结构循环结构程序设计基础5当型循环结构直到型循环结构PA假真AP真假4.1顺序结构顺序结构:指按照语句在程序代码中出现的先后次序顺序执行,不跳过任何语句。优点:算法简单缺点:只能解决最简单的问题。输入计算输出7/48(1)用预处理命令包含文件或进行宏定义;(2)定义变量;(3)为变量赋初值(可以用赋值语句或输入函数);(4)计算;(5)输出结果。程序流程基本框架

4.1顺序结构【例4.1】朱自清在《匆匆》中通过细腻的笔触描绘了时间的流逝,表达了对时间宝贵的深刻认识。他写道:“洗手的时候,日子从水盆里过去;吃饭的时候,日子从饭碗里过去;默默时,便从凝然的双眼前过去。”这句话形象地展示了时间在不经意间悄然流逝,提醒我们要珍惜每一分每一秒。现在给一个h:m:s形式的时间,将其转换为对应秒数,感受时间的流逝。4.1顺序结构【例4.1】时间转换。4.1顺序结构分析:1.需要定义3个int类型的变量h、m、s,代表时、分、秒,用来存储从键盘上输入的3个整数,再定义1个int类型的变量t,代表总秒数。2.调用scanf()函数,以便从键盘上输入3个整数并依次存储到变量h、m、s中;3.转换对应秒数后,调用printf()函数,以%d格式输出。#include<stdio.h>intmain(){}

【例4.1】时间转换。4.1顺序结构printf("请输入时间:");scanf("%d:%d:%d",&h,&m,&s);//把用户从键盘输入的3个整数依次存入变量h、m、sinth,m,s,t;//定义4个int型变量t=h*3600+m*60+s;printf("对应的秒数:%d",t);//输出转换对应的秒数【例4.2】输入3个实数作为一个三角形的三条边的边长,按照海伦公式求三角形的面积。4.1顺序结构海伦公式为:,其中p=(a+b+c)/2分析:(1)定义float类型变量a、b、c、s和area备用。(2)从键盘上输入三个边长数据存入变量a、b、c中。(3)通过表达式s=(a+b+c)/2,求出周长的一半并存入变量s。(4)通过表达式area=sqrt(s*(s-a)*(s-b)*(s-c)),求出面积并存入变量area。(5)以%.2f格式输出变量area的值。【例4.2】输入3个实数作为一个三角形的三条边的边长,按照海伦公式求三角形的面积。4.1顺序结构#include<stdio.h>#include<math.h>//包含此文件以便能使用它声明的求平方根函数sqrt()main(){floata,b,c,s,area;//定义变量备用printf("输入三个边长,空格隔开:");//显示操作提示scanf("%f%f%f",&a,&b,&c);//以%f格式接收三个数,依次存入变量a、b、cs=(a+b+c)/2;//赋值表达式语句,求出周长的一半存入变量sarea=sqrt(s*(s-a)*(s-b)*(s-c));//sqrt()是系统定义的求平方根库函数printf("三角形面积=%.2f\n",area);}三条边不能构成三角形呢?4.2选择结构根据给定的条件进行判断,以决定执行某个分支程序段。if语句switch语句选择结构设计举例4.2.1if...else语句1.书写形式

if(表达式)

语句1; else

语句2;用表达式表示条件不局限于关系表达式(0或1)也可为数值表达式(0或非0)表达式的值非0时,为真注意:在if关键字之后通常是逻辑表达式或关系表达式,其结果为真或假。表达式必须用括号括起来。if(表达式)后面不能带分号。4.2.1if...else语句

2.执行流程 4.2.1if...else语句3.语法规则

if(表达式)

语句1; else

语句2;orif(表达式)

{

语句1;

语句3;}else

{

语句2;

语句4;}即使分支中只有一条语句,大括号最好也不省略习惯上采用缩进格式将if与else分写在不同行;语句1和语句2是一条语句。若if与else之间的语句多于一条,需要使用大括号将这些语句界定为一条复合语句。4.2.1if...else语句3.语法规则

if(表达式)

语句1; else

语句2;例如:if(x>y){x=y;y=x;}else{x++;y++;}思考:如果不带花括号,程序如何执行?4.2.1if...else语句

【例4.3】刚上高一的小明最近迷上了《中国诗词大会》,于是与图4-3双分支选择结构爸爸妈妈举办了一期家庭版诗词大会,胜利者可免除一周的家务。本次规则是轮流说出与月亮相关的诗句,每正确回答出来一句加10分,获得60分为胜者。请编写一个程序对得分进行计算,输入正确回答的诗句个数,统计得分,当得分大于等于60分时,输出“恭喜你取得胜利”,当得分小于60分时,输出“恭喜你喜提家务一周”。4.2.1if...else语句

【例4.3】统计得分进行输出。#include<stdio.h>main(){intn;//定义一个int型变量,代表正确回答诗词的个数printf("输入正确回答诗词的个数:");//显示操作提示

scanf("%d",&n);//从键盘输入一个整数if(n*10>=60)//如果n*10>=60{ printf("恭喜你取得胜利");//输出语句

}else//否则

{ printf("恭喜你喜提家务一周");//输出语句

}}4.2.1if...else语句【例】继续改写求三角形面积的例题,要求在三条边构不成三角形时输出相应的提示。#include<stdio.h>main(void){

return0;}

floata,b,c,p,s;printf("Inputthreeedgesoftriangle:\n");scanf("%f%f%f",&a,&b,&c);if(a+b>c&&b+c>a&&a+c>b){p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));printf(“这个三角形的面积为:%f\n",s);}

elseprintf(“三边构不成三角形!\n",s);4.2.1if...else语句【例】输入一个字符,若是小写字母则变为大写字母输出,否则原样输出。21#include<stdio.h>intmain(void){

charch;ch=getchar(); if(ch>=‘a’&&ch<=‘z’) /*如果是小写字母*/ putchar(ch-32); /*转换为大写字母*/else putchar(ch);return0;}定义字符变量ch输入字符存放入ch判断ch是小写字母将ch转换为大写字母否则将ch原样输出练一练1.输入一个整数,判断是否是偶数。22if(n是2的倍数)

输出“偶数”;else

输出“奇数”;if(sum<1000&&sum>=0)sum=sum*0.9;else

sum=sum*0.8;2.编程实现输入商品总额求优惠后的价格。某超市采取优惠活动如下,所购商品总额在1000元以下的,打9折优惠;所购商品总额超过(含)1000元的,打8折优惠。练一练3.输入一个整数表示年份,若该年是闰年,输出“yes”,否则输出“no”。闰年判定遵循的规律:四年一闰,百年不闰,四百年再闰对应的C逻辑表达式:23如果year是400的倍数,或year是4的倍数并且不是100的倍数,则是闰年;否则,不是闰年。if(year%400==0||year%4==0&&year%100!=0)printf("yes\n");elseprintf("no\n");4.2.2单分支if语句1.一般形式}if(表达式){

语句序列}if(x>y)printf(“%d”,x);

if(x>y){printf(“%d”,x);

}4.2.2单分支if语句

【例4.4】编程实现奖学金评选。输入两个学生的综合积分(整数),并按照由小到大的顺序输出。#include<stdio.h>main(){ inta,b,t;//a,b代表两个学生综合积分,t是交换时的周转变量

printf("输入两个学生的综合积分:");//显示操作提示

scanf("%d%d",&a,&b);//从键盘输入两个学生的积分

if(a>b)//如果a>b,交换a与b的值

{//实现a、b的交换

t=a;//a的值给t a=b;//b的值给a b=t;//t的值给b } printf("%d%d",a,b);}4.2.3

if语句的嵌套1.一般形式}if(表达式1){ if(表达式2)

语句1;

[else

语句2;]}[else{ if(表达式3)

语句3;

[else

语句4;]}]说明:[]括起来的部分是可选项可以将内嵌的if语句用花括号{}括起来作为一个复合语句,以强调匹配关系。if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4

表达式1表达式3语句4真假表达式2语句3语句1语句2真真假假}}}4.2.3

if语句的嵌套2.执行流程4.2.3

if语句的嵌套}if语句嵌套:一个if...else语句放在另一个if...else语句中。if(表达式1)

if(表达式2)语句1else语句2else

if(表达式3)语句3else语句4内嵌if内嵌ifif(表达式1)

if(表达式2)

语句1else

语句2内嵌ifif(表达式1)

if(表达式2)

语句1else

语句3

内嵌ifif(表达式1)

语句1else

if(表达式3)

语句3else

语句4内嵌ifif

(表达式1)

语句1;elseif

(表达式2)

语句2;elseif

(表达式3)

语句3;…...elseif

(表达式n)语句n;else

语句n+1;≠0=0=0≠0≠0≠0=0

=0表达式1

语句1表达式2表达式3表达式n

语句2语句3语句n语句n+1作用:常用于当一次判断面临多条路径时。4.2.3

if语句的嵌套2.在书写上,应将处于同一层上的if和其对应的else缩进对齐以增强程序可读性。if(......)if(......)if(......)else......else......else......与最靠近它的、没有与别的else匹配过的if匹配1.else与if的匹配原则:4.2.3

if语句的嵌套31例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:

if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);实现if~else正确配对方法:加{}嵌套if语句匹配原则4.2.3

if语句的嵌套【例4.5】计算个人所得税。我国个人所得税适用七级超额累进税率,如表4-1所示。全年应纳税所得额税率速算扣除数不超过360000.030大于36000小于等于1440000.12520大于144000小于等于3000000.216920大于300000小于等于4200000.2531920大于420000小于等于6600000.352920大于660000小于等于9600000.3585920大于9600000.45181920表4-1个人所得税七级超额累进税率表4.2.3

if语句的嵌套【例4.5】计算个人所得税。#include<stdio.h>main(){floatsalary,Tax;//定义float型变量存储应纳税金额和税款printf("输入应纳税金额:\n");//显示操作提示scanf("%f",&salary);//从键盘输入应纳税金额存入变量salaryif(salary<=36000)Tax=salary*0.03;if(salary>36000&&salary<=144000)Tax=salary*0.1-2520;if(salary>144000&&salary<=300000)Tax=salary*0.2-16920;if(salary>300000&&salary<=420000)Tax=salary*0.25-31920;if(salary>420000&&salary<=660000)Tax=salary*0.3-52920;if(salary>660000&&salary<=960000)Tax=salary*0.35-85920;if(salary>960000)Tax=salary*0.45-181920;printf("应缴个人所得税%.2f元",Tax);}使用单分支if语句4.2.3

if语句的嵌套【例4.5】计算个人所得税。#include<stdio.h>main(){floatsalary,Tax;//定义float型变量存储应纳税金额和税款printf("输入应纳税金额:\n");//显示操作提示scanf("%f",&salary);//从键盘输入应纳税金额存入变量salaryif(salary<=36000)Tax=salary*0.03;elseif(salary<=144000)Tax=salary*0.1-2520;elseif(salary<=300000)Tax=salary*0.2-16920;elseif(salary<=420000)Tax=salary*0.25-31920;elseif(salary<=660000)Tax=salary*0.3-52920;elseif(salary<=960000)Tax=salary*0.35-85920;elseTax=salary*0.45-181920;printf("应缴个人所得税%.2f元",Tax);}嵌套的if语句4.2.3

if语句的嵌套#include<stdio.h>main(){floatsalary,Tax;//定义float型变量存储应纳税金额和税款

printf("输入应纳税金额:\n");//显示操作提示

scanf("%f",&salary);//从键盘输入应纳税金额存入变量salary

if(salary<=300000)

if(salary<=144000)

if(salary<=36000)Tax=salary*0.03;

else//salary大于36000且小于等于144000Tax=salary*0.1-2520;

else//salary大于144000且小于等于300000Tax=salary*0.2-16920;

else//salary大于300000

if(salary<=660000)//salary大于300000且小于等于660000

if(salary<=420000)//salary大于300000且小于等于420000Tax=salary*0.25-31920;

else//salary大于420000且小于等于660000Tax=salary*0.3-52920;

else//salary大于660000

if(salary<=960000)//salary大于660000且小于等于960000Tax=salary*0.35-85920;

else//salary大于960000Tax=salary*0.45-181920;printf("应缴个人所得税%.2f元",Tax);}嵌套的if语句4.2.3

if语句的嵌套【例4.6】计算分段函数:4.2.3

if语句的嵌套#include<stdio.h>main(){floatx,y;printf("输入x的值:");scanf("%f",&x);if(x>0)

if(x<=20)y=x-15;

elsey=x-20;else

if(x<=-20)y=x+20;

elsey=x+15;printf("y=%f\n",y);}4.2.3

if语句的嵌套【例4.7】根据邮件的重量和用户是否选择加急计算邮费。

分析:根据重量的不同有不同的计费标准。当重量大于1000g时,判断超出1000g的部分是否能被500整除,如果能整除,说明超出的部分正好是500的倍数,由于每500g加收超重费用4元,所以将该倍数乘以4就可得出超出部分的邮费,如果不能整除,则将超出的部分除以500后取商再加一,然后再乘以4,就可得出超出部分的邮费。如果选择加急(加急用y表示),则再将邮费增加5即可。4.2.3

if语句的嵌套#include<stdio.h>main(){intfee=8,weight;charf;printf("请输入邮件的重量和是否加急:");scanf("%d%c",&weight,&f);if(weight>1000){ if((weight-1000)%500==0) { fee=fee+4*(weight-1000)/500; } else { fee=fee+4*((weight-1000)/500+1);} } if(f=='y') { fee+=5;}printf("邮费:%d",fee);}【例】读入一个字符,若该字符是字母,则输出“字母”;若该字符是数字,则输出“数字”;若该字符是空格或回车,则输出“分隔符”;若以上都不是,则输出“其它”。40分析:ch字母数字分隔符其他4.2.3

if语句的嵌套41#include<stdio.h>intmain(void){ charch; ch=getchar();

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') printf("字母\n");

elseif(ch>='0'&&ch<='9') printf("数字\n");

else

if(ch==''||ch=='\n') printf("分隔符\n");

else printf("其他\n"); return0;}定义字符型变量ch输入ch的值若该字符是字母,则输出“字母”若该字符是数字,则输出“数字”若该字符是空格或回车,则输出“分隔符”若以上都不是,则输出“其它”4.2.3

if语句的嵌套42一般格式:switch(表达式){case常量表达式1:语句序列1;[break;]

case

常量表达式2:语句序列2;[break;]…case常量表达式n:语句序列n;[break;][default:语句序列n+1;]}int、char不一定要放在最后允许多条语句,不用{}可以不用4.2.4switch语句434.2.4switch语句执行流程:表达式的值=常量表达式2的值表达式语句段1语句段2语句段n语句段n+1表达式的值=常量表达式1的值表达式的值=常量表达式n的值其他breakbreakbreakbreak4.2.4switch语句【例4.8】实现四则运算。从键盘输入由两个整数和一个运算符组成的表达式,根据运算符完成相应的运算,并输出结果。分析:完成四则运算,需要有一个char型变量储存运算符,两个int型变量储存两个操作数。根据运算符的不同,需要考虑以下几种情况:(1)如果运算符是“+、-、﹡”中的任意一个,进行相应的运算。(2)如果运算符是“∕”,应先判断除数是否为0,并作相应处理。(3)如果运算符不合法,报错。算法描述4.2.4switch语句像这种等值比较,有没有别的语句可以实现呢?4.2.4switch语句#include<stdio.h>main(){inta,b;//存放操作数charop;//存放运算符printf("按照操作数运算符操作数的形式输入算式:\n");scanf("%d%c%d",&a,&op,&b);

if(op=='+')printf("%d+%d=%d\n",a,b,a+b);

elseif(op=='-')

printf("%d-%d=%d\n",a,b,a-b);elseif(op=='*')

printf("%d*%d=%d\n",a,b,a*b);elseif(op=='/')

if(b!=0)printf("%d/%d=%d\n",a,b,a/b);

elseprintf("除数不能为零\n");else

printf("运算符有误\n");}源代码4.2.4switch语句【例4.8】实现四则运算。#include<stdio.h>main(){inta,b;//存放操作数charop;//存放运算符printf("按照操作数运算符操作数的形式输入算式:\n");scanf("%d%c%d",&a,&op,&b);switch(op)//把输入的运算符作为表达式的值{case'+':printf("%d+%d=%d\n",a,b,a+b);break;case'-':printf("%d-%d=%d\n",a,b,a-b);break;case'*':printf("%d*%d=%d\n",a,b,a*b);break;case'/':

if(b!=0)printf("%d/%d=%d\n",a,b,a/b);elseprintf("除数不能为零\n");break;default:printf("运算符有误\n");}}4.2.4switch语句【例4.9】模拟一个“编程竞赛评分系统”。用户输入选手的最终成绩,程序根据得分给出评价。根据输入的学生成绩判断等级:当成绩≥90时,显示金牌;当80≤成绩<90时,显示银牌;当70≤成绩<80时,显示铜牌;当60≤成绩<70时,显示优秀奖;当成绩<60时,显示未获奖。

分析:100:十位为10;90-99:十位为9;80-89:十位为8;60-79:十位为6或7;0-59:十位为0、1、2、3、4、5;

如何求出十位数字?x/104.2.4switch多分支选择语句main(){intscore;printf("输入成绩:\n");scanf("%d",&score);switch(score/10){case10:case9:printf("金牌\n");break;case8:printf("银牌\n");break;case7:printf("铜牌\n");break;case6:printf("优秀奖\n");break;case5:case4:case3:case2:case1:case0:printf("未获奖\n");break;default:printf("输入有误\n");}}【例4.9】判断成绩等级。504.2.4switch语句switch(ch){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':digit++;break;case'':case'\n':case'\t':white++;break;default:character++;break;}

①每个case中的常量或常量表达式的值应互不相同,否则会出现矛盾的结果。②如果每个case和default中都有break语句,那么,case和default出现的次序不会影响程序的运行结果。③允许多个case共用一个语句序列。注意:514.2.4switch语句注意:④字符常数出现在case中,它们会自动转换成整型。⑤switch可以嵌套使用,要求内层的switch必须完全包含在外层的某个case中,允许内、外层switch的case中含有相同的常数,不会引起误会。如

switch(x){case1:switch(y){case0:printf("dividedbyzero");break;case1:printf("Itisright");break;}case2:……}⑥switch只能进行相等性检查,而if不但可进行相等性检查,还可以计算关系或逻辑表达式。因此,switch不能完全替代if。521.考虑下面程序输出结果:

intmain(){charn=‘c’;switch(n++){default:printf(“error”);break;case'a':case'A':case'b':case'B':printf(“good”);break;case'c':case'C':printf(“pass”);case'd':case'D':printf(“warn”);}return0;}结果:passwarn课堂练习根据输入的月份判断季节,设2、3、4月为春季,5、6、7月为夏季,8、9、10月为秋季,11、12、1月为冬季。(要求用switch语句完成)课堂练习while语句do...while语句for语句流程转向语句循环结构的嵌套4.3循环结构一般格式:while(表达式) {循环体语句}执行流程:

4.3.1

while语句特点:

先判断表达式,后执行循环体4.3.1

while语句算法分析:第1次s=0第2次s+1ss+2s第3次第100次s+3ss+100s……第i次s+is重复执行的操作重复多少次i=1……100100次【例4.10】使用循环结构求1+2+…+100的值。4.3.1

while语句i=1,s=0;i<=100s=s+i;真假i++;

inti,s;s=0;

i=1;

{ s=s+i;

i++;}printf("s=%d\n",s);while(i<=100)循环初值循环变量增值循环条件循环终值循环体【例4.10】使用循环结构求1+2+…+100的值。4.3.1

while语句【例4.11】寻找最强勇士。在一个古老的王国中,有10位勇士参加了一场力量比拼。每位勇士的力量值用一个整数表示。国王需要找出这10位勇士中力量值最大的那位,授予他“最强勇士”的称号。请用while语句编写程序,帮助国王完成这个任务。4.3.1

while语句【例4.11】寻找最强勇士。算法分析:(1)读入整数a、b、c等10个整数;(2)将a存入max(暂时认为a最大);(3)如果b>max,用b更新max;(4)如果c>max,用c更新max;

......(5)输出max。4.3.1

while语句【例4.10】寻找最强勇士。#include<stdio.h>main(){inti,num,max; //i用作控制循环的变量,num存储输入的整数,max存最大数printf("输入10个整数:\n"); //显示操作提示

scanf("%d",&num); //输入第一个整数存入变量nummax=num; //目前只有一个数,显然它就是最大的数,把它存入变量maxi=1; //i用来构建表达式,控制循环

while(i<=9) //循环条件是i<=9,当i>9时会退出循环

{scanf("%d",&num);//输入一个整数存入变量num,之前存入num的数被替换

if(num>max)max=num;//如果num>max,新输入的num是截至当前的最大数

i++; //变量i的值加1,以影响循环条件表达式i<=9的取值printf("最大值:%d\n",max);//显示求得的最大值,已在循环结束前存入变量max}4.3.1

while语句while语句注意事项

(1)while循环属于当型循环,先判断条件,后执行循环体。若第一次计算表达式的值=0,则循环体一次也不执行。inti,s;s=0;i=1;while(i<=0){ s=s+i; i++;}printf("s=%d\n",s);4.3.1

while语句while语句注意事项(2)循环体内要有使循环趋向于结束的语句,否则循环条件始终为真,将一直执行循环体,引起死循环。inti,s;s=0;i=1;while(i<=100){ s=s+i; i++;}printf("s=%d\n",s);4.3.1

while语句while语句注意事项(3)循环体可以是简单语句,也可以是复合语句,当由多条语句组成时,必须用左、右花括号括起来。inti,s;s=0;i=1;while(i<=100) s=s+i; i++;printf("s=%d\n",s);循环体外{

}4.3.1

while语句while语句注意事项(4)while(条件)后加了分号,使得while语句的循环体是一条空语句,将造成逻辑错误。inti,s;s=0;i=1;while(i<=100);{ s=s+i; i++;}printf("s=%d\n",s);while(i<=100){;}课堂练习求1+3+5……+99的和.求2+4……+100的和.求1-300之间3的倍数之和.4.3.1

while语句【例4.12】从键盘输入一行字符,输出输入的字符总数。#include<stdio.h>main(){intn=0;printf("输入字符:\n");while(getchar()!='\n')//输入的字符不是'\n'时进行循环,是\n时退出循环

{n++;

//循环体,累计已输入的字符数存入变量n}printf("输入的字符总数=%d\n",n);}【例4.13】求两个非负整数u和v的最大公约数。分析:假设两个数分别是u和v,可以分别用u和v除以从两者的最小值到1之间的每一个数,只要有一个数能被u和v同时整除,这个数就是最大公约数,效率低。方法一:穷举法方法二:辗转相除法分析:(1)r=u%v。(2)若r=0,则最大公约数就是v,结束循环。(3)否则让u=v,v=r,转第(1)步。4.3.2

do...while语句4.3.1

while语句【例4.13】求两个非负整数u和v的最大公约数。#include<stdio.h>//方法一main(){intu,v,t;printf("输入u和v:");scanf("%d,%d",&u,&v);if(u<0||v<0)//u、v不全是非负printf(“u、v不全是非负”);

//出错提醒信息else{t=(u>v)?v:u;//将u、v中的小数赋给变量twhile(u%t!=0||v%t!=0)

//u、v有至少一个不能整除t,就循环{t--;}//通过循环逐个试探求解

printf("%d和%d的最大公约数=%d\n",u,v,t);}}#include<stdio.h>

//方法二intmain(){ intu,v,t; scanf("%d%d",&u,&v); while(u%v!=0) {

t=u%v;

u=v;

v=t; } printf("%d",v); return0;}【例4.14】假设一家公司的人力资源经理手头有一份所有员工的年薪数据,现在需要计算公司全体员工的平均年薪,以便进行薪酬分析和预算规划。请编程输入一个公司所有员工某年的年薪,求该年的平均年薪(负数作为结束)。4.3.2

do...while语句#include<stdio.h>main(){

floatsalary,s=0,average;//salary存储输入的一个年薪,s用于存储累加的年薪intn=0;//其值表示已输入年薪的人数,初值为0表示尚未录入年薪

printf("输入员工年薪:");scanf("%f",&salary);//输入第一个员工年薪,存入变量salarywhile(salary>=0)//当输入的年薪不小于0,进入循环

{s=s+salary;//把刚输入的一个员工的年薪累加到变量sn++;//人数加一

scanf("%f”,&salary);//再输入一个员工的年薪

}if(n!=0)average=s/n;//表达式n!=0,即当n不等于0时值为1,也可写作if(n)printf("平均年薪:%7.2f",average);}4.3.2

do...while语句课堂练习1.有以下程序段:

intk=0;

while(k=1)k++;

while循环执行的次数是(

)。

A.无限次

B.有语法错误

C.一次也不执行

D.执行A课堂练习2.若有以下程序,程序运行后,如果从键盘上输入1298,则运行结果是()。#include<stdio.h>main(){intn1,n2;scanf("%d",&n2);while(n2!=0){n1=n2%10;n2=n2/10;printf("%d",n1);}}A.892B.8921C.89D.921B4.3.2

do...while语句【引例】输入一个整数n(int范围内),输出n的位数。n=495495%10=5495/10=49n=4949%10=949/10=4n=44%10=44/10=0循环结束条件n=0循环条件n!=0循环体n=n/10;count++;算法描述:(1)读入整数n;(2)当n!=0,重复以下操作;

划掉最右边的数字,得到一个新数;

统计整数的个数count;(4)输出整数的位数。

count=0;while(n!=0){

n=n/10;

count++;}74#include<stdio.h>main(void){intn,count;scanf("%d",&n);count=0;//位数初始化为0

while(n!=0)//当n非0,重复如下操作{n=n/10;//扔掉n的个位数字

count++;//位数加1}printf("%d\n",count);return0;}考虑:输入0,输出什么?if(n==0)count=1;源代码n=0时,循环一次也不执行必须单独处理4.3.2

do...while语句一般格式:do{

循环体语句}while(循环条件表达式);执行流程:

4.3.2

do...while语句注意:(1)do、while是关键字,须为全小写。(2)do{…}while(表达式);后面的分号不能少!(3)do与while之间的循环体。如果有多条单语句,必须用{}“括”成一条复合语句。(4)如果不是需要至少执行一次循环体,即无论循环条件是否成立都需要执行一次循环体,建议使用while语句。while:先判别条件,再决定是否循环;do-while:先至少循环一次,再根据循环的结果决定是否继续循环。while语句和do...while语句的比较真假表达式循环体语句do-while的下一条语句真假while的下一条语句表达式循环体语句【引例】输入一个整数n(int范围内),输出n的位数。

#include<stdio.h>intmain(void){intn,digits;scanf("%d",&n);digits=0;//位数初始化为0if(n<0)n=-n;

do{n=n/10;//扔掉n的个位数字

digits++;//位数加1}while(n!=0)

;printf("%d\n",digits);return0;}无须对n=0特殊处理4.3.2

do...while语句4.3.2

do...while语句【例4.16】用do...while语句编程求1+2+…+100的和。#include<stdio.h>main(){intsum=0,n=1;do{sum=sum+n;n++;}while(n<=100);

printf("1+2+3+…+100=%d\n",sum);}与for、while语句对比其格式上和执行流程上的区别。一般格式为:for(表达式1;表达式2;表达式3){

循环体语句}执行流程:4.3.3

for语句表达式3表达式1表达式2语句真如果值为假假循环(控制)变量:for语句中,通过改变或判断某个变量的值来控制循环的执行。

for(i=1;i<=10;i++){printf("%d",i);}循环条件循环增量赋初值4.3.3

for语句81while和for的比较都是在循环前先判断条件表达式1;while(表达式2){循环体语句;

表达式3;}while语句改写成for语句for(表达式1;表达式2;表达式3)

循环体语句;4.3.3

for语句4.3.3

for语句【例4.16】用for语句编程求1+2+…+100的和。for语句实现ints=0;inti=1;while(i<=100){s=s+i;printf("s=%d",s);

i++;}while语句实现inti,s=0;for(i=1;i<=100;i++){

s=s+i;printf("s=%d",s);}

for语句格式紧凑、功能高度集中83①for语句中表达式1,表达式2,表达式3类型任意,都可省略,但分号;不可省。如果表达式2省略,即不判断循环条件,认为表达式2永远为真,循环会无休止的执行下去:for(i=1;;i++)s=s+i;②for语句是先判断后执行。

例如程序段

x=10;for(y=10;y!=x;++y)printf("%d",y);中的循环体不被执行。for语句的使用注意事项84③for循环的循环体可以是多条语句,这些语句必须放在一对花括号中。例如:

intx;doublez;for(x=100;x!=65;x-=5)

{

z=sqrt((double)x);printf("Thesquarerootof%d:%.2f\n",x,z);

}for语句的使用注意事项85④表达式1和表达式3可以是简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号隔开。例如,语句for(sum=0,i=1;i<=100;i++)

{

sum=sum+i;}for语句的使用注意事项⑤三个表达式的位置可以改变,但效果相同。

for(i=1;i<=5;i++)printf("%d",i);

i=1;for(;i<=5;i++)printf("%d",i);i=1;for(;i<=5;){printf("%d",i);

i++;

}i=1;for(;;){printf("%d",i);i++;if(i>5)break;}for语句的使用注意事项⑥注意防止出现“死循环”。例如intx=1;for(;x=10;x--)printf(“%d”,x);该程序会输出无数个“10”而不能正常终止。

for语句的使用注意事项881.三种循环语句均可以处理同一个问题,它们可以相互替代。2.for和while语句先判断循环控制,后执行循环体;do…while语句先执行循环体,后进行循环控制条件的判断。3.

for语句和while语句可能一次也不执行循环体,而

do…while语句至少执行一次循环体。三种循环语句的比较课堂练习1.设i,j,k均为int型变量,则执行完下面的for循环后,k的值为()。for(i=0,j=10;i<=j;i++,j--)k=i+j;A.12B.10C.11D.9B课堂练习1.以下程序的运行结果是()。#include<stdio.h>main(){inti,sum;for(i=1;i<=3;sum++){sum+=i;}printf("%d",sum);}A.6B.3C.死循环D.0Cbreak语句continue语句goto语句程序设计基础91914.3.4流程转向语句4.3.4流程转向语句#include<stdio.h>intmain(void){inti;for(i=1;i<=9;i++){printf("%d",i);}return0;}读程序123456789运行结果:4.3.4流程转向语句93intmain(void){inti;for(i=1;i<=9;i++){

if(i==5)break;printf("%d",i);}return0;}intmain(void){inti;for(i=1;i<=9;i++){

if(i==5)continue;printf("%d",i);}return0;}123412346789读程序4.3.4流程转向语句94一般形式:

[if(表达式)]break;1.break跳转语句功能:用在循环语句和switch语句中,终止并跳出循环体或开关语句。说明:break只能终止并跳出所在一层结构。break不能用于循环语句和switch语句之外的任何其它语句之中。4.3.4流程转向语句break语句适用的场合while(){......break;......}switch(){......

......}break;break;跳出switch结构跳出当前循环1.break跳转语句4.3.4流程转向语句intmain(void){inti;for(i=1;i<=9;i++){

if(i==5)break;printf("%d",i);}return0;}i1输出12243451234结果读程序34.3.4流程转向语句注意事项for(){while(){......break;......}......}跳出当前循环跳出多重循环4.3.4流程转向语句#include<stdio.h>main(){intsum=0;intn=1;for(;;){if(n>100)break;sum+=n;n++;}printf("%d\n",sum);}运行结果:5050【例4.18】break语句在循环中的应用。4.3.4流程转向语句99一般形式:

[if(表达式)]continue;功能:用在循环语句中,结束本次循环,继续进入下一次循环。2.continue语句while(){......continue;......}继续下一次循环4.3.4流程转向语句100intmain(void){inti;for(i=1;i<=9;i++){

if(i==5)continue;printf("%d",i);}return0;}读程序12346789i1输出12234345结果6699......4.3.4流程转向语句#include<stdio.h>main(){intsum=0,i,x;for(i=1;i<=10;i++){scanf("%d",&x);if(x>=0)continue;sum=sum+x;}printf("%d\n",sum);}运行结果:987-654-3218-9【例4.19】continue语句在循环中的应用。4.3.4流程转向语句3.goto语句一般形式:goto语句标号;语句标号:“标识符:”功能:使程序流程从goto语句转向“标号”所在的语句。4.3.4流程转向语句#include<stdio.h>main(){intsum=0,i=1;loop:if(i<=10)

//loop是语句标号的名称,它代表本语句在源程序中的位置{sum=sum+i;i++;gotoloop;

//无条件转往语句标号为loop的语句,loop后不能带:了}printf("%d\n",sum);}运行结果:55【例4.20】使用goto语句构造循环结构示例。【例】程序填空,不要改变与输入输出有关的语句。输入一个正整数m,如果它是素数,输出"YES",否则,输出"NO"(素数就是只能被1和自身整除的正整数,1不是素数,2是素数)。例:输入1输出NO(1不是素数)输入2输出YES(2是素数)输入9输出NO(9不是素数)

跳转语句的应用解决问题:输入一个正整数,判断它是否为素数。若m是素数,则输出“yes”,否则输出“no”。素数的定义:除了1和m,不能被其它数整除。(注意,1不是素数)m%2%3%4%5%(m-1)不是素数

||

=0=0是素数

&&!=0!=0

优化:

i取值[2,m-1]、[2,m/2]、[2,]

跳转语句的应用判断过程分析以判断13769是否是素数为例,讨论如何判断。尝试用2、3、4、5、……117去除m有两种可能情况:(1)尝试到某一个数i,能整除m,可得出结论m不是素数,提前结束尝试。(2)尝试完所有数,均不能整除m,则m是素数。

跳转语句的应用实现方法方法1:(1)k=sqrt(m);(2)尝试i=2…….k{if(m是i的倍数)

则m不是素数,结束循环;

}(3)如果整个循环结束(i>k),

if的条件都没有成立,则m是素数;否则,m不是素数;方法2:使用标志变量flag(1)flag=0;

//m被整除的标志,0表示没有整除,1表示整除

k=sqrt(m);(2)尝试i=2…….k{if(m是i的倍数)

则m不是素数,flag赋值为1,结束循环;

}(3)整个循环结束,如果flag==0,则m是素数,否则,m不是素数;如何实现循环多个出口?方法1:(1)k=sqrt(m);(2)尝试i=2…….k{if(m是i的倍数)

则m不是素数,结束循环;

}(3)如果整个循环结束(i>k),

if的条件都没有成立,则m是素数;否则,m不是素数;

判断素数主要代码k=sqrt(m);for(

温馨提示

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

评论

0/150

提交评论