Java程序设计教程第4版习题解答与实验指导第18章_第1页
Java程序设计教程第4版习题解答与实验指导第18章_第2页
Java程序设计教程第4版习题解答与实验指导第18章_第3页
Java程序设计教程第4版习题解答与实验指导第18章_第4页
Java程序设计教程第4版习题解答与实验指导第18章_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

Java程序设计好用教程

(第4版)

习题解答及试验指导

叶核亚编著

2019年11月

书目

“Java程序设计”课程教学要求.............................1

第1章Java概述...........................................4

第2章Java语言基础.......................................6

第3章类的封装、继承和多态..............................27

第4章接口、内部类和JavaAPI基础......................45

第5章异样处理..........................................51

第6章图形用户界面......................................53

第7章多线程............................................59

第8章输入/输出流和文件操作............................62

“Java程序设计”课程教学要求

1.课程性质、目的和任务

程序设计是高等学校计算机学科及电子信息学科各专业本科的核

心专业基础课程,是培育学生软件设计实力的重要课程。在计算机学

科的本科教学中,起着特别重要的作用。

"Java程序设计”是计算机科学及技术专业本科的专业基础限选

课,开设本课程的目的是:进行程序设计和面对对象方法的基础训练;

运用Java编程技术,设计解决操作系统、网络通信、数据库等多种

实际问题的应用程序。

本课程通过全面、系统地介绍Java语言的基础学问、运行机制、

多种编程方法和技术,使学生理解和驾驭面对对象的程序设计方法,

理解和驾驭网络程序的特点和设计方法,建立起坚固扎实的理论基

础,培育综合应用程序的设计实力。

本课程的先修课程包括:C/C++程序设计I、C/C++程序设计H、

数据结构、操作系统、计算机网络、数据库原理等。

2.教学基本要求

本课程的基本要求如下。

①了解Java语言特点,理解JavaApplication应用程序的运行

原理和方法。驾驭在JDK环境中编译和运行程序的操作,熟识在

MyEclipse集成开发环境中,编辑、编译、运行和调试程序的操作。

②驾驭Java语言中语句、数组、引用类型等基本语法成分的运

用方法,通过类、接口、内嵌类型、包、异样处理等机制表达和实现

面对对象程序设计思想。

③驾驭Java的多种好用技术,包括图形用户界面、多线程、文

件操作和流、运用URL和Socket进行网络通信等。

@熟识JavaJDBC数据库应用的设计方法。

⑤熟识基于JSP的Web应用设计方法。

重点:面对对象概念,图形用户界面,线程,流及文件操作,Socket

通信。

难点:继承和多态,线程同步,流及文件操作,Socket通信,JDBC,

JSPo

3.学时安排

本课程学时为64学时,其中讲课48学时,试验16学时。学时安

排见下表。

试合

章节(或内容)

验计

Java概述22

Java语言基础44

类的封装、继承和多态628

接口、内部类和JavaAPI

426

基础

异样处理22

图形用户界面628

多线程426

输入/输出流和文件操作628

网络通信628

数据库应用224

Web应用426

综合应用设计22

合计481664

4.试验教学目标及基本要求

"Java程序设计”是理论及实践相结合的课程,不仅要求学生驾

驭基础学问,理解基本原理,更要在实践环节中培育软件设计的基本

技能。实践性环节是巩固所学理论学问、积累程序设计阅历的必不行

少的重要环节,是提高程序设计实力和计算机操作技能的有力保障。

试验和课程设计等都是加强程序设计训练所必需的实践环节。

课程试验要求是,娴熟运用一种Java开发环境(如MyEclipse),

驾驭编译、运行和调试Java程序的操作,针对不同状况进行软件测

试,完善程序并提高程序性能。

试验类型有验证和设计两种。验证型试验的要求是,仿制已有例

题,验证面对对象程序设计的理论和方法,理解基本原理;设计型试

验的要求是,应用图形用户界面、线程、Applet,文件操作和流、网

第1章Java概述

本章教学内容及要求如下:

①了解Java语言特点,理解JavaApplication应用程序的运行

原理和方法,理解由Java虚拟机支持的程序运行机制。

②驾驭在JDK环境中编译和运行程序的操作,熟识在MyEclipse

集成开发环境中编辑、编译、运行和调试程序的操作。

重点:驾驭在JDK和MyEclipse环境中编译和运行Java

Application应用程序的操作。

1.1了解Java

1-1Java具有哪些适合在Internet环境中运行的特点?

【答】跨平台特性、完全面对对象和简洁性、牢靠性、平安性、

多线程、支持分布式网络应用等。

1-2什么是跨平台特性?Java怎样实现跨平台特性?

