Tải bản đầy đủ (.doc) (25 trang)

Một số biện pháp giải các dạng bài tập về sử dụng biến mảng trong pasal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.49 MB, 25 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HÓA
PHÒNG GIÁO DỤC VÀ ĐÀO TẠO THẠCHTHÀNH

TRƯỜNG THCS DÂN TỘC NỘI TRÚ

SÁNG KIẾN KINH NGHIỆM

ĐỀ TÀI
“MỘT SỐ BIỆN PHÁP GIẢI CÁC DẠNG BÀI TẬP VỀ SỬ DỤNG
BIẾN MẢNG TRONG PASCAL”

Người thực hiện: Lê Thị Tân
Chức vụ: Giáo viên
Đơn vị công tác: Trường THCS Dân tộc nội trú
SKKN thuộc lĩnh mực (môn): Tin học

THANH HOÁ NĂM 2017

1


MỤC LỤC

1. MỞ ĐẦU........................................................................................................................ 3

1.1 Lý do chọn đề tài..............................................................................................3
1.2

Mục đích nghiên cứu:...................................................................................3

1.3



Đối tượng nghiên cứu:..................................................................................3

1.4

Phương pháp nghiên cứu:............................................................................3

2. NỘI DUNG............................................................................................................... 4

2.1

Cơ sở lý luận:................................................................................................4

2.2

Thực trạng của vấn đề nghiên cứu..............................................................4

2.2.1 Thuận lợi:.............................................................................................................. 4
2.2.2 Khó khăn:.............................................................................................................4

2.3

Các biện pháp tổ chức thực hiện.................................................................5

2.3.1 Những kiến thức cơ bản về dữ liệu kiểu mảng:..................................................5
2.3.2 Giới thiệu tài liệu tham khảo:..............................................................................5
2.3.3 Phân dạng bài tập:...............................................................................................5
2.3.4 Hướng dẫn giải bài tập cụ thể :...........................................................................6
2.3.4.1


Kiểm tra phần tử trong mảng một chiều:..................................................6

2.3.4.2

Chèn, xoá phần tử trong mảng, trộn mảng sao cho mảng vẫn giữ được

thứ tự tăng hoặc giảm..................................................................................................8
2.3.4.3

Chuyên đề về dãy con...............................................................................12

2.3.4.4

Tìm phần tử lớn nhất, nhỏ nhất của mảng hai chiều..............................15

2.3.4.5

Tìm phần tử lớn nhất, nhỏ nhất của mỗi dòng, mỗi cột và phần tử yên

ngựa của mảng hai chiều..........................................................................................17
2.3.4.6

2.4
3.

Sắp xếp mảng hai chiều...........................................................................19

Hiệu quả cách làm:.....................................................................................21

KẾT LUẬN VÀ KIẾN NGHỊ...................................................................................22


3.1

Bài học kinh nghiệm :.................................................................................22

3.2

Kiến nghị, đề xuất :....................................................................................22

3.3

Tài liệu tham khảo..............................................................................................22

2


1. MỞ ĐẦU
1.1 Lý do chọn đề tài
Cuộc cách mạng công nghiệp lần thứ tư (công nghiệp 4.0) với sự xuất hiện
của robot có trí tuệ nhân tạo đã tác động mạnh mẽ trên nhiều lĩnh vực như Y tế, Văn
hoá, Kinh tế, Nông nghiệp ... và trong đó có Giáo dục. Đảng và Nhà nước đã xác
định được tầm quan trọng của CNTT và các ứng dụng CNTT trong việc đào tạo
nguồn nhân lực đáp ứng yêu cầu CNH, HĐH, mở cửa và hội nhập, hướng tới nền
kinh tế tri thức của nước ta nói riêng và thế giới nói chung. Vì vậy môn Tin học
được đưa vào nhà trường THCS là môn tự chọn, môn đặc thù.
Ở huyện Thạch Thành môn Tin học mới chỉ dừng lại ở việc dạy cho các em
những kiến thức, kỹ năng cơ bản, mà chưa tổ chức thi HSG, nên các trường THCS
chưa bồi dưỡng học sinh giỏi bộ môn này.
Năm học 2015- 2016 Sở GD và ĐT tổ chức cuộc thi “Tài năng tin học trẻ”,
toàn tỉnh lần thứ XIX, nhưng huyện Thạch Thành chúng tôi mới tham dự lần đầu

tiên, trường tôi có 3 học sinh dự thi và có một học sinh đạt giải ba. Sau đợt bồi
dưỡng chọn học sinh giỏi này, đối với bản bản thân tôi là một giáo viên tôi thấy
mình có điều kiện cọ sát và nghiên cứu sâu hơn về phương pháp giải các bài tập
pascal. Còn đối với học sinh, các em cũng có điều kiện thể hiện năng lực của bản
thân mình, hơn nữa các em thêm yêu thích môn học hơn. Để học sinh đạt được kết
quả cao trong các kỳ thi học sinh giỏi, tôi nhận thấy việc phát hiện nhân tố là quan
trọng nhưng quá trình bồi dưỡng các em còn quan trọng hơn nhiều vì sự ôn luyện là
cả một quá trình nỗ lực của cả cô và trò.
Từ thực tế bồi dưỡng tập huấn học sinh giỏi tôi thấy việc phân dạng, loại bài
tập của từng phần là một việc vô cùng quan trọng. Có làm được điều này mới cung
cấp, trang bị cho các em một hệ thống kiến thức vừa vững chắc vừa cơ bản để từ đó
định hướng và hình thành cho các em phương pháp nghiên cứu và tìm hiểu sâu hơn
nữa những đơn vị kiến thức mới và khó .
Từ những căn cứ nêu trên tôi chọn đề tài “Một số biện pháp giải các dạng bài
tập về sử dụng biến mảng trong Pascal ”.
1.2 Mục đích nghiên cứu:
- Hướng dẫn học sinh có phương pháp nghiên cứu, học tập đạt kết quả, có kỹ
năng giải các dạng bài tập về sử dụng biến mảng trong Pascal.
- Bản thân giáo viên được rèn luyện thêm các kỹ năng, thu thập, trau dồi kiến
thức trong quá trình giảng dạy và công tác bồi dưỡng học sinh giỏi.
1.3 Đối tượng nghiên cứu:
- Kiến thức về các dạng bài tập về sử dụng biến mảng trong Pascal
1.4 Phương pháp nghiên cứu:
- Phương pháp kiểm tra khảo sát thực tế: Kiểm tra, khảo sát thực tế học sinh
đội tuyển Tin học 8 năm học 2015-2106. để thấy những bất cập mà học sinh đang
gặp phải.
- Phương pháp thu thập thông tin: Tìm hiểu tài liệu từ các giáo trình, và tham
khảo tài liệu trên mạng Internet.
- Phương pháp thống kê, xử lý số liệu


