1. Sĩ số lớp
2. Kiểm tra bài cũ 3. Nội dung bài mới
HOẠT ĐỘNG CỦA GV VÀ HS NỘI DUNG
GV: Xâu ‘radar’, ‘abccba’ là các xâu đối xứng, vì khi ta duyệt từ phải sang trái thì thu được kết quả giống như duyệt từ trái qua
Bài 1. 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. Xâu đối xứng có tính chất: đọc nó từ phải
phải.
GV: Vận dụng ví dụ 3 và ví dụ 4 ở bài học trước, em nào cho ý tưởng để giải quyết bài toán ?
HS: Quan sát lại ví dụ 3 và ví dụ 4 của tiết trước, suy nghĩ và trả lời.
GV: Cho HS chạy chương trình ở phần a. GV:
GV: Em có nhận xét gì về các cặp kí tự ở vị trí đối xứng nhau trong một xâu palindrome HS: Trả lời câu hỏi.
GV: Kí tự ở đầu xâu đối xứng với với kí tự cuối xâu, kí tự thứ 2 trong xâu đối xứng với kí tự đứng ngay trước kí tự cuối xâu. Vậy kí tự thứ i đối xứng với kí tự ở ví trí nào trong xâu ?
HS: Trả lời câu hỏi.
GV: Phải so sánh bao nhiêu cặp kí tự trong xâu để biết xâu đó có phải là xâu
palindrome hay không ?
GV: Việc phát hiện ra bất kì một vị trí đối xứng nào không thoả mãn điều kiện là giống nhau có thể được thực hiện bởi một vòng lặp while.... do...
GV: Cho HS thực hiện trên máy tính. HS: Thực hành trên máy.
sang tría cũng thu được kết quả giống như đọc từ trái sang phải (còn gọi là xâu palindrome). +> Input: xâu a.
+>Output: a là xâu đối xứng hay không đối xứng.
A.ý tưởng
Chúng ta sẽ đi xây dựng xâu đảo ngược của xâu ban đầu bằng cách duyệt từ cuối xâu ban đầu, tại mỗi lần duyệt thì kí tự đang được duyệt sẽ được thêm vào xâu đang xây dựng. Sau khi xây dựng xong, ta so sánh 2 xâu, nếu chúng giống nhau thì thông báo đó là xâu palindrome rồi kết thúc, ngược lại sẽ thông báo đó không phải là xâu palindrome và kết thúc.
B.Không dùng biến xâu p
Các kí tự ở vị trí đối xứng thì giống nhau.
Kí tự ở vị trí thứ i sẽ đối xứng với kí tự ở vị trí thứ n-i+1 trong xâu (với n là độ dài của xâu.
Ta sẽ so sánh n div 2 cặp kí tự để biết xâu này là xâu palindrome hay không.
Chương trình: uses crt; var a: string; i,d,n: byte; begin clrscr;
write('nhap vao mot xau:'); readln(a);
d:=length(a) div 2; n:=length(a); i:=1;
while (i<=d) and (a[i] = a[n-i+1])do inc(i) ; if i>d then
writeln('day la xau palindrome') else
writeln('day khong la xau palindrome'); readln;
end.
Bài 2. Viết chương trình nhập từ bàn phím một xâu kí tự S và thông báo ra màn hình số lần xuất hiện của mỗi chữ cái tiếng Anh trong S (không phân biệt chữ hoa hay chữ thường). +>Input: xâu S.
GV: có thể dùng một mảng một chiều dem với các phần tử được đánh số thứ tự từ 1 đến 26 để ghi nhận số lần xuất hiện của 26 chữ cái tiếng Anh theo thứ tự trong xâu.
HS : Nghe kết hợp với ghi chép. GV: Ta có nhận xét sau đây: Ord(‘A’) – ord(‘A’) + 1 = 1 Ord(‘B’) – ord(‘A’) + 1 = 2 ...
Ord(‘Z’) – ord(‘A’) + 1 = 26
GV: Như vậy từ chỉ số i của mảng ta có thể xác định được số lần xuất hiện của kí tự thứ i trong bảng chữ cái tiếng Anh có trong xâu. Chr(i + ord(‘A’) -1) là kí tự được đếm bằng phần tử thứ i của mảng một chiều dem. GV: để giải quyết vấn đề chữ hoa hay chữ thường thì ta sẽ dùng hàm gì ?
HS: Trả lời câu hỏi.
GV: do trong xâu có thể không là chữ cái, do đó cần phải kiểm tra xem kí đó có phải là chữ cái hay không. Việc kiểm tra được kiểm tra như thế nào từ nhận xét trên ?
HS: Trả lời câu hỏi.
GV: Đưa ra dàn ý chương trình bằng bảng phụ.
GV: Cho HS làm bài trên máy
+>Output: số lần xuất hiện của mỗi chữ cái tiếng Anh trong xâu S.
+> Gợi ý:
Hàm ord(ch) cho giá trị là mã ASCII thập phân của kí tự là giá trị của ch.
Hàm chr(X) cho giá trị là kí tự có mã ASCII thập phân bằng giá trị của biến X kiểu byte hoặc số nguyên X trong phạm vi từ 0..255. Có nhận xét sau:
Ord(‘A’) – ord(‘A’) + 1 = 1 Ord(‘B’) – ord(‘A’) + 1 = 2 ...
Ord(‘Z’) – ord(‘A’) + 1 = 26
Ta sẽ dùng hàm upcase(c) để giải quyết vấn đề chữ hoa hay chữ thường.
Kí tự đang xét là chữ cái nếu điều kiện sau được thoả mãn:
((ord(s2[i]) - ord('A') + 1)>=1) and ((ord(s2[i]) - ord('A') + 1)<= 26).
Mỗi khi điều kiện trên thoả mãn thì ta sẽ tăng 1 cho: dem[ord(s2[i]) - ord('A') + 1] Dàn ý 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ì tăng 1 cho S[i]}
For i:=1 to 26 do
{Thông báo số lần xuất hiện của chr(i + ord(‘A’) – 1}
End.
Chương trình: uses crt;
var s1,s2: string;
dem: array[1..26] of byte;
l,i: byte; begin clrscr;
writeln('nhap vao mot xau:'); readln(s1); l:=length(s1); s2:=''; for i:=1 to l do s2:=s2+upcase(s1[i]); dem[i]:=0; for i:=1 to l do
if ((ord(s2[i]) - ord('A') + 1)>=1) and ((ord(s2[i]) - ord('A') + 1)<= 26)
then inc(dem[ord(s2[i]) - ord('A') + 1]); for i:=1 to 26 do
writeln('Ky tu ',chr(i + ord('A') - 1),' xuat hien',dem[i],' lan');
readln; end.
4. Hoạt động củng cố
- Khai báo kiểu xâu.
- Cách tham chiếu đến kí tự trong xâu. - Dùng các hàm cơ bản để xử lí xâu.
5. Bài tập về nhà
- Hoàn thành bài tập 2 và 3 vào vở.
--- Ngày giảng: Tiết 30 BÀI TẬP THỰC HÀNH 5 <Tiếp> I. MỤC TIÊU 1. Kiến thức:
- Hiểu khái niệm xâu kí tự
- Hiểu cách khai báo và truy cập đến phần tử của xâu kí tự 2. Kỹ năng
- Cài đặt được thuật toán của một số bài toán đơn giản với kiểu dữ liệu xâu kí tự
II. CHUẨN BỊ CỦA GV VÀ HS
1. Chuẩn bị của GV:
Giáo án, phấn, bảng, phòng thực hành 2. Chuẩn bị của HS:
Sách giáo khoa, vở ghi,…
III.TIẾN TRÌNH DẠY HỌC
1. Kiểm tra bài cũ:
Câu hỏi:- Cho xâu S:=’ em hoc toan’ Dùng Hàm copy(S,8,4) thì kết quả là ? Kết quả: ‘toan’
Hoạt động của GV và HS Nội dung chính Bài 1: Nhập vào một xâu, đếm xem xâu
đó kí tự a xuất hiện bao nhiêu lần
Cách nhập xâu kí tự?
Dùng vòng lặp nào để thực hiện?
HĐ3:Nhập một xâu và đếm xem trong xâu có bao nhiêu từ?
Bài 2 :NHập vào một xâu kí tự, Đếm xem
trong xâu có bao nhiêu từ (Từ là dãy kí tự không chứa dấu cách)
GV:Tại sao lại gán xấu st cộng thêm dấu cách?
HS: Vì nếu hai kí tự giống hệt nhau thì ta lại tiếp tục so sánh kí tự tiếp theo
GV:Nếu hai kí tự đứng cạnh nhau mà kí tự trước khác cách, kí tự sau bằng cách thì đó có phải là một từ không? HS: Có vì tính cả kí tự trống Program Demkitu; Var st: String; x, i, d: Byte; Begin
Write(‘ Nhap xau ki tu:’); Readln(st); x:=Length(a); d:=0;
For i:=1 to x do If st[i]=’a’ then d:=d+1;
Write (‘Trong xau co’,d,’ki tu a’’); Readln; End. Program Demkitu; Var st: String; x, i, d: Byte; Begin
Write(‘ Nhap xau ki tu:’); Readln(st); x:=Length(a); d:=0; st:=st+’ ‘; For i:=1 to x do
If ((st[i]<>’ ’)and(st[i]=’ ’)) then d:=d+1;
Write (‘Trong xau co’,d,’ tu ’); Readln;
End.
3. Củng cố, luyện tập:
- Nhắc nhở lại kiến thức cơ bản của bài học về khai báo kiểu xâu kí tự và thực hiện được một số thuật toán cơ bản về xâu kí tự.
Luyện tập: Cho xâu A:=’ HA NOI’+’VIET NAM’ Nếu dùng phép ghép xâu ta được?
Kết quả’HA NOI VIET NAM’ 4. Hướng dẫn học sinh tự học ở nhà
- Về nhà học bài và làm bài tập ở nhà.
Tiết theo PPCT: 31,32.
BÀI TẬPI. MỤC TIÊU: I. MỤC TIÊU:
1. Về kiến thức
- Ôn tập lại kiến thức về dữ liệu kiểu mảng, kiểu xâu..
2. Về kỹ năng
-Biết cách khai báo dữ liệu kiểu mảng, kiểu xâu. -Sử dụng được một số hàm và thủ tục xử lí xâu.