1. Trang chủ
  2. » Luận Văn - Báo Cáo

(Skkn 2023) 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

46 6 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề 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ác giả Trần Thị Hương
Trường học Trường THPT Phan Đăng Lưu
Chuyên ngành Tin học
Thể loại Sáng kiến kinh nghiệm
Năm xuất bản 2022 – 2023
Thành phố Nghệ An
Định dạng
Số trang 46
Dung lượng 1,57 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

SÁNG KIẾN KINH NGHIỆM Đề 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 Môn/Lĩnh

Trang 1

SÁNG KIẾN KINH NGHIỆM

Đề 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

Môn/Lĩnh vực: Tin học

Trang 2

SỞ GIÁO DỤC & ĐÀO TẠO NGHỆ AN Đơn vị: Trường THPT Phan Đăng Lưu

SÁNG KIẾN KINH NGHIỆM

Trang 3

MỤC LỤC

Phần 1 ĐẶT VẤN ĐỀ 1

1 Lý do chọn đề tài 1

2 Mục đích nghiên cứu 1

3 Đối tượng nghiên cứu 1

4 Phương pháp nghiên cứu 1

5 Phạm vi nghiên cứu 2

6 Tính mới của đề tài 2

Phần 2 NỘI DUNG ĐỀ TÀI 2

1 Cơ sở lý luận và thực tiễn 2

1.1 Cơ sở lý luận 2

1.2 Cơ sở thực tiễn 2

2 Nội dung vấn đề nghiên cứu 3

2.1 BÀI TẬP SỐ HỌC 3

2.1.1 Bài tập về ước chung lớn nhất 3

2.1.2 Bài tập về cấp số cộng 7

2.1.3 Bài tập về số nguyên tố 8

2.1.4 Bài tập về giai thừa 12

2.1.5 Bài tập về số hoàn hảo 13

2.1.6 Bài tập về số chính phương 16

2.1.7 Bài tập về số phong phú 17

2.1.8 Bài tập về số đẹp 19

2.1.9 Bài tập về số thân thiện 20

2.2 BÀI TẬP XÂU 22

2.2.1 Các kiến thức cơ bản về xâu 22

2.2.2 Bài tập xâu 24

Phần 3 KẾT LUẬN VÀ KIẾN NGHỊ 35

1 Kết luận 35

2 Kiến nghị 35

TÀI LIỆU THAM KHẢO 35

PHỤ LỤC 36

Trang 4

Phần 1 ĐẶT VẤN ĐỀ

1 Lý do chọn đề tài

Sự phát triển mạnh mẽ như vũ bão của tin học đã làm cho xã hội có nhiều nhận thức mới về cách tổ chức các hoạt động Nhiều quốc gia trên thế giới ý thức được rất rõ tầm quan trọng của tin học và có những đầu tư lớn cho lĩnh vực này, đặc biệt trong giáo dục nâng cao dân trí về tin học và đào tạo nguồn nhân lực có chất lượng cao Người Việt Nam có nhiều tố chất thích hợp với ngành khoa học này, vì thế chúng ta hi vọng có thể sớm hoà nhập với khu vực và trên thế giới

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”

2 Mục đích nghiên cứu

Qua quá trình tham gia giảng dạy, bồi dưỡng học sinh giỏi và việc nghiên cứu các vấn đề về lập trình theo từng dạng bài tập từ cơ bản đến phức tạp của ngôn ngữ lập trình C++, các tài liệu về phương pháp giảng dạy phục vụ cho việc học tập, ôn thi học sinh giỏi của học sinh cũng như giảng dạy của giáo viên, tôi đã giải các bài toán bằng ngôn ngữ lập trình C++ với hệ thống lập trình CodeBlocks Từ đó, tôi đưa

ra đề 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” với mong muốn phần nào giúp học sinh cũng như giáo viên có thêm tài liệu tham khảo phục vụ cho việc học tập và giảng dạy, ôn thi HSG

3 Đối tượng nghiên cứu

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

4 Phương pháp nghiên cứu.

Trang 5

Kinh nghiệm bản thân qua các kỳ ôn thi HSG, nghiên cứu các tài liệu về C++ qua sách tham khảo, mạng internet, sưu tầm tài liệu, thử nghiệm thực tế, rút kinh nghiệm từ các tiết dạy bồi dưỡng HSG

