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”.

docx 52 trang Chăm Nguyễn 04/07/2025 201
Bạn đang xem 20 trang mẫu của 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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

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

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:

  • docxskkn_giup_hoc_sinh_tiep_can_mot_so_bai_toan_so_hoc_xu_ly_xau.docx