【答】跨平台特性是指一个应用程序能够运行于不同的操作系统

平台。Java采纳虚拟机技术支持跨平台特性,不同的操作系统上运行

不同版本的Java虚拟机。

1-3Java源程序文件编译后生成什么文件?程序的运行机制是怎

样的?

【答】Java将源程序文件(*.java)中的每个类编译生成一个字

节码文件(.class),由Java虚拟机说明执行字节码文件。

1-4Java应用程序有哪两种形式?它们的运行方式有什么不同?

【答】Java应用程序有两种:Application和Applet。

Application是能够独立运行的应用程序,有限制台和图形用户界

面两种运行方式。

Applet是可以嵌入Web页面的最小应用,它不能独立运行,必需

嵌入超文本(*.html)中,由阅读器中的Java说明器说明执行。

1.2JDK

1-5环境变量path和classpath的作用分别是什么?

【答】path供应可执行文件(.exe)的路径;classpath供应类

文件(.class)的路径。

1-6什么是包?为什么须要包机制?

【答】包(package)是类的集合。包是Java区分类名字空间的

机制。一个包中的多个类之间不能重名,不同包中的类名则可以相同。

【习1.1】为例L2的Line类增加以下方法:

publicdoublelength()//

返回直线长度

inta=start.x-end.x,b=start.y-end.y;

returnMath,sqrt(a*a+b*b);

//Math,sqrt(x)返回x的平方根

1-7Java对源程序文件中的声明语句及文件其命名规则有什么要

求?

【答】在一个Java源程序文件(*.java)中,可以运用package

语句声明包,运用import语句导入包,之后运用class或interface

声明多个类或接口。其中,声明为public权限的类或接口只能有一

个,且文件名必需及该类名相同。

1-8程序中的错误有哪几种?分别在什么时刻被发觉?

【答】语法错、语义错、逻辑错。编译时能够发觉语法错,运行

时能够发觉语义错,运行时不能发觉逻辑错。

第2章Java语言基础

本章教学内容及要求如下:

①驾驭Java语言的基本语法成分,包括标识符及关键字、数据

类型、运算符、表达式、变量声明等语言成分,驾驭分支、循环等流

程限制语句的语法和运用。特殊留意及C/C++的不同之处。

②驾驭数组类型的声明和动态内存申请,驾驭以基本数据类型和

类的两种方式声明和运用字符串。

③驾驭Java语言的方法声明和调用规则,驾驭基本类型和引用

类型作为方法参数和返回值的传递规则。

④驾驭MyEclipse程序调试技术。

重点:数组的引用模型;运用静态方法,引用类型作为方法的参

数和返回值。

难点:位运算,二进制;递归算法。MyEclipse程序调试技术。

2.1语言成分

1.数据类型、变量及运算

2-1Java语言的基本数据类型有哪些?引用数据类型有哪些?

【答】基本数据类型有:整数类型byte、short>int>long,浮

点数类型float、double,字符类型char,布尔类型boolean;引用

数据类型包括数组(array)、类(class)和接口(interface)。

2-2及C++语言相比,Java语言的变量和常量声明有什么差别?

【答】Java语言没有全局变量,(成员)局部变量含义及变量声明

格式及C++相同。

Java语言没有宏替换,运用最终变量概念代替C++中的常量和宏

替换。运用final关键字声明最终变量,只能赋值一次,这样既增加

了常量功能,又避开全局变量和宏替换的副作用。

2-3Java语言的运算分哪些类型?及C++语言相比,运算符及运

算含义有哪些变更?

【答】Java语言有算术运算、关系运算、位运算、逻辑运算、赋

值运算、强制类型转换、条件运算、括号运算、点运算、new、+字符

串连接运算和instanceof运算等,其中十字符串连接和instanceof

运算符是Java新增的,此外,放弃了C++的sizeof运算符。

及C++语言相比,Java语言的语法更为严谨,将-C++中某些简洁引

起混淆的语法做了修订,编译时也将严格进行检查。在Java语言中,

运算符及运算含义有变更的说明如下。

①没有赋值功能的表达式不能作为语句。例如:

inti=0;

i+1;〃编译错“无效

的赋值运算”

②逗号是分隔符,仅用于分隔表达式,不是运算符,不能出现在

表达式中。例如:

