You are on page 1of 18

Khoa Khoa học và Kỹ thuật Máy tính

Bộ môn Khoa học Máy tính

1

KỸ THUẬT LẬP TRÌNH
Bài tập 2
Các cấu trúc rẽ nhánh

Bài mẫu
Viết chương trình tính đường kính, chu vi, diện tích tạo bởi của đường tròn bán kính R.

Prototype: float duongtron(float R);
Flowchart:

Hình 0. Tính đường kính, chu vi, diện tích hình tròn bán kính R

Start
Input R
d ÷ 2*R
p ÷ 2*3.14*R
s ÷ R*R
Print d,p,s
Stop


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

2

Bài tập bắt buộc
Xây dựng prototype và vẽ flow chart cho các bài tập sau:

Bài 1.
Cho 2 số nguyên dương a và b. Kiểm tra xem a có chia hết cho b không?
Lưu ý số nguyên dương là số lớn hơn hoặc bằng 0.

Prototype: int chiahet(int a, int b)
Flowchart:

Hình 1. Kiểm tra tính chia hết

Start
Input a, b
Stop
a ≥ 0 && b ≥ 0
Yes No
b ≠ 0
Print Lổi
dữ liệu
nhập
Print Lổi
chia cho 0
Print Chia
hết
Print Chia
có dư
a mod b = 0
No
Yes
No
Yes


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

3

Bài 2.
Cho 2 người chơi kéo bao búa. Viết chương trình kiểm tra kết quả trò chơi.

Prototype: int keo_bao_bua(char P1, char P2)
“K”: Kéo
“B”: Búa
“G”: Giấy
Flowchart:

Hình 2. Kiểm tra kết quả trò chơi oản tù tì
Start
Input P1, P2
Stop
Yes
(P1=’K’ && P2=’K’)
||(P1=’B’ && P2=’B’)
||(P1=’G’ && P2=’G’)
No
Yes
Print P1 thắng
(P1=’K’ && P2=’B’)
||(P1=’G’ && P2=’K’)
||(P1=’B’ && P2=’G’)
(P1=’B’ && P2=’K’)
||(P1=’K’ && P2=’G’)
||(P1=’G’ && P2=’B’)
Print Hòa
Print P2 thắng
Print Ký tự không hợp lệ
Yes
No
No


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

4

Bài 3.
Nhập vào phương trình bậc hai. Kiểm tra phương trình có mấy nghiệm (không tính nghiệm
phức).

Prototype: int so_nghiem_ptb2(float a, float b, float c)
Flowchart:

Hình 3. Tính số nghiệm trong phương trình bậc hai

Start
Input a, b, c
Stop
Print Vô số
nghiệm
Print Hai
nghiệm
Print Vô
nghiệm
Print Một
nghiệm
Yes
b = 0 c = 0
∆ ÷ b
2
- 4ac
∆ = 0 ∆ > 0
a = 0
No
Yes
Yes
Yes Yes
No
No
No No


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

5

Bài 4.
Cho một đoạn mã hoán vị giá trị 2 biến như sau:
bien_trung_gian = bien1;
bien1 = bien2;
bien2 = bien_trung_gian;
Hãy viết 1 chương trình hoán vị 2 số nguyên dương không sử dụng biến trung gian.

Prototype: void hoanvi(int x, int y)
Flowchart: Có 2 cách.

Hình 4. Hai phương pháp hoán vị không cần biến trung gian
*** Lưu ý: cách 1 có thể bị tràn số nếu x và y quá lớn

Start
Stop
Print x, y
x ÷ x + y
x ÷ x - y
y ÷ x - y
Input x, y
Print x, y
x ÷ x - y
y ÷ x + y
x ÷ y - x
Stop
a<0 || b<0
Print lổi dữ liệu
No
Yes
Start
Input x, y
a<0 || b<0
Print lổi dữ liệu
No
Yes


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

6

Bài 5.
Cho 2 đường tròn. Tính số điểm mà chúng cắt nhau.
Lưu ý: Một đường tròn bao gồm tâm (x, y) và bán kính R > 0.

Prototype: int tinh_so_diem_trung(float x1, float y1, float R1, float x2, float y2, float R2)
Flowchart:

Hình 5. Tính số điểm giao nhau giữa 2 dường tròn


Start
Stop
Yes
(|R1-R2| = d)
||(R1+R2 = d)
Yes
Print Vô số điểm
(Trùng nhau)
Input x1, y1, R1, x2, y2,
R2
d ÷ sqrt((x2-x1)
2
– (y2-y1)
2
)
x1=x2&&y1=y2
&&R1=R2
R1+R2 > d
&& |R1-R2| < d
Print 2 điểm
(Cắt nhau)
Print 1 điểm
(Tiếp xúc nhau)
Print 0 điểm
(Không cắt nhau)
Yes
No
No
No


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

7

Bài 6.
Giả sử hôm nay là ngày 31-12-1999.
Nhập vào ngày sinh của một người. Tính số lần sinh nhật của người đó cho tới thời điểm hiện
tại (31-12-1999). Ví dụ: Một người sinh vào ngày 31-12-1969 => Anh ta có 31 lần sinh nhật.
Giới hạn: Chỉ cho phép nhập năm sinh trong khoảng 1901-1999.
Lưu ý: Dữ liệu đầu vào luôn hợp lệ (không cần kiểm tra).

Prototype: int tinh_so_lan_sinh_nhat(int ngay, int thang, int nam)
Trường hợp đặc biệt: Người sinh 29-2 năm nhuần, giữa 2 lần sinh nhật cách nhau 4 năm.
Flowchart:

Hình 6. Tính số lần sinh nhật dựa vào ngày sinh
Start
Input ngay, thang, nam
Stop
L ÷ (2000-nam) div 4 L ÷ 2000-nam
Print L
ngay=29 && thang=2
Yes
No


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

8

Bài tập làm thêm

Bài 7.
Chuyển đổi giữa mét và inch.
Hướng dẫn: 1 inch = 2,54 cm.

Prototype: float convert(float a,int sel);
//sel=1: inch sang mét, sel ≠1: mét sang inch
Flowchart:

Hình 7. Đổi đơn vị mét và inch


Start
Input sel
m ÷ a*2.54/100
Print Chieu dai met: m
Stop
sel=1?
Yes
Input a
inch ÷ a*100/2.54
Input a
Print Chieu dai inch: icnh
No


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

9

Bài 8.
Viết chương trình nhận vào là một đường tròn tâm O(x0, y0) và bán kính R. Kiểm tra
xem một điểm A(x, y) là nằm trên, trong hay ngoài đường tròn đó.

Prototype: int diemduongtron(float x0, float y0, float R, float Ax, float Ay);
Flowchart:

Hình 8. Xác định vị trí tương đối của điểm và đường tròn

Start
Input
x0,y0,R,Ax,Ay
dist ÷ sqrt(sqr(Ax-x0)+sqr(Ay-y0))
Print Trong
ĐT
Stop
dist<R?
Yes
No
Print Trên ĐT
Print Ngoài
ĐT
dist=R?
Yes
No


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

10

Bài 9.
Cho độ dài 3 cạnh a, b, c, kiểm tra xem nó có phải là 3 cạnh của một tam giác cân, tam
giác đều, tam giác vuông hay tam giác vuông cân không.

Prototype: int tamgiac(int a,int b,int c);
Flowchart:

Hình 9. Xác định đặc điểm tam giác tạo thành từ 3 cạnh a,b,c
Start
Input a,b,c
Print
Không là
tam giác
Stop
((a>|b-c|)&&(a<b+c))&&
((b>|a-c|)&&(b<a+c))&&
((c>|b-a|)&&(c<b+a))?
Yes
Print
Vuông-
Cân
No
Yes No
(a==b)&&
(b==c)?
Print
Đều
Yes
No
(a*a==b*b+c*c)||
(b*b==a*a+c*c)||
(c*c==b*b+a*a)?

(a==b)||(b==c)
||(c==a)?
(a==b)||(b==c)
||(c==a)?
Print
Vuông
Print
Cân
Print
Thuờng
Yes Yes
No No


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

11

