《高级语言程序设计》课件 第4章-程序控制的基本结构-10学时_第1页
《高级语言程序设计》课件 第4章-程序控制的基本结构-10学时_第2页
《高级语言程序设计》课件 第4章-程序控制的基本结构-10学时_第3页
《高级语言程序设计》课件 第4章-程序控制的基本结构-10学时_第4页
《高级语言程序设计》课件 第4章-程序控制的基本结构-10学时_第5页
已阅读5页,还剩212页未读 继续免费阅读

下载本文档

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

文档简介

第4章程序基本控制结构主要内容逻辑运算符与逻辑表达式选择控制结构条件表达式switch多分支语句分支程序设计小结主要内容循环控制语句程序跳转语句多重循环及其应用循环程序设计方法循环程序设计小结本章思维导图逻辑运算符

与逻辑表达式4.1&&——逻辑与,在两条件同时成立时才为真||——逻辑或,两个条件只要有一个成立时即为真!——逻辑非,即条件为真时结果为假,条件为假时结果为真4.1.1逻辑运算符aba&&ba||b!a!b真真真真假假真假假真假真假真假真真假假假假假真真例如,可以用逻辑表达式(x>10)&&(x<20)来表示x∈(10,20)。4.1.1逻辑运算符常用运算符的优先级!→算术运算→关系运算→&&→||→赋值运算4.1.1逻辑运算符例如:4.1.1逻辑运算符(x>10)&&(x<20)可简写为:x>10&&x<20a=x>y||!z等价为a=((x>y)||(!z))再如:C语言以非零表示逻辑“真”,以零表示逻辑“假”。在计算逻辑表达式时,若结果为“真”,则表达式的值为1,否则为0。4.1.2逻辑表达式例如:若intx=10;则x>8&&x<15的值为1;若intx=-9,y=3;

则表达式x&&y的值为

x||y的值为?!x&&y的值为?判断变量a是否为大写字母:a>='A'&&a<='Z'4.1.2逻辑表达式对形如a&&b的表达式,只有当a为真时才将a与b的值相与,否则,若a为假,则可直接得出a&&b的计算结果为逻辑假,表达式b未被执行。逻辑运算的短路条件例如:inta=10,b=11,c=12;则执行表达式(a>10&&b++&&--c)后,各变量的值是?4.1.2逻辑表达式对形如a||b的表达式,只有当a为假时才将a与b的值相或,否则,若a为真,则可直接得出a||b的结果为逻辑真,表达式b未被执行。逻辑运算的短路条件例如,inta=0,b=0,m=0,n=0;则执行表达式(m=a==b)||(n=b==a)时,各变量的值分别是多少?4.1.2逻辑表达式#include<stdio.h>intmain(){ inta=1,b=10,c=1,x,y; x=a&&b||++c; printf("x=%d,c=%d\n",x,c); y=!a&&--b||++c; printf("y=%d,b=%d,c=%d\n",y,b,c); return0;}x=1,c=1y=1,b=10,c=2【例4.1】写出下面程序的执行结果。闰年判断问题:某一年year是否是闰年的条件是满足下列二者之一:①能被4整除,但不能被100整除;②能被400整除。(year%4==0&&year%100!=0)||(year%400==0)可以用逻辑表达式表示如下:

从C99开始,C语言增加了专门的布尔类型bool,在stdbool.h文件中定义了常量true与false,分别代表逻辑真和逻辑假,这使得操作布尔值更加容易。

例如:boolflag;flag=10<20;执行后flag的值为true,

相应的!(flag)的值为false1.设a为整型变量,不能正确表达数学关系:10<a<15的C语言表达式是()。10<a<15a==11||a==12||a==13||a==14a>10&&a<15!(a<=10)&&!(a>=15)ABCD提交单选题5分2.能表达“30<x<50或x<-100”的C语言表达式是

[填空1]。作答填空题5分3.设inta=5,b=4,c=2;,则a>b>c的值为