for(inti=0,j=0;i<n&&j<n;i++,j+[)//正

确,逗号是分隔符

intx=0,y=0;〃正确,逗号

是分隔符

System.out.printin(/,/z+(x=l,y=2));//编译

错,表达式不能包含逗号

x=l,y=2;//编译错,逗

号仅用于分隔表达式,不是运算符

x=l;y=2;〃正确

③Java语言增加boolean类型用于逻辑运算,其值不是0或1。

例如:

booleanb=0;〃编译错“不

能将int类型转换成boolean类型”

关系运算、逻辑运算和instanceof运算的结果都是boolean类型。

整数不能进行逻辑运算。

Java语言严格区分boolean及int类型,运算类型不能混淆。

boolean类型及整数类型或其他类型不能进行算术运算、关系运算、

逻辑运算。例如:

booleanb=false+0;〃编译错

"boolean类型及int类型不能进行+运算”

if、while等语句中的条件表达式不能是赋值运算,否则产生编译

错。

if(i=0)〃编译错,

i=0运算结臬是int类型,而不是boolean

while(i=0)//编译错

④字符串连接运算符(+)自动将其他类型变量值转换成字符串

类型。

2-整数运算的数据类型及数据溢出

2-4表达式(byte)127+(byte)127的运算结果是,其

数据类型是o

【答】254,int

K说明IJava的整数默认是int类型,byte类型只是形式上的,

取相应int值的最低1个字节。全部byte和short整数运算仍旧是

int类型运算,运算结果是int类型,当运算结果在byte数据范围内

时,也可视作byte类型。

2-5已知Integer.MAX_VALUE值为2147483647,表达式

Integer.MAX_VALUE+1的运算结果是0

【答】-2147483648,即0x80000000

K说明IInteger.MAX_VALUE值为0x7fffffff,

0x7fffffff+l=0x80000000,数据溢出。运算过程如图2.1所示。

图2.1int整数数据溢出

2-6设intmin=Integer.MIN_VALUE;,表达式min+min的运算结

果是o

【答】0

K说明1Integer.MIN_VALUE值为0x80000000,

0x80000000+0x80000000=0,数据溢出。

2・7设intmin=Integer.MIN_VALUE;,表达式(long)(min+min)

的运算结果是O

【答】0

K说明』Integer.MIN_VALUE值为0x80000000,

0x80000000+0x80000000=0,数据溢出。强制类型转换,只是把0强

制转换成long类型。

2-8设intmin=Integer.MINVALUE;,表达式

(long)min+(long)min的运算结果是。

【答】Oxffffffff00000000,或-4294967296。

K说明》Integer.MIN_VALUE值为0x80000000,先强制转换成long

类型,值为0xffffffff80000000,再作为long类型运算,数据不溢

出。

2-9设intmin=Integer.MIN_VALUE;longg=min+min;,则g的

值是。

【答】0

K说明1min+min作为int类型运算,数据溢出。

2-10设intmin=Integer.MINVALUE;longg=min;g+=min;,则

g的值是O-

【答】Oxffffffff00000000,或-4294967296。

K说明Ilongg=min;赋值将min自动扩容到long类型,再运算,

long数据不溢出。

3.整数位运算

2-11表达式125&10的值是,表达式125|10的值

是O

【答】8,127

K说明』int整数二进制位运算,运算过程如图2.2所示。

图2.2int整数二进制位运算

4.浮点数运算

2-12设doublex,将x按四舍五入方式强制转换成int类型的表

达式的是o

【答】(int)(x+0.5)

5.字符类型及运算

2-13Java语言的char字符类型及C/C++语言相比有什么差别?

【答】两者字符常量表示形式相同,都是用单引号将字符括起来

作为字符常量。

不同之处如下:

①C/C++语言的char类型表示ASCH字符,包括数字、字母、符

号等,字长为1字节,取值范围为0〜127;一个汉字用2字节表示。

②Java语言的char类型表示Unicode字符,包括ASCII字符和

汉字等,一个ASCH字符和汉字均占用2字节,取值范围为\u0000〜

\uFFFF(即0〜65535)。

2-14表达式’£+1的运算结果是,(char)('a'+l)

的运算结果是O

【答】98,'b'

K说明加har也是数值类型,可将char看成是2字节无符号整数,

范围是0〜65535。

1是int类型,4字节。'a'+1进行的是算术运算,操作数的数据

类型相容,结果取较长的int数据类型,'a'+1运算含义为将'a'的

ASCH码97加lo

(char)('a'+1)将98强制转换成char类型,结果为'b'。

2-15设charchl=108,ch2=73;,以下语句有什么错误?如何改

正?

chl=chl+ch2;

【答】编译错,不能将int转换成char。改正如下:

chl=(char)(chl+ch2);

K说明力及byte和short类型存储和运算原理相同,char也是以

int存储和运算的,在0〜65535范围内的整数可看成一个Unicode字

符的编码,因此能够以字符显示。两个char作为数值参与算术运算

时,仍旧是int类型运算,运算结果是int类型。所以,不能赋值给

char变量。

2.2流程限制语句

2-16Java语言的语句及C/C++语言有什么差别?

【答】Java语言语句的语法同C/C++语言,Java语言不支持goto

语句。

【习2.1]理解Java的字符类型。

