SKKN Giúp học sinh tiếp cận một số bài toán số học, xử lý xâu bằng ngôn ngữ lập trình C++ nhằm nâng cao chất lượng học sinh giỏi môn Tin học Trung học phổ thông
Tin học ngày càng có nhiều ứng dụng trong hầu hết các lĩnh vực hoạt động của xã hội loài người. Tuy nhiên, Tin học là một môn học khó vì cơ sở của nó là toán học, bài tập rất đa dạng và phong phú, việc học sinh của trường đi thi học sinh giỏi và để giành được giải không phải là đơn giản, do vậy giáo viên phụ trách đội tuyển cần nhiều kinh nghiệm và kiến thức sát với nội dung ôn thi để nâng cao thành tích đội tuyển tham gia các đợt thi học sinh giỏi hàng năm, Và để có được kết quả tốt cần có một quá trình nghiên cứu, học tập về ngôn ngữ lập trình và chọn một ngôn ngữ lập trình thích hợp.
Hiện nay có rất nhiều ngôn ngữ lập trình bậc cao như: Pascal, Java, Basic, C, C++,.... Tuy nhiên điều cơ bản của C++ là cho phép người lập trình hiểu và quản lí các chương trình lớn, phức tạp. Vì vậy, nó được sử dụng nhiều trong các kỳ thi học sinh giỏi Tin học.
Xuất phát từ cơ sở trên, tôi đã chọn đề tài “GIÚP HỌC SINH TIẾP CẬN MỘT SỐ BÀI TOÁN SỐ HỌC, XỬ LÝ XÂU BẰNG NGÔN NGỮ LẬP TRÌNH C++ NHẰM NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI MÔN TIN HỌC THPT”.
Tóm tắt nội dung tài liệu: SKKN Giúp học sinh tiếp cận một số bài toán số học, xử lý xâu bằng ngôn ngữ lập trình C++ nhằm nâng cao chất lượng học sinh giỏi môn Tin học Trung học phổ thông

