1. 程式人生 > >《瘋狂Java講義(第4版)》-----第4章【習題解答】

《瘋狂Java講義(第4版)》-----第4章【習題解答】

【練習1】九九乘法表


public class Multiplication_table {

	public static void main(String[]args){
		for(int i=1;i<=9;i++){
			for(int j=1;j<=i;j++){				
				System.out.print(i+"X"+j+"="+(i*j));
				if(j!=i) System.out.print(",");
			}
			System.out.println();
		}
	}
}

【練習2】列印由"*"生成的等腰三角形

import java.util.Scanner;

public class test {
	
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n-i;j++) System.out.print(" ");
			for(int j=1;j<=2*i-1;j++) System.out.print("*");
			System.out.println();
		}
	}
}

【練習3】用“*”列印一個圓

//本程式依據x^2+y^2=r^2這個圓公式進行畫圓
import java.util.Scanner;
import java.lang.Math;

public class test{
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		double r=scan.nextDouble();
		for(double x=-r;x<=r;x+=2){	//此處i+=2,可以控制好更像圓,如果i++像橢圓
			double y=Math.sqrt(Math.pow(r, 2)-Math.pow(x, 2));
			for(double i=-r;i<=r;i++){
				//對於x座標,遍歷一邊-r到r所有值,如果和y座標之差的絕對值在0.5的誤差範圍內,我們就認為此處i=y,應該大衣呢出點
				System.out.print((Math.abs(y-i)<=0.5 || Math.abs(-y-i)<=0.5)?'*':' ');
			}
			System.out.println();
		}
	}
}

輸入輸出樣例:
這裡寫圖片描述

【練習4】通過位元組擷取實現String的substring方法

方案一

看了網上的各類版本,都沒有實現題目要求,下面程式碼可以實現題目要求,實現和String的substring完全一樣的功能。

在eclipse下編譯執行,輸出結果是錯誤的,可以用命令列進行編譯執行。主要是因為漢字編碼問題。eclipse預設GBK編碼,而漢字是Unicode編碼。



public class test{
	public static void main(String[] args){
		System.out.println(substring("中國China",1,3));
	}
	
	//按照位元組擷取字串實現和String的substring完全一樣的功能
	public static String substring(String str,int indexStart,int indexEnd){
		byte[] bt=str.getBytes();
		int[] cnt=new int[bt.length];
		
		int num=0;
		//標記每個位元組對應原字串中字元的下標
		for(int i=0;i<bt.length;i++){
			cnt[i]=num;
			if(bt[i]<0){
				cnt[i+1]=num;
				i++;
			}
			num++;
		}
		
		int st=0,en=0;
		//尋找原來以indexStart為下標的字元在bt位元組陣列中開始的位元組下標
		for(int i=0;i<bt.length;i++){
			if(cnt[i]==indexStart){
				st=i;
				break;
			}
		}
		//尋找原來以indexEnd為下標的字元在bt位元組陣列中結束的位元組下標
		for(int i=bt.length-1;i>=0;i--){
			if(cnt[i]==indexEnd-1){
				en=i;
				break;
			}
		}
		
		return new String(bt,st,en-st+1);//使用String的建構函式String​(byte[] bytes, int offset, int length)
	}
}

輸出:
國C

方案二(主要程式碼)

String str = "中國abc";
byte[] by = str.getBytes();

byte[] dst = Arrays.copyOfRange(by,2,5);
System.out.println(new String(dst));

【練習5】輸入一個浮點數,給出相應的人民幣讀法。

下面程式輸入要求:整數部分8位及以內,小數部分2位及以內。

package assignment;

import java.util.Scanner;

/*
 本程式實現整數部分8位及以內,小數部分2位及以內的浮點數用人民幣讀法表示
 比如230432.25表示為貳拾叄萬零肆佰叄拾貳元貳角伍分
 
 演算法思路:核心思想是解決四位數16種情況的每種人民幣讀法,這裡說的四位數允許有前導0,
再按照前導0讀與不讀分為兩種情況,故相當於共32種情況,解決好這32種情況,核心問題
已經解決!進一步,如果整數部分小於等於9999,則按照不讀0的方法轉換成人民幣讀法,如
果整數部分大於等於10000,則低四位按照讀0,高四位按照不讀0的方法轉換成人民幣高讀法。
 */