①以下程序段输出ASCH码可打印字符表。

System,out.printin("ASCII码可打印字符(\\u0021〜

\\u007e)表〃);

for(charch=,\u002T;ch<=,\u007e,;ch++)

//输出ASCII码可打印字符手〃

{System.out.print(ch+〃〃);

if(ch%32==0)

System,out.printin();

程序运行结果如下:

ASCII码可打印字符(\u0021~\u007e)表

!〃#$%&'()*+,-./0123456789:;<

=>?@

ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]

八、

abcdefghijklmnopqrstuvwxyz{|}

②修改上述程序段的for语句表达式如下,输出Unicode汉字字

符表。

for(charch=,\u4e00,;ch〈二'\u9fa5';ch++)

//Unicode汉字字符表‘一'〜'畲第

③Unicode字符的取值范围是0〜65535(\u0000-\uffff),反

之,并不是0〜65535之中每个值都对应一个字符,标准输出语句输

出没有对应字符的编码时,输出结果是问号“?二例如,128没有对

应字符,以下欲输出编码为128的字符,输出结果是问号。

System,out.printin((char)128);

〃输出“?”

2-17指出下列程序段中的错误以及出错缘由。

ints=0;

for(inti=0;i<10;i++)

s+=i;

i++;

【答】最终一句产生编译错。变量i的作用域在for语句中,在

for语句之外则不能运用。

2.3数组

1.一维数组

2-18及C/C++的数组相比,Java的数组做了哪些改进?具有怎样

的优越性?

【答】①Java数组都是动态数组,在声明数组变量之后,运用

new运算符申请数组存储空间。

②供应length属性表示数组长度。

③Java的数组是引用数据类型,两个数组变量之间的赋值是引用

赋值,传递地址等引用特性,没有申请新的存储空间。

④Java将严格检查数组元素下标范围,程序运行时,假如a[i]

的下标i取值超出0〜a.length-l范围,则作为错误处理,产生“数

组下标越界”异样,程序运行终止。

⑤数组名不作指针运用。

2-19以下数组声明错误的是o

(A)int[]a;(B)inta[3];(C)inta[]={l,2,3);

(D)inta[]=newint[3];

【答】B

K说明工Java数组是动态数组,声明数组变量时不须要接线指定

数组长度,只有运用new运算符申请数组存储空间时才须要指定数组

长度。

2-20设inta[]=newint[5],b[]=a;执行语句b[0]=99;后,a

中各元素值为o

【答】{99,0,0,0,0}

K说明》Java的数组是引用数据类型,两个数组变量之间的赋值

是引用赋值,即两个数组变量引用同一个数组,修改其中某一元素将

同时变更另一数组变量的相应元素,如图2.3所示。

图2.3数组的引用模型

2.二维数组

2-21画出下列程序段表示mat存储结构示意图,并写出其中数据。

intn=5,k=l;

intmat口[]=newint[n][];

for(inti=0;i<n;i++)

{mat[i]=newint[n-i];

for(intj=0;j<n-i;j++)

mat[i][j]=k++;

【答】上三角形二维数组存储结构及初值如图2.4所示。

图2.4上三角形二维数组的存储结构

2.4静态方法

2-22Java类中的方法及C/C++中的函数有什么差别?

【答】①Java类中的方法都是类的成员方法,没有C/C++中的全

局函数。

②Java类的成员方法中,不能用*或&声明参数,方法体中不能用

static声明局部变量。

2-23Java方法的参数能够作为输出型参数吗?

【答】Java方法的参数传递原则及赋值原则相同,依据参数类型

不同分二种状况:

①基本数据类型参数是输入型参数,形式参数只能接收实际参数

赋值,形式参数变更后值不能作用于实际参数,可以声明返回值向实

际参数传递运算结果值。

②引用数据类型参数是输出型参数,形式参数接收实际参数的引

用赋值,即形式参数和实际参数引用同一个引用类型数据(数组或对

象),任何通过形式参数对引用数据的更改都将作用于实际参数。

【习2.2】下标和相等的数字方阵。

输出下列下标和相等的数字方阵(当n=4时)。

126712510

3581343611

49121498712

1011151616151413

本题目的:二维数组作为方法的参数或返回值。

【答】二维数组中,每一条斜线上各元素的下标和相等,算法描

述如图2.5所示。

图2.5下标和相等的数字方阵算法描述

方法声明如下,实现省略。

publicclassUpmat

〃输出下标和相等的数字方阵,n指定阶数,up指定方向,

返回二维数组

publicstaticint[][]upmat(intn,booleanup)

publicstaticint「]Hupmat(intn)

