SKKN Kiểu dữ liệu xâu từ bài toán cơ bản đến các bài toán bồi dưỡng học sinh giỏi

SKKN Kiểu dữ liệu xâu từ bài toán cơ bản đến các bài toán bồi dưỡng học sinh giỏi

- Với sự quan tâm của Đảng và Nhà nước về công tác Giáo dục - Đào tạo (GD-ĐT), cùng với sự nỗ lực của giáo viên và học sinh, thời gian qua chúng ta đã đạt được một số thành tích đáng kể trong công tác dạy và học. Tuy nhiên, nếu đánh giá một cách tổng thể, khách quan, thì hiện nay chất lượng, hiệu quả GD-ĐT còn chưa đáp ứng được yêu cầu ngày càng cao của xã hội. Nhìn chung trình độ kiến thức của học sinh, khả năng tư duy khoa học, khả năng thực hành còn chưa thích ứng được với thực tiễn xã hội, khả năng vận dụng kiến thức vào sản xuất, đời sống còn hạn chế, nhất là trong lĩnh vực công nghệ thông tin và ứng dụng công nghệ thông tin trong việc dạy của giáo viên và việc học của học sinh.

 - Tin học là một môn mới được đưa vào học đại trà ở cấp THPT trên toàn quốc, phần nội dung chương trình lớp 10 và 12 với các phần kiến thức cơ bản chung về máy tính và khoa học máy tính, soạn thảo văn bản Microsoft Word, Microsoft Access hay các kiến thức về mạng máy tính đã được các em tiếp cận 1 phần ở các chương trình học cấp THCS, các chương trình học nghề, hoặc qua sách báo, các chương trình trên truyền hình nên các em có thể từng bước nắm được bài và không gặp nhiều khó khăn trong quá trình học. Chương trình học lớp 11 về khái niệm lập trình và viết các chương trình cho máy thực hiện, yêu cầu tư duy trừu tượng cao, công việc có tính chất quá trình được ứng dụng nhiều trong khoa học cũng như trong thực tiễn. Tuy nhiên để nắm bắt được các kiến thức cơ bản này với học sinh không phải là điều dễ dàng.

 

doc 18 trang thuychi01 6271
Bạn đang xem tài liệu "SKKN Kiểu dữ liệu xâu từ bài toán cơ bản đến các bài toán bồi dưỡng học sinh giỏi", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
“KIỂU DỮ LIỆU XÂU TỪ BÀI TOÁN CƠ BẢN ĐẾN CÁC BÀI TOÁN BỒI DƯỠNG HỌC SINH GIỎI”
PHẦN I: ĐẶT VẤN ĐỀ
1. Lí do chọn đề tài
 - Với sự quan tâm của Đảng và Nhà nước về công tác Giáo dục - Đào tạo (GD-ĐT), cùng với sự nỗ lực của giáo viên và học sinh, thời gian qua chúng ta đã đạt được một số thành tích đáng kể trong công tác dạy và học. Tuy nhiên, nếu đánh giá một cách tổng thể, khách quan, thì hiện nay chất lượng, hiệu quả GD-ĐT còn chưa đáp ứng được yêu cầu ngày càng cao của xã hội. Nhìn chung trình độ kiến thức của học sinh, khả năng tư duy khoa học, khả năng thực hành còn chưa thích ứng được với thực tiễn xã hội, khả năng vận dụng kiến thức vào sản xuất, đời sống còn hạn chế, nhất là trong lĩnh vực công nghệ thông tin và ứng dụng công nghệ thông tin trong việc dạy của giáo viên và việc học của học sinh. 
 - Tin học là một môn mới được đưa vào học đại trà ở cấp THPT trên toàn quốc, phần nội dung chương trình lớp 10 và 12 với các phần kiến thức cơ bản chung về máy tính và khoa học máy tính, soạn thảo văn bản Microsoft Word, Microsoft Access hay các kiến thức về mạng máy tính đã được các em tiếp cận 1 phần ở các chương trình học cấp THCS, các chương trình học nghề, hoặc qua sách báo, các chương trình trên truyền hình nên các em có thể từng bước nắm được bài và không gặp nhiều khó khăn trong quá trình học. Chương trình học lớp 11 về khái niệm lập trình và viết các chương trình cho máy thực hiện, yêu cầu tư duy trừu tượng cao, công việc có tính chất quá trình được ứng dụng nhiều trong khoa học cũng như trong thực tiễn. Tuy nhiên để nắm bắt được các kiến thức cơ bản này với học sinh không phải là điều dễ dàng. 
 - Đặc biệt môn Tin học không phải là môn lựa chọn thi tốt nghiệp hay thi Đại học nên các em học sinh thường “ngại” học và thụ động trong việc học chương trình tin học lớp 11. Trong kỳ thi học sinh giỏi toàn tỉnh hiện nay, các em học sinh học giỏi và được chọn vào đội tuyển các môn theo khối có thi Đại học của mình thì các em và phụ huynh cũng không muốn tham gia vì còn bận học để thi Đại học. Vì vậy để học sinh học tốt chương trình Tin học lớp 11 và thi đạt thành tích cao trong kỳ thi học sinh giỏi thì yếu tố tự học được đánh giá rất cao. Vì vậy để giúp học sinh chủ động học và tích cực học tôi mạnh dạn đưa ra đề tài “Kiểu dữ liệu xâu từ bài toán cơ bản đến các bài toán bồi dưỡng học sinh giỏi”
