Giáo án Tin học 10 - Tiết 34
I. Mục tiêu.
1. Kiến thức.
- Khắc sâu kiến thức về lí thuyết kiểu xâu, các hàm và thủ tục.
- Nắm được các thuật toán cơ bản: Tạo xâu mới, đếm số lần xuất hiện một kí tự xuất hiện trong xâu.
2. Kỹ năng.
- Khai báo biến kiểu xâu.
- Nhập xuất giá trị cho biến kiểu xâu
- Duyệt qua các kí tự kiểu xâu.
- Sử dụng tốt các hàm thủ tục chuẩn: delete, insert, copy, length, pos, upcase.
3. Thái độ.
Học sinh ham thích môn học, chủ động trong học tập, góp phần phát triển tư duy.
. II. Chuẩn bị. Giáo viên: Sách giáo khoa, sách giáo viên, giáo án. Học sinh: Sách giáo khoa, vở ghi. III. Hoạt động Ổn định tổ chức lớp kiểm tra sĩ số (1p) Kiểm tra bài cũ(10p) Câu 1: Cấu trúc khai báo kiểu xâu và lấy ví dụ? (2đ) Câu 2: Cấu trúc của các hàm và thủ tục chuẩn đã được học? (6) Đáp án: Câu 1: Cấu trúc khai báo kiểu xâu: Var : string[độ lớn]; Vd: Var s:string; Câu 2: Cấu trúc của các hàm và thủ tục Detele(s,vt,n) Insert(s1,s2,vt) Length(s) Pos(s1,s2) Copy(s,vt,n) Upcase(ch) Để hiểu thêm về các hàm và thủ tục trên cô có ví dụ sau(câu hỏi thêm 2đ): Xâu s=’abc’ Delete (s,1,1) cho kết quả? (‘bc’) Length (s) cho kết quả? (3) Copy (s,2,1) cho kết quả? (‘b’) Có thêm xâu s1=’bc’ Insert(s1,s,2) cho kết quả? (‘abcbc’) Pos(s1,s) cho kết quả? (2) Lưu ý: Hàm upcase chỉ tác động vào từng kí tự trong xâu chứ không tác động đến toàn xâu. Vd. Upcase(t) cho kết quả là T. Như bài trước chúng ta đã được làm qua một số ví dụ đơn giản với những câu lệnh như nhập, xuất xâu. Trong bài ngày hôm nay chúng ta tiếp tục tìm hiểu những câu lệnh có độ khó cao hơn thông qua một số bài tập trong bài “Bài tập và thực hành 5” Chúng ta vào bài mới. Bài mới (30p) Nội dung Hoạt động của GV Hoạt động của HS Thời gian Bài 1: SGK/T73 Input: Xâu x Output: Xâu đối xứng hoặc xâu không đối xứng. a) Chương trình SGK T73. b) Var s:string; n,i:integer; ok:boolean; begin write (‘nhap xau:’); readln(s); n:=length(s); ok:=true; for i:=1 to ndiv2 do if s[i]s[n-i+1] then ok:=false; if ok then write(‘xau doi xung’) else write(‘xau khong doi xung’); readln; end.Bài 2 SGK/T73 Input: Xâu s Output: 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).Bài 3 SGK T73 Input: Nhập 1 xâu. Output: Đưa ra xâu mới mà các cụm từ ‘anh’ được thay bằng cụm từ ‘em’. while pos(‘anh’,s)0 do Begin Vt:=pos(‘anh’,s); Delete(s,vt,3); Insert(‘em’,s,vt); End. ? Yêu cầu đọc đề bài. ? Xác định input, output. Trước khi giải quyết bài toán cô có ví dụ sau: S1=’abced’ S2=’abccba’ Theo trực quan chúng ta thấy xâu s2 là xâu đối xứng, xâu đối xứng là khi đọc từ trái sang phải và từ phải sang trái đều thu được kết quả như nhau. Vậy để kiểm tra một xâu có là xâu đối xứng không ta làm như thế nào? ? Nếu cô gọi xâu ban đầu là xâu x, xâu đảo ngược của nó là xâu p, vậy nếu xâu x là xâu đối xứng thì điều kiện gì giữa xâu x và xâu p sảy ra?Dựa vào ý tưởng này ta đi giải quyết bài toán vừa nêu. Trước tiên ta phải gán n:=length(x) (chiều dài của xâu) và tiếp theo tạo xâu p bằng cách gán p:=’’ để lưu trữ xâu đảo ngược của xâu x. Việc tạo xâu đảo ngược của x ta làm như thế nào? Em nào có thể cho cô biết?? Quá trình đó được thực hiện tới khi nào? ? Cú pháp của vòng for đó được thực hiện như thế nào? Khi ta tạo được xâu p là xâu đảo ngược của xâu x, việc cần làm tiếp theo là so sánh x và p có bằng nhau hay không? Nếu bằng nhau thì viết ra màn hình là xâu đối xứng ngược lại thì không là xâu đối xứng. Ta có chương trình trong SGK T73. Đối với bài này ta sử dụng biến trung gian để so sánh và đưa ra kết luận. Vậy vẫn với yêu cầu này mà không sử dụng biến trung gian ta còn cách nào để biết xâu đó có là xâu đối xứng hay không? Đó chính là yêu cầu của phần b. Theo các em còn cách nào để giải quyết yêu cầu trên? Để các em dễ hình dung và tìm ra cách giải cô có ví dụ sau: Ta có xâu đối xứng A B C D D C B A 1 2 3 4 5 6 7 8 Các em quan sát ví dụ và cho cô nhận xét về các cặp kí tự ở vị trí thứ 1 và 8, 2 và 7, 3 và 6, 4 và 5? Vậy để kiểm tra một xâu có phải đối xứng hay không ta cần so sánh kí tự đầu tiên với kí tự cuối cùng của xâu, kí tự thứ 2 với kí tự ngay trước kí tự cuối cùng của xâu… Như ví dụ trên kí tự 1 so sánh với kí tự 8 kí tự 2 so sánh với kí tự 7 (=8-1) kí tự 3 so sánh với kí tự 6 (=8-2) kí tự 4 so sánh với kí tự 5 (=8-3) Vậy bây giờ cô gán chiều dài của xâu là n? Kí tự thứ i sẽ được so sánh với kí tự nào? Vậy ta phải so sánh bao nhiêu cặp để biết được xâu đó có là đối xứng hay không? Các em quan sát tiếp ví dụ. Với xâu 123321 có 6 kí tự ta phải so sánh 3 cặp, xâu abcdefg có 7 kí tự ta so sánh 3 lần (khi so sánh 3 cặp sẽ dư ra 1 kí tự là d, vì nó bằng chính nó nên không cần so sánh) Vậy xâu có chiều dài là n thì cần so sánh bao nhiêu lần? Để so sánh như vậy ta cần cấu trúc lặp nào? Thực hiện vòng lặp đó như thế nào. Trước hết ta giả sử xâu đó là xâu đối xứng (ok:=true). Rồi ta thực hiện các phép so sánh các kí tự trong xâu ta vừa nêu trên, nếu gặp cặp kí tự nào khác nhau thì ok:=false. Cuối cùng dựa vào biến ok để kết luận, nếu ok là true thì xâu là đối xứng ngược lại không là đối xứng. Các câu lệnh này được viết như thế nào? Các em quan sát trên bảng và ghi bài vào vở. Ngoài ra các em có thể sử dụng vòng lặp while…do để thực hiện: Bước đầu ta gán biến i bằng 1 sau đó thực hiện vòng lặp. Trong khi indiv2 thì viết ra xâu đó là đối xứng ngược lại thì không là đối xứng. Các em về nhà dựa vào những gợi ý của cô để hoàn thiện chương trình vào vở theo vòng lặp while…do. Chúng ta sang bài 2. Đối với bài 2 các em cùng nhau quan sát và đọc đề bài trong SGK. Một em cho cô biết input và output của bài toán. Để hiểu rõ hơn về bài toán cô có ví dụ sau: Ta có xâu: ‘toán tin’ Theo yêu cầu bài toán thì xâu này sẽ cho ta kết quả như thế nào? Cô có ví dụ tiếp, xâu: ‘Hoa hồng xanh’ kết quả sẽ được như thế nào Lưu ý: không phân biệt chữ hoa, chữ thường. VÍ dụ tiếp, xâu: ‘1a2B6c8*D’Với ví dụ này sẽ có rất nhiều bạn hiểu nhầm và đưa ra cả 1,2,6,8 và * nhưng yêu cầu của bài chỉ đưa ra các kí tự tiếng anh, vậy để làm được bài này và làm như thế nào cô và các em cùng nhau đi giải quyết. ? Trước hết vì xâu không phân biệt chữ hoa hay chữ thường nên ta cần chuyển tất cả các kí tự trong xâu là chữ hoa, ta cần sử dụng hàm hay thủ tục gì? ? Tiếp theo là đếm số lần xuất hiện của từng kí tự ta có thể làm cách nào?Vậy ta phải thực hiện điều đó tới khi nào? Trong khi có 26 kí tự trong tiếng anh? Chúng ta sẽ phải đếm 26 lần? điều này hoàn toàn không sai nhưng sẽ rất dài, mất thời gian. Vậy còn cách nào để làm nhanh hơn? Để khắc phục điều đó ta gọi kí tự bất kì là y. Cho y chạy từ ‘A’ đến ‘Z’ và gán biến đếm dem[y]=0. Ta phải cần 1 mảng để lưu trữ số lần xuất hiện của các kí tự? Mảng đó được khai báo như thế nào?Và bây giờ mới khởi tạo các biến đếm bằng 0. Ta làm như thế nào?Việc tiếp là đếm số lần xuất hiện của các kí tự. Ta phải dùng câu lệnh gì để duyệt và để đếm? Sau khi đếm xong, ta cần đưa ra số lần xuất hiện các kí tự trong xâu, nhưng nếu có kí tự không có trong xâu, không lẽ cũng đưa ra kí tự đó xuất hiện 0 lần, vậy phải làm thế nào để loại bỏ trường hợp ấy? Hay nói cách khác làm sao để biết những chữ cái nào xuất hiện? Câu lệnh để kiểm tra điều ấy như thế nào? Dựa vào cách bước mà cô và các em vừa cùng nhau tìm hiểu các em về nhà hoàn thiện chương trình này vào vở. Chúng ta sang bài 3. Các em đọc để bài trong sách giáo khoa, một em đứng dậy xác định input và output của bài toán?Công việc của bài này ta cần phải đi tìm xâu con ‘anh’, thực hiện xóa xâu con ‘anh’ và thay vào đó là xâu con ‘em’(chèn vào vị trí vừa xóa). Vậy trong bài này gồm 3 việc chính, tìm, sóa và chèn. Như phần kiểm tả bài cũ ở đầu tiết cô và các em đã ôn lại các kiến thức có liên quan đến thủ tục và hàm, bây giờ chúng ta sẽ vận dụng các kiến thức đó để cùng nhau tìm hướng giải quyết bài này. Ta phải dùng những hàm hay thủ tục gì trong bài này? Ta viết những hàm và thủ tục này như thế nào? + Tìm xâu con ‘anh’? + Xóa xâu con ‘anh’? + Chèn xâu con ‘em’? Quá trình tìm, xóa và thay thế đó được thực hiện tới khi nào? Hay điều kiện dừng là gì? Chúng ta có biết được khi nào không tìm được xâu con ‘anh’ không?Vậy vòng lặp trong bài này là vòng lặp nào? Trong vòng lặp while…do cần thực hiện những câu lệnh gì? Viết như thế nào? Trên đây cô đã hướng dẫn chi tiết các bài, các em về nhà hoàn chỉnh tất cả các bài vào vở, tiết sau chúng ta sẽ thực hành những bài này trên phòng máy. Input: Xâu x Output: Xâu đối xứng hoặc xâu không đối xứng.xâu x phải bằng xâu pCho vòng for chạy từ cuối xâu lên đầu xâu, gặp phần tử nào thì đẩy vào xâu p. Khi gặp phần tử đầu tiên của xâu. For i:=n downto 1 do P:=p+st[i]; Các cặp kí này giống nhau. So sánh với kí tự thứ n-i+1cần so sánh n div 2 lần for…do hoặc while…doInput: Xâu s Output: 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)Kí tự ‘t’ xuất hiện 2 lần Kí tự ‘o’ xuất hiện 1 lần Kí tự ‘a’ xuất hiện 1 lần Kí tự ‘n’ xuất hiện 2 lần Kí tự ‘i’ xuất hiện 1 lần Kí tự ‘h’ xuất hiện 3 lần Kí tự ‘o’ xuất hiện 2 lần Kí tự ‘a’ xuất hiện 2 lần Kí tự ‘n’ xuất hiện 2 lần Kí tự ‘g’ xuất hiện 1 lần Kí tự ‘x’ xuất hiện 1 lầnThủ tục upcase(ch) Đếm từng kí tự, nếu gặp kí nào thì tăng số lần xuất hiện của kí tự đó lên.Var dem:array[‘A’..’Z’] of integer; for y:=’A’ to ‘Z’ do Dem[y]:=0; For y:=’A’ to ‘Z’ do For i:=1 to length(s) do If y=upcase(s[i]) then dem[y]:=dem[y]+1; Kiểm tra chữ cái y xuất hiện thì dem[y] phải khác 0.For y:=’A’ to ‘Z’ do If dem[y]0 then write(‘so lan xuat hien ki tu’,y,’la’,dem[y],’lan’); Input: Nhập 1 xâu. Output: Đưa ra xâu mới mà các cụm từ ‘anh’ được thay bằng cụm từ ‘em’.Hàm pos để tìm xâu con ‘anh’ Thủ tục delete để xóa xâu con ‘anh’ Thủ tục insert để chèn xâu con ‘em’ + Pos(‘anh’,s) + Delete(s,vt,3) + Insert(‘em’,s,vt) Khi không tìm được xâu con ‘anh’ nữa. Không.While…doLà 3 lệnh: tìm, xóa và chèn.while pos(‘anh’,s)0 do Beg
File đính kèm:
- tin hoc 11tiet 34.doc