[Java1_06] Luyện Tập Java Cơ Bản

Bạn cần phải tự làm những bài tập này. Nếu có thắc mắc xin mời vô nhóm CodeLean để được giải đáp 😉

Tóm Tắt

1.  Getting Started Exercises

1.1  

HelloWorld

  1. Cài đặt JDK 
  2. Cài đặt IntelliJ IDEA
  3. Đăng ký license miễn phí với tài khoản mail education 
  4. Tham khảo chi tiết phần “Cài đặt môi trường phát triển ứng dụng Java”.
  5. Đọc “Java cho người mới bắt đầu”. Làm toàn bộ bài tập trong đó. 

1.2  

CheckPassFail

 (

if-else

)

Viết chương trình gọi là 

CheckPassFail

in ” 

PASS

” nếu 

int

biến ” 

mark

” lớn hơn hoặc bằng 

50

hoặc in ” 

FAIL

” nếu không. 

Chương trình sẽ luôn luôn in ra 

DONE 

trước khi thoát.

Gợi ý

Sử dụng 

>=

cho 

lớn hơn hoặc bằng

 so sánh.

 
public class CheckPassFail {   
   public static void main(String[] args) {   
      int mark = 49;    
      System.out.println("The mark is " + mark);
 
       
      if ( ...... ) {
         System.out.println( ...... );
      } else {
         System.out.println( ...... );
      }
      System.out.println( ...... );
   }
}

Cố gắng 

mark = 0

49

50

51

100

và xác minh kết quả của bạn.

Hãy lưu ý đến việc 

thụt

 mã nguồn 

!!! 

Bất cứ khi nào bạn mở một khối với 

'{'

, thụt lề tất cả các câu lệnh bên trong khối bằng 3 (hoặc 4 khoảng trắng). 

Khi khối kết thúc, bỏ thụt lề đóng 

'}'

để căn chỉnh với câu lệnh mở.


1.3  

CheckOddEven

 (

if-else

)

Viết chương trình gọi là 

CheckOddEven

bản in ” 

Odd Number

” nếu 

int

biến số 341 

number

là số lẻ, hoặc 

Even Number

khác. 

Chương trình sẽ luôn luôn in ra 

bye!

trước khi thoát.

Gợi ý

n

là số chẵn nếu 

là 

mặt khác, nó là một số lẻ 

Sử dụng 

để so sánh, ví dụ , 

.

(n % 2)

0

==

(n % 2) == 0


 
public class CheckOddEven {    
   public static void main(String[] args) {   
      int number = 49;        
      System.out.println("The number is " + number);
      if ( ...... ) {
         System.out.println( ...... ); 
      } else {
         System.out.println( ...... ); 
      }
      System.out.println( ...... );
   }
}

Hãy thử 

number = 0

1

88

99

-1

-2

và xác minh kết quả của bạn.

Một lần nữa, hãy lưu ý về việc xác định mã nguồn! 

Tạo thói quen tốt để xác định mã của bạn đúng cách, để dễ đọc chương trình của bạn.


1.4  

PrintNumberInWord

 (nested-

if

switch-case

)

Viết một chương trình gọi 

PrintNumberInWord

mà bản in ” 

ONE

“, ” 

TWO

“, …, ” 

NINE

“, ” 

OTHER

” nếu 

int

biến ” 

number

” là 

1

2

, …, 

9

, hoặc khác, tương ứng. 

Sử dụng (a) một 

if

câu lệnh ” 

lồng nhau 

“; 

(b) một 

switch-case-default

tuyên bố “”.

Gợi ý

 
public class PrintNumberInWord {    
   public static void main(String[] args) {
      int number = 5;   
 
       
      if (number == 1) {    
         System.out.println( ...... );
      } else if ( ...... ) {
         ......
      } else if ( ...... ) {
         ......
      ......
      ......
      } else {
         ......
      }
 
       
      switch(number) {
         case 1: 
            System.out.println( ...... ); break;   
         case 2: 
            System.out.println( ...... ); break;
         ......
         ......
         default: System.out.println( ...... ); 
      }
   }
}

Hãy thử 

number = 0

1

2

3

, …, 

9

10

và xác minh kết quả của bạn.

1.5  

PrintDayInWord

 (nested-

if

switch-case

)

Viết một chương trình gọi 

PrintDayInWord

mà bản in “ 

Sunday

”, “ 

Monday

”, … “ 

Saturday

” nếu 

int

biến ” 

dayNumber

” là 

0

1

, …, 

6

, tương ứng. 

Nếu không, nó sẽ in “Không phải là một ngày hợp lệ”. 

Sử dụng (a) một 

if

câu lệnh ” 

lồng nhau 

“; 

(b) một 

switch-case-default

tuyên bố “”.

Hãy thử 

dayNumber = 0

1

2

3

4

5

6

7

và xác minh kết quả của bạn.

2. Exercises on Number Systems (for Science/Engineering Students)

Để thành thạo lập trình, bạn cần có khả năng vận hành trên các hệ thống số này:

  1. Số thập phân (được sử dụng bởi con người cho đầu vào và đầu ra)

  2. Nhị phân (được sử dụng bởi máy tính để lưu trữ và xử lý)

  3. Hệ thập lục phân (dạng tốc ký hoặc dạng rút gọn cho nhị phân)

Đọc phần ” 

Hệ thống số

 ” của “Biểu diễn dữ liệu” và hoàn thành các bài tập.

3.  Writing Good Programs

Cách duy nhất để học lập trình là chương trình, chương trình và chương trình. 

Học lập trình cũng giống như học đạp xe, bơi lội hoặc bất kỳ môn thể thao nào khác. 

Bạn không thể học bằng cách xem hoặc đọc sách. 

Bắt đầu lập trình ngay lập tức. 

Mặt khác, để cải thiện chương trình của bạn, bạn cần đọc nhiều sách và nghiên cứu cách chương trình thạc sĩ.

Thật dễ dàng để viết các chương trình làm việc. 

Việc viết các chương trình không chỉ hiệu quả mà còn dễ duy trì và hiểu người khác – tôi gọi đây là những 

chương trình tốt

 . 

Trong thế giới thực, chương trình viết không có ý nghĩa. 

Bạn phải viết các chương trình tốt, để người khác có thể hiểu và duy trì các chương trình của bạn.

