第四章 數學函數、字符和字符串


課本筆記 第四章

4.1 引言

  • 本章重點介紹數學函數、字符和字符串對象,並使用它們來開發程序
  • 前面章節介紹了基礎編程技術,以及如何使用選擇語句編寫簡單的程序來解決一些基本問題。本章介紹實現常用數學操作的方法。你將在第6章學到如何創建自定義方法
  • 假設你需要估算被四座城市包圍的區域的面積,給定這些城市的GPS位置(經緯度),如下圖所示。如何編寫程序來求解這個問題?在學完本章后,你將可以編寫這樣的程序。
  • 因為字符串在編程中經常要用到,所以盡早介紹字符串從而開始使用它們來編寫使用的程序是有裨益的。本章還給出了字符串對象的簡要介紹,你將在第9章和第10章進一步學習對象和字符串的相關知識。

4.2 常用數學函數

  • Java在Math類中提供了許多實用的方法,來計算常用的數學函數。

  • 方法是一組語句,用於執行一個特定的任務。在2.9.4節中我們已經使用過方法pow(a,b)來計算ab ,在3.7節中也使用過random()方法來產生一個隨機數。本節介紹Math類中其他的有用方法。這些方法分為三類:

    • 三角函數方法(trigonometric method)
    • 指數函數方法(exponent method)
    • 服務方法(service method)
      • 取整
      • 求最小值
      • 求最大值
      • 求絕對值
      • 隨機方法
  • 除了這些方法之外,Math類還提供了兩個很有用的double型常量,PI( π )和E(自然對數的底)。可以在任意程序中用Math.PI和Math.E來使用這兩個常量

4.2.1 三角函數方法

  • Math類包含表4-1中所示的三角函數方法。
表 4-1 Math類中的三角函數方法
方法 描述
sin(radians) 返回以弧度為單位的角度的三角正弦函數值
cos(radians) 返回以弧度為單位的角度的三角余弦函數值
tan(radians) 返回以弧度為單位的角度的三角正切函數值
toRadians(degree) 將以度為單位的角度值轉換為以弧度表示
toDegrees(radians) 將以弧度為單位的角度值轉換為以度表示
asin(a) 返回以弧度為單位的角度的反三角正弦函數值
acos(a) 返回以弧度為單位的角度的反三角余弦函數值
atan(a) 返回以弧度為單位的角度的反三角正切函數值
  • sin、cos和tan的參數都是以弧度為單位的角度。asin和atan的返回值是 -π/2 ~ π/2的一個弧度制,acos的返回值在0到π之間。1°相當於π/180弧度,90°相當於π/2弧度,而30°相當於π/6弧度

4.2.2 指數函數方法

  • Math類中有5個與指數函數有關的方法,如表4-2所示
表 4-2 Math類中的指數函數方法
方法 描述
exp(x) 返回e的x次方(ex
log(x) 返回x的自然對數(lnx = loge x)
log10(x) 返回x的以10為底的對數(log10 x)
pow(a,b) 返回a的b次方(ab
sqrt(x) 對於x ≥ 0的數字,返回x的平方根(\(\sqrt x\)

4.2.3 取整方法

  • Math類包括四個取整方法,如表4-3所示
表 4-3 Math類中的取整方法
方法 描述
ceil(x) x向上取整為它最接近的整數。該整數作為一個雙精度值返回
floor(x) x向下取整為它最接近的整數。該整數作為一個雙精度值返回
rint(x) x取整為它最接近的整數。如果x與兩個整數的距離相等,偶數的整數作為一個雙精度值返回
round(x) 如果x是單精度數,返回(int)Math.floor(x+0.5);如果x是雙精度數,返回(long)Math.floor(x+0.5)

4.2.4 min、max和abs方法

4.2.5 random方法

4.2.6 示例學習:計算三角形的角度

  • 給定一個三角形的三邊,可以通過以下公式計算角度
A = acos((a * a - b * b - c * c) / (-2 * b * c))
B = acos((b * b - a * a - c * c) / (-2 * a * c))
C = acos((c * c - b * b - a * a) / (-2 * a * b))

程序清單4-1是一個示例程序,提示用戶輸入三角形三個頂點的x和y坐標值,然后三個角。

程序清單 4-1 ComputeAngles.java

import java.util.Scanner;

public class ComputeAngles {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        //Prompt the user to enter three points
        System.out.print("Enter three points: ");
        double x1 = input.nextDouble();double y1 = input.nextDouble();
        double x2 = input.nextDouble();double y2 = input.nextDouble();
        double x3 = input.nextDouble();double y3 = input.nextDouble();

        //Compute three sides
        double a = Math.sqrt(Math.pow(x2 - x3, 2) + Math.pow(y2 - y3, 2));
        double b = Math.sqrt(Math.pow(x3 - x1, 2) + Math.pow(y3 - y1, 2));
        double c = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));

        //Compute three angle
        double A = Math.toDegrees(Math.acos((a * a - b * b - c * c) / (-2 * b * c)));
        double B = Math.toDegrees(Math.acos((b * b - a * a - c * c) / (-2 * a * c)));
        double C = Math.toDegrees(Math.acos((c * c - b * b - a * a) / (-2 * a * b)));

        //Display results
        System.out.println("The three angles are: " +
                Math.round(A * 100) / 100.0 + " " +
                Math.round(B * 100) / 100.0 + " " +
                Math.round(C * 100) / 100.0);
    }
}
  • 程序提示用戶輸入三個頂點(第8行)。這個提示消息並不是很清晰,應該給予用戶非常清晰的提示,如下所示:
System.out.print("Enter the coordinates of three points separated" + "by spaces like x1 y1 x2 y2 x3 y3: ");
  • 注意,兩個點(x1,y1),(x2,y2)之間的距離可以通過公式\(\sqrt(x_2 - x_1)^2 + (y_2 - y_1)^2)\)計算。程序計算兩個點之間的距離,並且應用該公式來計算角度。的角度值保留小數點后兩位數字。
  • Math類在程序中使用,但是並沒有導入,因為它在java.lang包中。在一個Java程序中,java.lang包中的所有類是隱式導入的。

4.3 字符數據類型和操作

  • 字符數據類型用於表示單個字符

  • 除了處理數值之外,Java還可以處理字符。字符數據類型char用於表示單個字符。字符型字面值用單引號括住。考慮以下代碼:

    char letter = 'A';
    char numChar = '4';
    

    第一條語句將字符A賦值給char型變量letter。第二條語句將數字字符4賦值給char型變量numChar

  • 字符串字面值必須括在雙引號中。而字符字面值是括在單引號中的單個字符。因此,"A"是一個字符串,而'A'是一個字符。

4.3.1 Unicode 和 ASCII碼

  • 計算機內部使用二進制數。一個字符在計算機中是以0和1構成的序列的形式來存儲的。將字符映射到它的二進制形式的過程稱為編碼(encoding)。字符有多種不同的編程方式,編碼表(encoding scheme)定義該如何編碼每個字符。
  • Java支持Unicode碼,Unicode碼是由Unicode協會建立的一種編碼方案,它支持使用世界各種語言所書寫的文本的交換、處理和顯示。Unicode一開始被設計為16位的字符編碼。基本數據類型char試圖通過提供一種能夠存放任意字符的簡單數據類型來利用這個設計。但是。一個16位的編碼所能產生的字符只有65536個,它是不足以表示全世界所有字符的。因此Unicode標准被擴展位1 112 064個字符。這些字符都遠遠超過了原來16位的限制,它們稱為補充字符(supplementary character)。Java支持這些補充字符。對補充字符的處理和表示介紹超過了本書的范圍。為了簡化問題,本書只考慮原來的16位Unicode字符。這些字符都可以存儲在一個char型變量中。
  • 一個16位Unicode占兩個字節,用以\u開頭的4位十六進制數表示,范圍從'\u0000''\uFFFF'。關於十六進制數字的更多內容請參見附錄F。例如:welcome被翻譯成中文需要兩個字符”歡迎“。這兩個字符的Unicode為\u6B22\u8FCE。希臘字母 α β γ 的Unicode是\u03b1\u03b2\u03b3
  • 大多數計算機采用ASCII(美國標准信息交換碼: American Standard Code for Information Interchange ),它是表示所有大小寫字母、數字、標點符號和控制字符的8位編碼表。Unicode碼包括ASCII碼,從'\u0000''\u007F'對應128個ASCII字符。表4-4給出了一些常用字符的ASCII碼。附錄B給出了ASCII字符的完整清單,以及它們的十進制和十六進制編碼。
