Bạn cần phải tự làm những bài tập này. Nếu có thắc mắc xin mời vô nhóm CodeLean để được giải đáp 😉
Tóm Tắt
1. Getting Started Exercises
1.1
HelloWorld
- 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.
public class CheckPassFail { public static void main(String[] args) { int mark = 49; System.out.println("The mark is " + mark); if ( ...... ) { System.out.println( ...... ); } else { System.out.println( ...... ); } System.out.println( ...... ); } }
Cố gắng
mark = 0
,
49
,
50
,
51
,
100
và xác minh kết quả của bạn.
Hãy lưu ý đến việc
thụt
mã nguồn
!!!
Bất cứ khi nào bạn mở một khối với
'{'
, thụt lề tất cả các câu lệnh bên trong khối bằng 3 (hoặc 4 khoảng trắng).
Khi khối kết thúc, bỏ thụt lề đóng
'}'
để căn chỉnh với câu lệnh mở.
1.3
CheckOddEven
(
if-else
)
Viết chương trình gọi là
CheckOddEven
bản in ”
Odd Number
” nếu
int
biến số 341
number
là số lẻ, hoặc
Even Number
khác.
Chương trình sẽ luôn luôn in ra
bye!
trước khi thoát.
Gợi ý
n
là số chẵn nếu
là
;
mặt khác, nó là một số lẻ
Sử dụng
để so sánh, ví dụ ,
.
(n % 2)
0
==
(n % 2) == 0
public class CheckOddEven { public static void main(String[] args) { int number = 49; System.out.println("The number is " + number); if ( ...... ) { System.out.println( ...... ); } else { System.out.println( ...... ); } System.out.println( ...... ); } }
Hãy thử
number = 0
,
1
,
88
,
99
,
-1
,
-2
và xác minh kết quả của bạn.
Một lần nữa, hãy lưu ý về việc xác định mã nguồn!
Tạo thói quen tốt để xác định mã của bạn đúng cách, để dễ đọc chương trình của bạn.
1.4
PrintNumberInWord
(nested-
if
,
switch-case
)
Viết một chương trình gọi
PrintNumberInWord
mà bản in ”
ONE
“, ”
TWO
“, …, ”
NINE
“, ”
OTHER
” nếu
int
biến ”
number
” là
1
,
2
, …,
9
, hoặc khác, tương ứng.
Sử dụng (a) một
if
câu lệnh ”
lồng nhau
“;
(b) một
switch-case-default
tuyên bố “”.
Gợi ý
public class PrintNumberInWord { public static void main(String[] args) { int number = 5; if (number == 1) { System.out.println( ...... ); } else if ( ...... ) { ...... } else if ( ...... ) { ...... ...... ...... } else { ...... } switch(number) { case 1: System.out.println( ...... ); break; case 2: System.out.println( ...... ); break; ...... ...... default: System.out.println( ...... ); } } }
Hãy thử
number = 0
,
1
,
2
,
3
, …,
9
,
10
và xác minh kết quả của bạn.
1.5
PrintDayInWord
(nested-
if
,
switch-case
)
Viết một chương trình gọi
PrintDayInWord
mà bản in “
Sunday
”, “
Monday
”, … “
Saturday
” nếu
int
biến ”
dayNumber
” là
0
,
1
, …,
6
, tương ứng.
Nếu không, nó sẽ in “Không phải là một ngày hợp lệ”.
Sử dụng (a) một
if
câu lệnh ”
lồng nhau
“;
(b) một
switch-case-default
tuyên bố “”.
Hãy thử
dayNumber = 0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
và xác minh kết quả của bạn.
2. Exercises on Number Systems (for Science/Engineering Students)
Để thành thạo lập trình, bạn cần có khả năng vận hành trên các hệ thống số này:
-
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ích
i
,
j
,
k
.
Chúng rất dễ gõ, nhưng thường là vô nghĩa.
Sử dụng tên single-bảng chữ cái chỉ khi ý nghĩa của chúng là rõ ràng, ví dụ
x
,
y
,
z
cho tọa độ và
i
cho chỉ số mảng.
Sử dụng các tên có ý nghĩa như
row
và
(thay vì
và
,
và
,
và
,
(không
)
,
(không
) và
(không
col
x
y
i
j
x1
x2
numStudents
n
maxGrade
size
n
upperbound
n
lần nữa).
Phân biệt giữa danh từ số ít và số nhiều (ví dụ: sử dụng
books
cho một mảng sách và
book
cho mỗi mục).
-
Sử dụng thụt đầu dòng nhất quán và phong cách mã hóa.
Nhiều IDE (như Eclipse / NetBeans) có thể định dạng lại mã nguồn của bạn chỉ bằng một cú nhấp chuột.
-
-
Tài liệu chương trình: Nhận xét!
Bình luận!
và thêm Nhận xét để giải thích mã của bạn cho người khác và cho chính bạn ba ngày sau đó.
4. Exercises on Decision and Loop
4.1
SumAverageRunningInt
(Decision & Loop)
Viết một chương trình gọi là
SumAverageRunningInt
để sản xuất tổng
1
,
2
,
3
, …, để
100
.
Lưu trữ
1
và
100
trong các biến
lowerbound
và
upperbound
, để chúng ta có thể thay đổi giá trị của chúng một cách dễ dàng.
Cũng tính toán và hiển thị trung bình.
Đầu ra sẽ như sau:
The sum of 1 to 100 is 5050 The average is 50.5
Gợi ý
public class SumAverageRunningInt { public static void main (String[] args) { int sum = 0; double average; int lowerbound = 1; int upperbound = 100; for (int number = lowerbound; number <= upperbound; ++number) { sum += number; } ...... ...... } }
Try
-
Sửa đổi chương trình để sử dụng vòng lặp “while-do” thay vì vòng lặp “for”
.
int sum = 0; int number = lowerbound; while (number <= upperbound) { sum += number; ++number; }
-
Sửa đổi chương trình để sử dụng vòng lặp “do-while”
.
int sum = 0; int number = lowerbound; do { sum += number; ++number; } while (number <= upperbound);
-
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ột
int
biến được gọi
count
để đếm các số trong phạm vi chỉ định (sẽ được sử dụng trong tính toán trung bình).
int count = 0; for ( ...; ...; ... ) { ...... ++count; }
-
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
.
-
Sửa đổi chương trình để tạo ra hai tổng: tổng các số lẻ và tổng các số chẵn từ
1
đến
100
.
Ngoài ra máy tính khác biệt tuyệt đối của họ.
HINTS:
:
int sumOdd = 0; int sumEven = 0; int absDiff; ...... for (int number = ...; ...; ...) { if (......) { sumOdd += number; } else { sumEven += number; } } if (sumOdd > sumEven) { absDiff = ......; } else { absDiff = ......; } absDiff = (sumOdd > sumEven) ? ...... : ......;
4.2
Product1ToN
(or
Factorial
) (Decision & Loop)
Viết chương trình được gọi
Product1ToN
để tính tích của các số nguyên từ
1
đến
10
(nghĩa là
1×2×3×...×10
), như một
int
.
Hãy lưu ý rằng nó giống như giai thừa của
N
.
Gợi ý
Khai báo một
int
biến được gọi
product
, khởi tạo thành 1, để tích lũy sản phẩm.
int product = 1; int lowerbound = 1; int upperbound = 10;
Thử
-
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
.
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
.
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
public class HarmonicSum { public static void main (String[] args) { int maxDenominator = 50000; double sumL2R = 0.0; double sumR2L = 0.0; double absDiff; for (int denominator = 1; denominator <= maxDenominator; ++denominator) { ...... } System.out.println("The sum from left-to-right is: " + sumL2R); ...... if (sumL2R > sumR2L) ...... else ...... } }
4.4
ComputePI
(Decision & Loop)
Viết chương trình được gọi
ComputePI
để tính giá trị của π, sử dụng khai triển chuỗi sau.
Sử dụng mẫu số tối đa (
maxDenominator
) làm điều kiện kết thúc.
Hãy thử
maxDenominator
của
1000
,
10000
,
100000
,
1000000
và so sánh PI thu được.
Sê-ri này có phù hợp với máy tính PI không?
Tại sao?
Hints
Thêm vào
sum
nếu
denominator % 4
là
1
và trừ đi
sum
nếu có
3
.
double sum = 0.0; int maxDenominator = 1000; for (int denominator = 1; denominator <= maxDenominator; denominator += 2) { if (denominator % 4 == 1) { sum += ......; } else if (denominator % 4 == 3) { sum -= ......; } else { System.out.println("Impossible!!!"); } } ......
Try
-
Thay vì sử dụng mẫu số tối đa làm điều kiện kết thúc, hãy viết lại chương trình của bạn để sử dụng số lượng điều khoản (
maxTerm
)
tối đa
làm điều kiện kết thúc.
int maxTerm = 10000; int sum = 0.0; for (int term = 1; term <= maxTerm; term++) { if (term % 2 == 1) { sum += 1.0 / (term * 2 - 1); } else { ...... } }
-
JDK duy trì giá trị của π trong
double
hằng số tích hợp có tên là
Math.PI
(
=3.141592653589793
).
Thêm một tuyên bố để so sánh các giá trị thu được và
Math.PI
, trong phần trăm của
Math.PI
, nghĩa là ,
(piComputed / Math.PI) * 100
.
4.5
CozaLozaWoza
(Decision & Loop)
Viết một chương trình gọi là
CozaLozaWoza
có in những con số
1
để
110
,
11
số trên mỗi dòng.
Chương trình sẽ in “Coza” thay cho các số là bội số của 3, “Loza” cho bội số của 5, “Woza” cho bội số của 7, “CozaLoza” cho bội số của 3 và 5, v.v.
Đầu ra sẽ như sau
:
1 2 Coza 4 Loza Coza Woza 8 Coza Loza 11 Coza 13 Woza CozaLoza 16 17 Coza 19 Loza CozaWoza 22 23 Coza Loza 26 Coza Woza 29 CozaLoza 31 32 Coza ......
Hints
public class CozaLozaWoza { public static void main(String[] args) { int lowerbound = 1, upperbound = 110; for (int number = lowerbound; number <= upperbound; ++number) { if ( ...... ) { System.out.print("Coza"); } if ( ...... ) { System.out.print(.....); } ...... if ( ...... ) { ...... } if ( ...... ) { System.out.println(); } else { System.out.print( ...... ); } } } }
Notes
-
Bạn không thể sử dụng lồng nhau-if (nếu … khác nếu … khác nếu … khác) cho vấn đề này.
Đó là bởi vì các bài kiểm tra không loại trừ lẫn nhau.
Ví dụ,
15
chia hết cho cả hai
3
và
5
.
Nested-if chỉ được áp dụng nếu các xét nghiệm loại trừ lẫn nhau.
-
Các xét nghiệm trên có vẻ lộn xộn.
Một giải pháp tốt hơn là sử dụng
boolean
cờ để theo dõi xem số đã được xử lý chưa, như sau:
int lowerbound = 1, upperbound = 110;
boolean printed;
for (int number = lowerbound; number <= upperbound; ++number) {printed = false;
if ( ...... ) { System.out.print( ...... );printed = true;
} if ( ...... ) { System.out.print( ..... );printed = true;
! } ...... if (!printed
) { ...... } ...... }
4.6
Fibonacci
(Decision & Loop)
Viết chương trình được gọi
Fibonacci
để in các
20
số Fibonacci
đầu tiên
F(n)
, ở đâu
F(n)=F(n–1)+F(n–2)
và
F(1)=F(2)=1
.
Cũng tính trung bình của họ.
Đầu ra sẽ như sau:
The first 20 Fibonacci numbers are: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 The average is 885.5
Hints
public class Fibonacci { public static void main (String[] args) { int n = 3; int fn; int fnMinus1 = 1; int fnMinus2 = 1; int nMax = 20; int sum = fnMinus1 + fnMinus2; double average; System.out.println("The first " + nMax + " Fibonacci numbers are:"); ...... while (n <= nMax) { ...... ++n; fnMinus2 = fnMinus1; fnMinus1 = fn; } ...... } }
Try
-
Số Tribonacci
là một chuỗi các con số
T(n)
tương tự như
số Fibonacci
, ngoại trừ một số được hình thành bằng cách thêm ba số trước, tức là
T(n)=T(n-1)+T(n-2)+T(n-3)
,
T(1)=T(2)=1
, và
T(3)=2
.
Viết một chương trình được gọi
Tribonacci
để tạo ra hai mươi số Triborie đầu tiên
.
4.7
ExtractDigits
(Decision & Loop)
Viết chương trình được gọi
ExtractDigits
để trích xuất từng chữ số từ một
int
, theo thứ tự ngược lại.
Ví dụ: nếu
int
là 15423, đầu ra sẽ là “3 2 4 5 1”, với khoảng trắng ngăn cách các chữ số.
Gợi ý
Mẫu
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 sao
int n = ...; while (n > 0) { int digit = n % 10; ...... n = n / 10; }
5. Exercises on Input, Decision and Loop
5.1
Add2Integer
(Input)
Viết chương trình có tên
Add2Integers
nhắc nhở người dùng nhập hai số nguyên.
Chương trình sẽ đọc hai số nguyên như
int
;
tính tổng của chúng;
và in kết quả.
Ví dụ,
Enter first integer: 8 Enter second integer: 9 The sum is: 17
Hints
import java.util.Scanner; public class Add2Integers { public static void main (String[] args) { int number1, number2, sum; Scanner in = new Scanner(System.in); System.out.print("Enter first integer: "); number1 = in.nextInt(); ...... sum = ...... System.out.println("The sum is: " + sum); in.close(); } }
5.2
SumProductMinMax3
(Arithmetic & Min/Max)
Viết chương trình có tên
SumProductMinMax3
nhắc nhở người dùng cho ba số nguyên.
Chương trình sẽ đọc các đầu vào như
int
;
tính tổng, tích, tối thiểu và tối đa của ba số nguyên;
và in kết quả.
Ví dụ như,
,
Enter 1st integer: 8 Enter 2nd integer: 2 Enter 3rd integer: 9 The sum is: 19 The product is: 144 The min is: 2 The max is: 9
Hints
int number1, number2, number3; int sum, product, min, max; Scanner in = new Scanner(System.in); ...... sum = ...... product = ...... min = number1; if (number2 < min) { min = number2; } if (number3 < min) { min = number3; } ...... ......
Try
-
Viết chương trình gọi là
SumProductMinMax5
nhắc nhở người dùng cho năm số nguyên.
Chương trình sẽ đọc các đầu vào như
int
;
tính tổng, tích, tối thiểu và tối đa của năm số nguyên;
và in kết quả.
Sử dụng năm
int
biến:
number1
,,
number2
…,
number5
để lưu trữ các đầu vào.
5.3
CircleComputation
(
double
&
printf()
)
Viết chương trình có tên
CircleComputation
nhắc nhở người dùng về bán kính hình tròn theo số dấu phẩy động.
Chương trình sẽ đọc đầu vào như
double
;
tính đường kính, chu vi và diện tích hình tròn trong
double
;
và in các giá trị được làm tròn đến 2 chữ số thập phân.
Sử dụng hằng số
Math.PI
do
hệ thống cung cấp
cho pi.
Các công thức là:
diameter = 2.0 * radius; area = Math.PI * radius * radius; circumference = 2.0 * Math.PI * radius;
Hints
double radius, diameter, circumference, area; ...... System.out.print("Enter the radius: "); radius = in.nextDouble(); // Compute in "double" ...... System.out.printf("Diameter is: %.2f%n", diameter); ......
Try
-
Viết chương trình có tên
SphereComputation
nhắc nhở người dùng
radius
về hình cầu trong số dấu phẩy động.
Chương trình sẽ đọc đầu vào như
double
;
tính thể tích và diện tích bề mặt của quả cầu trong
double
;
và in các giá trị được làm tròn đến 2 chữ số thập phân.
Các công thức là:
surfaceArea = 4 * Math.PI * radius * radius; volume = 4 /3 * Math.PI * radius * radius * radius;
Lưu ý rằng bạn không thể đặt tên biến
surface area
bằng dấu cách hoặc
surface-area
dấu gạch ngang.
Quy ước đặt tên của Java là
surfaceArea
.
Các ngôn ngữ khác đề nghị
surface_area
với một dấu gạch dưới.
-
Viết chương trình có tên
CylinderComputation
nhắc nhở người dùng cho cơ sở
radius
và
height
của hình trụ theo số dấu phẩy động.
Chương trình sẽ đọc các đầu vào như
double
;
tính diện tích cơ sở, diện tích bề mặt và thể tích của hình trụ;
và in các giá trị được làm tròn đến 2 chữ số thập phân.
Các công thức là:
baseArea = Math.PI * radius * radius; surfaceArea = 2.0 * Math.PI * radius + 2.0 * baseArea; volume = baseArea * height;
5.4
Swap2Integers
Viết chương trình có tên
Swap2Integers
nhắc nhở người dùng cho hai số nguyên.
Chương trình sẽ đọc các đầu vào là
int
, lưu trong hai biến được gọi
number1
và
number2
;
hoán đổi nội dung của hai biến;
và in kết quả.
Ví dụ như,
Enter first integer: 9 Enter second integer: -9 After the swap, first integer is: -9, second integer is: 9
Hints
Để hoán đổi nội dung của hai biến
x
và
y
, bạn cần giới thiệu một bộ lưu trữ tạm thời, nói
temp
và làm :
temp ⇐ x
;
x ⇐ y
;
y ⇐ temp
.
5.5
IncomeTaxCalculator
(Decision)
Thuế suất thuế thu nhập lũy tiến được quy định như sau:
Taxable IncomeRate (%)
First $20,0000
Next $20,00010
Next $20,00020
The remaining30
Ví dụ, giả sử rằng thu nhập chịu thuế là
$85000
, thuế thu nhập phải nộp là
$20000*0% + $20000*10% + $20000*20% + $25000*30%
.
Viết một chương trình được gọi là
IncomeTaxCalculator
đọc thu nhập chịu thuế (in
int
).
Chương trình sẽ tính thuế thu nhập phải nộp (bằng
double
);
và in kết quả làm tròn đến 2 chữ số thập phân.
Ví dụ như,
Enter the taxable income: $41234 The income tax payable is: $2246.80 Enter the taxable income: $67891 The income tax payable is: $8367.30 Enter the taxable income: $85432 The income tax payable is: $13629.60 Enter the taxable income: $12345 The income tax payable is: $0.00
Hints
final double TAX_RATE_ABOVE_20K = 0.1; final double TAX_RATE_ABOVE_40K = 0.2; final double TAX_RATE_ABOVE_60K = 0.3; int taxableIncome; double taxPayable; ...... if (taxableIncome <= 20000) { taxPayable = ......; } else if (taxableIncome <= 40000) { taxPayable = ......; } else if (taxableIncome <= 60000) { taxPayable = ......; } else { taxPayable = ......; } System.out.printf("The income tax payable is: $%.2f%n", ...);
Try
Giả sử rằng một
10%
khoản giảm thuế được thông báo cho thuế thu nhập phải nộp, giới hạn
$1,000
, sửa đổi chương trình của bạn để xử lý khoản giảm thuế.
Ví dụ, giả sử rằng số thuế phải nộp là
$12,000
, giảm giá là
$1,000
, như
10%
của
$12,000
quá nắp.
5.6
IncomeTaxCalculatorWithSentinel
(Decision & Loop)
Dựa trên bài tập trước, hãy viết một chương trình được gọi
IncomeTaxCalculatorWithSentinel
sẽ lặp lại phép tính cho đến khi người dùng nhập
-1
.
Ví dụ,
Enter the taxable income (or -1 to end): $41000 The income tax payable is: $2200.00 Enter the taxable income (or -1 to end): $62000 The income tax payable is: $6600.00 Enter the taxable income (or -1 to end): $73123 The income tax payable is: $9936.90 Enter the taxable income (or -1 to end): $84328 The income tax payable is: $13298.40 Enter the taxable income: $-1 bye!
Giá trị
-1
được gọi là
giá trị sentinel
.
(Wiki: Trong lập trình,
giá trị sentinel
, còn được gọi là giá trị cờ, giá trị chuyến đi, giá trị giả mạo, giá trị tín hiệu hoặc dữ liệu giả, là một giá trị đặc biệt sử dụng sự hiện diện của nó làm điều kiện chấm dứt.)
Gợi ý
Mẫu
mã
để xử lý đầu vào với giá trị sentinel như sau:
final int SENTINEL = -1; ...... int taxableIncome; double taxPayable; ...... System.out.print("Enter the taxable income (or -1 to end): $"); taxableIncome = in.nextInt(); while (taxableIncome != SENTINEL) { ...... ...... System.out.print("Enter the taxable income (or -1 to end): $"); taxableIncome = in.nextInt(); } System.out.println("bye!");
Hãy lưu ý rằng chúng tôi lặp lại các câu lệnh đầu vào bên trong và bên ngoài vòng lặp.
Lặp đi lặp lại tuyên bố KHÔNG phải là một thực hành lập trình tốt.
Điều này là do nó dễ lặp lại (Cntl-C / Cntl-V), nhưng khó duy trì và đồng bộ hóa các câu lệnh lặp lại.
Trong trường hợp này, chúng tôi không có lựa chọn nào tốt hơn!
5.7
PensionContributionCalculator
(Decision)
Cả người sử dụng lao động và người lao động đều được ủy thác đóng góp một tỷ lệ phần trăm nhất định tiền lương của nhân viên vào quỹ hưu trí của nhân viên.
Tỷ lệ được lập bảng như sau:
Employee’s AgeEmployee Rate (%)Employer Rate (%)
55 and below2017
above 55 to 601313
above 60 to 657.59
above 6557.5
Tuy nhiên, sự đóng góp phải chịu mức trần của
$6,000
.
Nói cách khác, nếu một nhân viên kiếm được
$6,800
, chỉ
$6,000
thu hút sự đóng góp của nhân viên và chủ nhân, thì phần còn lại
$800
thì không.
Viết một chương trình được gọi là
PensionContributionCalculator
đọc mức lương hàng tháng và tuổi (trong
int
) của một nhân viên.
Chương trình của bạn sẽ tính toán nhân viên, người sử dụng lao động và tổng đóng góp (trong
double
);
và in kết quả làm tròn đến 2 chữ số thập phân.
Ví dụ như,
Enter the monthly salary: $3000 Enter the age: 30 The employee's contribution is: $600.00 The employer's contribution is: $510.00 The total contribution is: $1110.00
Hints
final int SALARY_CEILING = 6000; final double EMPLOYEE_RATE_55_AND_BELOW = 0.2; final double EMPLOYER_RATE_55_AND_BELOW = 0.17; final double EMPLOYEE_RATE_55_TO_60 = 0.13; final double EMPLOYER_RATE_55_TO_60 = 0.13; final double EMPLOYEE_RATE_60_TO_65 = 0.075; final double EMPLOYER_RATE_60_TO_65 = 0.09; final double EMPLOYEE_RATE_65_ABOVE = 0.05; final double EMPLOYER_RATE_65_ABOVE = 0.075; int salary, age; int contributableSalary; double employeeContribution, employerContribution, totalContribution; ...... contributableSalary = ...... if (age <= 55) { ...... } else if (age <= 60) { ...... } else if (age <= 65) { ...... } else { ...... }
5.8
PensionContributionCalculatorWithSentinel
(Decision & Loop)
Dựa trên trước đó
PensionContributionCalculator
, hãy viết một chương trình được gọi là
PensionContributionCalculatorWithSentinel
sẽ lặp lại các phép tính cho đến khi người dùng nhập -1 cho mức lương.
Ví dụ như,
Enter the monthly salary (or -1 to end): $5123 Enter the age: 21 The employee's contribution is: $1024.60 The employer's contribution is: $870.91 The total contribution is: $1895.51 Enter the monthly salary (or -1 to end): $5123 Enter the age: 64 The employee's contribution is: $384.22 The employer's contribution is: $461.07 The total contribution is: $845.30 Enter the monthly salary (or -1 to end): $-1 bye!
Hints
System.out.print("Enter the monthly salary (or -1 to end): $"); salary = in.nextInt(); while (salary != SENTINEL) { System.out.print("Enter the age: "); age = in.nextInt(); ...... ...... System.out.print("Enter the monthly salary (or -1 to end): $"); salary = in.nextInt(); }
5.9
SalesTaxCalculator
(Decision & Loop)
Thuế doanh thu
7%
được đánh vào tất cả hàng hóa và dịch vụ được tiêu thụ.
Điều bắt buộc là tất cả các thẻ giá phải bao gồm thuế bán hàng.
Ví dụ: nếu một mặt hàng có thẻ giá
$107
, giá thực tế là
$100
và
$7
đi đến thuế bán hàng.
Viết chương trình sử dụng vòng lặp để liên tục nhập giá đã bao gồm thuế (tính bằng
double
);
tính giá thực tế và thuế bán hàng (bằng
double
);
và in kết quả làm tròn đến 2 chữ số thập phân.
Chương trình sẽ chấm dứt để đáp ứng với đầu vào của
-1
;
và in tổng giá, tổng giá thực tế và tổng thuế bán hàng.
Ví dụ như,
Enter the tax-inclusive price in dollars (or -1 to end): 107 Actual Price is: $100.00, Sales Tax is: $7.00 Enter the tax-inclusive price in dollars (or -1 to end): 214 Actual Price is: $200.00, Sales Tax is: $14.00 Enter the tax-inclusive price in dollars (or -1 to end): 321 Actual Price is: $300.00, Sales Tax is: $21.00 Enter the tax-inclusive price in dollars (or -1 to end): -1 Total Price is: $642.00 Total Actual Price is: $600.00 Total Sales Tax is: $42.00
Hints
final double SALES_TAX_RATE = 0.07; final int SENTINEL = -1; double price, actualPrice, salesTax; double totalPrice = 0.0, totalActualPrice = 0.0, totalSalesTax = 0.0; ...... System.out.print("Enter the tax-inclusive price in dollars (or -1 to end): "); price = in.nextDouble(); while (price != SENTINEL) { ...... ...... ...... System.out.print("Enter the tax-inclusive price in dollars (or -1 to end): "); price = in.nextDouble(); } ......
5.10
ReverseInt
(Loop with Modulus/Divide)
Viết chương trình nhắc người dùng về số nguyên dương.
Chương trình sẽ đọc đầu vào như
int
;
và in “đảo ngược” của số nguyên đầu vào.
Ví dụ như,
Enter a positive integer: 12345 The reverse is: 54321
Hints
Sử dụng
mẫu mã
sau đây
sử dụng vòng lặp while với các hoạt động mô đun / phân chia lặp lại để trích xuất và thả chữ số cuối của số nguyên dương.
int inNumber; int inDigit; ...... while (inNumber > 0) { inDigit = inNumber % 10; ...... inNumber /= 10; } ......
5.11
SumOfDigitsInt
(Loop with Modulus/Divide)
Viết chương trình nhắc người dùng về số nguyên dương.
Chương trình sẽ đọc đầu vào như
int
;
tính toán và in tổng của tất cả các chữ số của nó.
Ví dụ như
,
Enter a positive integer: 12345 The sum of all digits is: 15
Hints
Xem lại “ReverseInt
“.
5.12
InputValidation
(Loop with
boolean
flag)
Chương trình của bạn thường cần xác thực các đầu vào của người dùng, ví dụ: các dấu sẽ nằm trong khoảng từ 0 đến 100.
Viết chương trình nhắc người dùng cho một số nguyên giữa
0-10
hoặc
90-100
.
Chương trình sẽ đọc đầu vào như
int
;
và lặp lại cho đến khi người dùng nhập một đầu vào hợp lệ.
Ví dụ như
,
Enter a number between 0-10 or 90-100: -1 Invalid input, try again... Enter a number between 0-10 or 90-100: 50 Invalid input, try again... Enter a number between 0-10 or 90-100: 101 Invalid input, try again... Enter a number between 0-10 or 90-100: 95 You have entered: 95
Hints
Sử dụng
mẫu mã
sau đây
sử dụng vòng lặp do-while được điều khiển bởi
boolean
cờ để xác thực đầu vào.
Chúng tôi sử dụng vòng lặp do-while thay vì vòng lặp while-do vì chúng tôi cần thực thi phần thân để nhắc và xử lý đầu vào ít nhất một lần.
.
int numberIn; boolean isValid; ...... isValid = false; // default assuming input is not valid do { ...... if (numberIn ......) { isValid = true; } else { System.out.println(......); } } while (!isValid); ......
5.13
AverageWithInputValidation
(Loop with
boolean
flag)
Viết chương trình nhắc người dùng đánh dấu (giữa
0-100
in
int
) của 3 sinh viên;
tính trung bình (tính bằng
double
);
và in kết quả được làm tròn đến 2 chữ số thập phân.
Chương trình của bạn cần thực hiện xác nhận đầu vào.
Ví dụ như,
Enter the mark (0-100) for student 1: 56 Enter the mark (0-100) for student 2: 101 Invalid input, try again... Enter the mark (0-100) for student 2: -1 Invalid input, try again... Enter the mark (0-100) for student 2: 99 Enter the mark (0-100) for student 3: 45 The average is: 66.67
Hints
final int NUM_STUDENTS = 3; int numberIn; boolean isValid; int sum = 0; double average; ...... for (int studentNo = 1; studentNo <= NUM_STUDENTS; ++studentNo) { ...... isValid = false; do { ...... } while (!isValid); sum += ......; } ......
6. Exercises on Nested-Loops
6.1
SquarePattern
(nested-loop)
Viết chương trình có tên
SquarePattern
nhắc nhở người dùng về kích thước (số nguyên không âm trong
int
);
và in mẫu hình vuông sau bằng cách sử dụng hai vòng lặp lồng nhau.
Enter the size: 5 # # # # # # # # # # # # # # # # # # # # # # # # #
Hints
Mẫu
mã
để in các mẫu 2D bằng các vòng lặp lồng nhau là:
for (int row = 1; row <= size; row++) { for (int col = 1; col <= size; col++) { System.out.print( ...... ); ...... } System.out.println(); }
Ghi chú
-
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
.
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
.
Thử
Viết lại chương trình trên bằng các vòng lặp while-do lồng nhau.
6.2
CheckerPattern
(nested-loop)
Viết chương trình có tên
CheckerPattern
nhắc nhở người dùng về kích thước (số nguyên không âm trong
int
);
và in các mẫu bàn cờ sau đây.
Enter the size: 7 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Hints
for (int row = 1; row <= size; row++) { for (int col = 1; col <= size; col++) {if ((row % 2) == 0) {
...... }
System.out.print( ...... ); ...... } System.out.println(); }
6.3
TimeTable
(nested-loop)
Viết chương trình có tên
TimeTable
nhắc nhở người dùng về kích thước (số nguyên dương trong
int
);
và in bảng nhân như hình:
Enter the size: 10 * | 1 2 3 4 5 6 7 8 9 10 -------------------------------------------- 1 | 1 2 3 4 5 6 7 8 9 10 2 | 2 4 6 8 10 12 14 16 18 20 3 | 3 6 9 12 15 18 21 24 27 30 4 | 4 8 12 16 20 24 28 32 36 40 5 | 5 10 15 20 25 30 35 40 45 50 6 | 6 12 18 24 30 36 42 48 54 60 7 | 7 14 21 28 35 42 49 56 63 70 8 | 8 16 24 32 40 48 56 64 72 80 9 | 9 18 27 36 45 54 63 72 81 90 10 | 10 20 30 40 50 60 70 80 90 100
Gợi ý
-
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”.
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”.
7. Debugging/Tracing Programs using a Graphic Debugger
7.1
Factorial
(Using a graphic debugger)
Chương trình sau đây tính toán và in giai thừa của
n
(
).
Tuy nhiên, chương trình có lỗi logic và đưa ra câu trả lời sai cho
(“Yếu tố 20 là -2102132736” – âm tính?!).
=1*2*3*...*n
n=20
Sử dụng trình gỡ lỗi đồ họa của Eclipse / NetBeans để gỡ lỗi chương trình bằng một bước duy nhất thông qua chương trình và lập bảng các giá trị của
i
và
factorial
tại câu lệnh được đánh dấu bởi (
*
).
Bạn nên thử các tính năng sửa lỗi như “Breakpoint”, “Step Over”, “Watch biến”, “Run-to-Line”, “Resume”, “Termination”, trong số những thứ khác.
public class Factorial { public static void main(String[] args) { int n = 20; int factorial = 1; for (int i = 1; i <= n; i++) { factorial = factorial * i; } System.out.println("The Factorial of " + n + " is " + factorial); } }
8. Exercises on
String
and
char
Operations
8.1
ReverseString
(
String
&
char
)
Viết một chương trình gọi là
ReverseString
, mà nhắc nhở người dùng cho một
String
, và in
ngược
của
String
bằng cách chiết xuất và chế biến mỗi nhân vật.
Đầu ra sẽ như sau:
Enter a String: abcdef The reverse of the String "abcdef" is "fedcba".
Hints
Đối với một cuộc
String
gọi
inStr
, bạn có thể sử dụng
inStr.length()
để có được
độ dài
của
String
;
và
inStr.charAt(idx)
để lấy
char
tại
idx
vị trí,
idx
bắt đầu từ 0, tối đa
instr.length() - 1
.
String inStr; int inStrLen; ...... System.out.print("Enter a String: "); inStr = in.next(); inStrLen = inStr.length(); for (int charIdx = inStrLen - 1; charIdx >= 0; --charIdx) { ...... }
8.2
CountVowelsDigits
(
String
&
char
)
Viết một chương trình gọi là
CountVowelsDigits
, mà nhắc nhở người dùng cho một
String
, đếm số lượng các nguyên âm (
a
,
e
,
i
,
o
,
u
,
A
,
E
,
I
,
O
,
U
) và chữ số (
0-9
) chứa trong chuỗi, và in số lượng và tỷ lệ phần trăm (làm tròn đến 2 chữ số thập phân ).
Ví dụ,
Enter a String: testing12345 Number of vowels: 2 (16.67%) Number of digits: 5 (41.67%)
Hints
-
Để kiểm tra xem a
char c
có phải là chữ số không, bạn có thể sử dụng
boolean
biểu thức
(c >= '0' && c <= '9')
;
hoặc sử dụng
boolean
chức năng tích hợp
Character.isDigit(c)
.
-
Bạn có thể sử dụng
in.next().toLowerCase()
để chuyển đổi đầu vào
String
thành chữ thường để giảm số lượng các trường hợp.
-
Để in
%
sử dụng
printf()
, bạn cần sử dụng
%%
.
Điều này là do
%
là một tiền tố cho định dạng định dạng trong
printf()
, ví dụ,
%d
và
%f
.
8.3
PhoneKeyPad
(
String
&
char
)
Trên bàn phím điện thoại, bảng chữ cái được ánh xạ tới chữ số như sau:
ABC(2)
,
DEF(3)
,
GHI(4)
,
JKL(5)
,
MNO(6)
,
PQRS(7)
,
TUV(8)
,
WXYZ(9)
.
Viết chương trình được gọi
PhoneKeyPad
, nhắc nhở người dùng về
String
(không phân biệt chữ hoa chữ thường) và chuyển đổi thành một chuỗi các chữ số bàn phím.
Sử dụng (a) a lồng nhau-
if
, (b) a
switch-case-default
.
Hints
-
Bạn có thể sử dụng
in.next().toLowerCase()
để đọc a
String
và chuyển đổi nó thành chữ thường để giảm các trường hợp của bạn
.
-
Trong
switch-case
, bạn có thể xử lý nhiều trường hợp bằng cách bỏ qua
break
câu lệnh, ví dụ:
switch (inChar) { case 'a': case 'b': case 'c': System.out.print(2); break; case 'd': case 'e': case 'f': ...... default: ...... }
8.4 Caesar’s Code (
String
&
char
)
Mã của Caesar là một trong những kỹ thuật mã hóa đơn giản nhất.
Mỗi chữ cái trong bản rõ được thay thế bằng một chữ cái một số vị trí cố định (
n
) theo bảng chữ cái theo chu kỳ.
Trong bài tập này, chúng ta sẽ chọn
n=3
.
Đó là,
'A'
được thay thế bởi
'D'
,
'B'
bởi
'E'
,
'C'
bởi
'F'
, …,
'X'
bởi
'A'
, …,
'Z'
bởi
'C'
.
Viết chương trình được gọi
để mã hóa mã của Caesar.
Chương trình sẽ nhắc người dùng về một chuỗi ký tự chỉ bao gồm các chữ cái trong trường hợp trộn;
tính toán bản mã;
và in bản mã bằng chữ hoa.
Ví dụ,
CaesarCode
Enter a plaintext string: Testing The ciphertext string is: WHVWLQJ
Gợi ý
-
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ố Unicode
65
và
char
'D'
như
68
.
Tuy nhiên
'A' + 3 gives 68
,.
Điều này là do
char + int
được ngầm định
int + int
trả về một
int
giá trị.
Để có được một
char
giá trị, bạn cần thực hiện truyền kiểu rõ ràng bằng cách sử dụng
(char)('A' + 3)
.
Hãy thử in
('A' + 3)
có và không có loại đúc.
9. Exercises on Array
9.1
PrintArray
(Array)
Viết chương trình có tên
PrintArray
nhắc nhở người dùng về số lượng mục trong một mảng (số nguyên không âm) và lưu nó trong một
int
biến được gọi
numItems
.
Sau đó, nó nhắc người dùng về các giá trị của tất cả các mục và lưu chúng trong một
int
mảng được gọi
items
.
Chương trình sau đó sẽ in nội dung của mảng dưới dạng
[x1, x2, ..., xn]
.
Ví dụ,
Enter the number of items: 5 Enter the value of all items (separated by space): 3 2 5 6 9 The values are: [3, 2, 5, 6, 9]
Hints
int numItems; int[] items; ...... ...... numItems = ...... items = new int[numItems]; if (items.length > 0) { ...... for (int i = 0; i < items.length; ++i) { ...... } } ...... for (int i = 0; i < items.length; ++i) { if (i == 0) { ...... } else { ...... } //System.out.print((i == 0) ? ...... : ......); }
9.2
PrintArrayInStars
(Array)
Viết chương trình có tên
printArrayInStars
nhắc nhở người dùng về số lượng mục trong một mảng (số nguyên không âm) và lưu nó trong một
int
biến được gọi
numItems
.
Sau đó, nó nhắc người dùng về các giá trị của tất cả các mục (số nguyên không âm) và lưu chúng trong một
int
mảng được gọi
items
.
Chương trình sau đó sẽ in nội dung của mảng dưới dạng đồ họa, với chỉ số và giá trị mảng được biểu thị bằng số sao.
Ví dụ như,
Enter the number of items: 5 Enter the value of all items (separated by space): 7 4 3 0 7 0: *******(7) 1: ****(4) 2: ***(3) 3: (0) 4: *******(7)
Hints
int numItems; int[] items; ...... ...... for (int idx = 0; idx < items.length; ++idx) { System.out.print(idx + ": "); for (int starNo = 1; starNo <= items[idx]; ++starNo) { System.out.print("*"); } ...... } ......
9.3
GradesStatistics
(Array)
Viết chương trình nhắc người dùng về số lượng sinh viên trong một lớp (số nguyên không âm) và lưu nó trong một
int
biến có tên
numStudents
.
Sau đó, nó nhắc người dùng cho điểm của từng học sinh (số nguyên từ 0 đến 100) và lưu chúng trong một
int
mảng được gọi
grades
.
Sau đó, chương trình sẽ tính toán và in trung bình (
double
làm tròn đến 2 chữ số thập phân) và tối thiểu / tối đa (in
int
).
Enter the number of students: 5 Enter the grade for student 1: 98 Enter the grade for student 2: 78 Enter the grade for student 3: 78 Enter the grade for student 4: 87 Enter the grade for student 5: 76 The average is: 83.40 The minimum is: 76 The maximum is: 98
10. Exercises on Method
Viết một phương thức được gọi là
exponent(int base, int exp)
trả về
int
giá trị
base
tăng lên sức mạnh của
exp
.
Chữ ký của phương thức là:
public static int exponent(int base, int exp);
Giả sử đó
exp
là một số nguyên không âm và
base
là một số nguyên.
Không sử dụng bất kỳ hàm thư viện Math nào.
Cũng viết
main()
phương thức nhắc người dùng cho
base
và
exp
;
và in kết quả.
Ví dụ,
Enter the base: 3 Enter the exponent: 4 3 raises to the power of 4 is: 81
Hints
...... public class Exponent { public static void main(String[] args) { int exp; int base; ...... ...... System.out.println(base + " raises to the power of " + exp + " is: " + exponent(base, exp)); } public static int exponent(int base, int exp) { int product = 1; for (......) { product *= base; } return product; } }
Viết một
boolean
phương thức được gọi
isOdd()
trong một lớp được gọi
OddEvenTest
, trong đó lấy một
int
đầu vào và trả về
true
nếu nó là số lẻ.
Chữ ký của phương pháp như sau:
public static boolean isOdd(int number);
Đồng thời viết
main()
phương thức nhắc người dùng
number
và in “ODD” hoặc “NGAY”.
Bạn nên kiểm tra đầu vào tiêu cực.
Ví dụ như,
Enter a number: 9 9 is an odd number Enter a number: 8 8 is an even number Enter a number: -5 -5 is an odd number
Hints
Xem ghi chú.
Viết một
boolean
phương pháp gọi là
hasEight()
, mà phải mất một
int
như là đầu vào và trả về
true
nếu số chứa các chữ số
8
(ví dụ
18
,
168
,
1288
).
Chữ ký của phương pháp như sau:
public static boolean hasEight(int number);
Viết chương trình được gọi
MagicSum
, nhắc nhở người dùng về số nguyên (hoặc
-1
kết thúc) và tạo tổng các số có chứa chữ số
8
.
Chương trình của bạn nên sử dụng các phương pháp trên.
Một đầu ra mẫu của chương trình như sau:
Enter a positive integer (or -1 to end): 1 Enter a positive integer (or -1 to end): 2 Enter a positive integer (or -1 to end): 3 Enter a positive integer (or -1 to end): 8 Enter a positive integer (or -1 to end): 88 Enter a positive integer (or -1 to end): -1 The magic sum is: 96
Hints
-
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; int number; System.out.print("Enter a positive integer (or -1 to end): "); number = in.nextInt(); while (number != SENTINEL) { ...... ...... System.out.print("Enter a positive integer (or -1 to end): "); number = in.nextInt(); }
-
Bạn có thể lặp lại sử dụng mô đun / chia (
n%10
và
n=n/10
) để trích xuất và thả từng chữ số vào
int
;
hoặc chuyển đổi
int
sang
String
và sử dụng
String
‘s
charAt()
để kiểm tra từng cái
char
.
Viết một phương thức được gọi
print()
, trong đó lấy một
int
mảng và in nội dung của nó dưới dạng
[a1, a2, ..., an]
.
Hãy lưu ý rằng không có dấu phẩy sau phần tử cuối cùng.
Chữ ký của phương thức như sau:
public static void print(int[] array);
Đồng thời viết trình điều khiển kiểm tra để kiểm tra phương thức này (bạn nên kiểm tra trên mảng trống, mảng một phần tử và mảng phần tử n).
Làm thế nào để xử lý
double[]
hay
float[]
?
Bạn cần viết một phiên bản quá tải cho
double[]
và một phiên bản quá tải cho
float[]
, với các chữ ký sau:
public static void print(double[] array) public static void print(float[] array)
Ở trên được gọi là
nạp chồng phương thức
, trong đó cùng tên phương thức có thể có nhiều phiên bản, được phân biệt bởi danh sách tham số của nó.
Gợi ý
-
Đối với phần tử đầu tiên, in giá trị của nó;
đối với các phần tử tiếp theo, in dấu phẩy theo sau giá trị.
Viết một phương thức được gọi
arrayToString()
, trong đó lấy một
int
mảng và trả về a
String
dưới dạng
[a1, a2, ..., an]
.
Lưu ý rằng phương thức này trả về a
String
, bài tập trước trả về
void
nhưng in ra đầu ra.
Chữ ký của phương thức như sau:
public static String arrayToString(int[] array);
Đồng thời viết trình điều khiển kiểm tra để kiểm tra phương thức này (bạn nên kiểm tra trên mảng trống, mảng một phần tử và mảng phần tử n).
Ghi chú: Điều này tương tự như chức năng tích hợp
Arrays.toString()
.
Bạn có thể nghiên cứu mã nguồn của nó.
Viết một
boolean
phương thức được gọi
contains()
, trong đó có một mảng
int
và một
int
;
và trả về
true
nếu mảng chứa cái đã cho
int
.
Chữ ký của phương thức như sau:
public static boolean contains(int[] array, int key);
Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.
Write a method called search()
, which takes an array of int
and an int
; and returns the array index if the array contains the given int
; or -1
otherwise. The method’s signature is as follows:
public static int search(int[] array, int key);
Also write a test driver to test this method.
Viết một phương thức được gọi
search()
, trong đó có một mảng
int
và một
int
;
và trả về
chỉ số
mảng
nếu mảng chứa giá trị đã cho
int
;
hoặc
-1
cách khác.
Chữ ký của phương thức như sau:
public static boolean equals(int[] array1, int[] array2)
Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.
10.9
copyOf()
(Array & Method)
Viết một
boolean
phương thức được gọi
copyOf()
, trong đó lấy một
int
mảng và trả về một bản sao của mảng đã cho.
Chữ ký của phương thức như sau:
public static int[] copyOf(int[] array)
Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.
Viết một phiên bản khác
copyOf()
lấy tham số thứ hai để chỉ định độ dài của mảng mới.
Bạn nên cắt bớt hoặc pad bằng 0 để mảng mới có độ dài cần thiết.
public static int[] copyOf(int[] array, int newLength)
GHI CHÚ: Điều này tương tự như chức năng tích hợp
Arrays.copyOf()
.
Viết một phương thức được gọi
reverse()
, trong đó lấy một mảng
int
và đảo ngược nội dung của nó.
Ví dụ, mặt trái của
[1,2,3,4]
là
[4,3,2,1]
.
Chữ ký của phương thức như sau:
public static boolean swap(int[] array1, int[] array2)
Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.
Gợi ý
Bạn cần sử dụng một vị trí tạm thời để trao đổi hai vị trí lưu trữ.
int item1, item2, temp; temp = item1; item1 = item2; item2 = item1;
Viết một phương thức được gọi
reverse()
, trong đó lấy một mảng
int
và đảo ngược nội dung của nó.
Ví dụ, mặt trái của
[1,2,3,4]
là
[4,3,2,1]
.
Chữ ký của phương thức như sau:
public static void reverse(int[] array)
Lưu ý rằng mảng được truyền vào phương thức có thể được sửa đổi bằng phương thức (cái này được gọi là ”
truyền bằng tham chiếu
“).
Mặt khác, các nguyên thủy được truyền vào một phương thức không thể được sửa đổi.
Điều này là do một bản sao được tạo và truyền vào phương thức thay vì bản sao gốc (cái này được gọi là ”
truyền theo giá trị
“).
Cũng viết một trình điều khiển thử nghiệm để kiểm tra phương pháp này.
Hints
-
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) { }
-
Bạn cần sử dụng một vị trí tạm thời để trao đổi hai vị trí lưu trữ
int item1, item2, temp; temp = item1; item1 = item2; item2 = item1;
11. Exercises on Command-line Arguments
11.1
Arithmetic
(Command-Line Arguments)
Viết một chương trình gọi
Arithmetic
là mất ba đối số dòng lệnh: hai số nguyên tiếp theo là một toán tử số học (
+
,
-
,
*
hoặc
/
).
Chương trình sẽ thực hiện thao tác tương ứng trên hai số nguyên và in kết quả.
Ví dụ:
java Arithmetic 3 2 + 3+2=5 java Arithmetic 3 2 - 3-2=1 java Arithmetic 3 2 / 3/2=1
Gợi ý
Phương thức
main(String[] args)
này lấy một đối số: “một mảng của
String
“, thường được đặt tên (nhưng không cần thiết)
args
.
Tham số này nắm bắt các đối số dòng lệnh được cung cấp bởi người dùng khi chương trình được gọi.
Ví dụ: nếu người dùng gọi:
java Arithmetic 12345 4567 +
Ba đối số dòng lệnh
"12345"
,
"4567"
và
"+"
sẽ được chụp trong một
String
mảng
{"12345", "4567", "+"}
và thông qua vào
main()
phương pháp như là đối số
args
.
Đó là,
args is: {"12345", "4567", "+"} args.length is: 3 args[0] is: "12345" args[1] is: "4567" args[2] is: "+" args[0].length() is: 5 args[1].length() is: 4 args[2].length() is: 1
public class Arithmetic { public static void main (String[] args) { int operand1, operand2; char theOperator; if (args.length != 3) { System.err.println("Usage: java Arithmetic int1 int2 op"); return; } operand1 = Integer.parseInt(args[0]); operand2 = ...... theOperator = args[2].charAt(0); System.out.print(args[0] + args[2] + args[1] + "="); switch(theOperator) { case ('-'): System.out.println(operand1 - operand2); break; case ('+'): ...... case ('*'): ...... case ('/'): ...... default: System.err.println("Error: invalid operator!"); } } }
Ghi chú:
-
Để cung cấp các đối số dòng lệnh, sử dụng “cmd” hoặc “terminal” để chạy chương trình của bạn ở dạng ”
“.
java ClassName arg1 arg2 ....
-
Để cung cấp các đối số dòng lệnh trong Eclipse, nhấp chuột phải vào mã nguồn ⇒ “Chạy dưới dạng” ⇒ “Chạy Cấu hình …” ⇒ Chọn “Chính” và chọn lớp chính phù hợp ⇒ Chọn “Đối số” Nhập đối số dòng lệnh , ví dụ: “3 2 +” trong “Đối số chương trình”.
-
Để cung cấp đối số dòng lệnh trong NetBeans, nhấp chuột phải vào tên “Dự án” ⇒ “Đặt cấu hình” “Tùy chỉnh …” Chọn danh mục “Chạy” Nhập đối số dòng lệnh, ví dụ: “3 2 +” trong hộp “Đối số” (nhưng đảm bảo bạn chọn lớp Chính phù hợp).
Câu hỏi: Hãy thử ”
java Arithmetic 2 4 *
” (trong shell CMD và Eclipse / NetBeans) và giải thích kết quả thu được.
Làm thế nào để giải quyết vấn đề này?
Trong shell CMD của Windows,
*
được gọi là ký tự đại diện, mở rộng để đưa ra danh sách tệp trong thư mục (được gọi là Shell Expansion).
Ví dụ: ”
dir *.java
” liệt kê tất cả các tệp có phần mở rộng là ”
.java
“.
Bạn có thể trích dẫn kép * để ngăn chặn sự mở rộng vỏ.
Eclipse có một lỗi trong việc xử lý này, thậm chí * được trích dẫn hai lần.
NetBeans ??
SumDigits
(Đối số dòng lệnh)
Viết chương trình được gọi
SumDigits
để tổng hợp các chữ số riêng lẻ của một số nguyên dương, được đưa ra trong dòng lệnh.
Đầu ra sẽ như sau:
java SumDigits 12345 The sum of digits = 1 + 2 + 3 + 4 + 5 = 15