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;
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
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
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;
Ý 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
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
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
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;
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);
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 ;
+ 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 .
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,’]=’);
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;
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;
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
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
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)
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ữ
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
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]);
Giáo án bồi dưỡng HSG Tin học 11
c. Cú pháp:
GV: Nguyễn Thị Minh Thu
25