表 4-4 常用字符的ASCII碼
字符 十進制編碼值 Unicode值
'0' ~ '9' 48 ~ 57 \u0030 ~ \u0039
'A' ~ 'Z' 65 ~ 90 \u0041 ~ \u005A
'a' ~ 'z' 97 ~ 122 \u0061 ~ \u007A
  • Java程序中,可以使用像'X'、'1'和'$'這樣的ASCII字符,也可以使用Unicode碼。例如,下面的語句是等價的:

    char letter = 'A';
    char letter = '\u0041'; // Character A's Unicode is 0041
    
  • 兩條語句都將字符A賦值給char型變量letter。

  • 自增和自減操作符也可用在char型變量上,這會得到該字符之前或之后的Unicode字符。例如,下面的語句顯示字符b。

    char ch = 'a';
    System.out.println(++ch);
    

4.3.2 特殊字符的轉義序列

  • 假如你想在輸出時顯示如下帶引號的信息,你能編寫如下所示的這條語句嗎?

    System.out.println("He said "Java is fun"");
    
  • 答案是不能,這條語句有語法錯誤。編譯器會認為第二個引號字符就是這個字符串的結束標志,從而不知道該如何處理剩余的字符。

  • 為了解決這個問題,Java定義了一種特殊的標記來表示特殊字符,如表4-5所示。這種標記稱為轉義序列,轉義序列由反斜杠(\)后面加上一個字符或者一些數字位組成,比如,\t是一個表示Tab字符的轉義符,而諸如\03b1的轉義符用於表示一個Unicode。轉義序列中的符號作為一個整體翻譯,而不是分開翻譯。一個轉義序列被當作一個字符。

  • 所以,現在我們可以使用下面的語句輸出帶引號的消息:

    System.out.println("He said \"Java is fun\"");
    
  • 它的輸出是:

    He said "Java is fun"
    

    注意,符號\和""一起代表一個字符

表 4-5 轉義序列
轉義序列 名稱 Unicode碼 十進制值
\b 退格鍵 \u0008 8
\t Tab鍵 \u0009 9
\n 換行符 \u000A 10
\f 換頁符 \u000C 12
\r 回車符 \u000D 13
\ 反斜杠 \u005C 92
\" 雙引號 \u0022 34
  • 反斜杠\被稱為轉義字符。它是一個特殊字符。要顯示這個字符,需要使用轉義序列\\。比如,下面的代碼

    System.out.println("\\t is a tab character");
    

    顯示

    \t is a tab character
    

4.3.3 字符型數據與數值型數據之間的轉換

  • char型數據可以轉換成任意一種數值類型,反之亦然。將整數轉換成char型數據時,只用到該數據的低十六位,其余部分都被忽略。例如:
//Note a hex integer is written using prefix OX
char ch = (char)0XAB0041;  //The lower 16 bits hex code 0041 is assigned to ch
System.out.println(ch);    //ch is character A
  • 要將一個浮點值轉換成char型時,首先將浮點值轉換成int型,然后將這個整型值轉換位char型。
char ch = (char)65.25;     //Decimal 65 is assigned to ch
System.out.println(ch);    //ch is character A
  • 當一個char型數據轉換成數值型時,這個字符的Unicode就被轉換成某個指定的數值類型。
