SKKN 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

SKKN 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

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 ”.

 

doc 24 trang thuychi01 8311
Bạn đang xem 20 trang mẫu của tài liệu "SKKN 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", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
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
MỤC LỤC
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 ”.
 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.
 Đố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
 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
NỘI DUNG
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)
Thực trạng của vấn đề nghiên cứu.
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ú. 
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. 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. 
Các biện pháp tổ chức thực hiện.
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;
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.
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.
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.
Hướng dẫn giải bài tập cụ thể :
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 x<A[k] thì tìm ở đoạn đầu của mả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;
 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 x<b[giua] then cuoi:=giua - 1 else dau:=giua + 1;
 end;
 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
 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:
 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 *)
 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: 
+ 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]<a[j] then
 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 x<a[n] then a[n+1]:=x {Chèn vào cuối mảng}
 Else
 Begin 
 for i:=1 to n do {Tìm vị trí k}
 If a[i]<x then
 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:
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]<a[j] then
 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
 for j:=i+1 to n do
 if b[i]<b[j] then
 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-1<m then 
 for i:=i to m do
 begin
 k:=k+1; c[k]:=a[i];
 end;
 if j-1<n then 
 for 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:
Chuyên đề về dãy con
 Phương pháp: 
- 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:
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 Max<d thì Max :=d và Vt :=i. 
Ví 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;
b

Tài liệu đính kèm:

  • docskkn_mot_so_bien_phap_giai_cac_dang_bai_tap_ve_su_dung_bien.doc