[填空1]

。作答填空题5分4.设inta=0,b=0,c=2,d=4;,则执行(c=a==b)||(d=b==a);后变量d的值是

[填空1]

。作答填空题5分5.以下程序的输出结果是()。104103003004ABCD提交intmain(){inta=-1,b=4,k;k=(++a<=0)&&!(b--<=0);printf("%d%d%d\n",k,a,b);}单选题5分主要内容逻辑运算符与逻辑表达式选择控制结构条件表达式switch多分支语句分支程序设计小结选择控制结构4.2从键盘输入两个整数分别存入a与b,判断a是否小于b,若小于则将a与b的内容交换后输出,否则直接输出a与b的值。4.2选择控制结构if-elseSingleSelectionDoubleSelectionMultipleSelectionifif-else-if4.2.1if语句if单分支语句的一般格式为: if(条件)

语句;注意:后面不需要;号当多条语句受if条件控制时,应使用复合语句: if(条件)

{

语句1;

语句2;

语句3;

}4.2.1if语句例如,if(x>0)printf("y=1");printf("Over!");当x>0时,程序的输出结果为:y=1Over当x<=0时,程序的输出结果为:Over4.2.1if语句intmain(){inta,b,c;printf("Pleaseinput2integers,suchas2,5:");scanf("%d,%d",&a,&b);if(a<b)c=a;a=b;b=c;printf("a=%d,b=%d",a,b);return0;}是否有错?【例4.2】从键盘输入两个整数分别存入a与b,判断a是否小于b,若小于则将a与b的内容交换后输出,否则直接输出a与b的值。4_2_1.c流程intmain(){inta,b,c;printf("Pleaseinput2integers,suchas2,5:");scanf("%d,%d",&a,&b);if(a<b)

{c=a;a=b;b=c;

}printf("a=%d,b=%d",a,b);return0;}正确程序491622abc【例4.3】从键盘输入三个整数,将它们从小到大进行排序后再输出。491622abc【例4.3】从键盘输入三个整数,将它们从小到大进行排序后再输出。#include<stdio.h>intmain(){inta,b,c;intt;printf("Pleaseinput3integers(suchas501030):\n");scanf("%d%d%d",&a,&b,&c);printf("Beforesorting:\n");printf("a=%d,b=%d,c=%d\n",a,b,c);