int i = (int)'A';          //The Unicode of character A is assigned to i
System.out.println(i);     //i is 65
  • 如果轉換結果適用於目標變量,就可以使用隱式轉換方式;否則,必須使用顯式轉換方式。例如,因為'a'的Unicode是97,它在一個字節的范圍內,所以以下賦值就可以使用隱式轉換方式

    byte b = 'a';
    int i = 'a';
    
  • 但是,因為Unicode碼\uFFF4超過了一個字節的范圍,所以下面的轉換就是不正確的:

    byte b = '\uFFF4';
    
  • 為了強制賦值,就必須使用顯式轉換,如下所示

    byte b = (byte)'\uFFF4';
    
  • 0 ~ FFFF 的任何一個十六進制正整數都可以隱式地轉換成字符型數據。而不在此范圍內的任何其他數值都必須顯式地轉換為char型

  • 所有數值操作符都可以用在char型操作數上。如果另一個操作數是一個數字或字符,那么char型操作數就會被自動轉換成一個數字。如果另一個操作數是一個字符串,字符就會與該字符串相連。例如,下面的語句:

    int i = '2' + '3'; //(int)'2' is 50 and (int)'3' is 51
    System.out.println("i is " + i); //i is 101
    int j = 2 + 'a'; //(int)'a' is 97
    System.out.println("j is " + j); //j is 99
    System.out.println(j + "is the Unicode for character " + (char)j); 
    //99 is the Unicode for character c
    System.out.println("Chapter " + '2');
    
  • 顯示結果

    i is 101
    j is 99
    99 is the Unicode for character c
    Chapter 2
    

4.3.4 字符的比較和測試

  • 兩個字符可以使用關系操作符進行比較,如同比較兩個數字一樣。這是通過比較兩個字符的Unicode值實現的。比如:

  • 'a' < 'b'為true,因為'a'(97)的Unicode值比'b'(98)的Unicode值小

  • 程序中經常需要測試一個字符的數字、字母;大寫字母,還是小寫字母。如附錄B的ASCII字符集所示,小寫字母的Unicode是連續的整數,從'a'的Unicode開始,然后是'b'、'c'、....,'z'。同理,對於大寫字母和數字字符也是這樣。這個特征可以用於編寫測試字符的編碼。比如下列代碼測試字符ch是大寫字母、小寫字母還是數字字符。

    if (ch >= 'A' && ch <= 'Z')
    	System.out.println(ch + " is an uppercase letter");
    else if (ch >= 'a' && ch <= 'z')
        System.out.println(ch + " is a lowercase letter");
    else if (ch >= '0' && ch <= '9')
        System.out.println(ch + " is a numeric character");
    
表 4-6 Character類中的方法
方法 描述
isDigit(ch) 如果指定的字符是一個數字,返回true
isLetter(ch) 如果指定的字符是一個字母,返回true
isLetterOrDigit(ch) 如果指定的字符是一個字母或者數字,返回true
isLowerCase(ch) 如果指定的字符是一個小寫字母,返回true
isUpperCase(ch) 如果指定的字符是一個大寫字母,返回true
toLowerCase(ch) 返回指定的字符的小寫形式
toUpperCase(ch) 返回指定的字符的大寫形式

4.4 String類型

  • 字符串是一個字符序列
表4-7 String對象的簡單方法
方法 描述
length() 返回字符串中的字符數
charAt(index) 返回字符串中指定位置的字符
concat(s1) 將本字符串和字符串s1連接,返回一個新字符串
toUpperCase() 返回一個新字符串,其中所有的字母大寫
toLowerCase() 返回一個新字符串,其中所有的字母小寫
trim() 返回一個新字符串,去掉了兩邊的空白字符
  • String是Java中的對象。表4-7中的方法只能從一個特定的字符串實例來調用。由於這個原因,這些方法稱為實例方法。非實例方法稱為靜態方法。靜態方法可以不使用對象來調用。定義在Math類中的所有方法都是靜態方法。它們沒有綁定到一個特定的對象實例上。調用一個實例方法的語法是reference - Variable.methodName(arguments)。一個方法可以由多個參數,或者沒有參數。例如,charAt(index)方法具有一個參數,但是length()方法則沒有參數。回顧曾經介紹過的,調用靜態方法的語法是ClassName.methodName(arguments)。例如,Math類中的pow方法可以使用Math.pow(2,2.5)來調用

4.4.1 獲取字符串長度

  • 可以調用字符串的length()方法獲取它的長度。例如下面的代碼

    String message = "Welcome to Java";
    System.out.println("The length of " + message + " is " + message.length());
    
  • 顯示

    The length of Welcome to Java is 15
    
  • 使用一個字符串時,往往是知道它的字面值的。為方便起見,Java允許在不創建新變量的情況下,使用字符串字面值直接引用字符串。這樣,"Welcome to Java".length()是正確的,它返回15。注意,""表示空字符串,並且"".length()為0.