2. Mục đích nghiên cứu.
 Thực tế học tập và giảng dạy Tin học tại Trường THPT Triệu Sơn 1, qua trao đổi, bàn bạc với các đồng nghiệp trong và ngoài nhà trường tôi nhận thấy một vấn đề là việc tìm ra phương pháp dạy, phương pháp động viên để học sinh ham học, yêu thích môn học là một điều rất khó. Sở dĩ học sinh cảm thấy khó khăn trong việc học là do các em không thấy được bản chất thực tế của vấn đề, cái hay, ứng dụng của kiến thức trong cuộc sống. 
3. Đối tượng nghiên cứu.
 Một thực trạng chung của học sinh trong cả nước, nhất là học sinh ở các tỉnh mà điều kiện cơ sở vật chất còn nhiều khó khăn và trường THPT Triệu sơn I là một ví dụ thì khả năng lập trình của học sinh với khả năng tư duy, tìm tòi, phát hiện vấn đề còn chưa tốt, nhất là việc phải tiếp cận với một công việc hoàn toàn mới với các em. Do vậy khi giảng dạy tôi luôn cho học sinh có cái nhìn thấu đáo từ nhiều góc độ khác nhau để hiểu được bản chất vấn đề. Kinh nghiệm thể hiện trong đề tài “Kiểu dữ liệu xâu từ bài toán cơ bản đến các bài toán bồi dưỡng học sinh giỏi” được tôi đúc kết ra trong quá trình giảng dạy, nghiên cứu tài liệu và trao đổi cùng đồng nghiệp trong năm học 2016 – 2017, 2017 - 2018 và được tiếp tục nghiên cứu bổ sung và thực hiện trong năm học 2018 - 2019.
4. Phương pháp nghiên cứu.
	Đề tài này được rút ra từ kiến thức học ở Đại học và kinh nghiệm dạy học ở trường THPT Triệu Sơn 1 của bản thân và có sự tham gia đóng góp ý kiến của các đồng nghiệp trong và ngoài nhà trường cùng với các tài liệu mà tôi sưu tầm được từ sách báo và các thông tin, diễn đàn trên mạng Internet. Các giải pháp, kiến thức này tôi đã trao đổi cùng đồng nghiệp và áp dụng trong quá trình dạy học tại trường THPT Triệu Sơn 1.
