第三章 Java程序设计基础练习.docx
《第三章 Java程序设计基础练习.docx》由会员分享,可在线阅读,更多相关《第三章 Java程序设计基础练习.docx(16页珍藏版)》请在冰豆网上搜索。
第三章Java程序设计基础练习
第3章程序设计基础
本章试验的任务主要是理解和掌握Java中简单的输入输出处理,程序设计的三种基本结构(顺序、选择和循环)。
其目的是掌握这些语句块的语法及构成,以能够在实际应用中灵活地运用它们。
3.1实验一:
基本输入输出语句的应用
1.实验目的
1)正确使用已存在类的方法,从键盘上输入数据;
2)掌握数据的接收、转换并正确使用的方法。
2.实验要求
1)根据数据的输入和输出,编写程序;
2)编译运行程序,分析程序及执行结果。
3.实验内容
实验示例3.1.1从键盘上任意输入一个字母,判断是大写还是小写。
实现该示例的步骤如下:
(1)根据题意,确定所要使用的对象,从键盘上输入数据可以使用System类in对象的read()方法,该方法是从系统的标准设备上读取数据,可能会引发输入输出错误,因此系统要求在程序编码中应有抛出和处理IO错误的代码。
(2)程序参考代码如下:
/*这是一个简单的Java示例程序
*功能是从键盘上接收一个字符,判断该字符是否是字母
*程序的名字为Practice3_1_1.java
*/
importjava.io.*;
publicclassPractice3_1_1
{
publicstaticvoidmain(Stringargs[])throwsjava.io.IOException
{
charc1;//定义字符变量c1
booleanl1;//定义布尔变量l1
c1=(char)System.in.read();//从键盘上接收一个字节数据赋给c1
l1=c1>='A'&&c1<='Z'||c1>='a'&&c1<='z';//判断输入的是否字母
System.out.println("c1="+c1+"是字母吗?
"+l1+"!
");
}
}
(3)程序及执行结果分析
在程序中使用System.in.read()方法从键盘上输入获取数据,获取的数据是以输入字符ASCII码的整数表示,例如字符A的ASCII码为65,字符0的ASCII码为48等等。
要将它赋给字符变量,必须进行(char)强制转换。
使用了布尔值真(ture)、假(false)来表示是否字母。
实验示例3.1.2从键盘上两次输入同一个6位及6位以上的验证码,若两次输入一致则通过,否则没有通过。
实现该示例的步骤如下:
(1)根据题意,确定所要使用的对象,从键盘上输入一串字符,可以使用javax.swing类库中的JOptionPane类的showInputDialog()方法,该方法是从系统的标准设备上输入并获取字符串。
(2)程序参考代码如下:
/*这是一个简单的Java示例程序
*功能是从键盘上两次输入同一个字符串,若两次输入一致,
*则作为验证吗通过,否则没有通过.
*程序的名字为Practice3_1_2.java
*/
importjavax.swing.JOptionPane;
publicclassPractice3_1_2
{
publicstaticvoidmain(Stringargs[])
{
Stringcode1,code2;//定义两个字符串变量
booleanl1;//定义布尔变量l1
code1=JOptionPane.showInputDialog("请输入至少6位的验证码:
");
code2=JOptionPane.showInputDialog("再输入一次:
");
l1=code1.equals(code2);//比较字符串是否一样
System.out.println("验证通过了吗?
"+l1+"!
");
System.exit(0);
}
}
(3)程序及执行结果分析
在程序中涉及到了字符串的比较,它不同于单个字符的比较,在对两个字符串进行等于比较时,需要使用字符串对象的equals()方法,该方法返回布尔值。
程序的最后执行System.exit(0)方法结束程序执行。
一般来说,在字符界面下,程序执行完main()方法中的最后一个语句时,程序便自动结束了。
由于程序中使用了对话框,这是图形界面的操作,程序不能够自动结束,所以需要执行上述方法结束程序。
自由训练3.1仿照实验示例3.1.1编写程序,实现从键盘上输入一个字符,判断其是否数字字符。
自由训练3.2仿照实验示例3.1.2编写程序,实现从键盘上输入任意一个数字字串,将其转换为整数,并判断其是否是奇数,且能否被3除尽。
3.2实验二:
选择结构的应用
1.实验目的
1)正确理解各种选择结构(if、if~else~、switch)的语法构成及控制流程;
2)基本掌握选择结构程序设计的基本思想和方法。
2.实验要求
1)根据各种选择结构的实验题目,画出程序实现的处理流程;
2)根据程序实现的处理流程,编写程序;
3)编译运行程序,分析程序及执行结果。
3.实验内容
实验示例3.2.1编写程序,从键盘上输入任何一个字符,判断其是字母,数字还是其他字符。
实现该示例的基本步骤如下:
⑴为了正确有效地编写代码,先画出如图3-1所示的处理流程:
⑵根据流程编写并建立Java程序文件Practice3_2_1.java。
程序清单如下:
/*这是一个简单的Java示例程序
*功能是从键盘上接收一个字符,判断该字符是字母,数字还是其他字符
*程序的名字为Practice3_2_1.java
*/
importjava.io.*;
publicclassPractice3_2_1
{
publicstaticvoidmain(Stringargs[])throwsjava.io.IOException
{
charc1;//定义字符变量c1
c1=(char)System.in.read();//从键盘上接收一个字节数据赋给c1
if(c1>='A'&&c1<='Z'||c1>='a'&&c1<='z')System.out.println(c1+"是字母!
!
!
");
elseif(c1>='0'&&c1<='9')System.out.println(c1+"是数字字符!
!
!
");
elseSystem.out.println(c1+"是其他字符!
!
!
");
}
}
⑶程序及执行结果分析
在程序中,使用了示例3.1.1中输入数据的方式,以if多分支结构语句判断字符的归属并输出相应的结果。
实验示例3.2.2某商场根据售货员当月的营业额计算当月奖金,计算方法如下:
10万元以内(包括10万元),取销售额的1%;
15万元以内(包括15万元),10万元按10万以内计算,超出10万元的部分,取0.75%;
20万元以内(包括20万元),15万元按15万以内计算,超出15万元的部分,取0.5%;
20万元上,20万元按20万元以内计算,超出20万元的部分,取0.3%。
编写程序计算奖金。
⑴为了正确有效地编写代码,先画出如图3-3所示的处理流程:
⑵根据流程编写并建立Java程序文件Practice3_2_2.java。
程序清单如下:
/*这是一个简单的Java示例程序
*它的功能是计算奖金额
*程序的名字为Practice3_2_2.java
*/
importjavax.swing.*;
publicclassPractice3_2_2
{
publicstaticvoidmain(String[]args)
{
floatm1,j1;//定义营业额m1,奖金额j1
Stringsm1=JOptionPane.showInputDialog("请输入营业额(单位为万元):
");
m1=Float.parseFloat(sm1);//获得营业额
if(m1<=10f)j1=m1*0.01f;
elseif(m1<=15f)j1=10f*0.01f+(m1-10f)*0.0075f;
elseif(m1<=20f)j1=10f*0.01f+5f*0.0075f+(m1-15f)*0.005f;
elsej1=10f*0.01f+5f*0.0075f+5f*0.005f+(m1-20f)*0.003f;
System.out.println("营业额="+m1+"万元,应得奖金="+j1+"万元");
System.exit(0);//结束程序执行
}
}
⑶程序及执行结果分析
在程序中,我们仍然使用输入对话框来输入浮点数字串,然后使用Float类的parseFloat()方法将数字串转换为Float常数。
根据获得的营业额,按其多少分别计算相应的奖金额。
程序中使用了多分支的if结构语句进行判断处理。
请多次运行程序,分别输入不同的值,验证处理的正确性。
也许有人会问:
该问题能够使用简单的if分支结构语句解决吗吗?
回答是肯定的。
为了搞清楚if简单分支和多分支的区别和应用,把使用if单分支结构语句实现该示例作为一个自由训练作业留给大家。
实验示例3.2.3将实验示例3.2.2以switch结构方式实现。
实现该示例的基本步骤如下:
⑴处理流程如图3-2所示;
⑵根据流程编写并建立Java程序文件Practice3_2_3.java。
程序清单如下:
/*这是一个简单的Java示例程序
*它的功能是计算奖金额.以switch结构实现
*程序的名字为Practice3_2_3.java
*/
importjavax.swing.*;
publicclassPractice3_2_3
{
publicstaticvoidmain(String[]args)
{
floatm1,j1;//定义营业额m1,奖金额j1
Stringsm1=JOptionPane.showInputDialog("请输入营业额(单位为万元):
");
m1=Float.parseFloat(sm1);//获得营业额
intn=(int)(m1-0.0001)/5;
switch(n)
{
case0:
case1:
j1=m1*0.01f;
break;
case2:
j1=10f*0.01f+(m1-10f)*0.0075f;
break;
case3:
j1=10f*0.01f+5f*0.0075f+(m1-15f)*0.005f;
break;
default:
j1=10f*0.01f+5f*0.0075f+5f*0.005f+(m1-20f)*0.003f;
}
System.out.println("营业额="+m1+"万元,应得奖金="+j1+"万元");
System.exit(0);//结束程序执行
}
}
⑶程序及执行结果分析
该程序采用了switch结构进行处理,该结构的关键在于构造判断表达式,根据表达式的值进行相应的处理。
程序功能和上例是一样的,可以多次执行程序,分别输入不同的值以验证程序处理的正确性。
自由训练3.3编写程序:
以简单的if结构语句实现实验示例3.2.2。
自由训练3.4阅读下列程序:
/*这是一个简单的Java示例程序
*它的功能是计算奖金额.以switch结构实现
*程序的名字为Practice3_2_3.java
*/
importjavax.swing.*;
publicclassTest3_3
{
publicstaticvoidmain(String[]args)
{
floatm1,j1=0;//定义营业额m1,奖金额j1
Stringsm1=JOptionPane.showInputDialog("请输入营业额(单位为万元):
");
m1=Float.parseFloat(sm1);//获得营业额
System.out.print("营业额="+m1+"万元,");
intn=(int)(m1-0.0001)/5;
switch(n)
{
default:
j1+=(m1-20f)*0.003f;
m1=20;
case3:
j1+=(m1-15f)*0.005f;
m1=15;
case2:
j1+=(m1-10f)*0.0075f;
m1=10;
case1:
case0:
j1+=m1*0.01f;
}
System.out.println("应得奖金="+j1+"万元");
System.exit(0);//结束程序执行
}
}
该程序的目的是实现实验示例3.2.2的功能,输入并编译执行程序,执行的结果正确吗?
该实现方式和实验示例3.2.3有哪些区别?
通过上边示例的实验和自由训练,应该初步了解和掌握了选择结构基本的使用方法,选择结构在程序设计中是常用的,请大家认真总结并思考以下问题:
简单if分支结构语句、多分支结构语句与switch结构各有哪些特点?
它们分别适用于处理那些应用?
3.3实验三:
循环结构的应用
1.实验目的
1)正确理解各种循环结构(while、do~while、for)的语法构成及控制流程;
2)理解break、continue控制语句的意义,并正确使用它们;
3)基本掌握循环结构程序设计的基本思想和方法。
2.实验要求
1)根据各种循环结构的实验题目,画出程序实现的处理流程;
2)根据程序实现的处理流程,编写程序;
3)编译运行程序,分析程序及执行结果。
3.实验内容
实验示例3.3.1从键盘上输入n个字符,统计其中字母、数字和其它字符的个数。
可以参照实验示例3.2.1,在此示例的基础上稍作修改即可。
实现该示例的基本步骤如下:
⑴主要处理流程如图3-3所示;
⑵根据流程编写并建立Java程序文件Practice3_3_1.java。
程序清单如下:
*这是一个简单的Java示例程序
*功能是从键盘上接收n个字符,统计其中字母,数字和其他字符的个数
*程序的名字为Practice3_3_1.java
*/
importjava.io.*;
publicclassPractice3_3_1
{
publicstaticvoidmain(Stringargs[])throwsjava.io.IOException
{
charc1;//定义字符变量c1
intn=50,i,alphabet=0,digit=0,other=0;//定义所需变量
System.out.println("请连续输入"+n+"个字符,之后按回车键完成:
");
for(i=1;i<=n;i++)
{
c1=(char)System.in.read();//从键盘上接收一个字节数据赋给c1
if(c1>='A'&&c1<='Z'||c1>='a'&&c1<='z')alphabet++;
elseif(c1>='0'&&c1<='9')digit++;
elseother++;
}
System.out.println(n+"字符中,"+alphabet+"个字母,"+digit+"个数字字符,"+other+"个其他字符!
!
!
");
}
}
⑶程序及执行结果分析
在程序中使用了for循环结构,该结构是最常用的循环结构,一般用于确定重复次数(当然也可用于不确定次数)的循环。
在程序执行时,可以连续输入n个字符,然后按回车键完成输入,当然也可以输入一个或多个字符按回车键,如果输入不足n个字符,程序会继续等待输入字符,直到收到n个字符为止;如果输入多于n个字符,后边多余的字符将被丢弃。
程序一个个单独接收字符,根据分类分别计数统计,完成后输出统计结果。
实验示例3.3.2.查找、统计并输出100~1000之间的素数。
提示:
素数是只能被1和自身除尽的数,要判断一个数N是否是一个素数,只需看N是否能被2~N/2之间的任一个数除尽,如果有,则不是素数,否则是素数。
实现该示例的基本步骤如下:
⑴处理流程如图3-4所示;
⑵根据流程编写并建立Java程序文件Practice3_3_2.java。
程序清单如下:
参考程序一:
/*这是一个简单的Java示例程序
*它的功能是查找、统计并输出100~1000之间的素数
*程序的名字为Practice3_3_2.java
*/
publicclassPractice3_3_2
{
publicstaticvoidmain(String[]args)
{
intcount=0;
F1:
for(intN=101;N<=1000;N+=2)
{
for(inti=2;icount++;//素数个数计数
System.out.print(""+N);//输出素数
if(count%10==0)System.out.println();//一行输出10个后换行
}
System.out.println("\n100~1000内素数的个数为:
"+count);
}
}
参考程序二:
/*这是一个简单的Java示例程序
*它的功能是查找、统计并输出100~1000之间的素数
*程序的名字为Practice3_3_2_1.java
*/
publicclassPractice3_3_2_1
{
publicstaticvoidmain(String[]args)
{
intcount=0;
for(intN=101;N<=1000;N+=2)
{
inti=2;
for(;iif(i>=N/2)
{
count++;//素数个数计数
System.out.print(""+N);//输出素数
if(count%10==0)System.out.println();//一行输出10个后换行
}
}
System.out.println("\n100~1000内素数的个数为:
"+count);
}
}
⑶程序及执行结果分析
该实验示例提供了两个参考程序,都使用了双重循环,内层循环用于判断N是否是素数;外层循环逐个提供数据N,若N是素数,则输出并计数。
第一个参考程序在内循环体中判断N能否被2~N/2之间的数除尽,一旦遇到被除尽的数,则表明N不是素数,程序采用continue加标号的控制方式跳出内层循环并结束外层循环的本次循环,进入外层循环的下一次循环,计算判断下一个N是否为素数;若没有遇到被除尽的数,内层循环正常结束,表明N是一个素数,输出并计数。
第二个参考程序在内循环体的循环处理中,一旦遇到被除尽的数,则表明N不是素数,采用break的控制方式结束内层循环,然后依靠内循环的执行次数来判断N是否是素数,若内层循环控制变量i>=N/2,则表明内层循环正常结束,没有遇到被除尽的数,N是素数,输出并计数;否则,不是素数。
该示例的目的主要是加深对多重循环(循环嵌套)的认识,在多重循环中,内层循环变化最快,可以把它作为外层循环体的一个语句块来对待。
在示例的两个程序中分别使用了控制语句continue和break,并且使用了带语句标号的continue格式,它使得程序简洁、明了。
请大家认真阅读和理解这两个程序,注意控制语句的使用场合和使用方法。
实验示例3.3.3根据如下的计算公式计算其近似值,要求最后一项的绝对值小于10-5。
要求当前项
。
实现该示例的基本步骤如下:
⑴处理流程如图3-9所示;
⑵根据流程编写并建立Java程序文件,程序清单如下:
参考程序1:
/*这是一个简单的Java示例程序
*它的功能是计算输出级数的近似值
*程序的名字为Practice3_3_3.java
*/
publicclassPractice3_3_3
{
publicstaticvoidmain(String[]args)
{
doublen=2.0,p=1.0,sign=-1.0;
while(1.0/(n*n+1)>=1e-5)
{
p+=sign/(n*n+1);
sign=-sign;
n++;
}
System.out.println("p="+p);
}
}
参考程序2:
/*这是一个简单的Java示例程序
*它的功能是计算输出级数的近似值
*程序的名字为Practice3_3_3_1.java
*/
publicclassPractice3_3_3_1
{
publicstaticvoidmain(String[]args)
{
doublen=2.0,p=1.0,sign=-1.0;
do
{
p+=sign/(n*n+1);
sign=-sign;
n++;
}
while(1.0/(n*n+1)>=1e-5);
System.out.println("p="+p);
}
}
⑶程序及执行结果分析
该示例也提供了两个参考程序,分别采用了while和do~while循环结构,这种结构一般适用于不定次数的循环问题,选取循环条件是关键。
两种循环格式的区别是,do~while循环的特点是先执行后判断,所以循环至少被执行一次;而while循环是先判断而后执行,所以循环有可能一次也不被执行。
本例中使用了双精度浮点数进行处理,以获得较高的计算精度;在加入各项值时,由于是一正一负交替进行的,所以采用一个变量sign来处理:
sign=-sign,以达到所需的目的。
认真阅读程序,掌握各种循环结构的用法,完成下边的自由练习:
自由练习3.5阅读以下程序:
/*这是一个简单的Java示例程序
*它的功能是:
已知n!
=3628800,n=?
*程序的名字为Test3_5.java
*/
publicclassTest3_5
{
publicstaticvoidmain(String[]args)
{
longn=1,facorial=1;
do
{
n++;
facorial*=n;
}
while(facorial>=3628800);
System.out.println("n!
="+facorial+"n="+n);
}
}
输入、编译和执行程序,程序的执行结果对吗?
为什么?
找出原因并修改程序获得正确结果