〃默认方向向上。方法重载

publicstaticvoidprint(intmat[][])

//输出二维数组,二维数组作为参数

2.5字符串

1.字符串概念

2-24Java的String字符串有哪些特点?比C/C++的字符数组有

哪些优越之处?

【答】①Java的字符串常量表示形式同C/C++,是由双引号括起

来的字符序列,其中可包含转义字符,如〃hello!〃、〃汉字\n〃、〃〃(空

串)等。字符串只能在同一行内,不能换行。

②Java的String字符串是一个类,属于引用数据类型。

java.lang.String类供应构造串对象、求串长length。、取字符

charAt(i)求子串substring()>推断相等equals(),比较大小

compareTo()等操作。compareTo()方法说明详见教材第4章

Comparable接口,更多方法说明详见教材附录E。

String类表示常量字符串,不供应插入、删除子串操作。

③String及一般类不同的是,具有某些基本数据类型的特性。

Java为String类重载了赋值和连接运算。例如:

Stringstr=〃abc〃;〃字符串变

量能够赋值为字符串常量

str=〃abc〃+〃xyz〃;//将两个字

符串首尾相接连起来,结果为〃abcxyz〃

str+=〃xyz〃;〃十=定义为字符

串变量在原串基础上连接另一个字符串

〃i=〃+10//Java自动将其他

类型值转换为字符串,结果为〃i=L0〃

@Java的字符串对象不是字符数组,所以,不能以数组下标格式

str[i]对指定位置的字符进行操作。例如,以下语句有语法错:

str[l]=,a);〃语法错误,没

有str[l]表示方式

⑤C/C++语言采纳字符数组表示字符串,以形式对字符串

str的第/个字符进行存取操作,并在库文件string,h中供应诸如

strlenO>strcpy()strcmp()>strcat()等函数实现字符串操作。

这种表示方式是不健壮、担心全的,它没有对数组所运用的存储空间

进行限制,也没有对数组下标进行越界检查,会产生更改字符串结束

符〃\0〃等错误,strcpy(char*strl,char*str2)函数甚至可以将一

个长字符串复制到一个短字符串的字符数组中,字符数组运用超出其

预定范围的存储空间,非法占用本不属于它的存储空间,导致随意更

改其他变量值等严峻错误,strcat(char*strl,char*str2)函数存

在同样问题。

2-25怎样将数值类型的数据转换成字符串?

【答】将数值及空串进行字符串连接运算,例如:

inti=123;

Strings=i+〃〃;〃字符串

连接运算,运算结果类型为String

2-26设char设=97;,表达式〃\〃(char)〃+(ch+O)+〃='〃+ch+〃'\”

的运算结果是o

【答】〃(char)97='a'"

K说明Ucharch=97,即charch='a';。

ch+O进行的是算术运算,操作数的数据类型相容,结果取较长的

数据类型,因此,当charch=97时,ch+O结果为int类型的97。其

后表达式各项进行字符串连接运算,得到结果。

Java不支持程序员对运算符重载功能。但Java自己将“+”运算

符重载为字符串连接运算,并且自动将其他类型转换成Stringo

重载是多态的一种形式,以下两个表达式都是“+”运算,依据操

作数类型的不同,能够区分所进行的不同运算:

ch+O〃整数加法运

算,运算结果类型为int

ch+〃〃〃字符串连接运

算,运算结果类型为String

2-27能否以s[i]格式读写JavaString字符串中的字符?为什

么?

【答】Java的字符串不是字符数组。Java没有供应s[i]格式表示

字符串中指定字符。缘由分析:假如Java重载口运算符供应s[i]格

式,则s[i]格式表示可读写,即可通过以下两种方式对字符串中指定

字符进行读取和质值用作,例如:

Strings二〃abc〃;

charch=s[0];〃读取串中

指定元素值

s[0]='x';〃写,对串中

指定元素赋值

而String类是常量字符串,只能读不能写字符。因此,String类

供应charAt⑴方法读取第i个字符,功能同读取s[i],而没有供应

写字符方法,java.lang.StringBuffer类有setCharAt(i,ch)方法设

置第i个字符为cho

通过声明方法对对象属性进行读写操作,符合类的封装概念,详

见教材第3章封装概念。

2-28怎样比较两个字符?怎样比较两个字符串?有几种比较字

符串的方法?

【答】char字符是基本数据类型,可以运用二和!二运算符比较是

否相等,也可运用也〉二、<、〈=运算符比较大小。