if(a>b){t=a;a=b;b=t;//交换a与b的值}if(a>c){t=a;a=c;c=t;//交换a与c的值}

if(b>c){t=b;b=c;c=t;//交换b与c的值}printf("Aftersorting:\n");printf("a=%d,b=%d,c=%d\n",a,b,c);}6.执行下列语句后输出的结果是()。6,7,76,7,88,7,68,7,8ABCD提交inta=8,b=7,c=6;if(a<b)if(b>c){a=c;c=b;}printf("%d,%d,%d\n",a,b,c);单选题5分你心里默想一个小于50的两位数接着,我问你在以下的6张卡片中哪几张卡片里有你想的那个数?之后,我不费吹灰之力就能猜出这个数现在试一试【例4.4】模拟魔术师的猜数字游戏。0#卡片

1357911131517192123252729313335373941434547491#卡片

2367101114151819222326273031343538394243464750

2#卡片

456712131415202122232829303136373839444546473#卡片

89101112131415242526272829303140414243444546474#卡片

161718192021222324252627282930314849505#卡片

32333435363738394041424344454647484950如果你说

0#卡片

2#卡片

5#卡片

有你默想的数

我就猜出这个数是37

为什么呢?

2726252423222120

d7d6d5d4d3d2d1d0

di=0或1,i=0,1,…,7

7

s=∑di2i

i=0二进制数在存贮单元中的表示

2726252423222120

00100101

12821644

32816

s=32+4+1=37

原来如此

2726252423222120

d7d6d5d4d3d2d1d0

十进制数S化作二进制表示,如di

为1,则

i#卡片上就有S

2726252423222120卡片

d7d6d5d4d3d2d1d00#1#2#

1000000011200000010230000001

133400000

1004500000

10

1556000001

1

0667000001

1

1

777你的生日在0#卡片吗?135791113151719212325272931请输入NforNoandYforYes:n↙模仿【例4.4】编写一个猜生日程序你的生日在1#卡片吗?2367101114151819222326273031请输入NforNoandYforYes:n↙模仿【例4.4】编写一个猜生日程序你的生日在2#卡片吗?4567121314152021222328293031请输入NforNoandYforYes:y↙模仿【例4.4】编写一个猜生日程序你的生日在3#卡片吗?891011121314152425262728293031请输入NforNoandYforYes:y↙模仿【例4.4】编写一个猜生日程序你的生日在4#卡片吗?16171819202122232425262728293031请输入NforNoandYforYes:n↙你的生日是:12日模仿【例4.4】编写一个猜生日程序#include<stdio.h>intmain(){intdate=0;charanswer;printf(“你的生日在0#卡片吗?\n");printf("1357\n");printf("9111315\n");printf("17192123\n");printf("25272931\n");

printf("请输入NforNoandYforYes:");scanf("%c",&answer);if(answer=='Y'||answer=='y')

date=date+1;

printf("你的生日在1#卡片吗?\n");printf("2367\n");printf("10111415\n");printf("18192223\n");printf("26273031\n");

printf("请输入NforNoandYforYes:");scanf("%c",&answer);if(answer=='Y'||answer=='y')

date=date+2;printf("你的生日在2#卡片吗?\n");printf("4567\n");printf("12131415\n");printf("20212223\n");printf("28293031\n");

printf("请输入NforNoandYforYes:");scanf("%c",&answer);if(answer=='Y'||answer=='y')

date=date+4;printf("你的生日在3#卡片吗?\n");printf("891011\n");printf("12131415\n");printf("24252627\n");printf("28293031\n");

printf("请输入NforNoandYforYes:");scanf("%c",&answer);if(answer=='Y'||answer=='y')

date=date+8;

printf("你的生日在4#卡片吗?\n");printf("16171819\n");printf("20212223\n");printf("24252627\n");printf("28293031\n");

printf("请输入NforNoandYforYes:");scanf("%c",&answer);if(answer=='Y'||answer=='y')

date=date+16;printf("你的生日是:%d日\n",date);}4.2.2if双分支语句if双分支语句的一般格式为: if(条件)

语句1;else

语句2;例如,if(x>y)maxData=x; else maxData=y;实现的是将x与y中的更大者存入maxData。4.2.2if双分支语句#include<stdio.h>intmain(){unsignedintyear;//输入提示printf("Pleaseinputayear:");if(scanf("%u",&year)!=1){printf("Invalidinput!Pleaseenteravalidyear.\n");return1;//输入错误,退出程序}

【例4.5】编写一个程序,输入一个年份,判断该年是否为闰年,若是则输出该年是闰年,否则输出该年不是闰年的提示信息。if((year%4==0&&year%100!=0)||(year%400==0))printf("%uisaleapyear.\n",year);elseprintf("%uisnotaleapyear.\n",year);return0;}【例4.5】编写一个程序,输入一个年份,判断该年是否为闰年,若是则输出该年是闰年,否则输出该年不是闰年的提示信息。【例4.6】水仙花数是指一个三位整数且它的各位数立方之和等于该数本身,例如153是水仙花数(13+53+33=153)。编程从键盘输入一个三位的整数,判断该数是否为水仙花数。若是,则输出该数为水仙花数,否则输出该数不是水仙花数。#include<stdio.h>intmain(){intx,b0,b1,b2;printf("请输入一个整数:");scanf("%d",&x);b0=

; //求个位数b1=

; //求十位数b2=

; //求百位数

