Một số phương pháp rèn luyện tư duy lập trình pascal cho học sinh qua các dạng bài tập kiểu xâu - Pdf 44

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HÓA

TRƯỜNG THPT TRẦN PHÚ NGA SƠN
------------***------------

SÁNG KIẾN KINH NGHIỆM

MỘT SỐ PHƯƠNG PHÁP RÈN LUYỆN TƯ DUY LẬP
TRÌNH PASCAL CHO HỌC SINH QUA CÁC DẠNG
BÀI TẬP KIỂU XÂU

Họ và tên:
Phạm Thị Nhung
Chức vụ:
Giáo viên
SKKN thuộc bộ môn: Tin học

THANH HÓA NĂM 2017


MỤC LỤC
1. MỞ ĐẦU............................................................................................. 1
1.1. LÍ DO CHỌN ĐỀ TÀI...........................................................................1
1.2. MỤC ĐÍCH NGHIÊN CỨU..................................................................2
1.3. ĐỐI TƯỢNG NGHIÊN CỨU................................................................2
1.4. PHƯƠNG PHÁP NGHIÊN CỨU..........................................................3

2. NỘI DUNG SÁNG KIẾN KINH NGHIỆM.........................................3
2.1. CƠ SỞ LÝ LUẬN CỦA SÁNG KIẾN KINH NGHIỆM.......................3
2.2. THỰC TRẠNG CỦA VẤN ĐỀ.............................................................3
2.3. CÁC GIẢI PHÁP ĐÃ SỬ DỤNG ĐỂ GIẢI QUYẾT VẤN ĐỀ............4

ra những bài toán phù hợp, kích thích được sự độc lập, tích cực của học sinh trong
học tập. Trên cơ sở đó, học sinh có thể tự mình tìm ra được những ý tưởng sáng tạo
vận dụng thiết thực vào cuộc sống thực tế khi nhu cầu nảy sinh, khi đó các em có
thể tự mình hoàn thành được ý tưởng đó.
Trong các vấn đề về Tin học được đưa vào giảng dạy ở chương trình bậc học
phổ thông hiện nay. Khi nói đến vấn đề dạy học lập trình pascal cho học sinh, các
kiểu dữ liệu chuẩn không đủ biểu diễn dữ liệu của các bài toán trong thực tế. Các
ngôn ngữ lập trình có quy tắc, cách thức cho phép người lập trình xây dựng những
kiểu dữ liệu phức tạp từ những kiểu đã có. Một trong số đó là kiểu xâu là kiểu dữ
liệu có cấu trúc, dữ liệu kiểu phi số - dạng kí tự; Là kiểu dữ liệu không kém phần
quan trọng trong lập trình Pascal.
Vấn đề đặt ra là: Dạy học sinh kiểu xâu như thế nào để đạt hiệu quả? Đó
chính là lí do tôi quyết định chọn đề tài: “Một số phương pháp rèn luyện tư duy
lập trình Pascal cho học sinh qua các dạng bài tập kiểu xâu”.

1.2. MỤC ĐÍCH NGHIÊN CỨU
- Giúp học sinh có cái nhìn đúng đắn hơn về lập trình và tự tin hơn, chủ động
hơn khi giải các bài tập kiểu xâu một cách hiệu quả để hoàn thành chương trình một
cách tốt nhất.

1.3. ĐỐI TƯỢNG NGHIÊN CỨU
- Học sinh khối 11 Trường THPT Trần Phú và đặc biệt là các đối tượng học
sinh ôn luyện học sinh giỏi.
2


1.4. PHƯƠNG PHÁP NGHIÊN CỨU
- Thực tiễn giảng dạy học sinh khối 11;
- Tham khảo SGK, SGV Tin học 11 và tài liệu về ngôn ngữ lập trình Pascal;


người thầy 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 trong việc học tập, đòi hỏi học sinh 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 đó.
Trên cơ sở những kiến thức mà học sinh được học về lập trình để viết
chương trình bằng ngôn ngữ lập trình Pascal, học sinh có thể chủ động vận dụng
kiến thức về “Kiểu xâu” để giải quyết bài toán trong thực tế. Bởi vì, ngôn ngữ
Pascal có tính cấu trúc mạnh, có cơ sở và nó đòi hỏi chương trình phải chặt chẽ,
3


logic. Đặc biệt, khi được trang bị kiến thức vững vàng học sinh có thể có kỹ năng
viết chương trình tốt hơn, nhìn nhận vấn đề một cách sáng sủa hơn, chặt chẽ hơn và
nhất là xây dựng được thuật toán tối ưu có thể giúp cho các em hoàn thành những
chương trình lớn hơn vượt ra những bài toán bình thường mà nội bộ môn học đòi
hỏi. Chính vì vậy, bản thân tôi cần phải nỗ lực tìm tòi, sáng tạo giúp cho học sinh
nhìn nhận vấn đề một cách tích cực hơn, sáng tạo hơn và nhất là giúp cho các em có
thể yêu thích nhiều hơn nữa ngôn ngữ lập trình Pascal thông qua các bài toán cụ thể.

