sáng kiến kinh nghiệm môn Tin học lớp 11: Ứng dụng kiểu xâu để giải các bài toán số học. PHẦN 2:MÔ TẢ SÁNG KIẾN 2.1. QUY TRÌNH GIẢI MỘT BÀI TOÁN Để giải được các bài toán số nhờ kiểu dữ liệu xâu thì học sinh phải thông hiểu các hàm và thủ tục trong xâu kí tự. Trong sách giáo khoa chương trình tin học 11 có trình bày một số hàm và thủ tục trong xâu nhưng chưa đủ để giải quyết một số bài tập thường gặp. Sau đây tôi xin trình bày tóm tắt lại một số hàm và thủ tục chuẩn trong xâu và bổ sung thêm một số hàm, thủ tục chuẩn trong kiểu dữ liệu xâu. Delete(s,vt,n); Dùng để xóa n kí tự trong xâu s bắt đầu từ vị trí vt. Insert(s1,s2,vt); Dùng để chèn xâu s1 và xâu s2 bắt đầu từ vị trí vt. Copy(s,vt,n); Hàm tạo ra xâu gồm n kí tự liên tiếp bắt đầu từ vị trí vt trong xâu s. Length(s); Hàm cho giá trị là độ dài của xâu s. Pos(s1,s2); Hàm cho vị trí xuất hiện đầu tiên của xâu s1 trong xâu s2. Upcase(ch); Hàm cho chữ cái in hoa ứng với chữ cái trong ch. Val(s,x,code); Dùng để đổi xâu s thành một số và gán cho x. Str(x,s); Dùng để đổi số x thành xâu s. Ord(ch); Hàm cho biết mã của kí tự ch. Quy tắc so sánh xâu: Xâu A lớn hơn xâu B nếu như kí tự đầu tiên khác nhau giữa chúng kể từ trái sang trong xâu A có mã ASCII lớn hơn. Như vậy để giải được các bài toán số nhờ sử dụng kiểu dữ liệu xâu việc đầu tiên các em cần nắm vững kiến thức lí thuyết kiểu dữ liệu xâu, các hàm và thủ tục chuẩn trong xâu. Thứ hai vận dụng thành thạo các hàm và thủ tục chuẩn trong xâu. Thứ ba biết phân tích, lựa chọn thuật toán sao cho hiệu quả nhất. Bài tập : Cho một số nguyên dương n (00) do begin i:=i+1; bi:=n mod 10; n:=n div 10; end; m:=i; x:=m; for i:=1 to m do ai:=bmi+1; am+1:=0; i:=1; repeat begin while (ai>=ai+1) and (i30->0 Thuật tốn: Bước 1: Việc ta phải tạo số nguyên n1 từ n cách sử dụng vòng lặp for duyệt từ i=1 đến n Với giá trị i ta đổi sang xâu dùng phép ghép xâu để ghép lại với ta xâu s n1 Bước 2: Ta tiến hành xóa vị trí chẵn trước nên khởi tạo i=2; sau xóa lần thứ kí tự kí tự phía sau vị trí xóa dịch chuyển sang bên trái vị trí i cần tăng thêm đơn vị Q trình xóa lại tiếp tục kết thúc i>length(n1); Bước 3: Tiếp theo tiến hành xóa vị trí lẻ Khởi tạo i=1, sau xóa lần thứ kí tự kí tự phía sau vị trí xóa dịch chuyển sang bên trái vị trí i cần tăng thêm đơn vị Q trình xóa lại tiếp tục kết thúc i>length(n1); Q trình xóa vị trí chẵn lại lẻ n1 chữ số Do bước bước lặp lặp lại độ dài n1 dừng lại Đoạn mã chương trình đầy đủ: program bt1; var n,i:longint; n1,s:string; Begin readln(n); n1:=''; for i:=1 to n begin str(i,s); n1:=n1+s; end; repeat i:=2; while length(n1)>1 begin delete(n1,i,1); inc(i); if i >length(n1) then break; end; i:=1; while length(n1)>1 begin delete(n1,i,1); inc(i); if i >length(n1) then break; end; until length(s)=1; write(s); readln; End Bài tập Viết liên tiếp số nguyên từ đến n thành dãy kí tự (n0) begin k:=n mod 2; n:=n div 2; str(k,x); s:=x+s; end; write(s); close(input); close(output); end Bài tập Tính đưa hình tổng chữ số số nguyên viết số b Với n b nhập từ bàn phím Ví dụ n=446, b=16 dạng biểu diễn 1BE Tổng 1+10+15=26 (giải thích 10 quy ước ‘A’ , 11 ‘B’, 12 ‘C’,… Input: Dữ liệu đọc vào từ file sums.inp gồm có dòng chứa hai số nguyên dương n, b hai giá trị cách dấu cách 23 Output: Kết ghi file sums.out số nguyên kết tìm Ví dụ: sums.inp sums.out 446 16 26 Thuật toán: Trước hết ta khai báo xâu mẫu chữ số hệ số b Để tìm dạng biểu diễn số b ta lấy n chia liên tiếp cho b lấy phần dư để lại phần nguyên n=0 dừng lại Sau viết ngược lại từ lên Ta thấy r=3 số mẫu lại vị trí phải mau[r+1] Sau có biểu diễn số b xâu s Để tính tổng hệ số ta duyệt kí tự xâu hệ số biểu diễn số Kí tự thứ i có giá trị mã kí tự trừ 48 số trừ 65+10 dạng chữ A, B,…Z Đoạn mã chương trình đầy đủ: program bt9; const mau=’0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’; tfi='sums.inp'; tfo='sums.out'; Var s:string; n,b:longint; function doiso(n:longint;b:byte):string; var kq:string; r:longint; begin kq:=’’; while n>0 24 begin r:=n mod b; kq:=mau[r+1]+kq; n := n div b; end; exit(kq); begin assign(input,tfi); reset(input); assign(output,tfo); rewrite(output); readln(n,b); s≔doiso(n,b)); for i:=1 to length(s) if (s[i]>=’0’ )and (s[i]=’A’ and (s[i]n trình sàng kết thúc Ta lưu số nguyên tố vào mảng so Tiếp theo ghép n số nguyên tố thành dãy số a (hoặc dãy ký tự) ta có số nguyên lớn Để ghép n số nguyên tố ta sử dụng mảng pri để chứa n số nguyên tố, dùng xâu s để chứa n số nguyên tố sau ghép Muốn ghép với thành 23 ta sử dụng lệnh đổi số sang xâu sau sử dụng phép ghép xâu Ta thực thao tác sau k lần: Tìm vị trí i mà s[i]