if(

)printf("%d是一个水仙花数\n",x);elseprintf("%d不是一个水仙花数\n",x);return0;}x%10x/10%10x/100b0*b0*b0+b1*b1*b1+b2*b2*b2==x#include<stdio.h>intmain(){intnumber,units,tens,hundreds;//输入提示printf("请输入一个3位整数:");if(scanf("%d",&number)!=1||number<100||number>999){printf("输入无效!请输入一个有效的3位整数。\n");return1;//输入错误,退出程序}units=

//求个位数tens=

//求十位数hundreds=

//求百位数number%10;number/10%10;number/100;if(units*units*units+tens*tens*tens+hundreds*hundreds*hundreds==number)printf("%d是一个水仙花数\n",number);elseprintf("%d不是一个水仙花数\n",number);return0;}4.2.3if多分支语句if多分支语句的一般格式为: if(条件1)

语句1;elseif(条件2)

语句2;elseif(条件3)

语句3;else…else与其上方的离其最近且尚未与其它else

匹配的if语句配对。if(x<0) y=-1;else

if(x==0) y=0;

else y=1;4.2.3if多分支语句【例4.7】某超市新店开张,举行促销活动,活动规则如下:(1)购物金额在100元以下,总价9.5折;(2)购物金额大于或等于100且小于200元的,总价9折;(3)购物金额大于或等于200且小于500元的,总价8.5折;(4)购物金额大于或等于500元的,总价8折。方法1:平行if语句实现方法2:嵌套if语句实现#include<stdio.h>intmain(){floattotal,payment,saving;printf("请输入购物总价:");scanf("%f",&total);

if(total<100)payment=total*0.95;if(total>=100&&total<200)payment=total*0.9;方法1:平行if语句实现

if(total>=200&&total<500)payment=total*0.85;if(total>=500)payment=total*0.8;saving=total-payment; //计算节省金额

printf("实付:%.2f元.\n",payment);printf("节约:%.2f元.\n",saving);return0;}#include<stdio.h>intmain(){floattotal,payment,saving;printf("请输入购物总价:");scanf("%f",&total);if(total<100)payment=total*0.95;

elseif(total<200) //此时,total必大于等于100payment=total*0.9;方法2:嵌套if语句实现

elseif(total<500)

//此时,total必大于或等于200payment=total*0.85;

else

//此时,total必大于或等于500payment=total*0.8;saving=total-payment;

printf("实付:%.2f元.\n",payment);printf("节约:%.2f元.\n",saving);return0;}对于互斥的分支判断条件,建议采用嵌套ifelse语句实现。【例4.8】【课后阅读】

编写程序输入一元二次方程ax2+bx+c=0的三个系数a、b、c,分情况计算并输出一元二次方程的根。函数名函数原型说明功能备注sindoublesin(doublex)计算sin(x)的值x为弧度cosdoublecos(doublex)计算cos(x)的值x为弧度sqrtdoublesqrt(doublex)计算x的平方根x>=0.0powdoublepow(doublex,doubley)计算幂指数xy

logdoublelog(doublex)计算loge(x)对数

log10doublelog10(doublex)计算log10(x)对数

fabsfabsdouble(doublex)计算x的绝对值

常用数学函数7.写出下面程序的运行结果

[填空1]

。作答#include<stdio.h>intmain(){inta,b,c,d;a=c=0;b=1;d=20;if(a)d=d-10;elseif(!b)if(!c)d=25;elsed=15; printf("d=%d\n",d);}填空题10分8.写出下面程序的运行结果

[填空1]

。作答#include<stdio.h>intmain(){inta=2,b=3,c=1;if(a>b)if(a>c) printf("%d\n",a);else printf("%d\n",b);printf("over!\n");}填空题10分9.下面的程序功能是判断输入的年份是否为闰年,请在横线上填上适当的语句。

[填空1]

[填空2]