3


2. NỘI DUNG
2.1 Cơ sở lý luận:
Thực hiện Nghị quyết số 29/NQ-TW ngày 04/11/2013 của Hội nghị Trung
ương 8 khóa XI về Đổi mới căn bản, toàn diện Giáo dục và Đào tạo đáp ứng yêu
cầu công nghiệp hóa – hiện đại hóa trong điều kiện kinh tế thị trường định hướng xã
hội chủ nghĩa và hội nhập quốc tế. Mục đích nhằm nâng cao chất lượng
dạy và học, đồng thời để đào tạo, bỗi dưỡng nhân tài cho địa
phương, cho đất nước. Việc nâng cao chất lượng dạy và học là mục
tiêu trọng tâm của ngành giáo dục và đào tạo, trong đó việc bồi
dưỡng học sinh giỏi là nhiệm vụ mũi nhọn. (Nghị quyết số 29/NQ-TW Hội nghị
Trung ương 8 khóa XI)
Theo nghị quyết 40/2000/QH10, Chỉ thị 29/CT của Trung Ương Đảng và chỉ
thị 14/2001/CT-TTG ngày 9/12/2000 về việc đổi mới chương trình giáo dục phổ
thông: Nội dung chương trình là tích cực áp dụng một cách sáng tạo các phương
pháp tiên tiến, hiện đại, ứng dụng CNTT vào dạy, học và đưa CNTT vào nhà
trường.(Nghị quyết 40/2000/QH10, Chỉ thị 29/CT của Trung Ương Đảng và chỉ thị
14/2001/CT-TTG)
2.2 Thực trạng của vấn đề nghiên cứu.
2.2.1 Thuận lợi:
Được sự quan tâm của nhà nước, của các cấp lãnh đạo đã đầu tư cơ sở vật chất,
trang thiết bị dạy học tương đối đầy đủ đảm bảo phục vụ giảng dạy bộ môn Tin học.
Nhà trường và các bậc phụ huynh đã tạo điều kiện sửa chữa thiết bị, kết nối
Internet phục vụ việc học tập và tra cứu tài liệu của cả cô và trò.
Đa phần học sinh ngoan ngoãn, chăm chỉ, có quyết tâm cao
Được sự quan tâm, giúp đỡ, động viên, tạo điều kiện của Ban giám hiệu và các
giáo viên bộ môn khác.
Thời gian thi thường được tổ chức vào cuối tháng 6, khi các cuộc thi khác các

em cũng đã hoàn thành, vì vậy cũng thu hút được một số ít học sinh tham gia và sau
đó các em cũng rất hứng thú.
2.2.2 Khó khăn:
- Do PGD chưa tổ chức thi HSG các cấp nên học sinh chưa được cọ sát, giáo
viên chưa có kinh nghiệm và không có điều kiện để học hỏi lẫn nhau về việc bồi
dưỡng học sinh giỏi
- Các bậc phụ huynh cho rằng môn Tin không cần thiết sợ học môn này con sẽ
sa đà vào điện tử, sợ mất nhiều thời gian của con nên ít động viên con tham dự,
- Phần kiến thức để dự thi tất cả tập trung vào lớp 8 phần PASCAL FREE,
đây là một chương trình khó mà phần chương trình này thì tất cả các trường THCS
trên địa bàn huyện đều cắt đi để thay vào đó là chương trình nghề Tin học.
Thời gian bồi dưỡng ít, nên những phần kiến thức cơ bản còn chưa kịp nhần
nhuyễn đến khi đi sâu vào những phần khó như “Chương trình con” sau đó là “dữ
liệu kiểu mảng”, “dữ liệu kiểu File” ... thì các em thường rất mơ hồ và lúng túng.
Ban đầu các em thấy rất khó và có phần chán nản.
Với thực trạng trên tôi chọn chủ đề: “Một số biện pháp giải các dạng bài tập
về sử dụng biến mảng trong Pascal ” nhằm bồi dưỡng cho đối tượng học sinh giỏi
môn Tin học có thể làm tốt các bài tập phần Mảng một cách chủ động, sáng tạo.

4


Giúp các em biết phân tích thuật toán từ đó viết được các chương trình có kết quả
chính xác và có sự sáng tạo về giải thuật.
2.3 Các biện pháp tổ chức thực hiện.
2.3.1 Những kiến thức cơ bản về dữ liệu kiểu mảng:
Trong pascal khi nói về mảng với các bài tập cơ bản thì rất đơn giản, nhưng
khi bồi dưỡng sâu về phần này thì lại rất nặng về tư duy thuật toán, nhất là phần
mảng hai chiều thì còn khó hơn nhiều. Bởi vậy nếu các em nắm chắc phần Mảng
thì đến tập hợp (set), bản ghi (record), File ...các em sẽ thấy nhẹ nhàng hơn nhiều.

