一、選擇題
以下選項中,合法的指派語句是______。
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