作答intmain(){unsignedintyear;intleap;scanf("%u",&year);if((1))leap=1;elseleap=0;if((2))printf("%uisaleapyear.\n",year);elseprintf("%uisnotaleapyear.\n",year);}填空题20分主要内容逻辑运算符与逻辑表达式选择控制结构条件表达式switch多分支语句分支程序设计小结条件表达式4.34.3条件表达式表达式1表达式2表达式3?:真假表达式1例如:maxData=a>b?a:b;等价于if(a>b)maxData=a;elsemaxData=b;表达式2表达式3?:4.3条件表达式charc;c=getchar();printf("%c",c>='A'&&c<='Z'?c+32:c); 下面程序段的功能是什么?4.3条件表达式10.设intm1=5,m2=3;,表达式m1>m2?(m1=1):(m2=-1)运算后,m1和m2的值分别是()。1和−11和35和−15和3ABCD提交单选题5分主要内容逻辑运算符与逻辑表达式选择控制结构条件表达式switch多分支语句分支程序设计小结switch多分支语句4.44.4switch多分支语句Inputtwodata(suchas5,2.3):20.0,30.0↙[1]计算两个数的和并输出[2]计算两个数的差并输出[3]计算两个数的积并输出[4]计算两个数的商并输出请输入选项[]【例4.9】输入两个数,根据菜单选项进行计算。20.000000+30.000000=50.0000四种分支,易用ifelse多分支语句

实现1switch语句语法格式如下:switch(表达式){ case常量表达式1:

语句序列1 case常量表达式2:

语句序列2…case常量表达式n:

语句序列ndefault:语句}必须为int或char型只能是常量表达式4.4switch多分支语句分析左右两个程序的输出结果:23end2#include<stdio.h>intmain(){intc=2;switch(c){case1:printf("1");case2:printf("2");case3:printf("3");default:printf("end");}}#include<stdio.h>intmain(){intc=2;switch(c){case1:printf("1");break;case2:printf("2");break;case3:printf("3");break;default:printf("end");}}#include

<stdio.h>#include

<math.h>int