Bài 10.
Viết chương trình nhận vào năm hợp lệ, kiểm tra xem đó có phải là năm nhuận hay
không, ghi kết quả ra màn hình.
Hướng dẫn: một năm là nhuận khi mà nó chia hết cho 4 nhưng không chia hết cho 100,
hoặc là nó chia hết cho 400.

Prototype : int kiemtranhuan(int year);
Flowchart :

Hình 10. Kiểm tra một năm là nhuận.

Start
Input year
mod4 ÷ year%4
mod100 ÷ year%100
mod400 ÷ year%400


Print Nhuận
Stop
(mod4==0&&mod100<>0)|
|(mod400==0)?
Print Không nhuận
Yes
No


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

12

Bài 11.
Tính toán cước taxi với giá dịch vụ được tính theo các điều kiện sau của quãng đường đi d:
- d <= 1km: giá 15 000 VND/km,
- 1 km < d <= 10 km: 8 000 VND/km,
- 10 km < d <= 30 km: 6 000 VND/km,
- d > 30 km: 4 000 VND/km.

Prototype: float tientaxi(float d);
Flowchart:

Hình 11. Tính tiền taxi.

Start
Input d
Stop
d>10?

Print tien
d>1?

No
No
d>30?
Yes
No
tien ÷ d*4000
Yes
tien ÷ d*6000
Yes
tien ÷ d*8000
tien ÷ d*15000


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

13

Bài 12.
Tính toán cước taxi ứng với điều kiện sau về quãng đường đi:
- 10 km đầu tiên 10 000 VND/km,
- Từ km 11 tới 30, giá thành 6 000 VND/km,
- Sau 30 km, giá thành là 4 000 VND/km.

Prototype: float tientaxib7(float d);
Flowchart:

Hình 12. Tính tiền taxi.

Start
Input d
Stop
d>10?

Print tien
No
d>30?
Yes
No
tien ÷ (d-30)*4000 + 20*6000 +
10*10000
Yes
tien ÷ (d-10)*6000+10*10000
tien ÷ d*10000


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

14

Bài 13.
Tính tiền điện (nước) phải trả với chi phí tăng tuyến tính từng đoạn theo số kilowatt (hay mét
khối) sử dụng trong một tháng.

