Java程序設(shè)計(jì)教程(清華第3版) 上機(jī)實(shí)踐_第1頁
Java程序設(shè)計(jì)教程(清華第3版) 上機(jī)實(shí)踐_第2頁
Java程序設(shè)計(jì)教程(清華第3版) 上機(jī)實(shí)踐_第3頁
Java程序設(shè)計(jì)教程(清華第3版) 上機(jī)實(shí)踐_第4頁
Java程序設(shè)計(jì)教程(清華第3版) 上機(jī)實(shí)踐_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java程序設(shè)計(jì)精編教程(第3版)上機(jī)實(shí)踐

1.7上機(jī)實(shí)踐

i.實(shí)驗(yàn)?zāi)康?/p>

本實(shí)驗(yàn)的目的是讓學(xué)生掌握開發(fā)Java應(yīng)用程序的三個(gè)步驟:編寫源文件、編譯源文件

和運(yùn)行應(yīng)用程序

2.實(shí)驗(yàn)要求

編寫一個(gè)簡(jiǎn)單的Java應(yīng)用程序,該程序在命令行窗口輸出兩行文字:“你好,很高興學(xué)

習(xí)Java"和"Wearestudents"

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

Hello.java

publicclassHello{

publicstaticvoidmain(Stringargs[]){

【代碼1】〃命令行窗口輸出”你好,很高興學(xué)習(xí)Java”

Studentzhang=newStudent();

zhang.speak();

)

)