main(){

const

double

zero=1.0e-7;

double

x,y,result;

int

select;

printf("请输入两个数(例如5,2.3):"); if(scanf("%lf,%lf",&x,&y)!=2){ printf("输入无效!请输入两个有效的数。\n"); return1;//输入错误,退出程序};printf("[1]计算两个数的和并输出\n");printf("[2]计算两个数的差并输出\n");printf("[3]计算两个数的积并输出\n");printf("[4]计算两个数的商并输出\n");printf("请输入选项[]\b\b");scanf("%d",&select);

switch(select){case1:result=x+y;printf("%f+%f=%.4f\n",x,y,result);

break;case2:result=x-y;printf("%f-%f=%.4f\n",x,y,result);

break;case3:result=x*y;printf("%f*%f=%.4f\n",x,y,result);

break;case4:if(fabs(y)<zero)//判断除数是否为0printf("除数不能为0!\n");else{result=x/y;printf("%f/%f=%.4f\n",x,y,result);}

break;default:printf("选项输入错误!\n");}return0;}【例4.10】switch程序示例。(1)

分析该程序的运行情况(2)如果删除case‘N’:前面的break语句,在输入Y或y时,程序的输出结果是什么?若分支条件为非整型,可否使用switch语句?【例4.11】输入学生的考试分数score(0~100分),按以下分数段输出其对应的等级:score<60 不及格60≤score<70 及格70≤score<80 中80≤score<90 良90≤score≤100 优秀#include

<stdio.h>int

main(){

float

score;

int

grade;

printf("请输入一个分数:");if(scanf("%f",&score)!=1){ printf("输入无效!请输入有效的分数。\n"); return1;//输入错误,退出程序};

grade=(int)score/10; //将浮点型数据转换成整型表达式switch(grade){default:printf("分数输入有误\n");break;case0:case1:case2:case3:case4:case5:printf("不及格\n");break;case6:printf("及格\n");break;case7:printf("中等\n");break;

case8:printf("良好\n");break;

case9:case10:printf("优秀\n");break;}return0;}11.若有定义:floatx;inta,b;,则正确的switch语句是()。ABCD提交单选题5分12.写出下面程序的输出结果。

[填空1]

作答填空题10分主要内容逻辑运算符与逻辑表达式选择控制结构条件表达式switch多分支语句分支程序设计小结小结单分支:if双分支:ifelse多分支:ifelseifelseifelse…条件表达式:表达式1?表达式2:表达式3switch多分支语句循环控制结构4.5如何连续处理10位学生成绩的等级转换?4.5.1while循环语句执行过程执行过程在while(条件)后面不要跟‘;’条件循环体修改循环条件truefalse4.5.1while循环语句计数循环法修改例4.11,使其能处理10位学生成绩0countercounter<10输入第

个学生分数,并转换成相应等级并输出counter++;counter=0;12341234#include<stdio.h>intmain(){floatscore;intgrade;intcounter=0; //循环计数变量初始化

while(counter<10)

{printf("请输入一个分数:");if(scanf("%f",&score)!=1){ printf("输入无效!请输入有效的分数。\n"); return1;//输入错误,退出程序};grade=(int)score/10;//将分数转换成整型表达式switch(grade){default:printf("分数输入有误\n");break;case0:case1:case2:case3:case4:case5:printf("不及格\n");break;case6:printf("及格\n");break;case7:printf("中等\n");break;case8:printf("良好\n");break;case9:case10:printf("优秀\n");break;}

counter++;//循环计数器加1

}return0;}如果要处理60位学生成绩,如何修改?【例4.13】编写程序计算的值并出。i←1,sum←0i<=100sum←sum+ifalsetrueoutputsum1isum01<100 true122<100 true33<100 true36计数器每次增1使用了2个变量startendi++1015050#include<stdio.h>intmain(){intsum=0,i=1; //变量初始化while(i<=100){ sum=sum+i;

i++;} printf("sum=%d\n",sum); printf("i=%d\n",i);return0;}如果sum未被初始化为0,结果为怎样?#include<stdio.h>intmain(){intsum=0,i=1;while(i>0)sum=sum+i--; //循环体

printf("sum=%d\n",sum);printf("i=%d\n",i);return0;}倒计数实现循环控制方法小测试模仿上例从键盘输入5个数,求它们的和循环前未知循环次数,如何实现循环控制?标记法

事先设置一个标记变量用于控制循环条件,初始值为逻辑真,在循环过程中当满足一定条件时,将该标记变量设置为逻辑假,从而结束循环。【例4.14】模拟商场收银程序。请输入商品价格:12.7↙请输入商品价格:30.8↙请输入商品价格:89.99↙请输入商品价格:0↙应付:133.49付款:140↙找零:6.51#include<stdio.h>intmain(){doubleprice; //商品价格doubletotal=0; //应付款doublepayment; //付款doublechange; //找零intflag=1; //循环控制变量初始化为逻辑真while(1==flag) //循环输入商品价格

{printf("请输入商品价格:");scanf("%lf",&price); if(price<0.01)

flag=0;//修改循环控制变量elsetotal=total+price;

}

printf("应付:%.2f\n",total);printf("付款:"); //输入付款额