5. Những điểm mới của Sáng kiến kinh nghiệm.
Thông qua kiển thức thể hiện trong đề tài “Kiểu dữ liệu xâu từ bài toán cơ bản đến các bài toán bồi dưỡng học sinh giỏi” hệ thống lại cho các em kiến thức cơ bản về kiểu xâu, các bài tập vận dụng, phát triển tổng quát và vận dụng làm các bài toán chuyên xâu về kiểu dữ liệu xâu. 
PHẦN II. GIẢI QUYẾT VẤN ĐỀ
1. Cơ sở lí luận.
Trong sách giáo khoa Tin học 11 nội dung chương trình mặc dù đã được giảm tải theo yêu cầu của Bộ giáo dục nhưng vẫn còn khá nặng với học sinh nên đã dẫn tới việc chán nản của các em. Hơn nữa, môn học này học sinh chưa thấy được ứng dụng thực tế và không thi tốt nghiệp hay thi Đại học nên các em có tâm lí không muốn học mà chỉ muốn đối phó cho qua năm học. Nên khi kết thúc năm học, cũng như trong các kỳ thi học sinh giỏi thì những học sinh ưu tú nhất của mỗi trường THPT trong tỉnh làm bài cũng có chất lượng không đồng đều và chưa cao.
2. Thực trang vấn đề.
 Từ khi được tiếp cận với Tin học cũng như việc học lập trình thì các em mới chỉ xử lý thông qua các con số, các bài tập về việc cộng, trừ, nhân chia, còn các bài tập xử lí về ký tự, xâu các em hoàn toàn chưa biết. Vì vậy khi nói về kiểu xâu thì các em rất mơ hồ và không hiểu nó là cái gì? Không có kiểu dữ liệu xâu có giải quyết được các công việc không? Vì vậy để cho các em học sinh hiểu được bài dữ liệu về kiểu xâu, các em học sinh khá giỏi và nhất là các em tham gia kỳ thi học sinh giỏi cấp tỉnh môn Tin học đạt kết quả cao tôi đã nghiên cứu đề tài “Kiểu dữ liệu xâu từ bài toán cơ bản đến các bài toán bồi dưỡng học sinh giỏi”.
3. Nội dung đề tài
Trong SGK Tin học 11 bài “Kiểu xâu” được trình bày các kiến thức cơ bản:
+ Xâu là dãy các ký tự trong bộ mã ASCII, mỗi kí tự được gọi là một phần tử của xâu. Số lượng kí tự trong một xâu được gọi là độ dài của xâu. Xâu có độ dài bằng 0 được gọi là xâu rỗng.
+ Có thể xem xâu là mảng 1 chiều mà mỗi phần tử là một kí tự. Các kí tự của xâu được đánh số thứ tự, thường bắt đầu từ 1.
+ Các thao tác xử lí xâu: Ghép xâu, So sánh xâu, Xóa xâu, chèn xâu, copy xâu, lấy độ dài xâu, tìm vị trí xuất hiện của xâu, chuyển sang kí tự in hoa.
DẠNG BÀI TẬP 1. CÁC BÀI TOÁN PHÁT TRIỂN CƠ BẢN.
Bài toán 1: Ví dụ 3 (Trang 71 SGK Tin học 11)
 Chương trình sau nhập 1 xâu vào từ bàn phím và đưa ra xâu đó theo thứ tự ngược lại.
Để giải được bài toán này sau khi học xong các kiến thức cơ bản về kiểu xâu chỉ một vài em làm được, nhưng khi giáo viên cho các em học sinh nêu ý tưởng và hướng dẫn thì gần như các em sẽ làm được một cách đơn giản.
Ý tưởng: Cho 1 vòng lặp chạy từ cuối về đầu và viết các kí tự lên màn hình:
	For i:=length(s) downto 1 do write(s[i]); { Xâu s là xâu nhập vào}
 Tuy nhiên có 1 số học sinh sẽ có ý tưởng là “ em sẽ tạo ra xâu s1 là xâu ngược lại của xâu s” sau đó ghi ra s1.
 Lúc này giáo viên cần nhận xét và khẳng định được cách làm trên là đúng nhưng để làm được bài trên thì cách làm đó là dài hơn và sau đó cho học sinh bài tập mới.