4.4.2 從字符串中獲取字符

  • 在字符串s中越界訪問字符是一種常見的程序設計錯誤。為了避免此類錯誤,要確保使用的下標不會超過s.length() -1 。例如,s.charAt(s.length())會造成一個StringIndexOutOfBoundsException異常。

4.4.3 連接字符串

4.4.4 字符串轉換

4.4.5 從控制台讀取字符串

  • next()方法讀取以空白字符結束的字符串(即''、'\t'、'\f'、'\r'或'\n')可以使用nextLine()方法讀取一整行文本。nextLine()方法讀取以按下回車鍵為結束標志的字符串。例如,下面的語句讀取一行文本

    Scanner input = new Scanner(System.in);
    System.out.println("Enter a line: ");
    String s = input.nextLine();
    System.out.println("The line entered is " + s);
    
  • 為了方便,將使用方法next()、nextByte()、nextShort()、nextInt()、nextLong()、nextFloat()和nextDouble()的輸入稱為基於標記的輸入,因為它們讀取采用空白字符分隔的單個元素,而不是讀取整行。nextLine()方法稱為基於行的輸入。

  • 為了避免輸入錯誤,程序中不要在基於標記的輸入之后使用基於行的輸入,原因將在12.11.4節中解釋

4.4.6 從控制台讀取字符

4.4.7 字符串比較

  • String類提供了如表4-8所示的方法,用於比較兩個字符串。
表4-8 String對象的比較方法
方法 描述
equals(s1) 如果該字符串等於字符串s1,返回true
equalsIgnoreCase(s1) 如果該字符串等於字符串s1,返回true,不區分大小寫
compareTo(s1) 返回一個大於0、等於0、小於0的整數,表明該字符串是否大於、等於或者小於s1
compareToIgnoreCase(s1) 和compareTo一樣,除了比較是不區分大小寫的外
startsWith(suffix) 如果字符串以特定的前綴開始,返回true
endWith(suffix) 如果字符串以特定的后綴結束,返回true
contains(s1) 如果s1是該字符串的子字符串,返回true
  • 如果使用像>、≥、<或≤這樣的比較操作符比較兩個字符串,就會發生語法錯誤。替代的方法就是使用s1.compareTo(s2)來進行比較
  • 如果兩個字符串相等,equals方法返回true;如果它們不等,方法返回false。compareTo方法會根據一個字符串是否等於、大於或小於另一個字符串,分別返回0、正整數或負整數。

程序清單 4-2 OrdeTwoCities.java

import java.util.Scanner;

public class OrdeTwoCities {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        //Prompt the user to enter two cities
        System.out.print("Enter the first city: ");
        String city1 = input.nextLine();
        System.out.print("Enter the second city");
        String city2 = input.nextLine();

        if (city1.compareTo(city2) < 0) {
            System.out.println("The cities in alphabetical order are " +
                    city1 + " " + city2);
        } else {
            System.out.println("The cities in alphabetical order are " +
                    city2 + " " + city1);
        }
    }
}

4.4.8 獲得子字符串

表4-9 String類包含的獲取子串的方法
方法 描述
substring(beginIndex) 返回該字符串的子串,從指定位置beginIndex的字符開始到字符串的結尾,如圖4-2所示
substring(beginIndex, endIndex) 返回該字符串的子串,從指定位置beginIndex的字符開始到下標為endIndex -1 的字符,如圖4-2所示。注意,位於endIndex位置的字符不屬於該子字符串的一部分
  • 如果beginIndex為endIndex,substring(beginIndex, endIndex)返回一個長度為0的空字符串。如果beginIndex > endIndex,將發生運行時錯誤。

4.4.9 獲取字符串中的字符或者子串

  • String類提供了幾個版本的indexOf和lastIndexOf方法,它們可以在字符串中找出一個字符或一個子串,如表4-10所示