thừa ở đầu và cuối chuỗi + giữa các từ chỉ cách nhau 1 khoảng trắng + Viết hoa kí tự đầu của mỗi từ Vd. 24 Chuỗi nhập vào: trAn thi hUOng Chuỗi kết quả: Tran Thi Huong Có thể ghi ra độ dài chuỗi trước và sau khi xử lí Chương trình: #include #include using std::string; using namespace std; void xoa_dau_cuoi(string &str) { while (str[0]==' ') { str.erase(str.begin()+0); } while (str[str.length()-1]==' ') { str.erase(str.begin()+str.length()-1); } } void xoa_trang_thua_giua_cac_tu(string &str) { for (int i=0; i<=str.length();i++) { if (str[i]==' ' &&str[i+1]==' ') { str.erase(str.begin()+i); i--; } } } void In_Hoa_Ky_Tu_Dau_Tu(string &str) { for (int i=0; i<=str.length();i++) str[i]=tolower(str[i]); if (str[0]!=' ') { str[0] -=32; } for (int i=0; i<=str.length() - 1;i++) { if (str[i]==' ' && str[i+1]!=' ') { 25 if (str[i+1]>=97 && str[i+1]<=122) { str[i+1] -=32; } } } } int main() { string str; cout<<"\nNhap chuoi:"; getline(cin, str); cout<<"\n Do dai chuoi:"<<str.length(); xoa_dau_cuoi(str); xoa_trang_thua_giua_cac_tu(str); In_Hoa_Ky_Tu_Dau_Tu(str); cout<<"\n Chuoi ket qua:"<<str; cout<<"\n Do dai chuoi ket qua:"<<str.length(); return 0; } Kết quả chạy chương trình: Bài 2. Đếm từ trong xâu Viết chương trình nhập vào 1 xâu (Xâu nhập vào đã là xâu chuẩn: Không chứa ký tự trắng dư thừa). Hãy đếm số từ trong xâu. Vd. STRING.INP STRING.OUT Vo Phuong Nhung So tu: 3 Chương trình: #include #include using namespace std; int main() { 26 string s; getline(cin,s); int demtu; demtu=0; for (int i = 0; i < s.size() - 1; i++) { if (s[i] == ' ' && s[i + 1] != ' ') { demtu++; } } cout<<"so tu: " <<demtu+1; return 0; } Kết quả chương trình: Bài 3. Xâu đối xứng Viết chương trình nhập vào 1 xâu, hãy kiểm tra xâu vừa nhập có phải là xâu đối xứng hay không. Ví dụ Xâu nhập vào Kết quả abcdef ko la xau doi xung Xâu nhập vào Kết quả abccba xau doi xung Chương trình: #include using namespace std; int main() { string s,st=""; getline(cin,s); for(int i=s.size()-1;i>=0;i--) 27 { st=st+s[i]; } if(st==s) cout<<"xau doi xung"; else cout<<"ko la xau do i xung"; return 0; } Kết quả chạy chương trình: Bài 4. TÁCH TỪ Nhập vào 1 xâu gồm nhiều từ (các từ cách nhau bởi ký tự trắng, xâu không dài quá 256 ký tự), hãy tách các từ ra từ xâu. Ví dụ Xâu nhập vào: Cong hoa xa hoi Xâu kết quả: Cong hoa xa hoi Chương trình: #include #include using namespace std; int main() 28 { int i = 0; string str; getline(cin, str); while (str[0] == ' ') str.erase(0, 1); while (str[str.size() - 1] == ' ') str.erase(str.size() - 1, 1); while (str.find(" ") != -1) str.erase(str.find(" "), 1); while (str[i]) { if (isblank(str[i])) { str[i] = '\n'; } cout << str[i]; i++; } return 0; } Kết quả chạy chương trình Lưu ý: Hàm isblank() trong C++ kiểm tra xem ký tự đã cho có phải là ký tự trống hay không. nguyên mẫu isblank() int isblank(int ch); Bài 5. Viết chương trình nhập vào họ và tên. Hãy tách thành 2 phần: phần họ và phần tên. Vd. nguyen van hai Kết quả: Ho la: nguyen van Ten la: hai Chương trình: #include #include 29 using std::string; using namespace std; int main() { string s, ht, t; getline(cin, s); int l=s.size(); for (int i=l-1;i>=0;i--) if (s[i]==' ') { ht=s.substr(0,i); cout<<"Ho la: "; cout<<ht<<endl; t=s.substr(i+1,l-i); cout<<"Ten la: "; cout<<t; break; } return 0; } Kết quả chạy chương trình: Lưu ý: * Hàm substr là một hàm thành viên trong class std:string, có tác dụng cắt chuỗi con ra từ chuỗi string ban đầu bằng cách chỉ định vị trí và độ dài chuỗi cần cắt. Phép cắt string bằng hàm substr trong C++ không làm thay đổi chuỗi ban đầu mà sẽ lưu kết quả cắt vào một string mới. Cú pháp sử dụng hàm substr để cắt string trong C++ như sau: str.substr(start, length); Trong đó str là chuỗi ban đầu, start là vị trí bắt đầu cắt, và length là độ dài (số ký tự) cần cắt ra. Nếu không chỉ định length thì mặc định sẽ cắt từ vị trí chỉ định cho tới cuối chuỗi string ban đầu. * Cắt string từ vị trí chỉ định tới cuối string trong C++ Khi lược bỏ đối số length thì mặc định chương trình sẽ cắt từ vị trí chúng ta chỉ định cho tới vị trí cuối chuỗi. 30 Bài 6. In hoa ký tự đầu tiên của các từ trong xâu Nhập vào 1 xâu từ bàn phím (xâu nhập vào không chứa ký tự trắng dư thừa), hãy in hoa ký tự đầu tiên của các từ trong xâu Ví dụ: Xâu nhập vào: nguyen hoai anh Xâu kết quả: Nguyen Hoai Anh Chương trình: #include #include using std::string; using namespace std; int main() { string s; getline(cin, s); int l=s.size(); for (int i=0; i<=l;i++) if (s[i]==' ') { s[i+1]=toupper(s[i+1]); } s[0] = toupper(s[0]); cout<<s; return 0; } Bài 7. Đảo ngược xâu Viết chương trình nhập vào 1 xâu, hãy đảo ngược xâu và in kết xâu sau khi đảo ngược ra mà hình. Xâu nhập vào: abcdef Xâu kết quả: fedcba include #include using std::string; using namespace std; int main() { string s; 31 getline(cin, s); int l=s.size(); for (int i=l-1;i>=0;i--) { cout<<s[i]; } return 0; } Bài 8. Ghép liên tiếp xâu Nhập xâu kí tự S1, gọi độ dài của S là n. Tạo ra xâu S bằng cách ghép liên tiếp 3 xâu S1. Hãy chia S thành n chuỗi con độ dài 3 kí tự. Hãy in ra các xâu con đó, mỗi xâu con trên một dòng. Ví dụ: S1 = “ABCD” thì S = “ABCDABCDABCD” và 4 chuỗi con sẽ là “ABC”, “DAB”, “CDA” và “BCD”. -> có thể dùng hàm substr Hàm substr: có tác dụng cắt chuỗi con ra từ chuỗi string ban đầu bằng cách chỉ định vị trí và độ dài chuỗi cần cắt. Phép cắt string bằng hàm substr trong C++ không làm thay đổi chuỗi ban đầu mà sẽ lưu kết quả cắt vào một string mới. Cú pháp sử dụng hàm substr để cắt string trong C++ như sau: str.substr(start, length); Trong đó str là chuỗi ban đầu, start là vị trí bắt đầu cắt, và length là độ dài (số ký tự) cần cắt ra. Nếu không chỉ định length thì mặc định sẽ cắt từ vị trí chỉ định cho tới cuối chuỗi string ban đầu. Chương trình: #include #include using namespace std; int main() { string S1,S; cout << "Nhap chuoi S1: "; getline(cin,S1); int n; n = S1.size(); for (int i=0; i<3; i++) { S = S + S1; } cout << "Xau moi tao: " << S << endl; cout << "Cac xau con: " << endl; for (int i=0; i<n; i++) 32 { cout << S.substr(i*3,3) << endl; } return 0; } Kết quả chạy chương trình: Bài 9. Nén xâu Một xâu ký tự có thể nén lại thành một xâu mới bằng cách nén các ký tự giống nhau đứng cạnh nhau. Ví dụ có trong xâu có 4 ký tự “a”, sẽ được nén thành 4a. Dữ liệu vào: Từ file văn bản XAUNEN.INP là một xâu ký tự chữ in thường (các ký tự giống nhau chỉ đứng cạnh nhau). Kết quả: Ghi vào file NENXAU.OUT là xâu ký tự sau khi nén. Ví dụ: Nenxau.inp Nenxau.out mmaabbbeeeezh 2m2a3b4ezh Chương trình: #include using namespace std; int main() { freopen("NENXAU.INP","r",stdin); freopen("NENXAU.OUT","w",stdout); string s,st; getline(cin,s); st=s[0]; for(int i=1;i<=s.size()-1;i++) { if(s[i]==st[0]) st+=s[i]; else { if(st.size()>1) cout<<st.size(); 33 cout<<st[0]; st=s[i]; } } if(st.size()==1) cout<<st[0]; else cout<<st.size()<<st[0]; return 0; } Kết quả chạy chương trình: Bài 10. Rút gọn xâu Cho một xâu s chỉ gồm các chữ cái in thờng và độ dài tối đa 250 kí tự. Em hãy viết chương trình tạo ra xâu sg từ xâu s bằng cách xóa các kí tự liên tiếp giống nhau trong xâu s và chỉ để lại một kí tự đại diện trong đoạn đó. Dữ liệu vào: Từ file văn bản xaugon.inp chứa xâu s chỉ gồm các chữ cái in thường. Kết quả ra: Ghi ra file văn bản Xaugon.out là xâu sg tìm được. VD: Xaugon.inp Xaugon.out HHOOOCCCSSIINNNNHHH HOCSINH Chương trình: #include using namespace std; int main() { freopen("RUTXAU.INP","r",stdin); freopen("RUTXAU.OUT","w",stdout); string s,st; getline(cin,s); st=s[0]; for(int i=1;i<=s.size()-1;i++) { if(s[i]==st[0]) st+=s[i]; else { cout<<st[0]; 34 st=s[i]; } } cout<<st[0]; return 0; } Kết quả chạy chương trình: Phần 3. KẾT LUẬN VÀ KIẾN NGHỊ 1. Kết luận Ngôn ngữ lập trình nói chung đóng vai trò rất quan trọng trong việc xây dựng các chương trình ứng dụng để phục vụ cho cuộc sống. Nhờ sự phát triển của tin học - trong đó các nhà lập trình chuyên nghiệp đóng vai trò không nhỏ - mà hiện nay hầu hết các lĩnh vực trong xã hội đã ứng dụng được tin học để giải quyết công viêc nhanh, hiệu quả và chính xác hơn. Hiện nay, ngôn ngữ lập trình C++ đã trở thành ngôn ngữ lập trình phổ biến được sử dụng trong lĩnh vực giảng dạy đặc biệt là bồi dưỡng học sinh giỏi. Đề tài của tôi trên đây có thể còn chưa hoàn thiện do còn hạn chế về trình độ kiến thức và kinh nghiệm giảng dạy. Vì vậy, tôi rất mong nhận được sự đóng góp ý kiến quí báu của các thầy giáo, cô giáo và các bạn đồng nghiệp để ngày càng hoàn thiện hơn. Tôi xin chân thành cảm ơn! 2. Kiến nghị Trong quá trình dạy học, mỗi thầy cô cần cố gắng xây dựng những nội dung khoa học, lựa chọn phương pháp phù hợp, thu hút và tạo hứng thú cho học sinh ham thích môn Tin học. Nội dung của đề tài rất thiết thực và bổ ích cho học sinh học lập trình nói chung, cũng như học sinh ôn thi học sinh giỏi các cấp môn Tin học nói riêng. Vì vậy tôi mong rằng đề tài sớm tiếp cận được các học sinh và các em vận dụng hiệu quả nâng cao trình độ, kiến thức lập trình. TÀI LIỆU THAM KHẢO 1. Sách giáo khoa tin học 11 Hồ Sĩ Đàm chủ biên 2. Sách giáo viên tin học 11 Hồ Sĩ Đàm chủ biên 3. Sách giáo khoa tin học 11_Biên dịch sang C++ 35 4. Sách tham khảo NNLT C++, Quách Tuấn Ngọc_NXB Thống kê 5. Tự học lập trình C++, Đinh Hùng, NXB Đà Nẵng 6. Sách tham khảo NNLT C++ ĐH Đồng Nai 7. Giáo trình Giải thuật và Lập trình, Lê Minh Hoàng 8. Lập trình hướng đối tượng với C++, Gs.Phạm-Văn-Ất 9. Một số sáng kiến kinh nghiệm, nguồn tài liệu về C++ trên internet ... PHỤ LỤC Khảo sát sự cấp thiết và tính khả thi của đề tài 1. Mục đích khảo sát - Tìm hiểu quan điểm của giáo viên dạy Tin học trong đó có cả một số giáo viên đã từng bồi dưỡng HSG Tỉnh bằng ngôn ngữ lập trình C++. - Kết quả khảo sát làm cơ sở cho việc đề xuất đề tài là nội dung cần thiết cho giáo viên tham khảo thêm khi dạy lập trình cho Hs. 2. Nội dung và phương pháp khảo sát 2. 1. Nội dung khảo sát 2.1.1. Tổ chức khảo sát Khảo sát sự cấp thiết và tính khả thi của đề tài ở giáo viên Tin học THPT 2.1.2. Nhiệm vụ khảo sát - Liên hệ với các giáo viên Tin học các trường THPT trên địa bàn huyện và giáo viên trong đơn vị. Cụ thể là giáo viên tin học trường THPT Yên Thành 2, trường THPT Nam Yên Thành và giáo viên trường THPT Phan Đăng Lưu. 2.2. Phương pháp khảo sát - Xây dựng phiếu khảo sát: Thiết kế phiếu khảo sát trực tuyến trên Google Forms, câu hỏi khảo sát là câu hỏi trắc nghiệm khách quan nhiều lựa chọn. Phiếu khảo sát: Phụ lục 1 Link phiếu khảo sát online: Link khảo sát sự cấp thiết: https://docs.google.com/forms/d/e/1FAIpQLSfGMChT8n6SutGbkywq_2_pOB9zb fPgKRLAlAVLnSbT0xK2aQ/viewform?usp=sf_link Link khảo sát tính khả thi: https://docs.google.com/forms/d/e/1FAIpQLSexLiYKIde_jg89v8iwj0- eh7CERkzz5k7aymy_wslNXD0Urg/viewform?usp=sf_link 36 - Tiến hành khảo sát: Gửi link phiếu điều tra cho giáo viên môn Tin trong trường (THPT Phan Đăng Lưu) và một số giáo viên trường trong Huyện (Trường THPT Yên Thành 2, THPT Nam Yên Thành), sau đó nhờ giáo viên tham gia cho ý kiến theo mẫu phiếu trắc nghiệm. - Xử lý số liệu: Sau khi kết thúc khảo sát, các số liệu sẽ được thống kê, phân tích. 3. Đối tượng khảo sát Giáo viên môn Tin trong trường (THPT Phan Đăng Lưu) và một số giáo viên trường trong Huyện (Trường THPT Yên Thành 2, THPT Nam Yên Thành), trong đó đa số là giáo viên đã bồi dưỡng học sinh giỏi tỉnh môn tin học bằng ngôn ngữ lập trình C++. 4. Kết quả khảo sát sự cấp thiết và tính khả thi của đề tài như sau: * Khảo sát sự cấp thiết của đề tài 37 38 * Khảo sát tính khả thi của đề tài 39 40 PHỤ LỤC 1 PHIẾU KHẢO SÁT SỰ CẤP THIẾT VÀ TÍNH KHẢ THI CỦA ĐỀ TÀI Khảo sát sự cấp thiết của đề tài SKKN Đề tài: "Giúp học sinh tiếp cận một số bài toán số học, xử lý xâu bằng ngôn ngữ lập trình C++ nhằm nâng cao chất lượng học sinh giỏi môn tin học trung học phổ thông" Thầy (Cô) đánh giá như thế nào về sự cấp thiết của đề tài với nội dung sau: Câu 1. Xây dựng bộ bài tập theo từng dạng và phổ biến phù hợp cho học sinh để phát triển khả năng lập trình là? Rất cấp thiết Cấp thiết Ít cấp thiết Không cấp thiết Câu 2. Xây dựng bộ bài tập có nội dung thực tiễn trong dạy học là? Rất cấp thiết Cấp thiết Ít cấp thiết Không cấp thiết Câu 3. Chú trọng lựa chọn hệ thống các bài tập nhằm tạo hứng thú và ham thích học lập trình cho học sinh là? 41 Rất cấp thiết Cấp thiết Ít cấp thiết Không cấp thiết Câu 4. Xây dựng hệ thống bài tập phù hợp để rèn luyện kỹ năng lập trình tốt là? Rất cấp thiết Cấp thiết Ít cấp thiết Không cấp thiết Câu 5. Hỗ trợ học sinh mở rộng, nâng cao các dạng bài tập là? Rất cấp thiết Cấp thiết Ít cấp thiết Không cấp thiết Câu 6. Xây dựng và thực hiện các bài tập bằng lập trình là nền tảng tiến tới ngành công nghệ thông tin là? Rất cấp thiết Cấp thiết Ít cấp thiết Không cấp thiết Khảo sát tính khả thi của đề tài SKKN Đề tài: "Giúp học sinh tiếp cận một số bài toán số học, xử lý xâu bằng ngôn ngữ lập trình C++ nhằm nâng cao chất lượng học sinh giỏi môn tin học trung học phổ thông" Thầy (Cô) đánh giá như thế nào về tính khả thi của đề tài với nội dung sau: Câu 1. Xây dựng bộ bài tập theo từng dạng và phổ biến phù hợp cho học sinh để phát triển khả năng lập trình là? Rất khả thi Khả thi Ít khả thi Không khả thi 42 Câu 2. Xây dựng bộ bài tập có nội dung thực tiễn trong dạy học là? Rất khả thi Khả thi Ít khả thi Không khả thi Câu 3. Chú trọng lựa chọn hệ thống các bài tập nhằm tạo hứng thú và ham thích học lập trình cho học sinh là? Rất khả thi Khả thi Ít khả thi Không khả thi Câu 4. Xây dựng hệ thống bài tập phù hợp để rèn luyện kỹ năng lập trình tốt là? Rất khả thi Khả thi Ít khả thi Không khả thi Câu 5. Hỗ trợ học sinh mở rộng, nâng cao các dạng bài tập là? Rất khả thi Khả thi Ít khả thi Không khả thi Câu 6. Xây dựng và thực hiện các bài tập bằng lập trình là nền tảng tiến tới ngành công nghệ thông tin là? Rất khả thi Khả thi Ít khả thi Không khả thi 43
File đính kèm:
skkn_giup_hoc_sinh_tiep_can_mot_so_bai_toan_so_hoc_xu_ly_xau.docx