1. 程式人生 > >黑馬程式設計師_基礎測試

黑馬程式設計師_基礎測試

                                               -------java培訓、期待與您交流! ----------

黑馬程式設計師訓練營基礎測試題及個人程式碼(包含思路、步驟和基本註釋)

1、 編寫程式計算12+22+32+....+1002的和.

package com.itheima;

/*
 * 第一題:編寫程式計算1到100的平方和。
 * 
 * 		思路:
 * 			①計算方法,可以採用兩數相乘再進行累加,也可以採用自帶的Math函式處理後進行累加,還可以利用數學公式計算。
 * 			②實現方法:可以使用for迴圈方法、do while迴圈方法、while迴圈方法、遞迴方法和公式直接定義方法。
 * 		步驟:
 * 			①定義實現不同方法的靜態函式,主函式可以呼叫。
 * 			②在函式中實現計算方法。
*/		
public class Test1 {
	//-------------------------------------------------------------------------------------
	//主函式用來呼叫不同方法的函式。
	public static void main(String[] args) {		
		int sum1=formethod(1,100);
		int sum2=dowhilemethod(1, 100);
		int sum3=whilemethod(1, 100);
		int sum4=recursivemethod(1, 100);
		int sum5=formulamethod(1, 100);
		//呼叫5個具有不同方法的函式,將結果存入對應的5個變數中
		System.out.println("for迴圈方法的計算結果是:"+sum1+"\ndowhile迴圈方法的計算結果是:"+sum2+"\nwhile迴圈方法的計算結果是:"+sum3+"\n遞迴迴圈方法的計算結果是:"+sum4+"\n公式直接定義方法的計算結果是:"+sum5);
		//輸出結果
	}
	//-------------------------------------------------------------------------------------
	//利用for迴圈來實現數a到數b的平方和。
	public static int formethod(int a,int b){
		int sum=0;//定義一個存放結果的sum變數
		for(int c=a;c<=b; c++){
			sum=sum+c*c;//將存在sum中的值和數c的平方相加得到新值,存入sum中。
		}//for語句中定義變數c=a完成變數的初始化,c<=b規定平方和計算的迴圈條件,c++用來執行一遍迴圈後修改控制迴圈的變數值。
		return sum;//返回sum的值。
	}
	//-------------------------------------------------------------------------------------
	//利用do while迴圈來實現數a到數b的平方和。
	public static int dowhilemethod(int a,int b){
		int sum=0;//定義一個存放結果的sum變數
		do{
			sum=sum+a*a;
			a++;
		}//將存在sum中的值和數c的平方相加得到新值,存入sum中,a++用來執行一遍迴圈後修改控制迴圈的變數值。
		while(a<=b);//當while語句中的“a<=b”條件不被滿足時,自動停止迴圈
		return sum;//返回sum的值。
	}
	//-------------------------------------------------------------------------------------
	//利用while迴圈來實現數a到數b的平方和。
	public static int whilemethod(int a,int b){
		int sum=0;//定義一個存放結果的sum變數
		while(a<=b){
			sum=sum+a*a;
			a++;
		}//將存在sum中的值和數c的平方相加得到新值,存入sum中,a++用來執行一遍迴圈後修改控制迴圈的變數值。當while語句中的“a<=b”條件不被滿足時,自動停止迴圈
		return sum;//返回sum的值。
		}
	//-------------------------------------------------------------------------------------
	//利用遞迴方法來實現數a到數b的平方和。
	public static int recursivemethod(int a,int b){
	if(a==b){
	return (int)Math.pow(a, 2);//如果第一個值與最後一個值相同,利用math類中的冪計算函式計算後直接返回此值的平方。
	}
	return b*b+recursivemethod(a, b-1);//利用遞迴方法,呼叫自身計算出結果。
	}
	//-------------------------------------------------------------------------------------
	//直接定義公式來實現數a到數b的平方和。
	public static int formulamethod(int a,int b){
		int sum=0;//定義一個存放結果的sum變數
		int c=a-1;//若a不等於1,計算a與1的差
		sum=b*(b+1)*(2*b+1)/6-c*(c+1)*(2*c+1)/6;//定義平方和公式
		return sum;//返回sum的值。
	}
	//-------------------------------------------------------------------------------------
	
}


