Skkn xây dựng và giải các bài tập thực tế về cấu trúc rẽ nhánh tin học 11 trong dạy học và bồi dưỡng học sinh giỏi tin học

  • docx
  • 26 trang
MỤC LỤC
Nội dung

Trang

1. Lời giới thiệu.....................................................................................................2
2. Tên sáng kiến.....................................................................................................3
3. Tác giả sáng kiến...............................................................................................3
4. Chủ đầu tư tạo ra sáng kiến...............................................................................3
5. Lĩnh vực áp dụng sáng kiến..............................................................................3
6. Ngày sáng kiến được áp dụng lần đầu...............................................................3
7. Mô tả bản chất của sáng kiến............................................................................3
7.1. Lý thuyết về cấu trúc rẽ nhánh.................................................................3
7.1.1. Rẽ nhánh..............................................................................................3
7.1.2. Câu lệnh If - then.................................................................................4
7.1.3. Câu lệnh ghép......................................................................................4
7.2. Xây dựng và giải các bài tập thực tế về cấu trúc rẽ nhánh......................5
7.2.1. Các bài tập có thể áp dụng cho dạy học tin học đại trà.......................5
7.2.2. Các bài tập có thể áp dụng cho bồi dưỡng học sinh giỏi...................14
7.3. Kết quả khi ứng dụng các bài tập thực tế đã xây dựng trong quá trình
dạy học và bồi dưỡng học sinh giỏi tin học..................................................22
8. Những thông tin cần được bảo mật.................................................................24
9. Các điều kiện cần thiết để áp dụng sáng kiến..................................................24
10. Đánh giá lợi ích thu được..............................................................................25
11. Danh sách những tổ chức/cá nhân đã tham gia áp dụng thử hoặc áp dụng
sáng kiến lần đầu.................................................................................................25

BÁO CÁO KẾT QUẢ
NGHIÊN CỨU, ỨNG DỤNG SÁNG KIẾN
1. Lời giới thiệu
Một trong những mục tiêu của chương trình giáo dục phổ thông tổng thể
sắp tới của bậc trung học phổ thông là nhằm giúp học sinh củng cố và phát triển
những kết quả của giáo dục trung học cơ sở, hoàn thiện học vấn phổ thông và có
những hiểu biết thông thường về kỹ thuật và hướng nghiệp, có điều kiện phát
huy năng lực cá nhân để lựa chọn hướng phát triển, tiếp tục học đại học, cao
đẳng, trung cấp, học nghề hoặc đi vào cuộc sống lao động.
Trong đó giáo dục tin học đóng vai trò chủ đạo trong việc chuẩn bị cho
học sinh khả năng tìm kiếm, tiếp nhận, mở rộng tri thức và sáng tạo trong thời
đại cách mạng công nghiệp lần thứ tư và toàn cầu hoá. Tin học có ảnh hưởng
lớn đến cách sống, cách suy nghĩ và hành động của con người, là công cụ hiệu
quả hỗ trợ biến việc học thành tự học suốt đời.
Môn Tin học còn giúp học sinh thích ứng và hoà nhập được với xã hội
hiện đại, hình thành và phát triển cho học sinh năng lực tin học để học tập, làm
việc và nâng cao chất lượng cuộc sống, đóng góp vào sự nghiệp xây dựng và bảo vệ
Tổ quốc.
Một trong những nội dung của tin học là việc lập được các chương trình
tự hoạt động cho máy tính, máy gia dụng. Và để làm được việc đó cần có một
quá trình nghiên cứu, học tập về ngôn ngữ lập trình lâu dài, qua đó nhà lập trình
có thể chọn một ngôn ngữ lập trình thích hợp. Tuy nhiên mọi thứ đều có điểm
khởi đầu của nó, với học sinh việc học Pascal là khởi đầu cho việc tiếp cận ngôn
ngữ lập trình bậc cao. Từ đó các em có thêm một định hướng, một niềm đam mê
về tin học, về nghề nghiệp mà các em chọn sau này. Đồng thời Pascal là một
“ngôn ngữ học đường”.
Bản chất viết chương trình là một môn học khó, trừu tượng, học sinh khó
nắm kiến thức. Học sinh muốn nắm được kiến thức phải nắm vững những kiến
thức cơ bản của các câu lệnh, mà câu lệnh rẽ nhánh là một câu lệnh cơ bản của
mọi ngôn ngữ lập trình.
Từ thực tiễn giảng dạy và bồi dưỡng học sinh giỏi các năm tại trường
THPT Nguyễn Thái Học tôi thấy rằng: Đại đa số học sinh chưa hứng thú học
môn Tin, chưa thấy rõ việc lập trình ứng dụng vào các tình huống trong cuộc
sống như thế nào? Do đó tôi băn khoăn và suy nghĩ vậy làm thế nào để qua mỗi
hoạt động học, qua mỗi bài tập học sinh giải quyết các em sẽ hứng thú, yêu thích
môn Tin hơn? Để các em thấy được sự cần thiết của các ứng dụng tin học vào
trong thực tế cuộc sống hàng ngày ra sao? Để sau này khi học tiếp hoặc tham gia
vào cuộc sống lao động các em có thể áp dụng tin học vào thực tiễn, hoặc có thể
lý giải tin học ứng dụng trong cuộc sống như thế nào? Chính vì những lý do trên
2

nên ngay từ đầu năm học 2019 - 2020 tôi đã chọn và xây dựng đề tài “Xây dựng
và giải các bài tập thực tế về “Cấu trúc rẽ nhánh” tin học 11”.
2. Tên sáng kiến
“Xây dựng và giải các bài tập thực tế về “Cấu trúc rẽ nhánh” tin học 11”.
3. Tác giả sáng kiến
- Họ và tên: Nguyễn Thị Mơ
- Địa chỉ tác giả sáng kiến: trường THPT Nguyễn Thái Học
- Số điện thoại: 0396.88.99.56