scanf("%lf",&payment);if(payment>=total) //计算找零{change=payment-total;printf("找零:%.2f\n",change);}elseprintf("付款不足!");return0;}如果要求在程序结束输出顾客一共购买了几件商品,如何实现?for(;;){}4.5.2for循环语句循环体表达式1表达式2表达式3仅执行1次循环条件修改循环计数变量表达式2循环体表达式3表达式1truefalse4.5.2for循环语句【例4.15】采用for循环编写程序计算的值并出。#include<stdio.h>intmain(){intsum=0,i;for(i=1;i<=100;i++){sum=sum+i;}printf("sum=%d\n",sum);printf("i=%d\n",i);return0;}#include<stdio.h>intmain(){intsum=0,i;for(i=1;i<=100;i++){sum=sum+i;}printf("sum=%d\n",sum);printf("i=%d\n",i);return0;};若在此增加了;号,程序运行的结果是什么?【例4.15】采用for循环编写程序计算的值并出。13.设inta;,则语句for(a=0;a==0;a++);和语句for(a=0;a=0;a++);执行循环体的次数分别是()。0,00,11,01,1ABCD提交单选题5分14.执行语句for(i=1;i++<4;);后i的值是()。345不确定ABCD提交单选题5分【例4.16】编写程序求的值并出。#include<stdio.h>intmain(){doublesum=0,term;inti;for(i=0;i<=100;i++){term=1/(1+5*i); //求数列的当前项sum+=term; //累加求和}printf("sum=%f\n",sum);return0;}修改下面程序中的错误!1.0/(1+5*i);分析term,sum变量的作用迭代法求数列的和数列ai数列ai+1term=1.0/(1+5*i);情况1:数列项可由循环变量直接计算得出数列ai数列ai+11,2,4,8,16,32,64…ai+1=2aiterm=term*2;情况2:数列项由前后项迭代产生迭代法求数列的和【例4.17】有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…,编写程序,输出这个数列前20项之和。a1=2/1 (i=1)ai+1=1+1/ai

(i≥2)term=1.0+1.0/term;已知值,当前项新项的值#include<stdio.h>intmain(){doublesum=0,term=2;inti;for(i=1;i<=20;i++){sum=sum+term;//将当前项加入求和变量term=1.0+1.0/term;//计算产生下一数列项}printf("sum=%f\n",sum);return0;}2/1,3/2,5/3,8/5,13/8,21/13…sum=0;term=2; for(i=1;i<=20;i++){sum=sum+term;term=1.0+1.0/term;}isumterm02123/227/25/33执行过程分析2/1,3/2,5/3,8/5,13/8,21/13…7/2+5/38/5intmain(){ doublesum,term; inti;

term=2; //数列第1项 sum=2; //初始值为数列第1项 for(i=1;

(1)

;i++) {

(2)

;

(3)

;}printf("sum=%f\n",sum);return0;}i<20term=1.0+1.0/termsum=sum+termterm和sum被初始化为数列第1项【例4.18】某大奖赛评分共有7位评委,记分规则为:按百分制记分,去掉一个最高分和一个最低分,再求平均分。试设计一个计分程序,输入7位评委的评分,计算输出选手的平均得分(精确到3位小数)。【分析】(1)循环7次一一输入每个评委的评分,同时累加求其和存入变量sum,并记下最高分maxScore和最低分minScore。(2)计算(sum-maxScore-minScore)/5,并输出结果。#include<stdio.h>#defineN7intmain(){doublescore,maxScore,minScore;inti;doublesum=0;

maxScore=0; //初始时最高分设为0

minScore=100; //初始时最低分设为100for(i=1;i<=N;i++){printf("请输入第%d个评委评分:",i);scanf("%lf",&score);if(score>maxScore) maxScore=score;if(score<minScore)minScore=score;sum+=score;}printf("去掉一个最高分:%.3f\n",maxScore);printf("去掉一个最低分:%.3f\n",minScore);printf("选手得分:%.3f\n",(sum-maxScore-minScore)

/(N-2));return0;}表达式1,表达式2,…,表达式n;例如,若有变量定义inta,b,c,d;则d=(a=10,b=a+2,c=b*3);的执行过程是:a=10;b=a+2;c=b*3;d=c;逗号表达式

