天天看點

《Java程式設計習題精析與實驗指導》一3.2 習題解析

一、選擇題

以下選項中,合法的指派語句是______。

a. ++m!=n--; b. ++ m; c. m=m + 1= 5; d. m = = 1;

答案:b

解析:在上述四個選項中,選項a和d為邏輯表達式而非指派語句;選項c中的m+1=5的表示是錯誤的;選項b中實作的功能等同于m=m+1。

下列語句序列執行後,ch1變量中的值為______。

ch1='a', ch2='b';

if (ch1 + 2 < ch2) ++ch1 ;

a. 'a' b. 'b' c. a d. b

答案:a

解析:java的字元比較運算遵循原則:首先将字元轉換為unicode代碼(unicode代碼最前面的128個字元與ascii代碼相同),然後再比較其大小。目前ch1為'a',其unicode代碼值為65,ch2為'b',其unicode代碼值為66,65+2大于66,故表達式(ch1 + 2 < ch2)的值為false,根據單分支結構語句的運作規則,此時并不進行++ch1的運算,是以ch1的值仍舊為'a',而字元常量的表示規則為該字元兩端必須加上單引号,故答案a正确。

下列語句序列執行後,c變量的值為______。

a=2, b=4, c=5;

if (a<--b) c*=a;

a. 5 b. 20 c. 15 d. 10

答案:d

解析:在表達式(a<--b)中先進行--b的運算,由于b的值為4,經運算後b的值為3,故表達式的值為真,因而将進行c=a的運算,其運算的結果等同于c=ca,在a=2,c=5的前提下,顯然經運算後c的值為10,故選項d是正确的。

下列語句序列執行後,c 的值是______。

a=6, b=3, c=5;

if (a==b) c+=a; else c=++a*c;

a. 15 b. 25 c. 35 d. 45

答案:c

解析:根據雙分支結構語句的運作規則,當關系表達式(a==b)的值非真時,執行else後面的語句“c=++a*c;”,由于此時a為6,++a後a的值為7,而c為5,故相乘後值為35,選項c是正确的。

下列語句序列執行後,c的值是______。

a=4,b=5,c=9,d=6;