E_mail: [email protected]

4. Chủ đầu tư tạo ra sáng kiến: Nguyễn Thị Mơ
5. Lĩnh vực áp dụng sáng kiến: Dạy và học tin học 11 đại trà, bồi dưỡng học
sinh giỏi Tin THPT.
6. Ngày sáng kiến được áp dụng lần đầu: tháng 9 năm 2019
7. Mô tả bản chất của sáng kiến
7.1. Lý thuyết về cấu trúc rẽ nhánh
(Theo chương trình sách giáo khoa Tin học 11 hiện hành)
7.1.1. Rẽ nhánh
Thường ngày, có rất nhiều việc chỉ được thực hiện khi một điều kiện cụ
thể nào đó được thỏa mãn.
Ví dụ, Châu và Ngọc thường cùng nhau chuẩn bị các bài thực hành môn
Tin học.
Một lần Châu hẹn với Ngọc: "Chiều mai nếu trời không mưa thì Châu sẽ
đến nhà Ngọc".
Một lần khác, Ngọc nói với Châu: "Chiều mai nếu trời không mưa thì
Ngọc sẽ đến nhà Châu, nếu mưa thì sẽ gọi điện cho Châu để trao đổi".
Câu nói của Châu cho ta biết một việc làm cụ thể (Châu đến nhà Ngọc) sẽ
được thực hiện nếu một điều kiện cụ thể (trời không mưa) thoả mãn. Ngoài ra
không đề cập đến việc gì sẽ xảy ra nếu điều kiện đó không thoả mãn (trời mưa).
Cách diễn đạt như vậy ta nói thuộc dạng mệnh đề thiếu: Nếu... thì…
Câu nói của Ngọc khẳng định một trong hai việc cụ thể (Ngọc đến nhà
Châu hay Ngọc gọi điện cho Châu) chắc chắn sẽ xảy ra. Tuy nhiên, việc nào
trong hai việc sẽ được thực hiện thì tuỳ thuộc vào điều kiện cụ thể (trời không
mưa) thoả mãn hay không. Cách diễn đạt như vậy ta nói thuộc dạng mệnh đề đủ:
Nếu… thì…, nếu không thì…
Từ đó có thể thấy, trong nhiều thuật toán, các thao tác tiếp theo sẽ phụ
thuộc vào kết quả nhận được từ các bước trước đó.
3

Cấu trúc dùng để mô tả các mệnh đề có dạng như trên được gọi là cấu trúc
rẽ nhánh.
7.1.2. Câu lệnh If - then
Để mô tả cấu trúc rẽ nhánh, Pascal dùng câu lệnh if-then. Tương ứng với
hai dạng mệnh đề thiếu và đủ nói ở trên, Pascal có hai dạng câu lệnh if-then:
a) Dạng thiếu
if <điều kiện> then ;
b) Dạng đủ
if <điều kiện> then else ;
trong đó:
 Điều kiện: Biểu thức quan hệ hoặc lôgic.
 Câu lệnh, câu lệnh 1, câu lệnh 2 là một câu lệnh của Pascal.
Đúng
Câu lệnh

Điều kiện

Đúng

Sai
Câu lệnh
2

Điều kiện

Câu lệnh
1

Sai

Hình 1

Hình 2

Ở dạng thiếu: Đầu tiên điều kiện sẽ được tính và kiểm tra. Nếu điều kiện
đúng (có giá trị true) thì câu lệnh sẽ được thực hiện, ngược lại thì câu lệnh sẽ bị
bỏ qua (Hình 1).
Ở dạng đủ: điều kiện cũng được tính và kiểm tra. Nếu điều kiện đúng thì câu
lệnh 1 sẽ được thực hiện, ngược lại thì câu lệnh 2 sẽ được thực hiện (Hình 2).
Ví dụ 1
if Delta
nghiem.');

<

0

then

