Bài đăng nổi bật

Hướng Dẫn Lập Trình Java 

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 ;) 

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à CheckPassFailin " PASS" nếu intbiến " mark" lớn hơn hoặc bằng 50hoặ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.
/**
 * Trying if-else statement.
 */
public class CheckPassFail {  // Save as "CheckPassFail.java"
   public static void main(String[] args) {  // Program entry point
      int mark = 49;   // Set the value of "mark" here!
      System.out.println("The mark is " + mark);
 
      // if-else statement
      if ( ...... ) {
         System.out.println( ...... );
      } else {
         System.out.println( ...... );
      }
      System.out.println( ...... );
   }
}
Cố gắng mark = 0495051100và 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à CheckOddEvenbản in " Odd Number" nếu intbiến số 341 numberlà số lẻ, hoặc Even Numberkhác. Chương trình sẽ luôn luôn in ra bye!trước khi thoát.
Gợi ý
nlà 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

/**
 * Trying if-else statement and modulus (%) operator.
 */
public class CheckOddEven {   // Save as "CheckOddEven.java"
   public static void main(String[] args) {  // Program entry point
      int number = 49;       // Set the value of "number" here!
      System.out.println("The number is " + number);
      if ( ...... ) {
         System.out.println( ...... );   // even number
      } else {
         System.out.println( ...... );   // odd number
      }
      System.out.println( ...... );
   }
}
Hãy thử number = 018899-1-2và 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-ifswitch-case)

Viết một chương trình gọi PrintNumberInWordmà bản in " ONE", " TWO", ..., " NINE", " OTHER" nếu intbiến " number" là 12, ..., 9, hoặc khác, tương ứng. Sử dụng (a) một ifcâu lệnh " lồng nhau "; (b) một switch-case-defaulttuyên bố "".
Gợi ý
/**
 * Trying nested-if and switch-case statements.
 */
public class PrintNumberInWord {   // Save as "PrintNumberInWord.java"
   public static void main(String[] args) {
      int number = 5;  // Set the value of "number" here!
 
      // Using nested-if
      if (number == 1) {   // Use == for comparison
         System.out.println( ...... );
      } else if ( ...... ) {
         ......
      } else if ( ...... ) {
         ......
      ......
      ......
      } else {
         ......
      }
 
      // Using switch-case-default
      switch(number) {
         case 1: 
            System.out.println( ...... ); break;  // Don't forget the "break" after each case!
         case 2: 
            System.out.println( ...... ); break;
         ......
         ......
         default: System.out.println( ...... ); 
      }
   }
}
Hãy thử number = 0123, ..., 910và xác minh kết quả của bạn.

1.5  PrintDayInWord (nested-ifswitch-case)