2、 定義一個二維int陣列,編寫程式碼獲取最小元素。

package com.itheima;

/*
 * 第二題:定義一個二維int陣列,編寫程式碼獲取最小元素。
 * 
 * 		思路:
 * 			要求獲取二維陣列中的最小元素,可以定義一個二維陣列運用for迴圈進行比較,直到找到最小的元素,即求得。
 * 		步驟:
 * 			①定義一個二維陣列並賦值進行初始化,定義一個最小元素變數並初始化
 * 			②運用巢狀迴圈控制二維陣列的行和列的值,在迴圈中將陣列元素值和min進行比較,
 * 				如果陣列元素值比min更小,則將陣列元素值賦給min,不斷迴圈這個過程,迴圈完畢後,min值則為二維陣列中最小的元素
 * 
*/		
public class Test2 {

	public static void main(String[] args) {
		
		int arr[][]={{9,8,5,3},{6,2,7,1},{4,5,8,6}};//定義了一個二維int陣列,賦初值進行初始化
		int min=arr[0][0];//定義一個代表最小元素的變數並初始化
		for(int i=0; i<arr.length; i++){
			for(int j=0; j<arr[i].length; j++){
				if(arr[i][j]<min){
					min=arr[i][j];
					}//將陣列元素值和min進行比較,如果陣列元素值比min小,則將陣列元素值賦給min
				}//此for迴圈用來控制二維陣列中的列值
			}//此for迴圈用來控制二維陣列中的行值
		System.out.println("二維int陣列中的最小元素為"+min);//最終得到二維陣列中最小的元素並輸出。
	}
}


3、 以下程式碼哪個是正確的?為什麼?

a. byte b = 1 + 1;      b. byte b = 1;b = b + 1;  c. byte b = 1;b = b += 1;     d. byte b = 1;b = ++b;  
package com.itheima;

public class Test3 {
	/*
	 * 第三題:以下程式碼哪個是正確的?為什麼?
					a. byte b = 1 + 1;     
					b. byte b = 1; b = b + 1; 
					c. byte b = 1; b = b += 1;    
					d. byte b = 1; b = ++b; 
		解答:				
				a,c,d正確;b錯誤。
				
				選項a中,語句等價於byte = 2;因為右邊是常量,其值固定,運算元在byte型的範圍內,編譯器會自動完成強制轉換,所以正確;               
				選項c中,+=是一個賦值運算子,加和賦值是一步完成的,含有強制型別轉換。等價於b=b=(byte)(b+1);所以正確;				
				選項d中,++是自增運算子,自身加1再賦值給自己,加1和賦值也是一步完成的,且不會改變變數的型別(含有強制型別轉換)。byte b = 1; b = ++b; ”語句相當於“[byte] b = [byte] b + [byte] 1”語句,所以正確;
				選項b中,因為“byte b = 1; b = b + 1; ”語句相當於“[byte] b = [byte] b + [int] 1”語句,b自動轉型為int與1做加法,結果是int型別,把int型別賦給byte型別b,型別不符合,所以錯誤。
	 * 	
	 */
	public static void main(String[] args) {
		byte b = 1 + 1;     
		//byte b = 1; b = b + 1; 
		//byte b = 1; b = b += 1;    
		//byte b = 1; b = ++b;
		System.out.println(b);
		

	}

}


4、 編寫一個函式,函式內輸出一個字串,並在主函式內呼叫它。

package com.itheima;

public class Test4 {

	/*
	 * 第四題:編寫一個函式,函式內輸出一個字串,並在主函式內呼叫它。
	 *	思路:定義字串輸出函式供主函式呼叫
	 *	步驟:編寫一個靜態函式,函式中定義一個字串並輸出,在main函式裡呼叫這個函式。
	*/
	public static void main(String[] args) {		
		output();//呼叫函式
	}
	public static void output(){
		String str="I love itheima!";//定義字串
		System.out.println(str);//輸出字串
	}
}


5、 寫出以下程式碼執行結果,分析為什麼?(沒有分析結果不得分)

        public class Test {                 public static void main(String[] args) {                         String s = "abc";                         s.substring(1);                         s.replace("bc", "xyz");                        System.out.println(s);                        String value = new String ("abc");                        System.out.println(s == value);                 }        }