public class test{
	public final static String HAN="零壹貳叄肆伍陸柒捌玖拾";
	public final static String UNIT="十百千";
	
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		System.out.println("請輸入一個浮點數: ");
		String s=scan.next();
		System.out.println("這個浮點數轉換成人民幣讀為: ");
		
		
		solve(s);
	}
	
	
	
	//四位數讀0的情況,不足四位補0補夠四位,形參一定是長度為4的字串,不足四位,用前導0先補齊再作為形參
	public static String read_0(String s){
		char a=s.charAt(0);
		char b=s.charAt(1);
		char c=s.charAt(2);
		char d=s.charAt(3);
		if(s.equals("0000")) return "";//0000
		else if(a=='0' && b=='0' && c=='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(d-'0');//0001
		else if(a=='0' && b=='0' && c!='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(c-'0')+UNIT.charAt(0);//0010
		else if(a=='0' && b=='0' && c!='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0011
		else if(a=='0' && b!='0' && c=='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1);//0100
		else if(a=='0' && b!='0' && c=='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//0101
		else if(a=='0' && b!='0' && c!='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//0110
		else if(a=='0' && b!='0' && c!='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0111
		else if(a!='0' && b=='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2);//1000
		else if(a!='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(d-'0');//1001
		else if(a!='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0);//1010
		else if(a!='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//1011
		else if(a!='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1);//1100
		else if(a!='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//1101
		else if(a!='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//1110
		else if(a!='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//1111
		else return "Error!!!";//不是上述16種情況則返回錯誤資訊
	}
	
	//四位數不讀0的情況,不足四位補0補夠四位,形參一定是長度為4的字串,不足四位,用前導0先補齊再作為形參
	public static String not_read_0(String s){
		char a=s.charAt(0);
		char b=s.charAt(1);
		char c=s.charAt(2);
		char d=s.charAt(3);
		if(s.equals("0000")) return ""+HAN.charAt(0);//0000
		else if(a=='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(d-'0');//0001
		else if(a=='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(c-'0')+UNIT.charAt(0);//0010
		else if(a=='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0011
		else if(a=='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1);//0100
		else if(a=='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//0101
		else if(a=='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//0110
		else if(a=='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0111
		else if(a!='0' && b=='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2);//1000
		else if(a!='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(d-'0');//1001
		else if(a!='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0);//1010
		else if(a!='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//1011
		else if(a!='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1);//1100
		else if(a!='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//1101
		else if(a!='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//1110
		else if(a!='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//1111
		else return "Error!!!";//不是上述16種情況則返回錯誤資訊
	}
	
	//小數部分處理,小數最多兩位,不足則補足兩位,直接類似上面分情況傻瓜便捷式分類
	public static String read_decimal(String s){
		char a=s.charAt(0);
		char b=s.charAt(1);
		return HAN.charAt(a-'0')+"角"+HAN.charAt(b-'0')+"分";
	}
	
	//把浮點數劈出整數部分
	public static String split_to_integer(String s){
		int mark=s.length();//標記小數點位置
		String integer="";
		
		//尋找小數點位置
		for(int i=0;i<s.length();i++){
			if(s.charAt(i)=='.'){
				mark=i;
				break;
			}
		}
		
		
		//分離出整數部分賦給integer
		for(int i=0;i<mark;i++){
			integer+=s.charAt(i);
		}
		
		return integer;
	}
	
	//把浮點數劈出小數部分
	public static String split_to_decimal(String s){
		int mark=s.length();//標記小數點位置
		String decimal="";
		//尋找小數點位置
		for(int i=0;i<s.length();i++){
			if(s.charAt(i)=='.'){
				mark=i;
				break;
			}
		}
		
		//分離出小數部分給decimal
		for(int i=mark+1;i<s.length();i++){
			decimal+=s.charAt(i);
		}
		
		//小數部分規範化為2位
		if(decimal.length()==0) decimal="00";
		else if(decimal.length()==1) decimal+='0';
		
		return decimal;
	}
	
	//獲取整數高四位
	public static String get_high_4(String s){
		String high_4="";
		if(s.length()<=4) return "";
		else{
			for(int i=0;i<s.length()-4;i++){
				high_4+=s.charAt(i);
			}
			
			
			//高四位不足4位補足4位
			int len=high_4.length();//一定要加上這一句,下面i的範圍不能直接用high_4.length(),因為這是變的
			for(int i=0;i<4-len;i++){
				high_4='0'+high_4;
			}
			
			return high_4;
		}
	}
	
	//獲取整數低四位
	public static String get_low_4(String s){
		String low_4="";
		if(s.length()>=4){
			for(int i=s.length()-4;i<s.length();i++)
				low_4+=s.charAt(i);
		}
		else{
			for(int i=0;i<s.length();i++)
				low_4+=s.charAt(i);
			
			for(int i=0;i<4-s.length();i++)
				low_4='0'+low_4;
		}
		return low_4;
	}

	
	
	//解決本問題,讀出人民幣漢語來
	public static void solve(String s){
		String integer="",high_4="",low_4="",decimal="",read_high_4="",read_low_4="",read_decim="";
	
		integer=split_to_integer(s);	//System.out.println(integer);
		decimal=split_to_decimal(s);
		read_decim=read_decimal(decimal);
		low_4=get_low_4(integer);	//System.out.println(low_4);
		high_4=get_high_4(integer);	//System.out.println(high_4);
		
		if(high_4.equals("")){
			read_low_4=not_read_0(low_4);	
			System.out.println(read_low_4+"元"+read_decim);
		}
		else{
			read_low_4=read_0(low_4);
			read_high_4=not_read_0(high_4); 
			System.out.println(read_high_4+"萬"+read_low_4+"元"+read_decim);
		}
	}
}

相關推薦

瘋狂Java講義4》-----4習題解答

【練習1】九九乘法表 public class Multiplication_table { public static void main(String[]args){ for(int i=1;i<=9;i++){ for(int j=1

瘋狂Java講義4》-----2UML

UML(Unified Modeling Language) PowerDesigner16.5建模工具提供了UML的如下12種圖 一、Use Case Diagram(用例圖) 用例圖用於描述系統

瘋狂Java講義4》-----3資料型別與運算子

Java的官方API下載 Java語言是一門強型別語言。強型別含義: 所有變數必須先宣告,後使用; 指定型別的變數只能接受型別與之匹配的值 註釋 //單行註釋 /* 多行註釋 */ /** *文件註釋 */ 識別符號 字母、下劃線、美元符號、數字組成。字

瘋狂Java講義4》-----4流程控制與陣列

Java7增強後的switch語句 switch後的控制表示式只能是byte、short、char、int、列舉型別和java.lang.String型別。 char c = 'A'; switch(c){ case 'A': System.out.pri

瘋狂Java講義4》-----6面向物件命令模式、Lambda、列舉類、垃圾回收、jar

命令模式 命令模式,參考下面程式碼,就能領悟到,想做出怎樣的處理,就怎麼去覆蓋介面中的抽象方法!下面程式碼中介面Command中定義一個對陣列處理的方法,但沒說怎麼處理(畢竟是抽象方法嘛),然後讓其他類來實現這個介面,順便實現這個介面的方法,他們按照何種方式實現

瘋狂Java講義4》-----7Java基礎類庫

筆者認為,《瘋狂Java講義(第4版)》這本書的前6章是Java語言的核心,前4章是結構化程式設計的核心,第5章和第6章是Java面向物件的核心。從第七章開始,都是在這些核心基礎知識上的擴充套件了,很多內容可以先熟悉一遍即可,用的時候多查本書以及多檢視官方文件即

瘋狂Java講義4》-----8Java集合Collection、Iterator、Set

Java集合概述 Java集合本身是封裝的幾種常見的資料結構,只要學習過基本的資料結構課程,便可理解清楚底層的實現細節。由於Java提供封裝好的集合眾多,每個集合暴露的方法眾多,一般記住常用的,其他的知道有就行了,用的時候查詢官方API即可。 Java集合裡存放

瘋狂Java講義4》-----8Java集合Map、Collections

Map import java.util.Map; import java.util.HashMap; public class Hello{ public static void main(String[] args){ Map map = new

瘋狂Java講義4》-----10異常處理

異常處理可以提高程式的健壯性、呈現功能給使用者更加友好。Java異常機制主要關鍵字:try、catch、finally、throw、throws。throws關鍵字在宣告方法時候使用,用於宣告該方法可能丟擲的異常。而throw關鍵字用於丟擲一個實際的異常。Jav

瘋狂Java講義4》-----11AWT程式設計AWT常用元件、事件處理

AWT常用元件 雖說是常用元件,如果不經常使用,還是比較陌生的!!!暫且根據書本列出來一些,先結合書上例項認識之,待之後結合實際案例選擇用之、研究之(參看官方API)! Button Canvas(用於繪圖的畫布) Checkbox CheckboxGroup(

瘋狂Java講義4》-----18類的載入機制與反射

JVM程序終止的情況 程式執行到最後正常結束 程式執行到System.exit()或Runtime.getRuntime().exit() 程式執行過程中遇到未捕獲的異常或錯誤而結束 程式所在平臺強制結束了JVM程序 類的載入 下圖摘自《深入理

瘋狂Java講義4》-----16多執行緒執行緒通訊、執行緒池

執行緒通訊 傳統的執行緒通訊 用synchonized同步的情況下,可以使用Object的三個方法: wait():釋放同步監視器,直到其他執行緒呼叫該同步監視器的notify()或notifyAll()方法 notify():喚醒此同步監視器上等待的單個執行緒

瘋狂Java講義4》-----16多執行緒控制執行緒、執行緒同步

控制執行緒 join執行緒 等那個執行緒做完後,當前執行緒再做! import java.lang.Thread; public class MyThread extends Thread{ public MyThread(String name){ super(

瘋狂Java講義4》-----16多執行緒執行緒的建立及生命週期

執行緒的獨立執行的,他並不知道程序是否還有其他執行緒存在 當作業系統建立一個程序時,必須為該程序分配獨立的記憶體空間,並分配大量的相關資源;但建立一個執行緒則簡單得多,因此使用多執行緒來實現併發比使用多程序實現併發的效能要高得多 多執行緒是非常有用的,一個瀏覽器必須能

瘋狂Java講義4》-----1Java語言概述與開發環境

編譯型語言和解釋型語言 編譯型語言:程式在執行之前需要一個專門的編譯過程,把程式編譯成 為機器語言的檔案,執行時不需要重新翻譯,直接使用編譯的結果就行了。程式執行效率高,依賴編譯器(翻譯成的是特定平臺的機器語言,要是跨平臺還是需要拷貝原始碼再重新編譯),跨

瘋狂Java講義4》-----9泛型

把物件放入Java集合中,編譯的時候都會當成Object型別(執行時還是原來的實際型別),各種物件都可以放入集合,但是帶來的問題是從集合中取物件的時候可能要進行強制型別轉換了。如果集合中放了各種物件,特別是集合元素沒有順序的話,程式設計師只知道當初放進去很多型別

瘋狂Java講義4》-----6面向物件內部類

內部類 內部類就是定義在類內部的類,可以 是成員內部類(類的第五種成員,分為靜態內部類和非靜態內部類),也可以定義在方法內部(區域性內部類)。宿主類不能訪問內部類的成員。可以通過”靜態內部類名.靜態內部類靜態成員“和”內部類物件.內部類成員“來訪問 非靜態內部類

Java 從入門到精通45 字串

開始講解之前,先列出本章的提綱,如下圖所示: 5.1 String類 5.1.1 宣告字串 String str; 5.1.2 建立字串 String str1 = new String("student"); System.out.println(str1); char

Java程式設計題解與上機指導 Java語言的高階特性 7.2藉助泛型定義一個線性表

線性表:由相同型別的物件組成的一個線性結構360百科: 定義 線性表(linear list)是資料結構的一種,一個線性表是n個具有相同特性的資料元素的有限序列。資料元素是一個抽象的符號,其具體含義在不同的情況下一般不同。 在稍複雜的線性表中,一個數據元素可由多個數據項(

JAVA 程式設計題解與上機指導表達式和流程控制語句 題3.9

/**3.9編寫列印乘法口訣表*/ public class MultipleTable { public static void main(String args[]) {MultipleTable multiple=new MultipleTable(); int n=