Giả sử giá điện tính theo hàm tuyến tính từng đoạn:
¦
¦
¹
¦
¦
´
¦
<
s <
s <
s
=
x khi
x khi
x khi
x khi
x f
200 1877
200 150 1734
150 100 1369
100 1242
) (
Ví dụ: Tiền điện cho 102kWh là 100*1242 + 2*1369 = 126 938VNĐ

Prototype: float tiendiennuoc(float d);
Flowchart:

Hình 13. Tính tiền điện
Start
Input d
Stop
d>150?

Print tien
No
d>200?
Yes
No
tien ÷ (d-200)*1877 + 50*1734
+ 50*1369+100*1242
Yes
tien ÷ (d-150)*1734 +
50*1369+100*1242
tien ÷ d*1242
d>100?

No
Yes
tien ÷ (d-100)*1369+100*1242


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

15

Bài 14.
Sử dụng cấu trúc lựa chọn switch để viết chương trình cho người dùng nhập vào tháng hợp lệ
và in ra số ngày trong tháng đó (giả sử đó không phải là năm nhuận).

Prototype: int songay(int thang);
Flowchart:

Hình 1. Tính số ngày trong tháng


thang
c{4,6,9,11}?
Start
Input thang
Print Tháng 28 ngày
Stop
(thang<1)||(than
g >12)?
Yes
No
Yes
No
(thang ==2)?
Print Tháng 30 ngày
Yes
No
Print Tháng 31 ngày


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

16

Bài 15.
Tính thuế thu nhập cá nhân.
Thuế thu nhập cá nhân có thể được giảm cho các tình huống gia gia cảnh. Từ 01/01/2009,
thu nhập cá nhân từ lợi nhuận kinh doanh, tiền lương, tiền thù lao sẽ thấp hơn so với hoàn
cảnh gia đình chịu thuế. Các khoản khấu trừ điển hình là 4 triệu đồng mỗi tháng thu nhập
đối với người có thu nhập và 1,6 triệu mỗi tháng cho mỗi người phụ thuộc. (Chú ý: thu
nhập chịu thuế, các khoản khấu trừ cho bản thân là 4 triệu đồng mỗi tháng nhưng được
bao gồm trong mức chịu thuế với thuế suất 0%).

Người phụ thuộc bao gồm:
1.Con chưa thành niên;
2. Vợ hoặc chồng và các con đã thành niên nhưng không có khả năng làm việc;
3. Con của bạn là một sinh viên hoặc có thu nhập từ 500 nghìn đồng mỗi tháng hoặc ít
hơn;
4. Ông bà, cha, mẹ,. . . không có khả năng lao động với thu nhập của
500.000 đồng một tháng hoặc ít hơn.

Nhưng số tiền giảm trừ nhiều nhất là 10 triệu, đủ cho 5-6 người phụ thuộc.

Sự tăng dần một phần thuế quan áp dụng với thu nhập từ lợi nhuận kinh doanh, tiền
lương, và tiền thu lao như sau:
- Mức 1: 4 triệu VND một tháng, thuế suất 0%.
- Mức 2: trên 4 triệu đến 6 triệu VND một tháng - thuế suất 5%.
- Mức 3: trên 6 triệu đến 9 triệu VND một tháng - thuế suất 10%.
- Mức 4: trên 9 triệu đến 14 triệu VND một tháng – thuế suất 15%.
- Mức 5: trên 14 triệu đến 24 triệu VND một tháng – thuế suất 20%.
- Mức 6: trên 24 triệu đến 44 triệu VND một tháng – thuế suất 25%.
- Mức 7: trên 44 triệu đến 84 triệu VND một tháng – thuế suất 30%.
- Mức 8: trên 84 triệu VND một tháng – thuế suất 35%.
Ví dụ: thu nhập 10 triệu bị đánh thuế như sau, 6 triệu bị đánh thuế 5%, 3 triệu đánh thuế
10%, 1 triệu bị đánh thuế 15%.
Bảng thuế suất đầy đủ như sau:
- Lãi vay, lợi tức, thu nhập từ tiền vốn góp kinh doanh, tiền lãi.
- Tiết kiệm hơn 5 triệu một tháng là 5%.
- Thu nhập từ chuyển nhượng vốn góp là 25%.
- Thu nhập từ hoán đổi tài sản là 25%.
Những thu nhập khác:
- Thu nhập từ tiền bản quyền tác giả trên 10 triệu VND/lần: 5 %.
- Trúng xổ số, trúng thưởng trên 10 triệu/giải : 10%.
- Thu nhập từ thừa kế, quà tặng trị giá 10 triệu/ lần: 10%.
Ví dụ 1: Thu nhập của ông A là 6 triệu một tháng, và anh ấy nuôi dưỡng 2 đứa con dưới
18 tuổi. Bởi vậy, anh ấy được chấp nhân khấu trừ theo hoàn cảnh gia đình.
Mức thu nhập chịu thuế của ông A sẽ giảm theo hoàn cảnh gia đình anh ấy là 4 triệu
VND một tháng. Hai đứa trẻ là người phụ thuộc, thuế thu nhập khấu trừ liên quan là


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

17

(1.6+1.6) = 3.2 triệu một tháng. Như vậy, tổng giảm trừ của ông A là (4 triệu + 1.6 triệu
+1.6 triệu)= 7.2 triệu, cao hơn mức thu nhập của anh ấy (6 triệu).Ông A sẽ không phải trả
thuế ( Với 2 con nhỏ được tính như người phụ thuộc, thuế thu nhập phải trả được giảm là
1.6 triệu một tháng).
Ví dụ 2: Ông B có thu nhập khoảng 10 triệu 1 tháng, nuôi dưỡng một con nhỏ, bởi vậy
anh ấy được chấp nhận giảm trừ theo hoàn cảnh gia đình.
Ông B sẽ được giảm theo hoàn cảnh gia đình khoảng 4 triệu/ 1 tháng. Một con nhỏ là
người phụ thuộc đem lại sự giảm trừ thuế thu nhập phải nộp là 1.6 triệu/ 1 tháng.
Tổng giảm trừ của ông B là: (4 triệu + 1.6 triệu) = 5,6 triệu.
Khoản thuế mang lại ảnh hưởng từ ông B là 10tr – 5,6tr =4,4tr.
(Mức 2 và mức 3 cho ít hơn 4 triệu được giảm, nhưng vẫn được tính như mức chịu thuế
của thuế suất thu nhập chịu thuế là 0%. (ít hơn 4 triệu + 4.4 triệu )=8.4 triệu.
Tổng tiền thuế phải trả của ông B là: ( 2tr x 5% )+ (2.4tr x 10%)=340.000VND.

Ví dụ 3: Ông C có vợ, bà D, và một đứa con nhỏ là E: ông ấy là đối tượng để giảm thuế
thu nhập theo hoàn cảnh gia đình. Thu nhập của ông C là 5 triệu 1 tháng. Thu nhập của
bà D khoảng 6 triệu/ 1 tháng. Đứa con chưa đến tuổi vị của bà D là đối tượng phụ thuộc
không chỉ một mà cả 2 vợ chồng để giảm thuế thu nhập phải trả khoảng 1.6 triệu một
tháng. (Phụ thuộc vào sự khai báo của ông C và bà D với tổ chức quản lý thuế, nhưng cả
hai vợ chồng đó không được khai báo cùng một người phụ thuộc).
Nếu ông C khai rằng E là người phụ thuộc của ông ấy, tổng giảm trừ sẽ là: 4 triệu + 1.6
triệu = 5,6 triệu >5 triệu thu nhập 1 tháng. Bởi vậy, ông C không phải trả thuế!
Thuế thu nhập phải trả của bà D là: 6 triệu – 4 triệu ( một phần giảm trừ của bà ấy)= 2
triệu. Thuế thu nhập phải trả của bà D là: 2 triệu x 5% = 100.000VND/1 tháng.

Prototype: float ThueTNCN(int sel, float a, int b);
/*a:thu nhập, b: số người phụ thuộc,sel có các giá trị:
1: tính thuế từ lợi nhuận kinh doanh, tiền lương, và tiền thù lao (8 mức) có xét gia cảnh
2: Lãi vay, lợi tức, thu nhập từ tiền vốn góp kinh doanh, tiền lãi tiết kiệm hơn 5 triệu một
tháng (5%)
3: Thu nhập từ chuyển nhượng vốn góp (25%)
4: Thu nhập từ hoán đổi tài sản (25%)
5: Thu nhập từ tiền bản quyền tác giả trên 10 triệu VND/lần (5 %)
6: Trúng xổ số, trúng thưởng trên 10 triệu/giải (10%)
7: Thu nhập từ thừa kế, quà tặng trị giá 10 triệu/ lần (10%)
*/
Flowchart: (thứ nguyên [triệu đồng] cho biến a)


Khoa Khoa học và Kỹ thuật Máy tính
Bộ môn Khoa học Máy tính

18


Start
Input sel,a
selc{2,5}?
Yes
thue ÷ a*0.05
Stop
No
Yes
thue ÷ a*0.1 selc{6,7}?
No
Yes
thue ÷ a*0.25 selc{3,4}?
No
a>84?
Yes
thue ÷ (a - 84)*0.35 + 40*0.3 + 20*0.25 +
10*0.2 + 5*0.15 + 3*0.1 + 2*.05
Input b
a ÷ a – b*1.6
No
a>44?
Yes
thue ÷ (a – 44)*0.3 + 20*0.25 + 10*0.2 +
5*0.15 + 3*0.1 + 2*.05
No
a>24?
Yes
thue ÷ (a – 24)*0.25 + 10*0.2 + 5*0.15 +
3*0.1 + 2*.05
No
a>14?
Yes
thue ÷ (a – 14)*0.2 + 5*0.15 + 3*0.1 + 2*.05
No
a>9?
Yes
thue ÷ (a – 9)*0.15 + 3*0.1 + 2*.05
No
a>6?
Yes
thue ÷ (a – 6)*0.1 + 2*.05
No
a>4?
Yes
thue ÷ (a – 4)*.05
No
thue ÷ 0
Print thue
Hình 15. Tính thuế TNCN
b*1.6>10?
Yes
No a ÷ a – 10