package com.itheima;

public class Test5 {
	/*第五題:寫出以下程式碼執行結果,分析為什麼?(沒有分析結果不得分)

        public class Test {
                public static void main(String[] args) {
                        String s = "abc";
                        s.substring(1);
                        s.replace("bc", "xyz");
                       	System.out.println(s); 
                       	String value = new String ("abc");
                       	System.out.println(s == value);
                }
       }
       
       解答:執行結果為:   abc
       						       false
       	
       	分析:定義一個字串s等於abc,對s進行了substring和replace操作,作用是擷取和替換,對s的操作都產生了新的字串,
       			但新字串對字串s並不產生影響,操作後,字串s的值還是abc,所以程式輸出s結果為abc。
       			
       			s==value實際上比較的是s和value在記憶體中的地址是否相同,並返回邏輯值,比較的並不是兩者的內容,
       			在語句中,雖然s和value的內容都是abc,但s和value指向的不是同一個物件,記憶體地址不相同,
       			所以程式輸出s==value為false。
       			
	 * 
	 * */
	public static void main(String[] args) {
        String s = "abc";
        s.substring(1);//將s中的第一位a擷取掉,生成新字串bc,s不變
        s.replace("bc", "xyz");//將s中的bc替換為xyz生成新字串xyz,s不變
        System.out.println(s); 
        String value = new String ("abc");
        System.out.println(s == value);//s和value指向的不是同一個物件,false
	}
}


6、 用控制檯程式倒著輸出九九乘法表;輸出結果按下圖所示:

      1*9=9    2*9=18    3*9=27    4*9=36    5*9=45    6*9=54    7*9=63    8*9=72    9*9=81

      ……

      1*3=3   2*3=6   3*3=9

      1*2=2   2*2=4

      1*1=1

package com.itheima;

public class Test6 {
	/*第六題:用控制檯程式倒著輸出九九乘法表;輸出結果按下圖所示:

    1*9=9    2*9=18    3*9=27    4*9=36    5*9=45    6*9=54    7*9=63    8*9=72    9*9=81

    ……

    1*3=3   2*3=6   3*3=9

    1*2=2   2*2=4

    1*1=1
    思路:
    		要求倒著輸出九九乘法表,採用巢狀迴圈控制行和列,進行計算並按格式輸出。
    步驟:
    		在for迴圈控制行數時從9開始,迴圈條件為行數大於等於1,每迴圈一次行數減1;
    		for迴圈控制列數時從1開始,迴圈條件為列數小於等於9,每迴圈一次列數+1;
    		巢狀迴圈中定義好計算式,並按照格式輸出即可倒著輸出九九乘法表。
* */
	public static void main(String args[]) { 
		int i,j,k; //定義三個變數,i,j用來表示行數和列數,k表示運算結果
		for(i=9;i>=1;i--) { 
			for(j=1;j<=i;j++) { 
				k=i*j; //運算結果
				System.out.print(j+"*"+i+"="+k+"\t"); //按格式輸出等式
				}
			System.out.println("\n");  //處理完一行進行換行
			} 
		} 
}


7、在列印語句中如何列印這3個x變數? class A {     int x = 1;     class B {         int x = 2;         void func() {             int x = 3;             System.out.println( ? );         }     } }
package com.itheima;

/*第七題:在列印語句中如何列印這3個x變數?
 
class A {
    int x = 1;
 
    class B {
        int x = 2;
 
        void func() {
            int x = 3;
            System.out.println( ? );
        }
    }
}
	思路: 外部類中有一個內部類,各個類擁有自己的成員變數,且類中變數是例項變數,要求內部類中的函式輸出3個位置不同的x變數
			已知內部非靜態類中可以隨意訪問外部類的各個成員或成員函式,直接訪問成員變數可以實現打印出這3個x變數。
 * */
