Lý do chọn đề tài Bài toán trong tin học là bài toán xuất phát từ bài toán thực tế, việc xây dựng giải thuật để giải bài toán tin học bằng máy tính phải bảo đảm những tính chất cơ bản củ
Trang 11 MỞ ĐẦU
1.1 Lý do chọn đề tài
Bài toán trong tin học là bài toán xuất phát từ bài toán thực tế, việc xây dựng giải thuật để giải bài toán tin học bằng máy tính phải bảo đảm những tính chất cơ bản của thuật toán, trong các tính chất cơ bản đó thì yêu cầu về thuật toán sau khi đã được cài đặt chương trình trên máy tính bằng ngôn ngữ lập trình thì thuật toán đó là tối ưu Đây là yêu cầu rất quan trọng đối với người lập trình
Trong việc giảng dạy lập trình cho HS, ngoài việc giúp HS lĩnh hội những kiến thức cơ bản Giáo viên còn phải biết kích thích tính tích cực, sự sáng tạo say mê học hỏi của HS trong việc học tập của các em Bởi vì, việc học tập tự giác, tích cực, chủ động và sáng tạo đòi hỏi HS phải có ý thức về những mục tiêu đặt ra và tạo được động lực bên trong thúc đẩy bản thân họ hoạt động để đạt các mục tiêu đó
Chương trình Tin học lớp 11 là một môn học khó, kiến thức thì trải rộng nhưng đòi hỏi các em phải biết vận dụng kiến thức của từng bài sắp xếp một cách lôgic để lập trình giải một bài toán hoàn chỉnh Tuy nhiên trong thực
tế rất ít HS làm được điều đó Hầu hết các em vận dụng câu lệnh, cú pháp không phù hợp cho yêu cầu của bài tập
Là một giáo viên giảng dạy môn Tin học ở trường THPT mà cơ sở vật chất của trường còn thiếu thốn, tuy nhiên để hưởng ứng đổi mới phương pháp giảng dạy nên nhà trường đã đầu tư rất mạnh về trang thiết bị như máy tính, máy chiếu, …, tạo cơ hội cho giáo viên tìm hiểu, ứng dụng vào dạy học Các cách thiết kế bài giảng hiện nay nhằm mục đích áp dụng phương pháp hiện đại để bồi dưỡng cho học sinh năng lực ham muốn học hỏi, tư duy sáng tạo, năng lực tự giải quyết vấn đề, rèn luyện và phát triển năng lực tự học sáng tạo, nghiên cứu, nghĩ và làm việc một cách tự chủ, …
Xuất phát từ thực tiễn giảng dạy tại trường THPT Mai Anh Tuấn tôi thấy rằng, để đạt hiệu quả cao trong mỗi phần học, tiết học cần có cách thiết
kế bài giảng cho phù hợp với nội dung kiến thức; phương pháp, phương tiện dạy học phải phù hợp với từng đối tượng học sinh Để qua mỗi phần học, tiết học học sinh thích thú với kiến thức mới, qua đó hiểu được kiến thức đã học trên lớp, đồng thời học sinh thấy được tầm quan trọng của vấn đề và việc ứng dụng của kiến thức trước hết để đáp ứng những yêu cầu của môn học, sau đó
là việc ứng dụng của nó vào các công việc thực tiễn trong đời sống xã hội (nếu có)
Qua nhiều năm giảng dạy tại trường, đa số các HS là con em thuần nông vì điều kiện kinh tế của gia đình còn khó khăn nên phương tiện học tập bộ môn (máy
vi tính) hầu như rất ít Mặt khác, đa số các em chưa có kỹ năng lập trình hay kỹ
năng phân tích, thiết kế về lập trình chưa được tốt nên tôi chọn đề tài “ Một số giải pháp giúp học sinh xây dựng chương trình dựa trên ý tưởng và các thuật toán cơ bản trong lập trình pascal- tin họ c 11 ”
Trang: 1
Trang 2Qua đề tài này, tôi muốn chia sẻ một số kinh nghiệm nho nhỏ của mình đến các đồng nghiệp cũng như các em HS có niềm đam mê lập trình qua
đó hình thành một số kỹ năng về lập trình cho tốt hơn
1.2 Mục đích nghiên cứu:
Như ta đã biết 1 thuật toán đưa ra thì chỉ có thể giải được một bài toán, nhưng một bài toán thì có thể có nhiều cách (thuật toán) để giải nó Chính vì vậy đứng trước một bài toán chúng ta phải hướng cho học sinh lựa chọn được thuật toán tối ưu nhất để viết chương trình
Trong đề tài này tôi muốn đưa ra một số phương pháp dẫn dắt học sinh tìm ra những giải pháp để có thể lập trình tốt hơn một số bài tập trong sách giáo khoa tin học 11 dựa trên ý tưởng và các thuật toán cơ bản
1.3 Đối tượng nghiên cứu:
Đối tượng nghiên cứu: HS lớp 11 bậc trung học phổ thông tại trường THPT Mai Anh Tuấn
Phạm vi nghiên cứu: Một số mảng kiến thức lý thuyết và bài tập đã được nêu trong các bài học của chương IV, V và VI từ trang 52 đến trang 117 sách giáo khoa Tin học 11 bậc trung học phổ thông
1.4 Phương pháp nghiên cứu:
Sáng kiến kinh nghiệm của tôi dựa theo các phương pháp: Nghiên cứu sách giáo khoa, các tài liệu liên quan đến chuyên môn, đối chiếu, so sánh, phân tích và tổng hợp kết quả đánh giá kết quả học tập của HS
2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM
2.1 Cơ sở lí luận của sáng kiến kinh nghiệm:
Hiện nay trong lý luận dạy học nói chung và lý luận dạy học môn Tin học nói riêng yêu cầu sử dụng khá nhiều phương pháp: thảo luận, chia nhóm, hỏi đáp, … Các cách thiết kế bài giảng hiện nay nhằm mục đích áp dụng phương pháp hiện đại để bồi dưỡng cho HS năng lực tư duy sáng tạo, năng lực giải quyết vấn đề, … rèn luyện và phát triển năng lực tự học sáng tạo Phương pháp dạy học hiện nay, người thầy chủ yếu là người định hướng, người cố vấn giúp HS tự đánh giá và phát triển năng lực của mình theo phương pháp định hướng và phát triển năng lực của HS
Khi tiếp xúc với một bài toán trong tin học, HS thường cố gắng tìm ra thuật toán tốt nhất để giải quyết trọn vẹn bài toán, đối với những bài toán đơn giản HS có thể tìm ra ngay thuật toán nhưng đối với những bài toán khó đặc biệt là những bài toán có dữ liệu đầu vào lớn thì việc tìm ra thuật toán tối ưu nhất để đạt được số điểm tối đa thường là rất khó HS không nghĩ được rằng nếu sử dụng những giải thuật đơn giản để giải quyết các bài toán khó thì cho
dù không đạt được số điểm tối đa nhưng cũng có được một điểm số ở một mức độ nào đó phù hợp với khả năng của mình để tránh điểm không
Để rèn luyện kỹ năng tiếp cận bài toán nhằm giúp HS có được kinh nghiệm tiếp cận bài toán khó bằng nhiều thuật toán theo từng bước từ đơn giản đến phức tạp phù hợp với khả năng của mình để có được điểm số tốt nhất
Trang 3đòi hỏi người giáo viên cần rèn luyện kỹ năng tiếp cận bài toán để làm giảm
độ phức tạp của bài toán
Khi giải một bài toán trong Tin học, chúng ta cần chọn một trong số các thuật toán tốt nhất để giải bài toán đó
2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm:
Mặc dù HS có ý thức học tốt, ham học hỏi nhưng đa số HS của trường được tuyển sinh vào lớp 10 với chất lượng đầu vào chưa thật sự cao dẫn đến
tư duy của các em còn nhiều hạn chế đối với những môn học đòi hỏi tư duy
cao Đặc thù của môn tin học là một môn có kiến thức trừu tượng, đặc biệt là
môn tin học lớp 11 với một số phần như kiểu mảng, kiểu xâu và chương trình con nên các em HS còn tiếp thu chậm và tư duy học lập trình chưa được tốt
Để giúp các em HS tiếp thu tốt và rèn luyện cho các em HS về kỹ năng phân tích bài toán cũng như lập trình thì sáng kiến kinh nghiệm của tôi sẽ đưa ra một số biện pháp như sau:
Để giải một bài toán tin học trên máy tính chúng ta thường phải thực hiện theo từng bước:
Bước đầu tiên (Xác định bài toán) đây là bước quan trọng nhất để
hiểu rõ nội dung bài toán
Đây là yêu cầu quen thuộc đối với những người làm toán Để hiểu bài toán theo cách tiếp cận của tin học ta phải xây dựng một số ví dụ phản ánh đúng các yêu cầu đề ra của đầu bài rồi thử giải các ví dụ đó để hình thành dần những hướng đi của thuật toán
Bước thứ hai (Ý tưởng) là dùng một ngôn ngữ quen thuộc, tốt nhất là
ngôn ngữ toán học đặc tả các đối tượng cần xử lí ở mức độ trừu tượng, lập các tương quan, xây dựng các hệ thức thể hiện các quan hệ giữa các đại lượng cần
xử lí để có được thuật toán tốt nhất có thể
Bước thứ ba (Xây dựng thuật toán)là bước xác định cấu trúc dữ liệu
để biểu diễn các đối tượng cần xử lí cho phù hợp với các thao tác của thuật toán
Trong những bước tiếp theo ta tiếp tục làm mịn dần các đặc tả theo
trình tự từ trên xuống, từ trừu tượng đến cụ thể, từ đại thể đến chi tiết
Bước cuối cùng là sử dụng ngôn ngữ lập trình đã chọn để viết chương
trình hoàn chỉnh Ở bước này ta tiến hành theo kĩ thuật đi từ dưới lên, từ những thao tác nhỏ đến các thao tác tổ hợp
Sau khi nhận được chương trình ta cho chương trình chạy thử với các
dữ liệu lấy từ các ví dụ đã xây dựng ở bước đầu tiên
Chúng ta sẽ vận dụng cách tiếp cận trên để giải một số bài tập cụ thể được nêu trong sách giáo khoa tin học 11
Trang: 3
Trang 42.3 Các giải pháp đã sử dụng để giải quyết vấn đề:
2.3.1 Hệ thống một số nội dung lý thuyết cần nghiên cứu bài tập:
2.3.1.1 Kiểu mảng một chiều
a Khái niệm: Mảng một chiều là dãy hữu hạn các phần tử cùng kiểu.
Mảng được đặt tên và một phần tử của nó có một chỉ số Để mô tả mảng một chiều cần xác định kiểu của các phần tử và cách đánh số các phần tử của nó
Các quy tắc, cách thức khi làm việc với mảng một chiều trong ngôn ngữ lập trình:
- Tên kiểu mảng một chiều;
- Số lượng phần tử mảng;
- 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ử;
b Khai báo:Tổng quát, khai báo biến một chiều gồm có hai dạng:
- Cách 1: Khai báo trực tiếp
Var <Tên biến mảng>: Array [<Kiểu chỉ số>] of <Kiểu phần tử>;
- Cách 2: Khai báo gián tiếp
Type <Tên kiểu mảng> = Array [<Kiểu chỉ số>] of <Kiểu phần tử>; Var <Tên biến mảng>:<Tên kiểu mảng> ;
- Trong đó:
+ Kiểu chỉ số: thường là một đoạn số nguyên liên tục có dạng n1 n2 với n1, n2 là các hằng hoặc biểu thức số nguyên xác định chỉ số đầu và chỉ số
cuối (n1 ≤ n2)
+ Kiểu phần tử: là kiểu của các phần tử mảng
Ví dụ 1: Hãy viết câu lệnh khai báo biến A là dãy số thực có 15 phần tử;
Ví dụ 2: Hãy viết câu lệnh khai báo các biến M, N, P là dãy số
nguyên có 25 phần tử;
- Trong quá trình giảng dạy trên lớp, tôi đã hướng dẫn và giải thích
cho HS lúc nào thì khai báo biến theo cách 1 (Trực tiếp), lúc nào thì khai báo biến theo cách 2 (Gián tiếp) để HS khỏi thụ động trong lúc khai báo biến
thuộc kiểu mảng một chiều
- Trong 2 ví dụ ở trên, tôi đã hướng dẫn HS khai báo biến như sau:
Ví dụ 1:
Var A : Array [1 15] of Real;
Ví dụ 2:
Type songuyen = Array [1 25] of Integer;
Var M, N, P : songuyen;
- Tham chiếu phần tử của mảng một chiều được xác định bởi tên biến mảng cùng với chỉ số, được viết trong cặp ngoặc [ và ]
Ví dụ 3: Tham chiếu phần tử thứ 10 của dãy số nguyên M như ví dụ 2
được viết là M[10]
Trang 5Chỉ số phần tử 1 2 10 24 25
Hình 1: Minh họa tham chiếu tới mảng một chiều
2.3.1.2 Kiểu xâu
a Khái niệm
Xâu là dãy các ký tự trong bộ mã ASCII, mỗi ký tự là một phần tử của xâu Số lượng ký tự trong xâu được gọi là độ dài của xâu Xâu có độ dài bằng
0 được gọi là xâu rỗng
Bản chất của kiểu xâu là kiểu mảng một chiều mà mỗi phần tử là một
kí tự Dựa vào điều này giáo viên cần gợi ý để HS nhận xét và thấy rõ được đặc điểm của kiểu xâu
Từ cách dẫn dắt đặt vấn đề trên HS có thể hiểu và xem xâu kí tự là một mảng một chiều mà mỗi phần tử là một kí tự Điều đó sẽ có ích rất nhiều trong việc sử dụng các câu lệnh lặp để duyệt qua các kí tự để tham chiếu đến một kí tự nào đó trong xâu
Mặc dù xâu có thể xem như mảng một chiều, tuy nhiên khi làm việc với dãy hữu hạn các kí tự mà xem như một xâu thì người lập trình được sử dụng rất nhiều câu lệnh cũng như các thủ tục và hàm, điều này sẽ thuận lợi hơn rất nhiều trong khi viết chương trình Từ đó có thể nhấn mạnh để HS hiểu
rõ hơn về vai trò của kiểu xâu
b Khai báo
Biến kiểu xâu được khai báo như sau:
Var <Tên biến xâu> : String [<Độ dài lớn nhất của xâu>];
Trong đó: Độ dài lớn nhất của xâu không vượt quá 255 Trong mô tả
xâu có thể bỏ qua phần khai báo độ dài, khi đó độ dài lớn nhất của xâu sẽ nhận giá trị ngầm định là 255
Ví dụ:
Var S : String [30];
S1: String; {Nghĩa là S1 có độ dài ngầm định là 255}
2.3.1.3 Chương trình con
Ngoài các nội dung đã giới thiệu ở trên thì chương trình con là một nội dung mà HS khó tiếp cận nhất trong nội dung tin học 11 Vì đây là phần lập trình có cấu trúc Vì vậy, hiểu chi tiết biến, về cấu trúc của chương trình con dạng thủ tục và hàm, về lời gọi chương trình con cũng như cách truyền tham số cho chương trình con sẽ mang tính quyết định trong việc viết chương trình có sử dụng chương trình con Ta sẽ xét cụ thể từng phần như sau:
Trang: 5 M[10]
Trang 6a Cấu trúc của chương trình con
Cấu trúc của chương trình con tương tự như cấu trúc của một chương trình, nhưng nhất thiết phải có tên và phần đầu để khai báo tên, nếu là hàm thì phải khai báo kiểu dữ liệu trả về của hàm Cấu trúc của chương trình con như sau:
<Phần đầu>
[<Phần khai báo>]
<Phần thân>
b Tham số hình thức
Các biến được khai báo cho dữ liệu vào/ra được gọi là tham số hình
thức của chương trình con.
Các biến được khai báo để dùng riêng trong chương trình con được gọi là biến cục bộ
Biến toàn cục là biến được dùng trong chương trình chính và các chương trình con đều được sử dụng biến toàn cục
c Tham số thực sự
Để thực hiện một chương trình con, ta cần phải có lệnh gọi nó gồm tên chương trình con với tham số (nếu có) là các hằng và các biến chứa dữ liệu vào và ra tương ứng với các tham số hình thức được đặt trong cặp ngoặc (và)
Các hằng và biến này được gọi là các tham số thực sự.
Sau khi chương trình con kết thúc, lệnh tiếp theo lệnh gọi chương trình con sẽ được thực hiện
d Cấu trúc của thủ tục
Thủ tục có cấu trúc như sau:
Procedure <Tên thủ tục>[(<Danh sách tham số>)];
[<Phần khai báo>]
Begin
[<Dãy các lệnh>]
End;
Trong đó:
- Danh sách tham số có thể có hoặc không
- Phần khai báo: dùng để xác định các hằng, kiểu, biến và cũng có thể
là các chương trình con khác được sử dụng trong thủ tục
e Cấu trúc của hàm
Hàm có cấu trúc như sau:
Function <Tên hàm>[(<Danh sách tham số>)]:<Kiểu dữ liệu>;
[<Phần khai báo>]
Begin
[<Dãy các lệnh>]
<Tên hàm> := <Biểu thức>;
End;
Cũng giống như thủ tục, nếu hàm không có tham số hình thức thì
không cần có danh sách tham số.
Trang 7Để làm rõ những nội dung đã trình bày ở trên, SKKN giới thiệu một
số bài tập và các bước tiến hành để lập trình giải một số bài toán cụ thể sau:
2.3.2 Một số bài tập
Bài tập 1: Viết chương trình nhập vào dãy số nguyên gồm n phần tử.
Tìm chỉ số (vị trí) và giá trị lớn nhất của dãy số vừa nhập rồi đưa kết quả ra màn hình
Đối với bài toán này, tôi yêu cầu học sinh nhắc lại các bước: xác định bài toán, ý tưởng và thuật toán (đã được nghiên cứu trong chương trình tin học 10) Sau đó học sinh dựa vào thuật toán để đưa ra những câu lệnh cơ bản phải sử dụng để lập trình và cuối cùng là chỉnh sửa để được một chương trình hoàn chỉnh
* Xác định bài toán:
- Input: Nhập n (n Z+) và dãy số nguyên: a1, a2, …, an
- Output: Chỉ số và giá trị lớn nhất trong dãy số đã cho.
* Ý tưởng:
- Khởi tạo Max = a 1 , vt =1
- Lần lượt với i từ 2 đến n, so sánh giá trị số hạng a i với giá trị Max,
nếu ai > Max thì Max nhận giá trị mới là ai và vt = i.
* Thuật toán:
- Bước 1: Nhập n và dãy số a1, a2, …, an
- Bước 2: Max a1, vt 1, i 2;
- Bước 3: Nếu i > N thì đưa ra giá trị Max và vt rồi kết thúc;
- Bước 4:
Bước 4.1 Nếu a i > Max thì Max ai;
Bước 4.2 i i +1 rồi quay lại bước 3; [1]
* Chương trình:
Program baitap1;
Uses crt;
Var a: Array [1 100] of Integer;
i, n, max, vt: integer;
Begin
Clrscr;
Write(‘Nhap so luong phan tu: ’); Readln(n);
For i := 1 to n do Begin
Write(‘a[’, i, ‘] = ’);
Readln(a[i]);
End;
Max := a[1];
vt := 1;
For i := 2 to n do
If a[i] > max Then
Trang: 7
Trang 8Max := a[i];
Vt := i;
End;
Write(‘Gia tri lon nhat cua day la: ’, max);
Write(‘Gia tri lon nhat o tai vi tri: ’, vt);
Readln;
End [ 2]
Bài tập 2: Viết chương trình nhập vào từ bàn phím một xâu S Thay
thế tất cả các cụm kí tự ‘anh’ bằng cụm kí tự ‘em’ rồi đưa kết quả ra màn
hình
Đối với bài toán này, tôi yêu cầu học sinh làm các bước: xác định bài toán, ý tưởng và thuật toán Sau đó học sinh dựa vào thuật toán để đưa ra những câu lệnh cơ bản có thể sử dụng để lập trình và cuối cùng là chỉnh sửa
để được một chương trình hoàn chỉnh
* Xác định bài toán:
- Input: Nhập một xâu S
- Output: Thay thế tất cả các cụm kí tự ‘anh’ bằng cụm kí tự ‘em’.
* Ý tưởng:
- Tìm vị trí xâu con ‘anh’ trong xâu S đã cho;
- Xóa xâu con này đi rồi chèn xâu ‘em’ vào vị trí đó
- Lặp lại quá trình này cho đến khi không tìm thấy xâu ‘anh’ cần thay
thế trong xâu S nữa
* Thuật toán:
- Bước 1: Nhập xâu S
- Bước 2: Chừng nào còn tìm thấy xâu con ‘anh’ trong xâu S thì còn
làm các công việc sau:
Bước 2.1: Tìm vị trí bắt đầu của xâu ‘anh’ trong xâu S;
Bước 2.2: Xóa xâu ‘anh’ vừa tìm thấy;
Bước 2.3: Chèn xâu ‘em’ vào xâu S tại vị trí trước đây xuất hiện xâu
‘anh’
- Bước 3: In kết quả
* Chương trình:
Program Baitap2;
Uses crt;
Var s: string;
Vt: byte;
Begin
Write(‘Nhap xau S: ’); Readln(s);
While pos (‘anh’, s) <> 0 Do
Begin
Vt := pos(‘anh’, s);
Trang 10Delete(s,vt,3) Insert(‘em’,s,vt);
End;
Write(‘Xau sau khi duoc thay the la: ’, s);
Readln;
End [2] [3]
Bài tập 3: Viết chương trình nhập vào dãy số nguyên có n phần tử.
Ghi dãy số nguyên vừa nhập vào tệp có tên là VIDU.INP
Đối với bài toán này, tôi yêu cầu học sinh làm các bước: xác định bài toán, ý tưởng và thuật toán Sau đó học sinh dựa vào thuật toán để đưa ra những câu lệnh
cơ bản có thể sử dụng để lập trình và cuối cùng là chỉnh sửa để được một chương trình hoàn chỉnh.
* Xác định bài toán:
Input: Nhập N và dãy số nguyên a1, a2, …, a3
Output: Tệp VIDU.INP chứa dãy số vừa nhập
* Ý tưởng:
Gắn tên tệp và mở tệp để ghi;
Nhập n (số lượng phần tử)
Nhập dãy số và ghi dữ liệu vào tệp
Đóng tệp
* Thuật toán:
Bước 1: Gắn tên tệp Assign(f1, ‘C:\VIDU.INP’);
Bước 2: Mở tệp để ghi Rewrite(f1);
Bước 3: Nhập n (số lượng phần tử);
Bước 4: i 1;
Bước 5: Nếu i > n thì sang bước 7
Bước 6:
Bước 6.1: Nhập giá trị cho dãy số và ghi vào tệp f1;
Bước 6.2: i i + 1 quay lại bước 5;
Bước 7: Đóng tệp
* Chương trình:
Program Baitap3;
Uses crt;
Var f: text;
a : Array[1 100] of Integer;
i, n : Integer;
Begin
Clrscr;
Assign(f, ‘C:\VIDU.INP’);
Rewrite(f);
Write(‘Nhap so luong phan tu: ’);
Readln(n);
For i := 1 to n do