6 Tính mới của đề tài

- Đề tài nghiên cứu về vận dụng các kiến thức đã học về thuật toán, từ đó viết chương trình trên ngôn ngữ lập trình C++

- Mô tả được thực trạng về vấn đề cấp thiết cho cho học sinh THPT ở cách học lập trình và lựa chọn ngôn ngữ lập trình đặc biệt là trong các kỳ thi học sinh giỏi Tỉnh

Phần 2 NỘI DUNG ĐỀ TÀI

1 Cơ sở lý luận và thực tiễn

1.1 Cơ sở lí luận:

C++ được biết đến như là ngôn ngữ mới bao trùm lên C và do Bjarne Stroustrup sáng tác ra vào năm 1980 tai bang New Jersey, Mĩ Lúc đầu ông đặt tên là “C với các lớp”, tuy nhiên đến năm 1983 thì ông đổi tên thành C++ Trong C++ chẳng những đưa vào tất cả các khái niệm, công cụ của lập trình hướng đối tượng mà còn đưa vào nhiều khả năng mới mẻ cho hàm Nó có một thư viện hàm chứa mã đối tượng cho những hàm đã được tạo sẵn Những hàm này thực hiện các tác vụ thường dùng như nhập một chuổi ký tự từ bàn phím (gets()), tính căn bậc hai (sqrt()),

mà chương trình được viết có thể sử dụng mà không phải viết lại

1.2 Cơ sở thực tiễn:

Qua thực tế giảng dạy ở trường THPT các năm qua, tôi nhận thấy khi học đến chương trình NNLT tin học lớp 11 đa số học sinh đều nhận xét bộ môn này rất khó Tuy nhiên cũng có một số lượng không nhỏ học sinh rất yêu thích tin học và thích tìm hiểu một số bài toán, cách giải các bài toán bằng NNLT Trong chương trình phổ thông NNLT Pascal đang được giảng dạy cho HS khối 11, nhưng tôi thấy NNLT C++ rất thuận tiện và có nhiều lợi thế khi dạy bồi dưỡng học sinh giỏi và giúp học sinh giải các bài toán phức tạp thuận tiện hơn Ngoài ra trong các đề thi học sinh giỏi tỉnh các năm qua, chủ đề xâu dữ liệu là một nội dung trọng tâm, đa số đề thi đều có các dạng bài thuộc kiểu xâu, bài toán số học: Số bạn bè, số thân thiện, số

Trang 6

đẹp….Vì vậy tôi đã đầu tư nghiên cứu các nội dung, các dạng bài tập và mạnh dạn viết về đề tài này

2 Nội dung vấn đề nghiên cứu

Ví dụ: Bài tập đơn giản “Chương trình Hello World” Viết ra màn hình dòng chữ Hello world

2.1 BÀI TẬP SỐ HỌC

2.1.1 BÀI TẬP VỀ ƯỚC CHUNG LỚN NHẤT (UCLN)

Bài 1: Nhập vào 2 số nguyên A và B, viết chương trình tìm ước chung lớn nhất của

2 số đó

Trong bài này chúng ta có thể sử dụng cách giải tìm ước chung lớn nhất trong

C++, bằng cách sử dụng thuật toán loại trừ hoặc thuật toán Euclid hoặc bằng hàm gcd có sẵn trong thư viện algorithm của C++

Ví dụ

Input : A = 20, B = 15

Output : 5

Trang 7

* Tìm UCLN bằng phương pháp trừ

Ý tưởng của thuật toán này là trừ hai số A và B cho nhau tới khi hai số này bằng nhau Lúc này ta sẽ tìm được UCLN của 2 số Các bước triển khai thuật toán sẽ như sau:

- Kiểm tra A hoặc B có bằng 0 hay không? Nếu bằng 0 trả về UCLN là A+B Dừng chương trình

- Lặp cho tới khi A = B Với mỗi vòng lặp thì biến biến max(A, B) = giá trị max(A, B) - giá trị min(A, B)

* Tìm UCLN sử dụng thuật toán Euclid

Giải thuật Euclid, hay Thuật toán Euclid là một giải thuật giúp tính UCLN của hai

số một cách hiệu quả

Trang 8

Thuật toán Euclid