class A {
    int x = 1;	 
    class B {
    	int x = 2;	 
    	void func() {
            int x = 3;
            System.out.println(A.this.x+ "," + B.this.x + "," + x);
            //內部非靜態類中可以隨意訪問外部類的各個成員變數或成員函式。
            //如果內部類B為靜態,則輸出語句應為“System.out.println(new A().x+ "," + new B().x + "," + x);”
           // 因為內部類B在靜態的情況下,B隨著類的載入而載入,B中函式呼叫A的非靜態成員變數必須要建立物件。
        }
    }//內部類
}//外邊類
public class Test7 {
	public static void main(String[] args){
		A.B ab=new A().new B();//若B類為靜態,此處語句應為“A.B ab=new A.B();”
		ab.func();
	}
}


8、 編寫程式,從鍵盤接收一個字串,對字串中的字母進行大小寫互轉(大寫字母轉成小寫,小寫字母轉成大寫)。

package com.itheima;
import java.io.*;


/*第八題:編寫程式,從鍵盤接收一個字串,對字串中的字母進行大小寫互轉(大寫字母轉成小寫,小寫字母轉成大寫)。
 * 思路:①從鍵盤接收一個字串,需要用到輸入流
 * 			②接收到字串後有兩種方法可以進行大小字母轉換,
 * 				第一種利用Character類自帶函式逐字元判斷字元型別進行轉換並輸出
 * 				第二種利用大小寫字母範圍逐字元判斷字元型別後對字元加或減32轉換字元並輸出。
 * 步驟:①定義兩個實現轉換功能的函式,分別利用兩種不同方法實現。
 * 			②在主函式中呼叫函式實現輸入字串對其中的大小寫字母進行互轉。
 * */
