实验4循环程序设计.docx
《实验4循环程序设计.docx》由会员分享,可在线阅读,更多相关《实验4循环程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
实验4循环程序设计
实验4 循环程序设计
4.1实验目的
(1)掌握三种循环语句的使用,能分析循环的执行过程;
(2)掌握break和continue语句的使用;
(3)了解如何利用求余和整除操作获取和删除一个整数的最低位;
(4)掌握累加、累乘的处理方法。
(5)掌握计数问题的编写技巧,如何控制每行输出元素个数。
4.2知识要点
循环就是反复执行一段代码,直到满足结束条件。
循环语句一般包括初始化、循环体、迭代和判断4部分。
4.2.1while循环与dowhile循环的使用差异
while语句的格式:
while(条件表达式){
循环体
}
特点是“先判断、后执行”,循环体有可能执行0次。
do…while循环的格式:
do
{
循环体
}while(条件表达式)
特点是“先执行,后判断”,循环体至少要执行1次。
建议:
在程序设计中尽量不用dowhile循环,而用while循环。
4.2.2for循环与while循环的对应关系
for(控制变量赋初值;循环条件;增值){
循环体
}
等价于:
控制变量赋初值;
While(循环条件){
循环体;
控制变量增值;
}
注意几点:
(1)for循环的执行过程是先做初始化,然后判断是否满足结束条件,若满足,则执行循环体,在执行完循环体后进行迭代增值。
(2)初始化部分和增值部分可以使用逗号语句执行多个操作;
(3)三部分均为空,写成for(;;)相当于一个无限循环。
4.2.3continue和break语句的作用
● continue---跳过之后的语句,继续下一轮循环;
● break---跳出直接所处循环。
● 带标号的continue可以回到标号指定的那级循环的下一轮执行。
● 带标号的break可以跳出标号指定的那级循环。
4.2.4常见问题处理
(1)累加问题的解决办法—累加变量的初值设置在循环外,通常赋0为初值;
(2)如何利用循环求阶乘—累乘,在循环外设置变量初值为1;
(3)如何控制每行的输出数据个数(计数问题);
(4)如何产生一定范围的随机整数。
Math.random()产生的数是0到1之间的小数,不包括0和1,要产生随机整数必须先放大再取整。
4.3样例程序
样例1:
输入一批学生成绩,以-1作为结束标记
(1)统计这批学生中,不及格、及格、中等、良好、优秀的人数。
(2)求这批学生的平均分。
【分析】根据要求不难看出这是一个计数和累加问题。
学生数量不确定,但有一个结束标记(-1),该问题从总体结构是一个循环处理问题,可采用while循环,当输入数据为-1时结束循环。
为了统计各种情况的人数,需要设立相应的计数变量,并给其赋初值0,另外为了求平均分,必须计算总分,也就是计算出所有学生成绩的累加和,然后除总人数即可得到平均。
【参考程序】
importjava.io.*;
publicclassScore{
publicstaticvoidmain(Stringargs[])throwsIOException{
ints=0,b=0,c=0,d=0,e=0,f=0; //变量赋初值
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
inta=Integer.parseInt(br.readLine()); //读取一个整数
while(a!
=-1){
s+=a; //累加
switch(a/10){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
b++;break;//计数增1
case 6:
c++;break;
case 7:
d++;break;
case 8:
e++;break;
case 9:
f++;break;
}
a=Integer.parseInt(br.readLine());
}
System.out.println("优秀人数:
"+f);
System.out.println("良好人数:
"+e);
System.out.println("中等人数:
"+d);
System.out.println("及格人数:
"+c);
System.out.println("不及格人数:
"+b);
intaverage=s/(b+c+d+e+f); //求平均成绩
System.out.println("平均分="+average);
}
}
【说明】程序流图见图4-1,程序总体结构上是一个循环问题,在循环内部要分情况统计各分数段人数,包含一个是switch语句。
在输入数据时未处理异常,所以在main方法的头部增加throwsIOException声明该方法会抛出IO异常。
【编程技巧】
(1)用while循环控制数据的录入和处理过程,-1作为循环的结束标记;注意循环体的最后要有输入数据的语句,以便得到新的处理数据。
(2)如何将各分数档按情况进行分别处理,掌握除10取整后得到数据的特征。
(3)记住累加和计数问题的处理技巧。
样例2:
找10~100之间能被3或5整除的数,每行输出5个数
【参考程序】
publicclassA{
publicstaticvoidmain(Stringarge[]){
intk=10; //循环控制变量,从10变化到100
intm=0; //用于统计输出数的个数
while(k<=100){ //循环的终值为100
if(k%3==0||k%5==0){ //被3或5整除
m++;
System.out.print(k+"\t");
if(m%5==0) //控制每隔5个输出数换一行
System.out.println();
}
k++; //循环控制变量增值
}
}
}
【说明】本程序是找出一定范围内(10~100)查找满足条件的数,这里有两个关键,一是如何表达一个数被3或5整除,用到求余运算符和逻辑或;二是为了控制每行输出5个数,必须对输出的数进行统计,因此,本程序的实质也要用到计数。
注意,print和println的差别。
【编程技巧】
(1)3或5整除的逻辑表达问题。
(2)如何控制一行输出5个数。
样例3:
编写一个程序从键盘输入10个整数,将最大、最小的整数找出来输出。
【参考程序】
importjava.io.*;
publicclassFind{
publicstaticvoidmain(Stringa[])throwsIOException{
intm=0,n=Integer.MAX_VALUE; //用m,n存放需求的最大、最小整数
BufferedReaderbr=
newBufferedReader(newInputStreamReader(System.in));
for(intk=1;k<=10;k++){
intx=Integer.parseInt(br.readLine());
if(x>m)m=x; //如果比最大的还大,那x成为最大的.
if(x }
System.out.println("最大整数="+m);
System.out.println("最小整数="+n);
}
}
【编程技巧】
(1)分别引入两个变量m,n用来保存所求的最大与最小数值。
在循环外为这两个变量假定一个值(为多大合适),然后在循环内将其他值与其比较。
也可以先假定第一个数据为最大、最小,然后将剩余数据与其比较。
(2)不要忘记将获取新数据的输入语句放在循环内。
(3)结束循环后输出结果。
样例4:
计算算式:
1+21+22+23+…+2n (注:
n由键盘输入)
【参考程序1】
publicclassTwoadd{
publicstaticvoidmain(Stringargs[]){
intn=Integer.parseInt(args[0]);
longsum=1;
for(intk=1;k<=n;k++){
sum=sum+(long)Math.pow(2,k);//用Math类的pow方法求2k
}
System.out.println("result="+sum);
}
}
【参考程序2】
publicclassTwoadd{
publicstaticvoidmain(Stringargs[]){
intn=Integer.parseInt(args[0]);//从命令行输入n
longsum=1; //保存累加和
longx=1; //被加项
for(intk=1;k<=n;k++){
x=x*2; //求下一个被加项时,只要在前一项的基础上乘2
sum=sum+x;
}
System.out.println("result="+sum);
}
}
【说明】“参考程序1”最直观,但“参考程序2”比“参考程序1”要好,利用Math.pow(2,k)求每个累加项花费的时间长,为了完成计算,在pow方法内要执行一段计算程序。
而“参考程序2”求累加项则是一个乘法运算,这里利用了前后两个累加项的变化特点。
甚至简单写成x=x+x形式的加法运算更快,但可读性不如x=x*2。
【编程技巧】
(1) 用循环组织累加,在循环外给累加变量赋初值,在循环内将累加项加到累加变量上;
(2) 分析累加项的变化规律,尤其是前后项之间的关系。
(3) 用Math类的pow方法求2的k次方,由于该方法返回为一个实数,所以要用强制转换为long型才能累加到sum上。
样例5:
从键盘输入一个长整数,求其各位数字之和。
【分析】这里的关键的如何得到各位数字,注意到得到一个整数的最低位数字可用除10求余数的办法,而要得到该整数的除最低位外的数只要用除10取整即可。
因此,利用循环即可将一个整数的所有各位数字取出。
【参考程序】
publicclass fang{
publicstaticvoidmain(Stringargs[]){
inta,m=0;
a=Integer.parseI