* Định nghĩa về Mảng: Mảng là môt kiểu dữ liệu có cấu trúc gồm một số hữu hạn
các phần tử có cùng kiểu gọi là kiểu cơ bản, có cùng một tên chung. Số phần tử của
mảng được xác định ngay từ khi định nghĩa hoặc khai báo mảng [1] .
- Khi sử dụng biến mảng có thể định nghĩa hoặc khai báo trực tiếp.
+ Định nghĩa mảng:
TYPE Kieu_mang _T= ARRAY[kiêu chỉ dẫn] OF Kiểu_phần_tử;
Khi đó khai báo một biến A có kiểu mảng ta có thể khai báo như sau:
VAR A: Kieu_mang _T;
+ Khai báo trực tiếp: VAR A = ARRAY [kiêu_chỉ_dẫn] OF Kiểu_phần_tử;
- Mỗi phần tử của mảng chứa một giá trị và được truy nhập trực tiếp thông qua
tên mảng cùng với chỉ dẫn truy nhập được để giữa hai dấu ngoặc vuông [ ].
- Cấu trúc mảng thuộc kiểu cấu trúc truy nhập trực tiếp nên thời gian truy nhập
vào một phần tử của mảng không phụ thuộc vào giá trị của chỉ dẫn [2].
* Mảng một chiều: là mảng dùng một chỉ số để xác đinh các phần tử của mảng.
VD: VAR M:ARRAY [1..1000] OF REAL;
* Mảng hai chiều: là mảng dùng hai chỉ số để xác đinh các phần tử của mảng.
Mảng hai chiều là một bảng số liệu gồm các hàng và các cột, chỉ số đầu để chỉ
hàng, chỉ số thứ hai để chỉ cột [1]
VD: VAR M:ARRAY [1..1000, 1..1000] OF REAL;
2.3.2 Giới thiệu tài liệu tham khảo:
Để có hiệu quả phần này, giáo viên nên giới thiệu cho học sinh nguồn tài liệu
tham khảo:
- SGK Tin học quyển 3
- SBT Bài tập Tin học quyển 3
- Giáo trình tin học căn bản – Tác giả :Bùi thế Tâm
- Ngôn ngữ lập trình PASCAL - Tác giả : Quách Tấn Ngọc
- Bài tập Pascal – tác giả Bùi Thế Tâm.
2.3.3 Phân dạng bài tập:
Có thể phân dạng các bài tập nâng cao theo chuyên đề (từng mảng kiến thức),
từ dễ đến khó, từ đơn giản đến phức tạp để học sinh có thể chủ động tiếp thu kiến

thức một cách tự tin, từ đó các em có thể tự giải quyết được các bài tập một cách
chủ động sáng tạo.Có thể phân thành các chuyên đề như sau:
Chuyên đề 1: Kiểm tra phần tử trong mảng một chiều.
Chuyên đề 2: Xoá, chèn các phần tử, trộn mảng sao cho mảng vẫn giữ nguyên
thứ tự mà không phải sắp xếp lại.
Chuyên đề 3 Chuyên đề về dãy con.
Chuyên đề 4: Tìm phần tử lớn nhất, nhỏ nhất của mảng hai chiều.

5


Chuyên đề 5: Tìm phần tử lớn nhất, nhỏ nhất của mỗi dòng, mỗi cột và phần
tử yên ngựa của mảng hai chiều.
Chuyên đề 6: Sắp xếp mảng hai chiều.
2.3.4 Hướng dẫn giải bài tập cụ thể :
2.3.4.1
Kiểm tra phần tử trong mảng
một chiều:
* Phương pháp:
- Nhập vào phần tử x, sử dụng vòng lặp lần lượt so sánh phần tử x với các phần
tử trong mảng, trong quá trình so sánh nếu thấy x=a[i] thì đưa ra thông báo.
+ Hướng dẫn học sinh xây dựng hàm kiểm tra phần tử x trong mảng A.
Hàm kiểm tra có thế viết như sau:
Function ktra(x,n:integer;A:mang ): boolean;
Var i:byte; KT:Boolean;
Begin
Kt:=false;
For i:=1 to n do if x=a[i] then kt:= True;
ktra:=Kt;
End;

+ Sau đó ta có thể sử dụng hàm kiểm tra để giải quyết các yêu cầu tiếp theo
của bài toán.
+ Cũng có thể sử dụng phương pháp tìm kiếm nhị phân: k := n mod 2. So
sánh x với phần tử ở giữa của mảng A[k]. Nếu x=A[k] thì dừng, ngược lại nếu
x>A[k] thì tìm ở đoạn sau của mảng [k+1, n], nếu xmảng [1,k-1]. [2]
Ví dụ 1: Nhập vào 1 mảng A, sắp xếp theo thứ tự tăng dần. Nhập thêm vào 1 phần
tử x, sử dụng phương pháp tìm kiếm nhị phân hãy kiểm tra xem x có trong mảng A
hay không? [4]
Chương trình được viết như sau:
program Tim_Kiem_nhi_phan;
uses crt;
var dau,cuoi,giua,n,i,j,luu,x:integer;
b:array[1..100] of integer; t:boolean;
BEGIN clrscr;
write('nhap vao gia tri n=');readln(n);
for i:=1 to n do
Begin
write('nhap cac phan tu cho mang B[',i,' ]=');readln(b[i]); writeln;
End;
for i:=1 to (n-1) do
for j:=i+1 to n do
if b[i]>b[j] then {Sap xep mang}
Begin
luu:= b[i];
b[i]:= b[j];
b[j]:=luu;
End;
writeln('Day so sau khi da xap xep la :');
for i:=1 to n do write(b[i]:4,' ');

writeln;
write('nhap x='); readln(x); dau:=1;
cuoi:=n;
t:=false;
6


while (cuoi>=dau) and (t=false) do
begin
giua:=(dau + cuoi) div 2;
if x=b[giua] then
begin
t:=true;break; {Tim thay thi dung lai}
end
else
if xend;
if t=true then writeln(x,' co trong mang') else writeln(x,' khong co trong mang');
readln; END.
Ví dụ 2 : Nhập vào 2 mảng A, B gồm các số nguyên đại diện cho hai tập hợp.Trong
quá trình nhập phải kiểm tra: Nếu phần tử vừa nhập đã có trong mảng thì không bổ
xung vào mảng nữa. In ra màn hình các phần tử không phải là giao của hai tập hợp.
Chương trình được viết như sau :
Program Giao_hai_tap_hop;
uses crt;
type mang= array [1..1000] of integer;
var a,b:mang; i,x,n:byte;
Function ktra(x,n:integer;A:mang ): boolean; {ktra phan tu X co trong tap hop chua}
Var i:byte; KT:Boolean;
Begin

