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