Bài toán 2: Bài 1(Trang 73 phần Bài tập và thực hành 5 SGK Tin học 11)
 Nhập vào từ bàn phím 1 xâu. Kiểm tra xem xâu đó có phải xâu đối xứng không. Xâu đối xứng có tính chất: đọ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 (còn được gọi là xâu palindrome)
	Ở trong bài toán trên khi phần hướng dẫn thì tác giả đã hướng dẫn theo cách làm đọc từ trái sang phải (For i:=length(s) downto 1 do p:=p+s[i]) để được xâu p và kiểm tra xem xâu p có bằng với xâu ban đầu hay không để kết luận xâu s là đối xứng hay không đối xứng. Từ bài làm của tác giả giáo viên phân tích cho học sinh biết được cách ghép trước hay ghép sau; đọc từ phải sang trái hay từ trái sang phải để học sinh biết làm các bài có liên quan sau này và đặt ra câu hỏi:
- Có cách nào để kiểm tra nhanh hơn được không?
- Thầy đọc nữa xâu có kiểm tra được hay không?
{ HD: dx:=1;
For i:=1 to (length(s) div 2) do 
if s[i]s[length(s)-i+1] then begin dx:=0; break; end;
if dx=1 then write(‘Xau s là doi xung’) else write(‘Xau s khong doi xung’); 
}
 Trong phần hướng dẫn học sinh khá giỏi và đặc biệt là việc bồi dưỡng học sinh giỏi tham dự kỳ thi học sinh giỏi cấp tỉnh, giáo viên có thể nâng cấp lên việc kiểm tra cho nhiều xâu.
Bài toán 3. (Bài 2: (5 điểm) Xâu đối xứng - Đề thi HSG tỉnh Thanh Hóa năm học: 2009-2010)
	Xâu đối xứng là xâu đọc giống nhau nếu ta đọc từ trái qua phải hoặc từ phải qua trái. 
Ví dụ: xâu RADAR là xâu đối xứng.
Kiểm tra xem một xâu có phải là xâu đối xứng hay không, nếu đối xứng thì thông báo là 1, nếu không đối xứng thì thông báo là 0.	
Dữ liệu: Vào từ file văn bản BAI2.INP, gồm:
- Dòng đầu tiên ghi một số nguyên N.
- N dòng tiếp theo mỗi dòng ghi các xâu cần kiểm tra. 
Kết quả: Ghi ra file văn bản BAI2.OUT: gồm N dòng, mỗi dòng ghi 0 nếu xâu tương ứng không đối xứng hoặc ghi 1 nếu xâu tương ứng đối xứng.
Giới hạn: 0 < N < 30000; Các xâu có độ dài không quá 255 kí tự.
Ví dụ:
BAI2.INP
BAI2.OUT
3
AFHFA
ACDDB
ACRTT
1
0
0
 Với bài toán này giáo viên chỉ cần hướng dẫn học sinh đọc vào từng dòng. Nếu đối xứng ghi ra số 1 còn không đối xứng ghi ra 0 là hoàn thành. (Các học sinh có thể viết thành các hàm hoặc thủ tục để bố cục chương trình được gọn, tuy nhiên bản chất của bài toán thì không có gì thay đổi).
program xaudoixung;
const fi='bai2.in5';
 fo='bai2.ou5';
nmax=10000;
var n,i:integer;
 s:array[1..nmax] of string;
 a:array[1..nmax] of byte;
 f1,f2:text;
 procedure doc;
 begin
 assign(f1,fi);
 reset(f1);
 readln(f1,n);
 for i:=1 to n do readln(f1,s[i]);
 close(f1);
 end;
 function doixung(s:string): boolean;
 var b:string; j:integer;
 begin
 doixung:=false;
 b:='';
 for j:=length(s) downto 1 do b:=b+s[j];
 if s=b then doixung:=true;
 end;
 procedure ghi;
 begin
 assign(f2,fo);
 rewrite(f2);
 for i:=1 to n do writeln(f2,a[i]);
 close(f2);
 end;