2.3. CÁC GIẢI PHÁP ĐÃ SỬ DỤNG ĐỂ GIẢI QUYẾT VẤN ĐỀ
Bằng những kiến thức về Tin học và những kinh nghiệm của bản thân trong
công tác giảng dạy bộ môn Tin học, để phát triển khả năng tư duy sáng tạo cho học
sinh trong quá trình viết chương trình tôi đã sử dụng phương pháp gợi động cơ kích
thích tính tích cực, khả năng tư duy, sự sáng tạo, say mê, tìm tòi, học hỏi của học
sinh qua cách giảng dạy thực tiễn về “Kiểu xâu”, được trình bày qua các giải pháp
dưới đây:
- Chính xác hóa nhận thức của học sinh về “Kiểu xâu”;
- Khắc phục sai lầm của học sinh trong lập trình kiểu xâu;
-Rèn luyện kỹ năng cho học sinh qua một số bài tập đặc trưng;
Để thực hiện được ý tưởng đã nêu trong đề tài, tôi đã áp dụng các giải pháp
trên chủ yếu vào giảng dạy học sinh khối 11 và làm nền tảng ôn luyện học sinh giỏi.

khai báo biến xâu, tôi vẫn trình bày rõ hai cách khai báo cho học sinh.
Cách 1. Khai báo trực tiếp biến xâu:
Var <tên biến xâu>: string[độ dài lớn nhất của xâu];
Var <tên biến xâu>: string; {Khi đó độ dài lớn nhất của xâu sẽ nhận giá trị
ngầm định là 255}.
Ví dụ: Var hoten : string[26];
Var chugiai: string;
Cách 2. Khai báo gián tiếp biến xâu qua kiểu xâu:
Type <tên kiểu xâu> = string[độ dài lớn nhất của xâu];
Var <tên biến xâu>: <tên kiểu xâu>;
Ví dụ: Type Hoten = String[30];
Var name: Hoten;
Như vậy, học sinh có thể nắm rõ cách khai báo biến xâu, giải quyết ví dụ 1
một cách dễ dàng.
a. Hoten và St80 là các kiểu xâu kí tự.
b. Name là biến kiểu xâu kí tự;có tối đa 30 kí tự.
c. Line là biến kiểu xâu kí tự ;có tối đa 80 kí tự.
d. St là biến kiểu xâu kí tự; có tối đa 255 kí tự.
2.3.1.2. Tuy có thể hình dung xâu như mảng một chiều nhưng kiểu mảng một
chiều với phần tử thuộc kiểu char khác với kiểu xâu (khai báo bằng từ khóa
string).
* Điểm giống và khác nhau cơ bản giữa mảng 1 chiều và xâu:
- Giống nhau: Cùng là kiểu dữ liệu có cấu trúc, có thể truy cập vào từng phần tử
riêng biệt.
- Khác nhau:
+ Xâu vừa là kiểu dữ liệu có cấu trúc vừa là kiểu dữ liệu vô hướng, vì vậy có thể
truy cập vào toàn bộ xâu như một dữ liệu đơn;
+ Các phần tử của xâu chỉ có thể là kí tự;
+ Ở một số ngôn ngữ lập trình, xâu có độ dài hạn chế;
+ Mảng có thể có kích thước rất lớn;

Giá trị st
Biểu thức
Kết quả
‘1500’
val(st,N,code) Code=0, N=1500
’14.2A+02’
val(st,N,code) Code=5
- Hàm CONCAT(s1,s2,…,sn): trả về xâu thu được từ việc ghép các xâu s1,s2,
…,sn.
Ví dụ:
Biểu thức
Kết quả
concat(‘Toi’, ‘hoc’, ‘bai’)
‘Toi hoc bai’
- Hàm CHR(X): Cho kí tự có mã X trong bảng mã ASCII.
Ví dụ: chr(65)= ‘A’; chr(97)= ‘a’
- Hàm ORD(ch): cho mã của kí tự ch trong bảng mã ASCII.
Ví dụ: ord(‘A’) = 65; ord(‘a’) = 97
2.3.1.4. Xâu được tạo thành bởi các kí tự, trong đó có thể có dấu cách. Dấu
cách thể hiện trong các văn bản là phần trống ngăn cách giữa hai từ viết liên
tiếp;
2.3.1.5. Khi sử dụng lệnh gán, ta có thể gán trị là một xâu kí tự cho một biến
xâu kí tự nhưng việc gán trị là một xâu kí tự cho một biến kiểu kí tự là không
hợp lệ dù xâu đó có độ dài bằng 1;
2.3.1.6. Tham số của các hàm và thủ tục chuẩn phải hợp lí,.