String字符串是类,供应equals(obj)方法推断是否相等,返回

boolean类型。供应compareTo(cobj)比较大小,返回int类型,当

返回0时,表示两者相等;当返回正数时,表示当前对象大;当返回

负数时,表示当前对象小,说明详见教材第4章Comparable接口。

2-29怎样将数值按指定格式转换成字符串?

【答】String声明如下静态方法format()返回指定格式的字符串:

publicstaticStringformat(Stringformat,Object...

args)〃返回format才旨定格式的字符电

其中,格式字符串format定义为:

机参数索弓1$][宽度][.精度]变换类型

〈变换类型〉取值有:b(boolean),c(字符)、C(字母大写)、

d(十进制整数)、o(八进制整数)、x(十六进制整数)、e(浮点数

指数形式)、f(浮点数小数形式)、s(字符串字母小写)、S(字符串

字母大写)。参数索引指定第几个参数,省略时为默认次序。当指定

宽度不足时,以实际宽度显示;可用变量指定宽度。例如:

String,format(z/%4d/z,1)〃结果为

“1”。宽度为4位,不足时,前补空格

String,format(z,%04dz,,1)〃结果为

“0001”。宽度不足4位时,前补0

String,format(z,%+4dz,,Integer.MIN_VALUE)〃结果为

“-2147483648”。+表示总显示正负号

〃当指定宽度不

足时,以实际宽度显示

String,format(〃%,d/z,Integer.MAXVALUE)〃结果为

“2,147,483,647”。以,逗号作千位分隔

String,format(〃Sum=l+...+%2$d=%l$d”,55,10)〃结果为

“Sum=1+..・+10=55”

String,format(〃%x〃,0177)//八进制整数

0177的十六进制形式为“7f”

String.format0x80000000)〃十六进制整数

0x80000000的八进制形式“20000000000”

String,format("%8x〃,127)〃十进制整数

127的十六进制形式为“7f”

String,format(〃%08x〃,255)〃十进制整数

255的十六进制形式为“OOOOOOff”

String,format(〃%08x〃,-1)〃十进制整数-1

的十六进制形式为^ffffffff"

String,format(,,%+08x,/,-1)〃运行错,抛出

异样,十六进制不支持正负号

String,format(〃%9.2f\1234.56789)//结果为

“1234.57”。以9位宽度2位小数表示浮点数

String,format(z/%ez,,1234.56789)〃结果为

“L234568e+03”,浮点数科学记数法格式

intn=10;

String,format("%"+n+〃c〃,'')〃返回长度

为n的空格字符串。用变量指定宽度

2.标准输入

2-30程序运行时有哪几种方式能够输入数据?怎样获得输入数

据?输入数据是什么类型?怎样获得输入数值数据?

【答】输入数据方式有多种:吩咐行参数、标准输入和图形用户

界面等。

①吩咐行参数

JDK和MyEclipse均供应吩咐行参数输入方式,操作吩咐详见教材

第1章。

程序通过main(Stringargs口)方法的args参数获得吩咐行参数

输入的以空格分隔的多个字符串,见教材第1章例1.1。

②标准输入

运用标准输入常量System,in调用InputStream字节输入流类的

read。方法获得从键盘输入的数据,要处理异样。异样和流的基本概

念详见教材第5、9章,例见教材例2.10和以下习2.7。

③图形用户界面

从图形用户界面的文本行等编辑组件中可获得输入数据,详见教

材第6章。

上述三种方式输入的数据都是String类型。假如要输入数值数据,

就先输入字符串,再将字符串转换成数值。

3.将数值字符串转换成相应数值

2-31怎样将数值字符串转换成其所表示的整数或浮点数数值?

【答】调用java.lang.Integer类的以下静态方法parselnt(s)

将字符串s转换成十进制整数。

publicstaticintparselnt(Strings)throws

NumberFormatException

调用java.lang.Double类的以下静态方法parseDouble(s)将字符

串S转换成浮点数值。

publicstaticdoubleparseDouble(Strings)throws

NumberFormatException

假如字符串不能转换成整数或浮点数,将抛出数值格式异样。详

见教材第4〜5章。

【习2.3]获得实数字符串表示的浮点数值。

本例实现java.lang.Double类中parseDouble(s)方法,从实数字

符串获得其表示的浮点数值。给出两种算法。

①由数字序列和运算符构造实数,语法如图2.6所示。

图2.6由数字序列和运算符构造实数的语法图

声明MyDouble类如下,其中parseDouble(String)方法由数字序

列和运算符构造实数c

publicclassMyDouble

〃返回实数字符串表示的浮点数值,由图2.6所示数字序

列和运算符语法构造实数