BEGIN
doc;
 for i:=1 to n do
 if doixung(s[i]) then a[i]:=1 else a[i]:=0;
ghi;
end.
 Với các bài toán đã xét ở trên thì ta đã có trước xâu s, nhiệm vụ của học sinh là chỉ cần xét nó đối xứng hay không. Để nâng cao khả năng làm bài cho học sinh thì giáo viên còn có thể đưa ra yêu cầu cao hơn đó là học sinh phải tự tạo ra các xâu và kiểm tra xem nó có đối xứng hay không.
Bài toán 4. Bài 2: ( 7,0 điểm ) Xâu Palindrome – Đề thi học sinh giỏi tỉnh Thanh Hóa năm học 2012 – 2013.
	Một xâu kí tự được gọi là xâu Palindrome ( đối xứng ) nếu ta đọc từ trái sang phải hay đọc từ phải sang trái đều giống nhau.
Yêu cầu: Cho trước một xâu kí tự S. Hãy xác định số xâu đối xứng là xâu con của nó. Một kí tự cũng được coi là một xâu đối xứng. Xâu con của S là xâu gồm một số kí tự liên tiếp trong S.
Dữ liệu vào: Từ tệp văn bản 	BAI2.INP:
Dòng thứ nhất ghi số nguyên dương N (N<100).
N dòng tiếp theo mỗi dòng là một xâu kí tự ( độ dài xâu <255).
Kết quả: Ghi vào tệp văn bản BAI2.OUT gồm:
N dòng, mỗi dòng chứa một số nguyên biểu thị số xâu con đối xứng.
BAI2.INP
BAI2.OUT
1
IOI
4
Ví dụ: 
{Các bài trong đề thi học sinh giỏi cấp tỉnh ở dạng như bài toán 4 được đề cập khá thường xuyên trong các đề thi HSG ở các năm} 
DẠNG BÀI TẬP 2. CÁC BÀI TOÁN XỬ LÍ XÂU NHƯ MẢNG MỘT CHIỀU MÀ MỐI PHẦN TỬ LÀ MỘT KÍ TỰ.
Bài toán 5. Bài 2 – Bài tập và thực hành số 5 SGK Tin học 11 trang 73
 Viết chương trình nhập từ bàn phím 1 xâu 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
Với các học sinh mới học các kiến thức cơ bản giáo viên có thể hướng dẫn các em lần lượt thực hiện các công việc.
Bước 1. Chuyển toàn bộ xâu sang chữ hoa. 
	For i:=1 to length(s) do s[i]:=upcase(s[i]);
{ Với free pascal ta thực hiện đơn giản hơn s:=upcase(s); }
Bước 2. Lần lượt đếm xem trong xâu S có bao nhiêu chữ A,B,C,...Z mỗi lần đếm xong ta ghi kết quả.
	For ch:=’A’ to ‘Z’ do
	Begin sl:=0;
	For i:=1 to length(s) do if s[i]=ch then inc(sl);
	If sl>0 then writeln(ch,’ xuat hien ’,sl,’ lan’);
	End;
 Tuy nhiên, trong việc bồi dưỡng học sinh giỏi thì cần hướng dẫn cho học sinh làm bài theo cách tổng quát hơn để có thể thực hiện trong nhiều bài. Giáo viên yêu cầu thực hiện làm bài bằng thuật toán “Lùa bò vào chuồng” đã được hướng dẫn trong phần mảng.
	Fillchar(sl,sizeof(sl),0);
	For i:=1 to length(s) do inc(sl(s[i]));
	For j:=’A’ to ‘Z’ do if sl[j]>0 then writeln(j,’ xuat hien ’,sl[j],’ lan’);
 Với việc hướng dẫn cho học sinh làm bài tập cơ bản trên một cách đầy đủ và các em hiểu được bản chất của các công việc cần xử lý thì các em có thể làm được rất nhiều các bài trong đề thi học sinh giỏi.