Kt:=false;
For i:=1 to n do if x=a[i] then kt:= True; ktra:=Kt;
End;
procedure nhap(n:byte;var A:mang); ; (* Thu tuc nhap phan tu cho tap hop*)
var i,j: byte
Begin
Write('Nhap phan tu thu nhat cua mang ='); readln(x); a[1]:=x; i:=2;
Repeat
Write('X[ ',i,'] ='); readln(x);
for j:=1 to i-1 do if not ktra(x,n,A) then
begin
a[i]:=x; i:=i+1;
end;
Until i>n; n:=i-1;
Write('MANG VUA NHAP LA');
For i:=1 to N do Write(a[i],'; '); Writeln;
End;
Procedure Kgiao(n:byte; A:mang;m:byte; B:Mang);{Tim nhung phan tu khong la giao}
var i:byte;
Begin
For i:=1 to n do
If not ktra(a[i],n,B) then Write(A[i]:6);
For i:=1 to n do
7


If not ktra(b[i],n,A) then Write(B[i]:6);
End;
BEGIN{chuong trinh chinh }
clrscr; write('nhap so phan tu cua mang la:');readln(n); writeln;

Writeln('NHAP MANG A :');Writeln; nhap(n,a); writeln;
Writeln('NHAP MANG B :');Writeln; Nhap(n,b); writeln;
Write('Nhung phan tu khong phai la giao cua hai tap hop:'); Kgiao(n,A,n,B);
readln;END.
- Kết quả của chương trình:

2.3.4.2

Chèn, xoá phần tử trong mảng,
trộn mảng sao cho mảng vẫn giữ được thứ tự tăng hoặc giảm.
 Xoá một phần tử thuộc vị trí k:
- Phương pháp:
+ Nếu mảng chưa sắp xếp thì cần phải sắp xếp lại mảng.
+ So sánh x với các giá trị trong mảng, nếu tìm thấy đánh dấu vị trí k.
+ Xoá phần tử k bằng cách ghi đè phần tử k+1 lên nó.
Ví dụ: Nhập vào một dãy số, sắp xếp dãy theo thứ tự tăng dần.
a. Xoá các phần tử có giá trị trùng nhau trong dãy.
b. Nhập thêm số X, kiểm tra xem giá trị X có trong dãy hay không? Nếu có hãy
xoá giá trị X sao cho dãy vẫn giữ giá trị tăng dần, in ra màn hình các số còn lại
trong dãy.
Chương trình được viết như sau:
program Xoa_phan_tu;
uses crt;
type mang=array[1..100] of integer;
var a: mang; d,k,tg,X,n,i,j:integer;
BEGIN
clrscr;
write('nhap vao do dai cua day so: n=');readln(n); Writeln;
Writeln('NHAP VAO CAC GIA TRI CUA DAY SO:');
for i:=1 to n do

Begin
write('a[',i,']=');readln(a[i]); WRITELN;
end;
(* sap xep mang *)
8


for i:=1 to n-1 do
for j:=i+1 to n do
if A[i]>A[j] then
Begin
tg:=A[i]; A[i]:=A[j]; A[j]:=tg;
End; WRITELN;
Write(' MANG VUA NHAP LA :'); For I:=1 To n do Write( a[i],' ; ');
i:=2; {XOA PHAN TU TRUNG TRONG DAY}
While i <=n Do
Begin
j:=1;
While a[j]<> a[i] Do j:=j+1;
If j < i Then
Begin
For k:=i to n-1 Do a[k]:=a[k+1]; n:=n-1;
End
Else
i:=i+1;
End; Writeln;
Write('DAY SO SAU KHI XOA PHAN TU TRUNG : ');
For i:=1 to n Do Write(a[i],'; '); Writeln; d:=0;
Write('NHAP SO CAN XOA TRONG DAY SO TREN X='); readln(x);
For i:=1 to n do If x= a[i] then

begin {danh dau vi tri k}
k:=i; d:=1;
end;
for i:=k to n do a[i]:=a[i+1];
If d=0 then Writeln(' Khong tim thay gia tri ',x,'trong day'); Writeln;
Write(' DAY SO SAU KHI XOA PHAN TU ',x,'LA : ');
FOR I:=1 TO n-d do Write(a[i],'; ');
Readln; End.
- Kết quả của chương trình:

 Chèn một phần tử vào vị trí k:
- Phương pháp:
9


+ Tìm vị trí cần chèn k
+ Nếu k=n thì chèn vào cuối mảng: A[n+1]:=x;
+ Ngược lại, dời các phần tử từ vị trí k tới n về sau 1vị trí và gán: A[i]=x;
Ví dụ : Viết chương trình chèn thêm 1 số nguyên vào 1 dãy số nguyên đã được
sắp xếp theo thứ tự tăng dần sao cho dãy số bảo toàn được thứ tự sắp xếp của nó.
Dãy số, các số hạng, số nguyên cần chèn được nhập từ bàn phím. (BT 9.13-[3])
Chương trình được viết như sau:

program CHEN_MANG;
uses crt;
type mang=array[1..100] of integer;
var a,b,c:mang; tg,X,n,i,j,l,k:integer;
BEGIN clrscr;
write('nhap vao so phan tu cua mang N=');readln(N);
for i:=1 to N do