Đặc biệt chú ý đến:

  1. Kiểu mã hóa:

    • Đọc “Công ước mã Java” (@ 

      https://www.oracle.com/technetwork/java/codeconventions-150003.pdf

       hoặc google “Công ước mã Java”).

    • Thực hiện theo các 

      quy ước đặt tên Java

       cho các biến, phương thức và các lớp NGHIÊM TÚC. 

      Sử dụng 

      CamelCase

       cho tên. 

      Tên biến và tên phương thức bắt đầu bằng chữ thường, trong khi tên lớp bắt đầu bằng chữ hoa. 

      Sử dụng danh từ cho các biến (ví dụ 

      radius

      🙂 và tên lớp (ví dụ 

      Circle

      :). 

      Sử dụng động từ cho các phương thức (ví dụ 

      getArea()

      ,, 

      isEmpty()

      ).

    • Sử dụng tên có ý nghĩa

       : Đừng sử dụng những cái tên như 

      a

      b

      c

      d

      x

      x1

      x2

      , và 

      x1688

      – họ là vô nghĩa. 

      Tránh đơn bảng chữ cái tên thích 

      i

      j

      k

      Chúng rất dễ gõ, nhưng thường là vô nghĩa. 

      Sử dụng tên single-bảng chữ cái chỉ khi ý nghĩa của chúng là rõ ràng, ví dụ 

      x

      y

      z

      cho tọa độ và 

      i

      cho chỉ số mảng. 

      Sử dụng các tên có ý nghĩa như 

      row

      và 

      (thay vì 

      và 

      và 

      và 

      (không 

      (không 

      ) và 

      (không

      col

      x

      y

      i

      j

      x1

      x2

      numStudents

      n

      maxGrade

      size

      n

      upperbound

      n

      lần nữa). 

      Phân biệt giữa danh từ số ít và số nhiều (ví dụ: sử dụng 

      books

      cho một mảng sách và 

      book

      cho mỗi mục).

    • Sử dụng thụt đầu dòng nhất quán và phong cách mã hóa. 

      Nhiều IDE (như Eclipse / NetBeans) có thể định dạng lại mã nguồn của bạn chỉ bằng một cú nhấp chuột.

  2. Tài liệu chương trình: Nhận xét! 

    Bình luận! 

    và thêm Nhận xét để giải thích mã của bạn cho người khác và cho chính bạn ba ngày sau đó.

4.  Exercises on Decision and Loop

4.1  

SumAverageRunningInt

 (Decision & Loop)

Viết một chương trình gọi là 

SumAverageRunningInt

để sản xuất tổng 

1

2

3

, …, để 

100

Lưu trữ 

1

và 

100

trong các biến 

lowerbound

và 

upperbound

, để chúng ta có thể thay đổi giá trị của chúng một cách dễ dàng. 

Cũng tính toán và hiển thị trung bình. 

Đầu ra sẽ như sau:

The sum of 1 to 100 is 5050
The average is 50.5

Gợi ý

 
public class SumAverageRunningInt {    
   public static void main (String[] args) {
       
      int sum = 0;           
      double average;        
      int lowerbound = 1;
      int upperbound = 100;

             for (int number = lowerbound; number <= upperbound; ++number) {
             
         sum += number;      
      }
       
      ......
       
      ......
   }
}
Try
  1. Sửa đổi chương trình để sử dụng vòng lặp “while-do” thay vì vòng lặp “for”

    .

          int sum = 0;
          int number = lowerbound;         
          while (number <= upperbound) {   
             sum += number;
             ++number;                     
          }
  2. Sửa đổi chương trình để sử dụng vòng lặp “do-while”

    .

          int sum = 0;
          int number = lowerbound;          
          do {
             sum += number;
             ++number;                      
          } while (number <= upperbound);  
  3. Sự khác biệt giữa các vòng lặp “for” và “while-do” là gì? 

    Sự khác biệt giữa các vòng lặp “while-do” và “do-while” là g

  4. Sửa đổi chương trình để tổng hợp từ 

    111

    để 

    8899

    , và tính trung bình. 

    Giới thiệu một 

    int

    biến được gọi 

    count

    để đếm các số trong phạm vi chỉ định (sẽ được sử dụng trong tính toán trung bình).

          int count = 0;    
          for ( ...; ...; ... ) {
             ......
             ++count;
          }
  5. Sửa đổi chương trình để tìm “tổng bình phương” của tất cả các số từ 

    1

    đến 

    100

    , nghĩa là 

    1*1 + 2*2 + 3*3 + ... + 100*100

    .

  6. Sửa đổi chương trình để tạo ra hai tổng: tổng các số lẻ và tổng các số chẵn từ 

    1

    đến 

    100

    Ngoài ra máy tính khác biệt tuyệt đối của họ.

    HINTS:

    :

           
          int sumOdd  = 0;    
          int sumEven = 0;    
          int absDiff;        
          ......
           
          for (int number = ...; ...; ...) {
             if (......) {
                sumOdd += number;
             } else {
                sumEven += number;
             }
          }
           
          if (sumOdd > sumEven) {
             absDiff = ......;
          } else {
             absDiff = ......;
          }
           
          absDiff = (sumOdd > sumEven) ? ...... : ......;

4.2  

Product1ToN

 (or 

Factorial

) (Decision & Loop)

Viết chương trình được gọi 

Product1ToN

để tính tích của các số nguyên từ 

1

đến 

10

(nghĩa là 

1×2×3×...×10

), như một 

int

Hãy lưu ý rằng nó giống như giai thừa của 

N

.

Gợi ý

Khai báo một 

int

biến được gọi 

product

, khởi tạo thành 1, để tích lũy sản phẩm.

 
      int product = 1;       
      int lowerbound = 1;
      int upperbound = 10;

Thử

  1. Tính toán sản phẩm từ 

    1

    đến 

    11

    1

    đến 

    12

    1

    đến 

    13

    và 

    1

    đến 

    14

    Viết sản phẩm thu được và quyết định xem kết quả có đúng không.

    HINTS: Factorial of 

    13

    =6227020800

    ) nằm ngoài phạm vi của 

    int [-2147483648, 2147483647]

    Hãy lưu ý rằng các chương trình máy tính có thể không tạo ra kết quả chính xác mặc dù mã có vẻ đúng!

  2. Lặp lại ở trên, nhưng sử dụng 

    long

    để lưu trữ 

    product

    Hãy so sánh các sản phẩm thu được với 

    int

    cho 

    N=13

    và 

    N=14

    .

    HINTS: Với 

    long

    , bạn có thể lưu trữ giai thừa lên đến 

    20

    .

4.3  

HarmonicSum

 (Decision & Loop)

Viết chương trình được gọi 

HarmonicSum

để tính tổng của một chuỗi hài, như hình dưới đây, ở đâu 

n=50000

Chương trình sẽ tính tổng từ 

trái sang phải

 cũng như từ 

phải sang trái

 . 

Hai khoản tiền có giống nhau không? 

Có được sự khác biệt tuyệt đối giữa hai khoản tiền này và giải thích sự khác biệt. 

Tổng nào chính xác hơn?

ExerciseBasics_HarmonicSum.png

Hints
 
public class HarmonicSum {    
   public static void main (String[] args) {
       
      int maxDenominator = 50000;   
      double sumL2R = 0.0;          
      double sumR2L = 0.0;          
      double absDiff;               
   
       
      for (int denominator = 1; denominator <= maxDenominator; ++denominator) {
           
          ......
           
      }
      System.out.println("The sum from left-to-right is: " + sumL2R);

       
      ......

       
      if (sumL2R > sumR2L) ......
      else ......
   }
}

4.4  

ComputePI

 (Decision & Loop)

Viết chương trình được gọi 

ComputePI

để tính giá trị của π, sử dụng khai triển chuỗi sau. 

Sử dụng mẫu số tối đa ( 

maxDenominator

) làm điều kiện kết thúc. 

Hãy thử 

maxDenominator

của 

1000

10000

100000

1000000

và so sánh PI thu được. 

Sê-ri này có phù hợp với máy tính PI không? 

Tại sao?

ExerciseBasics_ComputePI.png

Hints

Thêm vào 

sum

nếu 

denominator % 4

là 

1

và trừ đi 

sum

nếu có 

3

.

      double sum = 0.0;
      int maxDenominator = 1000;    
      for (int denominator = 1; denominator <= maxDenominator; denominator += 2) {
             
         if (denominator % 4 == 1) {
            sum += ......;
         } else if (denominator % 4 == 3) {
            sum -= ......;
         } else {    
            System.out.println("Impossible!!!");
         }
      }
      ......
Try
  1. Thay vì sử dụng mẫu số tối đa làm điều kiện kết thúc, hãy viết lại chương trình của bạn để sử dụng số lượng điều khoản ( 

    maxTerm

    tối đa 

    làm điều kiện kết thúc.

          int maxTerm = 10000;   
          int sum = 0.0;
          for (int term = 1; term <= maxTerm; term++) {   
                 
             if (term % 2 == 1) {   
                sum += 1.0 / (term * 2 - 1);
             } else {               
                ......
             }
          }
  2. JDK duy trì giá trị của π trong 

    double

    hằng số tích hợp có tên là 

    Math.PI

    =3.141592653589793

    ). 

    Thêm một tuyên bố để so sánh các giá trị thu được và 

    Math.PI

    , trong phần trăm của 

    Math.PI

    , nghĩa là , 

    (piComputed / Math.PI) * 100.

4.5  

CozaLozaWoza

 (Decision & Loop)

Viết một chương trình gọi là 

CozaLozaWoza

có in những con số 

1

để 

110

11

số trên mỗi dòng. 

Chương trình sẽ in “Coza” thay cho các số là bội số của 3, “Loza” cho bội số của 5, “Woza” cho bội số của 7, “CozaLoza” cho bội số của 3 và 5, v.v. 

Đầu ra sẽ như sau

:

1 2 Coza 4 Loza Coza Woza 8 Coza Loza 11 
Coza 13 Woza CozaLoza 16 17 Coza 19 Loza CozaWoza 22 
23 Coza Loza 26 Coza Woza 29 CozaLoza 31 32 Coza
......
Hints
public class CozaLozaWoza {    
   public static void main(String[] args) {
      int lowerbound = 1, upperbound = 110;
      for (int number = lowerbound; number <= upperbound; ++number) {
             
          
         if ( ...... ) {
            System.out.print("Coza");
         }
          
         if ( ...... ) {
            System.out.print(.....);
         }
          
         ......
          
         if ( ...... ) {
            ......
         }
          
         if ( ...... ) {
            System.out.println();   
         } else {
            System.out.print( ...... );   
         }
      }
   }
}
Notes
  1. Bạn không thể sử dụng lồng nhau-if (nếu … khác nếu … khác nếu … khác) cho vấn đề này. 

    Đó là bởi vì các bài kiểm tra không loại trừ lẫn nhau. 

    Ví dụ, 

    15

    chia hết cho cả hai 

    3

    và 

    5

    Nested-if chỉ được áp dụng nếu các xét nghiệm loại trừ lẫn nhau.

  2. Các xét nghiệm trên có vẻ lộn xộn. 

    Một giải pháp tốt hơn là sử dụng 

    boolean

    cờ để theo dõi xem số đã được xử lý chưa, như sau:

          int lowerbound = 1, upperbound = 110;
          

    boolean printed;

    for (int number = lowerbound; number <= upperbound; ++number) {

    printed = false;

    if ( ...... ) { System.out.print( ...... );

    printed = true;

    } if ( ...... ) { System.out.print( ..... );

    printed = true;

    ! } ...... if (

    !printed

    ) { ...... } ...... }

4.6  

Fibonacci

 (Decision & Loop)

Viết chương trình được gọi 

Fibonacci

để in các 

20

số Fibonacci 

đầu tiên 

F(n)

, ở đâu 

F(n)=F(n–1)+F(n–2)

và 

F(1)=F(2)=1

Cũng tính trung bình của họ. 

Đầu ra sẽ như sau:

The first 20 Fibonacci numbers are:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
The average is 885.5
Hints
 
public class Fibonacci {
   public static void main (String[] args) {
      int n = 3;           
      int fn;              
      int fnMinus1 = 1;    
      int fnMinus2 = 1;    
      int nMax = 20;       
      int sum = fnMinus1 + fnMinus2;   
      double average;
 
      System.out.println("The first " + nMax + " Fibonacci numbers are:");
      ......
 
      while (n <= nMax) {   
             
          
         ......
          
         ++n;
         fnMinus2 = fnMinus1;
         fnMinus1 = fn;
      }
 
       
      ......
   }
}
Try
  1. Số Tribonacci

     là một chuỗi các con số 

    T(n)

    tương tự như 

    số Fibonacci

     , ngoại trừ một số được hình thành bằng cách thêm ba số trước, tức là 

    T(n)=T(n-1)+T(n-2)+T(n-3)

    T(1)=T(2)=1

    , và 

    T(3)=2

    Viết một chương trình được gọi 

    Tribonacci

    để tạo ra hai mươi số Triborie đầu tiên

    .

4.7  

ExtractDigits

 (Decision & Loop)

Viết chương trình được gọi 

ExtractDigits

để trích xuất từng chữ số từ một 

int

, theo thứ tự ngược lại. 

Ví dụ: nếu 

int

là 15423, đầu ra sẽ là “3 2 4 5 1”, với khoảng trắng ngăn cách các chữ số.

Gợi ý

Mẫu 

 để trích xuất các chữ số riêng lẻ từ một số nguyên 

n

là:

  1. Sử dụng 

    (n % 10)

    để trích xuất chữ số cuối cùng (ít quan trọng nhất).

  2. Sử dụng 

    n = n / 10

    để thả chữ số cuối cùng (ít quan trọng nhất).

  3. Lặp lại nếu 

    (n > 0)

    , nghĩa là, nhiều chữ số để giải nén.

Hãy lưu ý rằng 

n

bị phá hủy trong quá trình. 

Bạn có thể cần phải sao chép một bản sao

      int n = ...;
      while (n > 0) {
         int digit = n % 10;   
          
         ......
         n = n / 10;   
      }

5.  Exercises on Input, Decision and Loop

5.1  

Add2Integer

 (Input)

Viết chương trình có tên 

Add2Integers

nhắc nhở người dùng nhập hai số nguyên. 

Chương trình sẽ đọc hai số nguyên như 

int

tính tổng của chúng; 

và in kết quả. 

Ví dụ,

Enter first integer: 8
Enter second integer: 9
The sum is: 17
Hints
import java.util.Scanner;    
 
public class Add2Integers {   
   public static void main (String[] args) {
       
      int number1, number2, sum;
      Scanner in = new Scanner(System.in);   

       
      System.out.print("Enter first integer: ");   
      number1 = in.nextInt();                      
      ......

       
      sum = ......

       
      System.out.println("The sum is: " + sum);    
      in.close();   
   }
}

5.2  

SumProductMinMax3

 (Arithmetic & Min/Max)

Viết chương trình có tên 

SumProductMinMax3

nhắc nhở người dùng cho ba số nguyên. 

Chương trình sẽ đọc các đầu vào như 

int

tính tổng, tích, tối thiểu và tối đa của ba số nguyên; 

và in kết quả. 

Ví dụ như,

,

Enter 1st integer: 8
Enter 2nd integer: 2
Enter 3rd integer: 9
The sum is: 19
The product is: 144
The min is: 2
The max is: 9
Hints
       
      int number1, number2, number3;   
      int sum, product, min, max;      
      Scanner in = new Scanner(System.in);   
      
       
      ......
      
       
      sum = ......
      product = ......

       
      min = number1;         
      if (number2 < min) {   
         min = number2;      
      }
      if (number3 < min) {   
         min = number3;
      }
      
       
      ......
      
       
      ......
Try
  1. Viết chương trình gọi là 

    SumProductMinMax5

    nhắc nhở người dùng cho năm số nguyên. 

    Chương trình sẽ đọc các đầu vào như 

    int

    tính tổng, tích, tối thiểu và tối đa của năm số nguyên; 

    và in kết quả. 

    Sử dụng năm 

    int

    biến: 

    number1

    ,, 

    number2

    …, 

    number5

    để lưu trữ các đầu vào.

5.3  

CircleComputation

 (

double

 & 

printf()

)

Viết chương trình có tên 

CircleComputation

nhắc nhở người dùng về bán kính hình tròn theo số dấu phẩy động. 

Chương trình sẽ đọc đầu vào như 

double

tính đường kính, chu vi và diện tích hình tròn trong 

double

và in các giá trị được làm tròn đến 2 chữ số thập phân. 

Sử dụng hằng số 

Math.PI

do 

hệ thống cung cấp 

cho pi. 

Các công thức là:

diameter = 2.0 * radius;
area = Math.PI * radius * radius;
circumference = 2.0 * Math.PI * radius;
Hints
       
      double radius, diameter, circumference, area;   
      ......

       
      System.out.print("Enter the radius: ");
      radius = in.nextDouble();   

      // Compute in "double"
      ......

       
      System.out.printf("Diameter is: %.2f%n", diameter);
      ......
Try
  1. Viết chương trình có tên 

    SphereComputation

    nhắc nhở người dùng 

    radius

    về hình cầu trong số dấu phẩy động. 

    Chương trình sẽ đọc đầu vào như 

    double

    tính thể tích và diện tích bề mặt của quả cầu trong 

    double

    và in các giá trị được làm tròn đến 2 chữ số thập phân. 

    Các công thức là:

    surfaceArea = 4 * Math.PI * radius * radius;
    volume = 4 /3 * Math.PI * radius * radius * radius;   

    Lưu ý rằng bạn không thể đặt tên biến 

    surface area

    bằng dấu cách hoặc 

    surface-area

    dấu gạch ngang. 

    Quy ước đặt tên của Java là 

    surfaceArea

    Các ngôn ngữ khác đề nghị 

    surface_area

    với một dấu gạch dưới.

  2. Viết chương trình có tên 

    CylinderComputation

    nhắc nhở người dùng cho cơ sở 

    radius

    và 

    height

    của hình trụ theo số dấu phẩy động. 

    Chương trình sẽ đọc các đầu vào như 

    double

    tính diện tích cơ sở, diện tích bề mặt và thể tích của hình trụ; 

    và in các giá trị được làm tròn đến 2 chữ số thập phân. 

    Các công thức là:

    baseArea = Math.PI * radius * radius;
    surfaceArea = 2.0 * Math.PI * radius + 2.0 * baseArea;
    volume = baseArea * height;

5.4  

Swap2Integers

Viết chương trình có tên 

Swap2Integers

nhắc nhở người dùng cho hai số nguyên. 

Chương trình sẽ đọc các đầu vào là 

int

, lưu trong hai biến được gọi 

number1

và 

number2

hoán đổi nội dung của hai biến; 

và in kết quả. 

Ví dụ như,

Enter first integer: 9
Enter second integer: -9
After the swap, first integer is: -9, second integer is: 9
Hints

Để hoán đổi nội dung của hai biến 

x

và 

y

, bạn cần giới thiệu một bộ lưu trữ tạm thời, nói 

temp

và làm : 

temp ⇐ x

x ⇐ y

y ⇐ temp

.

5.5  

IncomeTaxCalculator

 (Decision)

Thuế suất thuế thu nhập lũy tiến được quy định như sau:

Taxable IncomeRate (%)
First $20,0000
Next $20,00010
Next $20,00020
The remaining30

Ví dụ, giả sử rằng thu nhập chịu thuế là 

$85000

, thuế thu nhập phải nộp là 

$20000*0% + $20000*10% + $20000*20% + $25000*30%

.

Viết một chương trình được gọi là 

IncomeTaxCalculator

đọc thu nhập chịu thuế (in 

int

). 

Chương trình sẽ tính thuế thu nhập phải nộp (bằng 

double

); 

và in kết quả làm tròn đến 2 chữ số thập phân. 

Ví dụ như,

Enter the taxable income: $41234
The income tax payable is: $2246.80

Enter the taxable income: $67891
The income tax payable is: $8367.30

Enter the taxable income: $85432
The income tax payable is: $13629.60

Enter the taxable income: $12345
The income tax payable is: $0.00
Hints
       
      final double TAX_RATE_ABOVE_20K = 0.1;
      final double TAX_RATE_ABOVE_40K = 0.2;
      final double TAX_RATE_ABOVE_60K = 0.3;

       
      int taxableIncome;
      double taxPayable;
      ......

       
      if (taxableIncome <= 20000) {          
         taxPayable = ......;
      } else if (taxableIncome <= 40000) {   
         taxPayable = ......;
      } else if (taxableIncome <= 60000) {   
         taxPayable = ......;
      } else {                               
         taxPayable = ......;
      }
       

       
      System.out.printf("The income tax payable is: $%.2f%n", ...);
Try

Giả sử rằng một 

10%

khoản giảm thuế được thông báo cho thuế thu nhập phải nộp, giới hạn 

$1,000

, sửa đổi chương trình của bạn để xử lý khoản giảm thuế. 

Ví dụ, giả sử rằng số thuế phải nộp là 

$12,000

, giảm giá là 

$1,000

, như 

10%

của 

$12,000

quá nắp.

5.6  

IncomeTaxCalculatorWithSentinel

 (Decision & Loop)

Dựa trên bài tập trước, hãy viết một chương trình được gọi 

IncomeTaxCalculatorWithSentinel

sẽ lặp lại phép tính cho đến khi người dùng nhập 

-1

Ví dụ,

Enter the taxable income (or -1 to end): $41000
The income tax payable is: $2200.00

Enter the taxable income (or -1 to end): $62000
The income tax payable is: $6600.00

Enter the taxable income (or -1 to end): $73123
The income tax payable is: $9936.90

Enter the taxable income (or -1 to end): $84328
The income tax payable is: $13298.40

Enter the taxable income: $-1
bye!

Giá trị 

-1

được gọi là 

giá trị sentinel

 . 

(Wiki: Trong lập trình, 

giá trị sentinel

 , còn được gọi là giá trị cờ, giá trị chuyến đi, giá trị giả mạo, giá trị tín hiệu hoặc dữ liệu giả, là một giá trị đặc biệt sử dụng sự hiện diện của nó làm điều kiện chấm dứt.)

Gợi ý

Mẫu 

 để xử lý đầu vào với giá trị sentinel như sau:

       
      final int SENTINEL = -1;     
      ......

       
      int taxableIncome;
      double taxPayable;
      ......

       
      System.out.print("Enter the taxable income (or -1 to end): $");
      taxableIncome = in.nextInt();

      while (taxableIncome != SENTINEL) {
          
         ......
          
         ......

          
         System.out.print("Enter the taxable income (or -1 to end): $");
         taxableIncome = in.nextInt();
             
      }
      System.out.println("bye!");

Hãy lưu ý rằng chúng tôi lặp lại các câu lệnh đầu vào bên trong và bên ngoài vòng lặp. 

Lặp đi lặp lại tuyên bố KHÔNG phải là một thực hành lập trình tốt. 

Điều này là do nó dễ lặp lại (Cntl-C / Cntl-V), nhưng khó duy trì và đồng bộ hóa các câu lệnh lặp lại. 

Trong trường hợp này, chúng tôi không có lựa chọn nào tốt hơn!

5.7  

PensionContributionCalculator

 (Decision)

Cả người sử dụng lao động và người lao động đều được ủy thác đóng góp một tỷ lệ phần trăm nhất định tiền lương của nhân viên vào quỹ hưu trí của nhân viên. 

Tỷ lệ được lập bảng như sau:

Employee’s AgeEmployee Rate (%)Employer Rate (%)
55 and below2017
above 55 to 601313
above 60 to 657.59
above 6557.5

Tuy nhiên, sự đóng góp phải chịu mức trần của 

$6,000

Nói cách khác, nếu một nhân viên kiếm được 

$6,800

, chỉ 

$6,000

thu hút sự đóng góp của nhân viên và chủ nhân, thì phần còn lại 

$800

thì không.

Viết một chương trình được gọi là 

PensionContributionCalculator

đọc mức lương hàng tháng và tuổi (trong 

int

) của một nhân viên. 

Chương trình của bạn sẽ tính toán nhân viên, người sử dụng lao động và tổng đóng góp (trong 

double

); 

và in kết quả làm tròn đến 2 chữ số thập phân. 

Ví dụ như,

Enter the monthly salary: $3000
Enter the age: 30
The employee's contribution is: $600.00
The employer's contribution is: $510.00
The total contribution is: $1110.00
Hints
       
      final int SALARY_CEILING = 6000;
      final double EMPLOYEE_RATE_55_AND_BELOW = 0.2;
      final double EMPLOYER_RATE_55_AND_BELOW = 0.17;
      final double EMPLOYEE_RATE_55_TO_60 = 0.13;
      final double EMPLOYER_RATE_55_TO_60 = 0.13;
      final double EMPLOYEE_RATE_60_TO_65 = 0.075;
      final double EMPLOYER_RATE_60_TO_65 = 0.09;
      final double EMPLOYEE_RATE_65_ABOVE = 0.05;
      final double EMPLOYER_RATE_65_ABOVE = 0.075;

       
      int salary, age;      
      int contributableSalary;
      double employeeContribution, employerContribution, totalContribution;
      ......

       
      contributableSalary = ......
      
       
      if (age <= 55) {          
         ......
      } else if (age <= 60) {   
         ......
      } else if (age <= 65) {   
         ......
      } else {                  
         ......
      }
      

5.8  

PensionContributionCalculatorWithSentinel

 (Decision & Loop)

Dựa trên trước đó 

PensionContributionCalculator

, hãy viết một chương trình được gọi là 

PensionContributionCalculatorWithSentinel

sẽ lặp lại các phép tính cho đến khi người dùng nhập -1 cho mức lương. 

Ví dụ như,

Enter the monthly salary (or -1 to end): $5123
Enter the age: 21
The employee's contribution is: $1024.60
The employer's contribution is: $870.91
The total contribution is: $1895.51

Enter the monthly salary (or -1 to end): $5123
Enter the age: 64
The employee's contribution is: $384.22
The employer's contribution is: $461.07
The total contribution is: $845.30

Enter the monthly salary (or -1 to end): $-1
bye!
Hints
       
      System.out.print("Enter the monthly salary (or -1 to end): $");
      salary = in.nextInt();

      while (salary != SENTINEL) {
          
         System.out.print("Enter the age: ");
         age = in.nextInt();

         ......
         ......
         
          
         System.out.print("Enter the monthly salary (or -1 to end): $");
         salary = in.nextInt();
      }

5.9  

SalesTaxCalculator

 (Decision & Loop)

Thuế doanh thu 

7%

được đánh vào tất cả hàng hóa và dịch vụ được tiêu thụ. 

Điều bắt buộc là tất cả các thẻ giá phải bao gồm thuế bán hàng. 

Ví dụ: nếu một mặt hàng có thẻ giá 

$107

, giá thực tế là 

$100

và 

$7

đi đến thuế bán hàng.

Viết chương trình sử dụng vòng lặp để liên tục nhập giá đã bao gồm thuế (tính bằng 

double

); 

tính giá thực tế và thuế bán hàng (bằng 

double

); 

và in kết quả làm tròn đến 2 chữ số thập phân. 

Chương trình sẽ chấm dứt để đáp ứng với đầu vào của 

-1

và in tổng giá, tổng giá thực tế và tổng thuế bán hàng. 

Ví dụ như,

Enter the tax-inclusive price in dollars (or -1 to end): 107
Actual Price is: $100.00, Sales Tax is: $7.00

Enter the tax-inclusive price in dollars (or -1 to end): 214
Actual Price is: $200.00, Sales Tax is: $14.00

Enter the tax-inclusive price in dollars (or -1 to end): 321
Actual Price is: $300.00, Sales Tax is: $21.00

Enter the tax-inclusive price in dollars (or -1 to end): -1
Total Price is: $642.00
Total Actual Price is: $600.00
Total Sales Tax is: $42.00
Hints
       
      final double SALES_TAX_RATE = 0.07;
      final int SENTINEL = -1;         
      
       
      double price, actualPrice, salesTax;   
      double totalPrice = 0.0, totalActualPrice = 0.0, totalSalesTax = 0.0;   
      ......

       
      System.out.print("Enter the tax-inclusive price in dollars (or -1 to end): ");
      price =  in.nextDouble();

      while (price != SENTINEL) {
          
         ......
          
         ......
          
         ......

          
         System.out.print("Enter the tax-inclusive price in dollars (or -1 to end): ");
         price =  in.nextDouble();
      }
       
      ......

5.10  

ReverseInt

 (Loop with Modulus/Divide)

Viết chương trình nhắc người dùng về số nguyên dương. 

Chương trình sẽ đọc đầu vào như 

int

và in “đảo ngược” của số nguyên đầu vào. 

Ví dụ như,

Enter a positive integer: 12345
The reverse is: 54321
Hints

Sử dụng 

mẫu mã

 sau đây 

sử dụng vòng lặp while với các hoạt động mô đun / phân chia lặp lại để trích xuất và thả chữ số cuối của số nguyên dương.

       
      int inNumber;    
      int inDigit;     
      ......

       
      while (inNumber > 0) {
         inDigit = inNumber % 10;  
          
         ......
         inNumber /= 10;           
      }
      ......

5.11  

SumOfDigitsInt

 (Loop with Modulus/Divide)

Viết chương trình nhắc người dùng về số nguyên dương. 

Chương trình sẽ đọc đầu vào như 

int

tính toán và in tổng của tất cả các chữ số của nó. 

Ví dụ như

,

Enter a positive integer: 12345
The sum of all digits is: 15
Hints

Xem lại  “ReverseInt“.

5.12  

InputValidation

 (Loop with 

boolean

 flag)

Chương trình của bạn thường cần xác thực các đầu vào của người dùng, ví dụ: các dấu sẽ nằm trong khoảng từ 0 đến 100.

Viết chương trình nhắc người dùng cho một số nguyên giữa 

0-10

hoặc 

90-100

Chương trình sẽ đọc đầu vào như 

int

và lặp lại cho đến khi người dùng nhập một đầu vào hợp lệ. 

Ví dụ như

,

Enter a number between 0-10 or 90-100: -1
Invalid input, try again...
Enter a number between 0-10 or 90-100: 50
Invalid input, try again...
Enter a number between 0-10 or 90-100: 101
Invalid input, try again...
Enter a number between 0-10 or 90-100: 95
You have entered: 95
Hints

Sử dụng 

mẫu mã

 sau đây 

sử dụng vòng lặp do-while được điều khiển bởi 

boolean

cờ để xác thực đầu vào. 

Chúng tôi sử dụng vòng lặp do-while thay vì vòng lặp while-do vì chúng tôi cần thực thi phần thân để nhắc và xử lý đầu vào ít nhất một lần.

.

       
      int numberIn;       
      boolean isValid;    
      ......
      
       
      isValid = false;   // default assuming input is not valid
      do {
          
         ......

          
         if (numberIn ......) {
            isValid = true;    
         } else {
            System.out.println(......);   
         }
      } while (!isValid);
      ......

5.13  

AverageWithInputValidation

 (Loop with 

boolean

 flag)

Viết chương trình nhắc người dùng đánh dấu (giữa 

0-100

in 

int

) của 3 sinh viên; 

tính trung bình (tính bằng 

double

); 

và in kết quả được làm tròn đến 2 chữ số thập phân. 

Chương trình của bạn cần thực hiện xác nhận đầu vào. 

Ví dụ như,

Enter the mark (0-100) for student 1: 56
Enter the mark (0-100) for student 2: 101
Invalid input, try again...
Enter the mark (0-100) for student 2: -1
Invalid input, try again...
Enter the mark (0-100) for student 2: 99
Enter the mark (0-100) for student 3: 45
The average is: 66.67
Hints
       
      final int NUM_STUDENTS = 3;
      
       
      int numberIn;
      boolean isValid;    
      int sum = 0;
      double average;
      ......
      
      for (int studentNo = 1; studentNo <= NUM_STUDENTS; ++studentNo) {
           
          ......
          isValid = false;    
          do {
             ......
          } while (!isValid);

          sum += ......;
      }
      ......

6.  Exercises on Nested-Loops

6.1  

SquarePattern

 (nested-loop)

Viết chương trình có tên 

SquarePattern

nhắc nhở người dùng về kích thước (số nguyên không âm trong 

int

); 

và in mẫu hình vuông sau bằng cách sử dụng hai vòng lặp lồng nhau.

Enter the size: 5
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
Hints

Mẫu 

 để in các mẫu 2D bằng các vòng lặp lồng nhau là:

       
      for (int row = 1; row <= size; row++) {   
          
         for (int col = 1; col <= size; col++) {   
            System.out.print( ...... );    
            ......
         }
          
         System.out.println();
      }

Ghi chú

  1. Bạn nên đặt tên cho các chỉ mục vòng lặp 

    row

    và 

    col

    , KHÔNG 

    i

    và 

    j, hoặc 

    x

    , và 

    y

    a

    và 

    b

    , là vô nghĩa.

  2. Các 

    row

    và 

    col

    có thể bắt đầu từ 1 (và tối đa 

    size

    ), hoặc bắt đầu 

    0

    (và tối đa 

    size-1

    ). 

    Khi máy tính đếm từ 

    0

    , có lẽ sẽ hiệu quả hơn khi bắt đầu từ đó 

    0

    Tuy nhiên, vì con người đếm từ 

    1

    , nên dễ đọc hơn nếu bạn bắt đầu từ đó 

    1

    .

Thử

Viết lại chương trình trên bằng các vòng lặp while-do lồng nhau.

6.2  

CheckerPattern

 (nested-loop)

Viết chương trình có tên 

CheckerPattern

nhắc nhở người dùng về kích thước (số nguyên không âm trong 

int

); 

và in các mẫu bàn cờ sau đây.

Enter the size: 7
# # # # # # #
 # # # # # # #
# # # # # # #
 # # # # # # #
# # # # # # #
 # # # # # # #
# # # # # # #
Hints
       
      for (int row = 1; row <= size; row++) {   
          
         for (int col = 1; col <= size; col++) {   
            

if ((row % 2) == 0) {

...... }

System.out.print( ...... ); ...... } System.out.println(); }

6.3  

TimeTable

 (nested-loop)

Viết chương trình có tên 

TimeTable

nhắc nhở người dùng về kích thước (số nguyên dương trong 

int

); 

và in bảng nhân như hình:

Enter the size: 10
 * |   1   2   3   4   5   6   7   8   9  10
--------------------------------------------
 1 |   1   2   3   4   5   6   7   8   9  10
 2 |   2   4   6   8  10  12  14  16  18  20
 3 |   3   6   9  12  15  18  21  24  27  30
 4 |   4   8  12  16  20  24  28  32  36  40
 5 |   5  10  15  20  25  30  35  40  45  50
 6 |   6  12  18  24  30  36  42  48  54  60
 7 |   7  14  21  28  35  42  49  56  63  70
 8 |   8  16  24  32  40  48  56  64  72  80
 9 |   9  18  27  36  45  54  63  72  81  90
10 |  10  20  30  40  50  60  70  80  90 100

Gợi ý

  1. Sử dụng 

    printf()

    để định dạng đầu ra, ví dụ, mỗi ô là 

    %4d

    .

  2. Xem bài viết “Cơ bản về Java”.

7.  Debugging/Tracing Programs using a Graphic Debugger

7.1  

Factorial

 (Using a graphic debugger)

Chương trình sau đây tính toán và in giai thừa của 

n

). 

Tuy nhiên, chương trình có lỗi logic và đưa ra câu trả lời sai cho 

(“Yếu tố 20 là -2102132736” – âm tính?!).

=1*2*3*...*n

n=20

Sử dụng trình gỡ lỗi đồ họa của Eclipse / NetBeans để gỡ lỗi chương trình bằng một bước duy nhất thông qua chương trình và lập bảng các giá trị của 

i

và 

factorial

tại câu lệnh được đánh dấu bởi ( 

*

).

Bạn nên thử các tính năng sửa lỗi như “Breakpoint”, “Step Over”, “Watch biến”, “Run-to-Line”, “Resume”, “Termination”, trong số những thứ khác. 

 
public class Factorial {
   public static void main(String[] args) {   
      int n = 20;
      int factorial = 1;

       
      for (int i = 1; i <= n; i++) {   
         factorial = factorial * i;    
      }
      System.out.println("The Factorial of " + n + " is " + factorial);
   }
}

8.  Exercises on 

String

 and 

char

 Operations

8.1  

ReverseString

 (

String

 & 

char

)

Viết một chương trình gọi là 

ReverseString

, mà nhắc nhở người dùng cho một 

String

, và in 

ngược

 của 

String

bằng cách chiết xuất và chế biến mỗi nhân vật. 

Đầu ra sẽ như sau:

Enter a String: abcdef
The reverse of the String "abcdef" is "fedcba".
Hints

Đối với một cuộc 

String

gọi 

inStr

, bạn có thể sử dụng 

inStr.length()

để có được 

độ dài

 của 

String

và 

inStr.charAt(idx)

để lấy 

char

tại 

idx

vị trí, 

idx

bắt đầu từ 0, tối đa 

instr.length() - 1

.

       
      String inStr;         
      int inStrLen;         
      ......

       
      System.out.print("Enter a String: ");
      inStr = in.next();    
      inStrLen = inStr.length();
   
       
      for (int charIdx = inStrLen - 1; charIdx >= 0; --charIdx) {   
         ......
      }

8.2  

CountVowelsDigits

 (

String

 & 

char

)

Viết một chương trình gọi là 

CountVowelsDigits

, mà nhắc nhở người dùng cho một 

String

, đếm số lượng các nguyên âm ( 

a

e

i

o

u

A

E

I

O

U

) và chữ số ( 

0-9

) chứa trong chuỗi, và in số lượng và tỷ lệ phần trăm (làm tròn đến 2 chữ số thập phân ). 

Ví dụ,

Enter a String: testing12345
Number of vowels: 2 (16.67%)
Number of digits: 5 (41.67%)
Hints
  1. Để kiểm tra xem a 

    char c

    có phải là chữ số không, bạn có thể sử dụng 

    boolean

    biểu thức 

    (c >= '0' && c <= '9')

    hoặc sử dụng 

    boolean

    chức năng tích hợp 

    Character.isDigit(c)

    .

  2. Bạn có thể sử dụng 

    in.next().toLowerCase()

    để chuyển đổi đầu vào 

    String

    thành chữ thường để giảm số lượng các trường hợp.

  3. Để in 

    %

    sử dụng 

    printf()

    , bạn cần sử dụng 

    %%

    Điều này là do 

    %

    là một tiền tố cho định dạng định dạng trong 

    printf()

    , ví dụ, 

    %d

    và 

    %f

    .

8.3  

PhoneKeyPad

 (

String

 & 

char

)

Trên bàn phím điện thoại, bảng chữ cái được ánh xạ tới chữ số như sau: 

ABC(2)

DEF(3)

GHI(4)

JKL(5)

MNO(6)

PQRS(7)

TUV(8)

WXYZ(9)

Viết chương trình được gọi 

PhoneKeyPad

, nhắc nhở người dùng về 

String

(không phân biệt chữ hoa chữ thường) và chuyển đổi thành một chuỗi các chữ số bàn phím. 

Sử dụng (a) a lồng nhau- 

if

, (b) a 

switch-case-default

.

Hints
  1. Bạn có thể sử dụng 

    in.next().toLowerCase()

    để đọc a 

    String

    và chuyển đổi nó thành chữ thường để giảm các trường hợp của bạn

    .

  2. Trong 

    switch-case

    , bạn có thể xử lý nhiều trường hợp bằng cách bỏ qua 

    break

    câu lệnh, ví dụ:

    switch (inChar) {
       case 'a': case 'b': case 'c':   
          System.out.print(2); break;
       case 'd': case 'e': case 'f':
          ......
       default:
          ......
    }

8.4  Caesar’s Code (

String

 & 

char

)

Mã của Caesar là một trong những kỹ thuật mã hóa đơn giản nhất. 

Mỗi chữ cái trong bản rõ được thay thế bằng một chữ cái một số vị trí cố định ( 

n

) theo bảng chữ cái theo chu kỳ. 

Trong bài tập này, chúng ta sẽ chọn 

n=3

Đó là, 

'A'

được thay thế bởi 

'D'

'B'

bởi 

'E'

'C'

bởi 

'F'

, …, 

'X'

bởi 

'A'

, …, 

'Z'

bởi 

'C'

.

Viết chương trình được gọi 

để mã hóa mã của Caesar. 

Chương trình sẽ nhắc người dùng về một chuỗi ký tự chỉ bao gồm các chữ cái trong trường hợp trộn; 

tính toán bản mã; 

và in bản mã bằng chữ hoa. 

Ví dụ,

CaesarCode

Enter a plaintext string: Testing
The ciphertext string is: WHVWLQJ

Gợi ý

  1. Sử dụng 

    in.next().toUpperCase()

    để đọc một chuỗi đầu vào và chuyển đổi nó thành chữ hoa để giảm số lượng các trường hợp.

  2. Bạn có thể sử dụng một lồng lớn-nếu có 26 trường hợp ( 

    'A'-'Z'

    ). 

    Nhưng nó là tốt hơn để xem xét 

    'A'

    đến 

    'W'

    như một trường hợp; 

    'X'

    'Y'

    và 

    'Z'

    như 3 trường hợp riêng biệt.

  3. Lưu ý rằng 

    char 'A'

    được thể hiện dưới dạng số Unicode 

    65

    và 

    char 'D'

    như 

    68

    Tuy nhiên 

    'A' + 3 gives 68

    ,. 

    Điều này là do 

    char + int

    được ngầm định 

    int + int

    trả về một 

    int

    giá trị. 

    Để có được một 

    char

    giá trị, bạn cần thực hiện truyền kiểu rõ ràng bằng cách sử dụng 

    (char)('A' + 3)

    Hãy thử in 

    ('A' + 3)

    có và không có loại đúc.

9.  Exercises on Array

9.1  

PrintArray

 (Array)

Viết chương trình có tên 

PrintArray

nhắc nhở người dùng về số lượng mục trong một mảng (số nguyên không âm) và lưu nó trong một 

int

biến được gọi 

numItems

Sau đó, nó nhắc người dùng về các giá trị của tất cả các mục và lưu chúng trong một 

int

mảng được gọi 

items

Chương trình sau đó sẽ in nội dung của mảng dưới dạng 

[x1, x2, ..., xn]

Ví dụ,

Enter the number of items: 5
Enter the value of all items (separated by space): 3 2 5 6 9
The values are: [3, 2, 5, 6, 9]
Hints
       
      int numItems;
      int[] items;   
      ......

       
      ......
      numItems = ......

       
      items = new int[numItems];

       
      if (items.length > 0) {
         ......
         for (int i = 0; i < items.length; ++i) {   
            ......
         }
      }

       
      ......
      for (int i = 0; i < items.length; ++i) {
         if (i == 0) {
             
            ......
         } else {
             
            ......
         }
          
         //System.out.print((i == 0) ? ...... : ......);
      }

9.2  

PrintArrayInStars

 (Array)

Viết chương trình có tên 

printArrayInStars

nhắc nhở người dùng về số lượng mục trong một mảng (số nguyên không âm) và lưu nó trong một 

int

biến được gọi 

numItems

Sau đó, nó nhắc người dùng về các giá trị của tất cả các mục (số nguyên không âm) và lưu chúng trong một 

int

mảng được gọi 

items

Chương trình sau đó sẽ in nội dung của mảng dưới dạng đồ họa, với chỉ số và giá trị mảng được biểu thị bằng số sao. 

Ví dụ như,

Enter the number of items: 5
Enter the value of all items (separated by space): 7 4 3 0 7
0: *******(7)
1: ****(4)
2: ***(3)
3: (0)
4: *******(7)
Hints
       
      int numItems;
      int[] items;   
      ......
      ......

             for (int idx = 0; idx < items.length; ++idx) {   
         System.out.print(idx + ": ");
          
         for (int starNo = 1; starNo <= items[idx]; ++starNo) {   
            System.out.print("*");
         }
         ......
      }
      ......

9.3  

GradesStatistics

 (Array)

Viết chương trình nhắc người dùng về số lượng sinh viên trong một lớp (số nguyên không âm) và lưu nó trong một 

int

biến có tên 

numStudents

Sau đó, nó nhắc người dùng cho điểm của từng học sinh (số nguyên từ 0 đến 100) và lưu chúng trong một 

int

mảng được gọi 

grades

Sau đó, chương trình sẽ tính toán và in trung bình ( 

double

làm tròn đến 2 chữ số thập phân) và tối thiểu / tối đa (in 

int

).

Enter the number of students: 5
Enter the grade for student 1: 98
Enter the grade for student 2: 78
Enter the grade for student 3: 78
Enter the grade for student 4: 87
Enter the grade for student 5: 76
The average is: 83.40
The minimum is: 76
The maximum is: 98

10.  Exercises on Method

Viết một phương thức được gọi là 

exponent(int base, int exp)

trả về 

int

giá trị 

base

tăng lên sức mạnh của 

exp

Chữ ký của phương thức là:

  public static int exponent(int base, int exp);

Giả sử đó 

exp

là một số nguyên không âm và 

base

là một số nguyên. 

Không sử dụng bất kỳ hàm thư viện Math nào.

Cũng viết 

main()

phương thức nhắc người dùng cho 

base

và 

exp

và in kết quả. 

Ví dụ,

Enter the base: 3
Enter the exponent: 4
3 raises to the power of 4 is: 81
Hints
......
public class Exponent {
   public static void main(String[] args) {
       
      int exp;     
      int base;    
      ......
       
      ......
       
      System.out.println(base + " raises to the power of " + exp + " is: " + exponent(base, exp));
   }

    
   public static int exponent(int base, int exp) {
      int product = 1;    

       
      for (......) {
         product *= base;
      }

      return product;
   }
}

Viết một 

boolean

phương thức được gọi 

isOdd()

trong một lớp được gọi 

OddEvenTest

, trong đó lấy một 

int

đầu vào và trả về 

true

nếu nó là số lẻ. 

Chữ ký của phương pháp như sau:

public static boolean isOdd(int number);

Đồng thời viết 

main()

phương thức nhắc người dùng 

number

và in “ODD” hoặc “NGAY”. 

Bạn nên kiểm tra đầu vào tiêu cực. 

Ví dụ như,

Enter a number: 9
9 is an odd number

Enter a number: 8
8 is an even number

Enter a number: -5
-5 is an odd number
Hints

Xem ghi chú.

Viết một 

boolean

phương pháp gọi là 

hasEight()

, mà phải mất một 

int

như là đầu vào và trả về 

true

nếu số chứa các chữ số 

8

(ví dụ 

18

168

1288

). 

Chữ ký của phương pháp như sau:

public static boolean hasEight(int number);

Viết chương trình được gọi 

MagicSum

, nhắc nhở người dùng về số nguyên (hoặc 

-1

kết thúc) và tạo tổng các số có chứa chữ số 

8

Chương trình của bạn nên sử dụng các phương pháp trên. 

Một đầu ra mẫu của chương trình như sau:

Enter a positive integer (or -1 to end): 1
Enter a positive integer (or -1 to end): 2
Enter a positive integer (or -1 to end): 3
Enter a positive integer (or -1 to end): 8
Enter a positive integer (or -1 to end): 88
Enter a positive integer (or -1 to end): -1
The magic sum is: 96
Hints
  1. Mẫu 

     để lặp lại cho đến khi đầu vào là 

    -1

    (được gọi là 

    giá trị 

    sentinel

     ) là:

    final int SENTINEL = -1;   
    int number;
    
     
    System.out.print("Enter a positive integer (or -1 to end): ");
    number = in.nextInt();
    
    while (number != SENTINEL) {   
       ......
       ......
    
        
       System.out.print("Enter a positive integer (or -1 to end): ");
       number = in.nextInt();
    }
  2. Bạn có thể lặp lại sử dụng mô đun / chia ( 

    n%10

    và 

    n=n/10

    ) để trích xuất và thả từng chữ số vào 

    int

    hoặc chuyển đổi 

    int

    sang 

    String

    và sử dụng 

    String

    ‘s 

    charAt()

    để kiểm tra từng cái 

    char

    .

Viết một phương thức được gọi 

print()

, trong đó lấy một 

int

mảng và in nội dung của nó dưới dạng 

[a1, a2, ..., an]

Hãy lưu ý rằng không có dấu phẩy sau phần tử cuối cùng. 

Chữ ký của phương thức như sau:

public static void print(int[] array);

Đồng thời viết trình điều khiển kiểm tra để kiểm tra phương thức này (bạn nên kiểm tra trên mảng trống, mảng một phần tử và mảng phần tử n).

Làm thế nào để xử lý 

double[]

hay 

float[]

Bạn cần viết một phiên bản quá tải cho 

double[]

và một phiên bản quá tải cho 

float[]

, với các chữ ký sau:

public static void print(double[] array)
public static void print(float[] array)

Ở trên được gọi là 

nạp chồng phương thức

 , trong đó cùng tên phương thức có thể có nhiều phiên bản, được phân biệt bởi danh sách tham số của nó.

Gợi ý

  1. Đối với phần tử đầu tiên, in giá trị của nó; 

    đối với các phần tử tiếp theo, in dấu phẩy theo sau giá trị.

Viết một phương thức được gọi 

arrayToString()

, trong đó lấy một 

int

mảng và trả về a 

String

dưới dạng 

[a1, a2, ..., an]

Lưu ý rằng phương thức này trả về a 

String

, bài tập trước trả về 

void

nhưng in ra đầu ra. 

Chữ ký của phương thức như sau:

public static String arrayToString(int[] array);

Đồng thời viết trình điều khiển kiểm tra để kiểm tra phương thức này (bạn nên kiểm tra trên mảng trống, mảng một phần tử và mảng phần tử n).

Ghi chú: Điều này tương tự như chức năng tích hợp 

Arrays.toString()

Bạn có thể nghiên cứu mã nguồn của nó.

Viết một 

boolean

phương thức được gọi 

contains()

, trong đó có một mảng 

int

và một 

int

và trả về 

true

nếu mảng chứa cái đã cho 

int

Chữ ký của phương thức như sau:

public static boolean contains(int[] array, int key);

Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.

Write a method called search(), which takes an array of int and an int; and returns the array index if the array contains the given int; or -1 otherwise. The method’s signature is as follows:

public static int search(int[] array, int key);

Also write a test driver to test this method.

Viết một phương thức được gọi 

search()

, trong đó có một mảng 

int

và một 

int

và trả về 

chỉ số

 mảng 

nếu mảng chứa giá trị đã cho 

int

hoặc 

-1

cách khác. 

Chữ ký của phương thức như sau:

public static boolean equals(int[] array1, int[] array2)

Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.

10.9  

copyOf()

 (Array & Method)

Viết một 

boolean

phương thức được gọi 

copyOf()

, trong đó lấy một 

int

mảng và trả về một bản sao của mảng đã cho. 

Chữ ký của phương thức như sau:

public static int[] copyOf(int[] array)

Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.

Viết một phiên bản khác 

copyOf()

lấy tham số thứ hai để chỉ định độ dài của mảng mới. 

Bạn nên cắt bớt hoặc pad bằng 0 để mảng mới có độ dài cần thiết.

public static int[] copyOf(int[] array, int newLength)

GHI CHÚ: Điều này tương tự như chức năng tích hợp 

Arrays.copyOf()

.

Viết một phương thức được gọi 

reverse()

, trong đó lấy một mảng 

int

và đảo ngược nội dung của nó. 

Ví dụ, mặt trái của 

[1,2,3,4]

là 

[4,3,2,1]

Chữ ký của phương thức như sau:

public static boolean swap(int[] array1, int[] array2)

Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.

Gợi ý

Bạn cần sử dụng một vị trí tạm thời để trao đổi hai vị trí lưu trữ.

 
int item1, item2, temp;
temp = item1;
item1 = item2;
item2 = item1;

Viết một phương thức được gọi 

reverse()

, trong đó lấy một mảng 

int

và đảo ngược nội dung của nó. 

Ví dụ, mặt trái của 

[1,2,3,4]

là 

[4,3,2,1]

Chữ ký của phương thức như sau:

public static void reverse(int[] array)

Lưu ý rằng mảng được truyền vào phương thức có thể được sửa đổi bằng phương thức (cái này được gọi là ” 

truyền bằng tham chiếu

 “). 

Mặt khác, các nguyên thủy được truyền vào một phương thức không thể được sửa đổi. 

Điều này là do một bản sao được tạo và truyền vào phương thức thay vì bản sao gốc (cái này được gọi là ” 

truyền theo giá trị

 “).

Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.

Hints
  1. Bạn có thể sử dụng hai chỉ mục trong vòng lặp, một chỉ số di chuyển về phía trước và một chỉ số di chuyển lùi để chỉ đến hai yếu tố được hoán đổi.

    for (int fIdx = 0, bIdx = array.length - 1; fIdx < bIdx; ++fIdx, --bIdx) {
        
        
    }
  2. Bạn cần sử dụng một vị trí tạm thời để trao đổi hai vị trí lưu trữ

     
    int item1, item2, temp;
    temp = item1;
    item1 = item2;
    item2 = item1;
    

11.  Exercises on Command-line Arguments

11.1  

Arithmetic

 (Command-Line Arguments)

Viết một chương trình gọi 

Arithmetic

là mất ba đối số dòng lệnh: hai số nguyên tiếp theo là một toán tử số học ( 

+

-

*

hoặc 

/

). 

Chương trình sẽ thực hiện thao tác tương ứng trên hai số nguyên và in kết quả. 

Ví dụ:

java Arithmetic 3 2 +
3+2=5
   
java Arithmetic 3 2 -
3-2=1
   
java Arithmetic 3 2 /
3/2=1

Gợi ý

Phương thức 

main(String[] args)

này lấy một đối số: “một mảng của 

String

“, thường được đặt tên (nhưng không cần thiết) 

args

Tham số này nắm bắt các đối số dòng lệnh được cung cấp bởi người dùng khi chương trình được gọi. 

Ví dụ: nếu người dùng gọi:

java Arithmetic 12345 4567 +

Ba đối số dòng lệnh 

"12345"

"4567"

và 

"+"

sẽ được chụp trong một 

String

mảng 

{"12345", "4567", "+"}

và thông qua vào 

main()

phương pháp như là đối số 

args

Đó là,

args is: {"12345", "4567", "+"}   
args.length is: 3                 
args[0] is: "12345"               
args[1] is: "4567"                
args[2] is: "+"                   
args[0].length() is: 5            
args[1].length() is: 4            
args[2].length() is: 1           
public class Arithmetic {
  public static void main (String[] args) {
    int operand1, operand2;
    char theOperator;
  
     
    if (args.length != 3) {
      System.err.println("Usage: java Arithmetic int1 int2 op");
      return;
    }
   
     
    operand1 = Integer.parseInt(args[0]);
    operand2 = ......
   
     
    theOperator = args[2].charAt(0);
    System.out.print(args[0] + args[2] + args[1] + "=");
   
    switch(theOperator) {
      case ('-'): System.out.println(operand1 - operand2); break;
      case ('+'): ......
      case ('*'): ......
      case ('/'): ......
      default:
        System.err.println("Error: invalid operator!"); 
    }
  }
}

Ghi chú:

  • Để cung cấp các đối số dòng lệnh, sử dụng “cmd” hoặc “terminal” để chạy chương trình của bạn ở dạng ” 

    “.

    java ClassName arg1 arg2 ....

  • Để cung cấp các đối số dòng lệnh trong Eclipse, nhấp chuột phải vào mã nguồn ⇒ “Chạy dưới dạng” ⇒ “Chạy Cấu hình …” ⇒ Chọn “Chính” và chọn lớp chính phù hợp ⇒ Chọn “Đối số” Nhập đối số dòng lệnh , ví dụ: “3 2 +” trong “Đối số chương trình”.

  • Để cung cấp đối số dòng lệnh trong NetBeans, nhấp chuột phải vào tên “Dự án” ⇒ “Đặt cấu hình” “Tùy chỉnh …” Chọn danh mục “Chạy” Nhập đối số dòng lệnh, ví dụ: “3 2 +” trong hộp “Đối số” (nhưng đảm bảo bạn chọn lớp Chính phù hợp).

Câu hỏi: Hãy thử ” 

java Arithmetic 2 4 *

” (trong shell CMD và Eclipse / NetBeans) và giải thích kết quả thu được. 

Làm thế nào để giải quyết vấn đề này?

Trong shell CMD của Windows, 

*

được gọi là ký tự đại diện, mở rộng để đưa ra danh sách tệp trong thư mục (được gọi là Shell Expansion). 

Ví dụ: ” 

dir *.java

” liệt kê tất cả các tệp có phần mở rộng là ” 

.java

“. 

Bạn có thể trích dẫn kép * để ngăn chặn sự mở rộng vỏ. 

Eclipse có một lỗi trong việc xử lý này, thậm chí * được trích dẫn hai lần. 

NetBeans ??

SumDigits

 (Đối số dòng lệnh)

Viết chương trình được gọi 

SumDigits

để tổng hợp các chữ số riêng lẻ của một số nguyên dương, được đưa ra trong dòng lệnh. 

Đầu ra sẽ như sau:

java SumDigits 12345
The sum of digits = 1 + 2 + 3 + 4 + 5 = 15