Bài toán 6. ( Bài 2: (5 điểm) Kí tự khác nhau – Đề thi học sinh giỏi tỉnh Thanh Hóa năm học 2016 – 2017)
Cho xâu S chỉ gồm các kí tự là chữ cái tiếng anh và các chữ số (có phân biệt chữ in hoa, in thường). 
Yêu cầu: Hãy xác định số kí tự khác nhau trong xâu S và mỗi kí tự xuất hiện bao nhiêu lần.
Dữ liệu vào: Vào từ file văn bản BAI2.INP gồm 1 dòng duy nhất là xâu kí tự S (có độ dài không quá 255).
Kết quả: Kết quả ghi ra file văn bản BAI2.OUT gồm:
- Dòng đầu ghi số kí tự khác nhau.
- Các dòng tiếp theo, mỗi dòng ghi một kí tự xuất hiện trong xâu S và số lần xuất hiện của nó. Các kí tự đưa ra theo thứ tự chữ cái in hoa, in thường, chữ số. Các chữ cái, chữ số đưa ra theo thứ tự từ điển. 
Ví dụ:
BAI2.INP
BAI2.OUT
AzB1C9A1BC
6
A 2
B 2
C 2
z 1
1 2
9 1
 Bài toán 6 được thực hiện một cách dễ dàng sau khi học sinh đã làm được như ở ví dụ trên và chỉ phải thay cách viết trong lệnh ghi kết quả mà thôi.
	Fillchar(sl,sizeof(sl),0);
	For i:=1 to length(s) do inc(sl(s[i]));
	For j:=’A’ to ‘Z’ do if sl[j]>0 then writeln(f1,j,’ ’,sl[j]);
