Tải bản đầy đủ (.doc) (44 trang)

Lý thuyết và bài tập thực hành có lời giải bồi dưỡng học sinh giỏi tin học 11 cực chuẩn năm 2014

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (333.75 KB, 44 trang )

Tài liệu bồi dưỡng HSG tin học
Bài 1. CÁC CÂU LỆNH CÓ CẤU TRÚC
I. CÂU LỆNH RẼ NHÁNH
1.1. Lệnh IF
Cú pháp: Có 2 dạng:
(1) Dạng thiếu:
IF <Điều kiện > THEN <Câu lệnh>;
(2) Dạng đủ:
IF <Điều kiện> THEN <Câu lệnh 1> ELSE <Câu lệnh 2>;
Sơ đồ thực hiện:
<Điều kiện> là một biểu thức logic hay một biểu thức quan hệ có giá trị là TRUE hoặc
FALSE.
Chú ý: Khi sử dụng câu lệnh IF (2) thì đứng trước từ khoá ELSE không được có dấu chấm
phẩy (;).

Bài tập 1: Viết chương trình nhập vào một số nguyên và kiểm tra xem số vừa nhập là số
chẵn hay số lẻ.
Program BT1;
Uses crt;
Var x:integer;
Begin
Clrscr;
Write('Nhap vao mot so nguyen : ');
Readln(x);
If x MOD 2=0 Then Writeln('So vua nhap vao la so chan')
Else Writeln('So vua nhap vao la so le');
Readln;
End.
Bài tập 2: Viết chương trình giải phương trình bậc nhất ax+b=0
Program BT1;
Uses Crt;


Var a,b,x : real;
GV: Nguyễn Thị Minh Thu 1
(2)
đk
Đ S
CL1 CL2

(1)
đk
Đ S
CL

Giáo án bồi dưỡng HSG Tin học 11
Begin
Clrscr;
Write('Nhap a = ');
Readln(a);
Write('Nhap b = ');
Readln(b);
If a = 0 Then
If b = 0 Then { Trường hợp a = 0 và b = 0 }
Writeln('Phuong trinh co vo so nghiem')
Else { Trường hợp a=0 và b ≠ 0 }
Writeln('Phuong trinh vo nghiem')
Else { Trường hợp a ≠ 0 }
Writeln('Phuong trinh co nghiem la x = ',-b/a:8:2);
Readln;
End.
1.2. Lệnh CASE
Cú pháp:

Dạng 1 Dạng 2
CASE <Biểu thức> OF
<hằng 1>: <câu lệnh 1>;
<hằng 2>: <câu lệnh 2>;

<hằng n>: <câu lệnh n>;
END;
CASE <Biểu thức> OF
<hằng 1>: <câu lệnh 1>;
<hằng 2>: <câu lệnh 2>;

<hằng n>: <câu lệnh n>
ELSE <câu lệnh n+1>;
END;
Trong đó:
 <Biểu thức>: Là một biểu thức kiểu vô hướng đếm được như kiểu nguyên, kiểu kí
tự,
 <Hằng thứ i>: có thể là một giá trị hằng, các giá trị hằng (phân cách nhau bởi dấu
phẩy) hoặc các đoạn hằng (dùng hai dấu chấm để phân cách giữa giá trị đầu và giá trị
cuối).
 Giá trị của biểu thức và giá trị của tập hằng i (i=1¸n) phải có cùng kiểu.
Khi gặp lệnh CASE, chương trình sẽ kiểm tra:
- Nếu giá trị của <biểu thức> nằm trong tập <hằng i> thì máy sẽ thực hiện <câu lệnh i>
tương ứng.
- Ngược lại:
+ Đối với dạng 1: Không làm gì cả.
+ Đối với dạng 2: thực hiện lệnh <câu lệnh n+1>

GV: Nguyễn Thị Minh Thu
2