表4-10 String類包含獲取子串的方法
方法 描述
indexOf(ch) 返回字符串中出現的第一個ch的下標。如果沒有匹配的,返回-1
indexOf(ch,fromIndex) 返回字符串中fromIndex之后出現的第一個ch的下標。如果沒有匹配的,返回-1
indexOf(s) 返回字符串中出現的第一個字符串s的下標。如果沒有匹配的,返回-1
indexOf(s, fromIndex) 返回字符串中fromIndex之后出現的第一個字符串s的下標。如果沒有匹配的,返回-1
lastIndexOf(ch) 返回字符串中出現的最后一個ch的下標。如果沒有匹配的,返回-1
lastIndexOf(ch,fromIndex) 返回字符串中fromIndex之前出現的最后一個ch的下標。如果沒有匹配的,返回-1
lastIndexOf(s) 返回字符串中出現的最后一個字符串s的下標。如果沒有匹配的,返回-1
lastIndexOf(s,fromIndex) 返回字符串中fromIndex之前出現的最后一個字符串s的下標。如果沒有匹配的,返回-1

4.4.10 字符串和數字間的轉換

4.5 示例學習

4.5.1 猜測生日

程序清單 4-3 GuessBirthday.java

import java.util.Scanner;

public class GuessBirthday {
    public static void main(String[] args) {
        String set1 = " 1 3 5 7\n" +
                " 9 11 13 15\n" +
                "17 19 21 23\n" +
                "25 27 29 31";
        String set2 = " 2 3 6 7\n" +
                "10 11 14 15\n" +
                "18 19 22 23\n" +
                "26 27 30 31";
        String set3 = " 4 5 6 7\n" +
                "12 13 14 15\n" +
                "20 21 22 23\n" +
                "28 29 30 31";
        String set4 = " 8 9 10 11\n" +
                "12 13 14 15\n" +
                "24 25 26 27\n" +
                "28 29 30 31";
        String set5 = "16 17 18 19\n" +
                "20 21 22 23\n" +
                "24 25 26 27\n" +
                "28 29 30 31";
        int day = 0;
        //Create a Scanner
        Scanner input = new Scanner(System.in);

        //Prompt the user to answer questions
        System.out.print("\nIs your birthday in Set1?\n");
        System.out.print(set1);
        System.out.print("\nEnter 0 for No and 1 for Yes: ");
        int answer = input.nextInt();

        if (answer == 1){
            day += 1;
        }

        //Prompt the user to answer questions
        System.out.print("\nIs your birthday in Set2?\n");
        System.out.print(set2);
        System.out.print("\nEnter 0 for No and 1 for Yes: ");
        answer = input.nextInt();

        if (answer == 1) {
            day += 2;
        }
        //Prompt the user to answer questions
        System.out.print("\nIs your birthday in Set3?\n");
        System.out.print(set3);
        System.out.print("\nEnter 0 for No and 1 for Yes: ");
        answer = input.nextInt();

        if (answer == 1) {
            day += 4;
        }
        //Prompt the user to answer questions
        System.out.print("\nIs your birthday in Set4?\n");
        System.out.print(set4);
        System.out.print("\nEnter 0 for No and 1 for Yes: ");
        answer = input.nextInt();

        if (answer == 1) {
            day += 8;
        }
        //Prompt the user to answer questions
        System.out.print("\nIs your birthday in Set5?\n");
        System.out.print(set5);
        System.out.print("\nEnter 0 for No and 1 for Yes: ");
        answer = input.nextInt();

        if (answer == 1) {
            day += 16;
        }
        System.out.println("\nYour birthday is " + day + "!");
    }
}

4.5.2 將十六進制數轉換為十進制數

程序清單 4-4 HexDigit2Dec.java

import java.util.Scanner;

public class HexDigit2Dec {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a hex digit: ");
        String hexString = input.nextLine();

        //Check if the hex string has exactly one character
        if (hexString.length() != 1) {
            System.out.println("You must enter exactly one character");
            System.exit(1);
        }

        //Display decimal value for the hex digit
        char ch = Character.toUpperCase(hexString.charAt(0));
        if ('A' <= ch && ch <= 'F') {
            int value = ch - 'A' + 10;
            System.out.println("The decimal value for hex digit " +
                    ch + " is " + value);
        } else if (Character.isDigit(ch)) {
            System.out.println("The decimal value for hex digit " +
                    ch + " is " + ch);
        } else {
            System.out.println(ch + " is an invalid input");
        }
    }
}

4.5.3 使用字符串修改彩票程序

