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
- Cài đặt JDK
- Cài đặt IntelliJ IDEA
- Đăng ký license miễn phí với tài khoản mail education
- Tham khảo chi tiết phần "Cài đặt môi trường phát triển ứng dụng Java".
- Đọ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.
>=
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 = 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
/** * 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 = 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 ý
/** * 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( ...... ); } } }
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:
- Số thập phân (được sử dụng bởi con người cho đầu vào và đầu ra)
- Nhị phân (được sử dụng bởi máy tính để lưu trữ và xử lý)
- 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:
- 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íchi
,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ôngcol
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ụngbooks
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.
- 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 ý
/** * 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
- 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 }
- 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
- 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
- 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ộtint
biến được gọicount
để đế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; }
- 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
đến100
, nghĩa là1*1 + 2*2 + 3*3 + ... + 100*100
. - 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
đến100
. Ngoà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 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.// Define variables int product = 1; // The accumulated product, init to 1 int lowerbound = 1; int upperbound = 10;
Thử
- 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!
- 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
.
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!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?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ử 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?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; // 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
- 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; // 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 ...... } }
- 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ủaMath.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 { // 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
- 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ả hai3
và5
. Nested-if chỉ được áp dụng nếu các xét nghiệm loại trừ lẫn nhau. - 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; // 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 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
/** * 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
- 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ọiTribonacci
để 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 mã để trích xuất các chữ số riêng lẻ từ một số nguyên
n
là:- Sử dụng
(n % 10)
để trích xuất chữ số cuối cùng (ít quan trọng nhất). - Sử dụng
n = n / 10
để thả chữ số cuối cùng (ít quan trọng nhất). - 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 saoint 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
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; // 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
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
// 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
- 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ămint
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
// 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
- Viết chương trình có tên
SphereComputation
nhắc nhở người dùngradius
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 trongdouble
; 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; // But this does not work in programming?! Why?
Lưu ý rằng bạn không thể đặt tên biếnsurface area
bằng dấu cách hoặcsurface-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. - 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 Income | Rate (%) |
---|---|
First $20,000 | 0 |
Next $20,000 | 10 |
Next $20,000 | 20 |
The remaining | 30 |
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,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 mã để 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 Age | Employee Rate (%) | Employer Rate (%) |
---|---|---|
55 and below | 20 | 17 |
above 55 to 60 | 13 | 13 |
above 60 to 65 | 7.5 | 9 |
above 65 | 5 | 7.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
// 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à 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
// 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à $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
// 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ư
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.
// 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ư
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..// 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-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
// 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
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 mã để 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ú
- 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.
- 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
.
row
và col
, KHÔNG i
và
j, hoặc x
, và y
, a
và b
, là vô nghĩa.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
// 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
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 ý
- Sử dụng
printf()
để định dạng đầu ra, ví dụ, mỗi ô là %4d
.
- Xem bài viết "Cơ bản về Java".
printf()
để định dạng đầu ra, ví dụ, mỗi ô là %4d
.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.
// 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 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
.
// 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 ( 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
- Để kiểm tra xem a
char c
có phải là chữ số không, bạn có thể sử dụngboolean
biểu thức(c >= '0' && c <= '9')
; hoặc sử dụng
boolean
chức năng tích hợpCharacter.isDigit(c)
. - Bạn có thể sử dụng
in.next().toLowerCase()
để chuyển đổi đầu vàoString
thành chữ thường để giảm số lượng các trường hợp. - Để in
%
sử dụngprintf()
, 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 trongprintf()
, 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
- Bạn có thể sử dụng
in.next().toLowerCase()
để đọc aString
và chuyển đổi nó thành chữ thường để giảm các trường hợp của bạn. - Trong
switch-case
, bạn có thể xử lý nhiều trường hợp bằng cách bỏ quabreak
câ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 ý
- 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. - 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. - Lưu ý rằng
char
'A'
được thể hiện dưới dạng số Unicode65
vàchar
'D'
như68
. Tuy nhiên'A' + 3 gives 68
,. Điều này là dochar + int
được ngầm địnhint + int
trả về mộtint
giá trị. Để có được mộtchar
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
// 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
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
// 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
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
10.1 exponent() (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) { // 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
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ú.
10.3 hasEight() (method)
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
- Mẫu mã để 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(); }
- 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àoint
; hoặc chuyển đổiint
sangString
và sử dụngString
'scharAt()
để kiểm tra từng cáichar
.
10.4 print() (Array & Method)
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 ý
- Đố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 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ó.10.6 contains() (Array & Method)
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.
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 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()
.10.10 swap() (Array & Method)
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ữ.
// 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 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
- 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 }
- 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
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:
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 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:
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
إرسال تعليق