public class Test8 {
	//------------------------------------------------------------------------------------------------------------------------
	//兩種轉換方法
	public static String convertstr1(String s) throws Exception {
		StringBuffer sb=new StringBuffer();//定義字串變數
		if(s.equals("over")){
			System.out.println("當前方法已經終止執行!");
			Test8.main(null);
		}
		for(int i=0;i<s.length();i++) {
			char c=s.charAt(i);//字串中取得具體字元
			if(Character.isUpperCase(c)) {
				sb.append(Character.toLowerCase(c));
				}//若用isUpperCase判斷字元為大寫字母,則利用toLowerCase將其轉換為小寫字母
			else if(Character.isLowerCase(c)) {
				sb.append(Character.toUpperCase(c));    
				}//若用isLowerCase判斷字元為小寫字母,則利用toUpperCase將其轉換為大寫字母
			else if(Character.isDigit(c)) {
				sb.append(c);
				}//若用isDigit判斷字元為數字,則保持不變
			else {
				sb.append(c);    
				}//其他字元保持不變
			}		
		return sb.toString();//返回字串
		}
	public static String convertstr2(String s) throws Exception {
		StringBuffer sb=new StringBuffer();//定義字串變數
		if(s.equals("over")){
			System.out.println("當前方法已經終止執行!");
			Test8.main(null);			
		}
		for(int i=0;i<s.length();i++) {
			char c=s.charAt(i);//字串中取得具體字元
			if(c>='A'&&c<='Z') {
				c+=32;
				sb.append(c);
				}//若判斷字元為大寫字母,則將其+32轉換為小寫字母。ASCII碼中,大寫字母比小寫字母的數值小32
			else if(c>='a'&&c<='z') {
				c-=32;
				sb.append(c); 
				}//若判斷字元為小寫字母,則將其-32轉換為大寫字母。ASCII碼中,小寫字母比大寫字母的數值大32
			else {
				sb.append(c);    
				}//其他字元保持不變
			}		
		return sb.toString();//返回字串
	}
	//-----------------------------------------------------------------------------------------------------------------------
	public static void convert1(){  
		BufferedReader br=null;
		System.out.println("請輸入一串字元,輸入over可以停止當前方法。");
		try {
			br=new BufferedReader(new InputStreamReader(System.in));//接受字串
			String s=null;
			while((s=br.readLine())!=null){
			System.out.println(convertstr1(s));//呼叫convertstr1函式對字串進行轉換
			}
			}
		catch(Exception e) {
			System.out.println(e.getMessage());  
			} 
	}
	public static void convert2(){  
		BufferedReader br=null;
		System.out.println("請輸入一串字元,輸入over可以停止當前方法。");
		try {
			br=new BufferedReader(new InputStreamReader(System.in));//接受字串
			String s=null;
			while((s=br.readLine())!=null){
			System.out.println(convertstr2(s));//呼叫convertstr2函式對字串進行轉換
			}
			}
		catch(Exception e) {
			System.out.println(e.getMessage());  
			} 
	}
	public static void main(String[] args) {
		System.out.println("請輸入編號選擇方法:\n1.Character類轉換方法\n2.ASCII碼轉換方法\n");		
		try {
			BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
			String a=br1.readLine();
			if(a.equals("1")){
				System.out.println("Character類轉換方法:");
				convert1();
			}
			if(a.equals("2")){
				System.out.println("ASCII碼轉換方法:");
				convert2();
			}
			if(!a.equals("1")||!a.equals("2")){
				System.out.println("編號輸入錯誤!");
				Test8.main(null);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


9、 定義一個靜態方法,該方法可以接收一個List<Integer>,方法內對List進行排序

package com.itheima;

import java.util.*;
/*第九題:定義一個靜態方法,該方法可以接收一個List<Integer>,方法內對List進行排序
 * 思路:定義一個靜態方法返回值為list,在方法中定義一個list,再使用Collections類中的sort函式對其排序。
 * */
public class Test9 {
	public static void main(String[] args){
		List<Integer> list = Arrays.asList(4,3,1,9,7,6,2,0,5,8);//建立一個list
        getList(list);//將list傳給getlist函式進行排序處理
    }
      
     public static List<Integer> getList(List<Integer> list){
        Collections.sort(list);//使用Collections類中的sort方法對接收的list進行升序排序
        for (Integer i:list ){
           System.out.print(i+" ");//輸出
        }
        return list;
     }
}


10、 編寫函式,從一個字串中按位元組數擷取一部分,但不能截取出半個中文(GBK碼錶)

例如:從“HM程式設計師”中擷取2個位元組是“HM”,擷取4個則是“HM程”,擷取3個位元組也要是"HM"而不要出現半個中文

package com.itheima;

import java.io.*;

/*第十題:編寫函式,從一個字串中按位元組數擷取一部分,但不能截取出半個中文(GBK碼錶)
			例如:從“HM程式設計師”中擷取2個位元組是“HM”,擷取4個則是“HM程”,擷取3個位元組也要是"HM"而不要出現半個中文
			
			思路:要在字串中按字串擷取一部分,先要將字串轉為位元組形式,根據單漢字的位元組為2的特點,
					如果擷取長度末尾正好在漢字的一個位元組上,那麼輸出時漢字便會不完整,可以在字串中將不完整漢字的一個字元擷取掉,
					便不會存在輸出中文字元不完整的問題,可以輸出完整的字串
 * */
class Test10{
	public static void main(String[] args){
		substr("HM程式設計師", 3);
	}
	public static void substr(String str , int l){//定義擷取函式,引數為(字串,擷取位元組長度)
		String s = null; //定義字串s初始化為空
		if(str == null){
			System.out.println("字串為空"); 
			}
		else{
			byte[] bt = null; //初始化位元組陣列bt為空
			try {
				bt = str.getBytes("GBK"); //將字串使用GBK編碼轉化為位元組陣列
			} 
			catch (UnsupportedEncodingException e){ 
				e.printStackTrace();
			}
			if(bt.length <= l){
				s = str; 
				}//若位元組陣列長度小於要求的擷取位元組長度,則字串s仍為原字串str
			if(l > 0){
				s = new String(bt, 0, l); //根據擷取位元組長度從字元陣列中解碼,生成新的字串s。
				int length = s.length(); //得到新字串s長度
				if(str.charAt(length - 1) != s.charAt(length-1)){//如果原字串str和新字串s中相應位置上的字元不相等,說明新字串中相應位置上的字元不完整,將不完整的字元擷取掉
					if(length < 2){
						s = null; //若新字串長度小於2,且新字串中末尾的字元不完整,則新字串為空。
					}
					else{
						s = s.substring(0, length-1); //把s的最後一位不完整的字元截掉,把完整字串賦給s
					}
				}
			}
			System.out.println(s);//輸出
		}	
	}
}