第四章循环结构第一节for语句第二节while语句第三节do-while语句第四节循环嵌套第一节for语句一、语句格式格式1说明:语句1是for循环语句的循环体,它将在满足条件的情况下被重复执行。格式2说明:循环体部分由多个语句构成,应由一对花括号括起来,构成一个语句块的形式程序风格提示:写for循环语句时,循环体的语句相对于for缩进两格。第一节for语句•二、语句执行过程•for语句的执行过程可由以下4步来描述。•(1)执行“控制变量初始化语句”,使控制变量获得一个初值。•(2)判断控制变量是否满足“条件表达式”,若满足条件则执行一遍循环体,否则结束整个for语句,继续执行for循环下面的句子。•(3)根据增量表达式,计算出控制变量所得到的新值•(4)自动转到第(2)步。第一节for语句三、语句格式举例(1)将控制变量从1变到100,增量为1for(i=1;i=100;++i)(2)将控制变量从100变到1,增量为-1for(i=100;i=1;--i)(3)控制变量从7变到77,增量为7for(i=7;i=77;i+=7)(4)控制变量从20变到2,增量为-2for(inti=20;i=2;i-=2)(5)按所示数列改变控制变量值:99、88、77、66、55、44、33、22、11、0,增量为-11for(intj=99;j=0;j-=11)(6)控制变量i和j共同进行循环控制,i从1变到99,j从2变到100,增量均为2。for(inti=1,j=2;i=99&&j=100;i+=2,j+=2)需要说明的是:可以在for循环“控制变量初始化语句”中声明变量(如上面最后3个例子),这些变量只在for循环结构中有效,离开了该for结构,变量就无效了。第一节for语句例4.1输出1—100之间所有偶数。#includeiostreamusingnamespacestd;intmain(){for(inti=2;i=100;i+=2)couti;return0;}例4.2利用for循环,计算输出1+2+…+100的和#includeiostreamusingnamespacestd;intmain(){intsum=0;for(inti=1;i=100;++i)sum+=i;coutsum;return0;}第一节for语句例4.3利用for循环计算n!的值。分析:n!=1*2*3…*n#includecstdiousingnamespacestd;intmain(){longlongs;//Noip2010开始C++语言中longlong类型允许使用intn;//n不能定义为longlong,否则for语句死循环s=1;scanf(%d,&n);for(inti=1;i=n;++i)//若s定义为int,当n=13时s的值就溢出了s*=i;printf(%lld\n,s);//低版本也可用printf(%I64d\n,s)return0;}【说明】:当n=13时,s值超过了int类型的表示范围。还有一种比int更大的类型,称为longlong,它的表示范围是-263~263-1,比-1019~1019略窄,而我们一直使用的int范围是-231~231-1,只比-2*109~2*109略宽。输入输出longlong也可以借助于printf和scanf语句,但对应的占位符却是和平台与编译器相关的:在linux中,gcc很统一的用%lld;在windows中,MinGW的gcc和VC6可用%I64d;高版本编译器下windows可以使用%lld。第一节for语句例4.4利用for循环,分别计算1—100中奇数的和、偶数的和。#includeiostreamusingnamespacestd;intmain(){intjssum=0;intossum=0;for(intjs=1,os=2;js=99&&os=100;js+=2,os+=2){jssum+=js;ossum+=os;}coutthesumofoddnumbers1to100is:jssumendl;coutthesumofevennumbers1to100is:ossumendl;return0;}说明:我们也可以在for循环初始化或增值表达式部分中放一条以上的语句,中间用逗号隔开。【上机练习】•1.求平均年龄【1.5编程基础之循环控制01】•班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。•输入:•第一行有一个整数n(1=n=100),表示学生的人数。其后n行每行有1个整数,表示每个学生的年龄,取值为15到25。•输出:•输出一行,该行包含一个浮点数,为要求的平均年龄,保留到小数点后两位。•样例输入:•2•18•17•样例输出:•17.50【上机练习】•2.均值【1.5编程基础之循环控制02】•给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。•输入:•输入有两行,第一行包含一个整数n(n小于100),代表样本容量;第二行包含n个绝对值不超过1000的浮点数,代表各个样本数据。•输出:•输出一行,包含一个浮点数,表示均值,精确到小数点后4位。•样例输入:•2•1.03.0•样例输出:•2.0000【上机练习】•3.求整数的和与均值【1.5编程基础之循环控制03】•读入n(1=n=10000)个整数,求它们的和与均值。•输入:•输入第一行是一个整数n,表示有n个整数。•第2~n+1行每行包含1个整数。每个整数的绝对值均不超过10000。•输出:•输出一行,先输出和,再输出平均值(保留到小数点后5位),两个数间用单个空格分隔。•样例输入:•4•344•222•343•222•样例输出:•1131282.75000【上机练习】•4.最高的分数【1.5编程基础之循环控制04】•孙老师讲授的《计算概论》这门课期中考试刚刚结束,他想知道考试中取得的最高分数。因为人数比较多,他觉得这件事情交给计算机来做比较方便。你能帮孙老师解决这个问题吗?•输入:•输入两行,第一行为整数n(1=n100),表示参加这次考试的人数.第二行是这n个学生的成绩,相邻两个数之间用单个空格隔开。所有成绩均为0到100之间的整数。•输出:•输出一个整数,即最高的成绩。•样例输入:•5•8578909960•样例输出:•99【上机练习】•5.最大跨度值【1.5编程基础之循环控制05】•给定一个长度为n的非负整数序列,请计算序列的最大跨度值(最大跨度值=最大值减去最小值)。•输入:•一共2行,第一行为序列的个数n(1=n=1000),第二行为序列的n个不超过1000的非负整数,整数之间以一个空格分隔。•输出:•输出一行,表示序列的最大跨度值。•样例输入:•6•308759•样例输出:•9【上机练习】•6.奥运奖牌计数【1.5编程基础之循环控制06】•2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17)。现在要统计一下A国所获得的金、银、铜牌数目及总奖牌数。输入第1行是A国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目。输出4个整数,为A国所获得的金、银、铜牌总数及总奖牌数。•输入:•输入n+1行,第1行是A国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目,以一个空格分开。•输出:•输出1行,包括4个整数,为A国所获得的金、银、铜牌总数及总奖牌数,以一个空格分开。•样例输入:•3•103•310•030•样例输出:•44311【上机练习】•7.奇数求和【1.5编程基础之循环控制07】•计算非负整数m到n(包括m和n)之间的所有奇数的和,其中,m不大于n,且n不大于300。例如m=3,n=12,其和则为:3+5+7+9+11=35。•输入:•两个数m和n,两个数以一个空格分开,其中0=m=n=300。•输出:•输出一行,包含一个整数,表示m到n(包括m和n)之间的所有奇数的和•样例输入:•715•样例输出:•55【上机练习】•8.满足条件的数【1.5编程基础之循环控制08】•将正整数m和n之间(包括m和n)能被17整除的数累加,其中0mn1000。•输入:•一行,包含两个整数m和n,其间,以一个空格间隔。•输出:•输出一行,包行一个整数,表示累加的结果。•样例输入:•5085•样例输出:•204【上机练习】•9.整数的个数【1.5编程基础之循环控制09】•给定k(1k100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。•输入:•输入有两行:第一行包含一个正整数k,第二行包含k个正整数,每两个正整数用一个空格分开。•输出:•输出有三行,第一行为1出现的次数,,第二行为5出现的次数,第三行为10出现的次数。•样例输入:•5•158105•样例输出;•1•2•1【上机练习】•10.与指定数字相同的数的个数【1.5编程基础之循环控制10】•输出一个整数序列中与指定数字相同的数的个数。输入包含2行:第1行为N和m,表示整数序列的长度(N=100)和指定的数字;第2行为N个整数,整数之间以一个空格分开。输出为N个数中与m相同的数的个数。•输入:•第1行为N和m,表示整数序列的长度(N=100)和指定的数字,中间用一个空格分开;•第2行为N个整数,整数之间以一个空格分开。•输出:•输出为N个数中与m相同的数的个数。•样例输入:•32•232•样例输出:•2【上机练习】•11.乘方计算【1.5编程基础之循环控制11】•给出一个整数a和一个正整数n(-1000000=a=1000000,1=n=10000),求乘方a^n,即乘方结果。最终结果的绝对值不超过1000000。•输入:•一行,包含两个整数a和n。-1000000=a=1000000,1=n=10000。•输出:•一个整数,即乘方结果。题目保证最终结果的绝对值不超过1000000。•样例输入:•23•样例输出:•8【上机练习】•12.人口增长【1.5编程基础之循环控制12】•我国现有x亿人口,按照每年0.1%的增长速度,n年后将有多少人?保留小数点后四位。•输入:•一行,包含两个整数x和n,分别是人口基数和年数,以单个空格分隔。•输出:•输出最后的人口数,以亿为单位,保留到小数点后四位。1=x=100,1=n=100。•样例输入:•1310•样例输出:•13.1306【上机练习】•13.菲波那契数【1.5编程基础之循环控制13】•菲波那契数列是指这样的数列:数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数k,要求菲波那契数列中第k个数是多少。•输入:•输入一行,包含一个正整数k。(1=k=46)•输出:•输出一行,包含一个正整数,表示菲波那契数列中第k个数的大小•样例输入:•19•样例输出:•4181【上机练习】•14.鸡尾酒疗法【1.5编程基础之循环控制15】•鸡尾酒疗法,指“高效抗逆转录病毒治疗”。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾酒疗法更好,可用通过临床对照实验的方式进行。假设鸡尾酒疗法的有效率为x,新疗法的有效率为y,如果y-x大于5%,则效果更好,如果x-y大于5%,则效果更差,否则称为效果差不多。下面给出n组临床对照实验,其中第一组采用鸡尾酒疗法,其他n-1组为各种不同的改进疗法。请写程序判定各种改进疗法效果如何。•输入:•第一行为整数n(1n=20);其余n行每行两个整数,第一个整数是临床实验的总病例数(小于等于10000),第二个疗效有效的病例数。这n行数据中,第一行为鸡尾酒疗法的数据,其余各行为各种改进疗法的数据。•输出:•有n-1行输出,分别表示对应改进疗法的效果:如果效果更好,输出better;如果效果更差,输出wo