if (a>b||ca. 6 b. 10 c. 8 d. 9

解析:根據變量初始化後所賦的值,可知表達式(a>b| |c

設a、b為int類型變量,c、d為float類型變量,ch為char類型變量,且所有變量均已指派,則下列正确的switch語句是______。

a. switch (a + b); {...} b. switch (ch + 1) {...}

c. switch ch {...} d. switch (c + d) {...}

解析:根據switch語句的使用規則,switch後面的表達式不允許是float類型的資料,故答案d錯;表達式必須用括号括起,故答案c錯;表達式後面應緊跟複合語句,不允許出現分号,故答案a錯;程式運作時,會自動将ch + 1轉換為整型資料并完成運算,故選項b是正确的。

a=10, b=18, c=30;

switch (b-a) {

}

a. 31 b. 32 c. 2 d. 33

解析:根據switch語句的運作規則,當b–a的值為8時執行“case 8 :”行的語句,執行結果為c取值31,由于沒有break語句,故程式将繼續執行“case 9 :”行語句以及下面的所有語句,當執行到“case 10 :”行語句時,c取值36,故執行“default :”行語句時,36除以18得商為2,故選項c正确。

下列語句序列執行後,a的值為______。

a=1;

for ( int i=5; i>0; i-=2 ) a*=i;

a. 0 b. 1 c. 15 d. 60

解析:在目前的循環語句中,由于循環變量的增值步長為-2,故循環将被執行3次,分别是當i為5、3和1時;由于a的初值為1,故連續乘以5、3和1之後其值應為15,故選項c正确。

下列語句序列執行後,c的值為______。

a=3, b=4, c=0;

while ((a++)<(-- b)) ++c;

a. 0 b. 1 c. 2 d. 3

解析:在表達式(a++) < (--b)的運算過程中,變量a是與變量b先比較而後自加,而變量b則反之:先自減而後與變量a比較。數值代入後的表達式為:3<3,表達式顯然非真,故本循環其實一次也沒有執行,當然c還是維持原來的值:0,故選項a正确。

下面關于數組定義語句不正确的是______。

a. float f[]=new {2.4f,3.5f,5.7f,7.9f}; b. int a1[]={1,2,3,4,5};

c. double[] d=new double[10]; d. int[] a2;

解析:對于java一維數組的聲明,可以有兩種形式。标準的聲明格式為:

type <數組名>[ ];//聲明一維數組

數組名=new type [<元素個數>];//配置設定記憶體給數組

type <數組名>[ ]=new type [<元素個數>];

可以了解為上面兩個語句的縮寫形式。

第二種形式是在聲明時直接指派,格式為:

type <數組名>[ ]={<數值1>,<數值2>,…,<數值n>};

兩種形式不可混淆使用,故選項a的定義方式是不正确的。

設有定義語句int a[ ]={36,72,99},則以下對此語句叙述錯誤的是______。

a. 該語句定義了一個名為a的一維數組 b. a數組有3個元素

c. 數組中的每個元素是整型 d. a數組的元素的下标為1~3

解析:java的數組一旦聲明,下标自動從0開始編号,是以a數組的元素的下标為0~2,選項d的叙述是錯誤的。

在一個應用程式中定義了數組a:int[ ] a={1,2,3,4,5,6,7,8,9,10},為了列印輸出數組a的最後一個數組元素,下面正确的代碼是______。

a. system.out.println(a[10]); b. system.out.println(a[9]);

c. system.out.println(a[8]); d. system.out.println(a[a.length]);

解析:由于目前數組a中有10個元素,而java的數組下标自動從0開始編号,是以最後一個元素應為a[9],a[10]在記憶體中是不存在的,而a.length中傳回的是該數組的元素個數,其值為10,故選項b是正确的。

執行下列語句

int[] lx = {2,3,4,5};

lx[3] = lx[3] == --lx[0]?++lx[1]:lx[2]--;

後,數組lx的元素值分别為______。

a. 1,2,3,4 b. 1,3,3,3 c. 1,2,3,3 d. 1,3,3,4

解析:當數組lx中的元素被分别指派之後,對于表達式:lx[3] == ––lx[0]?++lx[1]:lx[2]––,由于此時lx[0]取值為2,lx[3]取值為5,是以顯然lx[3] == ––lx[0]取值非真,根據多元運算符“?:”的運算規則:應将冒号後面的表達式的值(lx[2]––)指派給lx[3],由于此時lx[2]取值為4,系統先将該值賦予lx[3],然後對lx[2]進行自減;由于整個過程中lx[1]并未被引用,是以也不會進行自增的操作。

語句

string s1 = new string("hello");

string s2 = new string("hello");

system.out.println(s1 == s2);

system.out.println(s1.equals(s2));

執行後的輸出結果是______。

a. hello b. hello c. hello d. false

解析:string類型資料并非java的基本資料類型,s1和s2是從java.lang中的字元串類中建立的執行個體對象,對于執行個體對象而言,“==”所比較的是兩者的記憶體位址而非它們的具體内容,若要比較兩者的具體内容是否相同,必須使用其所對應的方法“equals()”,“==”與“equals()”比較的結果均為邏輯值,故答案d正确。

設有如下定義語句:

string s1="my cat";

int m=s1.compareto("my a cat");

語句被執行後m的值為______。

a. 2 b. 1 c. 0 d. –2

解析:java語言處理系統對于字元串的比較基于字元串中各個字元的unicode值。将此 string變量表示的字元序列與參數字元串所表示的字元序列進行逐個比較。如果按字典順序此string變量在參數字元串之前,則比較結果為一個負整數;如果按字典順序此string變量位于參數字元串之後,則比較結果為一個正整數。目前string變量s1按字典順序顯然在參數字元串"my a cat"之後,是以比較結果為正值,且c的unicode代碼比a的unicode代碼大2,故選項a正确。

下列方法定義中,正确的是______。

a. double me(int a, int b) { int r; r=a–b; }

b. double me(a, b ) { return b; }

c. int me(int a, int b) { return a–b; }

d. int me(int a, b) { return (a–b); }

解析:對于有傳回值的方法的定義,一般都使用return語句将計算值傳回至主調程式,故答案a的定義不正确;方法的傳回值類型必須與方法聲明類型一緻,答案b中的變量b沒有聲明其類型,故該定義也不正确;方法中若有參數,該方法聲明時參數必須逐個明确聲明,答案d中參數a雖然經過了聲明,但參數b卻沒有聲明,故該定義也不正确;顯然隻有答案c是符合要求的。

下列方法定義中,不正确的是______。

a. float x( int a,int b ) { return (a–b); }

b. int x( int a,int b) { return a–b; }

c. int x( int a,int b ) { return a*b; }

d. int x(int a,int b) { return 1.2*(a+b); }

解析:根據上題所述理由:方法的傳回值類型必須與方法聲明類型一緻,而1.2*(a+b)顯然不是整型數值,故答案d的方法定義不正确。

在java程式中所提到的“遞歸”的基本概念,其基本思想是______。

a. 讓别人反複調用自己 b. 自己反複調用别人

c. 自己反複調用自己 d. 以上說法都不對

解析:java程式中的方法須經過調用方能得以運作(主方法除外),根據不同的具體需求,java中的方法一可以調用方法二,方法二可以調用方法三(稱為嵌套調用),方法一也可以調用方法一本身(稱為遞歸調用),故答案c正确。

二、程式填空

下面程式的功能是:由鍵盤輸入一個小于“100”的數字字元串(例如“38”),将它轉換成整數,然後計算并輸出從該整數到100之間所有整數的累加和。請将程式補充完整。

答案:

(1)java.io.*

(2)buf.readline();

(3)integer.parseint(str);

(4)s=0

(5)int i=num1;i<=100;i++

解析:本程式中使用了鍵盤輸入語句,處理該語句的工具bufferedreader類與inputstreamreader類都被封裝于java.io包中,故在程式開始時,必須首先引入這個包以及這個包中所有的類。readline()是bufferedreader類中封裝的方法,用于接收使用者從鍵盤輸入的資料,該方法必須由對象加以調用。是以程式首先聲明了buf對象,然後通過該對象調用其方法。因為此程式從鍵盤獲得的資料是字元串,因而資料一旦被讀入,應立即将其轉換為整型數才能對變量num1指派。當程式開始累加操作時,累加器(此處為變量s)清零是一個必需的過程。按照題目的要求,要設定從num1(鍵盤輸入的數值)開始到100為止、每次循環變量增值為1的循環。

下面java應用程式接收使用者輸入的10個整數,将這10個數按從大到小的方式排序并輸出,請将程式補充完整。

(1)int[10]

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

(3)int j=i+1

(4)<

(5)arr[j]=t

解析:聲明數組的标準文法格式在new的後面應該是該數組的資料類型及其長度。一旦數組與變量聲明完畢,後面就是逐個處理由使用者從鍵盤輸入的資料,既然是逐個處理,顯然該處應使用循環語句,且其循環的次數應該與數組的長度相同、循環變量每次增值為1。由于排序要求為從大到小,故本程式采用的方法是:第一次(也就是第一輪循環),取定數組的第一個元素,把它與後面的元素逐個相比較,凡有比該數(即第一個元素)的數值大的,立刻将這兩個元素的數值進行交換,此時值較大的元素換到了第一個元素的位置。交換結束後,将第一個元素再繼續與剛才交換位置元素後面的元素進行逐個比較,凡有比該數的數值大的,再将這兩個元素的數值進行交換,以此類推,當處理完了最後一個元素之後(即第一輪循環結束),第一個元素的數值自然變成了該數組中的最大值元素了;第二次,取定數組的第二個元素,進行與第一次同樣的比較操作,當第二輪循環結束時,第二個元素的數值就是該數組中除了第一個元素之外最大的了。如此進行9次循環之後,數組的元素從大到小就依次排好了。抽象地考慮:當進行第i輪循環時,首先應該取定數組的第i個元素,為了與後面的元素比較,是以必須聲明與i類型相同的變量(此處為j),作為循環變量進行操作,且該循環變量的初值顯然應該是i+1。每一輪的循環中arr[i]是被取定的元素,arr[j]是與之相比較的元素,比較規則是一旦arr[i]< arr[j],兩元素的數值被交換。兩個元素數值交換的常用方法是:先把第一個元素的值放到臨時變量中暫存(int t=arr[i];),将第二個元素的值賦予第一個元素(arr[i]=arr[j];),再将臨時變量中的值賦予第二個元素(arr[j] =t;)。

本程式的功能是:首先建立一個有序數組{18,16,14,12,10,8,6,4,2},然後将整數13插入該數組中并使數組仍然有序,即插入後的數組為{18,16,14,13,12,10,8,6,4,2}。請将程式補充完整。

(1)int n[]=new int[10];

(2)n[i]=18-2*i;

(3)n[i+1]=n[i];

(4)n[i]=q;

(5)n[i+1]=q;

解析:按照題目的要求首先應該聲明數組,數組名應通過仔細觀察程式後面所使用到的數組的名稱而獲得。根據題目要求,數組元素所獲得的數值應從遞推公式n[i]=18-2*i中産生。目前插入法排序的思想是:将原數組從最後一個元素起,逐個與要插入的資料(此處為q)進行比較,若最後一個元素比q小,則将該元素後移一位(即将n[8]的值賦予n[9]);然後将倒數第二個元素與q進行比較,若該元素仍然小于q,則同樣将該元素後移一位(即将n[7]的值賦予n[8]);以此類推到倒數第i個元素,若該元素仍然小于q,則同樣将該元素後移一位(即将n[i]的值賦予n[i+1]);若判斷下來所有的元素都小于q(此時所有的元素都被後移了一位),則将q的值賦予第一個元素;若判斷下來所有的元素都不小于q,則将q的值賦予最後一個元素。事實上,由于原數組本來有序,是以隻要将原數組中的最後一個元素與q進行比較,若該元素的值比q大,則前面的元素都不會比q小,是以直接将q的數值賦予最後一個元素即可。

下面程式的運作功能為實作字元串中字元的删除:現有字元串為“zyzmmmazza”,要從中删除字元“z”,程式運作後結果顯示為“ymmmaa”。請将程式補充完整。

(1)s.length()

(2)i+j(3)s.charat(i+j)

(4)i++

(5)strip(s,'z')

解析:本程式的teststring類中除了主方法之外,還包含另外一個類方法strip(),其中strip()方法含有兩個參數,這個方法顯然應該在主方法中被調用,而目前主方法中除了該填的空之外沒有任何調用方法的語句,是以第5個空應填入含有實參的調用方法表達式;在strip()方法中,n的值用于聲明字元數組的長度,在這裡,字元數組用于存放被删除所指定字元(此處為'z')之後所剩的字元串,它的最大長度應等同于主方法中傳入的字元串的長度,故在第1個空中應填入“s.length();”,從“if (sn==c) j++”語句可知,變量j用于統計字元串中要删除的字元(此處為'z')的個數,則變量i顯然用于統計原字元串中所有不為'z'的字元的個數,本程式的基本思想是:從原字元串中逐個取字元進行判别,若目前取得的字元為'z',則變量j增1;若目前取得的字元不為'z',則将該字元放入a數組中,同時數組下标變量增1,以此類推,直到進行到原字元串的最後一個字元為止,當處理完最後一個字元,此時i+j應等于n,故在第2個空中應填入:i+j