Chuyên đề bồi dưỡng học sinh giỏi tin học ngôn ngữ pascal chi tiết rõ ràng đầy đủ những kiến thức cần thiết để chinh phục kì thi ( đề lưu hành nội bộ )
Trang 1Chuyên đề: KINH NGHIỆM BỒI DƯỠNG HỌC SINH GIỎI.
Chương 3: Cấu trúc lặp ……… trang 7
Chương 4: Kiểu dữ liệu mãng (1 chiều)……….
……… trang 11
Chương 5: Xâu ký tự…… ……….…… trang 14
Chương 6: Chương trình con……….….…… trang 21
Phần 2: Các bài tập về mảng …… ……….….…… trang 31
Phần 3: Các bài tập về xâu ……… ….…… trang 38
Phần 1: TỔNG QUÁT.
CHƯƠNG 1: KIẾN THỨC CƠ BẢN.
1 Hằng, biến và kiểu dữ liệu:
- Hằng là đại lượng không thay đổi giá trị và biến là đại lượng cóthể thay đổi giá trị trong khi thực hiện chương trình
- Kiểu dữ liệu: byte, integer, real, char, boolean, string …
Trang 2Ví dụ: var n,x,y: integer;
Uses danhsachthuvien; Uses crt;
Const tenhang = giatrihang; const Pi =3.14;
Type tenkieu = kieudulieu type xau30 = string[30];
Var tenbien : kieudulieu var n,i: integer;
write(x, ‘ ‘, y) hoặc write (x, ‘,’,y); xuất ra màn hình giá trị của x
và của y cách nhau một khoảng trắng hoặc cách nhau dấu phẩy.writeln lệnh này đưa con trỏ xuống dòng dưới
Write(‘chao cac ban’); xuất ra màn hình chữ chào các bạn;
Lưu ý: Nội dung trong dấu ‘….’ là một text và giữ nguyên khi xuất
ra màn hình
Trang 3- Nhập giá trị vào từ bàn phím khi chạy chương trình: Read(…);Readln(…); readln dừng chương trình đến khi gõ một phím sẽ tiếptục.
6 Một số kiểu dữ liệu chuẩn và phép toán:
- Ví dụ: 7 chia 3: được 2 lần dư 1 Vậy 7 mod 3 = 1, 7 div 3 = 2
- Kiểu thực: có 5 kiểu: Real (2.9*10-39 1.7*1038), Single (1.5*10-45 3.4*1045), double (5.0*10-324 1.7*10308), Extended (3.4*10-
4932 1.1*104932), comp (-9.2*1018 9.2*1018) Các phép toán: cộng,trừ, nhân, chia, không có pháp mod và div
- Kiểu ký tự (char): có tất cả 256 ký tự từ 0 đến 255 Dùng hàmord để biết mã của kí tự và hàm Upcase để đổi chữ thường sang chữhoa
- Kiểu xâu ký tự (string): vd: ‘chao cac ban’ Các hàm xử lý xâu sẽ
đề cập phần sau:
- Kiểu logic (Boolean): chỉ nhận hai giá trị đúng (True) hoặc sai(False) Các phép toán cơ bản là: và (and), hoặc (or), phủ định (not).+ đk1 and đk2 nhận giá trị đúng khi cả hai điều kiện đều đúng.+ đk1 or đk2 nhận giá trị đúng khi một trong hai là đúng
+ Not(đk) nhận giá trị đúng khi điều kiện sai
7 Các bước cơ bản khi lập một chương trình Pascal
- Bước 1: Soạn thảo chương trình
- Bước 2: Dịch chương trình (nhấn phím F9), nếu có lỗi thì sửa
lỗi
Trang 4- Bước 3: chạy chương trình (nhấn phím Ctrl F9).
Bài tập:
Bài 1: Hãy xuất câu ‘chao cac ban’ ra màn hình
Bài 2: Lập trình theo thứ tự: chú ý đến khoảng cách các chữ chènvào
- Xuất: ‘Ban ten gi’
- Nhập: <tên của mình>
- Xuất: ‘xin chao ban <tên> đen voi Pascal’
Bài 3: Hãy nhập vào bán kính r, viết chương trình tính chu vi và diệntích hình tròn có bán kính r
Bài 5: Hãy nhập vào chiều cao h và cạnh đáy a, viết chương trình
tính diện tích hình tam giác ( s=cạnh đáy* chiều cao/2)
Bài 6: Hãy nhập vào một cạnh a, tính chu vi và diện tích hình vuông
- chu vi: cạnh *4 Diện tích: cạnh * cạnh.
Bài 7: Nhập vào 4 số, viết chương trình tính trung bình cộng 4 số đó.Bài 8: Như bài 7, nhưng sử dụng 2 biến
Bài 9: In đão số Nhập vào hai số ab, in ra màn hình ngược lại là ba
Trang 5- Nhập n (số chai cần mua).
- Số chai lẻ = n mod 10; Số chai chẳn = n div 10
Bài 11a:Tách số Nhập vào một chữ số có ba số, viết chương trìnhtách ra số hàng trăm hàng chục và hàng đơn vị
- Hàng chục: n mod 10
- Hàng trăm: n div 10.
- ĐV: 352 mod 10 = 2.
Loại bỏ: n= 352 div 10=35
- Hàng chục: 35mod10=5
- Hàng trăm: 35 div 10=3
CHƯƠNG 2: CẤU TRÚC RẼ NHÁNH.
1 Lệnh nếu thì:
- Dạng thiếu: if <điều kiện> then <lệnh>;
Nếu <điều kiện> đúng thì thực hiện <lệnh>, sai thìthoát
- Dạng đủ: if <điều kiện> then <lệnh 1>
else <lệnh 2>;
Nếu <điều kiện> đúng thì thực hiện <lệnh 1>,
Ngược lại (nếu điều kiện sai) thì thực hiện
<lệnh 2>
Chú ý: trước dòng lệnh else (cuối lệnh 1) không có dấu ;
2 Lệnh lựa chọn.
Trang 6Nếu biểu thức là hằng số 1 thì thực hiện lệnh 1… Nếu biểu thức
là hằng số n thì thực hiện lệnh n, else là trường hợp biểu thức khôngchứa các giá trị từ một đến n thì thực hiện lệnh n+1
Bài tập:
Bài 12: Nhập vào hai số in ra màn hình số lớn hơn
If a>b then writeln(a)
Trang 8vòng lập lần 1: i có giá trị bằng 1 và thực hiện lệnhn:=n+1
lần 2: i có giá tri bằng 2 tiếp tục thực hiện lệnhn:=n+1
… lần 10: i có giá trị bằng 10 tiếp tục thực hiện lệnhn:=n+1
Sau đó tự kết thúc lệnh lặp này (lặp lại 10 lần)
2 Vòng lặp không xác định:
Có hai dạng:
a WHILE <điều kiện> DO <lệnh>;
Nếu <điều kiện> là đúng thì thực hiện <lệnh>; và tiếp tục lặplại đến khi điều kiện sai thì thoát khỏi vòng lặp
b REPEAT <lệnh> UNTIL <điều kiện>;
Thực hiện lệnh trước sau đó xét điều kiện, nếu điều kiện đúngthì dừng Nếu điều kiện sai thì tiếp tục lặp lại thực hiện lệnh và xétđiều kiện
Chú ý: + Câu lệnh While xét điều kiện trước nếu đúng mới thựchiện lệnh, còn câu lệnh repeat thì ngược lại là thực hiện lệnh trướcrồi sau mới xét điều kiện
+ Có thể vòng lặp này rơi vào vòng lặp vô hạn vì khôngthỏa mản điều kiện kết thúc Nhấn nút Break để kết thúc
Bài 17: Nhập vào số nguyên dương n, viết chương trình in racác số lẻ nhỏ hơn hoặc bằng n (giải bằng 2 cách dùng câu lệnh for
và while)
- Nhập n;
- For i:= 1 to n do
If i mod 2 = 1 then write(i, ‘ ‘);
Bài 18: Nhập vào số nguyên dương n, viết chương trình tínhtổng các số lẻ nhỏ hơn hoặc bằng n
- Nhập n;
- TL:= 0;
for i:= 1 to n do
Trang 9If i mod 2 = 1 do TL:= TL +i; (Nếu tính tổng chẳn thì điều kiện:
If n mod i = 0 then write(i, ‘ ‘);
Bài 20: Một số có tổng các ước nhỏ hơn nó bằng chính nó, đượcgọi là số hoàn chỉnh Ví dụ: 6 là số hoàn chỉnh vì có các ước nhỏ hơn
For i:= 1 to n-1 do If n mod i = 0 then s:= s+i;
If s=n then writeln (n, ‘la so hoan chinh’);
Else writeln (n, ‘khong la so hoan chinh);
Bài 21: Nhập vào số n, tìm các số hoàn chỉnh nhỏ hơn hoặcbằng n
Trang 10Bài 23: Nhập vào số nguyên n, viết chương trình xem số n cóphải là số nguyên tố không?
Cách 1: dùng câu lệnh while … do
- nhập n;
- i:=2;
while n mod i <>0 do i:= i+1;
if i=n then writeln(n, ' la so nguyen to')
else writeln(n, ' khong la so nguyen to');
if n mod i = 0 then dem:= dem+1;
if dem<2 then writeln(n, ' la so nguyen to')
else writeln(n, ' khong la so nguyen to');
Cách 3:
KT:= true;
for i:=2 to n-1 do if (n mod i)= 0 then KT := false;
Bài 24: Nhập vào số nguyên n, viết chương trình in ra các sốnguyên tố nhỏ hơn hoặc bằng n
- Nhập n;
- For j:= 1 to n do
ghép cả đoạn chương trình trên vào với n đổi lại là j.
Bài 25: Nhập vào số nguyên n, viết chương trình tính n!
n! được biết như sau:
n!= 1 với n=0
n!= 1.2.3…n (tích của n số từ 1 đến n)
- Nhập n;
- gt:=1;
for i:=1 to n do gt:=gt*i;
Bài 26: nhập vào 2 số a và b, viết chương trình tìm UCLN của 2
số đó
Trang 11- Nhập a, b;
- While a<>b do
If a>b then a:= a- b
Else b:=b-a;
- In kết quả ước chung lớn nhất là b;
Bài 27: Tính tổng của n số tự nhiên đầu tiên, với n là số nguyêndương và được nhập từ bàn phím
- Nhập n;
- tong:=0;
For i:=1 to n do tong:=tong+i;
- In kết quả là, tong.
Bài tập phụ không gợi ý:
Bài tập 3.1 In bảng cửu chương n.
Bài tập 3.2 Các bài toán cổ:
a Trâu đứng ăn năm Trâu nằm ăn ba
Lụ khụ trâu già
Ba con một bó Trăm con ăn cỏ Trăm bó no nê.
Hỏi có bao nhiêu trâu đứng , trâu nằm , trâu già ?
b Vừa gà vừa chó,
bó lại cho tròn,
ba mươi sáu con, một trăm chân chẵn
Hỏi có bảo nhiêu chó gà?
c Các bài tập tương tự như: Bài tập đếm số tờ tiền…
Trang 12CHƯƠNG 4: KIỂU DỮ LIỆU MẢNG (MỘT CHIỀU)
Cú pháp: var <biến mảng>: array[chỉ số đầu chỉ số
cuối]of<kiểu dữ liệu>.
Bài 28: viết chương trình nhập n số và in ra theo thứ tự ngược lại Ví dụ nhập vào 3 số là 7, 5 6 thì in ra 6, 5 7
- Nhập n, nhập giá trị từng phần tử.
- for i:=n downto 1 do write(a[i].' ');
Bài 29: Nhập vào n số nguyên dương, viết chương trình tìm sốlớn nhất, số nhỏ nhất trong n số đó
if min>=a[i] then min:=a[i];
- In kết quả, min max.
Bài 30: Viết chương trình nhập dãy n số và in ra tổng các sốchẳn, tổng các số lẽ trong dãy vừa nhập
Trang 14Bước 1: Khởi tạo một mảng một chiều n phần tử có giá trị 0.
Bước 2: Khởi tạo giá trị cho hàng thứ nhất M[1,1] = 1
Bước 3: - Đối với hàng thứ i tính giá trị phần tử từ phần tử thứ i + 1 xuống phần tử thứ 2: M[j]:=M[j] + M[j-1]
Trang 15Viết chương trình nhập n số, xoá số thứ k trong n số vừa
CHƯƠNG 5: XÂU KÝ TỰ (STRING)
1 Cú pháp khai báo: var <tên biến>:string[max];
Max: là số phần tử tối đa trong xâu.
Nếu không có số max thì mặc định là 255 ký tự
2.CÁC THỦ TỤC VÀ HÀM VẾ XÂU KÝ TỰ
2.1 Hàm lấy chiều dài của xây ký tự
LENGTH(St : String):Integer;
2.2 Hàm COPY(St : String; Pos, Num: Byte): String;
Lấy ra một xâu con từ trong xâu St có độ dài Num ký tự bắt đầu từ vịtrí Pos
2.3 Hàm POS(SubSt, St :String):Byte;
Kiểm tra xâu con SubSt có nằm trong xâu St hay không? Nếu xâuSubSt nằm trong xâu St thì hàm trả về vị trí đầu tiên của xâu conSubSt trong xâu St, ngược lại hàm trả về giá trị 0
2.4 Thủ tục DELETE(Var St:String; Pos, Num: Byte);
Xoá trong xâu St Num ký tự bắt đầu từ vị trí Pos
2.5 Thủ tục INSERT(SubSt: String; Var St: String; Pos: Byte);
Chèn xâu SubSt vào xâu St bắt đầu tại vị trí Pos
2.6 Thủ tục STR(Num; Var St:String);
Đổi số nguyên hay thực Num thành dạng xâu ký tự, kết quả lưu vàobiến St
2.7 Thủ tục VAL(St:String; Var Num; Var Code:Integer);
Đổi xâu số St thành số và gán kết quả lưu vào biến Num Nếu việcchuyển đổi thành công thì biến Code có giá trị là 0, ngược lại biếnCode có giá trị khác 0 (vị trí của lỗi)
Trang 16CÁC THỦ TỤC THÔNG DỤNG
Str(x,S) Ðổi giá trị kiểu số X sang dạng chuỗi S
Val(S,x,code) Đổi chuỗi S thành sô x.Nêu đổi chuỗi thành công biên Code nhận giá trị 0 Nêu không đổi đc,code là sô nguyên cho biêt vtrí gây lỗi
INC(x,r) Tăng giá trị của x nên r đơn vị Tương đương với x:=x+r;DEC(x,r) Giảm giá trị của x xuống r đơn vị Tương đương với x:=x-r.(Thủ tục INC(x), DEC(x) xem như tăng, giảm x một đơn vị)
Insert(S,T,vt); Chèn chuoi S vào chuoi T vtrí vt
Delete(S,P,L) Xoá L ký tự từ vtrí P ra khỏi
Break ;kết thúc vòng lặp
CÁC HÀM THÔNG DỤNG
Ord(X) Lấy thứ tự của ký tự X trong bản mã ASCII
Chr(X) Lấy ký tự thứ X trong bảng mã ASCII
PRED(x) Cho phần tử đứng trước x
SUCC(x) Cho ra phần tử đứng sau x
Round(x) Làm tròn x
Trunc(x) Lấy phần nguyên
Int(x) Lấy phần nguyên
Frac(x) Lấy phần lẻ
ABS(x) Lấy giá trị tuyệt đối
Copy(S,P,L) Trích chuỗi S một chuỗi con dài L ký tự bắt đầu từ vtrí P
Odd(I:Integer) Cho True khi I là sô lẻ và False khi I là sô chẵn
Pos(X,S):Integer Cho vtrí bắt đầu của chuỗi con X trong S Nêu X không thuộc S thì hàm POS cho giá trị 0
A Page A Future
Bài 5: Xâu ký tự (String) trong Pascal
Xâu là gì? Để xử lý các chuỗi văn bản, Pascal đưa ra một kiểu dữ liệumới gọi là xâu ký tự và được định nghĩa bằng từ khóa STRING Xâu
ký tự là dữ liệu bao gồm một dãy các ký tự trong bảng mã ASSCII.Cách khai báo:
Var: STRING[độ dài của xâu];
Xâu ký tự trong bộ nhớ nó chiếm số byte bằng số ký tự cực đại được
Trang 17khai báo cộng với byte đầu tiên chứa số ký tự hiện có của xâu Độ dài tối đa của xâu ký tự là 255.
- Cách nhập/xuất: Cách đọc hay viết kiểu STRING cũng tương tự như các kiểu dữ liệu khác, ta sử dụng các thủ tục READ, hoặc WRITE
Ví dụ:
Readln(st);
Writeln(st);
- Truy cập từng phần tử của xâu ký tự: tương tự mảng 1 chiều: thông
qua tên biến kiểu STRING và chỉ số của nó
Hai xâu ký tự được gọi là bằng nhau khi chúng hoàn toàn giống
nhau (có độ dài như nhau)
Ví dụ: ‘FILENAME’ = ’FILENAME ‘
3/ Các thủ tục và hàm chuẩn xử lý xâu ký tự
Trang 18a Hàm length(st): cho độ dài thực của xâu ký tự
ví dụ: st:=’le thanh’ thì LENGTH(st) cho bằng 8
b/ Thủ tục DELETE(st, pos, num): xóa num ký tự trong xâu st kể từ vịtrí pos
Ví dụ: st= ‘FILENAME’
Delete(st,5,4) lúc đó st cho ra là ‘FILE’
c/ Thủ tục INSERT(obj, st, pos): Thủ tục cho kết quả bằng cách chèn xâu ký tự có tên là Obj vàoxâu st tại vị trí pos, những ký tự đứng saupos sẽ được dời vềphía sau của xâu ký tự obj
Ví dụ: obj:= ‘Thanh ‘
st:=’Le Lam’;
INSERT(obj,st,4) lúc đó st=’Le Thanh Lam’;
d/ Thủ tục STR(value, st): Thủ tục này thực hiện việc chuyển đối giá trị kiểu số(value) sang dạng xâu ký tự và gán cho biến st
Ví dụ: n là một só nguyên có giá trị: n:=150;
STR(n:5,st) sẽ cho kết quả xâu st là: st=’ 150’;
e/ Thủ tục VAL(st, value,code) đối một xâu ký tự st sang dạng số và gán cho biến value, nếu biến đối thành công thì code sẽ nhận giá trị bằng 0 ngược lại thì cho giá trị khác không
Ví dụ: VAL(‘123’,value,code) lúc này code sẽ nhận giá trị bằng 0 và value=123
f/ Hàm COPY(st, pos, num): sao chép trong xâu st, num ký tự tại vị trí pos,
Ví dụ: st=’Le Thanh Lam’
Trang 19h/ Hàm POS(st1,st2): hàm cho tavị trí tìm thấy đầu tiên của xâu s1 trong xâu s2.
Ví dụ: POS(‘Lam’,‘Le Thanh Lam’) = 10;
Bài 33: 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
- for i:=1 to length(st) do
if st[i] in ['A' 'Z'] then st[i]:= chr(ord(st[i])+32);
for i:=1 to length(st) do
if st[i] in ['0' '9'] then dem:=dem+1;
- in kết quả, dem.
Trang 20Bài 36: Viết chương trình nhập vào một xâu ký tự từ bàn phím
In ra xâu đó sau khi xóa hết ký tự trắng thừa trong xâu (ký từ trắng thừa là ký tự đầu xâu, cuối xâu, và ở giữa xâu nếu có 2 ký tự trắng liên tiếp nhau)
for i:=length(st) downto 1 do s:= s+st[i];
- in kết quả, xâu đảo là s.
Bài 38: 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 các chữ cái có trong xâu và số lượng của chúng
program bai33;
uses crt;
var st:string; {chuổi nhập vào}
dem:array['A' 'Z']of byte; {đây là một mảng số ngầm chứa
số chữ cái có trong xâu}
for i:=1 to length(st) do
Trang 21if upcase(st[i])in ['A' 'Z'] then inc(dem[upcase(st[i])]); {duyệt xâu st nếu thấy xâu st có ký tự A thì dem[A] tăng thêm 1 hay dem[A]=1 hàm inc là làm giá trị trong nó tăng thêm 1}.
for ch:='A' to 'Z' do
if dem[ch]>0 then writeln(ch,': ',dem[ch]);
{duyệt từ ký tự A đến Z nếu dem[A]>0 thì xuất ra màn hình A: dem[A]}.
while i<= length(st) do
if st[i] in ['0' '9'] then delete(st,pos(st[i],st),1)
else i:=i+1;
- In kết quả xâu st.
Bài 40: Viết chương trình nhập vào một xâu ký tự từ bàn phím Xem xét ký từ x (ký tự bất kỳ nhập từ bàn phím) xuất hiện bao nhiêulần trong xâu
- Nhập xâu st;
- dem:=0;
for i:=1 to length(st) do
if st[i]=x then dem:=dem+1;
Gợi ý:
While POS(ch,st)<>0 Do Delete(st,POS(ch,st),1);
Trang 22Bài tập 43: Viết chương trình nhập một xâu vào từ bàn phím vàthông báo lên màn hình xâu đó có phải đối xứng không theo 2 cách:
Đệ qui và không đệ qui (Ví dụ: abba, abcba là các xâu đối xứng)
Tách từng từ nối vào đầu xâu mới (xem bài tập 5)
Bài tập 45: Viết chương trình nhập vào 2 xâu ký tự s1 và s2 Kiểm tra xem xâu s2 xuất hiện bao nhiêu lần trong xâu s1 (Lưu ý:
a Xóa tất cả các ký tự trắng thừa
b Trước các dấu câu không có các ký tự trắng, sau các dấu câu
có một ký tự trắng
c Đầu câu in hoa
Bài tập 48: Viết chương trình để nén và giải nén một xâu ký tự
Ví dụ: Xâu ‘AAAABBBCDDDDDDDEEF’ sau khi nén sẽ trở thành
‘4A3BC7D2EF’
CHƯƠNG 6: CHƯƠNG TRÌNH CON.
Trang 231 Khai báo chương trình con
Nhắc lại cấu trúc của một chương trình
PROGRAM Tên_chương_trình; { Tên chương trình}
USES ; {Khai báo thư viện}
CONST ;{Khai báo hằng}
TYPE ;{Khai báo kiểu}
VAR ;{Khai báo biến}
Khai báo CHƯƠNG TRÌNH CON (THỦ TỤC)
FUNCTION <tên hàm>(Danh sách các tham số):<Kiểu dữ liệu>;
[Khai báo Const, Type, Var]
Trang 24<tên hàm>(danh sách các tham số thực);
Ví dụ:
tong(4,5);
3 Khai báo và lời gọi thủ tục
Khai báo:
PROCEDURE <tên thủ tục>(Danh sách các tham số);
[Khai báo Const, Type, Var]
Trang 25Chú ý: Nếu một công việc có thể làm bằng hàm thì chắc chắn sẽ làm được bằng thủ tục tuy nhiên sẽ phức tạp hơn khi dùng hàm nhưng một chương trình làm bằng thủ tục thì chưa chắc ta đã làm được bằng hàm.
5 Bài tập minh họa:
Bài tập 1: Viết chương trình tính giai thừa của số n Với yêu cầu:
Nếu người dùng nhập số n < 0 thì yêu cầu nhập lại.
Sử dụng chương trình con để tính giai thừa của một số.
Trang 26End.
Lệnh n := n - 1 làm thay đổi giá trị của n nhưng khi ra khỏi chương trình con n có giá trị không đổi so với trước khi gọi chương trình con.
Bài 2: Viết chương trình tính n! với yêu cầu sử dụng hàm để tính giai thừa.
Procedure Sau khi gọi nó cần lệnh để in n!
Khi dùng Function, có thể sử dụng nó như là một biểu thức