Giáo trình tóm tắt kiến thức lập trình pascal từ cơ bản đến nâng cao. Đặc biệt giáo trình cung cấp đầy đủ và phong phú các dạng bài tập thực hành rất thực tế. Đây là tài liệu giúp giáo viên bồi dưỡng học sinh giỏi lập trình pascal trong các trường THPT. Rất hữu ích cho giáo viên và học sinh.
Trang 1N K T H
Mục lục
Chuyên đề 1 NGÔN NGỮ LẬP TRÌNH 4
I TÓM TẮT LÝ THUYẾT 4
1 Khái niệm 4
2 Mô tả thuật thoán 4
3 Sử dụng Free Pascal 4
4 Các bước cơ bản khi lập một chương trình bằng Pascal 5
5 Các thành phần cơ bản của ngôn ngữ Pascal 5
II VÍ DỤ 5
III BÀI TẬP 5
Chuyên đề 2 CẤU TRÚC CHƯƠNG TRÌNH 7
I TÓM TẮT LÝ THUYẾT 7
1 Cấu trúc của một chương trình 7
2 Khai báo hằng 7
3 Khai báo biến 7
4 Các kiểu dữ liệu cơ bản 7
5 Biểu thức 8
6 Câu lệnh cơ bản 9
7 Nhập xuất từ tệp 9
II VÍ DỤ 10
III BÀI TẬP 12
IV HƯỚNG DẪN 14
Chuyên đề 3 CẤU TRÚC RẼ NHÁNH 15
I TÓM TẮT LÝ THUYẾT 15
1 Lệnh IF 15
2 Lệnh CASE 15
II VÍ DỤ 16
III BÀI TẬP 16
IV HƯỚNG DẪN 18
Chuyên đề 4 CẤU TRÚC LẶP 19
I TÓM TẮT LÝ THUYẾT 19
1 Vòng lặp xác định 19
2 Vòng lặp không xác định 19
II VÍ DỤ 20
III BÀI TẬP 24
IV HƯỚNG DẪN 26
Chuyên đề 5 MẢNG MỘT CHIỀU 27
I TÓM TẮT LÝ THUYẾT 27
1 Khái niệm 27
Trang 22 Khai báo 27
3 Truy xuất phần tử 27
4 Số ngẫu nhiên 27
II VÍ DỤ 28
III BÀI TẬP 32
IV HƯỚNG DẪN GIẢI 39
Chuyên đề 6 MẢNG HAI CHIỀU 42
I TÓM TẮT LÝ THUYẾT 42
1 Khái niệm 42
2 Khai báo 42
3 Truy xuất phần tử 42
II VÍ DỤ 43
III BÀI TẬP 47
IV HƯỚNG DẪN GIẢI 53
Chuyên đề 7 XÂU KÍ TỰ 56
I TÓM TẮT LÝ THUYẾT 56
1 Khái niệm 56
2 Khai báo 56
3 Phép toán trên xâu 56
4 Hàm và thủ tục 57
5 Kiểu kí tự Char 57
II VÍ DỤ 57
III BÀI TẬP 61
IV HƯỚNG DẪN 64
Chuyên đề 8 KIỂU BẢN GHI 67
I TÓM TẮT LÝ THUYẾT 67
1 Khái niệm 67
2 Khai báo – Sử dụng biến kiểu bản ghi 67
II VÍ DỤ 68
III BÀI TẬP 69
Chuyên đề 9 CHƯƠNG TRÌNH CON 71
I TÓM TẮT LÝ THUYẾT 71
1 Khái niệm 71
2 Hàm – Thủ tục 72
3 Tham số trong chương trình con: 73
4 Đệ quy 74
II VÍ DỤ 75
III BÀI TẬP 77
Chuyên đề 10 THƯ VIỆN 79
I TÓM TẮT LÝ THUYẾT 79
Trang 3N K T H
1 Khái niệm 79
2 Unit Crt 79
3 Unit Graph 80
II VÍ DỤ 81
III BÀI TẬP 82
Trang 41.1 Bài toán (problem)
Trong toán học: Là vấn đề ta muốn giải quyết
Trong tin học: Là vấn đề ta muốn máy tính giải quyết.
1.2 Đầu vào – đầu ra
Đầu vào của bài toán (Input): dữ liệu cần cung cấp cho máy tính
Đầu ra của bài toán (Output): là kết quả máy tính thực hiện được.
1.3 Thuật toán
Thuật toán: là một dãy các bước hữu hạn sao cho khi máy tính thực hiện tuần
tự các bước đó thì từ input ta tìm được output của bài toán
2 Mô tả thuật thoán
Có 3 cách để mô tả thuật toán:
• Liệt kê : sử dụng ngôn ngữ tự nhiên để mô tả
Turbo Pascal, Free Pascal: là môi trường để lập trình bằng NNLT Pascal, hỗ
trợ soạn thảo, biên dịch, thông dịch chương trình
Trang 5N K T H
Download bản cài trên Windows:
http://freepascal.org/down/i386/win32.var
B1: Chạy chương trình Free Pascal:
\FPC\2.0.4\bin\i386-win32\fp.exe (2,199KB)
B2: Mở cửa sổ soạn thảo mới: File New
B3: Soạn thảo chương trình
B4: lưu lại chương trình FILE SAVE AS
B5: chạy thử chương trình RUN RUN (CTRL + F9)
4 Các bước cơ bản khi lập một chương trình bằng
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ì phải sửa lỗi.
Bước 3: Chạy chương trình (nhấn phím Ctrl-F9).
5 Các thành phần cơ bản của ngôn ngữ Pascal
1 Khởi động Turbo Pascal
2 Nhập vào đoạn chương trình sau:
Uses Crt;
Begin
Writeln(‘***********************************************************’); Writeln(‘* CHUONG TRINH PASCAL DAU TIEN CUA TOI *’); Writeln(‘* Oi! Tuyet voi! *); Writeln(‘***********************************************************’);
Trang 6Readln;
End.
3 Dịch và chạy chương trình trên
4 Lưu chương trình vào đĩa với tên BAI1.PAS
5 Thoát khỏi Pascal
6 Khởi động lại Turbo Pascal
7 Mở file BAI1.PAS
8 Chèn thêm vào dòng: CLRSCR; vào sau dòng BEGIN
9 Dịch và chạy thử chương trình
10 Lưu chương trình vào đĩa
11 Thoát khỏi Pascal
Bài 2 Xuất hình
In ra màn hình những hình sau đây
*
***
*****
*******
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* *
* * * * * * * * * * * * * * *
******* Bài 3 Xuất chữ Viết chương trình in ra màn hình các hình sau: * ******** *******
*** ** ** ** **
** ** ** ** **
** ** ******** * *
********* ** ** **
** ** ** ** ** **
** ** ******** ********
Trang 7N K T H
Chuyên đề 2 CẤU TRÚC CHƯƠNG TRÌNH
I TÓM TẮT LÝ THUYẾT
1 Cấu trúc của một chương trình
{ Phần tiêu đề }
PROGRAM Tên_chương_trình;
{ Phần khai báo }
USES ;
CONST .;
TYPE ;
VAR .;
PROCEDURE .;
FUNCTION ;
{ Phần thân chương trình } BEGIN
END.
2 Khai báo hằng
Hằng là một đại lượng có giá trị không thay đổi trong suốt quá trình thực hiện của chương trình chứa nó
Cú pháp:
CONST <Tên hằng> = <Giá trị>;
hoặc:
CONST <Tên hằng>:= <Biểu thức hằng>;
3 Khai báo biến
Biến là một đại lượng mà giá trị của nó có thể thay đổi trong quá trình thực hiện chương trình
Cú pháp:
VAR <Tên biến>[,<Tên biến 2>, ] : <Kiểu dữ liệu>;
4 Các kiểu dữ liệu cơ bản
4.1 Kiểu logic
- Từ khóa: BOOLEAN
- Miền giá trị: (TRUE, FALSE)
- Các phép toán: phép so sánh (=, <, >) và các phép toán logic: AND, OR, XOR, NOT.
4.2 Kiểu số nguyên
a Các kiểu số nguyên
Trang 8+, -, *, / (phép chia cho ra kết quả là số thực).
Phép chia lấy phần nguyên: DIV (Ví dụ : 34 DIV 5 = 6).
Phép chia lấy số dư: MOD (Ví dụ: 34 MOD 5 = 4).
4.3 Kiểu số thực
Các kiểu số thực:
Single 1.5×10-45 → 3.4×10+38 4 byteReal 2.9×10-39 → 1.7×10+38 6 byteDouble 5.0×10-324 → 1.7×10+308 8 byteExtended 3.4×10-4932 → 1.1×10+4932 10 byte
Các phép toán trên kiểu số thực: +, -, *, /
Chú ý: Trên kiểu số thực không tồn tại các phép toán DIV và MOD.
Một số hàm số học thông dụng
SQRT(x): Trả về căn bậc hai của x (x≥0)
SIN(x): Trả về sin(x) theo radian
COS(x): Trả về cos(x) theo radian
EXP(x): Trả về ex
TRUNC(x): Trả về số nguyên gần với x nhất nhưng bé hơn x
ROUND(x): Làm tròn số nguyên x
INC(n): Tăng n thêm 1 đơn vị (n:=n+1)
DEC(n): Giảm n đi 1 đơn vị (n:=n-1)
5 Biểu thức
Biểu thức (expression) là công thức tính toán mà trong đó bao gồm các phép toán, các hằng, các biến, các hàm và các dấu ngoặc đơn
Ví dụ: (x +sin(y))/(5-2*x) biểu thức số học
(x+4)*2 = (8+y) biểu thức logic
Trong một biểu thức, thứ tự ưu tiên của các phép toán được liệt kê theo thứ tự sau:
1 Lời gọi hàm
2 Dấu ngoặc ()
3 Phép toán một ngôi (NOT, -)
Trang 9N K T H
4 Phép toán *, /, DIV, MOD, AND
5 Phép toán +, -, OR, XOR
6 Phép toán so sánh =, <, >, <=, >=, <>, IN
6 Câu lệnh cơ bản
6.1 Câu lệnh gán
<Tên biến>:=<Biểu thức>;
6.2 Câu lệnh xuất dữ liệu
Để xuất dữ liệu ra màn hình, ta sử dụng ba dạng sau:
- Viết không qui cách: dữ liệu xuất ra sẽ được canh lề ở phía bên trái Nếu dữ
liệu là số thực thì sẽ được in ra dưới dạng biểu diễn khoa học
Hello Hello 500
500 1.2345700000E+02 123.46
Trang 10Ngoài cách “đọc từng giá trị”, ta có thể “đọc từng dòng trong tệp” bằng thủ tục
Cú pháp: Readln(BiếnTệp, Danh sách Biến);
Thủ tục này đọc tất cả các giá trị trên dòng hiện tại, sau đó con trỏ sẽ nhảy xuống dòng kế tiếp
Ví dụ 1 Diện tích tô đen
Tính và đưa ra màn hình diện tích phần tô đen trong hình sau
Trang 11N K T H
Writeln(‘Dien tich to den la:’,S:0:2);
Readln;
End.
Ví dụ 2 Diện tích tam giác DTTG
Viết chương trình nhập vào độ dài hai cạnh của tam giác và góc giữa hai cạnh đó, sau
đó tính và in ra màn hình diện tích của tam giác
Write('Nhap vao do dai canh thu nhat: '); Readln(a);
Write('Nhap vao do dai canh thu hai: '); Readln(b);
Write('Nhap vao goc giua hai canh: '); Readln(goc);
Dientich:=a*b*sin(goc)/2;
Writeln('Dien tich cua tam giac la: ',Dientich:0:2);
Readln;
End.
Ví dụ 3 Hoán đổi HOANDOI
Viết chương trình nhập vào 2 số a, b Sau đó hoán đổi giá trị của 2 số đó:
Chương trình 1: Dùng biến trung gian
Program Swap;
Begin
Write('Nhap vao a= '); Readln(a);
Write('Nhap vao b= '); Readln(b);
Write('Nhap vao a= '); Readln(a);
Write('Nhap vao b= '); Readln(b);
Trang 12Assign(fi, finame); Reset(fi);
Assign(fo, foname); Rewrite(fo);
Bài 1 Tính biểu thức BIEUTHUC
Viết chương trình nhập vào các số nguyên: a, b, x, y, sau đó in ra màn hình kết quả của các biểu thức sau:
Bài 2 Diện tích tam giác DTTG
Cho độ dài 3 cạnh tam giác Viết chương trình tính diện tích tam giác
Bài 3 Cực đại CUCDAI
Viết chương trình tách một số n thành 2 số a, b sao cho tích P=a*b2 đạt cực đại với n được nhập vào từ bàn phím
Bài 4 Diện tích lớn nhất DTLN
Cho chu vi của một hình chữ nhật In ra màn hình diên tích lớn nhất mà hình chữ nhật
có thể có được
Ví dụ:
Nhap chu vi: 20
Dien tich lon nhat co the: 25
Bài 5 Đếm số byte1 DEMBYTE1
Màn hình đồ họa của một máy tính có độ phân giải: 640x480 Biết rằng, mỗi điểm trên màn hình chiếm 1 byte Hỏi cần bao nhiêu byte để lưu trữ toàn bộ màn hình đồ họa đó?
Có 2 sinh viên viết chương trình tính số byte lưu trữ màn hình đồ họa:
Trang 13N K T H
Hãy cho biết 2 chương trình trên cho kết quả đúng hay sai? Tại sao?
Bài 6 Đếm số byte2 DEMBYTE2
Màn hình đồ họa của một máy tính có độ phân giải: 640x480 Biết rằng, mỗi điểm trên màn hình chiếm 1 byte Hỏi cần bao nhiêu byte để lưu trữ một vùng có kích thước bằng 1/10 màn hình đồ họa đó?
Có 2 sinh viên viết chương trình giải bài toán này như sau:
Ví dụ: nhap so n = 2314 Tong chu so la 10
Bài 9 Căn bậc n CAN
Viết chương trình tính n x, x>0
Bài 10 Nhập xuất từ tệp TEP
Viết lại chương trình cho các bài tập trên, yêu cầu nhập xuất từ tệp
Trang 14Bài 2 Cực đại CUCDAI
Gọi x là số thứ hai thì số thứ nhất là: (n-x) Theo đề ta có: P(x) = x2.(n-x).Hàm P đạt cực đại khi P’(x) = -3x2 + 2nx = 0 x = 2n/3
Bài 3 Căn bậc n CAN
Write('Nhap vao n= '); Readln(n);
Write('Nhap vao x= '); Readln(x);
S:=EXP(1/n*LN(x));
Writeln('S = ',S:0:2);
Readln;
End.
Trang 15N K T H
Const n: S n ; END;
CASE B OF
Const 1: S 1 ; Const 2: S 2 ;
Const n: S n ; ELSE S n+1 ;
END;
Trong đó:
- B: Biểu thức kiểu vô hướng đếm được như kiểu nguyên, kiểu logic, kiểu ký tự,
kiểu liệt kê
- Const i: 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 B nằm trong tập hằng const i thì máy sẽ thực hiện lệnh
Si 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 Sn+1
Trang 16Ví dụ 1 Kiểm tra chẵn lẻ CHANLE
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ẻ
Ví dụ 2 Giải phương trình bậc nhất PTBI
Viết chương trình giải phương trình bậc nhất ax+b=0
End;
Readln;
End.
III BÀI TẬP
Bài 1 Giải phương trình bậc hai PTBII
Viết chương trình giải phương trình bậc hai: ax2 + bx + c = 0, a≠0
Trang 17N K T H
Bài 2 Tính số giây GIAY
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
Vd: nhập vào 08:30:20 và 80 xuất ra 08:31:40
Bài 3 Tìm max – min MAXMIN
Viết chương trình tìm Max, Min của 4 số: a, b, c, d
Ví dụ: nhập 3 5 8 2 xuất ra Max=8 Min=2
Bài 4 Tìm ngày tháng NGAYTHANG
Viết chương trình nhập vào ngày, tháng, năm, máy sẽ hiện lên ngày, tháng, năm của ngày hôm sau
Ví dụ: nhập vào 24/08/2012 xuất ra 25/08/2012
Bài 5 Màu ô
Bàn cờ vua kích thước 8*8 gồm 64 ô đen trắng xen kẽ nhau Ô
(i, j) là ô ở hàng i, cột j Biết ô đầu tiên có tọa độ (1, 1) mang
màu trắng Nhập tọa độ một ô bất kỳ trong bàn cờ vua, cho biết
ô đó có màu gì? (trắng hay đen)
Input: 2 số nguyên dương x, y là tọa độ ô cần xét.
Output: kết luận về màu của ô (x, y)
Nhap toa do o thu nhat: 1 3
Nhap toa do o thu hai 1 4
Hai o khong trung mau
Bài 7 Kiểm tra tam giác
Nhập vào độ dài 3 cạnh a, b, c Cho biết 3 cạnh đó có lập thành 1 tam giác hay không?
Ví dụ:
Nhap 3 canh a, b, c: 3 4 5
3 canh co the tao thanh tam giac
Bài 8 Loại tam giác
Nhập 3 cạnh tam giác Cho biết đó là tam giác gì? Tam giác cân, tam giác đều, tam giác vuông cân, tam giác vuông, tam giác cân, tam giác thường hay không phải là tam giác
Ví dụ:
Nhap 3 canh tam giac: 3 4 5
Day la tam giac vuong
Bài 9 Tính tiền điện
Trang 18Tính tiền điện của một hộ gia đình khi cho biết chỉ số điện kế tháng này và chỉ số điện
kế tháng trước Từ đó tính ra KW tiêu thụ Tiền điện được tính như sau:
Từ KW số <= 60: 1000 đ/KW, từ số 61 – 120: 1200 đ/ KW, từ số 121 – 300: 2000 đ/
KW, > 300: 4000 đ/kW
Ví dụ:
Nhap chi so dien ke thang nay: 750
Nhap chi so dien ke thang truong: 300
So tien la: 1092000 dong.
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:
x1,2 = (-b±SQRT(Delta))/(2*a)
Bài 2 Tính số giây GIAY
- Gọi số giây được cộng thêm là: ss Gán giây:=giây+ss
- Nếu giây≥60 thì: phút:=phút + giây DIV 60 và giây:=giây MOD 60
- Nếu phút≥60 thì: giờ:=giờ + phút DIV 60 và phút:=phút MOD 60
Bài 3 Tìm ngày tháng NGAYTHANG
Biện luận theo tháng Gom tháng thành 3 nhóm: tháng có 31 ngày (1,3,5,7,8,10,12), tháng có 30 ngày (4,6,9,11) và tháng 2 (có 28 hoặc 29 ngày tùy theo năm nhuận).Dùng lệnh lựa chọn:
số k nếu có sẽ là phần nguyên của sqrt(2*n)
vây Ta sẽ tìm k = trunc(sqrt(2*n), sau đó thử lại xem 2*n có bằng k*(k+1) hay không?
Trang 19N K T H
FOR <biến đếm>:=<giá trị Max> DOWNTO <giá trị Min> DO S;
Sơ đồ thực hiện vòng lặp FOR:
Chú ý: Khi sử dụng câu lệnh lặp FOR cần chú ý các điểm sau:
- 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
- Giá trị Max và Min trong câu lệnh FOR sẽ được xác định ngay khi vào đầu vòng lặp Do đó cho dù trong vòng lặp ta có thay đổi giá trị của nó thì số lần lặp cũng không thay đổi
Dạng REPEAT: Lặp lại công việc S cho đến khi biểu thức B=TRUE thì dừng.
Dạng WHILE: Trong khi biểu thức B=TRUE thì tiếp tục thực hiện công việc S.
Trang 21N K T H
Write('Nhap vao mot so nguyen N= '); Readln(N);
If N MOD 2 = 0 Then dem:=dem+1;
Trang 22Viế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 Nếu N MOD i=0 thì viết i ra màn hình
Ví dụ 6 Ước chung lớn nhất và bội chung nhỏ nhất UOCBOI
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)
Trang 23N K T H
Writeln('BSCNN= ',a*b DIV aa);
Ứng với mỗi bộ abc, ta sẽ kiểm tra: Nếu 100.a + 10.b + c = a3 + b3 + c3 thì in ra
Ví dụ 8 Kiểm tra nguyên tố NGUYENTO
Viết chương trình nhập vào số tự nhiên N rồi thông báo lên màn hình số đó có phải là
số nguyên tố hay không
For i:=2 To N div 2 Do
If N MOD i=0 Then d:=d+1;
Trang 24Cho 2 tệp văn bản NGUYEN1.INP và NGUYEN2.INP, mỗi dòng của 2 tệp chứa một
số số nguyên Hãy lập trình tạo tệp văn bản NGUYEN12.OUT, những dòng đầu tiên là các dòng của tệp NGUYEN1.INP, những dòng còn lại là của tệp NGUYEN2.INP
Ví dụ
NGUYEN1.INP NGUYEN2.INP NGUYEN12.OUT
1 3 5
2
5 2 4
Ý tưởng
Vì không biết tệp có bao nhiều giá trị, ta Sử dụng hàm eof kết hợp với câu lệnh while
để đọc từng giá trị Mỗi lần đọc lưu vào biến temp và ghi ngay temp ra tệp NGUYEN12.OUT Sau khi đọc xong tệp NGUYEN1.INP ta đọc tiếp NGUYEN2.INP
assign(fi1,'nguyen1.inp');reset(fi1); //doc file 1 va xuat ra
while not eof(fi1) do
assign(fi2,'nguyen2.inp');reset(fi2); //doc file 1 va xuat ra
while not eof(fi2) do
Bài 1 Bảng mã Ascii ASCII
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
Bài 2 In số INSO
Viết chương trình in ra màn hình các số nguyên từ 1 đến 100 mỗi 10 số trên một dòng
Bài 3 In bảng cửu chương CUUCHUONG
Viết chương trình in ra màn hình bảng cữu chương
Bài 4 Tính các tổng CACTONG
Viết chương trình tính các tổng sau:
S0 = n! = 1*2* *n {n giai thừa}
S1 = 1 + 1/2 + + 1/n
Trang 25N K T H
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 6 Đếm trâu DEMTRAU
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ònTrâu đứng ăn nămTrâu nằm ăn baNăm trâu nghé ăn một
Hỏi có bao nhiêu trâu đứng, trâu nằm, trâu nghé?
Bài 7 Chẵn lẻ CHANLE
Viết chương trình nhập vào các số nguyên từ bàn phím cho đến khi nào gặp số nguyên
tố thì kết thúc nhập Tính tổng các số chẵn và trung bình cộng các số lẻ
Bài 8 Chữ số CHUSO
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ố đó
Ví dụ: nhập vào n = 1234 xuất ra 4 10
Bài 9 In số nguyên tố INNT
Viết chương trình in ra màn hình tất cả các số nguyên tố từ 2 đến N Với N được nhập
từ bàn phím
Ví dụ: nhập N = 10 thì sẽ in ra : 2 3 5 7
Bài 10 Phân tích thừa số nguyên tố TSNT
Viết chương trình mô tả quá trình phân tích một số ra thừa số nguyên tố Ví dụ: N=100
Trang 26Bài 12 In bảng xoắn ốc XOANOC
Viết chương trình in ra các số nguyên từ 1 đến N2 theo hình xoắn ốc với N được nhập vào từ bàn phím Ví dụ, với N=5 ta có:
Bài 1 Bảng mã Ascii ASCII
Cho biến i chạy từ 0 → 255 In ra màn hình i và CHR(i)
Bài 2 In số INSO
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 3 In bảng cửu chương CUUCHUONG
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)
Bài 6 Số hoàn thiện HOANTHIEN
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
Trang 27N K T H
Cú pháp khai báo trực tiếp:
VAR TenBienMang : ARRAY[CSDau CSCuoi] OF KieuPhanTu;
CSDau CSCuoi dùng để xác định miền chỉ số của mảng, cũng là để xác định
số phần tử của mảng Csdau và cscuoi thường là kiểu số nguyên, csdau thường bắt đầu
từ 1
Ví dụ: khai báo mảng có 7 phần tử để lưu trữ 7 số nguyên
VAR t:ARRAY[1 7] OF LongInt;
Ngoài cách trên ta còn có cách khai báo gián tiếp như sau:
TYPE TenKieuMang = ARRAY[CSDau CSCuoi] OF KieuPhanTu;
VAR TenBienMang:TenKieuMang;
Ví dụ: khai báo mảng trên theo cách gián tiếp
TYPE M1C = ARRAY[1 7] OF Longint;
• Thủ tục xáo trộn bộ số ngẫu nhiên : Randomize;
• Hàm tạo ra số ngẫu nhiên trong khoảng [0,k): Random(k);
Trang 28Ví dụ 1 Nhiệt độ trong tuần NHIETDO
Nhập nhiệt độ mỗi ngày trong tuần, tính nhiệt độ trung bình của tuần và số lượng ngày trong tuần có nhiệt độ cao hơn nhiệt độ trung bình
FOR i:=1 TO 7 DO read(fi, t[i]);
Để tính trung bình, ta tính tổng nhiệt độ 7 ngày trước Ta dùng vòng lặp duyệt qua các phần tử trong mảng và cộng dồn vào biến S
FOR i:=1 TO 7 DO s:=s+t[i];
Để điếm số ngày thỏa đề bài, ta cũng dùng vòng lặp duyệt qua các phần tử trong mảng Phần tử nào thỏa điều kiện thì tăng dem
FOR i:=1 TO 7 DO
IF nhietdo[i] > tb THEN inc(d);
Chương trình
PROGRAM nhietdotrungbinh;
Trang 29N K T H
IF nhietdo[i] > tb THEN inc(d);
{Xuat ket qua}
Const
Fin=’SAPXEP.INP’;
Fon=’SAPXEP.OUT’;
Maxn = 1000;
Trang 30Tạo mảng Ngẫu nhiên
Đề bài yêu cầu tạo mảng số ngẫu nhiên chứ không phải đọc từ tệp cho trước Các số ngẫu nhiên này do máy sinh ra và ta không biết trước giá trị Việc tạo số ngẫu nhiên giống như trò chơi “Lô tô” Đầu tiên ta phải làm thao tác “xóc túi” để xáo trộn các con
số bằng thủ tục xáo trộn bộ số ngẫu nhiên : Randomize; Thao tác này chỉ cần làm
một lần trong chương trình
Sau khi xáo trộn, khi nào cần tạo ra một giá trị ngẫu nhiên ta sử dụng hàm tạo giá trị ngẫu nhiên Random(k:word): word Hàm này sẽ cho ta một giá trị ngẫu nhiên thuộc
[0, k)
Để tạo ra mảng gồm n giá trị ngẫu nhiên, ta sẽ thực hiện n lần, mỗi lần tạo một giá trị
và lưu vào một phần tử của mảng a
Để tạo một giá trị ngẫu nhiên từ -1000 1000, ta có nhiều cách Ví dụ: -1000 + random(2000); hoặc random(1000) – random(1000);
Read(fi, n);
Randomize;
For i:=1 to n do a[i]:=-1000+random(2000);
Sau khi tạo xong ta có thể xuất mảng a để xem giá trị :
For i:=1 to n do write(fo,a[i],’ ‘);
Sắp xếp mảng: có nhiều thuật toán khác nhau để sắp xếp mảng tăng dần, ta có thể sử
dụng thuật toán “nổi bọt” như sau:
Ý tưởng: so sánh từng cặp 2 phần tử kề nhau, nếu sai vị trí thì đảo lại.
Lần 1: duyệt từ phần từ 1 đến phần tử n-1, nếu a[i]>a[i+1] thì đảo lại Sau lần này ta
được phần tử lớn nhất “nổi” về đúng vị trí (cuối cùng) n
Lần 2: duyệt từ phần tử 1 đến phần tử n-2, nếu a[i]>a[i+1] thì đảo lại Sau lần này ta
được phần tử lớn nhì“nổi” về đúng vị trí (kế cuối) n-1
…
Lần n-1: duyệt từ phần tử 1 đến phần tử n - (n-1) nếu a[i]>a[i+1] thì đảo lại Sau lần
này ta được phần tử lớn thứ n-1 “nổi” về đúng vị trí (thứ 2)
Trang 31N K T H
For i:=1 to n do a[i]:=-1000+random(2000);
{Xuat mang chua sap xep}
For i:=1 to n do write(fo,a[i],' ');
{Sap xep mang}
Lớp của Bờm tuy không phải là lớp chuyên nhưng phong
trào học Toán – Tin rất sôi động Thầy giáo của Bờm rất
tâm huyết, luôn tìm các bài toán hay, mới, lạ, đặc biệt là
bài toán quy luật để dạy trò Một hôm, thầy giáo đến lớp
thật sớm trước tiết toán, viết lên bảng một dãy có quy luật
số 0, 4, 6, 9 có một “lỗ hổng” và đặc biệt chữ số 8 có đến 2 lỗ hổng Hôm sau Bờm rất
Trang 321 3 2 4
Trang 33N K T H
Bài 2 Nhập xuất mảng bằng tệp NHAPMANG2
Cho 2 số n, k và mảng a gồm n phần tử nguyên a1, a2, …, an Tìm các phần tử có giá trị bằng ak
Bài 4 Xếp gạch XEPGACH
Minh rất thíc trò chơi xếp các chiếc hộp có hình viên gạch Minh đặt các viên gạch chồng lên nhau và xây thành nhiều chồng có độ cao khác nhau Minh khoe với chị rằng “Chị trông, em đã xây được một bức tường” Chị Minh trả lời: “Em phải xếp các viên gạch có độ cao giống nhau mới được gọi là một bức tường” Sau khi nghe chị nó
Trang 34Yêu cầu:Hãy lập trình đưa ra số lần di chuyển ít nhất của các viên gạch sao cho từ các
chồng gạch có độ cao khác nhau trở thành các chồng gạch có độ cao bằng nhau; lần lượt từng viên một cho đến khi hoàn thành công việc
Dữ liệu vào: cho trong file XEPGACH.INP
• Dòng đầu tiên là số chồng gạch n (1<=n<=50)
• Dòng tiếp theo lần lượt là các số nguyên hi, độ cao của chồng gạch thứ i (1<=hi<=100, I = 1 n)
Dữ liệu ra: xuất kết quả ra file XEPGACH.OUT
• Một số nguyên dương duy nhất là số lần di chuyển các viên gạch ít nhất Nếu không thể xếp được thì ghi -1
Bài 5 Chia mảng CHIAMANG
Tìm cách chia dãy số nguyên không âm a1, a2, ,an, n > 1 cho trước thành hai đoạn có tổng các phần tử trong mỗi đoạn bằng nhau
Bài 6 Chia mảng tỉ lệ 1:k CHIAMANG1K
Tìm cách chia dãy số nguyên không âm a1, a2, ,an, n > 1 cho trước thành hai đoạn có tổng các phần tử trong một đoạn gấp k lần tổng các phần tử trong đoạn kia, k nguyên
Trang 35N K T H
Ví dụ
Input
6 3
1 2 3 4 5 9Output3
Giải thích: mảng chia thành 2 đoạn Đoạn 1 gồm: 1, 2, 3 có tổng bằng 6, đoạn 2 gồm
4, 5, 9 có tổng bằng 18
Bài 7 Kiểm tra mảng tăng dần
Cho n và dãy số nguyên a1, a2, …, an Kiểm tra dãy số có phải là dãy tăng dần không?
Bài 8. Thêm phần tử INSERT (BẮT ĐẦU HỌC KỲ II)
Cho 2 mảng a, b và các số nguyên k, x Lần lượt thực hiện các thao tác sau:
1 Thêm phần tử có giá trị x vào đầu mảng a
2 Thêm một phần tử có giá trị x vào mảng tại vị trí k
3 Chèn mảng b vào mảng a tại vị trí k
INSERT.INP
Dong 1: mảng a Dòng 2: x k Dòng 3: mảng b
Bài 9 Tìm min – max MINMAX
Cho dãy a có n số ngyên Tìm giá trị lớn nhất và nhỏ nhất của dãy
Trang 36Bài 10 Đổi chỗ Min Max
Nhập mảng a có n phần tử nguyên dương Viết chương trình đổi chỗ 2 phần tử lớn nhất và nhỏ nhất cho nhau Nếu có nhiều phần tử lớn nhất và nhỏ nhất thì đổi chỗ phần
tử lớn có chỉ số lớn nhất và phần tử nhỏ nhất có chỉ số lớn nhất
DVT.INP DVT.OUT
4 3 3 4 5 6 8 6 8 4 9 8 4 5 6 9 6 8
Bài 11 Tích lớn nhất TICHMAX
(Đề thi tuyển sinh lớp chuyên Tin trường phổ thông năng khiếu 2007)
Cho một dãy gồm N số nguyên Hãy tìm 3 số trong dãy với tích T của chúng là lớn nhất
Dữ liệu: Vào từ file văn bản TICHMAX.INP:
• Dòng đầu ghi số N (3≤N≤10000).
• Dòng thứ hai chứa N số nguyên có giá trị tuyệt đối không vượt quá 30000
Kết quả: Ghi ra file văn bản TICHMAX.OUT một số duy nhất T.
Ví dụ:
Bài 12 Số nhỏ nhất SNN
2011 – HSG Đồng Nai
Trong lớp mẫu giáo có n cháu, mỗi cháu được nhận một
thẻ, Trên mỗi thẻ gán mã số từ 1 đến n Mỗi lượt chơi, cô
giáo đọc ngẫu nhiên hai số x, y trong khoảng từ 1 đến n
Cháu nào có trong tay thẻ có số đã đọc thì đứng lên Nếu
có 2 cháu khác nhau đứng lên, một cháu có thẻ x và cháu
kia có thẻ y, hai cháu phải trình ra một thẻ có mã số nhỏ
nhất của mình Ai có thẻ mang mã số nhỏ hơn sẽ nhận
được toàn bộ thẻ của cháu kia.Trò chơi kết thúc khi chỉ
còn một cháu cầm trong tay tất cả thẻ
TICHMAX.INP TICHMAX.OUT
9
3 5 1 7 9 0 9 -3 10
810
Trang 37N K T H
Yêu cầu: Hãy cho biết có bao nhiêu cháu còn thẻ trên tay sau khi cô giáo đã đọc m
lượt và số thẻ nhiều nhất mà một cháu nhận được
Dữ liệu vào: từ tập tin văn bản SONHO.INP
-Dòng đầu tiên: hai số n và m.(1<=m<n<=107)
-m dòng sau mỗi dòng ghi hai số tự nhiên x và y
Các số trên cùng một dòng cách nhau qua dấu cách
Kết quả : ghi vào tập tin văn bản SONHO.OUT
-Dòng dầu là số lượng các cháu còn thẻ-Dòng hai là số lượng thẻ nhiều nhất của 1 trong các cháu còn thẻ
Bài 13 Hệ thống đèn màu DEN
Đề thi tin học trẻ Quốc Gia 2009
Có n đèn, mỗi đèn được đánh thứ tự từ 1 -> n Các đèn có khả năng sáng màu xanh hoặc đỏ Ban Tổ chức có quy luật đổi màu như sau:
Ban đầu tất cả đều sáng màu xanh Sau chương trình thứ 1, các đèn có số thứ tự chia hết cho 2 sẽ đổi màu Sau chương trình thứ k, các đèn có số thứ tự chia hết cho k+1
sẽ đổi màu (xanh thành đỏ và đỏ thành xanh)
Yêu cầu: Cho trước n và k, đếm xem có bao nhiêu đèn màu đỏ khi kết thúc k chương
Trang 38Bài 14 Kiến thông minh KIEN
(Tin học trẻ toàn quốc 2011 – Bảng B)
Kiến chúa tổ chức cuộc thi “kiến thông minh” trên
một đoạn thẳng nằm ngang độ dài n đơn vị, tổ kiến
nằm ở một đầu mút đoạn thẳng đó Khi mỗi chú kiến
thợ vào thi, Kiến chúa rải n miếng đường đánh số từ
1 đến n Miếng đường thứ i có trọng lượng wi được
đặt trên đoạn thẳng ở vị trí cách tổ kiến đúng i đơn
vị độ dài (i = 1, 2, …, n)
Mỗi chú kiến thợ cần thực hiện đúng 3 lượt kiếm
mồi trong bài thi của mình Ở mỗi lượt chú kiến thợ
xuất phát từ tổ, đi tới vị trí một miếng đường và tha
miếng đường đó về tổ, lượt chơi tiếp theo tiến hành
tương tự, tất nhiên những miếng đường đã tha về tổ
sẽ không còn trên đoạn đường thẳng ở vị trí cũ nữa
Một bài thi của chú kiến thợ là hợp lệ nếu tổng quãng đường di chuyển của chú kiến trong cả ba lượt kiếm mồi không vượt quá T Điểm của bài thi là tổng trọng lượng của
ba miếng đường mà chú kiến thợ kiếm được
Em được cho trước số nguyên dương n, số nguyên dương T, hai số nguyên dương a, m
để xác định dãy w1, w2, …, wn theo công thức:
wi = ai mod m + 1Yêu cầu: Xác định điểm tối đa mà một chú kiến thợ có thể kiếm được trong bài thi của kiến chúa
Ví dụ: với n = 5, T = 15, a = 4, m = 9 Dãy w1 5 = (5, 8, 2, 5, 8) Các miếng đường được bố trí theo sơ đồ sau
Phương án kiếm được nhiều điểm nhất (18 điểm) cho chú kiến thợ là tha 3 miếng đường số 1, 2 và 4 về tổ Tổng quãng đường di chuyển là 14
Em cần tạo 10 file kết quả các tên dạng ANT?.TXT, trong mỗi file, ghi một số nguyên duy nhất là kết quả tìm được ứng với một bộ giá trị (n, T, m) cho dưới đây
Trang 39N K T H
Bài 15 Chuỗi hạt CHUOIHAT
Trong một tệp văn bản tên CHUOI.DAT có biểu diễn một
chuỗi hạt, mỗi hạt có thể nhận một trong số các màu mã số từ 1
đến 30
Lập trình thực hiện các việc sau:
a) Đọc chuỗi hạt từ tệp vào mảng nguyên dương a
b) Hiển thị số màu có trong chuỗi
c) Tìm một điểm để cắt chuỗi rồi căng thẳng ra sao cho
tổng số các hạt cùng màu ở hai đầu là lớn nhất
Chuỗi được thể hiện trong tệp dưới dạng hình thoi, dòng đầu tiên và dòng cuối cùng mỗi dòng có một hạt
Mỗi dòng còn lại có hai hạt (xem hình)
Các hạt của chuỗi được đánh số bắt đầu từ hạt trên cùng và theo chiều kim đồng hồ
Số màu trong chuỗi: 5 Cắt giữa hạt thứ 7 và thứ 8, tổng số lớn nhất là 7.
Tìm số viên gạch cao hơn chiều cao trung bình (hoặc thấp hơn chiều cao trung bình)
Bài 5 Chia mảng CHIAMANG
Kí hiệu sum(a[d c]) = a[d] + a[d +1]+ + a[c].
Gọi t là tổng các phần tử của mảng: t = sum(a[1 n])
Muốn chia a thành hai đoạn a[1 i] và a[i+1 n] có tổng bằng nhau ta phải có:
1 t là số chẵn (t chia hết cho 2) Đặt t2 = t div 2.
2 (tồn tại số i: 1 <= i <= n): sum(a[1 i]) = t2.
Bài 6 Chia mảng tỉ lệ 1:k
Gọi t là tổng các phần tử của dãy a, t = sum(a[1 n])
Muốn chia a thành hai đoạn a[1 i] và a[i + 1 n] có tổng gấp nhau k lần ta phải có:
1 t chia hết cho (k + 1) Đặt t1 = t div (k + 1) và tk = t - t1.
2 (#E i: 1 <= i <= n): sum(a[1 i]) = t1 hoặc sum(a[1 i]) = tk
Trang 40luận là bài toán vô nghiệm Trường hợp này ta phải tiếp tục tích luỹ tr để hi vọng đạt
được tổng tr = tk Nếu sau khi tích luỹ ta thu được tr = tk thì bài toán có nghiệm i, ngược lại, khi tr > tk ta kết luận là bài toán vô nghiệm.
Bài 11 Tích lớn nhất TICHMAX
Lời giải
Nếu tích lớn nhất của 3 phần tử bao gồm:
• Ba số dương: ba số này phải lần lượt là số lớn nhất, nhì, ba trong dãy
• Một số âm và hai số dương: dãy phải gồm đúng hai số dương, vì nếu không ta
có thể lấy tích ba số dương để đạt giá trị lớn hơn Ta cũng suy ra ba số này phải
ba số cần tìm phải là ba số lớn nhất, nhì, ba của dãy
Vậy suy ra, T=max(max1*max2*max3,min1*min2*max1), với max1, max2, max3, min1, min2 lần lượt là số lớn nhất, nhì, ba và số nhỏ nhất, nhì của dãy
Bài 12 Số nhỏ nhất (DN – 2011 – V2)
Dùng mảng a[1 n] để đánh dấu việc giữ thẻ của các em a[k] = x: em thứ x giữ thẻ k.Thuật toán
Khởi tạo em thứ I giữ thẻ i
For <mỗi lượt đọc x, y> do
nx = thẻ nhỏ nhất của học sinh a[x];
ny = thẻ nhỏ nhất của học sinh a[y];
If nx<ny then em a[x] sẽ lấy thẻ y luôn
Else em a[y] sẽ lấy thẻ x;
Số lượng người còn lại = số phần tử khác nhau của mảng a.
Số lượng thẻ nhiều nhất = phần tử lặp nhiều nhất
Bài 13 Hệ thống đèn màu DEN
Lưu trạng thái các đèn vào us[], us[x] =0 tức đèn x đang xanh, ngược lại us[x]=1 là đèn đang đỏ
Duyệt qua từng chương trình, chương trình thứ i, bắt đầu từ đèn thứ i+1, cứ cách i+1 đèn là có đèn đổi màu ta cập nhật lại trạng thái đèn Để thuận tiện ta cho i chạy từ 1 đến k+1
Bài 14 Kiến thông minh KIEN
Lời giải
Đầu tiên tạo mảng theo biểu thức wi = ai mod m + 1, chú ý sử dụng tính chất
ai = ai-1*a và (a*b) mod m = ((a mod m) * (b mod m)) mod m
để làm giảm kích thước số