SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ TRƯỜNG THPT TRIỆU SƠN 1 SÁNG KIẾN KINH NGHIỆM TÊN ĐỀ TÀI “ HƯỚNG DẪN GIẢI CÁC BÀI TOÁN CƠ BẢN VỀ KIỂU DỮ LIỆU MẢNG TRONG ĐỀ THI HỌC SINH GIỎI ” Người thự
Trang 1
SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ
TRƯỜNG THPT TRIỆU SƠN 1
SÁNG KIẾN KINH NGHIỆM
TÊN ĐỀ TÀI
“ HƯỚNG DẪN GIẢI CÁC BÀI TOÁN CƠ BẢN VỀ KIỂU
DỮ LIỆU MẢNG TRONG ĐỀ THI HỌC SINH GIỎI ”
Người thực hiện: NGUYỄN QUỐC THANH Chức vụ: Giáo viên
SKKN thuộc lĩnh vực (môn): TIN HỌC
Trang 24 1.3 Đối tượng và khách thể nghiên cứu 2
6 1.5 Những điểm mới của sáng kiến kinh nghiệm 2
10 2.3.1 Dạng bài tập 1 Các bài toán phát triển cơ bản. 4
11 2.3.2 Dạng bài tập 2 Bài toán tạo mảng phụ. 9
12 2.3.3 Dạng bài tập 3 Các bài toán sử dụng mảng 1 chiều 13
Trang 3GD – ĐT Giáo dục và Đào tạo
Trang 4“HƯỚNG DẪN GIẢI CÁC BÀI TOÁN CƠ BẢN VỀ KIỂU DỮ LIỆU
MẢNG TRONG ĐỀ THI HỌC SINH GIỎI”
ĐT còn chưa đáp ứng được yêu cầu ngày càng cao của xã hội Nhìn chung trình
độ kiến thức của học sinh, khả năng tư duy khoa học, khả năng thực hành cònchưa thích ứng được với thực tiễn xã hội, khả năng vận dụng kiến thức vào sảnxuất, đời sống còn hạn chế, nhất là trong lĩnh vực công nghệ thông tin và ứngdụng công nghệ thông tin trong việc dạy của giáo viên và việc học của học sinh
- Tin học là một môn mới được đưa vào học đại trà ở cấp THPT trên toànquốc, phần nội dung chương trình lớp 10 và 12 với các phần kiến thức cơ bảnchung về máy tính và khoa học máy tính, soạn thảo văn bản Microsoft Word,Microsoft Access hay các kiến thức về mạng máy tính đã được các em tiếp cận 1phần ở các chương trình học cấp THCS, các chương trình học nghề, hoặc quasách báo, các chương trình trên truyền hình nên các em có thể từng bước nắmđược bài và không gặp nhiều khó khăn trong quá trình học Chương trình họclớp 11 về khái niệm lập trình và viết các chương trình cho máy thực hiện, yêucầu tư duy trừu tượng cao, công việc có tính chất quá trình được ứng dụng nhiềutrong khoa học cũng như trong thực tiễn Tuy nhiên để nắm bắt được các kiếnthức cơ bản này với học sinh không phải là điều dễ dàng
- Đặc biệt môn Tin học không phải là môn lựa chọn thi tốt nghiệp hay thiĐại học nên các em học sinh thường “ngại” học và thụ động trong việc họcchương trình tin học lớp 11 Trong kỳ thi học sinh giỏi toàn tỉnh hiện nay, các
em học sinh học giỏi và được chọn vào đội tuyển thì các em hà phụ huynh cũngkhông muốn tham gia vì còn bận học để thi Đại học Vì vậy để học sinh học tốtchương trình Tin học lớp 11 và thi đạt thành tích cao trong kỳ thi học sinh giỏithì yếu tố tự học được đánh giá rất cao Vì vậy để giúp học sinh chủ động học và
tích cực học tôi mạnh dạn đưa ra đề tài “Hướng dẫn giải các bài toán cơ bản
về Kiểu dữ liệu mảng trong đề thi Học sinh giỏi” để giúp học sinh học tự tin
học bài 11 sách giáo khoa Tin học 11 được hiệu quả
1.2 Mục đích nghiên cứu.
Thực tế học tập và giảng dạy Tin học tại Trường THPT Triệu Sơn 1, quatrao đổi, bàn bạc với các đồng nghiệp trong và ngoài nhà trường tôi nhận thấy
Trang 5một vấn đề là việc tìm ra phương pháp dạy, phương pháp động viên để học sinhham học, yêu thích môn học và không sợ học môn Tin học là một điều rất khó.
Sở dĩ học sinh cảm thấy khó khăn trong việc học là do các em không thấy đượcbản chất thực tế của vấn đề, cái hay, ứng dụng của kiến thức trong cuộc sống
1.3 Đối tượng nghiên cứu.
Một thực trạng chung của học sinh trong cả nước, nhất là học sinh ở các tỉnh
mà điều kiện cơ sở vật chất còn nhiều khó khăn và trường THPT Triệu sơn I làmột ví dụ thì khả năng lập trình của học sinh với khả năng tư duy, tìm tòi, pháthiện vấn đề còn chưa tốt, nhất là việc phải tiếp cận với một công việc hoàn toànmới với các em Do vậy khi giảng dạy tôi luôn cho học sinh có cái nhìn thấu đáo
từ nhiều góc độ khác nhau để hiểu được bản chất vấn đề Kinh nghiệm thể hiện
trong đề tài “Hướng dẫn giải các bài toán cơ bản về Kiểu dữ liệu mảng trong
đề thi Học sinh giỏi” được tôi đúc kết ra trong quá trình giảng dạy, nghiên cứu
tài liệu và trao đổi cùng đồng nghiệp trong năm học 2018 – 2019, 2019 - 2020
và được tiếp tục nghiên cứu bổ sung và thực hiện trong năm học 2020 - 2021
1.4 Phương pháp nghiên cứu.
Đề tài này được rút ra từ kiến thức học ở Đại học và kinh nghiệm dạy học
ở trường THPT Triệu Sơn 1 của bản thân và có sự tham gia đóng góp ý kiến củacác đồng nghiệp trong và ngoài nhà trường cùng với các tài liệu mà tôi sưu tầmđược từ sách báo và các thông tin, diễn đàn trên mạng Internet Các giải pháp,kiến thức này tôi đã trao đổi cùng đồng nghiệp và áp dụng trong quá trình dạyhọc tại trường THPT Triệu Sơn 1
1.5 Những điểm mới của Sáng kiến kinh nghiệm.
Thông qua kiển thức thể hiện trong đề tài “Hướng dẫn giải các bài toán cơ
bản về Kiểu dữ liệu mảng trong đề thi Học sinh giỏi” hệ thống lại cho các em
kiến thức cơ bản về kiểu mảng, các thao tác khi làm bài tập về mảng 1 chiều,các bài tập vận dụng, phát triển tổng quát và vận dụng làm các bài toán chuyênxâu về kiểu dữ liệu mảng
Trang 62 NỘI DUNG
2.1 Cơ sở lí luận.
Trong sách giáo khoa Tin học 11 nội dung chương trình mặc dù đãđược giảm tải theo yêu cầu của Bộ giáo dục nhưng vẫn còn khá nặng với họcsinh nên đã dẫn tới việc chán nản của các em Hơn nữa, môn học này học sinhchưa thấy được ứng dụng thực tế và không thi tốt nghiệp hay thi Đại học nên các
em có tâm lí không muốn học mà chỉ muốn đối phó cho qua năm học Các em
có lực học khá, tốt có khả năng tham gia vào đội tuyển dự thi HSG cấp trường,cấp tỉnh nhưng các em không tự tin và rất lo lắng Nên khi kết thúc năm học,cũng như trong các kỳ thi học sinh giỏi thì những học sinh ưu tú nhất của mỗitrường THPT trong tỉnh làm bài cũng có chất lượng không đồng đều và chưacao
2.2
Thực trang vấn đề.
Từ khi được tiếp cận với Tin học cũng như việc học lập trình thì các emmới chỉ xử lý thông qua các con số, các bài tập đơn giản về việc cộng, trừ,nhân chia, hơn nữa trong đề thi HSG các năm thì có 1 số lượng không nhỏ thísinh không làm được bài toán cơ bản về mảng bài tập xử lí về dãy số, dãy ký
tự các em hoàn toàn chưa biết rõ bản chất Vì vậy khi nói về kiểu mảng thìcác em rất mơ hồ và không hiểu nó là cái gì? Không có kiểu dữ liệu mảng cógiải quyết được các công việc không? Vì vậy để cho các em học sinh hiểuđược bài dữ liệu về kiểu mảng, các em học sinh khá giỏi và nhất là các emtham gia kỳ thi học sinh giỏi cấp tỉnh môn Tin học đạt kết quả cao tôi đã
nghiên cứu đề tài “Hướng dẫn giải các bài toán cơ bản về Kiểu dữ liệu
mảng trong đề thi Học sinh giỏi”
2.3 Nội dung đề tài
Trong SGK Tin học 11 bài “Kiểu mảng” được trình bày các kiến thức cơ bản: (Trong phần kiến thức cơ bản nên tôi chỉ trình bày về mảng 1
chiều”
+ Mảng một chiều là dãy các phần tử cùng kiểu
+ Nêu cách giới thiệu cho học biết
Tên mảng 1 chiều
Số lượng phần tử
Kiểu dữ liệu của phần tử
Cách khai báo biến mảng
Cách tham chiếu đến phần tử
+ Một bài toán về kiểu dữ liệu mảng 1 chiều xử lý gồm:
Khai báo mảng
Trang 7 Đọc/ nhập mảng.
Xử lý mảng:
Xuất/ ghi kết quả
2.3.1 Dạng bài tập 1 Các bài toán phát triển cơ bản.
Bài toán 1: Ví dụ 1 (Trang 56 SGK Tin học 11)
Tìm phần tử lớn nhất trong dãy số nguyên
Input: Số nguyên dương n <=250 và dãy số nguyên dương a1, a2, an, mỗi
số đều không quá 500
Output: Chỉ số và giá trị của phần tử lớp nhất trong dãy số đã cho (Nếu cónhiều phần tử lớn nhất chỉ cần đưa ra 1 trong số chúng)
B1.6 Thực hiện các yêu cầu như các bài trên nhưng thay tìm GTLN bằng tìmGTNN
Trang 8Giáo viên gợi ý và hướng dẫn để học sinh làm được các bài toán trên Từ
đó giáo viên đưa ra đề thi HSG các năm của tỉnh Thanh Hoá cũng như cáctỉnh khác hướng dẫn để học sinh biết, hiểu, thực hiện và không còn sợ đề thiHSG
Bài toán 2 - Bài 1: ( 6,0 điểm) Tổng của dãy số - (Đề thi HSG tỉnh Thanh
Hoá 2012 – 2013)
Cho dãy a1,a2,… ,aN số tự nhiên Hãy tính tổng các số của dãy, cho biết
số hạng lớn nhất trong dãy và vị trí của số hạng này
Dữ liệu vào: Từ tệp văn bản BAI1.INP chỉ một dòng chứa các số a1,a2, … ,aN
ghi cách nhau một dấu cách ( 0< N <=10000; 0<= ai <= 60000 với i=1,2,… ,N)
Kết quả: Ghi vào tệp văn bản BAI1.OUT có cấu trúc như sau:
- Dòng thứ nhất ghi tổng các số của dãy
- Dòng thứ 2 ghi số lớn nhất
- Dòng thứ 3 ghi các vị trí xuất hiện của số lớn nhất Các số trên
cùng một dòng ghi cách nhau một dấu cách
Trang 9while not eof(f1) do
Cho một dãy số gồm N số nguyên a1, a2, , aN Người ta định nghĩa một số
ai là cực tiểu địa phương nếu thỏa mãn ai-1 > ai < ai+1 (a1 và aN không được gọi là cực tiểu địa phương) Hãy tìm số lượng cực tiểu địa phương của dãy số trên
Input: Cho trong file văn bản BAI1.INP gồm:
- Dòng 1 chứa duy nhất một số nguyên dương N (N≤106)
- Dòng 2 chứa dãy số nguyên a1, a2, , aN (|ai| ≤109, i[1,N])
Output: Ghi ra file văn bản BAI1.OUT duy nhất một số là kết quả bài toán.
Ví d :ụ:
BAI1.INP BAI1.OUT4
Yêu cầu: Hãy cho biết số lượng các phần tử có giá trị nhỏ hơn K là số nguyên tố
của dãy trên
Dữ liệu: Vào từ file văn bản BAI1.INP gồm:
Trang 10 Dòng đầu tiên là 2 số N, K.
Dòng tiếp theo lần lượt là N số nguyên của dãy số
Kết quả: Ghi ra File BAI1.OUT gồm duy nhất số M là số lượng các phần tử của
dãy số thoã mãn yêu cầu đề bài
Giới hạn: 0<N<50000; 0<K; ai <5000 Với mọi i = 1 N
Ví dụ:
Ý tưởng: Với bài toán cơ bản như trên học sinh học sinh chỉ việc viết thêm 1 hàm
kiểm tra số nguyên tố của số B Sau đó duyệt tất cả các số trong mảng để đếm
số lượng số m nguyên tố và nhỏ hơn số k cho trước
Trang 11Cho dãy số gồm có n số nguyên a1, a2, a3, …, an và một số nguyên K.
Yêu cầu: Hãy cho biết dãy số đã cho có tồn tại hay không một cặp số mà trung
bình cộng của chúng là K
Dữ liệu: Vào từ file văn bản BAI2.INP gồm:
Dòng đầu tiên là 2 số N, K
Dòng tiếp theo lần lượt ghi số a1, a2, a3, …, an
Các số trên cùng một dòng được ghi cách nhạu ít nhất một dấu cách trống
Kết quả: Ghi ra File BAI2.OUT:
Số 1 nếu tòn tại một cặp số thoã mãn yêu cầu toán
Số 0 nếu không tồn tại một cặp số nào thoã mãn yêu cầu toán
Trang 12Giới hạn: 0<N<50000; |K|; |ai|<1000 Với mọi i = 1 N
If a[i]+a[j] = 2*k then begin d:=1; break; end;
If d=1 then write(1) else write(0);
Ở trên lớp học với các em học khá, giỏi có thể làm được bài toán trên vàgiáo viên có thể cho điểm tối đa Tuy nhiên, nếu đây là 1 bài thi HSG thì giáoviên phải nhắc nhở và phân tích để học sinh thấy được giới hạn n<50.000 vìvậy nếu làm theo cách trên thì giới hạn thời gian sẽ bị quá 1s và các em sẽkhông đạt 100% số test Để đảm bảo 100% số test thì GV cần hướng dẫn vàcùng với HS tìm cách làm khác Vì a1,a2, ,an là các số từ -999 999.Chúng ta chuyển về 1 mảng mới với chỉ số từ -999 999 và thực hiện “Lùa
bò vào chuông” với các chuồng b được đánh số -999 999, sau đó thực hiện:
If d=1 then write(1) else write(0);
2.3.2 Dạng bài tập 2 Bài toán tạo mảng phụ.
Bài toán 6 Bài 2 – SGK Tin học 11 trang 66.
Cho mảng A gồm n phần tử Hãy viết chương tình tạo mảng b[1 n], trong đób[i] là tổng i phần tử đầu tiên của A
Tư duy ban đầu của HS sẽ thực hiện
Trang 13B[n]= a[1]+a[2]+a[3]+a[4] + +a[n] =b[n-1]+a[n]
Từ phân tích trên ta được công thức tổng quát: b[i]=b[i-1]+a[i] đây làcông thức và là bài tập mà sẽ được sử dụng sau này rất nhiều trong đề thiHSG, nó là ý tưởng cho nhiều bài về quy hoạch động trên mảng 1 chiều sẽđược áp dụng
Bài toán 7 Bài 4 (4 điểm) Chia đoạn một dãy số (Đề thi HSG tỉnh Thanh
Hoá năm học 2010 - 2011)
Cho dãy số tự nhiên a1, a2, , an Hãy tìm cách chia dãy số trên thành nhiềuđoạn nhất sao cho tổng các số trong tất cả các đoạn con đều bằng nhau
Dữ liệu vào: từ file BAI4.INP gồm:
- Dòng đầu ghi số n - Các dòng còn lại ghi các số a1, a2, , an.Các số trên cùng một dòng cách nhau ít nhất một dấu cách trống
Kết quả: ghi ra file BAI4.OUT, gồm K+1 dòng (K là số đoạn chia được nhiều
nhất) như sau:
- Dòng đầu ghi hai số K và S (S là tổng giá trị của một đoạn)
- K dòng còn lại mỗi dòng ghi các số của mỗi đoạn chia được
Trang 14Các số trên cùng một dòng cách nhau ít nhất một dấu cách trống.
Ý tưởng:
+ Tính tổng cả dãy t
+ Tổng t1 mỗi dãy con phải là ước của t
+ có k đoạn liên tiếp mà tổng mối đoạn là t div t1
Từ phân tích đề bài như trên chúng ta thấy được việc phải tính tổng cả dãy vàđặc biệt mỗi lần phải tính tổng của mỗi dãy con nên sẽ mất rất nhiều thời giancho máy thực hiện
Muốn mỗi lần thực hiện tính tổng từ phần tử i đến phần tử j ta phải thực hiệnFor i1:=i to j do t1:=t1+a[i1] nến số lượng phép tính sẽ rất nhiều
Nếu áp dụng ví dụ như bài toán 6 đã nói ở trên thì mọi việc được thực hiệnnhanh chóng:
+ Tổng cả dãy là b[n];
+ tổng t1 là b[j]-b[i-1]
Từ các phân tích như trên các em học sinh có lực khá, giỏi sẽ thực hiệnđược bài toán trên (Đây là một bài toán khó trong đề thi HSG năm 2010-2011)
var a, c : array[1 10000] of longint;
Trang 16Bài toán tương tự
Bài toán 8 : Bài 5 : (3 điểm) Dãy con
Cho một dãy A gồm N số nguyên {a1, a2,…, an} Dãy con ai, ai+1,…, aj (1 ≤
I ≤ j≤ N) là dãy được tạo từ các phần tử liên tiếp của dãy A bắt đầu từ phần tử i
và kết thúc ở phần tử j
Yêu cầu: Hãy tìm dãy con liên tiếp có tổng lớn nhất.
Dữ liệu vào: File văn bản BAI5.INP gồm:
- Dòng đầu ghi giá trị N (1 ≤ N ≤ 10000)
- Dòng sau gồm N số nguyên{a1, a2,…, an} (-106≤ai≤106)
Dữ liệu ra: File văn bản BAI5.OUT gồm
- Dòng đầu ghi tổng các phần tử dãy con và số lượng dãy con
- Dòng tiếp theo ghi giá trị các phần tử dãy con
Ví d :ụ:
13
12 -34 14 11 9 -8 15 -7 -56 17 1619
52 2
14 11 9 -8 1511
17 16 19
2.3.3 Dạng bài tập 3 Các bài toán sử dụng mảng 1 chiều
Bài toán 9: Bài 3: (4 điểm) Ma trận (Đề thi HSG tỉnh Thanh Hoá
năm 2009 – 2010)
Cho một ma trận A gồm M dòng, N cột là các số nguyên Hãy sắp xếp cácphần tử của ma trận theo thứ tự tăng dần từ trên xuống dưới, từ trái qua phải
Dữ liệu: Vào từ file văn bản BAI3.INP, gồm:
- Dòng đầu tiên ghi hai số nguyên dương M, N (M, N<= 100)
- M dòng tiếp theo mỗi dòng ghi N số nguyên, mỗi số có trị tuyệt đối khôngvượt quá 30000, các số cách nhau ít nhất một dấu cách Các số trong M dòng này
Trang 17biểu diễn ma trận A.
Kết quả: Ghi ra file văn bản BAI3.OUT: gồm M dòng, mỗi dòng gồm N số
nguyên, các số cách nhau ít nhất một dấu cách Các số trong M dòng này biểudiễn ma trận A đã được sắp
Hướng dẫn làm bài: Trong năm 2009 – 2010 thì phần kiến thức về mảng
2 chiều vẫn còn được giảng dạy trong SGK Vì vậy khi đọc đề này phần lớpcác em xử lí theo kiểu mảng 2 chiều nên không có ý tưởng và không giảiđược bài Thực tế bài này làm 1 bài rất cơ bản trong SGK (Có thể nói là dễ)các em chỉ việc thực hiện các công việc:
+ Đọc dữ liệu ra mảng 1 chiều.
+ Sắp xếp dãy số theo thứ tự không giảm.
+ Viết kết quả ra tệp ra–Cứ viết ra n số thì cho vào đó 1 lệnh xuống dòng
Trang 18begin write(f, a[i],' '); {Ghi kết quả}
if( i mod N) = 0 then writeln(f); {Xuống dòng}
Cho xâu S chỉ gồm các kí tự là chữ cái tiếng anh và các chữ số (có phân
biệt chữ in hoa, in thường)
Yêu cầu: Hãy xác định số kí tự khác nhau trong xâu S và mỗi kí tự xuất hiện
bao nhiêu lần
Dữ liệu vào: Vào từ file văn bản BAI2.INP gồm 1 dòng duy nhất là xâu kí tự S
(có độ dài không quá 255)
Kết quả: Kết quả ghi ra file văn bản BAI2.OUT gồm:
- Dòng đầu ghi số kí tự khác nhau
- Các dòng tiếp theo, mỗi dòng ghi một kí tự xuất hiện trong xâu S và sốlần xuất hiện của nó Các kí tự đưa ra theo thứ tự chữ cái in hoa, in thường, chữ
số Các chữ cái, chữ số đưa ra theo thứ tự từ điển
Ví dụ:
BAI2.INP BAI2.OUT