1. Trang chủ
  2. » Giáo án - Bài giảng

Skkn mon tin 11 nam 2014-2015thanglvt(Bồi dưỡng HSG)

31 328 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 31
Dung lượng 467,42 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các nội dung chính của bài viết - Duyệt mảng để tìm các phần tử thoả mãn yêu cầu nào đó - Một số bài toán tối ưu trong mảng một chiều - Một số bài tập áp dụng thuật toán sắp xếp Trong từ

Trang 1

A ĐẶT VẤN ĐỀ

I Lời mở đầu

Sự phát triển mạnh mẽ của công nghệ thông tin đã làm cho xã hội có nhiều nhận thức mới về cách tổ chức các hoạt động Nhiều quốc gia trên thế giới ý thức được rất rõ tầm quan trọng của tin học và có những đầu tư lớn cho lĩnh vực này, đặc biệt trong giáo dục nhằm nâng cao dân trí về tin học và đào tạo nguồn nhân lực

có chất lượng cao Người Việt Nam có nhiều tố chất thích hợp với ngành khoa học này, vì thế chúng ta hi vọng có thể sớm hoà nhập với khu vực và trên thế giới về tốc độ phát triển nền công nghệ thông tin Đảng, Nhà nước ta đã nhận thấy được tầm quan trọng của ngành Tin học và đã đưa môn học này vào nhà trường phổ thông như những môn khoa học khác bắt đầu từ năm học 2006-2007 Bộ trưởng Bộ GDĐT cũng đã đưa

ra chỉ thị số 55/2008/CT- BGTĐT ngày 30/9/2008 về tăng cường giảng dạy, đào tạo và ứng dụng công nghệ thông tin trong ngành giáo dục giai đoạn 2008-2011 Ngành Giáo dục và Đào tạo đang nỗ lực đổi mới phương pháp dạy học theo hướng phát huy tính tích cực chủ động của học sinh Cốt lõi của việc đổi mới phương pháp dạy học

ở trường phổ thông là giúp học sinh hướng tới việc học tập chủ động, chống lại thói quen học tập thụ động, học sinh có thể tự học, tự rèn luyện thông qua một số bài tập, dạng bài tập cụ thể

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

1 Thực trạng :

Đa số học sinh đều đam mê Tin học nhất là trong lĩnh vực ứng dụng như tìm hiểu Internet tham gia các trò chơi trí tuệ, hay tự mình làm ra các phần mềm nhỏ như các trò chơi ô chữ trong các giờ học, hay tạo ra những video hình ảnh có ích trong các môn học

Tuy nhiên trong các nội dung ở trường THPT thì phần lập trình là khó khăn nhất dẫn đến học sinh không có hứng thú, bên cạnh đó ở trường THPT Lê Viết Thuật thông thường học sinh có năng lực đầu vào chưa cao Hơn nữa đối với môn Tin học sách tham khảo dùng cho học sinh trong phần lập trình cũng như giáo viên không phong phú như các môn tự nhiên khác nên khó khăn trong việc giảng dạy nội dung này

Trang 2

2 Kết quả của thực trạng trên :

Trên cơ sở nhiều năm được phân công dạy khối lớp 11, trường THPT Lê Viết Thuật, tôi đã lưu lại kết quả học tập và sự tiến bộ của học sinh ở mỗi năm học

ở một số lớp để có sự đối chiếu và rút kinh nghiệm

- Bảng số liệu kết quả đạt được khi chưa thực hiện đề tài: năm học 2012 - 2013

STT Lớp Sĩ số Giỏi Khá Trung bình Không đạt yêu

Vì vậy trong quá trình giảng dạy tôi đúc rút ra một số kinh nghiệm để giúp các học sinh tiếp cận nội dung này dễ dàng hơn, tạo nhiều đam mê cho học sinh

Để rèn luyện kỹ năng lập trình cho học sinh nói chung cũng như khi chọn đội tuyển đi thi học sinh giỏi môn Tin học, có rất nhiều cách mà giáo viên có thể áp dụng đối với các đối tượng học sinh khác nhau Thông thường khi cho một bài toán tin học có dạng tương tự hoặc dạng mở rộng từ một bài toán cơ bản nào đó trong sách giáo khoa, hoặc một bài toán cơ bản nào đó mà các em biết thì các em