begin
write('M[',i,']=');readln(a[i]);
end;
for i:=1 to n-1 do {Sap xep mang}
for j:=i+1 to n do
if a[i]begin
tg:=a[i]; a[i]:=a[j]; a[j]:=tg;
end;
write(' Mang vua nhap la : '); for i:=1 to n do write(a[i]:8); writeln;
Write('nhap vao so can chen x='); readln(x);
if xElse
Begin
for i:=1 to n do {Tìm vị trí k}
If a[i]begin
k:=i; {danh dau vi tri k} break; {thoat khoi vong lap sau khi tim thay}
End;
For i:=n downto k do a[i+1]:=a[i]; {doi cac phan tu tu k den n ve sau 1 vi tri}
a[k]:=x {chen x vao vi tri k} ;Writeln;
End; Writeln;
Write('MANG SAU KHI DA CHEN PHAN TU X= ',x,' LA:');
for i:=1 to n+1 do write(a[i]:8);
Readln; End.
- Kết quả của chương trình:

10



 Trộn hai mảnglại A, B với nhau để thành mảng C:
Phương pháp
- Dùng 2 chỉ số i,j để duyệt qua các phần tử của 2 mảng A, B và k là chỉ số cho
mảng C.
- Trong khi (i<=m) và (j<=n) thì kiểm tra:
+ 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 nào hết trước thì đem phần còn lại của dãy kia bổ sung vào cuối dãy C.
Ví dụ : Cho 2 mảng số nguyên A, B được sắp xếp theo thứ tự giảm dần. Trộn hai
mảng đó lại để có mảng thứ 3 là mảng C sao cho mảng C vẫn có thứ tự giảm dần
ngay sau khi trộn (BT 9 Tr175-[1])
Chương trình được viết như sau:
program tron_day_so;
uses crt;
type mang=array[1..100] of integer;
var a,b,c:mang;
tg,m,n,i,j,l,k:integer;
BEGIN
clrscr;
write('nhap vao so phan tu cua mang thu nhat m=');readln(m);
for i:=1 to m do
begin
write('M[',i,']=');readln(a[i]);
end;
for i:=1 to m-1 do
for j:=i+1 to m do
if a[i]begin
tg:=a[i]; a[i]:=a[j]; a[j]:=tg; {Sap xep mang A}
end;

write(' Mang vua nhap la : '); for i:=1 to m do write(a[i]:4); writeln;
write('nhap vao so phan tu cua mang B la: n='); readln(n);
for j:=1 to n do
begin
write('b[',j,']='); readln(b[j]);
end;
for i:=1 to n-1 do
11


for j:=i+1 to n do
if b[i]begin
tg:=b[i]; b[i]:=b[j]; b[j]:=tg; {Sap xep mang B}
end;
writeln(' Mang B:');
for i:=1 to n do write(b[i]:4); writeln; {In mang B}
j:=1; i:=1; k:=0; {Tron 2 mang}
while (i<=m) and (j<=n) do {Khi 2 mang deu chua duyet het}
begin
k:=k+1; {k la chi so cua mang C}
if a[i]>b[j] then {so sanh A[i] và B[j] neu phan tu nao lon hon thi day vao C}
begin
c[k]:=a[i]; i:=i+1;
end
else
begin
c[k]:=b[j]; j:=j+1;
end;
end; {Neu day nao het truoc thi dem phan con lai cua day kia day vao mang C}

if i-1for i:=i to m do
begin
k:=k+1; c[k]:=a[i];
end;
if j-1for j:=j to n do
begin
k:=k+1; c[k]:=b[j];
end;
Writeln('MANG SAU KHI DA TRON :');
for i:=1 to k do write(C[i]:4);
Readln; END.
- Kết quả của chương trình:

2.3.4.3
 Phương pháp:

Chuyên đề về dãy con

12


- Dãy con là dãy các phần tử liên tục thuộc một dãy cho trước (Dãy mẹ) thoả mãn
một tính chất nào đó như: dãy con tăng dần, dãy con đơn điệu, dãy con nguyên tố....
- Để quản lý một dãy con có thể dựa vào một trong hai dữ kiện sau:
+ Xác định được chỉ số (nơi bắt đầu dãy con) và độ dài của dãy.
+ Xác định chỉ số đầu, chỉ số cuối của dãy
- Để xây dựng dãy con cần:
+ Xây dựng giá trị ban đầu

+ Duyệt qua tất cả các phần tử của dãy nếu thoả mãn điều kiện thì tăng độ dài
lên 1 và ngược lại.
 Dạng 1: Dãy con cần tìm có độ dài xác định.
- Đối với dạng toán này ta dùng thuật toán vét cạn sau:
For i:=1 to n-m+1 do {gán khởi tạo giá trị}
For j:=1 to i+k- 1 do {Xét dãy con bắt đầu từ vị trí i có độ dài j}
Ví dụ: Nhập vào 1 dãy số nguyên A: : a1, a2, ..., an gồm n phần tử và một số nguyên
dương M. Tìm một dãy con gồm M phần tử liên tiếp nhau trong dãy A và có tổng
các phần tử là lớn nhất [5].
Chương trình được viết như sau:

program day_con_tong_lon_nhat;
uses crt;
var m,n,i,j,s,vtd,max,vtc:integer; a:array[1..100] of integer;
BEGIN
clrscr;
write('nhap vao do dai cua day so n='); readln(n);
for i:=1 to n do
begin
write('a[',i,']=');readln(a[i]);
end; Writeln;
write('nhap do dai cua day con la M='); readln(m); s:=0;
for i:=1 to m do s:=s+a[i]; max:=s;
for i:=2 to n do
begin
s:=0;
for j:=i to m+i-1 do s:=s+a[j];
if s>max then
begin
max:=s;

vtd:=i;
end;
vtc:=vtd+m-1;
end;
write('day con co do dai bat dau tu:',vtd,' den ',vtc,'gom co cac phan tu la');
for i:=vtd to vtc do write(a[i],' '); Writeln;
writeln('day con co tong lon nhat la:',max);
readln; End.
Kết quả chạy chương trình:

13


 Dạng 2: Dãy con cần tìm có độ dài chưa biết trước:
- Đối với dạng toán này cần sử dụng kỹ thuật xây dựng dãy con:
+ Xây dựng giá trị ban đầu.
+ Duyệt qua tất cả các phần tử của dãy nếu thoả mãn điều kiện thì tăng độ dài lên
1 và ngược lại.
+ Sử dụng biến Max lưu lại độ dài dãy con lớn nhất, biến Vt để lưu vị trí phần tử
đầu tiên của dãy con lớn nhất thoả điều kiện, và biến dd lưu lại độ dài của dãy con
đang xét
+ Sau mỗi lần duyệt 1 dãy con : Nếu MaxVí dụ: Nhập vào n số nguyên. Tìm dãy con gồm các số nguyên tố dài nhất.
Chương trình viết như sau:

program day_con_nguyen_to;
uses crt;
Var m: array[1..100] of integer; i, n, dd, vtc ,vtd, max:Integer;
function ktnt(n:integer):boolean; {ham kiem tra so nguyen to}
var i:integer; kt:boolean;

begin
kt:=true;
for i:=2 to n-1 do if n mod i=0 then kt:=false;
if n<2 then ktnt:=false else ktnt:=kt;
end;
BEGIN
clrscr;
write(' nhap n=');readln(n); Writeln;
for i:=1 to n do
begin
write(' m[',i,']='); readln(m[i]); Writeln;
End;
Write(' DAY SO VUA NHAP LA:');
for i:=1 to n do Write(M[i]:6); Writeln;
i:=1;vtc:=1;max:=1;
while ibegin
dd:=1;
while (ibegin
dd:=dd+1; i:=i+1
end;
14


if max
begin
max:=dd; vtc:=i;
end;
i:=i+1;

end;
vtd:=vtc-max+1; WRITELN;
Writeln(' DAY CON NGUYEN TO DAI NHAT TRONG DAY SO TREN GOM
CO ',max, ' PHAN TU');WRITELN;
writeln(' BAT DAU TU: ',vtd,' den ',vtc); writeln;
write(' CAC PHAN TU CUA DAY CON NGUYEN TO LA : ');
for i:=vtd to vtc do write(m[i],'; ');
readln; End.
Kết quả chương trình:

* Nếu tìm dãy con bậc thang hay dãy con hoàn hảo thì cũng chỉ cần xây dựng hàm
kiểm tra số bậc thang hay hàm kiểm tra số hoàn hảo sau đó áp dụng giải thuật trên
là thực hiện được.
2.3.4.4
Tìm phần tử lớn nhất, nhỏ nhất
của mảng hai chiều
 Phương pháp:
- Gán MAX, Min là A[1,1] sau đó dùng 2 vòng lặp FOR duyệt tất cả các phần tử
của mảng để tìm phần tử lớn hơn MAX và nhỏ hơn Min, nếu tìm được thì gán lại
giá trị mới cho MAX và cho Min
Ví dụ: Nhập vào một mảng hai chiều, tìm phần tử lớn nhất, nhỏ nhất của mảng hai
chiều.
Chương trình được viết như sau:

Program Tim_Max_Min_cua_mang_hai_chieu;
USES crt;
Type mang=array[1..100,1..100] of integer;
var A:mang; t,k,l, m,n,i,j:integer;
procedure nhapmang; {thu tuc nhap mang}
var i,j:integer;

begin
write(' NHAP SO DONG = ');readln(m); WRITELN;
15


write(' NHAP SO COT = ');readln(n); WRITELN;
for i:=1 to m do
for j:=1 to n do
begin
write(' A[',i,',',j,']='); readln(A[i,j]);
end; WRITELN;
Writeln('MANG VUA NHAP LA :'); Writeln;
for i:=1 to m do
begin
for j:=1 to n do write(A[i,j]:6); writeln;
end;
end;
Function Tim_min(A:mang; m,n:integer):integer;{ham tim min cua mang}
var j,i, Min:byte;
Begin
Min:= A[1,1];
For i:=1 to m do
for j:=1 to n do
if Min>A[i,j] then
begin
Min:=A[i,j]; k:=i;
L:=j; {Luu lai vi tri cua phan tu nho nhat}
End;
Tim_min:=min;
End;

Function Tim_max(A:mang; m,n:integer):integer;{ham tim max cua mang}
var j,i, max:byte;
Begin
Max:= A[1,1];
For i:=1 to m do
for j:=1 to n do
if Mbegin
Max:=A[i,j];
k:=i;
L:=j; {Luu lai vi tri cua phan tu lon nhat}
End;
Tim_max:=max;
End;
BEGIN
clrscr; nhapmang; writeln;
Write(' PHAN TU NHO NHAT CUA MANG LA :',Tim_min(A,m,n));
writeln(' tai vi tri : a[',k,',',l,']'); Writeln;
Write('
PHAN TU LON NHAT CUA MANG =',Tim_max(A,m,n));
writeln(' tai vi tri : a[',k,',',l,']');
readln; END.
- Kết quả chạy chương trình:

16


2.3.4.5

Tìm phần tử lớn nhất, nhỏ nhất

của mỗi dòng, mỗi cột và phần tử yên ngựa của mảng hai chiều
 Phương pháp:
- Tìm phần tử lớn nhất, nhỏ nhất của mỗi dòng, mỗi cột:
+ Cần phải khai báo thêm 4 mảng 1 chiều để lưu trữ phần MAX[cột i];
Max[dòng i]; Min[dòng i]; Min[cột i];
+ Đầu tiên ta gán M[1,j] là Maxd và Mind rồi duyệt tất cả các phần tử của
dòng i để tìm Maxd và Mind của dòng ấy, dữ liệu tìm được sẽ gán cho Maxd[i] và
Mind[i]. Tương tự ta gán M[i,1] là Maxc và Minc rồi duyệt tất cả các phần tử của
cột j để tìm Maxc và Minc của cột ấy, dữ liệu tìm được sẽ gán cho Maxc[j] và
Minc[j].
- Tìm phần tử yên ngựa của mảng hai chiều:
+ Phần tử A[i,j] được gọi là “yên ngựa” của mảng 2 chiều nếu nó đồng thời là
phần tử nhỏ nhất cả dòng i và là phần tử lớn nhất của cột j, hoặc A[i,j] phải là phần
tử lớn nhất của dòng i và là phần tử nhỏ nhất của cột j.
+ Để xác định phần tử yên ngựa
Bước 1 : Tìm phần tử lớn nhất và nhỏ nhất của mỗi dòng và mỗi cột
Bước 2 : Sử dụng tuật toán sau để tìm phần tử yên:
for i:=1 to m do
for j:=1 to n do
if (maxd[i]=minc[j]) or (mind[i]=maxc[j]) then
writeln('yen ngua cua dong ',i,', cot ',j,' la:',mang[i,j]);
 Ví dụ: Phần tử A[i.j] gọi là phần tử yên ngựa nếu nó là phần tử lớn nhất của
dòng i và là phần tử nhỏ nhất của cột j (hoặc nó là phần tử nhỏ nhất của dòng i và là
phần tử lớn nhất của cột j). Nhập vào mảng A[1..m, 1..n] và in ra tất cả các phần tử
yên ngựa của mảng.(BT 7.13-[2])
Chương trình được viết như sau:

Program max_min_dong_co_ yen_ngua;
uses crt;
var maxd,maxc,mind,minc:array[1..100] of integer;

mang:array[1..100,1..100] of integer; t, m,n,i,j:integer;
procedure nhapmang;
var i,j:integer;
begin
write('nhap so dong = '); readln(m); write('nhap so cot = '); readln(n);
17


for i:=1 to m do
for j:=1 to n do
begin
write('mang[',i,',',j,']=');
readln(mang[i,j]);
end;
Writeln('mang vua nhap la:');
for i:=1 to m do
begin
for j:=1 to n do write(mang[i,j]:6);
writeln;
end;
end;
procedure maxmindong;
var j,i:integer;
begin
for i:=1 to m do { tim max, min dong}
begin
maxd[i]:=mang[i,1]; mind[i]:=mang[i,1];
for j:=2 to n do
begin
if maxd[i]

maxd[i]:=mang[i,j];
if mind[i]>mang[i,j] then
mind[i]:=mang[i,j];
end;
end;{In ra max, min dong}
write('max dong : ' ); for i:=1 to m do write(i:6); writeln;
GOTOXy(12,Wherey); {dua con tro den dong hien tai, cot 12}
for i:=1 to m do Write(maxd[i]:6); writeln; Write(' min dong :');
for i:=1 to m do write(i:6); writeln; GOTOXy(12,Wherey);
for i:=1 to m do Write(mind[i]:6); writeln;
end;
procedure maxmincot; {thu tuc tim max, min cot}
var i,j:integer;
begin
for j:=1 to n do {tim max, min cot}
begin
maxc[j]:=mang[1,j];minc[j]:=mang[1,j];
for i:=2 to m do
begin
if maxc[j]if minc[j]>mang[i,j] then minc[j]:=mang[i,j];
end;
end; Writeln; {In ra max, min cot}
Write(' max cot :'); for j:=1 to n do write(j:6); writeln; GOTOXy(12,Wherey);
for j:=1 to n do Write(maxc[j]:6);writeln;
Write(' min cot :'); for j:=1 to n do write(j:6); writeln; GOTOXy(11,Wherey);
for j:=1 to n do Write(minc[j]:6); writeln;
end;
18



BEGIN
clrscr;
nhapmang; writeln; maxmindong; writeln; maxmincot;
t:=0; {===================tim yen===========================}
for i:=1 to m do
for j:=1 to n do
begin
if (maxd[i]=minc[j]) or (mind[i]=maxc[j]) then
begin
writeln(' YEN NGUA LA A[',i,',',j,']= ',mang[i,j]); t:=mang[i,j];
end;
end;
if t=0 then writeln('khong co phan tu yen ngua');
readln; END.
- Kết quả chạy chương trình:

2.3.4.6
Sắp xếp mảng hai chiều
 Phương pháp:
- Đây là một dạng bài tập khó. Trong mảng hai chiều, sắp xếp là đặt các phần
tử vào 1 mảng tuân theo một quy luật nào đó.
- Phương pháp thường được dùng là biến mảng hai chiều thành mảng 1 chiều
rồi sau khi sắp xếp mảng một chiều này ta sẽ gán chúng trở lại mảng hai
chiều đã cho theo quy tắc mà bài toán đòi hỏi.
+ Thuật toán biến mảng hai chiều thành mảng 2 chiều:
For i:=1 to n do
For j:=1 to m do
Begin
T:= t+1;

b[t]:= A[i,j];
End;

19


Ví dụ: Nhập vào 1 ma trận A[1..m,1..n]; Hãy sắp xếp lại mảng trên sao cho các
phần tử của chúng có giá trị tăng dần khi đi theo chiều xoáy trôn ốc từ ngoài vào
trong theo chiều kim đồng hồ như hình vẽ (BT 7.15-[2])
Xất phát

Ý tưởng giải thuật như sau:
- Biến mảng đã cho thành mảng 1 chiều sau đó sắp xếp theo chiều tăng dần.
- Điền mảng 1 chiều trở lại vào mảng hai chiều đảm bảo các phần tử được điền
vào theo hình xoắn ốc, dựa theo nguyên tắc sau:
+ Ở dòng 1 thì cột tăng dần.
+ Ở cột n thì cho dòng tăng dần.
+ Ở hàng m thì cột giảm dần
+ Ở cột 1 thì dòng giảm dần
Chương trình được viết như sau:
program manghaichieuxoanoc;
uses crt;
var a:array[1..100,1..100] of integer; b:array[1..100] of integer;
i,j,m,n,k,d,luu:integer;
BEGIN clrscr;
write('nhap vao so dong n='); readln(n);
write('nhap vao so cot m='); readln(m);
for i:=1 to n do
for j:=1 to m do a[i,j]:=random(50);
Writeln('MANG VUA NHAP LA:');WRITELN;

for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:3);
writeln;
end; k:=0;
for i:=1 to n do
for j:=1 to m do
begin
k:=k+1; b[k]:=a[i,j];
end;
for i:=1 to k-1 do {==== sap xep lai mang hai chieu======}
for j:=i+1 to k do
if b[i]>b[j] then
begin
luu:=b[i]; b[i]:=b[j]; b[j]:=luu;
end; writeln;
i:=1;k:=0; d:=0; {==== dat phan tu vao mang hai chieu theo hinh xoan oc =====}
20


While kbegin
d:=d+1;
for j:=d to m+1-d do
begin
k:=k+1; a[i,j]:=b[k];
end;
For i:=d+1 to n-d+1 do
begin

k:=k+1; a[i,j]:=b[k];
end;
for j:=m-d downto d do
begin
k:=k+1; a[i,j]:=b[k];
end;
for i:= n-d downto d+1 do
begin
k:=k+1; a[i,j]:=b[k];
end;
end; {=============In mang hai chieu sau khi da sap xep============}
writeln('MANG TREN DUOC SAP XEP TANG DAN THEO HINH XOAN OC :');
WRITELN; WRITELN;
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:3);
writeln;
end;
readln; E ND.
- Kết quả chạy chương trình:

- Ngoài việc sắp xếp mảng theo hình xoắn ốc còn có nhiều cách sắp xếp như sắp
xếp theo đường Zigzac, hoặc tăng hay giảm theo dòng, cột, hoặc sắp xếp theo bảng
Ma phương... Ta cần lưu ý đến sự đổi hướng của việc xây dựng ma trận kết quả.
2.4 Hiệu quả cách làm:
21


Chuyên đề “Các dạng bài tập về sử dụng biến mảng trong Pascal ” tôi đã

sử dụng để bồi dưỡng học sinh giỏi tham dự cuộc thi “Tài năng tin học trẻ” cấp
tỉnh do liên nghành tổ chức thì thấy việc học của các em có rất có hiệu quả. Các
em nắm bài vững chắc có hệ thống, tự biết vận dụng làm các bài tập tương tự và
nâng cao dẫn đến kết quả tương đối cao trong kì thi học sinh giỏi.
- Học sinh thành thạo vận dụng kiến thức kiểm tra phần tử trong mảng, biết
chèn, xoá phần tử trong mảng
- Học sinh thành thạo và vận dụng tốt phần mảng hai chiều...
Kết quả cụ thể :
- Cuối năm học vừa qua tôi có 3 học sinh dự thi thì có 1 em đạt giải ba cấp
tỉnh đó là em Quách Thị Thương lớp 8A.

3. KẾT LUẬN VÀ KIẾN NGHỊ
3.1 Bài học kinh nghiệm :
Khi bồi dưỡng học sinh thì sau mỗi một dạng bài giáo viên làm mẫu 1 đến 3
bài rồi tự giao bài cho các em làm và thu chấm hoặc cho học sinh giải mẫu để các
bạn khác nhận xét, sau đó giáo viên uốn nắn ngay những sai lệch về cả tư duy và
phương pháp lập trình .
Với những kinh nghiệm của mình chắc chắn trong bài viết còn có những hạn
chế nhất định, mong quý thầy cô bổ xung, hoàn thiện thêm cho hoàn chỉnh việc
phân loại và bồi dưỡng học sinh giỏi về phần “Sử dụng biến mảng trong Pascal”.
Hy vọng đây sẽ là một cách làm đề bạn bè cùng học hỏi, nâng cao tay nghề trong
chuyên môn.
3.2 Kiến nghị, đề xuất :
- PGD nên mở các cuộc thi HSG Tin học cấp huyện để học sinh và giáo viên có
điều kiện giao lưu học hỏi sau đó chọn HS tham dự các kì thi “Tài năng tin học
trẻ” hàng năm do tỉnh đoàn tổ chức.
XÁC NHẬN CỦA THỦ TRƯỞNG
ĐƠN VỊ

Thạch Thành, ngày 15 tháng 04 năm 2017

CAM KẾT KHÔNG COPY.
(Tác giả ký và ghi rõ họ tên)

Lê Thị Tân

22


Tài liệu tham khảo
[1] Ngôn ngữ lập trình PASCAL - Tác giả: Quách Tấn Ngọc
[2] Giáo trình tin học căn bản – Tác giả: Bùi thế Tâm
[3] SBT Bài tập Tin học quyển 3 (lớp 8).
[4] Bài tập Pascal – tác giả Bùi Thế Tâm
[5] Tài liệu ôn thi Tin học trẻ không chuyên

23


DANH MỤC
CÁC ĐỀ TÀI SÁNG KIẾN KINH NGHIỆM ĐÃ ĐƯỢC HỘI ĐỒNG ĐÁNH GIÁ XẾP
LOẠI CẤP PHÒNG GD&ĐT, CẤP SỞ GD&ĐT VÀ CÁC CẤP CAO HƠN
XẾP LOẠI TỪ C TRỞ LÊN

Họ và tên tác giả: Lê Thị Tân
Chức vụ và đơn vị công tác:Trường THCS Dân tộc nội trú Thạch Thành

T
T

1.

2.
3.

Tên đề tài SKKN

Sử dụng các bài tập trắc nghiệm khách quan trong
kiểm tra đánh giá thường xuyên
Rèn kỹ năng phân tích thuật giải cho bài toán lập
trình
Một số biện pháp rèn kỹ năng thực hành phần
soạn thảo văn bản
Một số kinh nghiệm sử dụng hàm IF và Hàm

4. Logic trong Excel thuộc chương trình Tin học 7 ở

Cấp
đánh giá Kết quả
Năm học đánh
xếp loại đánh giá
giá xếp loại
(Phòng, Sở, xếp loại
Tỉnh...)

Phòng

B

2008 - 2009

Phòng


B

2010 - 2011

Phòng

B

2012 - 2013

Phòng

B

2014 - 2015

trường THCS Dân tộc nội trú Thạch Thành

24


25


×