Thuật toán Euclid là một giải thuật giúp chúng ta tìm ước chung lớn nhất của 2 số

Nó được triển khai dựa trên tính chất của UCLN đó là UCLN(A, B) = UCLN(B, A%B)

Ý tưởng triển khai thuật toán này sẽ quy nạp cho tới khi A % B = 0

-> Đây là cách tối ưu để giải các bài toán với dữ liệu lớn

* Tìm UCLN bằng hàm có sẵn trong C/C++

Ngoài cách tự viết các hàm tìm uớc chung lớn nhất, chúng ta còn có thể sử dụng hàm gcd có sẵn trong thư viện algorithm của C/C++

Chương trình:

#include<iostream>

#include<algorithm>

using namespace std;

Trang 9

Bài 2:

Cho dãy A gồm N số tự nhiên Tìm ước chung lớn nhất của dãy số đó

- Dữ liệu vào gồm:

+ Dòng thứ nhất là số nguyên dương N + Các dòng tiếp theo các phần tử của dãy

- Kết qua ra là ước chung lớn nhất của dãy

Trang 10

cout<<"Nhap n = "; cin>>n;

for(int i=0; i<n ; i++){

cout<<"a["<<i<<"] = ";

Bài 1 Viết chương trình nhập số nguyên dương N và dãy số nguyên A1, A2, A3,

…,An Kiểm tra xem dãy vừa nhập có phải là cấp số cộng hay không, Nếu đúng thì ghi số 1, ngược lại ghi số 0

Trang 11

Định nghĩa Số nguyên tố trong lập trình:

Số nguyên tố là số tự nhiên lớn hơn 1, chỉ có 2 ước là 1 và chính nó Hay nói cách

Bài 1 Nhập vào số nguyên dương N, Tìm và đưa ra số nguyên tố lớn hơn N

Trang 12

{

if(n<2) return false;

for(int i=2;i*i<=n;i++)

if(n%i==0) return false;

Kết quả chạy chương trình:

Bài 2: Số nguyên tố đối xứng

Một số nguyên dương T được gọi là số nguyên tố đối xứng nếu thỏa mãn các yêu cầu sau:

- T là một số nguyên tố

- T là một số đối xứng (đọc T từ trái qua phải thu được kết quả giống như đọc

T từ phải qua trái) Ví dụ 12321 là 1 số đối xứng

Yêu cầu: cho 2 số nguyên dương A và B (104 ≤ A < B <105 ), hãy tìm số lượng các

số nguyên tố đối xứng T thỏa mãn A ≤ T ≤ B

Trang 14

Ví dụ: X = 613 thì Y = 316 là số đảo ngược của X

Số nguyên dương Y được gọi là số nguyên tố nếu nó chỉ có hai ước số là 1 và chính nó, số 1 không phải là số nguyên tố

Cho hai số nguyên dương P và Q (1 ≤ P ≤ Q ≤ 2109; Q - P ≤ 105)

Yêu cầu: Hãy tìm tất cả các số nguyên dương X nằm thỏa mãn P ≤ X ≤ Q và số đảo

ngược của số X là số nguyên tố

Dữ liệu vào: Cho trong file văn bản TIMSO.INP có cấu trúc như sau:

- Dòng 1: Ghi hai số nguyên dương P Q, hai số được ghi cách nhau ít nhất một dấu

Trang 15

freopen("TIMSO.INP", "r", stdin);

freopen("TIMSO.OUT", "w", stdout);

2.1.4 BÀI TẬP VỀ GIAI THỪA

Bài 1 Giai thừa của một số được cho bởi công thức sau: n!=1*2*…*n

Cho số N (N<=2.109) nguyên dương, hãy tính tổng giai thừa các chữ số của nó Hướng dẫn: Viết 1 hàm tính giai thừa của số nguyên dương N Sử dụng hàm này để tính tổng giai thừa các chữ số của một số

Trang 16

freopen("GT.INP","r",stdin);

freopen("GT.OUT","w",stdout);

long n; cin>>n; long long s=0;

2.1.5 BÀI TẬP VỀ SỐ HOÀN HẢO

Số hoàn hảo được hiểu đơn giản là số có tổng các ước số thật sự của nó bằng chính

Giải thích thuật toán: giả sử ta có một số a là số cần kiểm tra

1 Đầu tiên ta tìm ra các ước số của a, -> ta sẽ cần một vòng lặp For, lặp từ 1 đến a/2 với bước nhảy là 1 (i++)

2 Tiếp đến tạo một biến Sum, được dùng để tính tổng các ước số của a Ta tạo một điều kiện trong vòng lặp For, nếu (a % i == 0) thì sum += i

Trang 17

3 Cuối cùng, kiểm tra nếu sum == a thì a chính là số hoàn hảo và ngược lại

* Lưu ý: Các ước số của a luôn bé hơn hoặc bằng a/2

Bài 1 Nhập vào số nguyên n, kiểm tra số vừa nhập có phải là số hoàn hảo không?

Ví dụ:

Dữ liệu vào Kết quả Dữ liệu vào Kết quả

6 6 La so Hoan Hao 12 12 Khong la so Hoan Hao Chương trình:

Bài 2: Cặp đôi hoàn hảo

Cho dãy số nguyên gồm n phần tử a1, a2,… an Hai số ai và aj (i=1, 2,…n; j=1, 2,…n; i≠j) được gọi là cặp đôi hoàn hảo nếu ai, aj là 2 số nguyên tố Với dãy số trên tìm số cặp đôi hoàn hảo

Trang 18

Yêu cầu: Hãy cho biết có bao nhiêu cặp đôi hoàn hảo

Ví dụ: Dãy số a là 3 2 -4 7 thì số cặp đôi hoàn hảo là 3

Dữ liệu vào có nội dung như sau:

 Dòng đầu là số nguyên dương n (n≤103)

 Trong n dòng sau, dòng thứ i là số nguyên ai (i=1, 2,… n; |ai|≤105)

Kết quả ghi ra:

Một số nguyên duy nhất là số cặp đôi hoàn hảo

if(a<2) return false;

for(int i=2;i*i<=a;i++) if(a%i==0) return false;

for(int i=1;i<=n;i++)

for(int j=i+1;j<=n;j++)

if(ktra(a[i])==true&&ktra(a[j])==true) dem++;

cout<<dem;

return 0;

}

Trang 19

2.1.6 BÀI TẬP VỀ SỐ CHÍNH PHƯƠNG

Số chính phương là số tự nhiên có căn bậc hai là một số tự nhiên, hay nói cách khác,

số chính phương bằng bình phương của một số tự nhiên

Ví dụ:

 Số 4 là số chính phương vì 2^2 = 4 (hoặc sqrt(4) = 2)

 Tập các số chính phương như sau: CP = {4; 9; 16; 25; .}

Có các cách để viết thuật toán kiểm tra số chính phương như sau:

1 Kiểm tra số chính phương bằng vòng lặp

2 Kiểm tra số chính phương bằng hàm sqrt() trong thư viện math.h

 Nếu i * i > n thì n không phải là số chính phương

* Thuật toán kiểm tra số chính phương bằng hàm sqrt()

Thuật toán:

 Trong thư viện math.h có một hàm được dùng để tính căn bậc hai, đó chính là hàm sqrt()

 Chúng ta sử dụng hàm sqrt() để đặt điều kiện cho số n Nếu sqrt(n) * sqrt(n)

= n, thì n chính là số chính phương và ngược lại

Bài 1: Viết chương trình nhập vào một dãy gồm n số nguyên Hãy tìm và in ra màn

hình các số chính phương có trong dãy đó

Trang 20

for(int i = 0;i < n;i++) cin >> a[i];

cout << "\nCac so chinh phuong:\n";

for(int i = 0;i < n; i++)

Kết quả chạy chương trình:

2.1.7 BÀI TẬP VỀ SỐ PHONG PHÚ

Bài 1: Đếm số phong phú

Số phong phú là số có tổng các ước số nguyên của nó kể cả số 1 (không kể chính nó) lớn hơn nó Ví dụ: Số 6 có tổng các ước 1+ 2+ 3 = 6 không là số phong phú Số 12 có tổng các ước là 1+ 2+ 3+ 4+ 6 = 16 (Lớn hơn 12) là số phong phú

Yêu cầu: Hãy cho biết có bao nhiêu số phong phú không lớn hơn N

Dữ liệu vào: Số nguyên N (0< N ≤ 105)

Trang 21

Kết quả: Ghi một số nguyên duy nhất là kết quả tìm được theo yêu cầu

Trang 22

Kết quả chạy chương trình:

Yêu cầu: Cho số nguyên dương N, có bao nhiêu số đẹp nhỏ hơn hoặc bằng N

Dữ liệu nhập vào gồm một số nguyên dương N (1 ≤ N ≤ 106)

Kết quả ra là số lượng số đẹp nhỏ hơn hoặc bằng N

for(int i=2;i*i<=n;i++)

if(n%i==0) return false; return true;

}