có thể xây dựng và có hứng thú để xây dựng thuật toán cho bài toán đặt ra Vì vậy giáo viên có thể chọn các bài tập cơ bản từ đó mở rộng và phát triển để rèn luyện

kỹ năng lập trình cho học sinh Dĩ nhiên cách làm này không mới với giáo viên nhưng cách chọn các bài toán cơ bản như thế nào để học sinh có thể vận dụng và gây được hưng thú cho học sinh đó lại là điều đáng quan tâm

Trong bài viết này với nội dung “Rèn luyện kỹ năng lập trình cho học

Trang 3

kinh nghiệm lập trình cho học sinh trong việc rèn luyện kỹ năng lập trình môn Tin học 11

Các nội dung chính của bài viết

- Duyệt mảng để tìm các phần tử thoả mãn yêu cầu nào đó

- Một số bài toán tối ưu trong mảng một chiều

- Một số bài tập áp dụng thuật toán sắp xếp

Trong từng phần chúng tôi sắp xếp và trình bày các bài tập từ dễ đến khó, đồng thời thông qua từng bài tập chúng tôi cố gắng phân tích nhằm đưa ra một số định hướng lời giải bài toán để rèn luyện cho học sinh có kinh nghiệm, kỹ năng vận dụng một số bài toán tương tự nhau, hướng tới sự phát triển năng lực cho học sinh

Trang 4

Bài tập 1: (Bài toán gốc)

Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm N phần tử Thông báo ra màn hình các số chẵn có trong mảng đã nhập và số lượng của chúng Nếu trong mảng không có phần tử nào có giá trị chẵn thì ta thông báo “Khong co”

Nhận xét: Với cách nhập dữ liệu cho mảng, cách dùng vòng For để duyệt

mảng, biến dem để đếm số lượng các phần tử chẵn Các em có thể dễ dàng hoàn thành chương trình có thể như sau:

read(A[i]); {doc tung phan tu vao mang}

end;

Trang 5

if A[i] mod 2 =0 then {Xu li luon cac phan tu cua mang}

begin

write(A[i],’ ‘); {in phan tu thoa man ra man hinh}

inc(dem); {tang bien dem len mot don vi}

end;

writeln; {Dua con tro xuong dong de in so luong phan tu thoa man}

if dem<>0 then writeln(‘So lương cac phan tu chan la:’,dem:4)

else writeln(‘Khong co phan tu nao co gia tri chan’);

readln;

END

Ở đây ta chỉ cần thay đổi tính chất các phần tử của mảng một chiều hoặc thêm vào một yếu tố thứ hai ở bài tập 1 thì ta có bài toán khác nhau như sau:

Bài tập 1.2: Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm

N phần tử Thông báo ra màn hình các số lẽ có trong mảng đã nhập và số lượng của chúng Nếu trong mảng không có phần tử nào là số lẽ thì ta thông báo “Khong co”

Nhận xét: ta cần chú ý nếu gặp phần tử nào của mảng là số lẽ thì chúng ta

hiện ra màn hình và tăng biến Dem lên một đơn vị Còn khi thực hiện xong mà biến Dem có giá trị bằng 0 thì ra hiện ra thông báo “không có” Bây giờ ta thêm vào bài toán một yếu tố thứ hai (số nguyên K) thì ta có bài toán sau:

Bài tập 1.3: Viết chương trình nhập vào từ bàn phím số nguyên N, mảng A gồm N

phần tử, và số nguyên K Thông báo ra màn hình các số chia hết cho K có trong mảng đã nhập và số lượng của chúng Nếu không có phần tử nào của mảng bằng K thì ta thông báo “Khong co”

Nhận xét: Ở bài tập 1.3 ta chỉ cần quan tâm phần tử nào của mảng chia hết

cho K thì hiện ra màn hình và tăng biến Dem lên một đơn vị Nếu bài toán yêu cầu đưa ra chỉ số các phần tử của mảng có giá trị bằng K thì ta có bài toán sau:

Bài tập 1.4: Viết chương trình nhập vào từ bàn phím số nguyên N, mảng A gồm N

phần tử, và số nguyên K Thông báo ra màn hình chỉ số các phần tử của mảng có