Chẳng hạn không thể dùng insert(s1,s2,10) khi length(s2)
chuẩn đã biết khi học về kiểu xâu, liệu có tìm được vị trí xuất hiện một xâu con,
thực hiện xóa một xâu con, chèn một xâu con hay không? Câu hỏi này sẽ gợi cho
học sinh nhớ lại và vận dụng hàm pos, các thủ tục chuẩn delete, insert.
Tôi đã xây dựng một dàn ý chương trình như sau:
{Phần khai báo};
Begin
{Nhập vào xâu s};
{Chừng nào còn tìm thấy xâu con ‘anh’ trong xâu s còn làm ba việc sau:
7


- Tìm vị trí bắt đầu của xâu ‘anh’;
- Xóa xâu ‘anh’ vừa tìm thấy;
- Chèn xâu ‘em’ vào xâu s tại vị trí trước đây xuất hiện xâu ‘anh’};
- {in kết quả xâu s};
End.
Tôi yêu cầu học sinh chi tiết hóa bằng các câu lệnh để có một chương trình hoàn
chỉnh. Học sinh đã làm rất tốt.
program bai3;
uses crt;
var s: string;
i,vt: byte;
begin
write('Nhap vao xau: ');
readln(s);
while pos('anh',s 0 do
begin
vt:=pos(‘anh’,s);
delete(s,vt,3);
insert('em',s,vt);

Giả sử như lúc đầu xâu đó là xâu đối xứng, nếu có một tính chất nào đó khiến xâu
đó không là xâu đối xứng, thì giả sử sẽ sai và ta kết thúc việc kiểm tra. Còn không
thì xâu đó vẫn là xâu đối xứng. Tôi đã xây dựng dàn ý như sau:
{Phần khai báo};
Begin
{Nhập vào xâu s};
{Xác định độ dài của xâu};
{Khởi tạo kt, tạm coi xâu s vừa nhập là palindrome};
{So sánh cặp kí tự đối xứng:
Nếu s[i] s[length(s)-i+1] thì xâu không phải là palindrome};
{in kết quả};
End.
Tôi yêu cầu học sinh chi tiết hóa bằng các câu lệnh để có một chương trình hoàn
chỉnh. Học sinh đã làm rất tốt.
program xaudoixung;
uses crt;
var s:string;
kt:boolean;
i:byte;
begin
write('Nhap vao xau s=');
readln(s);
kt:=true;
for i:=1 to length(s) div 2 do
if s[i]s[(length(s) - i) +1] then
kt:=false;
if kt then write('Xau doi xung')
else write('xau khong doi xung');
readln;
end.

từ bàn phím, 5
Có thể dùng mảng một chiều với các phần tử được đánh chỉ số từ 1 đến 26
(Có tất cả 26 chữ cái từ ‘A’… ‘Z’), dùng để ghi nhận số lần xuất hiện trong xâu S
của các kí tự (tương ứng) từ ‘A’ đến ‘Z’.Ta dùng hàm ord(ch) cho giá trị là mã
ASCII thập phân của kí tự là giá trị của ch.
11


Ord(‘A’)-ord(‘A’)+1=1
Ord(‘B’)-ord(‘A’)+1=2
Ord(‘C’)-ord(‘A’)+1=3

Ord(‘Z’)-ord(‘A’)+1=26
Tổng quát: Ord(ch)= i+ord(‘A’)-1
Ngược lại, từ chỉ số i của mảng có thể biết phần tử thứ i ghi nhận số lần xuất
hiện của kí tự nào, bằng cách dùng hàm chr(X). Như vậy, chr(i+ord(‘A’)-1) là kí tự
được đếm bằng phần tử thứ i của mảng dem.
Do một kí tự xuất hiện trong xâu S có thể không phải là một chữ cái nên khi
duyệt lần lượt từng kí tự trong xâu S, cần kiểm tra xem kí tự đó có phải là chữ cái
hay không để ghi nhận số lần xuất hiện của nó, từ đó có thể viết được đoạn chương
trình thực hiện việc duyệt từng phần tử của xâu và đếm. Khi duyệt đến kí tự thứ i
trong xâu S, nếu S[i] là chữ cái thì đếm tăng cho S[i], nghĩa là tăng 1 cho
dem[ord(s[i])- ord(‘A’)+1].
Dàn ý của chương trình:
{Phần khai báo}
Begin
{Nhập xâu S}
n:=length(S);
{Khởi trị cho mảng dem}
For i:=1 to n do
{Nếu S[i] là chữ cái thì dem tăng cho S[i]}

write('Nhap vao xau s=');
readln(s);
for ch:='A' to 'Z' do dem[ch]:=0;
for i:=1 to n do
begin
x:=upcase(s[i]);
if (x>='A') and (x
i,x,vt:byte;
begin
write('Nhap xau: ');
readln(st);
{xoa ky tu trong du thua xuat hien dau xau}
while st[1]=' ' do
delete(st,1,1);
{xoa ki trong du thua giua cac tu}
vt:=pos(' ',st);
while vt0 do
begin
delete(st,vt,1);
vt:=pos(' ',st);
end;
{xoa ki tu trong du thua xuat hien cuoi xau}
x:=length(st);
while st[x]=' ' do
begin
14


delete(st,x,1);
x:=length(st);
end;
write('Xau da chuan hoa: ',st);
readln;
end.
Bài 2. Nhập vào một xâu s khác rỗng và thực hiện chuẩn hoá xâu, tức là:
- Xoá các dấu cách thừa;
- Chuyển những kí tự đầu từ thành chữ hoa, những kí tự khác thành chữ thường.



2.3.3.4. Bài toán mã hóa và giải mã một xâu
Xét bài toán:Viết chương trình để mã hóa và giải mã một xâu kí tự bằng cách
đảo ngược các bit của từng kí tự trong xâu.

Sau đây là chương trình gợi ý để học sinh tham khảo và tự hoàn thiện
chương trình.
Uses crt;
Var st:string;
{Hàm đảo bit ký tự c}
Function DaoBit(c:char):char;
Var n,i,s,bitcuoi,Mask:byte;
Begin
{Đổi ký tự sang số}
n:=ORD(c);
{s: kết quả đảo bit, Mask: mặt nạ dùng để bật bit thứ i}
s:=0;
Mask:=128;
For i:=1 To 8 Do {duyệt qua 8 bit của n}
Begin
{Lấy bit cuối cùng của n: bit cực phải}
bitcuoi:=n AND 1;
n:=n shr 1; {loại bỏ bit cuối cùng: n:=n DIV 2}
{Bật bit thứ i lên: từ trái sang phải}
if bitcuoi=1 then s:=s OR Mask;
Mask:=Mask shr 1; { Mask:= Mask DIV 2}
End;
DaoBit:=CHR(s);
End;

var s1,s2:string;
procedure doc;
begin
Write(‘Nhap xau s1:’);
readln(s1);
Write(‘Nhap xau s2:’);
readln(s2);
procedure nen;
var s,kq:string;
i,d:integer;
ch:char;
begin
d:=1; s1:=s1+#32;ch:=s1[1]; kq:='';
for i:=2 to length(s1) do
if s1[i]=s1[i-1] then inc(d)
else
begin
str(d,s);
if d1 then kq:=kq+s+ch else kq:=kq+ch;
d:=1;
ch:=s1[i];
end;
writeln(kq);
end;
procedure giainen;
var s,kq,so:string;
i, j,code,n:integer;
ch:char;
17



2.4. HIỆU QUẢ CỦA SÁNG KIẾN KINH NGHIỆM
Sau khi áp dụng các giải pháp trên để giảng dạy cho học sinh, chất lượng học tập
của học sinh tăng lên rõ rệt. Học sinh đã biết vận dụng rất linh hoạt các kiến thức cơ
bản về kiểu xâu để giải quyết từng bài toán cụ thể và có thể chủ động đưa ra ý
tưởng cho các bài toán đó một cách sáng tạo. Cách tư duy cũng sáng sủa hơn.Từ bài
này có thể suy diễn sang bài khác một cách logic và hiệu quả.
Chất lượng giảng dạy ở các lớp năm học 2015-2016 khi chưa áp dụng các giải
pháp nêu trên. Kết quả khảo sát như sau:
LỚP

SĨ SỐ

GIỎI
SL %

KHÁ
SL
%

TB
SL

%

YẾU
SL
%

KÉM


SĨ SỐ

11C
11D

55
50

GIỎI
SL
%

KHÁ
SL
%

TB
SL

YẾU
SL %

%

10 18% 30 55% 15 27%
8 16% 25 50% 15 30%

0
2

Tôi xin cam đoan đây là SKKN của bản
thân, không sao chép nội dung của
người khác.

Phạm Thị Nhung

TÀI LIỆU THAM KHẢO
1. Sách giáo viên Tin học 11 - Hồ Sĩ Đàm chủ biên
2. Sách giáo khoa Tin học 11- Hồ Sĩ Đàm chủ biên
19


3. Sách bài tập Tin học 11

- Hồ Sĩ Đàm chủ biên

4. Một số bài tập tham khảo trên Internet.

DANH MỤC ĐỀ TÀI SKKN
STT
1
2

3

Tên đề tài SKKN
Sử dụng Microsoft Access trong quản
lý trường học
Phát huy tính chủ động sáng tạo của
học sinh thông qua một số ví dụ cụ thể

Cấp Tỉnh

B

2015

20




Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status