程序清單 4-5 LotteryUsingStrings.java

import java.util.Scanner;

public class LotteryUsingStrings {
    public static void main(String[] args) {
        //Generate a lottery as a two-digit string
        String lottery = "" + (int) (Math.random() * 10)
                + (int) (Math.random() * 10);

        //Prompt the user to enter a guess
        Scanner input = new Scanner(System.in);
        System.out.print("Enter your lottery pick(two digits");
        String guess = input.nextLine();

        //Get digits from lottery
        char lotteryDigit1 = lottery.charAt(0);
        char lotteryDigit2 = lottery.charAt(0);

        //Get digits from guess
        char guessDigit1 = guess.charAt(0);
        char guessDigit2 = guess.charAt(1);

        System.out.println("The lottery number is " + lottery);

        //Check the guess
        if (guess.equals(lottery)) {
            System.out.println("Exact match: you win $10,000");
        } else if (guessDigit2 == lotteryDigit1 && guessDigit1 == lotteryDigit2) {
            System.out.println("Match all digits: you win $3,000");
        } else if (guessDigit1 == lotteryDigit1 || guessDigit1 == lotteryDigit2
                || guessDigit2 == lotteryDigit1 || guessDigit2 == lotteryDigit2) {
            System.out.println("Match one digit: you win $1,000");
        } else {
            System.out.println("Sorry, no match");
        }
    }
}

4.6 格式化控制台輸出

  • 可以使用System.out.printf方法在控制台上顯示格式化輸出。
  • 格式限定符指定每項應該如何顯示。這里的項可以是數值、字符、布爾值或字符串。簡單的格式標識符是以百分號(%)開頭的轉換碼。表4-11列出了一些常用的簡單格式限定符
表4-11 常用的格式限定符
限定符 輸出 舉例 限定符 輸出 舉例
%b 布爾值 true或false %f 浮點數 45.460000
%c 字符 'a' %e 標准科學記數法形式的數 4.556 000e+01
%d 十進制整數 200 %s 字符串 "Java is cool"
表4-12 指定寬度和精度的例子
舉例 輸出
%5c 輸出字符並在這個字符條目前面加4個空格
%6b 輸出布爾值,在false值前加一個空格,在true值前加兩個空格
%5d 輸出整數項,寬度至少為5。如果該條目的數字位數小於5,就在數字前面加空格。如果該條目的位數大於5,則自動增加寬度
%10.2f 輸出的浮點數項的寬度至少為10,包括小數點和小數點后兩位數字。這樣,給小數點前分配了7位數字。如果該條目小數點前的位數小於7,就在數字前面加空格。如果該條目小數點前的位數大於7,則自動增加寬度
%10.2e 輸出的浮點數項的寬度至少為10,包括小數點、小數點后兩位數字和指數部分。如果按科學記數法顯示的數字位數小於10,就在數前加空格
%12s 輸出的字符串寬度至少為12個字符。如果該字符串條目小於12個字符。就在該字符串前加空格。如果該字符串條目多於12個字符,則自動增加寬度
  • 條目與格式標識符必須在類型上嚴格匹配。對應於格式標識符%f或%e的條目必須是浮點型值,例如: 是40.0而不能是40。因此,int型變量不能匹配%f或%e。可以使用%.2f來指定一個小數點后兩位的浮點數值,而使用%0.2f是不正確的。

  • 使用符號%來標記格式限定符,要在格式字符串里輸出字面值%,需要使用%%,例如,以下代碼

    System.out.printf("%.2f%%\n",75.234);
    
  • 顯示

    75.23%
    
  • 程序清單4-6 給出一個使用printf來顯示一個表格的程序。

程序清單 4-6 FormatDemo.java

public class FormatDemo {
    public static void main(String[] args) {
        //Display the header of the table
        System.out.printf("%-10s%-10s%-10s%-10s%-10s\n", "Degrees", "Radians", "Sine", "Cosine", "Tangent");

        //Display values for 30 degrees
        int degrees = 30;
        double radians = Math.toRadians(degrees);
        System.out.printf("%-10d%-10.4f%-10.4f%-10.4f%-10.4f\n",
                degrees, radians, Math.sin(radians), Math.cos(radians), Math.tan(radians));
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM