Ngày nay, Tin học đã trở thành một môn học quan trọng, có hoạt động trí tuệ sáng tạo và hấp dẫn đối với nhiều học sinh, các thầy cô giáo và các bậc phụ huynh. “Tài liệu giảng dạy lập trình khối trung học cơ sở” nhằm phục vụ cho công tác phát hiện, tuyển chọn và bồi dưỡng các học sinh có năng khiếu Tin học ở cấp Trung học cơ sở tham gia kì thi Tin học trẻ được tổ chức hàng năm. Tài liệu trình bày dưới dạng các chuyên đề. Mỗi chuyên đề bao gồm phần tóm tắt ngắn gọn các khái niệm lý thuyết, các ví dụ minh họa và bài tập thực hành được phân loại theo nhiều dạng khác nhau giúp học sinh thấy được nhiều khía cạnh của vấn đề. Nội dung chuyên đề được tham khảo từ nhiều nguồn khác nhau: internet, sách tham khảo, giáo trình, đề thi …
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 31
IV HƯỚNG DẪN GIẢI 35
Chuyên đề 6 MẢNG HAI CHIỀU 37
I TÓM TẮT LÝ THUYẾT 37
1 Khái niệm 37
2 Khai báo 37
3 Truy xuất phần tử 37
II VÍ DỤ 38
III BÀI TẬP 42
IV HƯỚNG DẪN GIẢI 46
Chuyên đề 7 XÂU KÍ TỰ 48
I TÓM TẮT LÝ THUYẾT 48
1 Khái niệm 48
2 Khai báo 48
3 Phép toán trên xâu 48
4 Hàm và thủ tục 49
5 Kiểu kí tự Char 49
II VÍ DỤ 49
III BÀI TẬP 52
IV HƯỚNG DẪN 55
Chuyên đề 8 KIỂU BẢN GHI 57
I TÓM TẮT LÝ THUYẾT 57
1 Khái niệm 57
2 Khai báo – Sử dụng biến kiểu bản ghi 57
II VÍ DỤ 58
III BÀI TẬP 59
Chuyên đề 9 CHƯƠNG TRÌNH CON 61
I TÓM TẮT LÝ THUYẾT 61
1 Khái niệm 61
2 Hàm – Thủ tục 62
3 Tham số trong chương trình con: 63
4 Đệ quy 64
II VÍ DỤ 65
III BÀI TẬP 67
Chuyên đề 10 THƯ VIỆN 69
I TÓM TẮT LÝ THUYẾT 69
Trang 3N K T H
1 Khái niệm 69
2 Unit Crt 69
3 Unit Graph 70
II VÍ DỤ 71
III BÀI TẬP 72
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;
Var a,b,tam: Integer;
Begin
Write('Nhap vao a= '); Readln(a);
Write('Nhap vao b= '); Readln(b);
tam:=a; {tam lấy giá trị của a}
a:=b; {a lấy giá trị của b}
b:=tam; {b lấy lại giá trị của tam}
Write('Nhap vao a= '); Readln(a);
Write('Nhap vao b= '); Readln(b);
a:=a+b; {a lấy tổng giá trị của a+b}
b:=a-b; {b lấy giá trị của a}
a:=a-b; {a lấy lại giá trị của 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
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.
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}
Cac gia tri chan: 2 4 2
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
Trang 32a2 a5 a7
Bài 3 Duyệt mảng DUYET
Nhập số n, k và mảng a gồm n phần tử nguyên a1, a2, …, an Tính
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ó như vậy, nó cân nhắc một tí và cho rằng ý kiến đó là đúng Vì vậy em bắt đầu tiến hành sắp xếp lại các chồng gạch lần lượt từng chiếc một cho đến khi hoàn thành công việc Khi công việc đã hoàn tất Minh mệt lả và muốn có bạn nào giúp Minh di chuyển các viên gạch với số lần ít nhất
Yê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
Trang 33N K T H
• 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 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 7 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
Input
- Dòng đầu là số n (n<1000)
Trang 34Bài 8 Đổ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
4 3 3 4 5 6 8 6 8 4 9 8 4 5 6 9 6 8
Bài 9 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 10 Hệ thống đèn màu DEN
Đề thi tin học trẻ Quốc Gia 2009
9
3 5 1 7 9 0 9 -3 10
810
Trang 35N K T H
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
IV HƯỚNG DẪN GIẢI
Bài 4 Xếp gạch XEPGACH
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.
Trang 36• 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 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