classStudent{

voidspeak(){

【代碼2】〃命令行窗口輸出"Wearestudents"

2.8上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

熟悉Java應(yīng)用程序的基本結(jié)構(gòu),并能聯(lián)合編譯應(yīng)用程序所需要的類。

2.實(shí)驗(yàn)要求

編寫3個(gè)源文件:MainClass.java>A.java和B.java,每個(gè)源文件只有一個(gè)類。

MainClass.java含有應(yīng)用程序的主類(含有main方法),并使用了A和B。將3個(gè)源文件保

存到同一目錄中,例如c:\1000,然后編譯MainClass.java。程序運(yùn)行參考效果如圖2.8所示。

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

C:\1000>javacMainClass.jaua

MainClass.java

C:M000>javaMainClass

publicclassMainClass{你好,只需編譯我

IamA

publicstaticvoidmain(Stringargs[]){IamB

【代碼1】〃命令行窗口輸出”你好,只需編譯我”圖2.8只編譯主類

Aa=newA();

a.fA();

Bb=newB();

b.fB();

)

)

A.java

publicclassA{

voidfA(){

[代碼2]〃命令行窗口輸出"IamA"

)

)

B.java

publicclassB{

voidfB(){

[代碼3]〃命令行窗口輸出“IamB”

3.5上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

掌握從鍵盤為簡(jiǎn)單型變量輸入數(shù)據(jù)。掌握使用Scanner類創(chuàng)建一個(gè)對(duì)象,例如:

Scannerreader=newScanner(System.in);

學(xué)習(xí)讓reader對(duì)象調(diào)用下列方法讀取用戶在命令行(例如,MS-DOS窗口)輸入的各種簡(jiǎn)

單類型數(shù)據(jù):

nextBoolean();nextByte(),nextShort(),nextInt(),nextLong(),nextFloat(),nextDouble()o

在調(diào)試程序時(shí),體會(huì)上述方法都會(huì)堵塞,即程序等待用戶在命令行輸入數(shù)據(jù)回車確認(rèn)。

2.實(shí)驗(yàn)要求

D:\1000>javaInputData

編寫一個(gè)應(yīng)用程序,在主類的方法中聲

Javamain輸入產(chǎn)品數(shù)量(回車確認(rèn)):

明用于存放產(chǎn)品數(shù)量的int型變量amount和產(chǎn)品單價(jià)的46

輸入產(chǎn)品單價(jià)(回車確認(rèn)):

float型變量,以及存放全部產(chǎn)品總價(jià)值float型變量sumo

25.67

使用Scanner對(duì)象調(diào)用方法讓用戶從鍵盤為數(shù)量:46,單價(jià):25.67,總價(jià)值:1180.82

amount,price變量輸入值,然后程序計(jì)算出全部產(chǎn)品圖3.5從鍵盤輸入數(shù)據(jù)

總價(jià)值,并輸出amount,prince,sum的值。程序運(yùn)行

參考效果如圖3.5所示。

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

InputData.java

importjava.util.Scanner;

publicclassInputData{

publicstaticvoidmain(Stringargs[]){

Scannerreader=newScanner(System.in);

intamount=0;

floatprice=0,sum=0;

System.out.println("輸入產(chǎn)品數(shù)量(回車確認(rèn)):");

[代碼1]〃從鍵盤為amount賦值

System.out.println("輸入產(chǎn)品單價(jià)(回車確認(rèn)):”);

[代碼2]〃從鍵盤為price賦值

sum=price*amount;

System.outprintf("數(shù)量:%d,單價(jià):%5.2f,總價(jià)值:%5.2f',amount,price,sum);

4.8上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

本實(shí)驗(yàn)的目的是讓學(xué)生使用if~else分支和while循環(huán)語句解決問題。

2.實(shí)驗(yàn)要求

編寫一個(gè)Java應(yīng)用程序,在主類的main方法中實(shí)現(xiàn)下列功能:

?程序隨機(jī)分配給客戶一個(gè)1至100之間的整數(shù)。

?用戶輸入自己的猜測(cè)。

?程序返回提示信息,提示信息分別是:“猜大了”、“猜小了”和“猜對(duì)了”。

?用戶可根據(jù)提示信息再次輸入猜測(cè),直到提示信息是“猜對(duì)了”。

程序運(yùn)行參考效果如圖4.14所示。

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

GreekAlphabet』ava

給你一個(gè)1至10。之間的整數(shù),請(qǐng)猜測(cè)這個(gè)數(shù)

輸入您的猜測(cè):50

GuessNumber.java猜大了,再輸入你的猜測(cè):25

豬小了,再輸入你的猜測(cè):36

importjava.util.Scanner;猜大了,再輸入你的猜測(cè):30

猜大了,再輸入你的猜測(cè):27

猜大了,再輸入你的猜測(cè):26

importjava.util.Random;際對(duì)了!

圖4.14猜數(shù)字

publicclassGuessNumber{

publicstaticvoidmain(Stringargs[]){

Scannerreader=newScanner(System.in);

Randomrandom=newRandom();

System.out.println("給你一個(gè)1至100之間的整數(shù),請(qǐng)猜測(cè)這個(gè)數(shù))

intrealNumber=random.nextlnt(100)+1;//random.nextInt(100)^[0,100)一個(gè)隨機(jī)整數(shù)

intyourGuess=0;

System.out.print("輸入您的猜測(cè):");

yourGuess=reader.nextlnt();

while(【代碼1】)〃循環(huán)條件

if([代碼2])〃猜大了的條件代碼

System.out.print("猜大了,再輸入你的猜測(cè)

yourGuess=reader.nextlnt();

1

elseif(【代碼3])〃猜小了的條件代碼

(

System.out.print("猜小了,再輸入你的猜測(cè)

yourGuess=reader.nextlnt();

)

)

System.out.println。猜對(duì)了!)

5.14上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

類變量是與類相關(guān)聯(lián)的數(shù)據(jù)變量,而實(shí)例變量是僅僅和對(duì)象相關(guān)聯(lián)的數(shù)據(jù)變量。不同的

對(duì)象的實(shí)例變量將被分配不同的內(nèi)存空間,如果類中有類變量,那么所有對(duì)象的這個(gè)類變

量都分配給相同的一處內(nèi)存,改變其中一個(gè)對(duì)象的這個(gè)類變量會(huì)影響其它對(duì)象的這個(gè)類變

量。也就是說,對(duì)象共享類變量。類中的方法可以操作成員變量,當(dāng)對(duì)象調(diào)用方法時(shí),方

法中出現(xiàn)的成員變量就是指分配給該對(duì)象的變量,方法中出現(xiàn)的類變量也是該對(duì)象的變量,

只不過這個(gè)變量和所有的其他對(duì)象共享而已。實(shí)例方法可操作實(shí)例成員變量和靜態(tài)成員變

量,靜態(tài)方法只能操作靜態(tài)成員變量。

本實(shí)驗(yàn)的目的是讓學(xué)生掌握類變量與實(shí)例變量,以及類

森林中有200顆樹

方法與實(shí)例方法的區(qū)別。。趙莊植樹50顆

森林中有250顆樹

3家河字槐樹70顆

2.實(shí)驗(yàn)要求

森林中有180顆樹

編寫程序模擬兩個(gè)村莊共用擁有一片森林。編寫一個(gè)趙莊的人口:100

趙莊增加了12人

Village類,該類有一個(gè)靜態(tài)的int型成員變量treeAmount用趙莊的人口:112

百家河子的人口:150

于模擬森林中樹木的數(shù)量。在主類MainClass的main方法中馬家河子增加了1。人

馬家河字的入口:160

創(chuàng)建兩個(gè)村莊,一個(gè)存在改變了treeAmount的值,另一個(gè)村

圖5.26村莊共享森林

莊查看treeAmount的值。程序運(yùn)行參考效果如圖5.26所示。

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

Village.java

classVillage{

staticinttreeAmount;〃模擬森林中樹木的數(shù)量

intpeopleNumber;〃村莊的人數(shù)

Stringname;//村莊的名字

Village(Strings){

name=s;

voidtreePlanting(intn){

treeAmount=treeAmount+n;

System.out.println(name+"植樹”+n+”顆)

voidfellTree(intn){

if(treeAmount-n>=0){

treeAmount=treeAmount-n;

System.out.println(name+"伐樹"+n+"顆");

)

else{

System.out.println("無樹木可伐”);

)

)

staticintlookTreeAmount(){

returntreeAmount;

)

voidaddPeopleNumber(intn){

peopleNumber=peopleNumber+n;

System.out.println(name+"增力口了"+n+"人”);

)

)

MainClass.java

publicclassMainClass{

publicstaticvoidmain(Stringargs[]){

VillagezhaoZhuang,maJiaHeZhi;

zhaoZhuang=newVillage("趙莊)

maJiaHeZhi=newVillage("馬家河子”);

zhaoZhuang.peopleNumber=100;

maJiaHeZhi.peopleNumber=150;

【代碼1】〃用類名Village訪問treeAmount,并賦值200

intleftTree=Village.treeAmount;

System.out.println("森林中有,'+leftTree+n顆樹”);

[代碼2]//zhaoZhuang調(diào)用treePlanting(intn),并向參數(shù)傳值50

leftTree=[代碼3]//maJiaHeZhi調(diào)用lookTreeAmount。方法得到樹木的數(shù)量

System.out.println("森林中有"+leftTree+"顆樹");

[代碼4]maJiaHeZhi調(diào)用fellTree(intn),并向參數(shù)傳值70

leftTree=Village.lookTreeAmount();

System.out.println("森林中有"+leftTree+"顆樹)

System.out.println("趙莊的人口:'*+zhaoZhuang.peopleNumber);

zhaoZhuang.addPeopleNumber(12);

System.out.println("趙莊的人口:"+zhaoZhuang.peopleNumber);

System.out.println("馬家河子的人□:"+maJiaHeZhi.peopleNumber);

maJiaHeZhi.addPeopleNumber(10);

System.out.println("馬家河子的人n:"+maJiaHeZhi.peopleNumber);

6.11上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

上轉(zhuǎn)型對(duì)象可以訪問子類繼承或隱藏的成員變量,也可以調(diào)用子類繼承的方法或子類

重寫的實(shí)例方法。上轉(zhuǎn)型對(duì)象操作子類繼承的方法或子類重寫的實(shí)例方法,其作用等價(jià)于

子類對(duì)象去調(diào)用這些方法。因此,如果子類重寫了父類的某個(gè)實(shí)例方法后,當(dāng)對(duì)象的上轉(zhuǎn)

型對(duì)象調(diào)用這個(gè)實(shí)例方法時(shí)一定是調(diào)用了子類重寫的實(shí)例方法。本實(shí)驗(yàn)的目的是讓學(xué)生掌

握上轉(zhuǎn)型對(duì)象的使用,理解不同對(duì)象的上轉(zhuǎn)型對(duì)象調(diào)用同一方法可能產(chǎn)生不同的行為,即

理解上轉(zhuǎn)型對(duì)象在調(diào)用方法時(shí)可能具有多種形態(tài)(多態(tài))。

2.實(shí)驗(yàn)要求

(1)編寫一個(gè)abstract類,類名為Geometry,該類有一個(gè)abstract方法:

publicabstractgetAreaQ;

(2)編寫Geometry的若干個(gè)子類,比如Circle子類和Rect子類。

(3)編寫Student類,該類定義一個(gè)publicdoublearea(Geometry...p)方法,該方法的參

數(shù)是可變參數(shù)(有關(guān)知識(shí)點(diǎn)見5.13),即參數(shù)的個(gè)數(shù)不確定,但類型都是Geometry。該方法

返回參數(shù)計(jì)算的面積之和。

(4)在主類MainClass的main方法中創(chuàng)建一個(gè)Student對(duì)象,讓該對(duì)象調(diào)用publicdouble

area(Geometry...p)計(jì)算若干個(gè)矩形和若干個(gè)圓的面積之和。程序運(yùn)行參考效果如圖6.14所

zj\O

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

Geometry.java2個(gè)圓和1不矩形圖形的面積和:

publicabstractclassGeometry{

publicabstractdoublegetArea();圖6.14計(jì)算面積和

}

Rectjava

publicclassRectextendsGeometry{

doublea,b;

Rect(doublea,doubleb){

this.a=a;

this.b=b;

)

【代碼1】〃重寫getArea()方法,返回矩形面積

)

Circle.java

publicclassCircleextendsGeometry{

doubler;

Circle(doubler){

this.r=r;

1

【代碼2】〃重寫getArea。方法,返回圓面積

1

Student.java

publicclassStudent{

publicdoublearea(Geometry...p){

doublesum=0;

for(inti=O;i<p.length;i++){

sum=sum+p[i].getArea();

)

returnsum;

)

1

MainClass.java

publicclassE{

publicstaticvoidmain(Stringargs[]){

Studentzhang二newStudent();

doublearea二

zhang.area(newRect(2,3),newCircle(5.2),newCircle(12));

System.out.printf("2個(gè)圓和1個(gè)矩形圖形的面積和:\n%10.3f,,area);

7.10上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

接口回調(diào)是多態(tài)的另一種體現(xiàn),接口回調(diào)是指:可以把使用某一接口的類創(chuàng)建的對(duì)象的

引用賦給該接口聲明的接口變量中,那么該接口變量就可以調(diào)用被類實(shí)現(xiàn)的接口中的方法,

當(dāng)接口變量調(diào)用被類實(shí)現(xiàn)的接口中的方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用接口的方法,這一

過程稱為對(duì)象功能的接口回調(diào)。所謂面向接口編程,是指當(dāng)設(shè)計(jì)某種重要的類時(shí),不讓該

類面向具體的類,而是面向接口,即所設(shè)計(jì)類中的重要數(shù)據(jù)是接口聲明的變量,而不是具

體類聲明的對(duì)象。本實(shí)驗(yàn)的目的是讓學(xué)生掌握接口回調(diào)和面向接口編程思想。

2.實(shí)驗(yàn)要求

小狗在不同環(huán)境條件下可能曾現(xiàn)不同的狀態(tài),小狗通過調(diào)用cry()方法體現(xiàn)自己的當(dāng)

前的狀態(tài)。要求用接口封裝小狗的狀態(tài)。具體要求如下。

(1)編寫一個(gè)接口DogState,該接口有一個(gè)名字為voidshowState。的方法。

(2)編寫Dog類,該類中有一個(gè)DogState接口聲明的變量state。另外,該類有一個(gè)

cry()方法,在該方法中讓接口state回調(diào)showState。方法。即Dog對(duì)象通過cry()方法來體現(xiàn)

自己目前的狀態(tài)。

(3)編寫若干個(gè)實(shí)現(xiàn)DogState接口的類,負(fù)責(zé)刻畫小狗的各種狀態(tài)。

(4)編寫主類,在主類中用Dog創(chuàng)建小狗,并讓小狗調(diào)用cry方法體現(xiàn)自己的狀態(tài)。

程序運(yùn)行參考效果如圖7.12所示。

3.程序模板

在主人面前,聽主人的命令

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

遇到敵人狂叫,并沖向去很咬敵人

CheckDogState.java遇到朋友晃動(dòng)尾巴,表示歡迎

interfaceDogState{圖7.12小狗的狀態(tài)

publicvoidshowState();

classSoftlyStateimplementsDogState{

【代碼1】〃重寫publicvoidshowStateQ

classMeetEnemyStateimplementsDogState{

[代碼2]〃重寫publicvoidshowState()

)

classMeetFriendStateimplementsDogState{

[代碼3]〃重寫publicvoidshowState()

)

classDog{

DogStatestate;

publicvoidcry(){

state,showState();

1

publicvoidsetState(DogStates){

state=s;

1

)

publicclassE{

publicstaticvoidmain(Stringargs[]){

DogyellowDog=newDog();

yellowDog.setState(newSoftlyState());

yellowDog.cry();

yellowDog.setState(newMeetEnemyState());

yellowDog.cryO;

yellowDog.setState(newMeetFriendState());

yellowDog.cry();

)

8.5上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

Java使用try~catch語句來處理異常,將可能出現(xiàn)的異常操作放在try-catch語句的try

部分,一旦try部分拋出異常對(duì)象,比如調(diào)用某個(gè)拋出異常的方法拋出了異常對(duì)象,那么,

try部分將立刻結(jié)束執(zhí)行,而轉(zhuǎn)向執(zhí)行相應(yīng)的catch部分。本實(shí)驗(yàn)的目的是讓學(xué)生掌握使用

try~catch語句。

2.實(shí)驗(yàn)要求

車站檢查危險(xiǎn)品的設(shè)備,如果發(fā)現(xiàn)危險(xiǎn)品會(huì)發(fā)出警告。編程模擬設(shè)備發(fā)現(xiàn)危險(xiǎn)品。

(1)編寫一個(gè)一個(gè)Exception的子類DangerException,該子類可以創(chuàng)建異常對(duì)象,該

異常對(duì)象調(diào)用toShow()方法輸出:”屬于危險(xiǎn)品"。

(2)編寫一個(gè)Machine類,該類的方法checkBag(Goodsgoods)當(dāng)發(fā)現(xiàn)參數(shù)goods是危

險(xiǎn)品時(shí)(即goods的isDanger屬性的值是true時(shí))將拋出DangerException異常。

(3)程序在主類的main方法中的try~catch語句的try部分讓Machine類的實(shí)例調(diào)用

checkBag(Goodsgoods)方法,一旦發(fā)現(xiàn)危險(xiǎn)品,就在try-catch語句的catch部分處理危險(xiǎn)品。

程序運(yùn)行參考效果如圖8.8所示。

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

Check.java危險(xiǎn)品!炸藥被禁止!

蘋果檢查通過

classGoods{

booleanisDanger;圖8.8檢查危險(xiǎn)品

Stringname;

Goods(Stringname){

=name;

publicvoidsetIsDanger(booleanboo){

isDanger=boo;

publicbooleanisDanger(){

returnisDanger;

publicStringgetName(){

returnname;

classDangerExceptionextendsException{

Stringmessage;

publicDangerExceptionQ{

message="危險(xiǎn)品!";

publicvoidtoShow(){

System.out.print(message+"");

)

)

classMachine{

publicvoidcheckBag(Goodsgoods)throwsDangerException{

if(goods.isDanger()){

DangerExceptiondanger=newDangerException();

[代碼1]〃拋出danger

)

)

)

publicclassCheck{

publicstaticvoidmain(Stringargs[]){

Machinemachine二newMachine();

Goodsapple=newGoods("蘋果)

apple.setlsDanger(false);

Goodsexplosive二newGoods,炸藥");

explosive.setlsDanger(true);

try(

machine.checkBag(explosive);

System.out.println(explosive.getName()+”檢查通過)

1

catch(DangerExceptione){

【代碼2】//e調(diào)用toShow()方法

System.out.println(explosive.getName()+"被禁止!”);

)

try(

machine.checkBag(apple);

System.out.println(apple.getName()+"檢查通過");

)

catch(DangerExceptione){

e.toShow();

System.outprintln(apple.getName()+"被禁止!");

)

1

9.10上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

當(dāng)分析一個(gè)字符串并將字符串分解成可被獨(dú)立使用的單詞時(shí),可以使用java.util包中的

StringTokenizer類。當(dāng)我們想分解出字符串的有用的單詞時(shí),可以首先把字符串中不需要的

單詞都統(tǒng)一替換為空格或其他字符,比如“*”,然后再使用StringTokenizer類,并用“*”

或空格做分隔標(biāo)記分解出所需要的單詞。本實(shí)驗(yàn)的目的是讓學(xué)生掌握StringTokenizer類。

2.實(shí)驗(yàn)要求

"蘋果56.7圓,12圓,芒果:19.8圓”價(jià)格總和:

兩張購物小票的內(nèi)容如下。88.500000圓

“醬油6.7圓,精鹽:0.8圓,榨菜:9.8圓“價(jià)格總和:

”蘋果56.7圓,香蕉:12圓,芒果:19.8圓”;17.300000圖

圖9.22購物小票的價(jià)格

”醬油6.7圓,精鹽:0.8圓,榨菜98圓”;

編寫程序分別輸出兩張購物小票的價(jià)格之和。程序運(yùn)行參考效果如圖9.22所示。

3.程序模板

上機(jī)調(diào)試模板給出的程序,完成實(shí)驗(yàn)后的練習(xí)。

E.java

importjava.util.*;

publicclassE{

publicstaticvoidmain(Stringargs[]){

Stringsi="蘋果:56.7圓,香蕉:12圓,芒果:19.8圓";

Strings2二”醬油:6.7圓,精鹽:0.8圓,榨菜:9.8圓”;

ComputePicejisuan=newComputePice();

Stringregex=”「0123456789.]+”;〃匹配所有非數(shù)字字符串

Stringsl_number=s1.replaceAll(regex,"*'*);

doublepriceSum=jpute(s1_number,'**'*);

System.out.printf("\"%s\"價(jià)格總和:\n%f圓\n",si,priceSum);

Strings2_number=s2.replaceAll(regex,"#");

priceSum=jisuan.compute(s2_number,"#");

System.out.printf("\"%s\"價(jià)格總和:\n%f圓\n”,s2,priceSum);

)

classComputePice{

doublecompute(Strings,Stringfenge){

StringTokenizerfenxiOne=newStringTokenizer(s,fenge);

doublesum=0;

doubledigititem=0;

while(fenxiOne.hasMoreTokens()){

Stringstr=fenxiOne.nextToken();

digititem=Double.parseDouble(str);

sum=sum+digitltem;

)

returnsum;

10.13上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

本實(shí)驗(yàn)的目的是讓學(xué)生掌握字符輸入、輸出流以及緩沖輸入、輸出流用法。

2.實(shí)驗(yàn)要求

現(xiàn)在有如下格式的成績(jī)單(文本格式)score.txt:姓名漲三,教物分,物豳知英南吩總分:電0

姓名郭,數(shù)學(xué)92分,物理98%英醐分.總分:278.0

姓名:張三,數(shù)學(xué)72分,物理67分,英語70分.姓名闊五,數(shù)翔分,物豳知英曲盼,總分:225,0

姓名:李四,數(shù)學(xué)92分,物理98分,英語88分.圖10.11分析成績(jī)單

姓名:周五,數(shù)學(xué)68分,物理80分,英語77分.

要求按行讀入取成績(jī)單,并在該行的后面尾加上該同學(xué)的總成績(jī),然后再將該行寫入到

一個(gè)名字為socreAnalysis.txt的文件中。程序運(yùn)行參考效果如圖10.11所示。

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

AnalysisResult.java

importjava.io.*;

importjava.util.*;

publicclassAnalysisResult{

publicstaticvoidmain(Stringargs[]){

FilefRead=newFile("score.txt");

FilefWrite=newFileCsocreAnalysis.txt");

try{Writerout=【代碼1】〃以尾加方式創(chuàng)建指向文件fWrite的out流

BufferedWriterbufferWrite=[代碼2]〃創(chuàng)建指向out的bufferWrite流

Readerin=【代碼3]//創(chuàng)建指向文件fRead的in流

BufferedReaderbufferRead=[代碼4]〃創(chuàng)建指向in的bufferRead流

Stringstr=null;

while((str=bufferRead.readLine())!=null){

doubletotalScore=Fenxi.getTotalScore(str);

str=str+"總分:"+totalScore;

System.out.println(str);

bufferWrite.write(str);

bufferWrite.newLine();

)

bufferRead.close();

bufferWrite.close();

1

catch(IOExceptione){

System.out.println(e.toStringO);

1

Fenxi.java

importjava.util.*;

publicclassFenxi{

publicstaticdoublegetTotalScore(Strings){

Scannerscanner=newScanner(s);

scanner.useDelimiter("[A0123456789.]+");

doubletotalScore=0;

while(scanner.hasNext()){

try{doublescore=scanner.nextDouble();

totalScore=totalScore+score;

)

catch(InputMismatchExceptionexp){

Stringt=scanner.next();

)

)

returntotalScore;

11.8上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

處理事件時(shí),要很好地掌握事件源、監(jiān)視器、處理事件的接口之間的關(guān)系。事件源是能

夠產(chǎn)生事件的對(duì)象,如文本框、按鈕、下拉式列表等。事件源通過調(diào)用相應(yīng)的方法將某個(gè)

對(duì)象作為自己的監(jiān)視器,事件源增加監(jiān)視的方法addXXXListener(XXXListenerlistener)中的

參數(shù)是一個(gè)接口,listener可以引用任何實(shí)現(xiàn)了該接口的類所創(chuàng)建的對(duì)象做為事件源的監(jiān)視

器,當(dāng)事件源發(fā)生事件時(shí),接口listener立刻調(diào)用被類實(shí)現(xiàn)的接口中的某個(gè)方法,即監(jiān)視器

負(fù)責(zé)處理事件源發(fā)生的事件。本實(shí)驗(yàn)?zāi)康氖钦莆仗幚鞟ctionEvent事件。

2.實(shí)驗(yàn)要求

編寫一個(gè)算術(shù)測(cè)試小軟件,用來訓(xùn)練小學(xué)生的算術(shù)能力。程序有3個(gè)類組成,其中

Teacher對(duì)象充當(dāng)監(jiān)視器,負(fù)責(zé)給出算術(shù)題目,并判斷回答者的答案是否正確。ComputerFrame

對(duì)象負(fù)責(zé)為算術(shù)題目提供視圖,比如用戶可以通過ComputerFrame對(duì)象提供的GUI界面看

到題目,并通過該GUI界面給出題目的答案;MailClass是軟件的主類。程序運(yùn)行參考效果

如圖11.20所示。

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

MainClass.java

publicclassMainClass{

publicstaticvoidmain(Stringargs[]){

ComputerFrameframe;

frame=newComputerFrame();

frame.setTitle("算術(shù)測(cè)試”);

frame.setBounds(100,100,650,180);

)

)

ComputerFrame.java

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

publicclassComputerFrameextendsJFrame{

JMenuBarmenubar;

JMenuchoiceGrade;//選擇級(jí)別的菜單

JMenuItemgradel,grade2;

JTextFieldtextOne,textTwo,textResult;

JButtongetProblem,giveAnswer;

JLabeloperatorLabel,message;

TeacherteacherZhang;

ComputerFrame(){

teacherZhang=newTeacher();

teacherZhang.setMaxInteger(20);

setLayout(newFlowLayout());

menubar=newJMenuBar();

choiceGrade=newJMenu("選擇級(jí)別");

grade1=newJMenuItem("幼兒級(jí)另lj");

grade2=newJMenuItem("兒童級(jí)另『');

grade1.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

teacherZhang.setMaxInteger(10);

)

});

grade2.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

teacherZhang.setMaxInteger(50);

)

});

choiceGrade.add(grade1);

choiceGrade.add(grade2);

menubar.add(choiceGrade);

setJMenuBar(menubar);

[代碼1]〃創(chuàng)建textOne,其可見字符長(zhǎng)是5

textTwo=newJTextField(5);

textResult=newJTextField(5);

operatorLabel=newJLabel("+");

operatorLabel.setFont(newFont("Arial",Font.BOLD,20));

message=newJLabel("你還沒有回答呢");

getProblem=newJButton("獲取題目”);

giveAnswer=newJButton("確認(rèn)答案)

add(textOne);

add(operatorLabel);

add(textTwo);

add(newJLabel('

add(textResult);

add(giveAnswer);

add(message);

add(getProblem);

textResult.requestFocus();

textOne.setEditable(false);

textTwo.setEditable(false);

getProblem.setActionCommand(ngetProblem");

textResult.setActionCommand("answer");

giveAnswer.setActionCommand("answer");

teacherZhang.setJTextField(textOne,textTwo,textResult);

teacherZhang.setJLabel(operatorLabel,message);

【代碼2】〃將teacherZhang注冊(cè)為getProblem的ActionEvent事件監(jiān)視器

[代碼3]〃將teacherZhang注冊(cè)為giveAnswer的ActionEvent事件監(jiān)視器

[代碼4]〃將teacherZhang注冊(cè)為textResult的ActionEvent事件監(jiān)視器

setVisible(true);

validate();

setDefaultCloseOperation(DISPOSE_ON_CLOSE);

)

)

Teacher.java

importjava.util.Random;

importjava.awt.event.*;

importjavax.swing.*;

publicclassTeacherimplementsActionListener{

intnumberOne,numberTwo;

Stringoperator="n;

booleanisRight;

Randomrandom;〃用于給出隨機(jī)數(shù)

intmaxinteger;〃題目中最大的整數(shù)

JTextFieldtextOne,textTwo,textResult;

JLabeloperatorLabel,message;

TeacherQ{

random=newRandom();

publicvoidsetMaxInteger(intn){

maxlnteger=n;

)

publicvoidactionPerfbrmed(ActionEvente){

Stringstr=e.getActionCommand();

if(str.equals("getProblem")){

numberOne=random.nextlnt(maxlnteger)+1;//1至maxinteger之間的隨機(jī)數(shù);

numberTwo=random.nextInt(maxInteger)+1;

doubled=Math.random();//獲取(0,1)之間的隨機(jī)數(shù)

if(d>=0.5)

operator="+";

else

operator="-n;

textOne.setText(""+numberOne);

textTwo.setText("n+numberTwo);

operatorLabel.setText(operator);

message.setText("請(qǐng)回答)

textResult.setText(null);

)

elseif(str.equals("answer")){

Stringanswer=textResult.getText();

try{intresult=lnteger.parselnt(answer);

if(operator.equals("+")){

if(result==numberOne+numberTwo)

message.setText("你回答正確)

else

message.setText("你回答錯(cuò)誤");

)

elseif(operator.equals("-")){

if(result==numberOne-numberTwo)

message.setText("你回答正確)

else

message.setText("你回答錯(cuò)誤");

)

catch(NumberFormatExceptionex){

message.setText("請(qǐng)輸入數(shù)字字符)

publicvoidsetJTextField(JTextField...t){

textOne=t[0];

textTwo=t[l];

textResult=t[2];

)

publicvoidsetJLabel(JLabel...label){

operatorLabel=label[0];

message=label[1];

12.8上機(jī)實(shí)踐

1.實(shí)驗(yàn)?zāi)康?/p>

當(dāng)Java程序包含圖形用戶界面(GUI)時(shí),Java虛擬機(jī)在運(yùn)行應(yīng)用程序時(shí)會(huì)自動(dòng)啟動(dòng)

更多的線程,其中有兩個(gè)重要的線程:AWT-EventQuecue和AWT-Windows。

AWT-EventQuecue線程負(fù)責(zé)處理GUI事件。AWT-EventQuecue線程負(fù)責(zé)處理GUI事件,

AWT-Windows線程負(fù)責(zé)將窗體或組件繪制到桌面。JVM要保證各個(gè)線程都有使用CPU資

源的機(jī)會(huì),比如,程序中發(fā)生GUI界面事件時(shí),JVM就會(huì)將CPU資源切換給

AWT-EventQuecue線程,AWT-EventQuecue線程就會(huì)來處理這個(gè)事件,比如,你單擊了程

序中的按鈕,觸發(fā)ActionEvent事件,AWT-EventQuecue線程就立刻排隊(duì)等候執(zhí)行處理事件

的代碼。本試驗(yàn)的目的是掌握在GUI中使用Thread的子類創(chuàng)建線程。

2.實(shí)驗(yàn)要求

編寫一個(gè)Java應(yīng)用程序,在主線程中再創(chuàng)建一個(gè)Frame類型的窗口,在該窗口中再創(chuàng)

建一個(gè)線程giveWord。線程giveWord每隔2秒中給出一個(gè)漢字,用戶使用一種漢字輸入法

將該漢字輸入到文本框中。程序運(yùn)行效果如圖12.12

圖12.12打字練習(xí)

3.程序模板

請(qǐng)按模板要求,將【代碼】替換為Java程序代碼。

ThreadWordMainClass.java

publicclassThreadWordMainClass{

publicstaticvoidmain(Stringargs[]){

newThreadFrame().setTitle("漢字打字練習(xí)");

)

)

WordThread.java

importjavax.swing.JTextField;

publicclassWordThreadextendsThread{

charword;

intstartPosition=19968;//Unicode表的19968位置至32320上的漢字

intendPosition=32320;

JTextFieldshowWord;

intsleepLength=6000;

publicvoidsetJTextField(JTextFieldt){

showWord=t;

showWord.setEditable(false);

)

publicvoidsetSleepLength(intn){

sleepLength二n;

)

publicvoidrun(){

intk=startPosition;

while(true){

word=(char)k;

showWord.setText("n+word);

try{【代碼1]〃調(diào)用sleep方法使得線程中斷sleepLength豪秒

)

catch(InterruptedExceptione){}

k++;

if(k>=endPosition)

k=startPosition;

)

)

)

ThreadFrame.java

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

publicclassThreadFrameextendsJFrameimplementsActionListener{

JTextFieldshowWord;

JButtonbutton;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論