Viết một chương trình gọi PrintDayInWordmà bản in “ Sunday”, “ Monday”, ... “ Saturday” nếu intbiến " dayNumber" là 01, ..., 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 ifcâu lệnh " lồng nhau "; (b) một switch-case-defaulttuyên bố "".
Hãy thử dayNumber = 01234567và 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ư abcdxx1x2, và x1688- họ là vô nghĩa. Tránh đơn bảng chữ cái tên thích ijkChú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ụ xyzcho tọa độ và icho chỉ số mảng. Sử dụng các tên có ý nghĩa như rowvà (thay vì và và và (không (không ) và (khôngcolxyijx1x2numStudentsnmaxGradesizenupperboundnlần nữa). Phân biệt giữa danh từ số ít và số nhiều (ví dụ: sử dụng bookscho một mảng sách và bookcho 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 123, ..., để 100Lưu trữ 1và 100trong các biến lowerboundvà 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 ý
/**
 * Compute the sum and average of running integers from a lowerbound to an upperbound using loop.
 */
public class SumAverageRunningInt {   // Save as "SumAverageRunningInt.java"
   public static void main (String[] args) {
      // Define variables
      int sum = 0;          // The accumulated sum, init to 0
      double average;       // average in double
      int lowerbound = 1;
      int upperbound = 100;

      // Use a for-loop to sum from lowerbound to upperbound
      for (int number = lowerbound; number <= upperbound; ++number) {
            // The loop index variable number = 1, 2, 3, ..., 99, 100
         sum += number;     // same as "sum = sum + number"
      }
      // Compute average in double. Beware that int / int produces int!
      ......
      // Print sum and average
      ......
   }
}
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;        // declare and init loop index variable
          while (number <= upperbound) {  // test
             sum += number;
             ++number;                    // update
          }
  2. Sửa đổi chương trình để sử dụng vòng lặp "do-while".
          int sum = 0;
          int number = lowerbound;         // declare and init loop index variable
          do {
             sum += number;
             ++number;                     // update
          } while (number <= upperbound);  // test
  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 intbiế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;   // Count the number within the range, init to 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 100Ngoài ra máy tính khác biệt tuyệt đối của họ.
    HINTS::
          // Define variables
          int sumOdd  = 0;   // Accumulating sum of odd numbers
          int sumEven = 0;   // Accumulating sum of even numbers
          int absDiff;       // Absolute difference between the two sums
          ......
          // Compute sums
          for (int number = ...; ...; ...) {
             if (......) {
                sumOdd += number;
             } else {
                sumEven += number;
             }
          }
          // Compute Absolute Difference
          if (sumOdd > sumEven) {
             absDiff = ......;
          } else {
             absDiff = ......;
          }
          // OR use one liner conditional expression
          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 intHãy lưu ý rằng nó giống như giai thừa của N.
Gợi ý
Khai báo một intbiến được gọi product, khởi tạo thành 1, để tích lũy sản phẩm.
      // Define variables
      int product = 1;      // The accumulated product, init to 1
      int lowerbound = 1;
      int upperbound = 10;
Thử
  1. Tính toán sản phẩm từ 1đến 111đến 121đến 13và 1đến 14Viế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ữ productHãy so sánh các sản phẩm thu được với intcho N=13và 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=50000Chươ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
/**
 * Compute the sum of harmonics series from left-to-right and right-to-left.
 */
public class HarmonicSum {   // Save as "HarmonicSum.java"
   public static void main (String[] args) {
      // Define variables
      int maxDenominator = 50000;  // Use a more meaningful name instead of n
      double sumL2R = 0.0;         // Sum from left-to-right
      double sumR2L = 0.0;         // Sum from right-to-left
      double absDiff;              // Absolute difference between the two sums
   
      // for-loop for summing from left-to-right
      for (int denominator = 1; denominator <= maxDenominator; ++denominator) {
          // denominator = 1, 2, 3, 4, 5, ..., maxDenominator
          ......
          // Beware that int/int gives int, e.g., 1/2 gives 0.
      }
      System.out.println("The sum from left-to-right is: " + sumL2R);

      // for-loop for summing from right-to-left
      ......

      // Find the absolute difference and display
      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ử maxDenominatorcủa 1000100001000001000000và 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 sumnếu denominator % 4là 1và trừ đi sumnếu có 3.
      double sum = 0.0;
      int maxDenominator = 1000;   // Try 10000, 100000, 1000000
      for (int denominator = 1; denominator <= maxDenominator; denominator += 2) {
            // denominator = 1, 3, 5, 7, ..., maxDenominator
         if (denominator % 4 == 1) {
            sum += ......;
         } else if (denominator % 4 == 3) {
            sum -= ......;
         } else {   // remainder of 0 or 2
            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 ( maxTermtối đa làm điều kiện kết thúc.
          int maxTerm = 10000;  // number of terms used in computation
          int sum = 0.0;
          for (int term = 1; term <= maxTerm; term++) {  // term = 1, 2, 3, ..., maxTerm
                // term = 1, 2, 3, 4, ..., maxTerm
             if (term % 2 == 1) {  // odd term number: add
                sum += 1.0 / (term * 2 - 1);
             } else {              // even term number: subtract
                ......
             }
          }
  2. JDK duy trì giá trị của π trong doublehằ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à CozaLozaWozacó in những con số 1để 11011số 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 {   // Save as "CozaLozaWoza.java"
   public static void main(String[] args) {
      int lowerbound = 1, upperbound = 110;
      for (int number = lowerbound; number <= upperbound; ++number) {
            // number = lowerbound+1, lowerbound+2, ..., upperbound
         // Print "Coza" if number is divisible by 3
         if ( ...... ) {
            System.out.print("Coza");
         }
         // Print "Loza" if number is divisible by 5
         if ( ...... ) {
            System.out.print(.....);
         }
         // Print "Woza" if number is divisible by 7
         ......
         // Print the number if it is not divisible by 3, 5 and 7 (i.e., it has not been processed above)
         if ( ...... ) {
            ......
         }
         // After processing the number, print a newline if number is divisible by 11; 
         // else print a space
         if ( ...... ) {
            System.out.println();  // print newline
         } else {
            System.out.print( ...... );  // print a space
         }
      }
   }
}
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ụ, 15chia hết cho cả hai 3và 5Nested-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 booleancờ để 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;  // init before processing each number
             // Print "Coza" if number is divisible by 3
             if ( ...... ) {
                System.out.print( ...... );
                printed = true;   // processed!
             }
             // Print "Loza" if number is divisible by 5
             if ( ...... ) {
                System.out.print( ..... );
                printed = true;   // processed!
             }
             // Print "Woza" if number is divisible by 7
             ......
             // Print the number if it has not been processed
             if (!printed) {
                ......
             }
             // After processing the number, print a newline if it is divisible by 11;
             // else, print a space
             ......
          }

4.6  Fibonacci (Decision & Loop)

Viết chương trình được gọi Fibonacciđể in các 20số Fibonacci đầu tiên F(n), ở đâu F(n)=F(n–1)+F(n–2)và F(1)=F(2)=1Cũ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
/**
 * Print first 20 Fibonacci numbers and their average
 */
public class Fibonacci {
   public static void main (String[] args) {
      int n = 3;          // The index n for F(n), starting from n=3, as n=1 and n=2 are pre-defined
      int fn;             // F(n) to be computed
      int fnMinus1 = 1;   // F(n-1), init to F(2)
      int fnMinus2 = 1;   // F(n-2), init to F(1)
      int nMax = 20;      // maximum n, inclusive
      int sum = fnMinus1 + fnMinus2;  // Need sum to compute average
      double average;
 
      System.out.println("The first " + nMax + " Fibonacci numbers are:");
      ......
 
      while (n <= nMax) {  // n starts from 3
            // n = 3, 4, 5, ..., nMax
         // Compute F(n), print it and add to sum
         ......
         // Increment the index n and shift the numbers for the next iteration
         ++n;
         fnMinus2 = fnMinus1;
         fnMinus1 = fn;
      }
 
      // Compute and display the average (=sum/nMax).
      // Beware that int/int gives int.
      ......
   }
}
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)=2Viế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 intlà 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 nlà:
  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 nbị 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;  // Extract the least-significant digit
         // Print this digit
         ......
         n = n / 10;  // Drop the least-significant digit and repeat the loop
      }

5.  Exercises on Input, Decision and Loop

5.1  Add2Integer (Input)

Viết chương trình có tên Add2Integersnhắc nhở người dùng nhập hai số nguyên. Chương trình sẽ đọc hai số nguyên như inttí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;   // For keyboard input
/**
 * 1. Prompt user for 2 integers
 * 2. Read inputs as "int"
 * 3. Compute their sum in "int"
 * 4. Print the result
 */
public class Add2Integers {  // Save as "Add2Integers.java"
   public static void main (String[] args) {
      // Declare variables
      int number1, number2, sum;
      Scanner in = new Scanner(System.in);  // Scan the keyboard for input

      // Put up prompting messages and read inputs as "int"
      System.out.print("Enter first integer: ");  // No newline for prompting message
      number1 = in.nextInt();                     // Read next input as "int"
      ......

      // Compute sum
      sum = ......

      // Display result
      System.out.println("The sum is: " + sum);   // Print with newline
      in.close();  // Close Scanner
   }
}

5.2  SumProductMinMax3 (Arithmetic & Min/Max)

Viết chương trình có tên SumProductMinMax3nhắc nhở người dùng cho ba số nguyên. Chương trình sẽ đọc các đầu vào như inttí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
      // Declare variables
      int number1, number2, number3;  // The 3 input integers
      int sum, product, min, max;     // To compute these
      Scanner in = new Scanner(System.in);  // Scan the keyboard
      
      // Prompt and read inputs as "int"
      ......
      
      // Compute sum and product
      sum = ......
      product = ......

      // Compute min
      // The "coding pattern" for computing min is:
      // 1. Set min to the first item
      // 2. Compare current min with the second item and update min if second item is smaller
      // 3. Repeat for the next item
      min = number1;        // Assume min is the 1st item
      if (number2 < min) {  // Check if the 2nd item is smaller than current min
         min = number2;     // Update min if so
      }
      if (number3 < min) {  // Continue for the next item
         min = number3;
      }
      
      // Compute max - similar to min
      ......
      
      // Print results
      ......
Try
  1. Viết chương trình gọi là SumProductMinMax5nhắc nhở người dùng cho năm số nguyên. Chương trình sẽ đọc các đầu vào như inttí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 intbiế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 CircleComputationnhắ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ư doubletính đường kính, chu vi và diện tích hình tròn trong doublevà 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.PIdo 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
      // Declare variables
      double radius, diameter, circumference, area;  // inputs and results - all in double
      ......

      // Prompt and read inputs as "double"
      System.out.print("Enter the radius: ");
      radius = in.nextDouble();  // read input as double

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

      // Print results using printf() with the following format specifiers:
      //   %.2f for a double with 2 decimal digits
      //   %n for a newline
      System.out.printf("Diameter is: %.2f%n", diameter);
      ......
Try
  1. Viết chương trình có tên SphereComputationnhắc nhở người dùng radiusvề hình cầu trong số dấu phẩy động. Chương trình sẽ đọc đầu vào như doubletính thể tích và diện tích bề mặt của quả cầu trong doublevà 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;   // But this does not work in programming?! Why?
    Lưu ý rằng bạn không thể đặt tên biến surface areabằng dấu cách hoặc surface-areadấu gạch ngang. Quy ước đặt tên của Java là surfaceAreaCác ngôn ngữ khác đề nghị surface_areavới một dấu gạch dưới.
  2. Viết chương trình có tên CylinderComputationnhắc nhở người dùng cho cơ sở radiusvà heightcủa hình trụ theo số dấu phẩy động. Chương trình sẽ đọc các đầu vào như doubletí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 Swap2Integersnhắ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 number1và number2hoá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 xvà y, bạn cần giới thiệu một bộ lưu trữ tạm thời, nói tempvà làm : temp ⇐ xx ⇐ yy ⇐ 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
      // Declare constants first (variables may use these constants)
      // The keyword "final" marked these as constant (i.e., cannot be changed).
      // Use uppercase words joined with underscore to name constants
      final double TAX_RATE_ABOVE_20K = 0.1;
      final double TAX_RATE_ABOVE_40K = 0.2;
      final double TAX_RATE_ABOVE_60K = 0.3;

      // Declare variables
      int taxableIncome;
      double taxPayable;
      ......

      // Compute tax payable in "double" using a nested-if to handle 4 cases
      if (taxableIncome <= 20000) {         // [0, 20000]
         taxPayable = ......;
      } else if (taxableIncome <= 40000) {  // [20001, 40000]
         taxPayable = ......;
      } else if (taxableIncome <= 60000) {  // [40001, 60000]
         taxPayable = ......;
      } else {                              // [60001, ]
         taxPayable = ......;
      }
      // Alternatively, you could use the following nested-if conditions
      // but the above follows the table data
      //if (taxableIncome > 60000) {          // [60001, ]
      //   ......
      //} else if (taxableIncome > 40000) {   // [40001, 60000]
      //   ......
      //} else if (taxableIncome > 20000) {   // [20001, 40000]
      //   ......
      //} else {                              // [0, 20000]
      //   ......
      //}

      // Print results rounded to 2 decimal places
      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,000quá 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 IncomeTaxCalculatorWithSentinelsẽ lặp lại phép tính cho đến khi người dùng nhập -1Ví 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:
      // Declare constants first
      final int SENTINEL = -1;    // Terminating value for input
      ......

      // Declare variables
      int taxableIncome;
      double taxPayable;
      ......

      // Read the first input to "seed" the while loop
      System.out.print("Enter the taxable income (or -1 to end): $");
      taxableIncome = in.nextInt();

      while (taxableIncome != SENTINEL) {
         // Compute tax payable
         ......
         // Print result
         ......

         // Read the next input
         System.out.print("Enter the taxable income (or -1 to end): $");
         taxableIncome = in.nextInt();
            // Repeat the loop body, only if the input is not the SENTINEL value.
            // Take note that you need to repeat these two statements inside/outside the loop!
      }
      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,000Nói cách khác, nếu một nhân viên kiếm được $6,800, chỉ $6,000thu hút sự đóng góp của nhân viên và chủ nhân, thì phần còn lại $800thì 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
      // Declare constants
      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;

      // Declare variables
      int salary, age;     // to be input
      int contributableSalary;
      double employeeContribution, employerContribution, totalContribution;
      ......

      // Check the contribution cap
      contributableSalary = ......
      
      // Compute various contributions in "double" using a nested-if to handle 4 cases
      if (age <= 55) {         // 55 and below
         ......
      } else if (age <= 60) {  // (60, 65]
         ......
      } else if (age <= 65) {  // (55, 60]
         ......
      } else {                 // above 65
         ......
      }
      // Alternatively,
      //if (age > 65) ......
      //else if (age > 60) ......
      //else if (age > 55) ......
      //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à PensionContributionCalculatorWithSentinelsẽ 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
      // Read the first input to "seed" the while loop
      System.out.print("Enter the monthly salary (or -1 to end): $");
      salary = in.nextInt();

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

         ......
         ......
         
         // Read the next input and repeat
         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à $100và $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 -1và 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
      // Declare constants
      final double SALES_TAX_RATE = 0.07;
      final int SENTINEL = -1;        // Terminating value for input
      
      // Declare variables
      double price, actualPrice, salesTax;  // inputs and results
      double totalPrice = 0.0, totalActualPrice = 0.0, totalSalesTax = 0.0;  // to accumulate
      ......

      // Read the first input to "seed" the while loop
      System.out.print("Enter the tax-inclusive price in dollars (or -1 to end): ");
      price =  in.nextDouble();

      while (price != SENTINEL) {
         // Compute the tax
         ......
         // Accumulate into the totals
         ......
         // Print results
         ......

         // Read the next input and repeat
         System.out.print("Enter the tax-inclusive price in dollars (or -1 to end): ");
         price =  in.nextDouble();
      }
      // print totals
      ......

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ư intvà 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.
      // Declare variables
      int inNumber;   // to be input
      int inDigit;    // each digit
      ......

      // Extract and drop the "last" digit repeatably using a while-loop with modulus/divide operations
      while (inNumber > 0) {
         inDigit = inNumber % 10; // extract the "last" digit
         // Print this digit (which is extracted in reverse order)
         ......
         inNumber /= 10;          // drop "last" digit and repeat
      }
      ......

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ư inttí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-10hoặc 90-100Chương trình sẽ đọc đầu vào như intvà 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 booleancờ để 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..
      // Declare variables
      int numberIn;      // to be input
      boolean isValid;   // boolean flag to control the loop
      ......
      
      // Use a do-while loop controlled by a boolean flag 
      // to repeatably read the input until a valid input is entered
      isValid = false;   // default assuming input is not valid
      do {
         // Prompt and read input
         ......

         // Validate input by setting the boolean flag accordingly
         if (numberIn ......) {
            isValid = true;   // exit the loop
         } else {
            System.out.println(......);  // Print error message and repeat
         }
      } 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-100in 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
      // Declare constant
      final int NUM_STUDENTS = 3;
      
      // Declare variables
      int numberIn;
      boolean isValid;   // boolean flag to control the input validation loop
      int sum = 0;
      double average;
      ......
      
      for (int studentNo = 1; studentNo <= NUM_STUDENTS; ++studentNo) {
          // Prompt user for mark with input validation
          ......
          isValid = false;   // reset assuming input is not valid
          do {
             ......
          } while (!isValid);

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

6.  Exercises on Nested-Loops

6.1  SquarePattern (nested-loop)

Viết chương trình có tên SquarePatternnhắ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à:
      // Outer loop to print each of the rows
      for (int row = 1; row <= size; row++) {  // row = 1, 2, 3, ..., size
         // Inner loop to print each of the columns of a particular row
         for (int col = 1; col <= size; col++) {  // col = 1, 2, 3, ..., size
            System.out.print( ...... );   // Use print() without newline inside the inner loop
            ......
         }
         // Print a newline after printing all the columns
         System.out.println();
      }
Ghi chú
  1. Bạn nên đặt tên cho các chỉ mục vòng lặp rowvà col, KHÔNG ivà j, hoặc x, và yavà b, là vô nghĩa.
  2. Các rowvà colcó 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ừ đó 0Tuy 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 CheckerPatternnhắ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
      // Outer loop to print each of the rows
      for (int row = 1; row <= size; row++) {  // row = 1, 2, 3, ..., size
         // Inner loop to print each of the columns of a particular row
         for (int col = 1; col <= size; col++) {  // col = 1, 2, 3, ..., size
            if ((row % 2) == 0) {   // row 2, 4, 6, ...
               ......
            }
            System.out.print( ...... );   // Use print() without newline inside the inner loop
            ......
         }
         // Print a newline after printing all the columns
         System.out.println();
      }

6.3  TimeTable (nested-loop)

Viết chương trình có tên TimeTablenhắ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*...*nn=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 ivà factorialtạ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. 

// Print factorial of n
public class Factorial {
   public static void main(String[] args) {  // Set an initial breakpoint at this statement
      int n = 20;
      int factorial = 1;

      // n! = 1*2*3...*n
      for (int i = 1; i <= n; i++) {  // i = 1, 2, 3, ..., n
         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 Stringbằ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 Stringgọi inStr, bạn có thể sử dụng inStr.length()để có được độ dài của Stringvà inStr.charAt(idx)để lấy chartại idxvị trí, idxbắt đầu từ 0, tối đa instr.length() - 1.
      // Define variables
      String inStr;        // input String
      int inStrLen;        // length of the input String
      ......

      // Prompt and read input as "String"
      System.out.print("Enter a String: ");
      inStr = in.next();   // use next() to read a String
      inStrLen = inStr.length();
   
      // Use inStr.charAt(index) in a loop to extract each character
      // The String's index begins at 0 from the left.
      // Process the String from the right
      for (int charIdx = inStrLen - 1; charIdx >= 0; --charIdx) {  
            // charIdx = inStrLen-1, inStrLen-2, ... ,0
         ......
      }

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 ( aeiouAEIOU) 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 ccó phải là chữ số không, bạn có thể sử dụng booleanbiểu thức (c >= '0' && c <= '9')hoặc sử dụng booleanchứ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 Stringthà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ụ, %dvà %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 Stringvà 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 breakcâu lệnh, ví dụ:
    switch (inChar) {
       case 'a': case 'b': case 'c':  // No break for 'a' and 'b', fall thru '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 65và char 'D'như 68Tuy nhiên 'A' + 3 gives 68,. Điều này là do char + intđược ngầm định int + inttrả về một intgiá trị. Để có được một chargiá 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 PrintArraynhắ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 intbiến được gọi numItemsSau đó, 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 intmảng được gọi itemsChươ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
      // Declare variables
      int numItems;
      int[] items;  // Declare array name, to be allocated after numItems is known
      ......

      // Prompt for for the number of items and read the input as "int"
      ......
      numItems = ......

      // Allocate the array
      items = new int[numItems];

      // Prompt and read the items into the "int" array, if array length > 0
      if (items.length > 0) {
         ......
         for (int i = 0; i < items.length; ++i) {  // Read all items
            ......
         }
      }

      // Print array contents, need to handle first item and subsequent items differently
      ......
      for (int i = 0; i < items.length; ++i) {
         if (i == 0) {
            // Print the first item without a leading commas
            ......
         } else {
            // Print the subsequent items with a leading commas
            ......
         }
         // or, using a one liner
         //System.out.print((i == 0) ? ...... : ......);
      }

9.2  PrintArrayInStars (Array)

Viết chương trình có tên printArrayInStarsnhắ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 intbiến được gọi numItemsSau đó, 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 intmảng được gọi itemsChươ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
      // Declare variables
      int numItems;
      int[] items;  // Declare array name, to be allocated after numItems is known
      ......
      ......

      // Print array in "index: number of stars" using a nested-loop
      // Take note that rows are the array indexes and columns are the value in that index
      for (int idx = 0; idx < items.length; ++idx) {  // row
         System.out.print(idx + ": ");
         // Print value as the number of stars
         for (int starNo = 1; starNo <= items[idx]; ++starNo) {  // column
            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 intbiến có tên numStudentsSau đó, 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 intmảng được gọi gradesSau đó, chương trình sẽ tính toán và in trung bình ( doublelà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

10.1  exponent() (method)

Viết một phương thức được gọi là exponent(int base, int exp)trả về intgiá trị basetăng lên sức mạnh của expChữ ký của phương thức là:
  public static int exponent(int base, int exp);
Giả sử đó explà một số nguyên không âm và baselà 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 basevà expvà 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) {
      // Declare variables
      int exp;    // exponent (non-negative integer)
      int base;   // base (integer)
      ......
      // Prompt and read exponent and base
      ......
      // Print result
      System.out.println(base + " raises to the power of " + exp + " is: " + exponent(base, exp));
   }

   // Returns "base" raised to the power "exp"
   public static int exponent(int base, int exp) {
      int product = 1;   // resulting product

      // Multiply product and base for exp number of times
      for (......) {
         product *= base;
      }

      return product;
   }
}

10.2  isOdd() (method)

Viết một booleanphươ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ề truenế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 numbervà 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ú.

10.3  hasEight() (method)

Viết một booleanphương pháp gọi là hasEight(), mà phải mất một intnhư là đầu vào và trả về truenếu số chứa các chữ số 8(ví dụ 181681288). 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 -1kết thúc) và tạo tổng các số có chứa chữ số 8Chươ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;  // Terminating input
    int number;
    
    // Read first input to "seed" the while loop
    System.out.print("Enter a positive integer (or -1 to end): ");
    number = in.nextInt();
    
    while (number != SENTINEL) {  // Repeat until input is -1
       ......
       ......
    
       // Read next input. Repeat if the input is not the SENTINEL 
       // Take note that you need to repeat these codes!
       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%10và n=n/10) để trích xuất và thả từng chữ số vào inthoặc chuyển đổi intsang Stringvà sử dụng String's charAt()để kiểm tra từng cái char.

10.4  print() (Array & Method)

Viết một phương thức được gọi print(), trong đó lấy một intmả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ị.

10.5  arrayToString() (Array & Method)

Viết một phương thức được gọi arrayToString(), trong đó lấy một intmảng và trả về a Stringdướ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ề voidnhư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ó.

10.6  contains() (Array & Method)

Viết một booleanphương thức được gọi contains(), trong đó có một mảng intvà một intvà trả về truenếu mảng chứa cái đã cho intChữ 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.

10.7  search() (Array & Method)

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.

10.8  equals() (Array & Method)

Viết một phương thức được gọi search(), trong đó có một mảng intvà một intvà trả về chỉ số mảng nếu mảng chứa giá trị đã cho inthoặc -1cá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 booleanphương thức được gọi copyOf(), trong đó lấy một intmả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().

10.10  swap() (Array & Method)

Viết một phương thức được gọi reverse(), trong đó lấy một mảng intvà đả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ữ.
// Swap item1 and item2
int item1, item2, temp;
temp = item1;
item1 = item2;
item2 = item1;
// You CANNOT simply do: item1 = item2; item2 = item2;

10.11  reverse() (Array & Method)

Viết một phương thức được gọi reverse(), trong đó lấy một mảng intvà đả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) {
       // Swap array[fIdx] and array[bIdx]
       // Only need to transverse half of the array elements
    }
  2. Bạn cần sử dụng một vị trí tạm thời để trao đổi hai vị trí lưu trữ
    // Swap item1 and item2
    int item1, item2, temp;
    temp = item1;
    item1 = item2;
    item2 = item1;
    // You CANNOT simply do: item1 = item2; item2 = item2;

11.  Exercises on Command-line Arguments

11.1  Arithmetic (Command-Line Arguments)

Viết một chương trình gọi Arithmeticlà 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) argsTham 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 Stringmả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 is a String array
args.length is: 3                // length of the array
args[0] is: "12345"              // 1st element of the String array
args[1] is: "4567"               // 2nd element of the String array
args[2] is: "+"                  // 3rd element of the String array
args[0].length() is: 5           // length of 1st String element
args[1].length() is: 4           // length of the 2nd String element
args[2].length() is: 1           // length of the 3rd String element
public class Arithmetic {
  public static void main (String[] args) {
    int operand1, operand2;
    char theOperator;
  
    // Check if there are 3 command-line arguments in the
    //  String[] args by using length variable of array.
    if (args.length != 3) {
      System.err.println("Usage: java Arithmetic int1 int2 op");
      return;
    }
   
    // Convert the 3 Strings args[0], args[1], args[2] to int and char.
    // Use the Integer.parseInt(aStr) to convert a String to an int.
    operand1 = Integer.parseInt(args[0]);
    operand2 = ......
   
    // Get the operator, assumed to be the first character of
    //  the 3rd string. Use method charAt() of String.
    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

Post a Comment

أحدث أقدم