int main()

Trang 23

Kết quả chạy chương trình:

2.1.9 BÀI TẬP VỀ SỐ THÂN THIỆN

Bài 1

Đang tìm hiểu các thuật toán về số tự nhiên, Nguyên phát hiện ra số tự nhiên

có rất nhiều tính chất thú vị Nhiều số tự nhiên khi tìm ước chung lớn nhất với số đảo ngược của nó bằng 1, những số như thế được gọi là số thân thiện Chẳng hạn

số 23, số đảo ngược của nó là 32, hai số này có ước chung lớn nhất là 1 nên số 23

là số thân thiện và 32 cũng là số thân thiện

Yêu cầu: Cho 2 số tự nhiên a, b (10 ≤ a ≤ b ≤ 104) Hãy đếm xem trong đoạn

từ a đến b có bao nhiêu số thân thiện

Ví dụ:

Dữ liệu vào Kết quả Giải thích

19 29 4 Đó là các số: 19, 23, 25, 29

- Ý tưởng: Dùng 1 biến Dem để lưu số lượng số thân thiện

Xét lần lượt các số tự nhiên i từ a tới b

Với mỗi số i xác định số tự nhiên j là đảo ngược của i

Nếu UCLN(i,j)= 1 thì tăng biến Dem lên 1

Kết quả bài toán là Dem