Giáo án bồi dưỡng HSG Tin học 11
Bài tập 3: Viết chương trình nhập vào tuổi của một người và cho biết người đó là thiếu niên,
thanh niên, trung niên hay lão niên. Biết rằng: nếu tuổi nhỏ hơn 18 là thiếu niên, từ 18 đến
39 là thanh niên, từ 40 đến 60 là trung niên và lớn hơn 60 là lão niên.
Program BT3;
Uses crt;
Var tuoi:Byte;
Begin
Clrscr;
Write(’Nhap vao tuoi cua mot nguoi:');
Readln(tuoi);
Case tuoi Of
1 17: Writeln(’Nguoi nay la thieu nien');
18 39: Writeln(’Nguoi nay la thanh nien');
40 60: Writeln(’Nguoi nay la trung nien');
Else Writeln(’Nguoi nay la lao nien');
End;
Readln;
End.
Bài tập 4: Lập trình nhập tháng, năm. Tính số ngày của tháng đó.
Hướng dẫn: Ta biết các tháng 1, 3, 5, 7, 8, 10, 12 có 31 ngày, 4, 6, 9, 11 có 30 ngày. Riêng
tháng 2 của năm nhuận có 29 ngày còn các năm không nhuận thì có 28 ngày.
Program BT4;
uses crt;
var thang, songay: byte;
nam: integer;
Begin
clrscr;
write('Nhap thang: ');
readln(thang);

write('Nhap nam: ');
readln(nam);
case thang of
1, 3, 5, 7, 8, 10: songay:=31;
4, 6, 9, 11: songay:=30;
2: if (nam mod 400 =0) or ((nam mod 4=0) and (nam mod 100 <>0))
then songay:=28 else songay:=29;
end;
Write('So ngay cua thang ',thang,' nam ',nam,' la ',songay,' ngay');
readln
end.

BÀI TẬP THỰC HÀNH
Bài tập 1: Viết chương trình nhập vào từ bàn phím: giờ, phút, giây. Cộng thêm một số giây
cũng được nhập từ bàn phím. Hãy in ra kết quả sau khi cộng xong.
Gợi ý:
- Gọi số giây được cộng thêm là: s. Gán giây:=giây+s.
- Nếu giây≥60 thì: phút:=phút + giây DIV 60 và giây:=giây MOD 60.
GV: Nguyễn Thị Minh Thu
3
Giáo án bồi dưỡng HSG Tin học 11
- Nếu phút≥60 thì: giờ:=giờ + phút DIV 60 và phút:=phút MOD 60.
Bài tập 2: Viết chương trình tìm Max, Min của 4 số: a, b, c, d.

II. CÂU LỆNH LẶP
2.1. Vòng lặp xác định
Có hai dạng sau:
 Dạng tiến
FOR <biến đếm>:=<giá trị đầu> TO <giá trị cuối> DO <Câu lệnh> ;
 Dạng lùi

FOR <biến đếm>:=<giá trị cuối> DOWNTO <giá trị đầu> DO <Câu lệnh>;
Chú ý: Khi sử dụng câu lệnh lặp FOR cần chú ý các điểm sau:
 <Biến đếm> là biến đơn, thường có kiểu nguyên
 <Giá trị đầu> và <Giá trị cuối> là các biểu thức cùng kiểu với biến đếm
 <Giá trị đầu> bé hơn hoặc bằng < Giá trị cuối>
 Nếu <Giá trị đầu> lớn hơn < Giá trị cuối> thì vòng lặp không thực hiện được
 Không nên tuỳ tiện thay đổi giá trị của biến đếm bên trong vòng lặp FOR vì làm như
vậy có thể sẽ không kiểm soát được biến đếm.
2.2. Vòng lặp không xác định
Dạng REPEAT Dạng WHILE
Repeat
<Dãy câu lệnh>;
Until <Điều kiện>;
While <Điều kiện> Do <Câu lệnh>;
Ý nghĩa:
• Dạng REPEAT: Lặp lại <Dãy câu lệnh> cho đến khi biểu thức <Điều kiện> TRUE thì
dừng.
• Dạng WHILE: Trong khi <Điều kiện> TRUE thì tiếp tục thực hiện <Câu lệnh>.
GV: Nguyễn Thị Minh Thu
4
Repeat
<Câu lệnh>
Đk
Đ
S
Thoát
While
Đk
Đ
S

Thoát
<Câu lệnh>
Giáo án bồi dưỡng HSG Tin học 11

Bài tập 1: Viết chương trình tính tổng S = 1+2+ +N.
Cách 1: Dùng vòng lặp FOR.
Program TinhTong;
Uses crt;
Var N,i,S:integer;
Begin
Clrscr;
Write('Nhap vao gia tri cua N :');
Readln(N);
S:=0;
For i:=1 to N do S:=S+i;
Writeln('Ket qua la :',S);
Readln;
End.
Cách 2: Dùng vòng lặp REPEAT.
Program TinhTong;
Uses crt;
Var N,i,S:integer;
Begin
Clrscr;
Write('Nhap vao gia tri cua N :');
Readln(N);
S:=0; i:=1;
Repeat
S:=S+i;
i:=i+1;

Until i>N;
Writeln('Ket qua la :',S);
Readln;
End.
Cách 3: Dùng vòng lặp WHILE.
Program TinhTong;
Uses crt;
Var N,i,S:integer;
Begin
Clrscr;
Write('Nhap vao gia tri cua N :');
Readln(N);
S:=0; i:=1;
While i<=N Do
GV: Nguyễn Thị Minh Thu
5
Giáo án bồi dưỡng HSG Tin học 11
Begin
S:=S+i;
i:=i+1;
End;
Writeln('Ket qua la :',S);
Readln;
End.

(Vậy đối với bài toán trên ta thấy số lần lặp đã được biết trước ta sử dụng cách 1 ngắn gọn,
đơn giản hơn)

Bài tập 2: Viết chương trình nhập vào N số nguyên từ bàn phím. Hãy tính và in ra màn hình
tổng của các số vừa được nhập vào.

Ý tưởng:
Dùng phương pháp cộng dồn. Cho vòng lặp FOR chạy từ 1 tới N, ứng với lần lặp thứ
i, ta nhập vào số nguyên X và đồng thời cộng dồn X vào biến S.
Program Tong;
Uses crt;
Var n,S,i,x : Integer;
Begin
Clrscr; S:=0;
Write(’Nhap so luong so nguyen: ’);
Readln(n);
For i:=1 To n Do
Begin
Write('Nhap so nguyen thu ',i,’: ’); Readln(x);
S:=S+x;
End;
Writeln(’Tong cac so duoc nhap vao la: ’,S);
Readln;
End.
Bài tập 3: Viết chương trình nhập vào các số nguyên cho đến khi nào gặp số 0 thì kết thúc.
Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào.
Ý tưởng:
Bài toán này không biết chính xác số lần lặp nên ta không thể dùng vòng lặp FOR. Vì
phải nhập vào số nguyên N trước, sau đó mới kiểm tra xem N=0? Do đó ta nên dùng vòng
lặp REPEAT.
Program Nhapso;
Uses crt;
Var N,dem : Integer;
Begin
Clrscr; dem:=0;
Repeat

GV: Nguyễn Thị Minh Thu
6
Giáo án bồi dưỡng HSG Tin học 11
Write('Nhap vao mot so nguyen N= '); Readln(N);
If N MOD 2 = 0 Then dem:=dem+1;
Until N=0;
Writeln(’Cac so chan duoc nhap vao la: ’,dem);
Readln;
End.
Bài tập 4: Viết chương trình nhập vào số nguyên N. In ra màn hình tất cả các ước số của N.
Ý tưởng:
Cho biến i chạy từ 1 tới N div 2. Nếu N MOD i=0 thì viết i ra màn hình.
Program Uoc_so;
Uses Crt;
Var N,i : Integer;
Begin
Clrscr;
Write('Nhap so nguyen N= '); Readln(N);
For i:=1 To N div 2 Do
If N MOD i=0 Then Write(i,’ ’);
Readln;
End.

Bài tập 1: Viết chương trình tìm USCLN và BSCNN của 2 số a, b được nhập vào từ bàn
phím.
Ý tưởng:
- Tìm USCLN: Lấy số lớn trừ số nhỏ cho đến khi a=b thì dừng. Lúc đó: USCLN=a.
- BSCNN(a,b) = a*b DIV USCLN(a,b).
Program USCLN_BSCNN;
Uses crt;

Var a,b,aa,bb:integer;
Begin
Write('Nhap a : '); Readln(a);
Write('Nhap b : '); Readln(b);
aa:=a; bb:=b;
While aa<>bb Do
Begin
If aa>bb Then aa:=aa-bb Else bb:=bb-aa;
End;
Writeln('USCLN= ',aa);
Writeln('BSCNN= ',a*b DIV aa);
Readln;
End.

GV: Nguyễn Thị Minh Thu
7
Giáo án bồi dưỡng HSG Tin học 11
Bài tập 5: Viết chương trình tìm các số có 3 chữ số
abc
sao cho:
abc
= a
3
+ b
3
+ c
3
.
Ý tưởng:
Dùng phương pháp vét cạn. Ta biết rằng: a có thể có giá trị từ 1→9 (vì a là số hàng

trăm), b,c có thể có giá trị từ 0→9. Ta sẽ dùng 3 vòng lặp FOR lồng nhau để duyệt qua tất
cả các trường hợp của a,b,c.
Ứng với mỗi bộ abc, ta sẽ kiểm tra: Nếu 100.a + 10.b + c = a
3
+ b
3
+ c
3
thì in ra bộ abc
đó.
Program Tim_so;
Uses crt;
Var a,b,c : Word;
Begin
For a:=1 To 9 Do
For b:=0 To 9 Do
For c:=0 To 9 Do
If (100*a + 10*b + c)=(a*a*a + b*b*b + c*c*c) Then Writeln(a,b,c);
Readln;
End.
*********************************************************
BÀI TẬP CÁC CÂU LỆNH CÓ CẤU TRÚC
Bài tập 1: Viết chương trình nhập vào số tự nhiên N > 0 rồi thông báo lên màn hình số đó
có phải là số nguyên tố hay không.
Ý tưởng:
- Ta biết số nguyên tố là số có 2 ước số là 1 và chính nó.
- Vậy 1 không phải là số nguyên tố
- Ở chương trình lớp 10, ta biết có thuật toán tìm số nguyên tố như sau: x là số nguyên tố
nếu x không chia hết cho các số chạy từ 2 đến phần nguyên căn bậc 2 của x .
Program Nguyen_to;

uses crt;
var x,u:word;
Begin
clrscr;
Write('Nhap x:');
readln(x);
if x=1 then write(x,' khong phai la so nguyen to')
else
begin
u:=2;
while (u<=sqrt(x)) and (x mod u <>0) do u:=u+1;
if u> sqrt(x) then write(x,' la so nguyen to')
else write(x,' khong phai la so nguyen to');
GV: Nguyễn Thị Minh Thu
8
Giáo án bồi dưỡng HSG Tin học 11
end;
readln
end.

Bài tập 2: Viết chương trình giải phương trình bậc hai: ax
2
+ bx + c = 0, a≠0.
Gợi ý: Xem sgk Tin 11.
- Tính Delta=b*b-4*a*c.
- Biện luận:
Delta<0: Phương trình vô nghiệm.
Delta=0: Phương trình có nghiệm kép: x = -b/(2*a).
Delta>0: Phương trình có 2 nghiệm phân biệt: x
1,2

= (-b±SQRT(Delta))/(2*a).
Bài tập 3: Lập trình tính S= 1
3
+ 2
3
+ 3
3
+ … + n
3

Bài tập 4: Lập trình tính tổng sau (với x là số thực <=1 nhập từ bàn phím)
S= x – x
3
/3 + x
5
/5 – x
7
/7 + … + cho đến khi | (-1)
n
.x
2n+1
/(2n+1)|
Program Tong;
uses crt;
var T,x,s:real;
dau, n:integer;
Begin
clrscr;
repeat
write('nhap x <=1: ');

readln(x);
until x<=1;
S:=x;
dau:= 1;
n:=0;
T:=x;
while abs(dau*S/(2*n+1)) >= 0.0001 do
begin
S:=S*x*x;
n:=n+1;
dau:=dau*(-1);
T:=T + dau*S/(2*n+1);
end;
write('Ket qua = ', T:0:5);
readln
end.
Bài tập 5: Viết chương trình in ra màn hình các giá trị của bảng mã ASCII từ 0→255.
Gợi ý:
Cho biến i chạy từ 0 → 255. In ra màn hình i và CHR(i).
Program ASCCI;
uses crt;
var i: byte;
c:char;
Begin
clrscr;
Writeln('BANG MA ASCCI:');
For i:=1 to 255 do
begin
writeln(' ',i,' : ','la ki tu ',CHR(i));
if i mod 40 = 0 then readln;

GV: Nguyễn Thị Minh Thu
9
Giáo án bồi dưỡng HSG Tin học 11
end;
readln
end.
Một số hàm chuẩn cho kiểu kí tự:
ORD(X): Cho giá trị là số thứ tự của kí tự X trong bảng mã ASCII
VD: ORD(’A’) cho giá trị là 65
ORD(’B’) cho giá trị là 66
CHR(n): Cho giá trị là kí tự có số thứ tự n trong bảng mã ASCII
VD: CHR(65) cho giá trị là kí tự ’A’
CHR(66) cho giá trị là kí tự ’B’
***************************************************
BÀI TẬP THỰC HÀNH
Bài tập 1: Viết chương trình in ra màn hình các số nguyên từ 1 đến 100 sao cho cứ 10 số thì
xuống dòng.
Gợi ý: Cho biến i chạy từ 1 → 100. In ra màn hình i và kiểm tra: nếu i MOD 10=0 thì
WRITELN.
Bài tập 2: Viết chương trình in ra màn hình bảng cữu chương.
Gợi ý:
Dùng 2 vòng lặp FOR lồng nhau: i là số bảng cữu chương (2 9), j là số thứ tự trong
từng bảng cữu chương (1 10).
For i:=2 To 9 Do
For j:=1 To 10 Do Writeln(i,’ x ’,j,’ = ’,i*j);
Bài tập 3: Viết chương trình để tìm lời giải cho bài toán sau:
Trong giỏ vừa thỏ vừa gà,
Một trăm cái cẳng bốn ba cái đầu.
Hỏi có mấy gà mấy thỏ?
Bài tập 4: Viết chương trình để tìm lời giải cho bài toán sau:

Trăm trâu trăm bó cỏ
Bó lại cho tròn
Trâu đứng ăn năm
Trâu nằm ăn ba
Trâu già ba con ăn một bó.
Hỏi có bao nhiêu trâu đứng, trâu nằm, trâu già?
Bài tập 5: Viết chương trình nhập vào một số nguyên dương. Hãy thông báo lên màn hình
số đó có bao nhiêu chữ số và tổng các chữ số của số đó.
Gợi ý:
Dùng vòng lặp WHILE. Trong khi N>0 thì: lấy ra chữ số cuối cùng của N để tính bằng
phép toán MOD 10, sau đó bỏ bớt đi chữ số cuối cùng của N bằng phép toán DIV 10.
program bt33;
var n:word;
d,t:byte;
begin
write('nhap n');
readln(n);
GV: Nguyễn Thị Minh Thu
10
Giáo án bồi dưỡng HSG Tin học 11
d:=0;
t:=0;
while n>0 do
begin
t:=t + n mod 10;
n:=n div 10;
d:=d+1;
end;
writeln('So luong chu so: ',d);
writeln('Tong cac chu so: ',t);

readln
end.
Bài tập 6: Số hoàn thiện là số tự nhiên có tổng các ước của nó (không kể chính nó) bằng
chính nó. Viết chương trình kiểm tra xem một số được nhập vào từ bàn phím có phải là số
hoàn thiện hay không? Ví dụ: 6, 28 là các số hoàn thiện.
Gợi ý:
- Tính tổng các ước số của N: từ 1 → N div 2 lưu vào biến S.
- Nếu S=N thì N là số hoàn thiện.
***************************************************
Bài 2. KIỂU MẢNG
1. Kiểu mảng một chiều
- Mảng một chiều là một dãy hữu hạn các phần tử có cùng kiểu, mảng được đặt tên và mỗi
phần tử mang một chỉ số. Để mô tả mảng một chiều ta cần xác định kiểu của các phần tử và
cách đánh chỉ số các phần tử .
Với mảng một chiều ta quan tâm đến :
- Tên mảng một chiều .
- Số lượng phần tử trong mảng .
- Kiểu dữ liệu của phần tử .
- Cách khai báo biến mảng một chiều .
- Cách tham chiếu đến từng phần tử của mảng .
a> Khai báo mảng một chiều
Trong ngôn ngữ Pascal, mảng một chiều được khai báo bằng hai cách như sau :
Cách 1 : Trực tiếp
Var <Tên biến mảng> : Array[kiểu chỉ số] of <kiểu phần tử> ;
Cách 2 : Gián tiếp
Type <Tên kiểu mảng> = Array [<kiểu chỉ số>] of <kiểu phần tử> ;
Var <Tên mảng> : <tên kiểu mảng> ;
Trong đó :
- Var là từ khóa dùng để khai báo biến, Array là từ khóa để khai báo mảng .
- Kiểu chỉ số thường là đoạn số nguyên liên tục có n1 n2, với n1 là chỉ số đầu và n2 là

chỉ số cuối.
- Kiểu phần tử là kiểu dữ liệu của phần tử mảng .
- Để tham chiếu vào phần tử mảng ta viết :
- <Tên biến mảng>[Chỉ số]
GV: Nguyễn Thị Minh Thu
11
Giáo án bồi dưỡng HSG Tin học 11
Ví dụ :
A[20] Tham chiếu đến phần tử mang chỉ số 20 trong mảng A .
Ví dụ :
Khai báo biến mảng thông qua kiểu mảng :
Type Mang_nguyen=Array[1 100] of Integer;
Mang_thuc=Array[1 50] of Real;
Var A : Mang_nguyen;
B : Mang_thuc;
Khai báo mảng trực tiếp :
Var A : Array[1 100] of Integer ;
B : Array[1 50] of Real ;

Bài tập 1 : Tìm phần tử lớn nhất của một dãy số nguyên .
- Input : Số nguyên dương N và dãy số A1, A2, … , AN
- Output : Chỉ số và giá trị của số lớn nhất trong dãy
- Ý tưởng :
+ Đặt số A
1
là số lớn nhất (max)
+ Cho i lặp từ 2 đến N, nếu A[i] > max thì gán max := A[i] và lưu lại vị trí i .
Chương trình như sau :
Program timmax ;
Uses crt ;

var a : array[1 250] of integer ;
n,i,max,csmax : Integer ;
Begin
clrscr ;
Write('Nhap n = ') ;
Readln(n) ;
For i := 1 to n do
Begin
Write('a[',i,'] = ') ;
readln(a[i]) ;
End ;
max := a[1] ;
csmax := 1 ;
For i := 2 to n do
If a[i] > max then
Begin
max := a[i] ;
csmax :=i ;
End ;
Writeln('Gia tri lon nhat : ',max) ;
Writeln('chi so ptu lon nhat : ',csmax) ;
Readln ;
End .
Bài tập 2 : Sắp xếp dãy số nguyên theo bằng thuật toán tráo đổi .
- Input : Số nguyên dương N và dãy số A1, A2, …, AN
GV: Nguyễn Thị Minh Thu
12
Giáo án bồi dưỡng HSG Tin học 11
- Output : Dãy A được sắp xếp theo thứ tự không giảm .
- Ý tưởng :

+ Hoán đổi để đưa số lớn nhất về vị trí cuối cùng .
+ Làm tương tự đối với những số còn lại .
Chương trình như sau :
Program sapxep ;
Uses crt ;
var A : Array[1 250] of integer ;
n,i,j,tg : Integer ;
Begin
clrscr ;
Write('Nhap so luong phan tu mang n = ') ;
Readln(n) ;
For i := 1 to n do
Begin
Write('A[',i,'] = ') ;
readln(A[i]) ;
End ;
For j := n downto 2 do
For i := 1 to j-1 do
If A[i] > A[i+1] then
Begin
tg := A[i] ;
A[i] := A[i+1] ;
A[i+1] := tg ;
End ;
Writeln('day sau khi sap xep : ') ;
For i := 1 to n do write(a[i]:5) ;
readln ;
End .

Bài tập 3 : Tìm kiếm nhị phân .

- Input : Dãy số A
1
, A
2
,………, A
N
đã được sắp xếp tăng dần .
- Output : Có hay không chỉ số i mà A[i] = k hoặc thông báo không tìm thấy .
- Ý tưởng :
Xem lại thuật toán tìm kiếm nhị phân trong SGK lớp 10 .
Chương trình như sau :
Program sapxep ;
Uses crt ;
var A : Array[1 250] of integer ;
n,i,k : Integer ;
dau,cuoi,giua : Integer ;
TK : boolean ;
Begin
clrscr ;
Write('Nhap so ptu mang n = ') ;
Readln(n) ;
GV: Nguyễn Thị Minh Thu
13
Giáo án bồi dưỡng HSG Tin học 11
For i := 1 to n do
Begin
Write('A[',i,'] = ') ;
readln(A[i]) ;
End ;
Write('nhap so can tim k : ') ;

Readln(k);
dau := 1 ; cuoi := n ;
TK := false ;
while (dau <= cuoi) and Not(TK) Do
Begin
giua := (dau+cuoi) div 2 ;
If A[giua] = k then TK := true
Else
If a[giua]>k then cuoi := giua - 1
Else dau := giua + 1 ;
End ;
If TK then write('Chi so tim thay la : ',giua)
else write(' Khong tim thay ');
readln ;
End .
Bài tập 4: Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm N
phần tử.
Ý tưởng:
Duyệt qua tất cả các phần tử A[i] trong mảng: Nếu A[i]<0 thì cộng dồn (A[i])
2
vào biến S.
Program Bai2;
Uses Crt;
Var A: ARRAY[1 50] Of Integer;
N,i,S:Integer;
Begin
Write(‘Nhap N=’); Readln(N);
For i:=1 To N Do
Begin
Write(’A[’,i,’]=’);

Readln(A[i]);
End;
S:=0;
For i:=1 To N Do
If A[i]<0 Then S:=S+A[i]*A[i];
Writeln(‘S= ’, S);
Readln;
End.

Bài tập 5:
Nhập n số thực từ bàn phím vào một mảng, tính trung bình cộng của các số này.
Bài tập 6: In ra màn hình n số hạng của dãy Fibonaci.
Biết F
0
= 0; F
1
= 1; F
n
= F
n-1
+ F
n-2
với n>=2

GV: Nguyễn Thị Minh Thu
14
Giáo án bồi dưỡng HSG Tin học 11

Bài tập 6: Viết chương trình in ra màn hình tam giác Pascal. Ví dụ, với n=4 sẽ in ra hình
sau:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Ý tưởng:
Tam giác Pascal được tạo ra theo qui luật sau:
+ Mỗi dòng đều bắt đầu và kết thúc bởi số 1.
+ Phần tử thứ j ở dòng k nhận được bằng cách cộng 2 phần tử thứ j-1 và j ở dòng thứ
k-1.
Program Bai6;
Uses Crt;
Var Dong:Array[0 20] Of Byte;
n,i,j:Byte;
Begin
Clrscr;
Write('n= '); Readln(n);

Dong[0]:=1;
Writeln(Dong[0]:4);
{Khoi tao gia tri cua dong}
For i:=1 To n Do Dong[i]:=0;
{Voi moi dong i}
For i:=1 To n Do
Begin
For j:=i DownTo 1 Do
Begin
Dong[j]:=Dong[j-1]+Dong[j];
Write(Dong[j]:4);
End;

Writeln(Dong[i]:4);
End;
Readln;
End.
**********************************
Bài 3. MẢNG HAI CHIỀU
Với mảng hai chiều ta quan tâm đến :
- Tên mảng hai chiều.
- Số lượng phần tử của mỗi chiều.
- Kiểu dữ liệu của phần tử.
- Cách khai báo biến mảng hai chiều.
- Cách tham chiếu đến từng phần tử của mảng.
GV: Nguyễn Thị Minh Thu
15
Giáo án bồi dưỡng HSG Tin học 11
Khai báo mảng hai chiều
Trong ngôn ngữ Pascal, mảng hai chiều được khai báo bằng hai cách như sau :
Cách 1 : Trực tiếp
Var <Tên biến mảng> : Array[kiểu chỉ số hàng, Kiểu chỉ số cột] of <kiểu phần tử> ;
Ví dụ:
Var A: array[1 5,1 7] of integer;
Cách 2 : Gián tiếp
Type <Tên kiểu mảng> = Array [kiểu chỉ số hàng, Kiểu chỉ số cột] of <kiểu phần tử> ;
Var <Tên biến mảng> : <tên kiểu mảng> ;
Type Mang1 = Array[1 30, 1 50] of Integer;
Mang2 = Array[1 3, 0 2] of Real;
Var A : Mang1;
B : Mang2;
Trong đó, số phần tử của mảng số thực B là 3 x 3 = 9 (phần tử), sắp đặt trong bộ nhớ theo
thứ tự như sau:

B[1, 0] B[1, 1] B[1 ,2]
B[2, 0] B[2, 1] B[2 ,2]
B[3, 0] B[3, 1] B[3 ,2]
* Chú ý: Mảng hai chiều còn gọi là ma trận. Trong ví dụ trên, B là ma trận cấp 3 × 3. Trong
mảng hai chiều, để truy cập đến phần tử hàng thứ i, cột thứ j của mảng hai chiều B ta dùng
cách viết: [ i , j ]

Bài tập 1: Nhập, xuất mảng hai chiều. Nhập một số nguyên k.
In ra màn hình các phần tử > k
program vd2;
var b:array[1 20,1 20] of integer;
x,y,i,j,k:byte;
begin
write('Nhap so dong');
readln(x);
write('Nhap so cot');
readln(y);
Writeln(’Nhap: ’);
for i:=1 to x do
for j:=1 to y do
begin
write('nhap phan tu dong ',i,' cot ',j,':');
readln(b[i,j]);
end;
Writeln(’Xuat: ’);
for i:=1 to x do
begin
for j:=1 to y do write(b[i,j]:5);
writeln;
end;

write('Nhap k: '); readln(k);
write('cac gia tri > ',k,' la: ');
for i:=1 to x do
for j:=1 to y do if b[i,j]> k then write(b[i,j],' ');
readln
end.
GV: Nguyễn Thị Minh Thu
16
Giáo án bồi dưỡng HSG Tin học 11
Bài tập 2 : Nhập một ma trận m hàng, n cột từ bàn phím. Tính và in ra màn hình tổng của
mỗi cột và tổng của mỗi hàng.
Program BT2;
Uses crt;
Var A: Array[1 30, 1 30] of Real;
n, m, i, j : byte;
sum : Real;
Begin
Clrscr;
Write( ‘ Ban muon nhap ma tran bao nhieu hang va cot ? ‘ );
Readln( m, n );
Writeln(‘Nhap: ’);
For i := 1 to m do
For j := 1 to n do
Begin
Write( ' PT thu [ ' , i , ' , ' , j, ' ] = ' );
Readln( a[ i, j ] );
End;
Writeln(‘Xuat: ’);
for i:=1 to m do
begin

for j:=1 to n do write(b[i,j]:5);
writeln;
end;
For j := 1 to n do
Begin
sum := 0;
For i := 1 to m do
Sum := sum + a[ i, j ];
Writeln( ‘ Tong cot ‘ , j ,’ = ‘ , sum : 0 : 5 );
End;
For i := 1 to m do
Begin
sum := 0;
For j := 1 to n do
Sum := sum + a[ i, j ];
Writeln ( ‘ Tong hang ‘ , i ,’ = ‘ , sum : 0 : 5 );
End;
Readln;
End.
Bài tập 3: Viết chương trình tìm ma trận chuyển vị của ma trận A.
Ý tưởng:
Ma trận chuyển vị của A tức là đổi hàng thành cột, cột thành hàng
Ví dụ 1: ma trận A: 1 5 5 thì ma trận B là: 1 2 1
2 4 4 5 4 2
1 2 7 5 4 7
ma trận A: 1 5 3 thì ma trận B là: 1 2
GV: Nguyễn Thị Minh Thu
17
Giáo án bồi dưỡng HSG Tin học 11
2 7 4 5 7

3 4
Dùng mảng 2 chiều để lưu trữ ma trận. Gọi B là ma trận chuyển vị của ma trận A, ta
có: B[j,i] = A[i,j]
Program Ma_tran_chuyen_vi;
Type Mang = ARRAY[1 10,1 10] Of Integer;
Var A,B:Mang;
m,n,i,j:Integer;
Begin
Write('Nhap so dong m='); Readln(m);
Write('Nhap so cot n='); Readln(n);
writeln('Nhap ma tran A:');
For i:=1 To m Do
For j:=1 To n Do
Begin
Write('A[',i,',',j,']=');
Readln(A[i,j]);
end;
writeln('Xuat ma tran A:');
For i:=1 To m Do
begin
For j:=1 To n Do Write(A[i,j]:5);
writeln;
end;
{Tim ma tran chuyen vi}
For i:=1 To m Do
For j:=1 To n Do B[j,i]:=A[i,j];
writeln('In ma tran chuyen vi:');
For i:=1 To n Do
Begin
For j:=1 To m Do Write(B[i,j]:5);

Writeln;
End;
Readln;
End.
Bài tập 4: Cho một mảng 2 chiều A cấp mxn gồm các số nguyên và một số nguyên x. Viết
chương trình thực hiện các công việc sau:
a/ Đếm số lần xuất hiện của x trong A và vị trí của chúng.
b/ Tính tổng các phần tử lớn nhất của mỗi dòng.
Program BT4;
Uses crt;
Type Mang = ARRAY[1 10,1 10] Of Integer;
Var A:Mang;
m,n,i,j,x,dem,S,max:Integer;
Begin
Clrscr;
{Nhap ma tran}
Write('Nhap so dong m='); Readln(m);
Write('Nhap so cot n='); Readln(n);
For i:=1 To m Do
GV: Nguyễn Thị Minh Thu
18
Giáo án bồi dưỡng HSG Tin học 11
For j:=1 To n Do
Begin
Write('A[',i,',',j,']=');
Readln(A[i,j]);
End;
Xuat ma tran}
For i:=1 To m Do
begin

For j:=1 To n Do Write(A[i,j]:5);
writeln;
End;
{Nhap x}
Write('Nhap x=');
Readln(x);
{dem so lan xuat hien cua x va vi tri cua x}
dem:=0;
Writeln('Vi tri cua x trong mang A:');
for i:=1 to m do
For j:=1 To n Do
If x= A[i,j] Then
Begin
Writeln('vi tri xuat hien dong',i,' cot ',j);
dem:=dem+1;
End;
Writeln('So lan xuat hien cua x trong mang la: ',dem);
{Tinh tong cac ptu lon nhat cua moi dong}
S:=0;
for i:=1 to m do{duyet qua tung dong}
Begin
{Tim phan tu lon nhat cua dong thu i}
Max:=A[i,1];
for j:=2 to n do
if max<A[i,j] then max:=A[i,j];
S:=S+max;
End;
Writeln('Tong cac phan tu lon nhat cua moi dongla:',S);
Readln;
End.


Bài tập 5: Cho mảng 2 chiều A cấp mxn. Viết chương trình sắp xếp lại mảng A theo yêu cầu
sau: Các phần tử trên mỗi dòng được sắp xếp theo thứ tự giảm dần.

Bài 4. XÂU KÝ TỰ (STRING)
I. KHAI BÁO KIỂU STRING
VAR <Tên biến > : STRING[Max];
Trong đó Max là số ký tự tối đa có thể chứa trong chuỗi (Max ∈ [0,255]). Nếu không có
khai báo [Max] thì số ký tự mặ mặc định trong chuỗi là 255.
GV: Nguyễn Thị Minh Thu
19
Giáo án bồi dưỡng HSG Tin học 11
Ví dụ:
Var Hoten : String[30];
St80 : String[80];
St : String; {St có tối đa là 255 ký tự}
II. TRUY XUẤT DỮ LIỆU KIỂU STRING
- Có thể sử dụng các thủ tục xuất nhập Write, Writeln, Readln để truy xuất các biến
kiểu String.
- Để truy xuất đến ký tự thứ i của xâu ký tự, ta sử dụng cú pháp sau: <Tênbiến>[i].
III. CÁC PHÉP TOÁN TRÊN XÂU KÝ TỰ
3.1. Phép nối xâu: +
3.2. Các phép toán quan hệ: =, <>, <, <=, >, >=.
Chú ý: Các phép toán quan hệ được so sánh theo thứ tự trong bảng mã ASCCI.
IV. CÁC THỦ TỤC VÀ HÀM VẾ XÂU KÝ TỰ
4.1. Hàm LENGTH(S)
Cho giá trị là độ dài xâu S
4.2. Hàm COPY(S, vt, n)
Tạo một xâu mới từ xâu S, bắt đầu từ vị trí vt, n kí tự liên tiếp.
4.3. Hàm POS(S1, S2)

Cho vị trí xuất hiện đầu tiên của xâu S1 trong xâu S2, nếu không có hàm trả về giá trị 0.
4.4. Thủ tục DELETE(S, vt, n);
Xóa đi trong xâu S, bắt đầu từ vị trí vt, n kí tự liên tiếp.
4.5. Thủ tục INSERT(S1, S2, vt);
Chèn xâu S1 vào xâu S2 bắt đầu tại vị trí vt.
4.6 Hàm ORD(X): Cho giá trị là số thứ tự của kí tự X trong bảng mã ASCII
VD: ORD(’A’) cho giá trị là 65
ORD(’B’) cho giá trị là 66
4.7 Hàm CHR(n): Cho giá trị là kí tự có số thứ tự n trong bảng mã ASCII
VD: CHR(65) cho giá trị là kí tự ’A’
CHR(66) cho giá trị là kí tự ’B’

BÀI TẬP MẪU
Bài tập 1: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Đổi xâu ký tự đó sang
chữ in hoa rồi in kết quả ra màn hình.
Ví dụ :Xâu abcdAbcD sẽ cho ra xâu ABCDABCD.
Uses Crt;
Var S:String;
i:Byte;
Begin
Clrscr;
Write(‘Nhap xau St: ‘);
Readln(S);
For i:=1 to length(S) do S[i]:=Upcase(S[i]);
Write(‘Xau ket qua: ‘, S);
Readln;
GV: Nguyễn Thị Minh Thu
20
Giáo án bồi dưỡng HSG Tin học 11
End.

Bài tập 2: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Đổi xâu ký tự đó sang
chữ thường rồi in kết quả ra màn hình.
Ví dụ :Xâu abCdAbcD sẽ cho ra xâu abcdabcd.
Uses Crt;
Var S:String;
i:Byte;
Begin
Clrscr;
Write(‘Nhap xau S: ‘); Readln(S);
For i:=1 to length(S) do
If S[i] IN [‘A’ ’Z’] Then S[i]:=CHR(ORD(S[i])+32);
Write(‘Xau ket qua: ‘, S);
Readln;
End.
Bài tập 3: Viết chương trình đếm số ký tự chữ số trong một xâu ký tự được nhập vào từ bàn
phím.
Uses Crt;
Var St:String;
i,d:Byte;
Begin
Clrscr;
Write(‘Nhap xau St: ‘); Readln(St);
For i:=1 to length(St) do
If St[i] IN [‘0’ ’9’] Then d:=d+1;
Write(‘So ky tu chu so trong xau: ‘, d);
Readln;
End.

Bài tập 4: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Thông báo lên màn hình
số lần xuất hiện của mỗi chữ cái tiếng Anh trong xâu S ( Không phân biệt chữ hoa hay chữ

thường).
Ý tưởng:
- Dùng một mảng dem với chỉ số là các chữ cái để lưu trữ số lượng của các chữ cái
trong xâu.
- Duyệt qua tất cả các ký tự của xâu S: Nếu ký tự đó là chữ cái thì tăng ô biến mảng
dem[S[i]] lên 1 đơn vị.
Program BT1;
Uses crt;
Var S:String;
dem: Array['A' 'Z'] Of Byte;
i:Byte;
ch:Char;
Begin
Clrscr;
Write('Nhap xau S: '); Readln(S);
{Khoi tao mang}
GV: Nguyễn Thị Minh Thu
21
Giáo án bồi dưỡng HSG Tin học 11
For ch:='A' To 'Z' Do dem[ch]:=0;
{Duyet xau}
For i:=1 To Length(S) Do
If Upcase(S[i]) IN ['A' 'Z'] Then Inc(dem[Upcase(S[i])]);
{Liet ke cac ki tu ra man hinh}
For ch:='A' To 'Z' Do
If dem[ch]>0 Then Writeln(ch,' : ',dem[ch]);
Readln;
End.

Bài tập 5: Viết chương trình tìm các vị trí xuất hiện chuổi S1 trong chuổi S ?

Dữ liệu vào: Chuổi s và chuổi s1.
Kết quả ra: Các vị trí tìm thấy s1 trong s.
Ví dụ:
Input Output
Test 1 ‘aaahocjhochoc’
‘hoc’
4 8 11
Test 2 ‘adddddee’
‘dd’
2 3 4 5
Giải
var s,s1:string;
begin
readln(s);
readln(s1);
while pos(s1,s)>0 then
begin
write(pos(s1,s):4);
s[pos(s1,s)]:=chr(1);
end;
readln;
end.
Bài 6:
Nhập vào một chuỗi sau đó xuất ra các từ dài nhất trong chuỗi
Dữ liệu vào: một chuỗi.
Kết quả ra: các từ dài nhất trong chuỗi
Ví dụ:
Input Output
Test 1 Tran Nguyen dao Nguyen
Test 2 Tran quang dao bgggg quang

bgggg
Giải
{In ra cac tu dai nhat trong xau}
Program BT6_cach1;
Uses crt;
var a:array[1 128]of string;
i,j,max:integer;
s:string;
begin
clrscr;
write(’Nhap xau S:’);
GV: Nguyễn Thị Minh Thu
22
Giáo án bồi dưỡng HSG Tin học 11
readln(s);
while s[1]=#32 do delete(s,1,1);
while s[length(s)]=#32 do delete(s,length(s),1);
while pos(#32#32,s)>0 do delete(s,pos(#32#32,s),1);
j:=1;
for i:=1 to length(s) do
begin
if s[i]<>#32 then a[j]:=a[j]+s[i]
else inc(j);
end;
max:=length(a[1]);
for i:=1 to j do
if length(a[i])>max then max:=length(a[i]);
writeln('cac tu dai nhat co ',max,' ky tu:');
for i:=1 to j do
if length(a[i])=max then writeln(a[i]);

readln;
end.

Chú ý: #32 = CHR(32) = ’ ’: là kí tự dấu cách

{In ra cac tu dai nhat trong xau}
Program BT6_cach2;
uses crt;
var a:array[1 128]of string;
i,j,max:integer;
s:string;
begin
clrscr;
write('Nhap xau S:');
readln(s);
while s[1]=' ' do delete(s,1,1);
while s[length(s)]=' ' do delete(s,length(s),1);
while pos(' ',s)>0 do delete(s,pos(' ',s),1);
j:=1;
for i:=1 to length(s) do
begin
if s[i]<>' ' then a[j]:=a[j]+s[i]
else inc(j);
end;
max:=length(a[1]);
for i:=1 to j do
if length(a[i])>max then max:=length(a[i]);
writeln('cac tu dai nhat co ',max,' ky tu:');
for i:=1 to j do
if length(a[i])=max then writeln(a[i]);

readln;
end.

Bài tập 7 : Viết chương trình nhập vào một dòng văn bản, hiệu chỉnh văn bản theo những
yêu cầu sau đây và in văn bản sau khi hiệu chỉnh ra màn hình:
a. Xóa tất cả các ký tự trắng thừa (mỗi từ cách nhau đúng một dấu cách).
b. Đầu câu, cuối câu không có kí tự trắng.
c. Đầu câu in hoa.

GV: Nguyễn Thị Minh Thu
23
Giáo án bồi dưỡng HSG Tin học 11
Bài 8: Viết chương trình nhập vào từ bàn phím một xâu kí tự và in ra màn hình xâu kí tự
ngược tương ứng. Ví dụ: nhập ‘TRUNG TAM KTTHHN GIO LINH’
 ‘HNIL OIG NHHTTK MAT GNURT’.
****************************
Bài 5. kiÓu d÷ liÖu tÖp
1. Vai trò của kiểu tệp
Dữ liệu kiểu tệp có những đặc điểm sau:
+ Được lưu trữ lâu dài ở bộ nhớ ngoài (đĩa từ, CD, . . .) và không bị mất khi tắt nguồn điện
vào máy
+ Lượng thông tin lưu trữ trên tệp có thể rất lớn và chỉ phụ thuộc vào dung lượng đĩa.
2. Thao tác với tệp
Hai thao tác cơ bản đối với tệp là ghi dữ liệu vào tệp và đọc dữ liệu từ tệp
a. Khai báo tệp văn bản :
VAR <Tên biến tệp>: TEXT;
Vd: Var f1, f2 : text;
b. Sơ đồ thao tác với tệp:
GV: Nguyễn Thị Minh Thu
24

Giáo án bồi dưỡng HSG Tin học 11
c. Cú pháp:
GV: Nguyễn Thị Minh Thu
25

×