Kết quả ghi lên file văn bản có tên DULIEU.OUT , trong đó dòng đầu chứa giá trị lớn nhất của tổng các phần tử trên một hàng, dòng thứ hai chứa chỉ số các hàng đạt giá trị tổng lớn nhất đ[r]
(1)Ngày soạn: 24/10/2008
Ngày dạy:29/10/2008 Tiết - - 3: CÁC CÂU LỆNH CÓ CẤU TRÚC A.MỤC TIÊU
1.Kiến thức: Học sinh nắm lệnh có cấu trúc, làm tập sữ dụng lệnh có cấu trúc
2.Kỹ năng: Rèn kỹ viết câu lệnh xác, kỹ vận dụng câu lẹnh vào toán cụ thể
3.Thái độ: Học sinh tích cực xác viết câu lệnh, biết vận dụng vào toán thực tế
B PHƯƠNG PHÁP Nêu vấn đề, gợi mở
C CHUẨN BỊ CỦA THẦY VÀ TRÒ Gv: Giáo án, phấn màu viết sơ đồ Hs: Ôn tập câu lệnh D TIẾN TRÌNH LÊN LỚP Ổn định: Sĩ số
2 Kiểm tra cũ: Kiểm tra việc nắm câu lệnh Bài
I CÂU LỆNH RẼ NHÁNH 1.1 Lệnh IF
Cú pháp:
(1) IF B THEN S;
(2) IF B THEN S1 ELSE S2; Sơ đồ thực hiện:
Chú ý: Khi sử dụng câu lệnh IF đứng trước từ khố ELSE khơng có dấu chấm phẩy (;).
1.2 Lệnh CASE Cú pháp:
(2)
B
+
-S1 S2
(1)
B
+
-S
(2)Dạng 1 Dạng 2 CASE B OF
Const 1: S1;
Const 2: S2;
Const n: Sn;
END;
CASE B OF Const 1: S1;
Const 2: S2;
Const n: Sn;
ELSE Sn+1; END;
Trong đó:
B: Biểu thức kiểu vô hướng đếm kiểu nguyên, kiểu logic, kiểu ký tự, kiểu liệt kê
Const i: Hằng thứ i, giá trị hằng, giá trị (phân cách dấu phẩy) đoạn (dùng hai dấu chấm để phân cách giá trị đầu giá trị cuối)
Giá trị biểu thức giá trị tập i (i=1¸n) phải có kiểu Khi gặp lệnh CASE, chương trình kiểm tra:
- Nếu giá trị biểu thức B nằm tập const i máy thực lệnh Si tương ứng
- Ngược lại:
+ Đối với dạng 1: Khơng làm + Đối với dạng 2: thực lệnh Sn+1 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ị Min> TO <giá trị Max> DO S;
Dạng lùi
FOR <biến đếm>:=<giá trị Max> DOWNTO <giá trị Min> DO S;
Sơ đồ thực vòng lặp FOR:
Chú ý: Khi sử dụng câu lệnh lặp FOR cần ý điểm sau:
Không nên tuỳ tiện thay đổi giá trị biến đếm bên vòng lặp FOR vì làm khơng kiểm sốt biến đếm.
(3)5.3.2 Vòng l p không xác ặ định
Dạng REPEAT Dạng WHILE Repeat
S; Until B;
While B Do S;
Ý nghĩa:
Dạng REPEAT: Lặp lại công việc S biểu thức B=TRUE thì dừng
Dạng WHILE: Trong biểu thức B=TRUE tiếp tục thực công việc S
Bài tập 1: Viết chương trình nhập vào số nguyên kiểm tra xem số vừa nhập số chẵn hay số lẻ
Dạng tiến
Biến đếm:=Min
Biến đếm<=Max
+
-Thoát S;
INC(Biến đếm);
Dạng lùi
Biến đếm:=Max
Biến đếm>=Max
+
-Thoát S;
DEC(Biến đếm);
Repeat
S
B +
-Thoát
While
B
+
(4)
Uses crt; Var x:integer; Begin
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 ax+b=0 Uses Crt;
Var a,b,x : real; Begin
Write('a = '); Readln(a); Write('b = '); Readln(b);
If a = Then { Nếu a }
If b = Then { Trường hợp a = b = } Writeln('Phuong trinh co vo so nghiem') Else { Trường hợp a=0 b }
Writeln('Phuong trinh vo nghiem') Else { Trường hợp a }
Begin
x:= -b/a;
Writeln('Phuong trinh co nghiem la :',x:0:2); End;
Readln; End
Bài tập 3: Viết chương trình nhập vào tuổi người cho biết người thiếu niên, niên, trung niên hay lão niên Biết rằng: tuổi nhỏ 18 thiếu niên, từ 18 đến 39 niên, từ 40 đến 60 trung niên lớn 60 lão niên
Program bai3; Uses crt;
Var tuoi:Byte; Begin
Write(Nhap vao tuoi cua mot nguoi:'); Readln(tuoi); Case tuoi Of
1 17: Writeln(Nguoi la thieu nien');
(5)40 60: Writeln(Nguoi la trung nien'); Else Writeln(Nguoi la lao nien'); End;
Readln; End.
4 CŨNG CỐ
Hãy nêu giống khác hai dạng lệnh lặp Repeat Until While
5 HƯỚNG DẪN, DẶN DÒ Bài tập nhà
Bài tập 1: Viết chương trình tính tổng S = 1+2+ +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 in hình tổng số vừa nhập vào
Ý tưởng:
Bài tập 3: Viết chương trình tính số Pi với độ xác Epsilon, biết: Pi/4 = 1-1/3+1/5-1/7+
Ý tưởng:
Ta thấy rằng, mẫu số số lẻ có qui luật: 2*i+1 với i=1, ,n Do ta dùng i làm biến chạy
Vì tính số Pi với độ xác Epsilon nên trước cụ thể số lần lặp, ta phải dùng vịng lặp WHILE REPEAT Có nghĩa phải lặp t=4/(2*i+1) Epsilon dừng
Dùng phương pháp cộng dồn Cho vòng lặp FOR chạy từ tới N, ứng với lần lặp thứ i, ta nhập vào số nguyên X đồng thời cộng dồn X vào biến S
********************************************************** Ngày soạn: 24/10/2008
Ngày dạy:1/11/2008 Tiết - – 6: THỰC HÀNH A.MỤC TIÊU
1.Kiến thức: Học sinh vận dụng câu lệnh có cấu trúc giải tập 2.Kỹ năng: Rèn kỹ vận dụng câu lệnh có cấu trúc vào giải tốn 3.Thái độ: Học sinh tích cực thực hành, linh họat vận dụng vào thự tế B PHƯƠNG PHÁP
Thực hành
C CHUẨN BỊ CỦA THẦY VÀ TRÒ Gv: Bài tập thực hành
(6)2 Kiểm tra cũ: Kiểm tra việc nắm câu lệnh Bài
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 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;
(7)S:=S+i; i:=i+1; End;
Writeln('Ket qua la :',S); Readln;
End
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 in hình tổng số vừa 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ừ tới N, ứng với lần lặp thứ i, ta nhập vào số nguyên X đồ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; For i:=1 To n Do
Begin
Write('Nhap so nguyen X= '); 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 số nguyên gặp số 0 kết thúc Hãy đếm xem có số chẵn vừa nhập vào
Ý tưởng:
Bài tốn khơng biết 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 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
Write('Nhap vao mot so nguyen N= '); Readln(N); If N MOD = Then dem:=dem+1;
Until N=0;
(8)Readln; End
Bài tập 4: Viết chương trình tính số Pi với độ xác Epsilon, biết: Pi/4 = 1-1/3+1/5-1/7+
Ý tưởng:
Ta thấy rằng, mẫu số số lẻ có qui luật: 2*i+1 với i=1, ,n Do ta dùng i làm biến chạy
Vì tính số Pi với độ xác Epsilon nên trước cụ thể số lần lặp, ta phải dùng vịng lặp WHILE REPEAT Có nghĩa phải lặp t=4/(2*i+1) Epsilon dừng
Uses Crt;
Const Epsilon=1E-4; Var Pi,t:real;
i,s:Integer; Begin
Pi:=4; i:=1; s:=-1; t:=4/(2*i+1);
While t>Epsilon Do Begin
Pi:=Pi+s*t; s:=-s; i:=i+1; t:=4/(2*i+1); End;
Writeln('So Pi = ',Pi:0:4); Readln;
End
Bài tập 5: Viết chương trình nhập vào số nguyên N In hình tất các ước số N
Ý tưởng:
Cho biến i chạy từ tới N Nếu N MOD i=0 viết i hình Uses Crt;
Var N,i : Integer; Begin
Clrscr;
Write('Nhap so nguyen N= '); Readln(N); For i:=1 To N Do
If N MOD i=0 Then Write(i:5); Readln;
End
(9)Bài tập1: Viết chương trình tìm USCLN BSCNN số a, b nhập vào từ bàn phím
Ý tưởng:
- Tìm USCLN: Lấy số lớn trừ số nhỏ a=b dừng Lúc đó: USCLN=a
- BSCNN(a,b) = a*b DIV USCLN(a,b)
Bài tập 2: Viết chương trình tìm số có chữ số abc cho: abc = a3 + b3 + c3.
Ý tưởng:
Dùng phương pháp vét cạn Ta biết rằng: a có giá trị từ 19 (vì a số hàng trăm), b,c có giá trị từ 09 Ta dùng vòng lặp FOR lồng để duyệt qua tất trường hợp a,b,c
Ứng với abc, ta kiểm tra: Nếu 100.a + 10.b + c = a3 + b3 + c3 thì in abc
*********************************************************
********************************************************* Ngày soạn: 2/11/2008
Ngày dạy:5/11/2008
Tiết - – 9: CÁC CÂU LỆNH CÓ CẤU TRÚC A.MỤC TIÊU
1.Kiến thức: Học sinh nắm lệnh có cấu trúc, làm tập sữ dụng lệnh có cấu trúc
2.Kỹ năng: Rèn kỹ viết câu lệnh xác, kỹ vận dụng câu lệnh vào toán cụ thể
3.Thái độ: Học sinh tích cực xác viết câu lệnh, biết vận dụng vào toán thực tế
B PHƯƠNG PHÁP Nêu vấn đề, gợi mở
C CHUẨN BỊ CỦA THẦY VÀ TRÒ Gv: Giáo án, phấn màu viết sơ đồ Hs: Ôn tập câu lệnh D TIẾN TRÌNH LÊN LỚP Ổn định: Sĩ số
(10)3 Bài
Bài tập 1: Viết chương trình tìm USCLN BSCNN số a, b nhập vào từ bàn phím
Ý tưởng:
- Tìm USCLN: Lấy số lớn trừ số nhỏ a=b dừng Lúc đó: USCLN=a
- BSCNN(a,b) = a*b DIV USCLN(a,b) 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
Bài tập 2: Viết chương trình tìm số có chữ số abc cho: abc = a3 + b3 + c3.
Ý tưởng:
Dùng phương pháp vét cạn Ta biết rằng: a có giá trị từ 19 (vì a số hàng trăm), b,c có giá trị từ 09 Ta dùng vòng lặp FOR lồng để duyệt qua tất trường hợp a,b,c
Ứng với abc, ta kiểm tra: Nếu 100.a + 10.b + c = a3 + b3 + c3 thì in abc
Uses crt;
Var a,b,c : Word; Begin
For a:=1 To Do
For b:=0 To Do
For c:=0 To Do
If (100*a + 10*b + c)=(a*a*a + b*b*b + c*c*c) Then Writeln(a,b,c);
(11)Bài tập 3: Viết chương trình nhập vào số tự nhiên N thơng báo lên hình số có phải số nguyên tố hay không
Ý tưởng:
N số ngun tố N khơng có ước số từ N div Từ định nghĩa ta đưa giải thuật:
- Đếm số ước số N từ N div lưu vào biến d - Nếu d=0 N số nguyên tố
Uses crt;
Var N,i,d : Word; Begin
If N<2 Then Writeln(N,’ khong phai la so nguyen to’) Else
Begin
{Đếm số ước số} d:=0;
For i:=2 To N div Do
If N MOD i=0 Then d:=d+1; {Kiểm tra}
If d=0 Then Writeln(N,’ la so nguyen to’) Else Writeln(N,’ khong phai la so nguyen to’); End;
Readln; End
Bài tập 4: Viết chương trình giải phương trình bậc hai: ax2 + bx + c = 0, a0. Gợi ý:
- 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ó nghiệm phân biệt: x1,2 = (-bSQRT(Delta))/(2*a)
4.CŨNG CỐ:
Khi ta sữ dụng câu lệnh lặp While
cần lưu ý trước else khơng có dấu ; cần ý khia báo kiểu liệu 5 HƯỚNG DẪN, DẶN DÒ
Bài tập 1: Viết chương trình nhập vào ngày, tháng, năm Máy lên ngày, tháng, năm hôm sau
(12)Biện luận theo tháng Gom tháng thành 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) tháng (có 28 29 ngày tùy theo năm nhuận)
Dùng lệnh lựa chọn: CASE thang OF
1,3,5,7,8,10,12: 4,6,9,11: 2: END;
Bài tập 2: Viết chương trình in hình giá trị bảng mã ASCII từ 0255
Gợi ý:
Cho biến i chạy từ 255 In hình i CHR(i)
*************************************************** Ngày soạn: 2/11/2008
Ngày dạy:8/11/2008 Tiết 10 - 11 – 12: THỰC HÀNH A.MỤC TIÊU
1.Kiến thức: Học sinh vận dụng câu lệnh có cấu trúc giải tập 2.Kỹ năng: Rèn kỹ vận dụng câu lệnh có cấu trúc vào giải tốn 3.Thái độ: Học sinh tích cực thực hành, linh họat vận dụng vào thự tế B PHƯƠNG PHÁP
Thực hành
C CHUẨN BỊ CỦA THẦY VÀ TRÒ Gv: Bài tập thực hành
Hs: Làm tập nhà D TIẾN TRÌNH LÊN LỚP Ổn định: Sĩ số
2 Kiểm tra cũ: Kiểm tra việc nắm câu lệnh Bài
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 số giây nhập từ bàn phím Hãy in kết sau cọng xong Gợi ý:
- Gọi số giây cộng thêm là: ss Gán giây:=giây+ss
- Nếu giây60 thì: phút:=phút + giây DIV 60 giây:=giây MOD 60 - Nếu phút60 thì: giờ:=giờ + phút DIV 60 phút:=phút MOD 60 Bài tập 2: Viết chương trình tìm Max, Min số: a, b, c, d.
Bài tập 3: Viết chương trình in hình số nguyên từ đến 100 cho 10 số xuống dòng
(13)Cho biến i chạy từ 100 In hình i kiểm tra: i MOD 10=0 WRITELN
Bài tập 4: Viết chương trình in hình bảng cữu chương. Gợi ý:
Dùng vòng lặp FOR lồng nhau: i số bảng cữu chương (2 9), j số thứ tự bảng cữu chương (1 10)
For i:=2 To Do
For j:=1 To 10 Do Writeln(i,’x’,j,’=’,i*j);
Bài tập 5: Viết chương trình để tìm lời giải cho tốn sau: Trong giỏ vừa thỏ vừa gà,
Một trăm cẳng bốn ba đầu Hỏi có gà thỏ?
Bài tập 6: Viết chương trình để tìm lời giải cho tố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
Năm trâu nghé ăn
Hỏi có trâu đứng, trâu nằm, trâu nghé?
Bài tập 7: Viết chương trình nhập vào số nguyên từ bàn phím gặp số ngun tố kết thúc nhập Tính tổng số chẵn trung bình cọng số lẻ
Gợi ý:
Dùng vòng lặp REPEAT UNTIL NTo; để nhập Trong đó, NTo biến kiểu Boolean để kiểm tra số nhập vào có phải số ngun tố hay khơng Bài tập 8: Viết chương trình nhập vào số nguyên dương Hãy thông báo lên hình số có chữ số tổng chữ số số
Gợi ý:
Dùng vịng lặp WHILE Trong N>0 thì: lấy chữ số cuối N để tính phép tốn MOD 10, sau bỏ bớt chữ số cuối N phép toán DIV 10
4 CŨNG CỐ:
Nhận xét thực hành 5 HƯỚNG DẪN, DẶN DÒ
Bài tập 9: Viết chương trình in hình tất số nguyên tố từ đến N Với N nhập từ bàn phím
Bài tập 10: Viết chương trình phân tích số thừa số nguyên tố Ví dụ: N=100 in hình:
(14)25 | 5 | |
Bài tập 11: Số hoàn thiện số tự nhiên có tổng ước (khơng kể nó) Viết chương trình kiểm tra xem số nhập vào từ bàn phím có phải số hồn thiện hay khơng? Ví dụ: 6, 28 số hồn thiện Gợi ý:
- Tính tổng ước số N: từ N div lưu vào biến S - Nếu S=N N số hoàn thiện
***************************************************
*************************************************** Ngày soạn:9/11/2008
Ngày dạy:12/11/2008
Tiết 13 - 14 – 15: CHƯƠNG TRÌNH CON A.MỤC TIÊU
1.Kiến thức: Học sinh nắm khái niệm chương trình con, biết cách vận dụng chương trình
2.Kỹ năng: Rèn kỹ viết tốn sữ dụng chương trình con 3.Thái độ: Hoc sinh thấy cần thiết phải viết chương trình con B PHƯƠNG PHÁP
Nêu vấn đề, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ Gv: Giáo án, phấn màu viết sơ đồ Hs: Ơn tập câu lênh có cấu trúc D TIẾN TRÌNH LÊN LỚP Ổn định: Sĩ số
2 Kiểm tra cũ: Kiểm tra việc nắm câu lệnh Bài
I KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON
Chương trình (CTC) đoạn chương trình thực trọn vẹn hay chức Trong Turbo Pascal, có dạng CTC:
Thủ tục (PROCEDURE): Dùng để thực hay nhiều nhiệm vụ
(15)Ngồi ra, Pascal cịn cho phép CTC lồng vào
II CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CĨ SỬ DỤNG CTC
PROGRAM Tên_chương_trình; USES CRT;
CONST .; TYPE ; VAR .;
PROCEDURE THUTUC[(Các tham số)]; [Khai báo Const, Type, Var]
BEGIN
END;
FUNCTION HAM[(Các tham số)]:<Kiểu liệu>; [Khai báo Const, Type, Var]
BEGIN
HAM:=<Giá trị>; END;
BEGIN {Chương trình chính}
THUTUC[( )]; A:= HAM[( )]; END
Chú ý: Trong trình xây dựng CTC, nên dùng thủ tục/hàm?
Dùng hàm Dùng thủ tục
- Kết tốn trả giá trị duy (kiểu vơ hướng, kiểu string hoặc kiểu trỏ).
- Lời gọi CTC cần nằm biểu thức tính tốn
- Kết tốn khơng trả giá trị trả nhiều giá trị hoặc trả kiểu liệu có cấu trúc (Array, Record, File).
- Lời gọi CTC không nằm biểu thức tính tốn
Ví dụ 1: Viết CTC để tính n! = 1.2 n
Ý tưởng: Vì tốn trả giá trị nên ta dùng hàm. Function GiaiThua(n:Word):Word;
Var P, i:Word; Begin
P:=1;
(16)End;
CHÚ Ý: Trong ví dụ trên:
n, x, y gọi tham trị (khơng có từ khóa var đứng trước) sau khi khỏi CTC giá trị khơng bị thay đổi
xx, yy gọi tham biến (có từ khóa var đứng trước) sau ra khỏi CTC giá trị bị thay đổi
III BIẾN TỒN CỤC VÀ BIẾN ĐỊA PHƯƠNG
Biến toàn cục: biến khai báo chương trình Các biến có tác dụng nơi tồn chương trình
Biến địa phương: biến khai báo CTC Các biến này có tác dụng phạm vi CTC mà
Chú ý: Trong CTC, biến tồn cục trùng tên với biến địa phương biến địa phương ưu tiên
Ví dụ:1
Program KhaoSatBien;
Var a,b: Integer; {biến toàn cục} Procedure ThuBien;
Var a: Integer; {biến địa phương} Begin
a:=10;
Writeln(‘A=’,a,’B=’,b); End;
Begin
a:=50; b:=200;
ThuBien; {A=10 B=200}
Writeln(‘A=’,a,’B=’,b); {A=50 B=200} End
Bài tập 2: Viết hàm LOWCASE( c:char):char; để đổi chữ hoa c thành chữ thường
Ý tưởng:
Trong bảng mã ASCII, số thứ tự chữ hoa nhỏ số thứ tự chữ thường 32 Vì ta dùng hàm CHR ORD để chuyển đổi Uses crt;
Var ch:Char;
Function LOWCASE(c:Char):Char; Begin
If c IN [‘A’ ’Z’] Then LOWCASE:=CHR(ORD(c)+32) Else LOWCASE:=c;
(17)Begin
Write(‘Nhap ký tu ch=’); Readln(ch); Writeln(‘Ky tu hoa la: ‘, LOWCASE(ch)); Readln;
End
Bài tập 3: Viết thủ tục để hốn đổi hai gía trị x,y cho Var a,b:Real;
Function Swap(Var x,y:Real); Var Tam:Real;
Begin
Tam:=x; x:=y; y:=Tam; End;
Begin
Write(‘Nhap a=’); Readln(a); Write(‘Nhap b=’); Readln(b); Swap(a,b);
Writeln(‘Cac so sau hoan doi: a=‘, a:0:2,’ b=’,b:0:2); Readln;
End
4.CŨNG CỐ:
Chương trình gì? phải viết chương trình Hãy nêu sựu giống nahu khác hai chương trình Prcedure Function
5.HƯỚNG DẪN, DẶN DÒ
Bài tập 1: Viết hàm XMU(x:Real;n:Byte):Real; để tính giá trị xn.
Bài tập 2: Viết thủ tục PHANTICH(n:Integer); để phân tích số nguyên n thừa số nguyên tố
Bài tập 3: Viết hàm tìm BSCNN số nguyên a,b khai báo sau: Function BSCNN (a,b:word ):word ;
*********************************************************** Ngày soạn:9/11/2008
Ngày dạy:15/11/2008 Tiết 16 - 17 – 18: THỰC HÀNH A.MỤC TIÊU
1.Kiến thức: Học sinh vận dụng cách viết chương trình vào làm các tập
2.Kỹ năng: Rèn kỹ viết chương trình con
3.Thái độ: Hoc sinh thấy cần thiết phải viết chương trình con B PHƯƠNG PHÁP
Thực hành
(18)Hs: Làm tập nhà D TIẾN TRÌNH LÊN LỚP Ổn định: Sĩ số
2 Kiểm tra cũ: Kiểm tra học sinh làm tập nhà Bài
Bài 1: Viết chương trình tìm diện tích hình chữ nhật biết kích thước hai cạnh
Program Bai1;
var dai,rong,dientich:real;
{ }
procedure tinhdientich(a,b:real;var S:real); Begin
S:= a*b; end;
{ }
Write(‘ Nhap vao kich thuoc hinh chu nhat ‘); Readln(dai,rong);
Tinhdientich(dai,rong,dientich);
Write(‘dien ich hinh chu nhat la:’, dientich); end
Bài 2:Nhập từ bàn phím số nguyên dương N(0<N<=10000) Viết chương trình kiểm tra xem số có phải số đối gương hay khơng? ( số đối gương gọi số Palindrome, số mà viết chữ số theo ngược lạivẫn đuwocj nó) Ví dụ, 12521 gọi số đối gương
Program Bai2; Var x,L:longint; ok:Boolean;
Function sochuso(a:longint):byte; var p:byte;
begin p:=0;
While a>0 Begin
a:=a div 10; inc(P): end;
sochuso:=p; end;
(19)m;array[1 10] 0f byte; begin
For i:=L downto Begin
m[i]:=a mod 10; a:=a div 10; end;
i:=1; j:=L;
DG:=false; While i<j Begin
if m[i] <> m[j] then exit; inc(i);
dec(j); end;
DG:=true; end;
BEGIN
write(‘ nhap so x =’); readln(x);
L:=sochuso(x); ok:=DG(x,L);
if ok then write(x, ‘ doi guong’) else write(x, ‘ khong la doi guong’); readln;
END
Bài 3: Viết chương trình xây dựng chương trình tính số ước số nguyên dương Sữ dụng chương trình tìm số ngun dương khơng vượt số nguyên dương h cho trước (h<=5000) có số lượng ước nhiều
program bai3; cosnt h= 5000;
var x,max_sl,p:integer;
Function sl_uoc(a:integer):integer; Var i, sl:integer;
Begin sl:=1;
(20)inc(sl); sl+uoc:=sl+1; end;
BEGIN
max_sl:=0; For x:= to h Begin
p:=sl_uoc(x);
if p>max_sl then max_sl:=p; end;
Writeln(‘ so uoc nhieu nhat la:’,max_sl); Writeln(‘ cac so co’,Max-sl,’ uoc la:’); If sl_uoc(x) = max_sl then write(x:8); readln;
END
4.CŨNG CỐ
Nhận xét thực hành 5.HƯỚNG DẪN, DẶN DÒ Bài 1: S2 = 1+1/2 + + 1/n ;
Bài tập 2: Lập hàm đệ qui để tính dãy Fibonaci: F(n) = {F(n −11)+, nF(=n −1Ún2)=, n2 >2
********************************************************
******************************************************** Ngày soạn:16/11/2008
Ngày dạy:19/11/2008 Tiết 19 - 20 – 21: CHƯƠNG TRÌNH CON A.MỤC TIÊU
1.Kiến thức: Học sinh nắm chương trình sữ dụng thuật tóan đệ quy 2.Kỹ năng: Rèn kỹ viết toán sữ dụng chương trình đệ quy 3.Thái độ: Hoc sinh thấy quan trọng chương trình đệ quy B PHƯƠNG PHÁP
Nêu vấn đề, gợi mở, vấn đáp
(21)Hs: Ôn tập cách viết chương trình D TIẾN TRÌNH LÊN LỚP
1 Ổn định: Sĩ số
2 Kiểm tra cũ: Kiểm tra việc nắm câu lệnh Bài
IV ĐỆ QUI
4.1 Khái niệm đệ qui
Trong chương trình, CTC gọi CTC khác vào làm việc Nếu CTC gọi lại gọi đệ qui
4.2 Phương pháp thiết kế giải thuật đệ qui Tham số hóa tốn
Tìm trường hợp suy biến
Phân tích trường hợp chung (đưa toán loại nhỏ hơn)
Ví dụ: Viết hàm đệ qui để tính n! = 1.2 n Tham số hóa: n! = Factorial(n);
Factorial(0) = (trường hợp suy
biến)
Factorial(n) = n*Factorial(n-1) (trường hợp chung) Function Factorial(N:integer):Longint;
Begin
If N=0 Then Factorial:=1
Else Factorial:=N*factorial(N-1); { lời gọi đệ qui } End;
4.3 Giải thuật quay lui Bài toán:
Hãy xây dựng giá trị gồm n thành phần (x1, ,xn) từ tập hữu hạn cho trước cho thỏa mãn yêu cầu B cho trước
Phương pháp chung
Giả sử xác định k-1 phần tử dãy: x1, ,xk-1 Ta cần xác định phần tử thứ k Phần tử xác định theo cách sau:
- Giả sử Tk: tập tất giá trị mà phần tử xk nhận Vì tập Tk hữu hạn nên ta đặt nk số phần tử Tk theo thứ tự đó, tức ta thành lập ánh xạ 1-1 từ tập Tk lên tập {1, 2, , nk}
- Xét j{1, 2, , nk} Ta nói “j chấp nhận được” ta bổ sung phần tử thứ j Tk với tư cách phần tử xk vào dãy x1, ,xk-1 để dãy x1, ,xk
- Nếu k=n: Bộ (x1, ,xk) thỏa mãn yêu cầu B, thu nhận - Nếu k<n: Ta thực tiếp trình trên, tức phải bổ sung tiếp phần tử xk+1 vào dãy x1, ,xk
(22)Procedure THU(k:Integer); Var j:Integer;
Begin
For j:=1 To nk Do
If <j chấp nhận được> Then Begin
<Xác định xk theo j>;
If k=n Then <Ghi nhận giá trị> Else THU(k+1); {Quay lui}
End; End;
Ví dụ 1: Liệt kê dãy nhị phân có độ dài n Program DayNhiPhan;
Var b:Array[1 20] Of 1; {Dãy nhị phân có độ dài tối đa 20} n:Byte;
Procedure InKetQua; Var i:Byte;
Begin
For i:=1 To n Do Write(b[i]); Writeln;
End;
Procedure THU(k:Byte); Var j:Byte;
Begin
For j:=0 To Do {Tập giá trị dãy nhị phân} Begin
b[k]:= j;
If k=n Then InKetQua
Else THU(k+1); {Quay lui} End;
End; Begin
Write(‘n = ‘); Readln(n); THU(1);
Readln; End
Bài tập 2: Viết hàm XMU(x:Real;n:Byte):Real; để tính giá trị xn. Var x:Real;
n:Byte;
(23)Var i:Byte; S:Rea; Begin
S:=1;
For i:=1 To n Do S:=S*x; XMU:=S;
End; Begin
Write(‘Nhap x=’); Readln(x); Write(‘Nhap n=’); Readln(n);
Writeln(‘x mu n = ‘, XMU(x,n):0:2); Readln;
End
Bài tập 3: Viết thủ tục PHANTICH(n:Integer); để phân tích số nguyên n thừa số nguyên tố
Uses crt; Var n:Integer;
Procedure PHANTICH(n:Integer); Var i:Integer;
Begin i:=2;
While n<>1 Do Begin
While n MOD i=0 Do Begin
Writeln(n:5,'|',i:2); n:=n Div i;
End; i:=i+1; End;
Writeln(n:5,'|'); End;
Begin
Write('Nhap n='); Readln(n); PHANTICH(n);
Readln; End
4.CŨNG CỐ:
Thế chương trình đệ quy ?
Hãy cho biết cấu trúc chương trình đệ quy 5.HƯỚNG DẪN, DẶN DỊ
Bài tập 1: Viết hàm tìm BSCNN số nguyên a,b khai báo sau: Function BSCNN (a,b:word ):word ;
Bài tập 2: Viết thủ tục để tối giản phân số a/b , với a, b số nguyên Bài tập 3: Viết hàm đệ quy để tính:
(24)*************************************************** Ngày soạn:16/11/2008
Ngày dạy:22/11/2008 Tiết 22 - 23 - 24: THỰC HÀNH
A.MỤC TIÊU
1.Kiến thức: Học sinh vận dụng cách viết chương trình vào làm các tập
2.Kỹ năng: Rèn kỹ viết chương trình con
3.Thái độ: Hoc sinh thấy cần thiết phải viết chương trình con B PHƯƠNG PHÁP
Thực hành
C CHUẨN BỊ CỦA THẦY VÀ TRÒ Gv: Bài tập thực hành
Hs: Làm tập nhà D TIẾN TRÌNH LÊN LỚP Ổn định: Sĩ số
2 Kiểm tra cũ: Kiểm tra học sinh làm tập nhà Bài
Bài 1: Hoán vị dãy {1,2,3 ,N} dãy N số nguyên khác có giá trị thuộc tập số nguyên từ đến N Ví dụ dãy P={5,9,1,8,2,6,4,7,3} hóan vị dãy {1,2,3,4,5,6,7,8,9} Người ta xây dựng bảng nghịch hoán vị P={p1,p2,p3 pn} dãy T= {t1,t2, tN} theo quy tắc, ti số phần tử P đứng bên trái số i P lớn hon i (1<=i<=N)
Hướng dẫn: Trước hết, tìm xem số i nằm vị trí hoán vị P Giả sử i là phần tử thứ j P
Duyệt dãy P từ vị trí thứ đến vị trí thứ j-1, đếm số lượng phần tử lớn số i Số lượng giá trị ti cần tìm
Giải:
Program bai1; const max = 20;
type m1 = array[1 max] of integer; var n:byte;
p,t:m1;
Procedure nhap_input; var i:byte;
Begin
write(‘nhap so nguyn duong n<20’); readln(n);
begin
(25)readln(P[i]); end;
Procedure hien_output(m:m1); var i:byte;
Begin
for i:=1 to n write(m[i]:4); end;
Function tinh(p:m;i:byte):byte; var k,j,dem:byte;
Begin j:=1;
while p[j] <>i then inc(j); dem:=0;
for k:= to j-1 if p[k] >i then inc(dem); tinh:=dem; end;
Procedure thuchien; var i:byte;
Begin
for i:= to n t[i]:= tinh(p,i); end;
BEGIN
nhap_input; thuchien; hien_output; readln; END.
Bài 2: Bài tốn hay trị chơi tháp Hà Nội nhà sư Tương truyền một đền lớn tai Bénares ( Ấn Độ) có để đồng có cọc kim cương Thượng đế khai sinh giới xếp 64 đĩa vàng cọcvới đường kính giảm dần Ngày đêm nhà sư dịch chuyển đĩa sang cọc khác với nguyên tắc sau:
+ Mỗi lần dịch chuyển đĩa
(26)+Không đem đĩa đĩa khác có đường kính nhỏ Và ngày tận đến 64 đĩa vàng dịhc chuyển để làm việc phải 58 tỉ năm!
Giải
Program thap_HN; var n;integer;
Procedure Dichuyen(n,C1,C2,C3;Integer); Begin
if n= then
writeln(‘C1’,C1) else
Begin
Dichuyen(n-1,C1,C3,C2); Dichuyen(1,C1,C2,C3); Dichuyen(n-1,C3,C2,C1); end;
end; end;
BEGIN
write(‘Nhap n’); readln(n);
writeln(‘ chuong trinh dich chuyen dia nhu sau’); Dichuyen(N,1,2,3);
readln; END.
4.CŨNG CỐ:
Nhận xét thực hành 5.HƯỚNG DẪN, DẶN DÒ
Bài tập 1: Viết chương trình in hình hốn vị n số nguyên đầu tiên
Bài 2: Xây dựng hàm daonguoc(n:word) có giá trị trả hàm số nguyên có cách lấy đảo ngược chữ số n Ví dụ đảo ngược số 12305 có kết 50321
(27)Ngày soạn: 23/11/2008 Ngày dạy:26/11/2008 Tiết 25-26-27: MẢNG MỘT CHIỀU
1.Kiến thức: Học sinh nắm cách viết liệu dạng mảng chiều, làm tốn mảng chiều
2.Kỹ năng:Có kỹ phân tích tốn, viết câu lệnh xác
3.Thái độ: Học sinh tích cực, tự giác, hứng thú giải toán mảng B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Giáo án, phấn màu vẽ sơ đồ
HS: Ôn tập câu lệnh D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2.Kiểm tra cũ: 3 Bài
DỮ LIỆU KIỂU MẢNG (ARRAY) I KHAI BÁO MẢNG
Cú pháp:
TYPE <Kiểu mảng> = ARRAY [chỉ số] OF <Kiểu liệu>; VAR <Biến mảng>:<Kiểu mảng>;
hoặc khai báo trực tiếp:
VAR <Biến mảng> : ARRAY [chỉ số] OF <Kiểu liệu>; Ví dụ:
TYPEMangnguyen = Array[1 100] of Integer;
Matrix = Array[1 10,1 10] of Integer; MangKytu = Array[Byte] of Char;
VAR A: Mangnguyen;
M: Matrix; C: MangKytu; hoặc:
VAR A: Array[1 100] of Integer; C: Array[Byte] of Char; II XUẤT NHẬP TRÊN DỮ LIỆU KIỂU MẢNG
- Để truy cập đến phần tử thứ k mảng chiều A, ta sử dụng cú pháp: A[k]
(28)- Có thể sử dụng thủ tục READ(LN)/WRITE(LN) phần tử biến kiểu mảng
BÀI TẬP MẪU
Bài tập 1:Viết chương trình tìm giá trị lớn mảng chứa số nguyên gồm N phần tử
Ý tưởng:
- Cho số lớn số đầu tiên: Max:=a[1]
- Duyệt qua phần tử a[i], với i chạy từ tới N: Nếu a[i]>Max thay Max:=a[i];
Program Bai1; Uses Crt;
Type Mang = ARRAY[1 50] Of Integer; Var A:Mang;
N,i,Max:Integer; Begin
{Nhập mảng}
Write(‘Nhap N=’); Readln(N); For i:=1 To N Do
Begin
Write(‘A[‘,i,’]=’); Readln(A[i]); End;
{Tìm phần tử lớn nhất} Max:=A[1];
For i:=2 To N Do
If Max<A[i] Then Max:=A[i]; {In kết hình}
Writeln(‘Phan tu lon nhat cua mang: ’, Max); Readln;
End.
Bài tập 2:Viết chương trình tính tổng bình phương số âm mảng gồm N phần tử
Ý tưởng:
Duyệt qua tất phần tử A[i] mảng: Nếu A[i]<0 cộng dồn (A[i])2 vào biến S
Program Bai2; Uses Crt;
Type Mang = ARRAY[1 50] Of Integer; Var A:Mang;
(29)Begin
{Nhập mảng}
Write(‘Nhap N=’); Readln(N); For i:=1 To N Do
Begin
Write(‘A[‘,i,’]=’); Readln(A[i]); End;
{Tính tổng} S:=0;
For i:=1 To N Do
If A[i]<0 Then S:=S+A[i]*A[i]; {In kết hình}
Writeln(‘S= ’, S); Readln;
End.
Bài tập 3: Viết chương trình nhập vào mảng gồm N số nguyên Sắp xếp lại mảng theo thứ tự tăng dần in kết hình
Ý tưởng:
Cho biến i chạy từ đến N-1, đồng thời cho biến j chạy từ i+1 đến N: Nếu A[i]>A[j] đổi chổ A[i], A[j]
Program bai3; Uses Crt;
Type Mang = ARRAY[1 50] Of Integer; Var A:Mang;
N,i,j,Tam:Integer; Begin
{Nhập mảng}
Write(‘Nhap N=’); Readln(N); For i:=1 To N Do
Begin
Write(‘A[‘,i,’]=’); Readln(A[i]); End;
{Sắp xếp}
For i:=1 To N-1 Do
For j:=i+1 To N Do If A[i]>A[j] Then
Begin
Tam:=A[i]; A[i]:=A[j]; A[j]:=Tam; End;
(30)Writeln(‘Ket qua sau sap xep:’); For i:=1 To N Do Write(A[i]:5); Readln;
End.
4 CŨNG CỐ:Nhắc lại cách khai báo kiểu mảng chiều, muốn truy xuất phần tử thứ i ta làm ? cần lưu ý ghi hai phần tử liên tiếp phải có khỏng trắng
5 HƯỚNG DẪN , DẶN DÒ
Bài 1:Nhập n số thực từ bàn phím vào mảng, tính trung bình cộng các số
Bai 2:Viết chương trình nhập vào mảng A gồm N số nguyên nhập thêm vào số nguyên X Hãy kiểm tra xem phần tử X có mảng A hay khơng? B i 3:à Cho mảng số nguyên gồm n phần tử Tìm dãy gồm m phần tử (mn) cho dãy có tổng lớn (Dãy dãy phần tử liên tiếp mảng)
*****************************************************************************
Ngày soạn: 23/11/2008 Ngày dạy:29/11/2008
Tiết 28-29-30: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng kiến thức học làm toán mảng chiều
2.Kỹ năng: Có kỹ thưch hành máy nhanh, xác 3.Thái độ: Học sinh tích cực, tự giác, hứng thú tỷong thực hành B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Bài tập, phòng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Thực hành
Bài tập 1: Viết chương trình nhập vào mảng A gồm N số nguyên nhập thêm vào số nguyên X Hãy kiểm tra xem phần tử X có mảng A hay khơng?
Ý tưởng:
Dùng thuật tốn tìm kiếm So sánh x với phần tử mảng A Thuật toán dừng lại x=A[i] i>N
Nếu x=A[i] vị trí cần tìm i, ngược lại kết tìm (khơng tìm thấy)
Program Bài 1; Uses Crt;
(31)N,i,x:Integer;
Function TimKiem(x, N: Integer; A:Mang):Integer; Var i:Integer;
Begin I:=1;
While (I <= N) and (X<>A[I]) I:=I+1; If I <= N Then Timkiem:=I Else Timkiem:=0; End;
Begin
{Nhập mảng}
Write(‘Nhap N=’); Readln(N); For i:=1 To N Do
Begin
Write(‘A[‘,i,’]=’); Readln(A[i]); End;
Write(‘Nhap X=’); Readln(x); {Kết tìm kiếm}
If TimKiem(X,N,A)<>0 Then
Writeln(‘Vi tri cua X mang la:’, TimKiem(X,N,A)) Else Writeln(‘X khong co mang.’);
Readln; End
Bài tập 2: Giả sử mảng A xếp theo thứ tự tăng dần Viết hàm để kiểm tra xem phần tử X có mảng A hay khơng?
Ý tưởng:
So sánh x với phần tử mảng A[giua] Nếu x=A[giua] dừng (vị trí cần tìm số phần tử mảng) Ngược lại, x>A[giua] tìm đoạn sau mảng [giua+1,cuoi], ngược lại tìm đoạn đầu mảng [dau,giua-1]
Bài tập 3: Cho mảng số nguyên gồm n phần tử Tìm dãy gồm m phần tử (mn) cho dãy có tổng lớn (Dãy dãy phần tử liên tiếp mảng)
Program Bai3; Uses Crt;
Type Mang=ARRAY[1 50] Of Integer; Var A:Mang;
n,m,i,j,k:Byte; S,Max:Integer; Begin
(32)Begin
Write('a[',i,']='); Readln(a[i]); End;
Write('Nhap so phan tu cua day con: m= '); Readln(m); k:=1; {Vị trí phần tử dãy con}
{Giả sử m phần tử mảng A dãy có tổng lớn nhất} Max:=0;
For i:=1 To m Do Max:=Max+A[i]; {Tìm dãy khác}
For i:=2 To n-m+1 Do Begin
{Tính tổng dãy thứ i} S:=0;
For j:=i To i+m-1 Do S:=S+A[j];
If S>Max Then {Nếu dãy tìm có tổng lớn dãy trước} Begin
Max:=S; {Thay tổng mới}
k:=i; {Thay vị trí dãy mới} End;
End;
Writeln('Day co tong lon nhat la:'); For i:=k To k+m-1 Do Write(A[i]:5); Readln;
End. Bài 4:
Nhập n số thực từ bàn phím vào mảng, tính trung bình cộng số Program Bai4;
Uses CRT; Var i,n : Integer; s : Real;
a : Array[1 100] of Real; Begin
ClrScr;
Write( ‘ Ban muon nhap bao nhieu PT cho mang : ‘ ); Readln(n);
For i := to n Begin
Write( ‘ PT A[ ‘ , i , ‘ ]= ’ ); Readln(a[i]);
End; s := 0;
For i := to n s := s + a[i];
(33)Readln; End
3.CŨNG CỐ: Nhận xét thực hành 4.HƯỚNG DẪN DẶN DÒ
5.1 Viết chương trình nhập vào dãy n số a[1], a[2], , a[n] in màn hình thơng tin sau:
- Tổng phần tử dãy
- Số lượng số dương tổng số dương dãy - Số lượng số âm tổng số âm dãy
- Trung bình cộng dãy
5.2 Viết chương trình nhập vào dãy n số a[1], a[2], , a[n] in màn hình thơng tin sau:
- Số hạng dương lớn dãy số (vị trí) - Số hạng dương nhỏ dãy số (vị trí) - Số hạng âm lớn dãy số (vị trí) - Số hạng âm nhỏ dãy số (vị trí)
******************************************************
******************************************************
Ngày soạn: 30/11/2008 Ngày dạy:3/12/2008
Tiết 31-32-33: MẢNG MỘT CHIỀU
1.Kiến thức: Học sinh nắm cách viết liệu dạng mảng chiều, làm toán mảng chiều
2.Kỹ năng:Có kỹ phân tích tốn, viết câu lệnh xác
3.Thái độ: Học sinh tích cực, tự giác, hứng thú giải toán mảng B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Giáo án, phấn màu vẽ sơ đồ
HS: Ôn tập câu lệnh D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2.Kiểm tra cũ:
(34)1
1
1
1 3
1
Ý tưởng:
Tam giác Pascal tạo theo qui luật sau: + Mỗi dòng bắt đầu kết thúc số
+ Phần tử thứ j dòng k nhận cách cộng phần tử thứ j-1 j dòng thứ k-1
Program Bai1; Uses Crt;
Var Dong:Array[0 20] Of Byte; n,i,j:Byte;
Begin
Write('n= '); Readln(n); Clrscr;
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 Do Begin
Dong[j]:=Dong[j-1]+Dong[j]; Write(Dong[j]:4);
End;
Writeln(Dong[i]:4); End;
Readln; End.
Bài tập 2: Viết chương trình nhập vào mảng số nguyên A, B đại diện cho tập hợp (khơng thể có phần tử trùng tập hợp) Trong trình nhập, phải kiểm tra: phần tử vừa nhập vào có mảng khơng bổ sung vào mảng In hình phần tử giao tập hợp A, B
Ý tưởng:
Duyệt qua tất phần tử aiA Nếu aiB viết hình Program Bai2;
Uses Crt;
(35)Var A,B:Mang; n,m:Byte;
Function KiemTra(x:Integer; n:Byte; A:Mang):Boolean; Var i:Byte; Found:Boolean;
Begin
Kiemtra:=False; i:=1;
While (i<=n) AND (not Found) Do
If x=A[i] Then Found:=True Else i:=i+1; KiemTra:=Found;
End;
Procedure NhapMang(Var n:Byte; Var A:Mang); Var ch:Char;
x:Integer; Begin
n:=0; Repeat
Write('x='); Readln(x);
If not KiemTra(x,n,A) Then Begin
n:=n+1; A[n]:=x; End;
Writeln('An ESC de ket thuc nhap!'); ch:=Readkey;
Until ch=#27; End;
Procedure GiaoAB(n:Byte; A:Mang;m:Byte; B:Mang); Var i:Byte;
Begin
For i:=1 To n Do
If KiemTra(A[i],m,B) Then Write(A[i]:4); End;
Begin Clrscr;
Writeln('Nhap mang A: '); NhapMang(n,A);
Writeln('Nhap mang B: '); NhapMang(m,B);
Writeln('Giao cua mang A&B la: '); GiaoAB(n,A,m,B);
Readln; End.
Bài tập 3: Nhập vào mảng số nguyên a/ Xếp lại mảng theo thứ tự giảm dần
b/ Nhập vào số nguyên từ bàn phím Chèn số vào mảng cho mảng có thứ tự giảm dần (khơng xếp lại mảng)
(36)- Tìm vị trí cần chèn: i
- Đẩy phần tử từ vị trí i tới n sang phải vị trí - Gán: A[i]=x;
4 CŨNG CỐ: Học sinh nhắc lại thuật toán xếp dãy tăng dần 5 HƯỚNG DẪN, DẶN DÒ
Bài tập 1: Cho mảng số nguyên: Mảng A có m phần tử, mảng B có n phần tử a/ Sắp xếp lại mảng theo thứ tự giảm dần
b/ Trộn mảng lại thành mảng C cho mảng C có thứ tự giảm dần (Khơng xếp lại mảng C)
Gợi ý:
- Dùng số i,j để duyệt qua phần tử mảng A, B k số cho mảng C
- Trong (i<=m) (j<=n) thì:
{Tức đồng thời dãy A, B chưa duyệt hết} + Nếu A[i]>B[j] thì: C[k]:=A[i]; i:=i+1;
+ Ngược lại: C[k]:=B[j]; j:=j+1;
- Nếu dãy hết trước đem phần cịn lại dãy bổ sung vào cuối dãy C
Bài tập 2: Viết chương trình nhập vào dãy số nguyên a1, a2, , an Tìm dãy {a} dãy tăng dần dài (có số phần tử lớn nhất) in hình dãy
***************************************************************
***************************************************************
Ngày soạn: 30/11/2008 Ngày dạy:6/12/2008
Tiết 34-35-36: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng kiến thức học làm toán mảng chiều
2.Kỹ năng: Có kỹ thực hành máy nhanh, xác 3.Thái độ: Học sinh tích cực, tự giác, hứng thú thực hành B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRỊ GV: Bài tập, phịng máy
(37)2 Thực hành
Bài tập 1: Cho mảng số nguyên: Mảng A có m phần tử, mảng B có n phần tử a/ Sắp xếp lại mảng theo thứ tự giảm dần
b/ Trộn mảng lại thành mảng C cho mảng C có thứ tự giảm dần (Khơng xếp lại mảng C)
Gợi ý:
- Dùng số i,j để duyệt qua phần tử mảng A, B k số cho mảng C
- Trong (i<=m) (j<=n) thì:
{Tức đồng thời dãy A, B chưa duyệt hết} + Nếu A[i]>B[j] thì: C[k]:=A[i]; i:=i+1;
+ Ngược lại: C[k]:=B[j]; j:=j+1;
- Nếu dãy hết trước đem phần cịn lại dãy bổ sung vào cuối dãy C
Bài tập 2: Viết chương trình nhập vào dãy số nguyên a1, a2, , an Tìm dãy {a} dãy tăng dần dài (có số phần tử lớn nhất) in hình dãy
Bài 3:Hãy nghiên cứu quy luật tạo bảng số sau lập chương trình để in bảng số Cho biết số phần tử N dòng phần tử dịng đựợc nhập từ bàn phím
1 12 -2 -4
21 13 -13 -6 11 17 10 Bài 3:
Program Inbang;
Var A:Array [1 16] of integer; N,I,p,q;Integer;
BEGIN Repeat
Write(‘Cho biet hang dau co may so’); Readln(N);
Until N<=16; For i:=1 to N Begin
Write(‘A[‘,i,’]=’); Readln(A[i]); End;
(38)While N>0 Begin
For i:=1 to N Begin
Gotoxy(p+6*i,q); Write(A[i]:6);
If i<N then A[i]:=A[i+1]-A[i]; End;
Writeln;
n:=n-1; q:=q+1; p:=p+3; end;
Readln; END
4.CŨNG CỐ: Nhận xét giừo thực hành 5 HƯỚNG DẪN DẶN DÒ
Bài 1: Dãy số Fibonaci dãy số
1 13 21
được xác định sau: a1=a2 =1 An = an-1+an-2 với n>=3
Lập chương trình tìm in số Fibonaci nhỏ số K cho trước
Bài 2: Viết chương trình nhập vào mảng a gồm 10 phần tử nguyên, sau đó, nhập giá trị x Tìm mảng a có phần tử có giá trị với x hiển thị lên hình vị trí mảng a
*********************************************************
Ngày soạn: 6/9/2008 Ngày dạy:10/9/2008
Tiết 37-38-39: MẢNG HAI CHIỀU
(39)2.Kỹ năng:Có kỹ phân tích tốn, viết câu lệnh xác
3.Thái độ: Học sinh tích cực, tự giác, hứng thú giải toán mảng B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Giáo án, phấn màu vẽ sơ đồ
HS: Ôn tập câu lệnh D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2.Kiểm tra cũ:
Phần chủ yếu trình bày mảng hai chiều Các mảng nhiều hai chiều suy diễn cách tự nhiên Việc khai báo mảng hai chiều giống mảng chiều, có điều khác có hai tập số viết cách dấu ‘,’
Ví dụ:
Type Mang1 = Array[1 30, 50] of Integer; Mang2 = Array[1 3, 2] of Real;
Var A : Mang1; B : Mang2;
Trong đó, số phần tử mảng số thực B x = (phần tử), đặt nhớ theo thứ tự 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 gọi ma trận Trong ví dụ trên, B ma trận cấp 3 × Trong mảng hai chiều, số sau truy cập nhanh số trước Để truy cập đến phần tử hàng thứ i, cột thứ j mảng hai chiều B ta dùng cách viết: B[ i ][ j ] B[ i , j ]
Ví dụ: Nhập ma trận m hàng, n cột từ bàn phím Tính in hình tổng cột tổng hàng
Const mMax = 30, nMax = 30;
Type Mang = Array[1 mMax, nMax] of Real; Var n, m, i, j : Integer;
sum : Real; a : Mang;
Begin
Write( ‘ Ban muon nhap ma tran bao nhieu hang va cot ? ‘ ); Readln( m, n );
For i := to m For j := to n
Begin
Write( ' PT thu [ ' , i , ' , ‘ , j, ‘ ] = ' ); Readln( a[ i, j ] );
End;
For j := to n Begin
sum := 0;
(40)Sum := sum + a[ i, j ];
Write( ‘ Tong cot ‘ , j ,’ = ‘ , sum : : ); End;
For i := to m Begin
sum := 0;
For j := to n
Sum := sum + a[ i, j ];
Write( ‘ Tong hang ‘ , i ,’ = ‘ , sum : : ); End;
Readln; End
Bài tập 5.6: Viết chương trình tìm ma trận chuyển vị ma trận A Ý tưởng:
Dùng mảng chiều để lưu trữ ma trận Gọi B ma trận chuyển vị ma trận A, ta có: Bij = Aji
Uses Crt;
Type Mang = ARRAY[1 10,1 10] Of Integer; Var A,B:Mang;
m,n,i,j:Integer; Begin
{Nhập ma trận}
Write(‘Nhap số dòng m=’); Readln(m); Write(‘Nhap số cột n=’); Readln(n); For i:=1 To m Do
For j:=1 To n Do Begin
Write(‘A[‘,i,j,’]=’); Readln(A[i,j]); End;
{Tìm ma trận chuyển vị} For i:=1 To m Do
For j:=1 To n Do B[i,j]:=A[j,i]; {In ma trận chuyển vị hình} For i:=1 To m Do
Begin
For j:=1 To n Do Write(B[i,j]:5); Writeln;
End; Readln; End
(41)a/ Đếm số lần xuất x A vị trí chúng b/ Tính tổng phần tử lớn dòng
Uses Crt;
Type Mang = ARRAY[1 10,1 10] Of Integer; Var A:Mang;
m,n,i,j,x,dem,S,max:Integer; Begin
{Nhập ma trận}
Write(‘Nhap số dòng m=’); Readln(m); Write(‘Nhap số cột n=’); Readln(n); For i:=1 To m Do
For j:=1 To n Do Begin
Write(‘A[‘,i,j,’]=’); Readln(A[i,j]); End;
{Nhập x}
Write(‘Nhap x=’); Readln(x);
{Đếm số lãn xuất x vị trí x} dem:=0;
Writeln(‘Vi tri cua x mang A: ‘); For i:=1 To m Do
For j:=1 To n Do If x=A[i,j] Then
Begin
Write(i,j,’ ; ‘); dem:=dem+1; End;
Writeln(‘So lan xuat hien cua x mang A la: ‘,dem); {Tính tổng phần tử lớn dòng}
S:=0;
For i:=1 To m Do {duyệt qua dịng} Begin
{Tìm phần tử lớn dòng thứ i} Max:=A[i,1];
For j:=2 To n Do {duyệt phần tử dòng thứ i} If max<A[i,j] Then max:=A[i,j];
{Cộng max vào biến S} S:=S+max;
End;
(42)Readln; End
4.CŨNG CỐ: Hãy nêu ý nghĩa việc dùng hai vòng for lồng nhau, Để xét tổng hàng lớn ta cần tính tổng hàng só sánh tổng với 5 HƯỚNG DẪN DẶN DÒ
Bài tập 1: Viết chương trình nhập vào số tự nhiên N (N lẻ), sau điền số từ đến n2 vào bảng vuông cho tổng hàng ngang, hàng dọc và đường chéo (bảng gọi Ma phương)
Ví dụ: Với N=3 N=5 ta có
Bắc
2 16 22 15
9 20 21 14
4 Tâ
y
7 25 13 19 Đông 24 12 18
11 17 10 23 Nam
************************************************************** Tiết 40-41-42: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng kiến thức học làm toán mảng hai chiều
2.Kỹ năng: Có kỹ thực hành máy nhanh, xác 3.Thái độ: Học sinh tích cực, tự giác, hứng thú thực hành B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Bài tập, phòng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Thực hành
Bài tập 1: Viết chương trình nhập vào số tự nhiên N (N lẻ), sau điền số từ đến n2 vào bảng vuông cho tổng hàng ngang, hàng dọc 2 đường chéo (bảng gọi Ma phương)
Ví dụ: Với N=3 N=5 ta có
Bắc
2 16 22 15
9 20 21 14
4 Tâ
y
7 25 13 19 Đông 24 12 18
11 17 10 23 Nam
(43)Xuất phát từ ô bên phải ô nằm Đi theo hướng đông bắc để điền số 1, 2,
Khi điền số, cần ý số nguyên tắc sau:
- Nếu vượt phía ngồi bên phải bảng quay trở lại cột
- Nếu vượt phía ngồi bên bảng quay trở lại dòng cuối
- Nếu số điền k chia hết cho N số viết hàng với k cách phía bên phải
Uses Crt;
Var A:Array[1 20,1 20] Of Word; n,i,j,k:Word;
Begin
Write('Nhap N= '); Readln(n); Clrscr;
{Định vị ô xuất phát} i:=n DIV + 1; j:=n DIV + 2;
{Điền số k từ đến n*n} For k:=1 To n*n Do
Begin A[i,j]:=k;
If k MOD n=0 Then j:=j+2 Else Begin
{Đi theo hướng đông bắc} j:=j+1; i:=i-1;
End;
If j>n Then j:=j MOD n; If i=0 Then i:=n;
End;
{In kết hình} For i:=1 To n Do
Begin
For j:=1 To n Do write(a[i,j]:4); Writeln;
End; Readln; End
Bài tập 2: Cho mảng chiều A cấp mxn Viết chương trình xếp lại mảng A theo yêu cầu sau:
a/ Các phần tử dòng xếp theo thứ tự giảm dần
(44)Bài Nhập ma trận m hàng, n cột từ bàn phím Tính in hình tổng cột tổng hàng
Const mMax = 30, nMax = 30;
Type Mang = Array[1 mMax, nMax] of Real; Var n, m, i, j : Integer;
sum : Real; a : Mang;
Begin
Write( ‘ Ban muon nhap ma tran bao nhieu hang va cot ? ‘ ); Readln( m, n );
For i := to m For j := to n
Begin
Write( ' PT thu [ ' , i , ' , ‘ , j, ‘ ] = ' ); Readln( a[ i, j ] );
End;
For j := to n Begin
sum := 0;
For i := to m Sum := sum + a[ i, j ];
Write( ‘ Tong cot ‘ , j ,’ = ‘ , sum : : ); End;
For i := to m Begin
sum := 0;
For j := to n
Sum := sum + a[ i, j ];
Write( ‘ Tong hang ‘ , i ,’ = ‘ , sum : : ); End;
Readln; End
4 Cho mảng số nguyên: Mảng A có m phần tử, mảng B có n phần tử. a/ Sắp xếp lại mảng theo thứ tự giảm dần
b/ Trộn mảng lại thành mảng C cho mảng C có thứ tự giảm dần (Không xếp lại mảng C)
Gợi ý:- Dùng số i,j để duyệt qua phần tử mảng A, B k số cho mảng C
- Trong (i<=m) (j<=n) thì:
{Tức đồng thời dãy A, B chưa duyệt hết}
+ Nếu A[i]>B[j] thì: C[k]:=A[i]; i:=i+1; + Ngược lại: C[k]:=B[j]; j:=j+1;
- Nếu dãy hết trước đem phần lại dãy bổ sung vào cuối dãy C
IV CŨNG CỐ: Nhận xét thực hành
(45)1 Cho mảng chiều A cấp m x n gồm số nguyên số nguyên x. Viết chương trình thực công việc sau:
a/ Đếm số lần xuất x A vị trí chúng b/ Tính tổng phần tử lớn dòng
*************************************************************** Tiết 43-44-45: MẢNG HAI CHIỀU
1.Kiến thức: Học sinh nắm cách viết liệu dạng mảng hai chiều, làm tốn mảng hai chiều
2.Kỹ năng:Có kỹ phân tích tốn, chuyển mảng hai chiều sang mảng chiều ngược lại
3.Thái độ: Học sinh tích cực, tự giác, hứng thú giải tốn mảng B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Giáo án, phấn màu vẽ sơ đồ
HS: Ôn tập câu lệnh D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2.Kiểm tra cũ:
1.Tìm phần tử lớn nhất, nhỏ mảng chiều :
“ mảng chiều, tìm phân tử lớn nhất, nhỏ nhất”
Khơng có cần phải nói nhiều cơng việc đơn giản này, ta cho A[1,1] MAX MIN dùng vòng lặp FOR duyệt tất phần tử mảng để tìm phần tử lớn MAX nhỏ MIN , tìm gán lại trị cho MAX cho MIN
Program
Tim_phan_tu_lon_nhat_nho_nhat_cua_mang_2_chie u;
USES CRT; Const
DIM=10; TYPE
Mang2=Array[1 dim,1 dim] of Integer; VAR
m,n,i,j:Integer; A:Mang2;
dong,cot:Integer;
{*****************************} Function Tim_Min(Var
A:Mang2;m,n:Integer):Integer; VAR
i,j,temp:Integer; Begin
(46)If A[i,j]<Temp Then begin Temp:=A[i,j];
dong:=i; cot:=j; End;
Tim_Min:=Temp; End;
{*****************************} Function Tim_Max(Var
A:Mang2;m,n:Integer):Integer; VAR
i,j,temp:Integer; Begin
Temp:=A[1,1]; For i:=1 To M Do For j:=1 To n Do
If A[i,j]>Temp Then begin Temp:=A[i,j];
dong:=i; cot:=j; End;
Tim_Max:=Temp; End;
{*****************************} BEGIN
ClrScr; Randomize;
Write('So dong: ');Readln(m); Write('So cot: ');Readln(n); For i:=1 To M Do
For j:=1 To n Do
A[i,j]:=(Random(100)-Random(100));
For i:=1 To M Do begin For j:=1 To n Do Write(A[i,j]:4); Writeln;
End; Writeln;
Writeln('PHAN TU NHO NHAT:= ',TIM_MIN(A,m,n));
Writeln('Tai vi tri Dong ',dong:2,' , cot ',cot:2);
Writeln;
Writeln('PHAN TU LON NHAT:= ',TIM_MAX(A,m,n));
(47)READLN; END
Bạn giải lại toán cho biết vị trí tìm phần tử Max Min
1.Tìm Max, dòng cột :
Cơng việc phức tạp chút, với mảng cho : TYPE
ARRAY2 = ARRAY[1 Dim,1 Dim] of Integer; VAR
MANG:Array2;
Tại dòng, ta phải tìm phần tử lớn nhất, nhỏ với cột
Để giải vấn đề, ta phải khai báo thêm mảng chiều để lưu trữ phần tử MAX[cột i], MAX[dòng i], Min[cột i], MIN[dịng i], cơng việc tìm dịng cột độc lập nên ta cần dùng mảng chiều MAX MIN chẳng hạn để tiết kiệm nhớ, để tiết kiệm nhớ nhất, ta cần mảng chiều để lưu giữ liệu mà thôi.
Với khai báo :
MA: Array[1 Dim*Dim] of Integer
Đầu tiên ta gán MANG[1,i] Max (sau Min) duyệt tất phần tử dòng i để tìm Max (và Min) dịng ấy, liệu tìm gán cho trị MA[i]
Tương tự ta gán Max hay Min trị MANG[1,i] duyệt tất phần tử cột [i] để tìm
Tồn văn chương trình sau:
Program Tim_Max_va_Min_cua_dong_cot; USES Crt;
Const
DIM=10; TYPE
ARRAY2 = ARRAY[1 Dim,1 Dim] of Integer; ARRAY1 = ARRAY[1 Dim] of Integer;
VAR
MANG:Array2; MA:Array1;
i,j,m,n,t:Integer;
{ -}
Procedure PHATSINH(VAR A:ARRAY2;m,n:Integer); Begin
For i:=1 To m Do Begin For j:=1 To n Do
(48)End; End;
{ -}
Procedure HIENTHI(VAR A:ARRAY2;m,n:Integer); Begin
For i:=1 To m Do Begin For j:=1 To n Do Write(A[i,j]:4); Writeln;
End; End;
{ -} PROCEDURE Dong;
Begin Writeln;
For i:=1 To m Do Begin Ma[i]:=MANG[i,1];
For j:=2 To n Do Begin
If MANG[i,j]>Ma[i] Then Ma[i]:=MANG[i,j]; End;
Writeln('Max dong ',i,' la: ',Ma[i]); End;
Writeln;
For i:=1 To m Do Begin Ma[i]:=MANG[i,1];
For j:=2 To n Do Begin
If MANG[i,j]<Ma[i] Then Ma[i]:=MANG[i,j]; End;
Writeln(' Min dong ',i,' la: ',Ma[i]);
End; End;
{ -} PROCEDURE COT;
Begin Writeln;
For j:=1 To m Do Begin Ma[j]:=MANG[1,j];
For i:=2 To n Do Begin
If MANG[i,j]>Ma[j] Then Ma[j]:=MANG[i,j]; End;
Writeln('Max cot ',j,' la: ',Ma[j]); End;
(49)For j:=1 To m Do Begin Ma[j]:=MANG[1,j];
For i:=2 To n Do Begin
If MANG[i,j]<Ma[j] Then Ma[j]:=MANG[i,j]; End;
Writeln(' Min cot ',j,' la: ',Ma[j]);
End; End;
{ -} BEGIN
Randomize; ClrScr;
Write('So dong, m= '); Readln(m); Write('So cot, n= '); Readln(n); PHATSINH(MANG,m,n);
Clrscr;
Writeln('Mang chieu da cho:'); HIENTHI(MANG,m,n);
DONG; Readln; ClrScr;
Writeln('Mang chieu da cho:'); HIENTHI(MANG,m,n);
COT; Readln; END
IV CŨNG CỐ: Để tìm min, max dịng cột, ta cần xây dựng thủ tục tìn min, max, cần duyệt phần tử so sánh với max,
V HƯỚNG DẪN, DẶN DÒ
2: Viết chương trình để kiểm tra dãy số nguyên nhập vào từ bàn phím theo thứ tự tăng dần hay chưa
Gợi ý: - Nếu dãy có phần tử dãy tăng dần - Ngược lại:
+ Nếu A[n-1]>A[n] dãy không tăng dần
+ Ngược lại: Gọi đệ qui với dãy có n-1 phần tử (bỏ bớt phần tử cuối cùng)
********************************************************
Tiết 46-47-48: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng kiến thức học làm toán mảng hai chiều
2.Kỹ năng: Có kỹ thực hành máy nhanh, xác 3.Thái độ: Học sinh tích cực, tự giác, hứng thú thực hành B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
(50)GV: Bài tập, phòng máy HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Thực hành
1.
Biến mảng chiều thành mảng chieàu :
Ta phải biến mảng chiều m dịng, n cột thành mảng chiều có số phần tử m*n cách điền giá trị mảng chiều từ trái qua phải, từ xuống vào phần tử mảng chiều
Vấn đề tưởng chừng khó khăn đằng, biến t mảng chiều phải tăng liên tục từ đến m*n dòng i, cột j phải thay đổi giá trị sau hết dòng,
Thí dụ :
Mảng chiều :
a b c d e
f g h i j
k l Tại dòng, biến đếm i chạy từ đếm m Trong ta cần biến thành mảng chiều:
a b c d e f g h i j
Biến đếm t lại chạy từ đến mxn Nhưng thật ra, khơng có phức tạp để hiểu thuật tốn sau:
t:=1;
For i:=1 To m Do Begin
For j:=1 To n Do Begin
If t<=m*n Then B[t]:=A[i,j]; t:=t+1; End;
End;
Tìm thuật tốn cho cơng việc cần thiết cho việc giải tốn phức tạp sau
Bạn cố gắng làm thử, có khó khăn đành phải nghiên cứu tồn văn chương trình sau:
Program Mang_2_thanh_Mang_1; USES Crt;
Const
(51)ARRAY2 = ARRAY[1 Dim,1 Dim] of Integer; ARRAY1 = ARRAY[1 Dim*Dim] of Integer; VAR
M1: Array1; M2:Array2;
i,j,m,n,t:Integer;
{ -}
Procedure PHATSINH(VAR A:ARRAY2;m,n:Integer); Begin
For i:=1 To m Do Begin For j:=1 To n Do
M2[i,j]:=Random(100); End;
End;
{ -}
Procedure HIENTHI2(VAR A:ARRAY2;m,n:Integer); Begin
For i:=1 To m Do Begin For j:=1 To n Do
Write(M2[i,j]:4); Writeln;
End; End;
{ -} Procedure BIENDOI(VAR A:ARRAY2;VAR B:ARRAY1;m,n,t:Integer);
Begin t:=1;
For i:=1 To m Do Begin
For j:=1 To n Do Begin
If t<=m*n Then B[t]:=A[i,j]; t:=t+1; End;
End; End;
{ -}
Procedure HIENTHI1(VAR A:ARRAY1;t:Integer); Begin
For t:=1 To m*n Do Write(A[t]:4); Writeln;
End;
{ -} BEGIN
Randomize; ClrScr;
(52)Writeln('Mang chieu da cho:'); HIENTHI2(M2,m,n);
BIENDOI(M2,M1,m,n,t);
Writeln('Bien Mang chieu:'); HIENTHI1(M1,t);
Readln; END
Bạn tự nghiên cứu toán ngược lại: Cho mảng chiều gồm t phần tử, giả sử ta tìm số m,n cho t=m*n, biến mảng cho thành mảng chiều có m dịng n cột n dòng, m cột theo thứ tự từ trái qua phải từ xuống dưới.
1.Viết chương trình xếp phần tử ma trận vuông A[n,n] (với n=2k+1) cho tổng dòng, cột đường chéo (Bài toán ma phương)
IV CŨNG CỐ: Nhận xét thực hành
V HƯỚNG DẪN, DẶN DỊ
1 Viết chương trình xếp phần tử ma trận vuông A[n,n] cho phần tử tăng dần theo dường zigzag hình vẽ:
************************************************
Tiết 49-50-51: MỘT SỐ THUẬT TOÁN MẢNG HAI CHIỀU 1.Kiến thức: Học sinh nắm đựoc số thuật toán mảng hai chiều
2.Kỹ năng:Có kỹ phân tích tốn, giải đuwocj dạng toán mảng hai chiều
3.Thái độ: Học sinh tích cực, tự giác, hứng thú giải toán mảng B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Giáo án, phấn màu vẽ sơ đồ
HS: Ôn tập câu lệnh D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
4 Bài toán “bung” mảng chiều: Vấn đề toán :
“Cho mảng chiều m*n phần tử, “bung” mảng 4 phía để tạo thành mảng chiều có m+2*n+2 phần tử”
Trước bung:
A B C D
(53)H I J K
L M N O
Sau bung :
* * * * * *
* A B C D *
* D E F G *
* H I J K *
* L M N O *
* * * * * *
Cứ cho ta có quyền điền số vào phần tử “bung”, cịn giải rõ ràng ta diều phần tử “bung” với số thỏa mãn điều kiện
Trước hết mảng cho có m dịng (từ dịng đến dịng m) mảng có m+2 dòng (từ dòng đến dòng m+1) , tương tự với n cột mảng cho (từ cột đến cột n) mảng phải có n+2 cột từ cột đến cột n+1
Thuật toán “bung ra” diễn tả sau:
For i:=0 To n+1 Do Begin
A[0,i] := Random(100); A[m+1,i] := Random(100); End;
For i:=1 To m Do Begin
A[i,0] := Random(100); A[i,n+1] := Random(100); End;
Với thuật tốn trên, ta có chương trình sau: Program Mo_rong_mang_2_chieu; USES CRT;
Const
DIM=10; TYPE
Mang2=Array[0 DIM+1,0 DIM+1] of Integer;
VAR
m,n,i,j,Res:Integer; A:Mang2;
{*****************************}
PROCEDURE PHATSINH(var A:Mang2;m,n:Integer); Begin
(54)For j:=1 To n Do
A[i,j]:=(Random(100)-Random(100));
End;
{*****************************}
PROCEDURE HIENTHI(var A:Mang2;m,n:Integer); Begin
For i:=1 To M Do begin For j:=1 To n Do Write(A[i,j]:4); Writeln;
End; End;
{*****************************} BEGIN
ClrScr; Randomize;
Write('So dong: ');Readln(m); Write('So cot: ');Readln(n); PHATSINH(A,m,n);
HIENTHI(A,m,n); {Mo rong ma tran}
For i:=0 To n+1 Do Begin A[0,i] := Random(100); A[m+1,i] := Random(100); End;
For i:=1 To m Do Begin
A[i,0] := Random(100); A[i,n+1] := Random(100); End;
Writeln;
For i:=0 To M+1 Do begin For j:=0 To n+1 Do Write(A[i,j]:6); Writeln;
End; READLN; END
Các bạn tự viết chương trình “bung” ma trận và điền vào vị trí phần tử theo thứ tự từ trái sang phải, từ trên xuống 1,2,3
5 Tìm “Điểm cực tiểu” mảng chiều:
Một phần tử gọi điểm cực tiểu mảng chiều A[m,n] khơng lớn phần tử kề
(55) Trước hết, phần tử gọi kề phần tử chúng cạnh
nhau mảng (trên, dưới, trái, phải, trái, phải, trái, phải)
Số phần tử kề với phần tử mảng chiều phụ
thuộc vào vị trí mảng
+ Mỗi phần tử không nằm cạnh mảng chiều có phân tử kề (F,G,J,K)
+ Phần tử nằm góc (A,D,M,Q) có phần tử kề + Phần tử nằm biên mà khơng góc (B,C,E,I,H,L,O,P có phần tử kề
A B C D E
F G H I J
K L M N O
P Q R S T
Ý tưởng 1:
Ta qui tốn tìm phần tử nhỏ ma trận 3x3 tạo bới A[i,j] phần tử kề (bài tốn 1), rồi so sánh với A[i,j] Phương pháp đơn giản thời gian thực lâu
Ý tưởng :
Với phần tử A[i,j], ta xét phần tử kề nó, có phần tử kề A[i,j] mà nhỏ A[i,j] A[i,j] khơng phải điểm cực tiểu, tiến hành phương pháp này, ta phải lưu ý xét A[i,j] trường hợp (tại góc, biên khơng nằm cạnh), việc phải phân nhiều trường hợp làm cho tốn trở nên dài dịng, phức tạp
Ý tưởng 3:
Áp dụng thuật toán ý tưởng 2, kèm theo thuật toán nhỏ “bung” ma trận phía (bài tốn 4) gán giá trị cho phần tử dược “bung” giá trị lớn miền giá trị có phần tử mảng (Do khai báo Array of Integer nên ta cho chúng MaxInt) để mảng sau:
* * * * * * *
* A B C D E *
* F G H I J *
* K L M N O *
* P Q R S T *
* * * * * * *
(56)Cuối áp dụng thuật toán ý tưởng cho mảng mà không cần phân biệt trường hợp Các bạn theo dõi kỹ Function Tim_cuc_tieu chương trình đề nghị sau:
{*****************************}
IV.CŨNG CỐ: Hãy nêu nội dung thuật toán bung mảng hai chiều, từ tốn bung mảng hai chiều ta thực làm toán nào?
V HƯỚNG DẪN, DẶN DÒ
1.Một phần tử gọi điểm cực tiểu mảng chiều A[m,n] khơng lớn phần tử kề Viết chương trình tìm điểm cực tiểu mảng hai chiều
****************************************************** Tiết 52-53-54: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng kiến thức học làm toán mảng hai chiều
2.Kỹ năng: Có kỹ thực hành máy nhanh, xác, phân tích dạng toán mảng hai chiều để tính tốn
3.Thái độ: Học sinh tích cực, tự giác, hứng thú thực hành B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRỊ GV: Bài tập, phịng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Thực hành
1.Một phần tử gọi điểm cực tiểu mảng chiều A[m,n] khơng lớn phần tử kề Viết chương trình tìm điểm cực tiểu mảng hai chiều
Program Tim_Cac_diem_cuc_tieu; USES CRT;
Const
DIM=10; TYPE
Mang2=Array[0 DIM+1,0 DIM+1] of Integer;
VAR
m,n,i,j,Res:Integer; A:Mang2;
{*****************************}
Function Tim_cuc_tieu(i,j:Integer):Boolean; VAR
K,L:Integer; B:Boolean; Begin
B:=TRUE; K:=i-1;
(57)L:=j-1;
WHILE B And (L<=j+1) Do Begin If A[K,L]<A[i,j] Then B:=FALSE;
Inc(L); End;
Inc(K); End;
Tim_cuc_tieu:=B; End;
{*****************************}
PROCEDURE PHATSINH(var A:Mang2;m,n:Integer); Begin
For i:=1 To M Do For j:=1 To n Do
A[i,j]:=(Random(100)-Random(100));
End;
{*****************************}
PROCEDURE HIENTHI(var A:Mang2;m,n:Integer); Begin
For i:=1 To M Do begin For j:=1 To n Do Write(A[i,j]:4); Writeln;
End; End;
{*****************************} BEGIN
ClrScr; Randomize;
Write('So dong: ');Readln(m); Write('So cot: ');Readln(n); PHATSINH(A,m,n);
HIENTHI(A,m,n); {Mo rong ma tran}
For i:=0 To n+1 Do Begin A[0,i] := MaxInt; A[m+1,i] := MaxInt; End;
For i:=1 To m Do Begin A[i,0] := MaxInt; A[i,n+1] := MaxInt; End;
(58)End;
For i:=1 To m Do For j:=1 To n Do
If Tim_cuc_tieu(i,j) Then
Writeln('A[',i,',',j,'] la cuc tieu');
READLN; END
6 Tìm “phần tử yên ngựa” mảng chiều:
Phần tử A[i,j] gọi “yên ngựa” mảng chiều đồng thời phần tử nhỏ dòng i phần tử lớn cột j, A[i,j] phải phần tử lớn dòng i phần tử nhỏ cột j
Cách dễ ta khai báo mảng chiều để lưu trữ MinDong{i], MaxDong{i], MinCot[j], MaxCot{j] sau tìm n thuật tốn đơn giản sau
For i:=1 To M Do
For j:=1 To N Do Begin
If (MinDong[i]=MaxCot[j]) Or
(MaxDong[i]=MinCot[j]) Then Begin Writeln('Yen ',A[i,j]); End;
End;
Như giải sau đây: Program
Tim_cac_phan_tu_yen_ngua_cua_mang_2_chieu; USES CRT;
Const
DIM=10; TYPE
Mang2=Array[1 dim,1 dim] of Integer; VAR
m,n,i,j,Max,Min:Integer; A:Mang2;
MinCot,MaxCot,MinDong,MaxDong: Array[1 Dim] of Integer;
{*****************************}
Procedure PHATSINH(VAR A:Mang2;m,n:Integer); Begin
For i:=1 To M Do For j:=1 To n Do
A[i,j]:=(Random(100)-Random(100));
End;
{*****************************}
(59)Begin
For i:=1 To M Do begin For j:=1 To n Do Write(A[i,j]:4); Writeln;
End; End;
{*****************************} BEGIN
ClrScr; Randomize;
Write('So dong: ');Readln(m); Write('So cot: ');Readln(n); PHATSINH(A,m,n);
HIENTHI(A,m,n); {xac dinh Min cot}
For i:=1 To M Do Begin MinCot[i]:=A[1,i]; For j:=2 To N Do
If A[j,i]<MinCot[i] Then MinCot[i]:=A[j,i];
End; For i:=1 To n Do
Writeln('Min cot ',i,' la ',MinCot[i]); {xac dinh Max cot}
For i:=1 To M Do Begin MaxCot[i]:=A[1,i]; For j:=2 To N Do
If A[j,i]>MaxCot[i] Then MaxCot[i]:=A[j,i];
End; For i:=1 To n Do
Writeln(' Max cot ',i,' la ',MaxCot[i]); {xac dinh Min dong}
For i:=1 To N Do Begin MinDong[i]:=A[i,1]; For j:=2 To N Do
If A[i,j]<MinDong[i] Then MinDong[i]:=A[i,j];
End; For i:=1 To n Do
Writeln('Min dong ',i,' la ',MinDong[i]); {xac dinh Min dong}
(60)MaxDong[i]:=A[i,1]; For j:=2 To N Do
If A[i,j]>MaxDong[i] Then MaxDong[i]:=A[i,j];
End; For i:=1 To n Do
Writeln(' Max dong ',i,' la ',MaxDong[i]); {Bat dau xac dinh}
For i:=1 To M Do
For j:=1 To N Do Begin
If (MinDong[i]=MaxCot[j]) Or
(MaxDong[i]=MinCot[j]) Then Begin Writeln('Yen ',A[i,j]); End;
End; READLN; END
Bạn tự nghiên cứu cách giải toán với lời khai báo mảng chiều (xem lại toán số 5)
IV CŨNG CỐ: Nhận xét thực hành
V HƯỚNG DẪN, DẶN DỊ
1.Tìm tất phần tử A[i,j] > nằm phần tử <=0 ma trận vng A[n,n]
2.Tìm phần tử ma trận vuông MIN MAX phần tử nằm đường chéo
**********************************************************
Ngày soạn:28/12/2008 Ngày
dạy:31/12/2008
Tiết 55-56-57: MỘT SỐ THUẬT TOÁN MẢNG HAI CHIỀU 1.Kiến thức: Học sinh nắm số thuật toán mảng hai chiều 2.Kỹ năng:Có kỹ phân tích tốn, giải dạng toán mảng hai chiều
(61)B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp C CHUẨN BỊ CỦA THẦY VÀ TRÒ
GV: Giáo án, phấn màu vẽ sơ đồ HS: Ôn tập câu lệnh D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
Sắp xếp mảng chiều :
Trong mảng chiều, việc xếp thờng theo yêu cầu tăng giảm dần từ trái sang phải, mảng chiều, khái niệm xếp phải hiểu theo nghĩa rộng hơn, xếp nghĩa đặt phần tử vào mảng tuân theo qui luật
Phương pháp đơn giản thường dùng tạo mảng chiều từ phần tử mảng chiều cho (bài toán 3) sau xử lý mảng chiều này, ta gán chúng trở lại mảng chiều cho theo qui tắc tốn địi hỏi
a) Hãy xếp lại mảng chiều cho phần tử chúng có giá trị tăng dần từ trái sang phải, từ xuống dưới.
Program Sap_xep_mang_2_chieu; USES CRT;
Const
DIM=10;
MaxNum=1000; Step=5;
TYPE
Mang2=Array[1 DIM,1 DIM] of Integer; Mang1=Array[1 DIM*DIM] of Integer; VAR
m,n,i,j:Integer; A:Mang2;
B:Mang1;
{*****************************}
PROCEDURE NHAP(var A:Mang2;m,n:Integer); VAR
i,j,x,y:Integer; Begin
X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr;
GotoXY(X+((Step*n-15)Div 2),y-2);
Writeln('Nhap ma tran ',m,' dong ',n,' cot');
For i:=1 To m Do For j:=1 To n Do REPEAT
(62)Write('':Step);
GotoXY(X+(j-1)*Step,Y+i-1);
Readln(A[i,j]);
UNTIL (ABS(A[i,j])<MaxNum); End;
{*****************************}
PROCEDURE HIENTHI(var A:Mang2;m,n:Integer); VAR
i,j,x,y:Integer; Begin
X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr;
GotoXY(X+((Step*n-15) Div 2),Y-2); Write('Xuat ma tran');
For i:=1 To m Do
For j:=1 To n Do Begin
GotoXY(X+(j-1)*Step,Y+i-1); Write(A[i,j]:3);
End; End;
{*****************************} Procedure TAOMANG1CHIEU(VAR
A:Mang2;m,n:Integer;VAR B:Mang1); Var
i,j :Integer; Begin
For i:=1 To m Do For j:=1 To n Do
B[(i-1)*n+j]:=A[i,j]; End;
{*****************************}
Procedure SAPXEP(var B:Mang1;n:Integer); Var
i,j,Temp :Integer; Begin
For i:=1 To N Do
For j:=i+1 To N Do
If B[i]>B[j] Then Begin Temp:=B[i];
B[i]:=B[j]; B[j]:=Temp; End;
End;
{*****************************} BEGIN
(63)Randomize;
Write('So dong: ');Readln(m); Write('So cot: ');Readln(n); Nhap(A,m,n);
Readln;
HienThi(A,m,n); Readln;
TaoMang1Chieu(A,m,n,B); Sapxep(B,m*n);
For i:=1 To m Do For j:=1 To n Do
A[i,j]:=B[(i-1)*n+j]; Writeln('Mang da sap xep'); HienThi(A,m,n);
READLN; END
b) Hãy xếp lại ma trận vuông A[n,n] cho phần tử chúng có giá trị tăng dần theo đường xoắn ốc từ vào hình vẽ sau:
Xuất phát
Ý tưởng thuật giải :
Công việc phải biến ma trận cho A[n,n] thành
mảng chiều (như nghiên cứu toán 3)
Bước xếp mảng chiều vừa tạo lập Cuối điền mảng chiều trở lại vào ma trận vuông
đảm bảo phần tử điền vào theo hình xoắn ốc, ý : + Ở dịng cho cột tăng dần
+ Ởû cột N cho hàng tăng dần + Ở hàng N cột giảm dần
+ Ở cột dịng giảm dần
Chu trình kín ma trận cho (phần tử cuối mảng chiều = n x n)
Xin mời bạn “xem qua” chương trình sau, ý đến phần điền giá trị vào ma trận cuối
Program
Sap_xep_mang_2_chieu_theo_hinh_tron_oc; USES CRT;
Const
(64)MaxNum=1000; Step=5;
TYPE
Mang2=Array[1 DIM,1 DIM] of Integer; Mang1=Array[1 DIM*DIM] of Integer; VAR
i,j,n,L,k:Integer; Num,Dir:Integer; A:Mang2;
B:Mang1;
{*****************************}
PROCEDURE NHAP(var A:Mang2;m,n:Integer); VAR
i,j,x,y:Integer; Begin
X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr;
GotoXY(X+((Step*n-15)Div 2),y-2);
Writeln('Nhap ma tran ',m,' dong ',n,' cot');
For i:=1 To m Do For j:=1 To n Do REPEAT
GotoXY(X+(j-1)*Step,Y+i-1);
Write('':Step);
GotoXY(X+(j-1)*Step,Y+i-1);
Readln(A[i,j]);
UNTIL (ABS(A[i,j])<MaxNum); End;
{*****************************}
PROCEDURE HIENTHI(var A:Mang2;m,n:Integer); VAR
i,j,x,y:Integer; Begin
X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr;
GotoXY(X+((Step*n-15) Div 2),Y-2); Write('Xuat ma tran');
For i:=1 To m Do
For j:=1 To n Do Begin
GotoXY(X+(j-1)*Step,Y+i-1); Write(A[i,j]:3);
(65)End;
{*****************************} Procedure TAOMANG1CHIEU(VAR
A:Mang2;m,n:Integer;VAR B:Mang1); Var
i,j :Integer; Begin
For i:=1 To m Do For j:=1 To n Do
B[(i-1)*n+j]:=A[i,j]; End;
{*****************************}
Procedure SAPXEP(var B:Mang1;n:Integer); Var
i,j,Temp :Integer; Begin
For i:=1 To N Do
For j:=i+1 To N Do
If B[i]>B[j] Then Begin Temp:=B[i];
B[i]:=B[j]; B[j]:=Temp; End;
End;
{*****************************} BEGIN
ClrScr; Randomize; Repeat
Write('Canh cua ma tran: ');Readln(n); Until (n>0) and (n<=dim);
Nhap(A,n,n); Readln;
TaoMang1Chieu(A,n,n,B); Sapxep(B,n*n);
{Điền giá trị cho ma trận kết quả} L:=0;
i:=1; j:=1; Num:=N-1; Dir:=0;
While L<n*n Do Begin Case DIR of 0:Begin
For k:=0 to Num Do Begin Inc(L);
(66)Inc(Dir); Inc(j,Num); End;
1:Begin
For k:=1 to Num Do Begin Inc(L);
A[i+k,j]:=B[L]; End;
Inc(Dir); Inc(i,Num); End;
2:Begin
For k:=1 to Num Do Begin Inc(L);
A[i,j-k]:=B[L]; End;
Inc(Dir); Dec(j,Num); End;
3:Begin
Dec(Num);
For k:=1 to Num Do Begin Inc(L);
A[i-k,j]:=B[L]; End;
Dir:=0; Dec(i,Num); Inc(j); Dec(Num); End;
End; End;
Hienthi(A,N,N); READLN;
END
IV CŨNG CỐ: Để xếp mảng hai chiều ta cần phải chuyển mảng hai chiều mảng chiều xếp mảng chiều Sau chuyển lại sang mảng hai chiều
Trong trường hợp chuyển theo đường xoắn óc cần lưu ý phải xác định cách chuyển thae vòng tròn
V HƯỚNG DẪN, DẶN DÒ
Bai tập 1: Hãy xếp lại ma trận vuông A[n,n] cho phần tử chúng có giá trị tăng dần theo đường Zigzac hình vẽ sau:
(67)**************************************************
Ngày soạn:28/12/2008 Ngày
dạy:3/1/2009
Tiết 58-59-60: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng kiến thức học làm toán mảng hai chiều2.Kỹ năng: Có kỹ thực hành máy nhanh, xác, phân tích dạng tốn mảng hai chiều để tính tốn
3.Thái độ: Học sinh tích cực, tự giác, hứng thú thực hành B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Bài tập, phòng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Thực hành
Bai tập 1: Hãy xếp lại ma trận vuông A[n,n] cho phần tử chúng có giá trị tăng dần theo đường Zigzac hình vẽ sau:
Ý tưởng thuật toán:
Duyệt theo đường zigzac thực tế duyệt theo
đường chéo, lần lại đổi chiều
Một ma trận có n phần tử số đường chéo 2n – (tính
cả đường chéo có điểm A[1,1) A[n,n]
Nếu ta đánh số đường chéo theo thứ tự từ đến 2n
điềm A[i,j] nằm đường chéo k thỏa mãn I+j=k (với k
[2 2n])
Tọa độ cột j đường chéo k phải thỏa mãn điều kiện:
+ j tăng từ đến k k<=n + k tăng từ k-n đến N k>n
Bài toán qui trường hợp tạo 2n – đường chéo thỏa mãn tính chất
(68)Program
Sap_xep_mang_2_chieu_theo_hinh_zig_zac; USES CRT;
Const
DIM=10;
MaxNum=1000; Step=5;
TYPE
Mang2=Array[1 DIM,1 DIM] of Integer; Mang1=Array[1 DIM*DIM] of Integer; VAR
i,j,n,m,L,k:Integer; Num,Dir:Integer;
A:Mang2; B:Mang1;
{*****************************}
PROCEDURE NHAP(var A:Mang2;m,n:Integer); VAR
i,j,x,y:Integer; Begin
X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr;
GotoXY(X+((Step*n-15)Div 2),y-2);
Writeln('Nhap ma tran ',m,' dong ',n,' cot');
For i:=1 To m Do For j:=1 To n Do REPEAT
GotoXY(X+(j-1)*Step,Y+i-1);
Write('':Step);
GotoXY(X+(j-1)*Step,Y+i-1);
Readln(A[i,j]);
UNTIL (ABS(A[i,j])<MaxNum); End;
{*****************************}
PROCEDURE HIENTHI(var A:Mang2;m,n:Integer); VAR
i,j,x,y:Integer; Begin
X:=(80-Step*n) Div 2; Y:=(25-Dim) Div 2; ClrScr;
(69)For i:=1 To m Do
For j:=1 To n Do Begin
GotoXY(X+(j-1)*Step,Y+i-1); Write(A[i,j]:3);
End; End;
{*****************************} Procedure TAOMANG1CHIEU(VAR
A:Mang2;m,n:Integer;VAR B:Mang1); Var
i,j :Integer; Begin
For i:=1 To m Do For j:=1 To n Do
B[(i-1)*n+j]:=A[i,j]; End;
{*****************************}
Procedure SAPXEP(var B:Mang1;n:Integer); Var
i,j,Temp :Integer; Begin
For i:=1 To N Do
For j:=i+1 To N Do
If B[i]>B[j] Then Begin Temp:=B[i];
B[i]:=B[j]; B[j]:=Temp; End;
End;
{*****************************} BEGIN
ClrScr; Randomize; Repeat
Write('Canh cua ma tran: ');Readln(n); Until (n>0) and (n<=dim);
Nhap(A,n,n); Readln;
TaoMang1Chieu(A,n,n,B); Sapxep(B,n*n);
L:=0; Dir:=0;
For Num:=2 To n+n Do Begin If Num>n Then Begin k:=Num-n;
(70)k:=1;
m:=Num-1; End;
Case Dir of 0:Begin
For j:=k To m Do Begin Inc(L);
A[Num-j,j]:=B[L]; End;
Dir:=1; End;
1:Begin
For j:=m DownTo k Do Begin Inc(L);
A[Num-j,j]:=B[L]; End;
Dir:=0; End;
End; End;
HienThi(A,N,N); Hienthi(A,N,N); READLN;
END
IV CŨNG CỐ: Để xếp mảng hai chiều ta cần phải chuyển mảng hai chiều mảng chiều xếp mảng chiều Sau chuyển lại sang mảng hai chiều
Trong trường hợp chuyển theo đường zigzac cần lưu ý phải xác định cách thay đổi dòng cột
V HƯỚNG DẪN, DẶN DỊ
Bài tập1 :
2 Viết chương trình xếp phần tử ma trận vng A[n,n] (với n=2k+1) cho tổng dịng, cột đường chéo (Bài toán ma phương)
***************************************************************
Ngày soạn: 4/1/2009
Ngày dạy:7/1/2009
Tiết 61-62 -63: XÂU KÍ TỰ ( STRING)
1.Kiến thức: Học sinh năm cấu trúc liệu kiểu xâu, biết viết chương trình xữ lí tốn xâu kí tự
2.Kỹ năng: Có kĩ phân tích tốn, sữ dụng xác thủ tục xữ lí xâu kí tự
3.Thái độ: Học sinh tích cực, tự giác, hứng thú học B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRỊ GV: Bài tập, phịng máy
(71)D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Bài mới
XÂU KÝ TỰ (STRING) I KHAI BÁO KIỂU STRING
TYPE TênKiểu = STRING[Max]; VAR Tên biến : TênKiểu;
hoặc khai báo biến trực tiếp:
VAR Tên biến : STRING[Max];
Trong Max số ký tự tối đa chứa chuỗi (Max [0,255]) Nếu khơng có khai báo [Max] số ký tự mặ mặc định chuỗi 255
Ví dụ:
Type Hoten = String[30]; St80 = String[80]; Var Name : Hoten;
Line : St80;
St : String; {St có tối đa 255 ký tự} II TRUY XUẤT DỮ LIỆU KIỂU STRING
- Có thể sử dụng thủ tục xuất nhập Write, Writeln, Readln để truy xuất biến kiểu String
- Để truy xuất đến ký tự thứ k xâu ký tự, ta sử dụng cú pháp sau: Tênbiến[k].
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ệ so sánh theo thứ tự từ điển. IV CÁC THỦ TỤC VÀ HÀM VẾ XÂU KÝ TỰ
4.1 Hàm lấy chiều dài xây ký tự
LENGTH(St : String):Integer;
4.2 Hàm COPY(St : String; Pos, Num: Byte): String;
Lấy xâu từ xâu St có độ dài Num ký tự vị trí Pos 4.3 Hàm POS(SubSt, St :String):Byte;
Kiểm tra xâu SubSt có nằm xâu St hay không? Nếu xâu SubSt nằm xâu St hàm trả vị trí xâu SubSt xâu St, ngược lại hàm trả giá trị
4.4 Thủ tục DELETE(Var St:String; Pos, Num: Byte); Xoá xâu St Num ký tự vị trí Pos
4.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 vị trí Pos
4.6 Thủ tục STR(Num; Var St:String);
(72)Đổi xâu số St thành số gán kết lưu vào biến Num Nếu việc chuyển đổi thành cơng biến Code có giá trị 0, ngược lại biến Code có giá trị khác (vị trí lỗi)
BÀI TẬP MẪU
Bài tập 1: Viết chương trình nhập vào xâu ký tự từ bàn phím Đổi xâu ký tự sang chữ in hoa in kết hình
Ví dụ :Xâu abcdAbcD cho xâu ABCDABCD Uses Crt;
Var St:String; i:Byte; Begin
Write(‘Nhap xau St: ‘); Readln(St);
For i:=1 to length(St) St[i]:=Upcase(St[i]); Write(‘Xau ket qua: ‘, St);
Readln; End
Bài tập 2: Viết chương trình nhập vào xâu ký tự từ bàn phím Đổi xâu ký tự sang chữ thường in kết hình
Ví dụ :Xâu abCdAbcD cho xâu abcdabcd Uses Crt;
Var St:String; i:Byte; Begin
Write(‘Nhap xau St: ‘); Readln(St); For i:=1 to length(St)
If St[i] IN [‘A’ ’Z’] Then St[i]:=CHR(ORD(St[i])+32); Write(‘Xau ket qua: ‘, St);
Readln; End
Bài tập 3: Viết chương trình đếm số ký tự chữ số xâu ký tự nhập vào từ bàn phím
Uses Crt;
Var St:String; i,d:Byte; Begin
Write(‘Nhap xau St: ‘); Readln(St); For i:=1 to length(St)
If St[i] IN [‘0’ ’9’] Then d:=d+1; Write(‘So ky tu chu so xau: ‘, d); Readln;
(73)Bài tập 4: Viết chương trình nhập vào xâu ký tự từ bàn phím Tìm xâu đảo ngược xâu in kết hình theo cách: Đệ qui khơng đệ qui
Ý tưởng:
- Nếu xâu St có ký tự xâu đảo = St
- Ngược lại: Xâu đảo = Ký tự cuối + Đệ qui(Phần lại xâu St) Uses Crt;
Var St:String;
{Giải thuật không đệ qui}
Function XauDao(St:String):String; Var S:String;
i:Byte; Begin
S:=’’;
For i:=Length(St) DowTo Do S:=S+St[i]; XauDao:=S;
End;
{Giải thuật đệ qui}
Function DeQui(St:String):String; Begin
If Length(St)<=1 Then DeQui:=St
Else DeQui:=St[Length(St)] + DeQui(Copy(St,1,Length(St)-1)); End;
Begin
Write(‘Nhap xau St: ‘); Readln(St); Write(‘Xau dao nguoc: ‘, XauDao(St)); Readln;
End
IV CŨNG CỐ : Học sinh nhắc lại thủ tục đổi chữ thường sang chữ hoa Muốn đổi chữ hoa sang chữ thường ta làm nào?
V HƯỚNG DẪN DẶN DÒ
Bài tập 1: Viết chương trình nhập vào xâu ký tự từ bàn phím Thơng báo lên hình chữ có xâu số lượng chúng ( Không phân biệt chữ hoa hay chữ thường)
Bài tập 2: Viết chương trình xóa ký tự chữ số xâu ký tự nhập vào từ bàn phím
************************************************** Ngày soạn: 11/1/2009
Ngày dạy:14/1/2009 Tiết 64-65 -66: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng phép toán xữ lí xâu kí tự để làm tập
(74)B PHƯƠNG PHÁP: nêu vấn đè, gợi mỡ C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Bài tập, phòng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Thực hành
Bài tập 1: Viết chương trình nhập vào xâu ký tự từ bàn phím Thơng báo lên hình chữ có xâu số lượng chúng ( Không phân biệt chữ hoa hay chữ thường)
Ý tưởng:
- Dùng mảng dem với số chữ để lưu trữ số lượng chữ xâu
- Duyệt qua tất ký tự xâu St: Nếu ký tự chữ tăng biến mảng dem[St[i]] lên đơn vị
Uses Crt;
Var St:String;
dem: Array[‘A’ ’Z’] Of Byte; i:Byte;
ch:Char; Begin
Write(‘Nhap xau St: ‘); Readln(St); {Khởi tạo mảng}
For ch:=’A’ To ‘Z’ Do dem[ch]:=0; {Duyệt xâu}
For i:=1 To Length(St) Do
If Upcase(St[i]) IN [‘A’ ’Z’] Then Inc(dem[Upcase(St[i])]); {Liệt kê ký tự hình}
For ch:=’A’ To ‘Z’ Do
If dem[ch]>0 Then Writeln(ch,’ : ’,dem[ch]); Readln;
End
Bài tập 2: Viết chương trình xóa ký tự chữ số xâu ký tự nhập vào từ bàn phím
Uses Crt;
Var St:String;
{Hàm POSNUM kiểm tra xem xâu St có ký tự chữ số hay khơng? Nếu có, hàm trả vị trí ký tự chữ số, ngược lại hàm trả giá trị 0}
Function POSNUM(St:String):Byte; Var OK:Boolean;
i:Byte; Begin
(75)i:=1;
While (i<=Length(St)) AND (Not OK) Do If St[i] IN [‘0’ ’9’] Then OK:=True Else i:=i+1;
If OK Then POSNUM:=i Else POSNUM:=0; End;
Begin
Write(‘Nhap xau St: ‘); Readln(St);
While POSNUM(St)<>0 Do Delete(St,POSNUM(St),1); Write(‘Xau sau xoa: ‘,St);
Readln; End
Bài tập 3: Viết chương trình nhập vào xâu ký tự từ bàn phím Tìm in hình từ có độ dài lớn xâu
Gợi ý:
Tách từ để so sánh
IV CŨNG CỐ: Nhận xét thực hành V.HƯỚNG DẪN, DẶN DÒ
Bài tập 1: Viết chương trình nhập xâu vào từ bàn phím thơng báo lên hình xâu có phải đối xứng không theo cách: Đệ qui không đệ qui (Ví dụ: abba, abcba xâu đối xứng)
Gợi ý:
- Nếu xâu Length(st)<=1 st xâu đối xứng - Ngược lại:
+ Nếu st[1]<>st[Length(st)] st khơng đối xứng
+ Ngược lại: Gọi đệ qui với xâu st sau bỏ ký tự đầu ký tự cuối
******************************************************* Ngày soạn: 11/1/2009
Ngày dạy:17/1/2009
Tiết 67-68 -69: XÂU KÍ TỰ ( STRING)
1.Kiến thức: Học sinh năm cấu trúc liệu kiểu xâu, biết viết chương trình xữ lí tốn xâu kí tự
2.Kỹ năng: Có kĩ phân tích tốn, sữ dụng xác thủ tục xữ lí xâu kí tự
3.Thái độ: Học sinh tích cực, tự giác, hứng thú học B PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp
C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Bài tập, phòng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Bài mới
(76)Dữ liệu vào: Chuổi s chuổi s1.
Kết ra: Các v ị trí tìm thấy s1 s. Ví dụ:
Input Output
Test ‘aaahocjhochoc’ ‘hoc’
11 Test ‘adddddee’
‘dd’
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 2:
Nhập vào chuổi sau xuất từ dài chuỗi Dữ liệu vào: chuổi
Kết ra: từ dài chuỗi Ví dụ:
Input Output
Test Tran Nguyen dao Nguyen Test Tran quang dao bgggg quang
bgggg Giải
var s,s1:string;
a:array[1 128]of string; i,j,max:integer;
begin readln(s);
while s[1]=#32 delete(s,1,1);
while s[length(s)]=#32 delete(s,length(s),1); while pos(#32#32,s)>0 delete(s,pos(#32#32,s),1); j:=1;
for i:=1 to length(s) begin
if s[i]<>#32 then a[j]:=a[j]+s[i] else inc(j);
end;
(77)if length(a[i])>max then max:=length(a[i]); writeln('(cac) tu dai nhat: (co ',max,' ky tu:)'); for i:=1 to j
if length(a[i])=max then writeln(a[i]); readln;
end Bài 3:
Bờm cuội học sinh giỏi tin học thường liên lạc với thư điện tử (Email) Nhưng thư mà hai bạn gởi cho toàn dãy chữ số liền Cả hai bạn có chương trình mã hoá số thành ký tự ngược lại giải mã số thành ký tự, theo qui định hai bạn chuyển ký tự định gởi thành số thứ tự ký tự bảng mã ASCII (ví dụ : A:65; B:66) từ chữ thường máy chuyển thành chữ hoa mã hố thành số.(ví dụ: aA65, bB66) Sau mã hoá chuyển thư Người nhận có chương trình để giải mã số thành ký tự in hoa (vdụ: 6566326768AB CD) Em viết
a) Chương trình để mã hố xâu ký tự thành chữ số Ví dụ:
Input Output
Di an che? 68733265783267726963
b) Chương trình để giải mã chuổi số thành ký tự Ví dụ:
Input Output
79326865853286658963 O dau vay?
Giải
a Mahoa.pas uses crt;
var s:string; i:integer; begin clrscr;
writeln('Nhap chuoi can ma hoa:'); readln(s);
writeln('Ma hoa cac so la:'); for i:=1 to length(s)
begin
s[i]:=upcase(s[i]); write(ord(s[i])); end;
readln; end
b Giaima.pas uses crt;
(78)ch:char; i,x,d:integer; begin
clrscr;
writeln('Nhap chuoi so mat ma:'); readln(s);
writeln('Giai ma chuoi so tren la:'); while length(s)>0
begin
s2:=copy(s,1,2); {lay moi lan ky tu dau tien} delete(s,1,2); {xoa ky tu da lay di}
val(s2,x,i); {chuyen so x}
write(chr(x)); {chuyen ma asscii} end;
readln; end
IV CŨNG CỐ: Khi muốn xữ lí xâu kí tự mà ta cần chuyển từ kí tự số sang kí tự chữ ngược lại ta cần chuyển theo số thứu tự chữ bảng mã Asci
V HƯỚNG DẪN DẶN DÒ
Về nhà làm tập sau
Bài tập 1: Viết chương trình đảo ngược thứ tự từ xâu nhập vào từ bàn phím
Ví dụ: Xâu Nguyen Van An thành An Van Nguyen Gợi ý:
Tách từ nối vào đầu xâu
Bài tập 2: Viết chương trình nhập vào xâu ký tự s1 s2 Kiểm tra xem xâu s2 xuất lần xâu s1 (Lưu ý: length(s2)<= length(s1))
Gợi ý:
Dùng hàm POS để kiểm tra thủ tục DELETE để xóa bớt sau lần kiểm tra
*************************************************** Ngày soạn: 21/1/2009
Ngày dạy:31/1/2009 Tiết 70-71 -72: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng phép toán xữ lí xâu kí tự để làm tập
2.Kỹ năng: Có kĩ phân tích toán, vận dụng thự hành máy 3.Thái độ: Học sinh tích cực, tự giác, hứng thú thực hành
B PHƯƠNG PHÁP: nêu vấn đè, gợi mỡ C CHUẨN BỊ CỦA THẦY VÀ TRÒ GV: Bài tập, phòng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
(79)Bài tập 1: Viết chương trình nhập vào dịng văn bản, hiệu chỉnh văn bản theo yêu cầu sau in văn sau hiệu chỉnh hình:
a Xóa tất ký tự trắng thừa
b Trước dấu câu khơng có ký tự trắng, sau dấu câu có ký tự trắng
c Đầu câu in hoa
Bài tập 2: Viết chương trình thực phép nhân số nguyên lớn Gợi ý:
- Viết hàm để nhân số lớn với số có chữ số - Áp dụng hàm tính tổng số lớn (xem tập 10)
Bài 3: Viết chương trình nhập vào từ bàn phím xâu ký tự in 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’ Program DaoChuoi;
Uses CRT;
Var Cau : String[80]; i : Byte;
Begin
Write(‘ Nhap vao mot cau : ‘); Readln(Cau);
For i := Length(Cau) DownTo Write(Cau[i]);
Readln; End
Bài 4: Hiển thị chuỗi chuỗi mẹ nhập từ bàn phím, vị trí số ký tự hiển thị nhập từ bàn phím
Program SubString; Uses CRT;
Var St : String; Pos, Len : Byte; Begin
Write(‘ Nhap vao mot chuoi : ‘); Readln(St);
Write(‘ Muon hien thi xau tu vi tri nao : ‘); Readln(Pos); Write(‘ Do dai xau ky tu : ‘);
Readln(Len);
Write(‘ Xau ky tu la : ‘,Copy(St, Pos, Len)); Readln;
End
Bài 5: Viết hàm chuyển đổi xâu ký tự thành chữ hoa chữ thường. Function CHUHOA(s : String) : String;
Var i : Byte; Begin
(80)CHUHOA := s; End;
(******************************) Function CHUTHUONG(s : String) : String; Var i : Byte;
Begin
For i := Length(s) If s[i] In ['A' 'Z'] then
s[i] := Chr(Ord(s[i]) + 32); CHUTHUONG := s; End;
End
IV CŨNG CỐ: Nhận xét thực hành V HƯỚNG DẪN DẶN DỊ
Bài tập 1: Viết chương trình để nén giải nén xâu ký tự
Ví dụ: Xâu ‘AAAABBBCDDDDDDDEEF’ sau nén trở thành ‘4A3BC7D2EF’
***************************************************** Ngày soạn: 1/2/2009
Ngày dạy:4/2/2009
Tiết 73-74 -75: DỮ LIỆU KIỂU FILE
1.Kiến thức: Học sinh nắm cách đọc liệu ghi liệu vào File 2.Kỹ năng: Giải toán lấy liệu File
3.Thái độ: Học sinh tích cực, tự giác, hứng thú học B PHƯƠNG PHÁP: Nêu vấn đề, gợi mỡ
C CHUẨN BỊ CỦA THẦY VÀ TRỊ GV: Bài tập, phịng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Bài mới
DỮ LIỆU KIỂU FILE I KHAI BÁO
Type <Tên kiểu File> = File of <Kiểu phần tử>; Var <Tên biến File> : <Tên kiểu File>; khai báo trực tiếp:
Var <Tên biến File> : File of <Kiểu phần tử>; Ví dụ:
Type SanPham = File of Record
Ten: String[20];
SoHieu: Byte;
End; Var f,g: SanPham;
(81)Var f,g: File of Record
Ten: String[20]; SoHieu: Byte; End;
Chú ý:
Pascal theo dõi thao tác truy nhập thông qua trỏ file Mỗi phần tử ghi vào hay đọc từ file, trỏ file tự động chuyển đến phần tử
Các biến kiểu file khơng phép có mặt phép gán biểu thức
II CÁC THỦ TỤC VÀ HÀM CHUẨN 2.1 Các thủ tục chuẩn
2.1.1 Gán tên file
Cú pháp: Assign(F, Filename);
Chức năng: Gán file đĩa có tên Filename cho biến file F, truy xuất file cụ thể thực thông qua biến file
Chú ý:
Filename bao gồm tên ổ đĩa đường dẫn file không nằm ổ đĩa, thư mục thời
2.1.2 Mở file mới
Cú pháp: Rewrite(F);
Chức năng: Tạo file có tên gán cho biến file F Nếu file có đĩa liệu bị xoá trỏ file trỏ vị trí file 2.1.3 Mở file có đĩa
Cú pháp: Reset(F);
Chức năng: Mở file có tên gán cho biến file F Nếu file chưa có đĩa chương trình dừng gặp lỗi xuất/nhập
Chú ý: Kiểm tra mở file
{$I+}: Mở việc kiểm tra Khi gặp lỗi Vào/ra chương trình báo lỗi dừng lại {$I-}: Khơng kiểm tra Vào/ra, chương trình khơng dừng lại treo thủ tục Vào/ra khác hàm IOresult (hàm chuẩn PASCAL) Hàm trả giá trị true việc mở file xảy tốt đẹp
Ví dụ:
Procedure MoFile; Var ok:Boolean;
St:String; F:Text; Begin
Repeat
Write(‘Nhập tên tệp: ‘);readln(st); Assign(F,st);
{$I-} (*Chuyển việc kiểm tra vào cho người dùng*) Reset(F);
Ok:=IOResult; {$I+}
if not OK then writeln(‘Không mở ‘); Until OK;
(82)2.1.4 Đọc liệu từ file Cú pháp: Read(F, x);
Chức năng: Đọc phần tử liệu từ file F vị trí trỏ file gán cho biến x
2.1.5 Ghi liệu lên file
Cú pháp: Write(F, Value);
Chức năng: Ghi giá trị Value vào file F vị trí thời trỏ file 2.1.6 Di chuyển trỏ file
Cú pháp: Seek(F, n);
Chức năng: Di chuyển trỏ file đến phần tử thứ n (phần tử có thứ tự 0)
2.1.7 Đóng file
Cú pháp: Close(F);
Chức năng: Cập nhật sửa đổi file F kết thúc thao tác file
2.1.8 Xoá file
Cú pháp: Erase(F);
Chức năng: Xoá file đĩa có tên gán gán cho biến file F (file cần xố file đóng)
2.1.9 Đổi tên file
Cú pháp: Rename(F, NewFile);
Chức năng: Đổi tên file gán cho biến file F thành tên file NewFile
2.2 Các hàm chuẩn
2.2.1 Hàm trả vị trí trỏ file Cú pháp: Filepos(F);
Chú ý: Con trỏ đầu file tương ứng vị trí 0. 2.2.2 Hàm kiểm tra cuối file
Cú pháp: EOF(F);
Chức năng: Hàm trả giá trị True trỏ file cuối file, ngược lại hàm trả giá trị False
2.2.3 Hàm trả kích thước file Cú pháp: FileSize(F);
Chức năng: Hàm trả số lượng phần tử có file III FILE VĂN BẢN (TEXT FILE)
Thành phần ký tự, song cấu trúc thành dòng, dòng kết thúc CR LF, CR có mã ASCII 13 LF có mã 10 Cuối file có dấu kết thúc file Ctrl-Z có mã 26
Do dịng có độ dài thay đổi nên khơng tính trước vị trí dịng file Vì file dạng Text đệoc xử lý cách 3.1 Khai báo
Var <Tên biến file>: Text;
3.2 Các thủ tục hàm tác động file dạng text 3.2.1 Thủ tục Append
Cú pháp: Append(F);
Chức năng: Mở file tồn để bổ sung nội dung vào cuối file 3.2.2 Thủ tục Readln
(83)Chức năng: Đọc dòng từ vị trí trỏ file gán cho biến x Thực xong, trỏ file chuyển đầu dịng Biến x nhận kiểu: Char, String kiểu số
3.2.3 Thủ tục Writeln
Cú pháp: Writeln(F, x);
Chức năng: Ghi giá trị x vào file vị trí trỏ file Kết thúc thủ tục, trỏ file chuyển đầu dòng sau
Chú ý:
Máy in xem file dạng text, biến mở sẵn Unit Printer cho file LST Vì để in dịng St máy in ta dùng lệnh Writeln(LST,St)
3.2.4 Thủ tục Flush Cú pháp: Flush(F);
Chức năng: Cập nhật nội dung file có tên gán cho biến file F mà khơng cần dùng thủ tục Close thao tác file
3.2.5 Thủ tục SetTextBuf
Cú pháp: SetTextBuf(F, x);
Chức năng: Thay đổi vùng nhớ đệm dành cho file dạng text với kích thước cho biến x Mặc định vùng nhớ 128 byte
Chú ý:
Thủ tục phải gọi trước thủ tục mở file: Reset, Rewrite, Append
3.2.6 Hàm EOLn
Cú pháp: EOLn(F);
Chức năng: Hàm trả giá trị True trỏ cuối dòng, ngược lại hàm trả giá trị False
Chú ý:
Các thủ tục hàm không sử dụng file dạng text: Seek, FilePos, FileSize.
Sau thao tác xuất nhập file:
Ghi liệu vào file Đọc liệu từ file ASSIGN(f,FileName);
REWRITE(f);
WRITE(f,value);
CLOSE(f);
ASSIGN(f,FileName); RESET(f);
While Not EOF(f) Do Begin
READ(f,x);
End;
CLOSE(f);
III CŨNG CỐ: Muốn đọ liệu từ File ta làm nào? Cách ghi liệu vào File ?
Muốn kiểm tra xem đọc hết file chưa ta làm nào? V HƯỚNG DẪN DẶN DÒ: Về nhà làm tập
(84)hàng ma trận Hãy viết chương trình đọc liệu từ file MT.INP, tính tổng hàng ma trận ghi lên file văn có tên KQ.OUT đó, dịng đầu chứa số m, dòng thứ hai chứa m tổng m hàng (m,n<=200)
MT.INP KQ.OUT
5
3 –1 15 12 12
5 –8 –3 –1 -5
***************************************************** Ngày soạn: 1/2/2009
Ngày dạy:7/2/2009 Tiết 76- 77 -78: THỰC HÀNH
1.Kiến thức: Học sinh vận dụng làm tập truy xuất liệu File 2.Kỹ năng: Chính xác việc đọc liệu từ File ghi liệu vào File 3.Thái độ: Học sinh tích cực, tự giác, hứng thú thực hành
B PHƯƠNG PHÁP: Nêu vấn đề, gợi mỡ C CHUẨN BỊ CỦA THẦY VÀ TRỊ GV: Bài tập, phịng máy
HS: Làm tập nhà D TIẾN TRÌNH LÊN LỚP 1 Ổn định: Sĩ số
2 Thực hành
Bài tập 1: Một ma trận mxn số thực chứa file văn có tên MT.INP gồm: dòng đầu chứa hai số m, n; m dòng chứa m hàng ma trận Hãy viết chương trình đọc liệu từ file MT.INP, tính tổng hàng ma trận ghi lên file văn có tên KQ.OUT đó, dòng đầu chứa số m, dòng thứ hai chứa m tổng m hàng (m,n<=200)
MT.INP KQ.OUT
5
3 –1 15 12 12
5 –8 –3 –1 -5
Program Vidu_8; Var
f,g: Text;
S:array[byte] of real; m,n,i,j: byte;
Begin
assign(f,’MT.INP’); reset(f);
(85)begin
for j:=1 to n begin read(f,x);
S[i]:=S[i]+x; end; readln(f); end;
close(f);
assign(g,’KQ.OUT’); rewrite(g);
writeln(g,m); for i:= to m
write(g,S[i]:0:2,#32); close(g);
End Chú ý:
Chương trình khơng kiểm tra tồn file ‘MT.INP’, cần kiểm tra tương tự ví dụ
Tổng hàng lưu mảng chiều S (phần tử S[i] lưu tổng hàng i)
Bài tập 2: Một ma trận mxn số thực chứa file văn có tên DULIEU.INP gồm: dịng đầu chứa hai số m, n; m dòng chứa m hàng ma trận Hãy viết chương trình đọc liệu từ file DULIEU.INP, cho biết hàng ma trận có tổng phần tử hàng lớn Kết ghi lên file văn có tên DULIEU.OUT , dịng đầu chứa giá trị lớn tổng phần tử hàng, dòng thứ hai chứa số hàng đạt giá trị tổng lớn (m,n<=100)
Chẳng hạn
DULIEU.INP DULIEU.OUT
6 34
3 12 2
7 10 5 10 12 8 8
Program Vi_du_10; Var
f,g: Text;
S:array[1 100] of real; T: Set of byte;
GTMax: real; m,n,i,j: byte; Begin
assign(f,’DULIEU.INP’); reset(f);
(86)fillchar(S,m,0); for i:= to m
begin
S:=0; for j:=1 to n
begin read(f,x);
S[i]:=S[i]+x; end; readln(f); end;
close(f); T:=[1];
GTMax:=S[1]; for i:= to m
if S[i] > GtMax then begin
T:=[i];
GtMax:= S[i]; end
else
if S[i] = GTMax then T:= T+[i]; assign(g,’DULIEU.OUT’); rewrite(g);
writeln(g,GTMax:0:2); for i:=1 to 100
if i in T then
write(g,i,#32); readln;
End Chú ý:
Chương trình dùng mảng S để lưu tổng giá trị phần tử hàng Cụ thể, S[i] tổng giá trị phần tử hàng thứ i ma trận cho Tập T , GTMax tập chứa số hàng giá trị lớn
của phần tử hàng thời điểm xét Xuất phát ta xem hàng thứ có tổng giá trị lớn Khi xét hàng thứ i có trường hợp sau:
- S[i] > GTMax: S[i] tổng lớn lúc có hàng i đạt giá trị
- S[i] = GTMax: có thêm hàng i đạt giá trị lơn - S[i] < GTMax: khơng có thay đổi
III CŨNG CỐ: Nhận xét thực hành IV HƯỚNG DẪN , DẶN DÒ:
Bài 1: Dãy không giảm dài Cho dãy số nguyên dương a1, a2,…an
Dãy số ai, ai+1,…aj thoả mãn ai≤ ai+1≤ …≤aj với ≤ i ≤ j ≤ n gọi dãy không giảm dãy số cho
(87)của thuộc dãy số {uk} xác định u1=1, un = un-1+k, tìm dãy có độ dài lớn
Dữ liệu vào từ file MAXSEQ.INP
Dòng đầu chứa số nguyên dương n ≤ 10000
N dòng chứa số nguyên dương ≤ 10^8 (i = n)
Kết quả: ghi file văn MAXSEQ.OUT số nguyên d độ dài dãy khơng giảm tìm (quy ước khơng tìm ghi d=0)
Ví dụ: cho dãy (n=8): 2, 2007, 6, 6, 15, 16, 3, 21 -> Kết d = (là dãy 6, 6, 15)
***************************************************** Bài làm:
const max=10000; var
A:array[1 max] of longint; D:array[0 max] of integer; n,M:integer;
f: text;
procedure nhap; var i : integer; begin
assign(f,'MAXSEQ.INP'); reset(f);
readln(f,n);
for i := to n readln(f,a[i]); close(f);
fillchar(d,sizeof(d),0); end;
function chon(s : integer) : boolean; var x : longint;
begin s:=2*s;
x:= trunc(sqrt(s)); chon:= sqr(x)+x = s; end;
procedure tinh; var i : integer; begin
if chon(a[1]) then d[1]:=1
else d[1]:=0; m:=d[1];
for i:= to n
(88)d[i]:=1;
if d[i]>m then m:=d[i]; end
else d[i]:=0; end;
procedure xuat; begin
assign(f,'MAXSEQ.OUT'); rewrite(f);
write(f,M); close(f); end; BEGIN clrscr; Nhap; tinh; xuat; end
Bài Siêu thị may mắn
An mời tham gia trò chơi “Siêu thị máy tính” đài truyền hình ZTV tổ chức Siêu thị đặt trường quay truyền hình có n mặt hàng đánh số từ đến n mặt hàng thứ i niêm yết giá ci đồng, i = 1, 2, …, n Theo thể lệ trò chơi, An ban tổ chức tặng thẻ mua hàng có giá trị s đồng phải dùng hết số tiền thẻ để mua hàng siêu thị với điều kiện mặt hàng thứ i mua với số lượng nhiều mi, i = 1, 2, …, n An người thắng tìm tổng số cách mua hàng thỏa mãn yêu cầu đặt cách mua hàng có
Yêu cầu: Hãy giúp An trở thành người thắng cho bạn biết trước giá trị n, s, ci mi
(1 ≤ n ≤ 500; ≤ s ≤ 105; ≤ ci ≤ 104; ≤ mi ≤ 100) với i = 1, 2, …, n Dữ liệu: Vào từ file văn SMARKET.INP
Dòng chứa hai số nguyên dương s n;
Dòng thứ i n dòng chứa số nguyên dương ci mi với i = 1, 2, …, n
Kết quả: Ghi file văn SMARKET.OUT
Dòng ghi số nguyên d tổng số cách mua hàng tìm được;
Nếu d ≥ dịng thứ hai ghi cách mua hàng tìm dãy n số nguyên, dó số hạng thứ i số lượng mặt hàng thứ i mua cách mua hàng này, i = 1, 2, …, n
Hai số liên tiếp dòng file liệu file kết cách dấu cách
Ví dụ: Code:
SMARKET.INP SMARKET.OUT 12
(89)2 Đề 2:
Sở giáo dục đào tạo kỳ thi chọn HọC SINH giỏi CấP thành phố
Thành phố đà nẵng năm học 2006-2007 Môn thi : tin học - lớp 10 THPT Thời gian : 150 phút (Khơng tính thời gian giao đề) Đ
Ò CHÝNH THøC:
Chó ý bµi thi gåm cã bµi trang
Tơng quan đề
thi
Chuyển vị Chép số nghuyên tố
Khoảng cách sâu
Tên làm Bl1.pas Bl2.pas Bl3.pas
Dữ liệu vào Bµn phÝm Bµn phÝm Bracket.inp
Dữ liu ra Màn hình Sntghep.out Bracket.out
Gioi hn 1 giõy 2giay 3 giõy
Bài 1: Chuyển vị
Lập chơng trình để chuyển đổi vị trí từ dịng thành cột bảng số ngun có hàng cột
Đa kết hình bảng số ban đầu bảng số chuyển i v trớ
Bài 2: Ghép số nguyên tố
Dãy A dãy tăng dần số nguyên tố: 2, 3, 5,7, 11, 13, ., lập dãy B cách ghép cặp số liền kề dãy A với nhau, cụ thể: 23, 57, 1113, , dãy C nhận đợc từ dãy B cách loại số không số nguyên
tố
Yêu cầu: Lập chơng trình tìm j số hạng dÃy C Dữ liệu vào: NhËp j (j <= 50) tõ bµn phÝm
Dữ liệu ra: Ghi tệp Sntghep.out, dòng số hạng dÃy C Bài 3: Khoảng cách x©u
Với xâu ký tự, ta tiến hành phép biến đổi sau:
1 Thay ký tự ký tự khác, chẳng hạn: test thành text Xóa ký tự bất kỳ, chẳng hạn: text thành ext text thành txt Thêm ký tự vào vị trí bất kỳ, chẳng hạn SP thành SP2 Với hai xâu S1 S2, ta nói khoảng cách từ xâu S1 đến xâu S2 số lợng phép biến đổi thuộc cách mà áp dụng liên tiếp vào S1, ta nhận đợc xâu S2
Dữ liệu vào: Đọc từ file văn Kcxau.inp gồm dòng, dòng xâu S1, dịng xâu S2 (các xâu S1, S2 có độ dài khơng q 100 ký tự)
D÷ liƯu ra: Ghi file văn Kcxau.out nh sau:
- Dòng ghi số N khoảng cách từ S1 đến S2
- Các dòng tiếp theo, dòng ghi phép biến đổi theo thứ tự để từ xâu S1, có đợc xâu S2
VÝ dô:
Kcxau.inp Kcxau.out
1A3BC
13Ab 31A3BC – Thay C/5/b => 1A3Bb 1A3Bb – Thay B/4/A => 1A3Ab 1A3Ab – Xoa A/2 => 13Ab
(90)*********************************************************** *
§Ị 3
THỜI GIAN: 150 PHÚT
1 Dãy Fibonaci dãy số tuân theo qui luật sau: F[1]=1;
F[2]=1;
F[i]=F[i-1]+F[i-2] với (i>=3);
Em viết chương trình tạo dãy số fibonaci gồm có n phần tử (0<n<47) xuất phần tử thứ k (0<k<=n) dãy
Dữ liệu vào: Số nguyên n, k có giới hạn theo đề.
Kết ra: Dãy số fibonaci gồm n phần tử phần tử thứ k dãy.
Ví dụ:
Dữ liệu vào Dữ liệu
20
15 1 13 21 34 55 89 144 233 377 610 987 1597 25844181 6765 610
2 Tạo dãy gồm n (3<n<20) số nguyên nhận giá trị ngẫu nhiên từ đến 99 xuất dãy xuất vị trí số nguyên tố dãy Dữ liệu vào: Số nguyên n có giới hạn theo đề.
Kết ra: Mảng a ngẫu nhiên vị trí số nguyên tố mảng.
Ví dụ:
Dữ liệu vào Dữ liệu
20 So phan tu cua mang:20
Mang a la:
74 98 69 94 11 11 50 21 61 89 73 14 19 55 31 71 50 12 Vi tri cac so nguyen to co a la: 10 11 12 14 16 17 Lưu ý: số số nguyên tố
3 Nhập vào số ngun x xuất độ dài cạnh tam giác có chu vi x diện tích tam giác (loại trừ trường hợp tam giác trùng nhau) Xuất diện tích nhỏ diện tích lớn (diện tích lấy số lẻ)
Dữ liệu vào: Số nguyên x.
Kết ra: Độ dài cạnh tam giác có chu vi x diện tích tam giác đó; diện tích lớn diện tích nhỏ
Ví dụ:
Dữ liệu vào Dữ liệu
15 7 dien tich : 3.49
(91)dien tich : 6.50 6 dien tich : 8.71 4 dien tich : 6.78 dien tich : 9.92 5 dien tich : 10.83 Dien tich nho nhat: 3.49 Dien tich lon nhat: 10.83
Đề thi có trang – cịn tiếp
4 VCT nhập vào số tự nhiên n (0<n<10)và hai mảng số nguyên a,b có n phần tử đại diện cho hai tập hợp (khơng thể có phần tử trùng tập hợp) Trong trình nhập, phải kiểm tra: phần tử vừa nhập vào có mảng khơng bổ sung vào mảng In hình tập hợp a, tập hợp b phần tử giao tập hợp a, b
Dữ liệu vào: Số nguyên n, n phần tử tập hợp a n phần tử tập hợp b. Kết ra: Tập hợp a, tập hợp b phần tử giao tập hợp a, b
Ví dụ:
Màn hình chạy chương trình (các số in đậm liệu nhập vào) Nhap so phan tu cua hai tap hop:5
Nhap cho tap hop a: a[1]=3
a[2]=6 a[3]=6
Da co, nhap lai: a[3]=9
a[4]=5 a[5]=8
Tap hop a la:
Nhap cho tap hop b: b[1]=6
b[2]=8 b[3]=4 b[4]=7 b[5]=8
Da co, nhap lai: b[5]=9
(92)a Giao b la:
Lưu ý: Lưu tên theo thứ tự:
1 D:\THI\VONG2\FIBONACI.PAS 2 D:\THI\VONG2\MANG-NTO.PAS 3 D:\THI\VONG2\TAMGIACX.PAS 4 D:\THI\VONG2\A-GIAO-B.PAS
Đề thi có trang Hết
Sở giáo dục đào tạo Đề thi chọn học sinh giỏi
líp THCS
TØnh ninh b×nh năm học 2007 - 2008
Môn: Tin häc
Thời gian làm bài: 150 phút (khơng kể thời gian giao đề)
(§Ị thi gåm 02 trang) Em lập trình ngơn ngữ Pascal giải toán sau: Bài I (10 điểm): DIỆN TÍCH CÁC HÌNH.
Cho hình chữ nhật ABCD có chiều dài AB a (cm), chiều rộng AD b (cm) với a, b số nguyên dương không vượt 10000 Một điểm M đoạn BC, điểm N đoạn CD cho độ dài (tính cm) đoạn BM, CN số nguyên không âm
Yêu cầu:
Biết độ dài BM, tính diện tích hình chữ nhật ABCD diện tích tam giác MCN
2.Tìm giá trị lớn giá trị nhỏ diện tích tam giác AMN M, N thay đổi
Dữ liệu vào: Dữ liệu toán cho tệp tin DIENTICH.INP gồm ba số a, b, x (x b a, x độ dài BM yêu cầu 1) ghi dòng theo thứ tự trên, hai số liên tiếp cách khoảng trắng
Dữ liệu ra: Kết ghi hình (hoặc ghi file DIENTICH.OUT) 5 dòng:
- Dòng đầu ba số a, b x
- Dịng thứ hai diện tích hình chữ nhật ABCD - Dịng thứ ba diện tích tam giác MCN
A B
D C
M
đề thi thức
(93)- Dòng thứ tư giá trị lớn diện tích tam giác AMN - Dịng thứ năm giá trị nhỏ diện tích tam giác AMN
(Các giá trị diện tích ghi dạng thập phân với chữ số sau dấu phẩy) Ví dụ:
DIENTICH.INP Kết hình (hoặc file DIENTICH.OUT)
10 10
60.0 4.0 30.0 17.5 Hạn chế kỹ thuật:
- Ghi tên file làm DIENTICH.PAS. - Dữ liệu vào xác khơng cần kiểm tra
- Nếu không nhập liệu vào từ file, thí sinh nhập liệu vào từ bàn phím
- Có khoảng 60% số test có a < 100. Bài II(10 điểm): DÃY SỐ.
Cho số nguyên dương S dãy số gồm N số nguyên dương F1, F2, , FN Dãy số cho gọi dãy tăng dần nếu: Fi Fi+1 ∀ i {1,2, , n −1} ( hay F1 F2 F3 FN )
Chúng ta gọi hai số hạng Fi1 Fi2 dãy cho (với i1 i2; i1,i2 {1,2, , n} ):
- Là “cặp đôi xung khắc” Fi1 + Fi2 = S
- Là “cặp đơi lý tưởng” chúng có ba chữ số, chữ số số hạng giống hệt số hạng khác thứ tự xuất - ví dụ 123 132 hay 121 211 cặp đơi lý tưởng cịn 121 122 hay 457 457 khơng phải
Yêu cầu: Cho biết S dãy số F1, F2, , FN Hãy xác định xem dãy cho có phải dãy tăng dần hay khơng, tính số cặp đơi xung khắc tìm cặp đơi lý tưởng (nếu có) dãy cho
Dữ liệu vào: Dữ liệu vào toán cho tệp tin DAYSO.INP với cấu trúc sau:
- Dòng gồm hai số N S (N 50000, S <1000)
- Dòng thứ i N dòng chứa số số Fi dãy (Fi < 500) Dữ liệu ra: Kết ghi hình (hoặc ghi file DAYSO.OUT)bốn dịng:
- Dòng đầu ghi ba số N, S FN
- Dòng thứ hai ghi CO dãy cho dãy tăng dần, ghi KHONG ngược lại
- Dòng thứ ba ghi số số cặp đôi xung khắc dãy cho
- Dòng thứ tư ghi hai số cặp đơi lý tưởng tìm dãy cho, khơng có cặp đơi lý tưởng ghi hai số
Ví dụ:
(94)5 5
5 5 CO 0
10 111 110 110 1 5 10 10 10 101
10 111 101 KHONG
110 101
Hạn chế kỹ thuật:
- Ghi tên file làm DAYSO.PAS
- Dữ liệu vào xác khơng cần kiểm tra
- Có khoảng 30% số test nhập liệu vào từ bàn phím. - Có khoảng 60% số test có N < 1000.
-
HÕt -TØnh ninh b×nh Híng dÉn chÊm thi Chän hsg líp 9 THCS
năm học 2007 - 2008 Môn: Tin học
I- Dữ liệu chấm bài.
Giám khảo copy 14 file liệu vào gồm:
- file test lần lợt DIENTICH.IN1, DIENTICH.IN2, …,
DIENTICH.IN7,
- file test lần lợt DAYSO.IN1, DAYSO.IN2, , DAYSO.IN7
vào th mục chứa Turbo Pascal máy chấm II Chấm bài.
Với thi cđa thÝ sinh: ChÊm bµi 1:
1 Giám khảo Copy làm có tên DIENTICH.PAS vào th mục chứa Turbo Pascal máy chấm
2 Với file liệu vào - học sinh không nhập liệu từ file giám
khảo nhập từ bàn phím - chạy chơng trình học sinh quan sát kết hình (hoặc file liệu ra) so sánh với đáp án cho điểm chi tiết nh sau:
+ Ba test đầu, test điểm:
- Ghi a, b, x cho 0,25 điểm
- Ghi diện tích hình chữ nhật ABCD cho 0,25 điểm
- Ghi diện tích tam giác MCN cho 0,50 điểm
- Ghi diện tích nhỏ cho 0,50 điểm
- Ghi diện tích lớn cho 0,50 điểm
+ Bèn test sau, test điểm:
(Khụng cho im ghi ỳng a, b, x nữa)
- Ghi diện tích hình chữ nhật ABCD cho 0,25 điểm
(95)- Ghi diện tích nhỏ cho 0,25 điểm
- Ghi diện tích lớn cho 0,25 điểm
ChÊm 2:
1 Giám khảo Copy làm có tên DAYSO.PAS vào th mục chứa Turbo Pascal máy chấm
2 Với file liệu vào - học sinh không nhập liệu từ file giám
kho nhp t bn phớm test - chạy chơng trình học sinh quan sát kết hình so sánh với đáp án cho điểm chi tiết nh sau: + Ba test đầu, test điểm:
- Ghi N, S, FN cho 0,25 điểm
- Ghi dãy tăng dần hay không cho 0,75 điểm
- Ghi số cặp xung khắc cho 0,75 điểm
- Ghi cặp đôi lý t ởng cho 0,25 im
+ Bốn test sau, test ®iĨm:
(Khơng cho điểm ghi N, S, FN nữa)
- Ghi dãy tăng dần hay không cho 0, 25 điểm
- Ghi số cặp xung khắc cho 0,50 điểm
- Ghi cặp đôi lý t ởng cho 0,25 điểm
{B i - DIENTICH.PAS}à
var a,b,x:integer;
min, max,s,s1,s2:real; f: text;
begin
Assign(f,'dt.inp'); reset(f);
readln(f,a,b,x); close(f);
writeln(a,’ ‘,b,’ ‘,x); s1:=a*b; s2:=x*(b-x)/2; min:=s1/2; max:=s1/2; for x:=1 to b
begin
s:=s1 - (a*x + x*(b-x) + b*(a-x))/2; if min>s then min:=s;
if max<s then max:=s;
end;
writeln(s1:12:1);writeln(s2:12:1);
writeln(max:12:1);writeln(min:12:1);
readln; end
{B i - DAYSO.PAS}à
uses crt;
const fi = 'dayso.inp'; max = 500;
var a:array[1 500] of word;
so:array[1 4,0 9,0 9] of boolean; f:text; tangdan:boolean;
n,s,fn,socu:word; Tongxk:longint; procedure nhap;
var i,k:word; begin
fillchar(a,sizeof(a),0); assign(f,fi);
reset(f);
socu:=0; tangdan:=true;
readln(f,n,s);
(96)begin
readln(f,k);
inc(a[k]);
if k<socu then tangdan:=false;
socu:=k;
if k>100 then
so[k div 100,(k div 10)mod 10,k mod 10]:=true;
end;
fn:=k;
close(f); end;
procedure demxungkhac; var i:word;
begin
tongxk:=0;
for i:= to ((s-1)div 2)
tongxk:=tongxk+a[i]*a[s-i];
if not odd(s) then
begin
i:=s div 2;
tongxk:=tongxk+(a[i]*(a[i]-1) div 2);
end;
end;
procedure timlytuong; var i,j,k:byte;
begin
for i:=1 to
for j:=0 to
for k:=0 to
if so[i,j,k] then
begin
if (j<>k)and so[i,k,j] then
begin write(i,j,k,' ',i,k,j); exit; end;
if (k<>0)and(i<>k)and so[k,j,i] then
begin write(i,j,k,' ',k,j,i); exit; end;
if (j<>0)and(i<>j)and so[j,i,k] then
begin write(i,j,k,' ',j,i,k); exit; end;
if (k<>0)and((i<>j)or(i<>k)or(k<>j))and so[k,i,j] then
begin write(i,j,k,' ',k,i,j); exit; end;
if (j<>0)and((i<>j)or(i<>k)or(k<>j))and so[j,k,i] then
begin write(i,j,k,' ',k,j,i); exit; end;
end;
writeln(0,' ',0);
end;
procedure inkq; begin
clrscr;
writeln(n,' ',s,' ',fn);
if tangdan then writeln('CO') else writeln('KHONG'); demxungkhac;
writeln(tongxk); timlytuong; end;
begin
(97)