Chương trình:

Trang 24

freopen("rb.inp","r",stdin);

freopen("rb.out","w",stdout);

int a,b; int dem=0;

Trang 25

2.2 BÀI TẬP XÂU

2.2.1 Các kiến thức cơ bản về xâu

Xâu là dãy các kí tự trong bảng 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 gọi là xâu rỗng

a, Khai báo

Khi khai báo biến xâu cần sử dụng thư viện string

Biến kiểu xâu có thể khai báo như sau:

string <tên biến xâu>[độ đài lớn nhất]

Ví dụ

string hoten[50];

Trong mô tả xâu có thể bỏ qua phần khai báo độ dài, chẳng hạn:

string diachi;

Khi đó độ dài lớn nhất của xâu sẽ nhận giá trị ngầm định là 255

Lưu ý: Chỉ số xâu bắt đầu từ 0

Giả sử bạn muốn nhập xâu “Truong THPT PDL” cho xâu s

cin>>s; chỉ nhận được xâu “Truong”

getline(cin,s); nhận toàn bộ xâu “Truong THPT PDL”

* Các phép so sánh bằng (= =), khác (<>), nhỏ hơn (<), lớn hơn (>), nhỏ hơn hoặc bằng (<=), lớn hơn hoặc bằng (>=)

* Để xử lí các xâu có thể sử dụng các thủ tục và hàm chuẩn dưới đây:

- Hàm <tên biến xâu>.erase(<vị trí bắt đầu>, <số ký tự xóa>): Xóa <số ký tự xóa> của chuỗi <tên biến xâu> kể từ <vị trí bắt đầu>; nếu không quy định giá trị <số ký

tự xóa> thì tất cả các ký tự của <tên biến xâu> từ <vị trí bắt đầu> trở đi sẽ bị xóa

- Hàm <tên biến xâu>.insert(<vị trí bắt đầu>, <xâu chèn>): Chèn <xâu chèn> vào xâu <tên biến xâu> bắt đầu ở vị trí <vị trí bắt đầu>

- Hàm <tên biến xâu>.substr(<vị trí bắt đầu>, n): Tạo xâu gồm n kí tự liên tiếp bắt

đầu từ vị trí <vị trí bắt đầu> của xâu <tên biến xâu>

- Hàm length(s) cho giá trị là độ dài xâu s

Ngày đăng: 27/07/2023, 07:38

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w