For j:=’a’ to ‘z’ do if sl[j]>0 then writeln(f1,j,’ ’,sl[j]);
For j:=’0’ to ‘9’ do if sl[j]>0 then writeln(f1,j,’ ’,sl[j]);
Bài toán 7. ( Bµi 3: (4.0 ®iÓm) Ch÷ c¸i xuÊt hiÖn – Đề thi học sinh giỏi tỉnh Thanh Hóa năm học 2011 – 2012)
Cho x©u St chØ gåm c¸c ch÷ c¸i. TÝnh sè lÇn xuÊt hiÖn cña ch÷ c¸i xuÊt hiÖn nhiÒu nhÊt trong x©u (kh«ng ph©n biÖt ch÷ in hoa vµ in th­êng).
D÷ liÖu vµo: Tõ file BAI3.INP gåm: X©u St (®é dµi ≤ 500 ký tù).
KÕt qu¶: Ghi ra file BAI3.OUT gåm: Mét dßng duy nhÊt lµ béi sè chung nhá nhÊt cña kÕt qu¶ bµi to¸n vµ 105.
VÝ dô:
BAI3.INP
BAI3.OUT
AAABDA
100000
 Trong bài toán 7 cách làm hoàn toàn tương tự như bài toán cơ bản nhưng các em cần tìm giá trị lớn nhất là số lần nhiều nhất của kí tự. Sau khi tìm giá trị lớn nhất Max cần tìm giá trị là bội chung nhỏ nhất của giá trị Max và 10000. { Kết quả là tích của Max với 10000 chia cho ước chung lớn nhất giữa max và 10000: 
KQ=Max*10000 div UCLN(Max,10000)
DẠNG BÀI TẬP 3. CÁC BÀI TOÁN CƠ BẢN VÀ CÁCH GIẢI ƯU VIỆT TỪ KIỂU DỮ LIỆU XÂU.
Bài toán 8. ( Bài 1. Đề thi giáo viên giỏi tỉnh Thanh Hóa năm học 2013 – 2014)
 Một xâu kí tự là 1 dãy các số chính phương được viết dài vô tận 149162536..... . Cho 1 số nguyên N (1<=N<=255) Tìm kí tự đứng ở vị trí thứ N trong xâu?
D÷ liÖu vµo: Tõ file BAI1.INP chứa 1 số nguyên N.
KÕt qu¶: Ghi ra file BAI1.OUT chứa kí tự tìm được.
VÝ dô:
BAI1.INP
BAI1.OUT
9
6
 Bài toán 8 sẽ được giải 1 cách dễ dàng nếu chúng ta chuyển sang làm như kiểu xâu.
Bước 1. Lấy các số chính phương ghép thành 1 dãy. 
 Có 1 số học sinh các em quét các số tự nhiên từ 1 đến 1.000.000.000 để tìm các số chính phương và ghép lại. Tuy nhiên cách này các em làm sẽ dài và tốc độ xử lí chậm. Thay vào đó chúng ta có thể lấy bình phương của các số tự nhiên từ 1 đổi ra xâu và ghép vào là được.
Bước 2. Khi độ dài xâu lớn hơn hoặc bằng N ta sẽ ghi ra kết quả và kết thúc.
s:=0;
For i:=1 to 100000 do
Begin
Str(i*i,s1); s:=s+s1;
If length(s) >= N then begin write(f1,s[N]); break; end;
End;
 Từ dạng bài toán này giáo viên cũng có thể cho các em làm các bài toán khác với cách làm tương tự như:
+ Cho các số tự nhiên từ 1 ghép thành 1 dãy vô tận. Tìm.....
+ Cho các số nguyên tố từ 2 ghép thành 1 dãy vô tận. Tìm.....
Bài toán 9. (Bài 2: (7 điểm) TÌM MẬT KHẨU: Đề thi học sinh giỏi tỉnh Thanh Hóa năm học 2014 – 2015)
Việc bảo vệ máy tính của mình để hạn chế người khác thâm nhập vào là một vấn đề đặt ra cho mọi người sử dụng máy tính. Để tăng tính an toàn trong lưu trữ Lan đã quyết định đặt mật khẩu truy cập máy tính của mình vào một xâu T với một quy ước sao cho khi cần cô ta có thể lấy lại được mật khẩu từ xâu T như sau:
Là một người yêu thích số học cô ta thường chọn mật khẩu P là một số nguyên tố và đem giấu vào trong một xâu ký tự T sao cho P chính là số nguyên tố có giá trị lớn nhất trong số các số nguyên tố được tạo từ các xâu con của T (xâu con của một xâu ký tự T là một chuỗi liên tiếp các ký tự trong T).
Ví dụ: xâu T= “Test1234#password5426” chứa mật khẩu là 23 vì T chứa các xâu con ứng với các số nguyên tố 2, 3, 23 và 5.
Yêu cầu: cho một xâu ký tự T có chiều dài không quá 500 ký tự. Tìm mật khẩu P đã dấu trong xâu T biết P có giá trị nhỏ hơn 105. Dữ liệu cho đảm bảo luôn có P.
Dữ liệu vào: vào từ file văn bản BAI2.INP gồm 1 dòng duy nhất là xâu T.
Kết quả: ghi ra file văn bản BAI2.OUT là số P tìm được.
Ví dụ:
BAI2.INP
BAI2.OUT
Test1234#password5426
23
Khi đưa đề bài cho học sinh tôi nhận thấy phần lớn các em thường nghĩ đến việc lấy tất cả các số có thể từ trong xâu vào sau đó kiểm tra xem có bao nhiêu số là nguyên tố lưu riêng ra 1 mảng sau đó tìm số nguyên tố lớn nhất. Vì vậy các em phải xử lý rất nhiều các bài toán phụ nên nhiều em đã sót trường hợp và ra kết quả sai. Việc xử lý xâu ngoài như việc là mảng một chiều mà các phần tử là 1 kí tự thì dữ kiệu kiểu xâu còn cung cấp cho chúng ta 1 số các hàm, thủ tục để xử lí xâu 1 cách linh hoạt và nhanh chóng.
Trong bài này ta chỉ cần xét các số từ 9999 về 1, số nào là số nguyên tố và ta tìm thấy trong xâu s thì đó là số nguyên tố lớn nhất cần tìm.
Bước 1: Viết hàm kiểm tra 1 số tự nhiên là nguyên tố.
Bước 2. Tìm số lớn nhất.
For i:=9999 downto 2 do
If nt(i) then Begin str(i,s1); if pos(s1,s)>0 then 
begin write(f1,i); break; end;
End;
DẠNG BÀI TẬP 4. XỬ LÍ CÁC SỐ LỚN.
 Việc xử lí các số có giá trị lớn chúng ta có thể lưu các phần tử vào mảng, tuy nhiên sẽ hiệu quả hơn nếu chúng ta xử lí các số là các xâu.
Bài toán 10 ( Bài 1: (4 điểm) . Tính tổng hai số - Đề thi giáo viên giỏi cấp trường của Trường THPT Triệu Sơn 1 năm học 2018 – 2019)
Cho 2 số nguyên dương M, N(M, N nhỏ hơn 255 chữ số), hãy tính tổng của 2 số M, N.
Dữ liệu vào: Từ tệp văn bản Bai1.inp gồm 2 dòng:
Dòng đầu ghi số nguyên dương M; - Dòng thứ 2 ghi số nguyên dương N
	Dữ liệu ra: Ghi lên tệp văn bản Bai1.out chỉ một số, là tổng của M, N.
Bai1.inp
Bai1.out
111111111111111
33
111111111111144
 Với bài toán này thì các thí sinh muốn làm được thì bắt buộc phải xử lí theo kiểu xâu kí tự.
PROGRAM CONG;
var s1,s,m,n:ansistring;
f1,f2: text; i,a,b,u,nho,tong: longint;
BEGIN
assign(f1,'bai1.inp'); reset(f1);
assign(f2,'bai1.out'); rewrite(f2);
readln(f1,m); readln(f1,n);
while length(m)length(n) do
if length(m) > length(n) then n:='0'+n else m:='0'+m;
nho:=0; s:='';
for i:= length(m) downto 1 do
begin
val(m[i],a,u); val(n[i],b,u);
tong:=a+b+nho;
nho:=tong div 10;
tong:=tong mod 10;
str(tong,s1);
s:=s1+s;
end;
 if nho>0 then s:='1'+s;
write(f2,s);
close(f1); close(f2);
END.
Bài toán 11. (Bài 4 (3 điểm): Giai thừa. Đề thi học sinh giỏi Tỉnh Thanh Hóa năm học 2018 – 2019)
Cho trước số tự nhiên N.
Yêu cầu: Tìm số tự nhiên K nhỏ nhất sao cho K! có đúng N chữ số. 
Dữ liệu vào: Đọc từ tệp BAI4.INP gồm một dòng chứa số tự nhiên N (1≤ N≤ 104).
Dữ liệu ra: Ghi ra tệp BAI4.OUT kết quả tìm được. Nếu không có số K nào thoả mãn yêu cầu đề ra thì ghi -1. 
Ví dụ:
BAI4.INP
BAI4.OUT
3
5
 Để làm được bài này đối với học sinh học bình thường trên lớp các em có thể tính giai thừa bình thường với kiểu số lớn như longint; int64; qword hoặc kiểu số thực. Tuy nhiên, đây là 1 bài thi học sinh giỏi cấp tỉnh và đặt ở bài phân loại để lấy giải cao nên các em phải xử lý số lớn và phải dùng kiểu xâu một cách hợp lý.
const fi='bai4.inp';
 fo='bai4.out';
var n,i:longint;
 s,st:ansistring;
function nhan(s1,s2:ansistring):ans

Tài liệu đính kèm:

  • docskkn_kieu_du_lieu_xau_tu_bai_toan_co_ban_den_cac_bai_toan_bo.doc
  • docBia sang kien kinh nghiem.doc
  • docxDanh muc SKKN dat giai.docx
  • docMuc luc.doc