publicstaticdoubleparseDouble(Strings)

inti=0,sign=s.charAt(0)==,?-1:1;

//sign记住符号位

if(s.charAt(0)='+'||s.charAt(0)==,-’)

//跳过符号位

i++;

doublevalue=0,power=0.1;

//power表示底数为10的嘉

while(i<s.length()&&s.charAt(i)>=’O'&&

s.charAt(i)〈二'9')〃获得整数部分值…

value=value*10+s.charAt(i++)-'0';

if(i<s.iengthO&&s.charAt(i)二二)

//若是小数点

{i++;

while(i<s.IengthO&&s.charAt(i)>='O'&&

s.charAt(i)<=,9")〃获得小数部分宿,,

{value+=(s.charAt⑴-'O')*power;

i++;

power*=0.1;

value*=sign;

if(i<s.IengthO&&(s.charAt(i)==,E?|

s.charAt(i)==,e))〃处理阶码

{i++;

power=(s,charAt(i)二二'一')?0.1:10;

〃阶码的符号位确定指数的正负及其运算

if(s.charAt(i)==,||s.charAt(i)==,)

i++;

intexp=O;

while(i<s.lengthO&&s.charAt(i)>='O'&&

s.charAt(i)<='9')

exp=exp*10+s.charAt(i++)-'O';

〃获得指数的肯定值

for(intj=0;j<exp;j++)

value*二power;

returnvalue"

②由整数、数字序列和运餐符构造实数,语法如图2.8所示。

图2.7由整数、数字序列和运算符构造实数的语法图

在MyDouble类增加toDouble(String)方法如下,由整数、数字序

列和运算符构造实数。

〃返回实数字符串表示的浮点数值,由图2.8所示整数、数字

序列和运算符语法构造实数

publicstaticdoubletoDouble(Strings)

〃返回实数字符串表示的浮点数值

int]-s.indexOfC.'),k=s.indexOf('E');

〃找寻小数点和E

if(k==-l)

k=s.indexOf('e');

if(j==-l&&k==-l)

returnMylnteger.parselnt(s);

//s中没有小数和阶码部分,获得整数值返回

inti=0,sign=s.charAt(0)?-1:1;

//sign记住符号位

if(s.charAt(0)=二'||s.charAt(0)二二)

//跳过符号位

i++;

doublevalue=0,power=0.1;

//power表示底数为10的基

if(j!=-l)

//s中有小数部分...

{value=MyInteger,parselnt(s.substring(i,j));

//获得正整数部分值

j++;//

跳过小数点

while(j<s.length()&&s.charAt(j)〉二'O'&&

s.charAt(j)〈='9,)〃获得小数部分值

{value+=(s.charAt(j)0,)*power;

j++;

power*=0.1;

value*=sign;

if(k!=-l)

〃处理阶码

{if(j=T)

//s中没有小数部分

value=MyInteger.parselnt(s.substring(0,k));〃获得整数

部分值

k++;

power=(s.charAt(k)二二')?0.1:10;

〃阶码的符号位确定指数的正负及其运算

if(s.charAt(k)==,+,||s.charAt.(k)==,)

k++;

intexp=MyInteger.parselnt(s.substring(k));

〃获得指数部分的正整数值

for(j=0;j<exp;j++)

value*二power;

returnvalue;

程序运行结果如下:

parseDouble(〃-12345.67E-2〃)=-123.45670000000001,

toDouble(〃-12345E2")=-1234500.0

4.将二进制形式字符串数值字符串转换成相应数值整数

2-32怎样从二、八、十六进制字符串中读取整数值?

【答】调用java.lang.Integer类的以下方法parselnt(s,radix)

将字符串s转换成radix进制整数。

publicstaticintparselnt(Strings,intradix)throws

NumberFormatException

5.将整数转换成二、八或十六进制形式字符串

2-33怎样将整数转换成以二进制、八进制或十六进制形式字符

串?

【答】①String,format(Stringformat,Object...args)方法

返回format指定格式的字符串,〃%。〃、〃%x〃分别指定八进制、十六

进制整数格式。

②java.lang.Integer类声明以下方法,分别返回整数的二、八、

十六进制形式字符串。

publicstaticStringtoBinaryString(inti)

//将i转换成二进制字符串

publicstaticStringtoOctalString(inti)

//将i转换成八进制字符串

publicstaticStringtoHexString(inti)

//将i转换成十六进制字符串

上述方法返回的字符串不包括高位0。例如:

Integer.toBinaryString(128)

〃运算结果为10000000

【习2.4】整数的二进制问题探讨。

在教材例2.10声明的Mylnteger类中增加toBinaryString(int)

等方法,返回整数的二、八、十六进制形式字符串等功能。本例以下

分别探讨采纳“除2取余法”和位运算的算法设计问题。

⑴除2取余法

①转换成二进制字符串

2-34以下方法有什么错误?为什么?

publicstaticStringtoBinaryString(intvalue)

//返回正整数value的二进制字符串,除2取余法

Stringstr二〃〃;

while(value>0)〃除2取

余法,余数存入str字符串(逆序)

{str=value%2+str;

//value%2+str即(char)(value%2+'O')+str

value/=2;

returnstr;//返

回符串

【答】上述算法仅当value>0时正确;当valueWO时错误,返回

为了适用于负数,将上述算法修改如下。

2-35以下方法有什么错误?为什么?

publicstaticStringtoBinaryString(intvalue)

〃返回整数value的二进制字符串,除2取余法

if(value==0)

return〃0〃;

Stringstr二〃〃;

while(value!=0)//除2取

余法,余数存入str字符串(逆序)

{str=value%2+str;

value/=2;

returnstr,

【答】上述算法试卤将除2取余法功能扩展到0和负数,但算法

错误,因为负数采纳补码表示而不是原码。例如,当value-1时,

value%2=-l,str=〃T〃,value/2=0,循环执行一次,返回〃-1〃。而

〃-1〃的二进制字符串是〃1111111111111111iiiinir\

为了解决该问题,再修改算法如下。

2-36以下方法有什么错误?为什么?

publicstaticStringtoBinaryString(intvalue)

//返回整数value的二进制字符串,除2取余法

if(value==0)

return〃0〃;

Stringstr二〃〃;

while(value!=0)//除2

取余法,余数存入str字符串(逆序)

{str=(char)(value%2+'O')+str;

value/=2;

returnstr;

【答】上述算法错误,value=-l时,value%2结果为T,

(char)(value%2+'O')结果为'O'的前一字符),所以不行。

②转换成radix进制字符串,2WradixW16

2-37以下方法有什么错误?为什么?

〃返回正整数n的radix进制字符串,2<radixW16,采纳除

radix取余法

publicstaticStringtoString(intvalue,intradix)

Stringstr=,,z,;

while(value>0)//除

radix取余法,余数存入str字符串(逆序)

{intbit=value%radix;

str=(bit<=9?bit+'O':bit+'A'TO)+str;

value/-radix;

returnstr,

【答】应当运用以下语句将数字转换成字符,否则会将数字的

ASCH码转换成字符串。例如,将15转换成〃15〃而非〃F〃°

str=(char)(bit<=9?bit+'O':bit+'A'TO)+str;

上述算法的优点是radix可为随意正整数;缺点是仅当value>0

时执行,当valueWO时,返回

(2)位运算,转换成二进制字符串

①采纳字符串连接运算

以下声明toBinaryString(int)方法返回一个int对应的32位,

正数或0的高位以0填充。

算法采纳位运算,一个int整数即是一个由32位bit组成的无符

号整数,每次获得二进制的最高位,将其转换为数字字符,再依次连

接成字符串。算法如下。

publicstaticStringtoBinaryString(intvalue)

//返回整数value的二进制字符串。采纳位运算

Stringstr二〃〃;

for(inti=0x80000000;i!=0;1>»=1)//从

高位向低位逐位获得,每右移一位,高位补0

str十=(value&i)==0?'O':'1';〃获

得各位字符

returnstr,

该算法正确,但将靠0值算作1,该算法不具有扩展性,不适合8

和16进制。

修改算法如下,每次获得二进制的个位,将其转换为数字字符,

各位数字字符按反序连接成字符串。

publicstaticStringtoBinaryString(intvalue)//

返回整数value的二进制字符串

Stringstr=〃〃;

for(inti=0;i<32;i++)//循

环执行32次,高位补0,获得32个二进制位

{str=(value&1)+str;〃将各位余数字符

按反序连接成字符串。&运算符优先级低于+

value»>=l;//value右移

一位,高位以0填充,即value除以2

returnstr'

由于String是常量手符串,字符串连接运算须要重新申请数组空

间并复制原字符串,因此频繁调用字符串连接运算,效率很低。

②采纳字符数组

为了提高效率,采纳字符数组代替字符串连接运算,修改上述算

法如下:

publicstaticStringtoBinaryString(intvalue)

//返回整数value的二进制字符串

char[]buffer=newchar[32];//一

个int有32个二进制位

for(inti=buffer.length-1;i>=0;i一一)

//循环执行32次,高位补0

{buffer[i]=(char)((value&1)+'O');//

获得个位字符存入数组。&运算符优先级低于+

温馨提示

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

评论

0/150

提交评论