ĐẶT VẤN ĐỀ 1/ Lí do chọn đề tài: Hiện nay, Tin học là bộ môn bắt buộc trong chương trình THPT, tuy là môn học bắt buộc nhưng không là một trong những môn thi tốt nghiệp trung học phổ thô
Trang 1A ĐẶT VẤN ĐỀ 1/ Lí do chọn đề tài:
Hiện nay, Tin học là bộ môn bắt buộc trong chương trình THPT, tuy là môn học bắt buộc nhưng không là một trong những môn thi tốt nghiệp trung học phổ thông quốc gia nên nhìn chung thái độ của học sinh (trừ học sinh các lớp chuyên Tin của các trường chuyên) đối với môn học này chưa thật sự tốt Mặt khác, chương trình Tin học nói chung và chương trình Tin học 11 nói riêng tương đối khô khan và khó hiểu Với Tin học lớp 11 học sinh bước đầu làm quen với việc lập trình sử dụng ngôn ngữ Pascal nên đại đa số các em đều cảm thấy rất khó hiểu, thấy trừu tượng Nhiều học sinh tâm sự rằng, mặc dù mình rất chịu khó đọc sách nhưng vẫn không hiểu mấy và thực sự cũng không cảm thấy hứng thú học môn này Các em tỏ ra rất lúng túng khi phải học nhiều kiểu dữ liệu và lúc lập trình phải suy nghĩ sử dụng kiểu nào cho hợp lí Bản thân tôi là giáo viên giảng dạy bộ môn Tin học, tôi nhận thấy trong việc giảng dạy cho học sinh, ngoài việc giúp học sinh lĩnh hội những kiến thức cơ bản Người 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 học sinh Bởi vì, khi có sự đam mê, các em tự nhiên sẽ học tập một cách tự giác, tích cực, chủ động để đạt được mục tiêu đặt ra
Tạo đam mê học tập cho học sinh không phải là việc làm đơn giản, không chỉ đơn giản là việc giáo viên phải nêu rõ mục tiêu cho mỗi tiết học mà còn thể hiện trong cách giáo viên gợi động cơ cho các em và đặc biệt là phải đầu tư thiết kế bài giảng cho mỗi tiết học thật chi tiết, thật lôi cuốn 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ủ Trong quá trình học lập trình,
để lập trình cho một bài toán cụ thể, một trong những điều quan trọng nhất là học sinh phải xác định các biến sử dụng trong chương trình và kiểu dữ liệu tương ứng của các biến đó sao cho hợp lí và chính xác Trong quá trình giảng
Trang 2dạy tôi nhận thấy các em học sinh tỏ ra khá lúng túng khi xác định kiểu dữ liệu, nhất là các kiểu dữ liệu như kiểu dữ liệu mảng một chiều, kiểu dữ liệu xâu…
Giải quyết vấn đề này, với mỗi kiểu dữ liệu mới, giáo viên ngoài việc cung cấp cho các em các kiến thức cơ bản về lý thuyết của kiểu dữ liệu đó cần dành nhiều thời gian để phân tích các ví dụ, các bài tập cơ bản có trong sách giáo khoa Ngoài ra, giáo viên nên chú ý chuẩn bị sẵn hệ thống các ví dụ, các bài tập cụ thể, cơ bản khác nhưng phù hợp với trình độ của học sinh lớp mình dạy Để từ việc tìm hiểu về các ví dụ đó học sinh không những củng cố về lý thuyết mà còn hiểu sâu sắc hơn kiểu dữ liệu tương ứng Xuất phát từ tinh thần
đó cũng như từ thực tế trình độ của học sinh các lớp 11 trường THPT Phạm
Văn Đồng mà tôi đang giảng dạy, tôi chọn đề tài: " Một số bài tập cơ bản về kiểu xâu tin học 11" , với mong muốn từ việc tìm lời giải cho các bài tập này
và thực hiện chúng trực tiếp trên máy tính các em học sinh sẽ cảm thấy thích thú và hiểu sâu kiến thức hơn
2/
Thực trạng trước khi thực hiện sáng kiến:
a) Thuận lợi:
Việc ứng dụng công nghệ thông tin vào tất cả các lĩnh vực được đề cao
Môn Tin học là môn chính khóa trong trường phổ thông
Các em học sinh thích được thực hành trên máy tính để nghiên cứu, tìm tòi
b) Khó khăn:
Trình độ học sinh không đồng đều và đa số không nắm vững kiến thức các môn tự nhiên
Đa số học sinh không thích môn Tin học, mang tâm lí Tin học 11 là môn trừu tượng, khó hiểu Giáo viên ít có sự đầu tư để cải tiến, nâng cao chất lượng dạy học
Trang 3c) Số liệu thống kê
Qua các lớp tôi đang dạy, khi học đến chủ đề Kiểu xâu đa số các em học
sinh còn lúng túng khi sử dụng đến kiểu dữ liệu mới, không hình dung được chương trình mà mình phải viết
Khảo sát thực tế lớp 11B2 (năm 2014-2015) có 37 học sinh khi đã dạy xong chủ đề "Kiểu xâu", tôi đã cho học sinh làm bài kiểm tra 15 phút về kiểu xâu như sau:
Bài tập: Viết chương trình nhập vào một xâu kí tự (độ dài không quá
100) và một kí tự bất kỳ từ bàn phím Thông báo xem kí tự đó có xuất hiện trong xâu vừa nhập hay không?
Tỷ lệ 8,1% 10,9% 35,1% 21,6% 16,2% 5,4% 2,7% 45,9% Với bài toán trên do học sinh chưa nắm vững kiến thức lập trình, đặc biệt còn lúng túng trong việc sử dụng kiểu dữ liệu nên còn gặp nhiều sai sót khi viết chương trình
Trang 4B NỘI DUNG
I Cơ sở lí luận.
Khi tìm hiểu đến chủ đề Kiểu dữ liệu có cấu trúc học sinh phải dựa
vào các kiểu dữ liệu chuẩn có sẵn để xây dựng nên các kiểu dữ liệu mới phục
vụ cho các yêu cầu cao hơn
Giáo viên có thể gợi động cơ bằng cách hỏi: "Với yêu cầu viết chương trình nhập vào họ tên của hai bạn học sinh bất kỳ, in ra màn hình bạn có tên dài hơn", với những kiểu dữ liệu mà em đã học liệu có thực hiện được yêu cầu này không? Từ đó dẫn dắt vào kiểu dữ liệu mới: "Kiểu xâu" Sau khi cho học sinh tìm hiểu những kiến thức cơ bản về lý thuyết kiểu dữ liệu này Giáo viên
có thể xây dựng hệ thống các bài tập và dẫn dắt học sinh giải quyết các bài tập này
II Chuẩn bị, nội dung và giải pháp thực hiện.
1/ Chuẩn bị
a/ Về phương pháp:
- Giáo viên chuẩn bị trước các bài tập cơ bản dạng kiểu xâu để phân tích, dẫn dắt cho học sinh làm
b/ Về phương tiện:
- Giáo viên chuẩn bị máy tính “để bàn hoặc xách tay”, một máy chiếu, một màn chiếu, bảng phụ …
- Học sinh cần có đầy đủ sách bút, vở ghi…
2/
Nội dung.
Bài tập 1: Viết chương trình nhập vào một xâu kí tự (độ dài không quá 100)
và một kí tự ch bất kỳ từ bàn phím Đếm số lần xuất hiện của kí tự ch trong
xâu kí tự vừa nhập
Ví dụ: Nhập vào xâu: 'HOC TOT TIN HOC', nhập kí tự: 'T' thì kết quả
số lần xuất hiện của kí tự 'T' trong xâu 'HOC TOT TIN HOC' là 3 lần.
GV hướng dẫn học sinh bằng cách đặt các câu hỏi cho học sinh trả lời: Nêu ý tưởng để giải bài toán? Làm thế nào để đếm được?
Trang 5HS: Kiểm tra kí tự vừa nhập với lần lượt từng kí tự trong xâu, nếu bằng nhau thì ta tăng số lần xuất hiện (biến đếm) lên 1
GV: Kiểm tra bằng cách nào?
HS: Sử dụng vòng lặp với số lần biết trước (số lần lặp bằng độ dài của xâu)
Với mỗi kí tự trong xâu lấy ra so sánh với kí tự ch.
Câu lệnh: for i:= 1 to length(xau) do để duyệt lần lượt từng kí tự trong
xâu
GV (giải thích thêm): Để lưu lại giá trị của số lần xuất hiện, ta sử dụng biến
dem, ban đầu biến này được khởi tạo bằng 0, lấy lần lượt từng kí tự trong xâu
ra so sánh với kí tự ch nếu chúng bằng nhau thì giá trị của biến đếm được tăng lên 1 Kết thúc vòng lặp, giá trị của biến dem chính là kết quả cần tìm.
GV: cho học sinh suy nghĩ, viết bài trong 5 phút sau đó gọi một em bất kỳ lên trình bày:
GV: yêu cầu các HS khác nhận xét và chữa bài cho hoàn chỉnh GV có thể thực hiện chạy chương trình hoàn chỉnh lên máy chiếu cho HS quan sát, gọi trực tiếp vài em lên nhập dữ liệu và xem kết quả thực hiện trên màn hình
Program baitap1;
Var s:string[100];
i, dem: byte;
ch: char;
Begin
Writeln('nhap vao xau bat ki:'); Readln(s);
Write('nhap mot ki tu bat ki:');
Readln(ch); dem:=0;
For i:= 1 to length(s) do
If s[i] = ch then dem:=dem+1;
Write('so lan xuat hien cua ki tu ', ch,' trong xau vua nhap la: ',dem);
Readln
End.
Trang 6Tiếp theo, từ chương trình vừa viết, giáo viên yêu cầu học sinh chỉnh sửa để thực hiện bài tập tiếp theo:
Bài tập 2: Viết chương trình nhập vào một xâu kí tự (độ dài không quá 100)
và một kí tự bất kỳ từ bàn phím Thông báo xem kí tự đó có xuất hiện trong xâu kí tự vừa nhập hay không?
Ví dụ: Nhập vào xâu: 'HOC TOT TIN HOC' nhập kí tự: 'T' thì kết quả là
kí tự có xuất hiện trong xâu vừa nhập
Với bài tập này, dù không khó nhưng học sinh lại lúng túng vì chương trình các em viết (sửa lại từ chương trình ở bài tập 1) đa số đều mắc chung
một lỗi là trong xâu vừa nhập có bao nhiêu kí tự giống kí tự ch thì chương
trình in ra bấy nhiêu dòng thông báo
GV: Giải thích cho HS hiểu, ở bài tập này gần giống như bài tập 1 nhưng chúng ta không đếm số lần nữa mà chỉ đưa ra thông báo là có xuất hiện hay không? Nếu kí tự đó xuất hiện nhiều lần ta cũng chỉ đưa ra một dòng thông báo có xuất hiện Vậy làm sao khắc phục lỗi này?
HS: Suy nghĩ để tìm ra câu trả lời
Để khắc phục lỗi này, giáo viên hướng dẫn học sinh kiểm tra giá trị của biến đếm trước khi in ra thông báo Nếu biến đếm lớn hơn 0 thì có xuất hiện
và ngược lại thì không xuất hiện Sau đó yêu cầu HS tự chỉnh sửa bài tập 1 để
có bài tập 2 hoàn chỉnh
Chương trình hoàn chỉnh có thể như sau:
Program baitap2;
Var s:string[100];
i, dem: byte;
ch: char;
Begin
Writeln('nhap vao xau bat ki:');
Readln(s);
Write('nhap mot ki tu bat ki:');
Trang 7Readln(ch); dem:=0;
For i:= 1 to length(s) do
If s[i] = ch then dem:=dem+1;
If dem>0 then
Write('ky tu ', ch, ' co xuat hien trong xau ',s)
Else
Write('ki tu ', ch, ' khong xuat hien trong xau ',s) Readln
End.
Để củng cố lại lần nữa các bài tập đếm với những yêu cầu khác nhau,
GV có thể yêu cầu học sinh tiếp tục chỉnh sửa chương trình để thực hiện bài tập sau:
Bài tập 3: Viết chương trình đếm số kí tự là chữ số trong một xâu kí tự được
nhập vào từ bàn phím
Ví dụ: Nhập vào xâu: 'HOC123' thì kết quả trả về là có 3 kí tự là chữ số
GV hỏi: Với bài tập này, điều kiện để biến dem tăng lên 1 là gì?
HS trả lời: Kiểm tra từng kí tự trong xâu (s) vừa nhập nếu kí tự nào là chữ số
thì biến dem được tăng lên 1.
GV: Câu lệnh sau sẽ thực hiện việc kiểm tra yêu cầu đó:
For i:= 1 to length(s) do
If (s[i]>='0') and (s[i] <='9') then dem:=dem+1;
HS tự chỉnh sửa để có bài tập 3, chương trình hoàn chỉnh như sau:
Program baitap3;
Var S: String;
i,dem: Byte;
Begin
Write(‘Nhap xau S: ‘);
Readln(S); dem:=0;
Trang 8For i:= 1 to length(s) do
If (s[i]>='0') and (s[i] <='9') then dem:=dem+1;
Write(‘So ki tu chu so trong xau la: ‘, dem);
Readln
End.
Trong quá trình học các hàm và thủ tục thao tác trên kiểu dữ liệu xâu, học sinh thường nhầm lẫn chức năng của hàm upcase(ch) Để giúp học sinh hiểu kỹ hơn về hàm này, Giáo viên nên cho hs làm bài tập cơ bản sau đây:
Bài tập 4: Viết chương trình nhập vào một xâu kí tự từ bàn phím Đổi xâu kí
tự đó sang chữ in hoa rồi in kết quả ra màn hình
Ví dụ: Nhập xâu 'Cham Hoc' sẽ cho ra xâu 'CHAM HOC'
GV nêu câu hỏi: Làm thế nào để khi ta nhập họ tên vào máy là chữ thường thì khi hiện lên trên màn hình là chữ in hoa?
HS: Sử dụng hàm upcase(ch)
GV: Nhưng hàm upcase(ch) chỉ đổi được 1 kí tự thành kí tự in hoa, ở đây chúng ta đổi cả 1 xâu kí tự? vậy chúng ta xử lý vấn đề này như thế nào?
HS: đưa ra cách xử lý
GV: Chúng ta đã biết có thể coi xâu là mảng 1 chiều mà mỗi phần tử là một
kí tự Mỗi kí tự của xâu được đánh số thứ tự thường bắt đầu từ 1, số kí tự của xâu chính là độ dài của xâu Vậy để có thể chuyển 1 xâu nhập từ bàn phím thành chữ in hoa thì ta sẽ chuyển từng kí tự trong xâu thành kí tự in hoa: duyệt lần lượt từng phần tử trong xâu và gán phần tử đó bằng giá trị mới upcase(ch);
Câu lệnh for i:=1 to length(s) do S[i]:=upcase(S[i]); dùng để thực hiện
yêu cầu đó
Giáo viên gọi học sinh lên bảng viết chương trình HS viết chương trình, sau
đó GV nhận xét, sửa chữa Chạy chương trình để học sinh theo dõi kết quả thực hiện
Chương trình bài tập 4:
Trang 9Program baitap4;
Var S: String;
i:Byte;
Begin
Write(‘Nhap xau S: ‘); Readln(S);
For i:=1 to length(S) do S[i]:=Upcase(S[i]);
Write(‘Xau ket qua: ‘, S);
Readln End.
Bài tập 5: Viết chương trình nhập vào một xâu từ bàn phím, đưa ra màn hình
xâu đảo ngược của xâu vừa nhập
Trước tiên cần giải thích cho HS xâu đảo ngược tức là xâu có được bằng cách đọc ngược các kí tự trong xâu vừa nhập (đọc ngược từ phải sang trái) Sau khi giải thích xong GV hỏi: Làm thế nào để đọc ngược xâu?
HS: duyệt xâu theo thứ tự ngược, dòng vòng lặp for-do dạng lùi
GV: Với mỗi kí tự đọc ngược, ghép ký tự đó vào xâu mới, xâu này ban đầu được khởi tạo bằng rỗng Yêu cầu học sinh suy nghĩ để viết chương trình
GV yêu cầu HS lên chạy chương trình trực tiếp trên máy chiếu và sau đó chỉnh sửa, chiếu chương trình hoàn chỉnh lên cho hoc sinh quan sát:
Program baitap5;
Var S, Ng: String;
i: Byte;
Begin
Write(‘Nhap xau S: ‘);
Readln(S);
ng:='';
For i:= Length(S) downto 1 do
ng:=ng+s[i];
write('xau dao nguoc la: ', ng);
Trang 10End.
Bài tập 6: Viết chương trình nhập vào từ bàn phím một xâu Kiểm tra xâu đó
có phải là xâu đối xứng hay không? (Tính chất của xâu đối xứng: đọc nó từ phải sang trái cũng thu được kết quả giống như đọc từ trái sang phải)
Ở bài tập này, GV yêu cầu học sinh dựa vào tính chất của xâu đối xứng
để nêu ý tưởng HS dựa vào tính chất xâu đối xứng và dựa vào kiến thức trong bài tập 5 vừa làm có thể hình thành ngay ý tưởng giải bài tập trên Với bài tập này, đa số các em đều làm theo cách tạo xâu đảo ngược từ xâu ban đầu vừa nhập, sau đó kiểm tra nếu xâu đảo ngược bằng xâu ban đầu thì kết luận xâu đối xứng GV yêu cầu học sinh chỉnh sửa bài tập 5 để có bài tập 6:
Program baitap6;
Var S, Ng: String;
i: byte;
Begin
Write(‘Nhap xau S: ‘);
Readln(S); ng:='';
For i:= Length(S) downto 1 do
ng:=ng+s[i];
if s=ng then
write('xau doi xung') else
write('xau khong doi xung');
Readln
End.
Ngoài cách kế thừa bài tập 5 ra, giáo viên có thể hướng dẫn để học sinh viết chương trình theo cách khác không dùng cách tạo xâu đảo ngược Gợi ý cho học sinh khai thác khả năng tham chiếu đến từng kí tự trong xâu thông qua vị trí của kí tự này Như vậy, không nhất thiết phải tạo một xâu mới để
Trang 11cuối cùng so sánh hai xâu, mà chỉ cần so sánh các cặp kí tự ở vị trí đối xứng nhau để kết luận xâu là là xâu đối xứng hay không, chỉ cần xuất hiện một cặp
kí tự ở vị trí đối xứng mà không đối xứng thì xâu đó không đối xứng Hướng dẫn học sinh tìm các vị trí đối xứng
GV: kí tự thứ nhất đối xứng với kí tự nào trong xâu?
HS: kí tự ở vị trí 1 đối xứng với kí tự ở vị trí x (với x là độ dài xâu)
GV: tương tự vị trí thứ 2 đối xứng với vị trí thứ x-1, thứ 3 với vị trí x-2,
…
Vậy vị trí thứ i sẽ đối xứng với vị trí nào?
HS: vị trí thứ x-i+1
Như vậy vòng lặp chỉ cần chạy (x div 2) lần là được
Yêu cầu học sinh về nhà làm tiếp bài tập theo cách thứ 2 này
Để học HS có thể hiểu và thành thạo các thao tác xử lí xâu, GV tiếp tục đưa ra các bài tập sau:
Bài tập 7: Viết chương trình nhập một xâu từ bàn phím, đưa ra màn hình xâu
thu được từ nó sau khi loại bỏ các dấu cách có trong xâu
GV hướng dẫn học sinh có thể sử dụng các thao tác xử lí xâu để giải quyết bài tập này, cho học sinh thảo luận để tìm ra cách giải
GV gợi ý: Kết quả ta đưa ra là xâu sau khi loại bỏ những kí tự là dấu cách (học sinh có thể biểu diễn kí tự là dấu cách là dấu cách đặt trong cặp nháy đơn ' ' hoặc biểu diễn bằng mã của dấu cách là #32), xâu OUTPUT sẽ chứa tất cả các kí tự trong xâu INPUT trừ kí tự là dấu cách Như vậy, dựa vào các kiến thức đã học ta có thể xử lý yêu cầu trên theo 2 cách: Cách 1: Sử dụng phép ghép xâu tạo xâu mới gồm tất cả các kí tự trong xâu INPUT mà khác kí
tự là dấu cách
Cách 2: Sử dụng thủ tục delete(st,vt,n) để xóa tất cả các kí tự là dấu cách trong xâu INPUT
Trang 12Hướng dẫn HS để viết chương trình theo 2 cách: Với Cách 1, hướng dẫn cách khởi tạo xâu rỗng, kiểm tra lần lượt từng kí tự trong xâu ban đầu nếu kí tự nào khác kí tự dấu cách (#32) thì được ghép vào xâu rỗng vừa khởi tạo
Cách thứ 2 cần hướng dẫn học sinh bằng cách đặt các câu hỏi dẫn dắt như:
Làm sao để xác định được vị trí chứa kí tự là dấu cách trong xâu vừa nhập? Để xóa kí tự là dấu cách đó ta dùng thủ tục nào? Việc xóa các kí tự là dấu cách sẽ chấm dứt khi nào? Số lần lặp lại này là xác định hay không xác định?
Chương trình theo 2 cách có thể như sau:
Cách 1:
Program baitap7_1;
Var S, S1: String;
i :Byte;
Begin
Write(‘Nhap xau S: ‘);
Readln(S);
S1:=''; {khoi tao xau rong}
For i:=1 to length(s) do
If s[i]<>#32 then s1:=s1+s[i];
Writeln('ket qua la: ', s1);
Readln
End.
Cách 2:
Program baitap7_2;
Var S: String;
i,vt :Byte;
Begin
Write(‘Nhap xau S: ‘);
Readln(S);