Trang 6

giá trị bằng K và số lượng của chúng Nếu không có giá trị nào bằng K thì ta thông báo ra màng hình là “Khong co”

Nhận xét: Ở bài tập 1.4 ta duyệt mảng nếu phần tử nào có giá trị bằng K thì

hiện ra màn hình chỉ số và tăng biến Dem lên một đơn vị Còn khi thực hiện xong giá trị biến Dem không thay đổi thì ta thông báo ra màn hình “Khong co”

Nếu ta thay đổi yêu cầu tìm chỉ số của giá trị lớn nhất trong mảng một chiều thì ta có bài toán sau:

Bài tập 1.5:

Cho số nguyên dương N (N 10000) và dãy N số nguyên dương a1, a2, ,an Hãy viết chương trình đưa ra chỉ số và giá trị của phần tử lớn nhất trong dãy đã cho

Nhận xét: Với bài tập 1.5 giáo viên yêu cầu học sinh nhớ lại thuật toán tìm

giá trị lớn nhất của dãy số nguyên đã học ở chương trình Tin học lớp 10 Như vậy

ta có những công việc sau cần phải làm

- Nhập vào một dãy số nguyên dương, dùng mảng một chiều

Trang 7

Writeln('Phan tu lon nhat cua mang:', Max);

Writeln(‘Chi so cua phan tu Max:’, csmax);

Readln;

End

Bình luận: Trong lện For tìm giá trị lớn nhất biến i bắt đầu chạy từ 2, nhưng

kết quả vẫn đúng khi biến i nhận giá trị đầu từ 1 Không nhất thiết gán giá trị ban đầu cho biến Max là A[1], mà có thể gán cho biến Max một phần tử tùy ý trong biến mảng, nhưng khi đó biến i trong lệnh For tìm giá trị lớn nhất phải bắt đầu nhận giá trị từ 1 Ta nên gán giá trị ban đầu cho biến i là 2 thì khi đó chúng ta bớt

Nhận xét: Ở đây ta chỉ cần chú ý là nếu Max  A[i] thì ta đưa ra được phần

tử có giá trị lớn nhất và có chỉ số lớn nhất Còn tìm chỉ số nhỏ nhất thì ta có bài toán như sau:

Trang 8

Bài tập 1.7: Cho số nguyên dương N (N 10000) và dãy N số nguyên dương a1, a2, ,an Viết chương trình tìm phần tử có giá trị lớn nhất của mảng và đưa ra màn hình chỉ số và giá trị của phần tử tìm được Nếu có nhiều phần tử có cùng giá trị lớn nhất thì đưa ra phần tử có chỉ số nhỏ nhất

- Nếu có nhiều phần tử có cùng giá trị lớn nhất thì đưa ra tất cả các chỉ số của chúng ta có bài toán:

Bài tập 1.8: Cho số nguyên dương N (N 10000) và dãy N số nguyên dương a1, a2, ,an Viết chương trình tìm phần tử có giá trị lớn nhất của mảng và đưa ra màn hình chỉ số và giá trị của phần tử tìm được Nếu có nhiều phần tử có cùng giá trị lớn nhất thì đưa ra tất cả các chỉ số của nó

Nhận xét: Ở bài tập 1.8 sau khi tìm phần tử có giá trị lớn nhất xong thì ta

dùng một vòng For để duyệt từ đầu mảng đến cuối mảng nếu A[i] = Max thì ta hiện ra màn hình chỉ số i

Nếu ta yêu cầu thêm tính tổng các phần tử của mảng một chiều thì ta có bài toán sau:

Bài tập 1.9:(Đề thi học sinh giỏi Tỉnh Nghệ An khối 12 – Năm học 2008 – 2009)

Tæng c¸c ch÷ sè

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 c¸c sè h¹ng nµy

D÷ liÖu: Vµo tõ tÖp v¨n b¶n SO.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 ≤ 6.104 víi i = 1, 2, , N)

KÕt qu¶: Ghi ra tÖp v¨n b¶n SO.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 9

- Tìm giá trị lớn nhất và đưa ra các vị trí của nó

- Tính tổng các số của dãy Ở đây ta cần khai báo thêm biến Tong dùng để tính tổng (lưu ý kiểu dữ liệu cho biến Tong), khi đó ta thêm đoạn chương trình sau đây vào bài tập 1.8:

Bài tập 1.11: Cho mảng A gồm n phần tử Hãy viết chương trình tạo mảng B gồm

n phần tử, trong đó B[i] là tổng của i phần tử đầu tiên của A

Nhận xét: Đây cũng là bài toán tính tổng nhưng bằng cách tạo mảng mới

giáo viên hướng dẫn để học sinh nắm bắt được ý tưởng của bài toán, ban đầu ta chưa cần thuật toán tối ưu chỉ cần nó chạy là được:

Trang 10

{Ket thuc tao mang B}

For i:=1 to n do Writeln(B[i]:6);

readln;

End

Bình luận: Chúng ta để ý rằng có hệ thức sau:

B[1]:=A[1];

B[i]:=B[i-1] +A[i]; (1<in)

Do đó ta thay đoạn chương trình từ chú thích {Bắt đầu tạo mảng B} đến {Ket thuc tao mang B} bởi 2 lệnh sau:

B[1]:=A[1];

For i:=2 to n do B[i]:=B[i-1] + A[i];

Trang 11

Với 2 lệnh này, máy chỉ phải thực hiện n-1 phép cộng, trong khi với đoạn

chương trình trên máy phải thực hiện

2

) 1 (n

n

phép cộng Nhờ việc phân tích như trên ta có thể giảm bớt đáng kể số phép toán cần thực hiện Tuy tốc độ tính toán của máy tính nhanh nhưng có giới hạn Do đó trong khi viết chương trình, ta nên tìm cách viết sao cho chương trình thực hiện càng ít phép toán càng tốt

Nếu thay đổi yêu cầu bài toán hãy chia các phần tử của mảng một chiều ra K đoạn con liên tiếp có tổng bằng nhau thì ta có bài toán sau:

Bài tập 1.12: Cho n số nguyên dương a1, a2, , an Hãy chia dãy trên thành K đoạn

có tổng bằng nhau

Ví dụ: Cho K=3 và dãy số 1 5 3 1 8 1 1 6 1 1 ta chia được thành 3 đoạn bằng nhau

đó là 1 5 3; 1 8; 1 6 1 1

Nhận xét: Giáo viên gợi ý hướng dẫn cho học sinh tìm hiểu thuật toán Giả

sử ta có tổng của dãy số là S khi đó ta có

Tính tổng từng đoạn, cứ một đoạn tong = S thì tăng biến dem

Nếu dem = K thì chia được K đoạn bằng nhau Ngược lại thì không chia dãy trên thành K đoạn bằng nhau Sau đây là thủ tục chia dãy số thành K đoạn bằng nhau:

Ta dùng mảng Vt để lưu số hiệu của từng đoạn

Trang 12

Bây giờ ta bỏ tham số K đoạn ở bài tập 1.12 thì ta có bài toán sau:

Bài tập 1.13: Cho n số nguyên dương a1, a2, , an Hãy chia dãy trên thành nhiều

đoạn nhất có tổng bằng nhau

Nhận xét: Giáo viên gợi ý hướng dẫn cho học sinh tìm hiểu thuật toán

Viết hàm tìm ước của S (S là tổng của dãy số) ta lưu vào mảng: UC

Trang 13

II CÁC BÀI TOÁN TỐI ƯU TRONG MẢNG 1 CHIỀU

Các toán tối ưu trong mảng một chiều như bài toán tìm dãy đơn điệu tăng, dãy đơn điệu giảm, dãy đan dấu hay dãy chứa số 0 dài nhất đây là những bài toán tương đối khó và thường có trong các đề thi học sinh giỏi Tỉnh Khi gặp bài toán này giáo viên cần định hướng cho học sinh

Bài tập 2 (bài toán gốc): Cho N là số nguyên dương và dãy số nguyên a1, a2, ,an

Hãy viết chương trình tìm đoạn chứa các số 0 liên tiếp nhau dài nhất

Nhận xét: Ta dùng 1 biến dem để đếm độ dài của từng dãy số 0 liên tiếp

nhau và dùng biến Max để lưu lại đoạn số 0 có độ dài lớn nhất Sau đây ta có chương trình

Trang 15

Bài tập 2.1: Cho dóy số nguyờn a1, a2, …,an (n<100) Hóy tỡm dóy con cỏc phần

tử liờn tiếp dài nhất thỏa món là dóy đan dấu

Vớ dụ cho dóy số: 2 -3 -4 1 -3 -2 1 -3 5 -1 0 Thỡ ta cú kết quả: -2 1 -3 5

Bài tập 2.2: Cho dóy số nguyờn a1, a2, …,an (n<100) Hóy tỡm dóy con cỏc phần

tử liờn tiếp dài nhất thỏa món là dóy cú cỏc phần tử bằng nhau

Vớ dụ cho dóy số: 2 2 3 4 3 3 3 3 4 4 Thỡ ta cú kết quả là dóy: 3 3 3 3

Nếu phỏt biểu bài tập 2 dưới cỏch khỏc thỡ ta cú bài toỏn sau:

Bài tập 2.3: (Đề thi học sinh giỏi Tỉnh Nghệ An – Năm học 2010 – 2011)

Hội trại

Nhân dịp ngày thành lập công ty, ban Giám đốc công ty X tổ chức cho cán

bộ công nhân viên một cuộc hội trại Thời điểm tính trong ngày hội trại là phút, thời điểm ban đầu là 0 Công ty có N cán bộ công nhân viên Ng-ời thứ I có mặt tại hội trại từ thời điểm aI đến thời điểm bI Hãy lập trình giải quyết các công việc sau

đây:

1 Tìm cho ban Giám đốc một thời điểm sớm nhất đến thăm hội trại để gặp

đ-ợc nhiều cán bộ nhất

2 Tìm một khoảng thời gian dài nhất tại địa điểm hội trại không có ai cả, nếu

có nhiều khoảng thời gian nh- thế hãy đ-a ra khoảng thời gian sớm nhất

Dữ liệu vào: Từ file văn bản: HOITRAI.INP, có cấu trúc nh- sau:

 Dòng đầu tiên ghi số N là số cán bộ của công ty (1≤ N ≤ 10000)

 Dòng thứ I trong N dòng tiếp theo ghi 2 số nguyên d-ơng aI và bI là

khoảng thời gian có mặt tại hội trại của cán bộ thứ I

Kết quả: Ghi ra file văn bản HOITRAI.OUT nh- sau:

Trang 16

 Dòng đầu tiên ghi số T là thời điểm ban Giám đốc đến thăm hội trại

 Dòng thứ 2 ghi 2 số nguyên a, b là khoảng thời gian từ a đến b không có ai

ở hội trại Nếu không tìm đ-ợc ghi số 32675 hai lần

Cả hai file dữ liệu, các số trên một dòng cách nhau một ký tự trắng

Nhận xột: - Bài tập này cho dữ liệu là thời gian cú mặt của cỏc cỏn bộ do đú

ta dựng mảng một chiều để lưu trữ cỏc thời điểm của cỏn bộ (mảng thời gian là Tg)

- Sau đú ta tỡm giỏ trị lớn nhất và chỉ số của phần từ lớn nhất của cỏc phần tử trong mảng Tg là ta tỡm được thời điểm sớm nhất để ban Giỏm đốc đến thăm hội trại

- Cũn ý thứ 2 chớnh là nội dung của bài tập 2

- Nếu ta yờu cầu tỡm dóy con liờn tiếp nhau tăng dài nhất thỡ ta cú bài toỏn sau:

Bài tập 2.4: Cho dóy số nguyờn a1, a2, …,an (n<100) Hóy tỡm dóy con cỏc phần

tử liờn tiếp dài nhất thỏa món đơn điệu tăng

Vớ dụ cho dóy số: 1 3 4 2 3 5 6 3 1 2 Ta cú dóy đơn điệu tăng là: 2 3 5 6

Nhận xột: Ta dựng biến Max để lưu độ dài lớn nhất của dóy con đơn điệu

tăng, mỗi đoạn con đơn điệu tăng thỡ Max = i-j+1 (i là chỉ số cuối, j là chỉ số đầu), dựng biến d,c để lưu chỉ số đầu và chỉ số cuối của dóy đơn điệu tăng

Program toantoiuu;

Ngày đăng: 11/06/2016, 15:02

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w