writeln('Phuong

trinh

vo

Ví dụ 2
if a mod 3 = 0 then write('a chia het cho 3')
else write('a khong chia het cho 3');
7.1.3. Câu lệnh ghép
Theo cú pháp, sau một số từ khoá (như then hoặc else) phải là một câu lệnh.
Nhưng trong nhiều trường hợp, các thao tác sau những tên dành riêng đó khá
phức tạp, đòi hỏi không phải chỉ một mà là nhiều câu lệnh để mô tả. Trong các
trường hợp như vậy, ngôn ngữ lập trình cho phép gộp một dãy câu lệnh thành
một câu lệnh ghép (hay câu lệnh hợp thành). Chẳng hạn, câu lệnh ghép của
Pascal có dạng:
4

begin

end;
Câu lệnh, câu lệnh 1, câu lệnh 2 trong các câu lệnh if-then ở mục trên có thể
là câu lệnh ghép.
Thuật ngữ câu lệnh được hiểu chung cho câu lệnh đơn và câu lệnh ghép.
Ví dụ
if D < 0 then writeln('Phuong trinh vo nghiem.')
else
begin
x1:= (-b – sqrt(b*b – 4*a*c))/(2*a);
x2:= -b/a-x1
end;
 Chú ý: Trước else không có dấu “;”
7.2. Xây dựng và giải các bài tập thực tế về cấu trúc rẽ nhánh
Các bài tập được xây dựng và giải là các bài tập gắn với các tình huống gần
gũi, quen thuộc trong cuộc sống hàng ngày của các em. Qua mỗi bài tập đó các
em thấy được ứng dụng của tin học trong cuộc sống hàng ngày như thế nào?
Thấy được những phần mềm, ứng dụng không phải quá xa vời, cao siêu mà bắt
nguồn từ những bài học hàng ngày các em được học. Qua hệ thống các bài tập
được xây dựng học sinh cũng hình thành và phát huy năng lực, kĩ năng của mình
để giải quyết các vấn đề thực tiễn trong cuộc sống hoặc lý giải được việc tin học
ứng dụng như thế nào trong thực tế. Hệ thống bài tập được xây dựng từ dễ đến
khó, từ cơ bản đến nâng cao và chia thành 2 loại:
 Các bài tập có thể áp dụng cho dạy và học tin học đại trà trong chương
trình tin học THPT.
 Các bài tập có thể áp dụng cho dạy học và bồi dưỡng học sinh giỏi Tin
học THPT.
Mỗi bài tập xây dựng gồm 3 nội dung:
 Phát biểu nội dung bài toán gắn với tình huống học sinh gặp trong thực tế.
 Phân tích để đưa ra hướng giải của bài toán, có thể phân tích học sinh học
được gì qua bài toán đó, lý do tại sao lại xây dựng và chọn bài toán đó. Từ bài
toán đó có thể nâng cao mở rộng sang bài toán khác không?
 Đưa ra chương trình đề xuất.
7.2.1. Các bài tập có thể áp dụng cho dạy học tin học đại trà
Các bài tập áp dụng cho dạy học tin học đại trà được viết chương trình đề
xuất đầy đủ sử dụng nhập dữ liệu từ bàn phím. Các bài tập này cũng có thể dùng
để dạy học và bồi dưỡng học sinh giỏi.
5

Bài 1: Giải phương trình bậc 2
Bài toán: Lớp 11 năm nay An được cô giáo Tin học giới thiệu mình sẽ được học
lập trình. An liền suy nghĩ luôn chương trình giải phương trình bậc hai trên máy
tính cầm tay không biết họ lập trình ra sao nhỉ? Em giúp An viết chương trình
nhập từ bàn phím hệ số a,b,c. Tìm nghiệm thực của phương trình bậc 2:
ax2+bx+c=0 (a≠0).
Phân tích: bài toán giải phương trình bậc hai là bài toán rất quen thuộc với học
sinh trong toán học. Qua bài toán các em thấy được ứng dụng giải phương trình
bậc hai trong máy tính cầm tay được cài đặt tương tự như chương trình đề xuất.
Chương trình đề xuất:
program Giai_ptb2;
uses crt;
var a,b,c:real; d,x1,x2:real;
begin
Clrscr;
Write('Nhap he so a,b,c:'); readln(a,b,c);
D:=b*b-4*a*c;
if d<0 then writeln('Phuong trinh vo nghiem.')
else if d=0 then writeln('Phuong trinh co
nghiem kep x=',-b/(2*a):8:3)
else begin x1:= (-b-sqrt(d))/(2*a);
x2:= -b/a-x1;
writeln('x1=',x1:8:3,'x2=',x2:8:3);
end;
readln
end.
Bài 2: Ứng dụng trong phần mềm về lịch
Bài toán: Trong những ngày dài nghỉ học vì dịch bệnh Covid-19 An mong mỏi
đến ngày được quay trở lại trường đề gặp lại thầy cô, bạn bè. Mỗi ngày làm bài
tập trên máy tính An lại xem lịch xem hôm nay là thứ mấy, ngày mấy rồi, sắp
đến ngày được đi học trở lại chưa? Khi xem lịch An thấy năm nay là năm nhuận
nên tháng 2 có 29 ngày. An muốn biết thuật toán nào để biết năm nào là năm
nhuận? Vậy em hãy giúp An Tìm số ngày của năm N, biết rằng năm nhuận là
năm chia hết cho 400 hoặc chia hết cho 4 nhưng không chia hết cho 100. Ví dụ,
các năm 2000, 2004 là năm nhuận và có số ngày là 366, các năm 1900, 1945
không phải là năm nhuận và có số ngày là 365.
6

Phân tích: Muốn học sinh biết được thuật toán tìm năm nào là năm nhuận? Các
em cũng thấy bài học của mình được ứng dụng như thế nào trong các phần mềm
của tin học. Mà phần mềm lịch cũng là ứng dụng gần gũi trong cuộc sống của các
em.
Chương trình đề xuất
program Nam_nhuan;
uses crt;
var N, SN: integer;
begin
clrscr;
write('Nam: '); readln(N);
if (N mod 400 = 0)or((N mod 4 = 0)and( N mod 100
<> 0)) then SN:= 366 else SN:= 365;
writeln(' So ngay cua nam ', N,' la ', SN);
readln
end.
Bài 3: Ứng dụng trong viết phần mềm học toán của trẻ em
Bài toán: Những ngày nghỉ học vì dịch bệnh Covid-19 An ở nhà phải trông em
thấy đứa em lớp 1 học toán bằng phần mềm trên máy tính. Khi nhập kết quả
tổng của hai số a và b bất kỳ thì máy tính đưa ra Đúng hay Sai? An nghĩ cái này
dễ mà, kỳ I học Tin mình đã được học cấu trúc rẽ nhánh có gì mà không viết
được. Em giúp An viết chương trình nhập vào hai số nguyên a, b từ bàn phím.
Máy hiển thị a+b=? Người dùng nhập kết quả. Máy hiển thị “Bạn làm đúng rồi”
hoặc “Rất tiếc bạn làm sai rồi”.
Phân tích: Các phần mềm học của trẻ em thường sử dụng rất nhiều câu lệnh if –
then để viết ví dụ như: nếu gõ đáp án đúng thì thế nào, nếu chọn hình đúng thì
thế nào….Qua bài toán này để học sinh thêm yêu thích lập trình.
Chương trình đề xuất:
program Hoc_Toan;
uses crt;
var a,b,c:integer;
begin
clrscr;
write('Nhap a='); readln(a);
write('Nhap b='); readln(b);
write(a,'+',b,'='); readln(c);
if c=a+b then write('Ban lam dung roi!') else
write('Ban lam sai roi!');
readln
end.
7

Bài 4: Ứng dụng trong toán hình học
Bài toán: Nhà trường có một khoảng đất trống sau thư viện và giao cho mỗi lớp
một mảnh vườn hình chữ nhật hoặc hình vuông để trồng hoa.
a. Điều kiện là hình vuông hay hình chữ nhật?
An muốn biết mảnh vườn của lớp mình là hình vuông hay hình chữ nhật. Em
giúp An viết chương trình nhập vào vào độ hai đỉnh đối trên trái và dưới phải
của một tứ giác lồi có các cạnh song song với các trục tọa độ và có tọa độ các
đỉnh là nguyên (như hình dưới).

Hình 3
Kiểm tra xem tứ giác này có phải là hình vuông hay không. Nếu đúng thì đưa ra
thông báo “HINH VUONG”, ngược lại thì đưa ra thông báo “HINH CHU
NHAT”.
Phân tích: Vì các cạnh song song với trục tọa độ nên từ đỉnh trên trái và đỉnh
dưới phải có thể suy ra tọa độ của đỉnh trên phải là (u,y). Điều kiện để là hình
vuông thêm là hai cạnh kề bằng nhau. Tính độ dài cạnh trên và độ dài cạnh bên
phải => điều kiện là: √( x−u)2 +( y− y )2= √(u−u)2+(v− y )2
=> |x−u| = |v− y|
Chương trình đề xuất:
program HV_HCN;
uses crt;
var x,y,u,v:longint;
begin
clrscr;
8

write('Nhap toa do dinh tren trai (x,y):');
readln(x,y);
write('Nhap toa do dinh duoi phai (u,v):');
readln(u,v);
if abs(u-x) = abs(v-y) then write('HINH VUONG')
else write('HINH CHU NHAT');
readln
end.
b. Điều kiện là tam giác và là tam giác gì?
Để cho vườn hoa của lớp mình đặc sắc các bạn trong lớp muốn các cây hoa
trồng sẽ tạo thành một tam giác vuông. Em giúp An viết chương trình nhập vào
3 số nguyên a, b, c. Kiểm tra xem 3 số đó có tạo thành tam giác hay không? Nếu
là tam giác thì có là tam giác vuông hay không?
Phân tích: Điều kiện để 3 số là độ dài 3 cạnh của tam giác là tổng độ dài hai
cạnh bất kỳ lớn hơn cạnh còn lại. Điều kiện để tam giác đã cho khi biết độ dài 3
cạnh là tam giác vuông dựa vào định lý pitago: bình phương cạnh huyền bằng
tổng bình phương hai cạnh góc vuông.
Chương trình đề xuất:
program Tam_giac;
uses crt;
var a,b,c:longint;
begin
clrscr;
write('Nhap 3 so nguyen a, b, c:'); readln(a,b,c);
if (a+b>c) or (a+c>b) or (b+c>a) then
begin write('La tam giac');
if (a*a+b*b=c*c) or (b*b+c*c=a*a) or
(c*c+a*a=b*b) then write(' Tam giac vuong')
else write('Khong vuong');
end else write('Khong la tam giac');
readln
end.
Bài 5: Vườn bách thú
Bài toán: Lần đầu tiên An được đi chơi vườn bách thú An thích nhất các con
sếu vì nhiều con trong số chúng đứng một chân trông rất ngộ nghĩnh, khi đó
chân kia không thấy đâu như vốn sinh ra chúng đã chỉ có một chân. An đếm
được tất cả a chân. Sau khi đi xem các con thú khác An lại quay về chỗ chuồng
sếu. Một số con đã thay đổi vị trí và cách đứng, An đếm lại lần nữa và có số
chân là b.
Qua số chân thì không thể xác định chính xác có tất cả bao nhiêu con sếu
trong chuồng nhưng An vẫn muốn biết có ít nhất và nhiều nhất là bao nhiêu con.
9

Hãy xác định và đưa ra màn hình số lượng sếu tối thiểu và tối đa. Các số a và b
được nhập từ bàn phím. Ví dụ, với a=3 và b=4, số lượng sếu tối thiểu là 2 và tối
đa là 3.
Phân tích: Số liệu quan sát là a chân. Giả sử là mỗi con đứng 2 chân thì số
lượng sếu tối thiểu sẽ là phần nguyên của a+1 chia cho 2. Số lượng sếu tối đa sẽ
là a coi như mỗi con đứng 1 chân. Tương tự số liệu quan sát là b cũng vậy. Kết
quả ta có bảng dưới đây:
Số liệu quan sát

Số lượng sếu tối thiểu

Số lượng sếu tối đa

a

[ 2 ]

a+1

a

b

[ 2 ]

b+1

b

Kết quả

max{ 2 , 2 }

a+1 b+1

min{a,b}

Chương trình đề xuất:
program vuon_bach_thu;
uses crt;
var a,b,c,d,max,min:byte;
begin
clrscr;
write('Nhap a=:'); readln(a);
write('Nhap b=:'); readln(b);
c:=(a+1)div 2; d:=(b+1) div 2;
if c > d then max:=c else max:=d;
if a >b then min:=b else min:=a;
writeln('So luong seu toi da la:',min);
writeln('So luong seu toi thieu la:',max);
readln
end.
Bài 6: Ứng dụng trong tính hoa hồng kinh doanh
Bài toán: Tèo thấy bây giờ người ta đăng bán hàng qua facebook rất nhiều. Qua
tìm hiểu Tèo thấy đấy là xu hướng kinh doanh tất yếu của thời đại công nghiệp
4.0 nên Tèo cũng muốn thử. Tèo tìm hiểu vì mình đang đi học và chưa có vốn
nên Tèo sẽ đăng bài cho một công ty, nếu bán được sản phẩm thì Tèo sẽ được
hưởng hoa hồng, với mức hoa hồng theo doanh số bán hàng tháng như sau:




5% nếu tổng doanh số nhỏ hơn hoặc bằng 2 triệu.
10% nếu tổng doanh số lớn hơn 2 triệu và nhỏ hơn hoặc bằng 4 triệu.
20 % nếu tổng doanh số là lớn hơn 4 triệu.
10

Tèo muốn tính hoa hồng mà mình được hưởng dựa trên doanh số bán hàng. Em
hãy giúp Tèo lập trình nhập vào từ bàn phím doanh số bán hàng (theo đơn vị
tiền triệu) của Tèo mỗi tháng và đưa ra màn hình số tiền hoa hồng mà Tèo được
hưởng?
Phân tích: Tương tự bài trên sử dụng câu lệnh if – then lồng nhau với điều kiện
là doanh thu nằm trong những điều kiện đề bài cho. Qua bài toán học sinh thấy
được xu hướng kinh doanh online trong thời đại công nghệ 4.0
Chương trình đề xuất
program Tinh_hoa_hong;
uses crt;
var a:longint; h:real;
begin
clrscr;
write('Nhap doanh so cua ban (tinh bang trieu):');
readln(a);
if a<=2 then h:=0.05*a
else if(a<=4) and (a>2) then h:=0.1*a
else h:=0.2*a;
write('Muc hoa hong ban duoc huong
la:’,h:0:0,'trieu');
readln
end.
Bài 7: Ứng dụng trong xếp loại học sinh
Bài toán: Năm học này An được cô giáo chủ nhiệm giao nhiệm vụ làm tổ
trưởng phải tổng hợp xếp loại hạnh kiểm hàng tuần của các thành viên trong tổ.
Biết điều kiện điểm nề nếp của các bạn nếu:


Điểm >= 160 là loại A.



Điểm >=130 và < 160 là loại B



Điểm >=100 và < 130 là loại C



Điểm <100 là loại D

Em giúp An lập trình nhập vào điểm nề nếp của một bạn và đưa ra màn hình
xem bạn đó xếp loại nào nhé?
Phân tích: Sử dụng câu lệnh if – then lồng nhau với điều kiện là điểm nề nếp
nằm trong các khoảng mà đề bài cho. Có thể mở rộng bài toán xếp loại trên
thành bài toán xếp loại học lực, hạnh kiểm của học sinh cuối kỳ, cuối năm học
cũng làm tương tự nhưng điều kiện ràng buộc nhiều hơn bài toán trên.
Chương trình đề xuất
program Xep_loai;
uses crt;
11

var a:integer;
begin
clrscr;
write('Nhap diem ne nep:'); readln(a);
if a>=160 then write('Loai A')
else if(a>=130) and (a<160)then write('Loai B')
else if(a>=100) and (a<130)then write('Loai C')
else write('Loai D');
readln
end.
Bài 8: Tính điểm thi đấu của các đội bóng
Bài toán: Trường Tèo tổ chức giải bóng đá khối 11 có 3 đội tham gia là lớp A,
B, C. Giải được tổ chức theo thể thức thi đấu vòng tròn một lượt tính điểm: A
gặp B, A gập C và B gặp C. Điểm mỗi trận đấu tính theo luật FIFA: Đội thắng
được 3 điểm, đội thua được 0 điểm, nếu kết quả hòa thì mỗi đội được 1 điểm.
Kết quả trận A gặp B có tỉ số là p:q – đội A ghi được p bàn thắng và bị thủng
lưới q lần, kết quả trận A gặp C có tỉ số là r:s – đội A ghi được r bàn thắng và bị
thủng lưới s lần, kết quả trận B gặp C có tỉ số là u:v – đội B ghi được u bàn
thắng và bị thủng lưới v lần. Em hãy giúp Tèo viết chương trình nhập từ bàn
phím kết quả các trận đấu và đưa ra màn hình điểm của mỗi đội?
Phân tích: So sánh cặp p-q nếu p>q thì cộng 3 điểm cho đội A, nếu pcộng 3 điểm cho đội B, nếu bằng nhau thì cộng đội A 1 điểm, đội B 1 điểm.
Tương tự so sánh cặp r-s và u-v cũng như vậy.
Chương trình đề xuất
program Tinh_diem_doi_bong;
uses crt;
var p,q,r,s,u,v,a,b,c:byte;
begin
clrscr;
write('Nhap ti so cua tran A gap B:');readln(p,q);
write('Nhap ti so cua tran A gap C:');readln(r,s);
write('Nhap ti so cua tran B gap C:');readln(u,v);
if pq then a:=a+3 else
begin a:=a+1; b:=b+1; end;
if rs then a:=a+3 else
begin a:=a+1; c:=c+1; end;
if uv then b:=b+3 else
begin b:=b+1; c:=b+1; end;
writeln('Diem cua doi A la:',a);
writeln('Diem cua doi B la:',b);
writeln('Diem cua doi C la:',c);
readln
12

end.

Bài 9: Bầu ban cán sự lớp
Bài toán: Đầu năm học lớp Tèo bầu lớp trưởng. Kết quả bầu lớp trưởng cho biết
bạn An được p phiếu, bạn Vinh được q phiếu, bạn Quang được r phiếu. Ai có
phiếu cao nhất sẽ làm lớp trưởng. Nếu có hai phiếu cùng đạt số phiếu cao nhất
hoặc cả ba bạn có cùng số phiếu thì phải bầu lại. Em giúp Tèo viết chương trình
xác định tên bạn được làm lớp trưởng hay thông báo “BAU LAI”.
Phân tích: Áp dụng thuật toán tìm max trong 3 số p, q, r. Xét nếu pmax:=q else max:=p; Sau đó so sánh max với r nếu maxChương trình đề xuất:
program Bau_ban_can_su_lop;
uses crt;
var p,q,r,max:byte;
begin
clrscr;
write('Nhap so phieu cua ban An la:'); readln(p);
write('Nhap so phieu cua ban Vinh la:');readln(q);
write('Nhap so phieu cua ban Quang la:');readln(r);
if (p=q) and (q=r) then write('BAU LAI') else
begin
if p > q then max:=p else max:=q;
if maxif (max=p) and (max=q) then write ('BAU LAI') else
if (max=q) and (max=r) then write ('BAU LAI')
else if (max=p) and (max=r) then write ('BAU LAI')
else begin
if max= p then writeln('Ban la lop truong la:
An');
if max= q then writeln('Ban la lop truong la:
Vinh');
if max= r then writeln('Ban la lop truong la:
Quang');
end;
end;
readln
end.
Bài 10: Tính tiền điện, tiền nước, tiền taxi

13

Bài toán: Tèo đi học về thấy mẹ đang cầm hóa đơn tiền điện và thắc mắc sao
tiền điện nhiều thế nhỉ? Tèo muốn kiểm tra xem phần mềm tính điện in hóa đơn
điện nhà mình có đúng không? Em giúp Tèo lập trình tính số tiền điện phải trả
thực tế (bao gồm cả 10% thuế giá trị giá tăng) mỗi tháng biết bảng giá bán lẻ
điện sinh hoạt được tính như sau:

Hình 4
Phân tích: Sử dụng các câu lệnh if – then lồng nhau với điều kiện là số điện
thuộc 6 mức trên. Qua bài toán học sinh biết được cách tính tiền điện sinh hoạt
trong thực tế như thế nào? Thấy được vấn đề mình học được ứng dụng trong
cuộc sống hàng ngày ra sao?
Chương trình đề xuất:
program Tinh_tien_dien;
uses crt;
var a,t:longint;
begin
clrscr;
write('Nhap so dien tieu thu:'); readln(a);
if a<=50 then t:=a*1678 else if (a>50) and (a<=100)
then t:=50*1678+(a-50)*1734
else if (a>100) and (a<=200) then
t:=50*1678+50*1734+(a-100)*2014
else if (a>200) and (a<=300) then
t:=50*1678+50*1734+100*2014+(a-200)*2536
else if (a>300) and (a<=400) then
t:=50*1678+50*1734+100*2014+100*2536+(a300)*2834
else
t:=50*1678+50*1734+100*2014+100*2536+100
*2834+(a-400)*2927;
write('So tien phai tra thuc te(gom 10% thue GTGT)
la:', t+0.1*t:0:0);
14

readln
end.
7.2.2. Các bài tập có thể áp dụng cho bồi dưỡng học sinh giỏi
Các bài tập áp dụng cho bồi dưỡng học sinh giỏi sẽ giới thiệu chương trình đề
xuất dưới dạng sử dụng kiểu dữ liệu tệp.
Bài 11: Khách sạn
Bài toán: Ở Hội khỏe Phù Đổng các đoàn đại biểu đến tham dự là rất đông, vì
vậy việc bố trí chổ ở cho mỗi đoàn không phải là một chuyện đơn giản. Đoàn
đại biểu của một tỉnh lớn có n người. Khách sạn dành cho đoàn chỉ có 2 loại
phòng: phòng 2 người và phòng 3 người. Để tiết kiệm kinh phí trưởng đoàn
quyết định thuê càng ít phòng càng ít và các phòng được thuê phải ở hết chổ.
Hãy xác định số phòng 2 chổ a2 và số phòng 3 chổ a3 cần thuê.
Dữ liệu: Một dòng duy nhất ghi số nguyên n (n≤109).
Kết quả: Một dòng duy nhất ghi 2 số nguyên a2 và a3 theo yêu cầu đề bài.
Ví dụ:
hotel.inp
7

hotel.out
21

Phân tích: Vì để thuê càng ít phòng càng ít nên ưu tiên thuê phòng 3 trước, số
phòng 3 sẽ là phần nguyên của số người chia cho 3. Các phòng thuê phải ở hết
chỗ nên xét các trường hợp: Nếu số người chia hết cho 3 thì thuê hết phòng 3,
nếu dư 2 thì thuê 1 phòng 2, nếu dư 1 thì thuê 2 phòng 2 và số phòng 3 giảm đi
1.
Chương trình đề xuất:
var n:longint;
begin
assign(input,'hotel.inp'); reset(input);
assign(output,'hotel.out'); rewrite(output);
read(n);
if n mod 3 = 0 then write(0,' ',n div 3) else
if n mod 3 =1 then write(2,' ',(n div 3) -1
else
write(1,' ',n div 3);
close(input); close(output);
end.
Bài 12: Gieo xúc xắc (Đề thi HSG lớp 12 tỉnh Vĩnh Phúc năm 2017 – 2018)
Bài toán: Bờm và Cuội chơi trò chơi gieo xúc xắc như sau: có thể gieo nhiều
lần, ở mỗi lần gieo, điểm của Bờm là số chấm ở mặt ngửa lên trên, điểm của
Cuội là số chấm ở mặt úp xuống sàn; khi kết thúc, tổng điểm của mỗi người
15

được mang ra so sánh để phân định thắng thua. Nhắc lại rằng xúc xắc là khối lập
phương với số chấm ở các cặp mặt đối diện là 1 – 6, 2 – 5, 3 – 4.
Cuộc chơi sắp bắt đầu thì Cuội có việc phải ra ngoài, vì vậy Bờm sẽ là người
gieo xúc xắc còn Phú ông được nhờ giám sát. Khi Cuội quay lại, Phú ông cho
biết tổng điểm hiện có của Bờm là N, nhưng Phú ông và Bờm đều không nhớ
chính xác đã gieo bao nhiêu lần, vì vậy họ gặp khó khăn trong việc xác định
tổng điểm của Cuội. Ba người muốn nhờ bạn xác định tổng điểm nhỏ nhất có
thể, lớn nhất có thể của Cuội.
Dữ liệu: Một dòng duy nhất ghi số nguyên N (1≤N≤1010) là tổng điểm hiện có
của Bờm.
Kết quả: Một dòng duy nhất ghi hai số nguyên theo thứ tự tổng điểm nhỏ nhất
và tổng điểm lớn nhất có thể của Cuội.
Ví dụ:
dicenor.inp

dicenor.out

2

5 12

36

6 216

Phân tích: Để điểm lớn nhất của Cuội thì điểm của Bờm qua mỗi lần gieo sẽ là
1 điểm, như vậy số lần gieo để Cuội được điểm lớn nhất là N, số điểm lớn nhất
của Cuội sẽ là 6xN.
Tương tự để điểm nhỏ nhất của Cuội thì điểm của Bờm qua mỗi lần gieo sẽ là 6
điểm, như vậy số lần gieo để Cuội được điểm nhỏ nhất là N chia cho 6, số dư
còn lại là điểm của Bờm lần cuối, thì điểm của Cuội lần cuối sẽ là 7 – số dư đó
(vì tổng 2 mặt của xúc xắc là 7).
Chương trình đề xuất:
var n,min,max:int64;
begin
assign(input,'dicenor.inp'); reset(input);
assign(output,'dicenor.out'); rewrite(output);
read(n);
max:=n*6;
if n mod 6= 0 then min:= n div 6
else min:= n div 6 + (7 - (n mod 6));
write(min,' ',max);
close(input); close(output);
end.
Bài 13: IQ Test (Đề thi HSG lớp 12 tỉnh Vĩnh Phúc năm 2014 – 2015)
16

Bài toán: Harry đang chuẩn bị cho kỳ thi kiểm tra IQ và Harry cũng được biết
rằng có nhiều câu hỏi dạng: cho một dãy số, tìm số tiếp theo trong dãy. Bây giờ
Harry mới chỉ có thể giải quyết các câu hỏi như trên dưới dạng cấp số cộng hoặc
cấp số nhân:
 Cấp số cộng là dãy a1, a1+d, a1+2d, a1+3d,…,a1+(n-1)d trong đó a1 và d là
bất kỳ.
 Cấp số nhân là dãy b1, b2=b1q, b3=b2q,…, bn=bn-1q trong đó b1≠0, q≠0,
q≠1.
Hãy giúp Harry viết một chương trình xác định xem dãy đã cho là cấp số
cộng hay là cấp số nhân và cũng từ đó để tìm ra số tiếp theo trong dãy. Nếu dãy
đã cho không phải là cấp số cộng và cũng không phải là cấp số nhân, hãy in ra
42 (đó là câu trả lời tốt nhất mà Harry có thể tìm được). Bạn cũng sẽ in ra 42
nếu phần tử tiếp theo trong dãy đó không phải là số nguyên. Dĩ nhiên câu trả lời
luôn là số nguyên.
Dữ liệu: Một dòng duy nhất ghi 4 số nguyên trong đó mỗi số cách nhau ít nhất
bởi một dấu cách, mỗi số đều thuộc đoạn [1;1000].
Kết quả: Nếu dãy đã cho là cấp số cộng hoặc cấp số nhân, in ra phần tử tiếp theo
trong dãy đã cho. Ngược lại in ra số 42.
Ví dụ:
iqtest.inp

iqtest.out

11 234 457 680

903

32 16 8 4

2

1 89 6 55

42

Phân tích: Gọi 4 số đó là a, b, c, d. Trong toán các em đã được học điều kiện 1
dãy là cấp số cộng, cấp số nhân khi nào? Nên điều kiện là cấp số cộng: a+c=2b
và b+d =2c. Điều kiện là cấp số nhân là ac=bb và bd=cc. Chú ý là phải sử dụng
if – then lồng nhau vì có 3 trường hợp.
Chương trình đề xuất:
var a,b,c,d:integer;
begin
assign(input,'iqtest.inp'); reset(input);
assign(output,'iqtest.out'); rewrite(output);
read(a,b,c,d);
if (a+c=2*b) and (b+d=2*c) then write(2*d-c)
else if (a*c=b*b) and (b*d=c*c) then
write(d*d/c:0:0) {vì đề cho luôn là số nguyên
nên lấy phần phân là 0}
17

else write(42);
close(input); close(output);
end.
Bài 14: Táo quân
Bài toán: Có m ông táo và n bà táo được Ngọc Hoàng phân công nhiệm vụ
trong năm mới. Đầu tiên Ngọc Hoàng chọn k táo (ông hoặc bà) làm những
nhiệm vụ đặc biệt tại các Bộ/Ngành, sau đó Ngọc Hoàng sẽ chọn ra các nhóm,
mỗi nhóm gồm đúng 2 ông táo và 1 bà táo để phân công xuống các gia đình
dưới hạ giới.
Yêu cầu: Hãy giúp Ngọc Hoàng xác định số nhóm nhiều nhất để phân công
xuống các gia đình dưới hạ giới.
Ví dụ có m=12 ông táo và n=7 bà táo, có k=5 táo phải làm nhiệm vụ đặc biệt.
Ngọc Hoàng có thể chọn tối đa 4 nhóm phân xuống các gia đình (8 ông táo và 4
bà táo). Trong 7 tào còn lại (4 ông và 3 bà) có 5 táo làm nhiệm vụ đặc biệt, còn
2 táo không được phân việc.
Dữ liệu: Một dòng duy nhất gồm 3 số nguyên dương m, n, k ≤ 109 cách nhau ít
nhất một dấu cách.
Kết quả: Một số nguyên duy nhất là số nhóm nhiều nhất chọn được để phân
xuống các gia đình dưới hạ giới.
Ví dụ:
laser.input
12 7 5

laser.out
4

Phân tích: Vì 1 bà đi với 2 ông nên chúng ta chia làm 2 trường hợp: Trường
hợp số bà táo mà lớn hơn số ông táo chia 2 thì tính số k và số n mới hoặc trường
hợp số bà táo ít hơn số ông táo chia 2 thì tính số k và m mới. Trường hợp k <0
thì số nhóm nhiều nhất chính là n, ngược lại số nhóm n - (k + 2) div 3.
Chương trình đề xuất:
var m, n, k, kq: Integer;
begin
assign(input,'laser.inp'); reset(input);
assign(output,'laser.out'); rewrite(output);
readln(m,n,k);
if n > m div 2 then
begin
k := k - (n - m div 2);
n := m div 2;
end;
if m > 2 * n then
18

begin
k := k - (m - 2 * n);
m := 2 * n;
end;
if k <= 0 then kq := n
else kq := n - (k + 2) div 3;
Write(kq);
close(input); close(output);
end.
Bài 15: Computer
Bài toán: Trong chương trình Chính phủ điện tử, một cơ quan được trang bị một
số khối hệ thống và cũng chừng ấy màn hình. Nhưng khi dự thảo hợp đồng,
không có ai để ý đến việc màn hình có thể có giao diện VGA hoặc DVI, các
khối hệ thống có thể làm việc với loại giao diện này hay giao diện khác hoặc cả
hai.
Công ty giao hàng cũng không thật thiện ý. Họ chuyển tới a1 khối hệ
thống chỉ hỗ trợ giao diện VGA, a2 khối – hỗ trợ giao diện DVI và a3 khối – hỗ
trợ đồng thời cả hai loại giao diện trên. Với màn hình, tình hình cũng tương tự:
có b1 màn hình lắp card VGA, b2 màn hình lắp card DVI và b3 màn hình làm
việc được với cả 2 loại giao diện. Dĩ nhiên a1+ a2 +a3 = b1 + b2 +b3.
Một máy tính có thể lắp ráp được khi khối hệ thống hỗ trợ giao diện
tương ứng của màn hình.
Yêu cầu: Xác định số máy tính có thể lắp ráp được.
Dữ liệu: Gồm 2 dòng :


Dòng 1: Ghi 3 số nguyên a1, a2 và a3 (0 ≤ a1, a2, a3 ≤ 100)



Dòng 2: Ghi 3 số nguyên b1, b2 và b3 (0 ≤ b1, b2, b3 ≤ 100).

Kết quả: Gồm 1 dòng duy nhất ghi kết quả tìm được.
Ví dụ:

computer.inp
346

computer.out
12

2 11 0
Phân tích: Vì a1 chỉ ghép được với b1 nên so sánh a1 với b1, nếu thừa a1 thì so
sánh với b3, nếu thừa b1 thì so sánh với a3. Tương tự cũng so sánh a2 với b2
như trên. Cuối cùng so sánh a3, b3 còn lại.
19

Chương trình đề xuất:
var a1,a2,a3,b1,b2,b3,du,du1,s:integer;
begin
assign(input,'computer.inp'); reset(input);
assign(output,'computer.out'); rewrite(output);
readln(a1,a2,a3);
read(b1,b2,b3);
if a1begin du:=b1-a1; s:=s+a1;
if duelse begin s:=s+a3; a3:=0; end;
end else begin du:=a1-b1; s:=s+b1;
if dus:=s+du; end
else begin s:=s+b3; b3:=0;end;
end;
if a2begin du1:=b2-a2; s:=s+a2;
if du1else begin s:=s+a3; a3:=0; end;
end else begin du1:=a2-b2; s:=s+b2;
if du1s:=s+du1; end
else begin s:=s+b3; b3:=0; end;
end;
if a3write(s);
close(input); close(output);
end.
Bài 16: Hình bình hành (Đề thi HSG lớp 12 tỉnh Vĩnh Phúc năm 2012 – 2013)
Bài toán: Hình bình hành là một tứ giác lồi có các cặp cạnh đối song song. Trên
mặt phẳng với hệ tọa độ Descartes vuông góc, cho bốn điểm có tọa độ nguyên.
Hãy kiểm tra xem có tồn tại một hình bình hành có đỉnh là bốn điểm đó hay
không?
Dữ liệu: Một dòng gồm 8 số nguyên không âm, không vượt quá 1000, là tọa độ
của 4 đỉnh.
Kết quả: Ghi số 1 nếu 4 đỉnh có thể là 4 đỉnh của hình bình hành, ghi số 0 nếu 4
đỉnh đó không tạo thành hình bình hành.
Ví dụ:
ageom.inp

ageom.out
20