借助逗号表达式,可以扩展for语句的第1个或第3个表达式的功能。例如,我们可以将上例中的以下三行maxScore=0; minScore=100; for(i=1;i<=N;i++)改为:for(maxScore=0,minScore=100,i=1;i<=N;i++)4.5.3dowhile循环语句循环体表达式do{}while(表达式);循环体truefalse一般用于至少需要执行一次的循环【例4.19】用公式求的近似值,直到最后一项的绝对值小于10-6为止,并统计一共迭代了多少项。本题至少要迭代一次,循环次数未知,可用dowhile循环来实现。【分析】定义pi存储数列的和定义term存储当前项定义flag存储当前项符号定义n表示当前项的分母pi=pi+flag*termterm=1.0/nflag=-flagn=n+2#include<stdio.h>intmain(){doublepi,term;longn=1,counter=0;intflag=1; //符号开关pi=0;do{ term=1.0/n; //求当前通项 pi+=flag*term; n+=2; //为下一次循环做准备 flag=-flag; //符号位取反 counter++; //迭代次数加1}while(term>1e-6);pi=pi*4;

printf("pi=%-10.6f\n",pi);printf("counter=%ld\n",counter);return0;}今后凡遇数列呈现一正一负变化规律的情况,可以借鉴本例的方法。15.写出下面程序的输出结果

[填空1]

。作答intmain(){ inta=0,b=5,c=3; while(c>0&&a<5) { b=b-1; ++a; c--; } printf("%d,%d,%d\n",a,b,c);}b=4a=1c=2b=3a=2c=1b=2a=3c=0填空题10分【例4.20】编写一个程序,输入一个小于或等于10的正整数n,计算n!并输出。【分析】根据数学定义n!=1*2*3…*n;编程时可以定义一个整型变量p,初始值为1,循环n-1次,分别将2~n依次与p相乘并将结果存入p中。#include<stdio.h>intmain(){longp;inti,n;

p=1;do{ printf("Inputaninteger(<=10):");scanf("%d",&n);}while(n<=0||n>10);//输入无效整数时重新输入for(i=2;i<=n;i++) //求n! p=p*i;printf("%d!=%ld\n",n,p);

return0;}如需求更大数的阶乘值,可将p的类型定义为longlongint型。小结while语句for语句dowhile语句计数法标记法16.华氏和摄氏温度的转换公式为:C=5/9*(F-32),其中

C表示摄氏的温度,F表示华氏的温度。下面的程序要求从华氏0度到华氏300度,每隔20度输出一个华氏温度对应的摄氏温度值,请在横线上填上适当的语句。#include<stdio.h>intmain(){ floatfahr=0,celsius; while(

(1)

<=300) {

(2)

; printf("%4.0f\t%6.1f\n",fahr,celsius);

(3)

; }}fahrcelsius=5.0/9*(fahr-32);fahr+=20;程序跳转语句4.64.6程序跳转语句break语句continue语句goto语句4.6.1break语句循环条件break;truefalse循环体语句循环体语句break语句的语法格式为:

break;通常break语句与条件语句一起使用:

if(条件)break;【例4.21】分析下面程序的输出结果。#include<stdio.h>intmain(){inti;for(i=1;i<=10;i++){printf("*");if(i>=5)break;printf("|");}printf("\ni=%d",i);return0;}*|*|*|*|*i=5【例4.22】从键盘输入一个数,判断该数是否为素数。素数,又称质数,指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数。把[2..n-1]的所有整数作除数,一旦发现某个因数,则可提前终止循环判断,可以确定n不是素数。若[2..n-1]之间的所有数均不能整除n,则n是素数。【例4.22】从键盘输入一个数,判断该数是否为素数。#include<stdio.h>intmain(){intn;inti;printf("Inputaninteger(>=2):");scanf("%d",&n);

for(i=2;i<n;i++)if(n%i==0)break; //提前结束循环【例4.22】从键盘输入一个数,判断该数是否为素数。if(i<n) printf("%disnotaprimenumber.\n",n);

温馨提示

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

评论

0/150

提交评论