Ngôn ngử này đã đáp ứng được các yêu cầu cơ bản trong chương trình tin học bậc THPT như cung cấp kiến thức cơ bản về thuật toán, cấu trúc dữ liệu, vận dụng kiến thức để giải được một số
Trang 3MỤC LỤC
A ĐẶT VẤN ĐỀ: ………2
I Lý do chọn đề tài: ………2
II Tính cấp thiết của đề tài: ………3
III Tính mới của đề tài: ……… 3
IV Khả năng ứng dụng và triển khai đề tài: ……… 3
V Đối tượng và phạm vi nghiên cứu: ………3
B NỘI DUNG: ……….4
I Cơ sở lý luận: ……… 4
II Thực trạng của vấn đề: ……… 5
III Giải quyết vấn đề: ………5
3.1 Dạng các bài toán tìm phần tử trong mảng: ……….5
3.2 Dạng các bài toán sắp xếp trong mảng một chiều: ……… 13
3.3 – Bài tập áp dụng:……….15
IV Đánh giá và kết quả thực hiện: ……… 18
C KẾT LUẬN: ……… 19
D TÀI LIỆU THAM KHẢO: ……… .20
Trang 4A ĐẶT VẤN ĐỀ
I Lý do chọn đề tài
Chúng ta đang từng bước triển khai Chương trình giáo dục phổ thông mới, trong đó môn Tin học ngày càng khẳng định vai trò chủ đạo trong việc trang bị cho người học khả năng tìm kiếm, tiếp nhận, mở rộng tri thức và sáng tạo trong thời đại cách mạng công nghiệp lần thứ tư và toàn cầu hóa
Pascal là ngôn ngữ lập trình thuộc dạng mệnh lệnh và thủ tục Ngôn ngử này
đã đáp ứng được các yêu cầu cơ bản trong chương trình tin học bậc THPT như cung cấp kiến thức cơ bản về thuật toán, cấu trúc dữ liệu, vận dụng kiến thức để giải được một số bài toán đơn giản trên máy tính bằng lập trình Vì vậy, những ưu điểm của ngôn ngữ này đối với tin học là rất lớn Tuy nhiên, Pascal cũng có rất nhiều nhược điểm như rườm rà, phức tạp và lỗi thời…
Những ngôn ngữ ra đời sau đã có những bước cải tiến, trong đó có ngôn ngữ lập trình C++ Đây là một ngôn ngữ lập trình hướng đối tượng, học các môn học về cấu trúc dữ liệu và giải thuật, mặc dù Pascal vẫn có những ưu điểm nhất định và vẫn có thể cung cấp kiến thức cơ bản cho những người học lập trình cơ bản nhưng mức độ vận dụng cũng như phát triển mở rộng của nó vẫn còn nhiều hạn chế Thay đổi Pascal bằng ngôn ngữ khác như C++ sẽ giúp bồi dưỡng và phát triển tư duy lập trình cũng như tư duy ứng dụng cho học sinh
Qua nhiều đợt tập huấn về ngôn ngữ lập trình C++ Từ năm học 2020-2021 tôi đã sử dụng và giảng dạy cho học sinh lớp 11 tại trường THPT Kim Liên bằng ngôn ngữ lập trình C++
Trong quá trình giảng dạy tôi đã dành nhiều thời gian để nghiên cứu, tìm kiếm, sưu tầm, phân loại được một số bài tập về mảng một chiều Nên tôi viết đề
tài “NHỮNG BÀI TẬP VÀ CODE XỬ LÝ MẢNG MỘT CHIỀU BẰNG
NNLT C ++ ” nhằm hệ thống hóa toàn bộ kiến thức về mảng một chiều để giúp giáo
viên và học sinh sử dụng trong việc dạy và học
Khi trao đổi với đồng nghiệp cùng trường và một số giáo viên ở trường khác trong khu vực, tôi nhận thấy còn nhiều giáo viên khi dạy về vấn đề mảng một chiều còn khó khăn khi đưa ra các bài tập và code viết bằng NNLT C++, cho nên tôi mạnh dạn trao đổi kinh nghiệm của mình Rất mong các đồng nghiệp nhận xét, góp ý để đề tài của tôi ngày càng hoàn thiện và ứng dụng rộng rãi trong thực tiễn Các bài toán và code mà tôi đưa ra chỉ nhằm giới thiệu cho học sinh cách viết chứ chưa hẳn là một phương án tối ưu để giải quyết bài toán cụ thể đó
II Tính cấp thiết của đề tài
Các bài toán về mảng là rất quan trọng khi bắt đầu làm quen với lập trình, nó thường gây ra khó khăn cho Học sinh khi mới bắt đầu làm quen và Giáo viên khi
Trang 5mới bắt đầu viết C++ Vì vậy việc đưa ra nhiều bài toán và code của nó là rất cần thiết
- Giúp học sinh khối 11 giải được một số bài toán đơn giản trên máy tính bằng cách vận dụng được các kiến thức về thuật toán, cấu trúc dữ liệu, và ngôn ngữ lập trình cụ thể (C++) để giải các bài toán liên quan đến mảng một chiều
- Đưa ra nội dung mục 1: Mảng một chiều, bài 11: Kiểu mảng, sách Tin học
11 để hướng dẫn học sinh nghiên cứu, thảo luận qua đó nắm vững kiến thức về kiểu mảng một chiều như khai báo, xử lý mảng một chiều … Từ đó hình thành ở học sinh khả năng phân tích, xử lý các vấn đề liên quan đến mảng một chiều trong việc lập trình giải các bài toán đơn giản
III Tính mới của đề tài
- Đưa ra được nhiều bài tập mới về mảng một chiều và code viết bằng NNLT C++
- Đưa ra một số định hướng để giải bài toán về mảng một chiều trong NNLT C++
IV Khả năng ứng dụng và triển khai đề tài
Đề tài có thể là tài liệu tham khảo bổ ích cho Học sinh, Giáo viên THPT đặc biệt là Học sinh khá, giỏi
V Đối tượng và phạm vi nghiên cứu
5.1 Đối tượng nghiên cứu
- Học sinh THPT
- Giáo viên trường THPT
- Các bài toán về mảng một chiều
5.2 Nội dung nghiên cứu
- Đề tài nghiên cứu hệ thống lớp các bài toán về mảng một chiều và code bằng ngôn ngữ lập trình c++
5.3 Phạm vi nghiên cứu
- Bám sát nội dung chương trình Tin học THPT
- Mở rộng phù hợp với nội dung thi Học sinh giỏi Tỉnh
6 Phương pháp và nhiệm vụ nghiên cứu
6.1 Phương pháp nghiên cứu
- Kiểm tra đôn đốc việc học tập của học sinh
- Kiểm tra thường xuyên, định kỳ
- Hướng dẫn nghiên cứu, thảo luận nội dung đưa ra
- Tham khảo các tài liệu về Ngôn ngữ lập trình C++
6.2 Nhiệm vụ nghiên cứu
Rút ra một số kinh nghiệm để giải các bài toán về mảng một chiều khi dạy tin học lớp 11 chương trình Tin học THPT
Trang 6B NỘI DUNG I– CƠ SỞ LÝ LUẬN:
Để giải quyết các bài toán về mảng một chiều một cách tối ưu, học sinh phải biết khái niệm mảng, các thuật toán thông dụng ; Học sinh phải có kỹ năng nhận dạng bài toán khi được phát biểu dưới nhiều dạng khác nhau và lựa chọn thuật toán thích hợp để giải quyết
For(int i=0; i<n; i++) cin>>a[i];
- Nhập khi chưa biết số lượng phần tử mảng
Trang 71.5 Một số dạng bài toán thường gặp:
III – GIẢI QUYẾT VẤN ĐỀ:
Giáo viên lần lượt đưa ra từng dạng bài toán, phân tích đặc điểm bài toán, ý tưởng thuật toán và ví dụ minh họa cho mỗi dạng Sau đó cho học sinh soạn thảo chương trình rồi tiến hành chấm bài tự động bằng phần mềm Themis của thầy Lê Minh Hoàng để thấy được hiệu quả của các phương pháp
3.1 Dạng các bài toán tìm phần tử trong mảng
*/ Các bài toán tìm giá trị nhỏ nhất, lớn nhất
Giá trị lẻ nhỏ nhất
Viết chương trình nhập vào n(0<n<=100) số nguyên In ra giá trị lẻ nhỏ nhất trong dãy số
Dữ liệu:
• Dòng đầu tiên ghi số nguyên không âm n
• Dòng 2 ghi n số nguyên dương cách nhau một dấu cách trống
Kết quả: Đưa ra giá trị lẻ nhỏ nhất của n số nguyên
Trang 8void nhap(long long a[],long long &n)
{ cin>>n;
for(long long i=0;i<n;i++)
cin>>a[i];
} int main() { long long a[nmax],n,i;
nhap(a,n);
long long minn;
for(i=0;i<n;i++)
{ if(a[i]%2==1)
{ minn=a[i];
break;
} } for(i=0;i<n;i++)
{ if(a[i]%2==1)
{ if(minn>a[i]) minn=a[i];
} } cout<<minn;
return 0;
Trang 9- Dòng đầu tiên ghi số nguyên không âm n;
- Dòng 2 ghi n ký tự cách nhau một dấu cách trống;
- Dòng 3 ghi số câu hỏi t;
- t dòng sau mỗi dòng ghi một số nguyên k;
Kết quả: Đưa ra t dòng, mỗi dòng ghi một số nguyên mink là giá trị nhỏ nhất
Trang 10- Dòng đầu tiên ghi số nguyên dương n (0<=n<=105)
- Dòng tiếp theo ghi n số nguyên ai
Trang 11void nhap(long long a[],long long &n)
Trang 12• Dòng đầu tiên ghi số nguyên không âm n
• Dòng 2 ghi n số nguyên cách nhau một dấu cách trống
Kết quả: Đưa ra số lượng giá trị lớn nhất của tổng bình
phương ai2+aj2,0<i<j<=nai2+aj2,0<i<j<=n trong dãy số
Trang 13long long maxk=-1e9; long long t;
for (long long i=0;i<n-1;i++)
Số lần xuất hiện nhiều nhất
Viết chương trình nhập vào n(0<n<=100) số nguyên ai(0<=ai<=100) In ra số lần xuất hiện của số xuất hiện nhiều nhất trong dãy số trên
Dữ liệu:
• Dòng đầu tiên ghi số nguyên không âm n
• Dòng 2 ghi n số nguyên dương cách nhau một dấu cách trống
Kết quả: Đưa ra số lần xuất hiện của số xuất hiện nhiều nhất trong dãy số trên
Ví dụ
• input
Trang 153.2 Dạng các bài toán sắp xếp trong mảng một chiều
Sắp xếp là quá trình bố trí lại các phần tử trong một tập hợp theo một trình tự nào
đó nhằm mục đích giúp quản lý và tìm kiếm các phần tử dễ dàng và nhanh chóng hơn
Sắp xếp dãy số theo thứ tự tăng dần hay giảm dần là 1 bài toán sắp xếp cơ bản đối với người học lập trình Bài toán sắp xếp dãy số là bài tập điển hình trong phần kiến thức về mảng 1 chiều
Khi làm bài tập mà có các cụm từ khóa sau:
• Sắp xếp dãy số tự nhiên tăng dần/giảm dần
• Sắp xếp mảng số thực tăng dần/ giảm dần
• Sắp xếp mảng 1 chiều các số tự nhiên tăng/giảm dần
Thì cả 3 đề bài này đều là bài toán sắp xếp dữ liệu trên mảng 1 chiều Khi nhắc tới
“dãy số” thì chúng tanghĩ ngay tới mảng 1 chiều
Code về sắp xếp mảng tăng dần, giảm dần
#include<bits/stdc++.h>
using namespace std;
// Ham doi vi tri hai phan tu
Trang 16void swap(int &a, int &b){
int temp =a;
a=b;
b=temp;
}
// Ham sap xep tang
void sortArrTang(int a[], int n){
// Ham sap xep giam
void sortArrGiam(int a[], int n){
// Ham nhap mang
void inputArr(int a[], int n){
for(int i=0;i<n;i++)
cin>>a[i];
}
Trang 17// Ham xuat mang
void printArr(int a[], int n){
while(n<=0); // Neu n<=0 thi nhap lai
int a[n]; // khai bao mang a co n phan tu
inputArr(a,n); // Goi ham nhap mang
sortArrTang(a, n); // Goi ham sap xep
cout<<"Mang sau khi sap xep tang dan: "<<endl;
printArr(a, n);
return 0;
}
3.3 – Bài tập áp dụng:
Để học sinh có năng lực phân tích, vận dụng các phương pháp Học sinh
cùng giáo viên giải một số bài tập
1 Xóa phần tử trong mảng
Yêu cầu: Viết chương trình nhập vào n số nguyên (0 < n <=10^6) Xóa số thứ k trong n vừa nhập In ra mảng sau khi xóa phần tử thứ k
Dữ liệu:
- Dòng đầu tiên ghi số nguyên không âm n, vị trí k cần xóa
- Dòng 2 ghi n số nguyên dương cách nhau một dấu cách trống
Kết quả: Đưa ra mảng các số nguyên sau khi xóa phần tử thứ k
Trang 18- Dòng 1 ghi số nguyên dương n (n<105)
- Dòng 2 ghi n số nguyên dương a1,a2, ,an là các số nguyên kiểu 64 - bit
- Dòng 3 ghi số nguyên dương k
Có n gói quà đặt trên bàn, được xếp theo thứ tự từ 1 đến n An sẽ mở các hộp quà
từ trái sang phải, còn Bình sẽ mở từ phải sang trái Biết rằng, tốc độ mở hộp quà của 2 anh em là như nhau, nhưng mỗi hộp quà có kích thược khác nhau, vì vậy thời gian mở mỗi hộp quà cũng khác nhau Ngay khi mở xong 1 hộp quà thì hai bạn sẽ ngay lập tức chuyển sang mở hộp quà tiếp theo, và không được bỏ dở hộp quà
Trang 19đang mở để mở hộp quà khác Nếu hai người cùng bắt đầu mở 1 hộp quà, Bình sẽ nhường cho An
Yêu cầu:
• Cho biết thời gian cần thiết để mở xong các hộp quà Các bạn hãy tính xem khi tất
cả các hộp quà đã mở xong, An và Bình, mỗi người mở được tất cả bao nhiêu hộp quà?
Dữ liệu:
• Dòng đầu tiên ghi số nguyên không âm n (1≤ n ≤ 105) – là số hộp quà có trên bàn
• Dòng 2 ghi n số nguyên t1, t2, …, tn cách nhau một dấu cách trống (1≤ ti ≤ 1000), với ti tính theo giây, là thời gian cần thiết để mở hộp quà thứ i, theo thứ tự từ trái sang phải
Dữ liệu:
- Dòng đầu tiên ghi số nguyên không âm n (n<=103)
- Dòng 2 ghi n số nguyên cách nhau một dấu cách trống
Kết quả: độ dài của dãy con liên tiếp đối xứng dài nhất
Trang 20Yêu cầu: Viết chương trình nhập vào một mảng và số nguyên X Đếm số lượng
cặp (i,j) sao cho 0<i<j<=n sao cho ai + aj = X
Dữ liệu:
- Dòng 1 ghi số nguyên dương n(n<=100) và X
- Dòng 2 ghi n số nguyên cách nhau một dấu cách trống
IV Đánh giá và kết quả thực hiện
Sau khi dạy học về mảng một chiều và các dạng bài tập về mảng nói trên, đã thu được một số kết quả sau:
* Hiệu quả chung:
Đối với học sinh đã có sự tiến bộ rõ rệt về các mặt sau:
- Năng lực phân tích, nhận dạng và lựa chọn được thuật toán thích hợp để giải quyết các bài toán về mảng một chiều
- Khả năng đánh giá độ phức tạp của thuật toán
- Khả năng tư duy thuật toán, phát huy tính sáng tạo
- Năng lực vận dụng các kiến thức đã học vào giải quyết vấn đề
- Trình bày thuật toán, diễn đạt chương trình rõ ràng, chuẩn xác
- Hăng say học tập, nghiên cứu, làm việc khoa học
- Đam mê việc học lập trình và rất yêu thích ngành CNTT
*/ Hiệu quả thực nghiệm sư phạm:
- Mức độ yêu thích bộ môn:
Hằng năm trước khi lập đội tuyển HSG, tôi thường khảo sát về mức độ yêu thích môn học và ước mong vào ngành CNTT của các em học sinh trong lớp A1 thì thấy tỷ lệ rất thấp Tôi phải tư vấn, động viên khuyến khích mới thành lập được đội tuyển chưa đầy chục em Trong đó còn một số em không yêu thích ngành CNTT Trong giai đoạn bồi dưỡng, tôi nhận thấy mức độ yêu thích tăng lên rõ rệt
và đến cuối đợt bồi dưỡng thì hầu hết các em đều hứng thú và mong muốn được học tập chuyên sâu để làm việc trong ngành CNTT, và rất nhiều học sinh cũ của tôi
Trang 21đã đạt được ước mong này Như vậy chúng ta thấy hiệu quả của việc triển khai đề tài, bồi dưỡng HSG đã tác động rất lớn đến sự say mê học tập bộ môn Tin học của các em học sinh
- Kết quả thi HSG tỉnh:
học sinh dự thi
Áp dụng SKKN
Kết Quả Ghi chú
2020 – 2021 Nguyễn Thị Hiền Lương Không Hỏng Khối 12
2021 - 2022 Nguyễn Phúc Hoàng Có Giải ba Khối 12
C KẾT LUẬN
I - KẾT LUẬN CHUNG:
Hiện nay hầu hết các lĩnh vực trong xã hội đã ứng dụng CNTT để giải quyết các công việc một cách nhanh chóng, chính xác và hiệu quả hơn Trong đó, các ngôn ngữ lập trình, các nhà lập trình chuyên nghiệp đó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
Bởi vậy, việc phát hiện những học sinh có năng lực, yêu thích lập trình và bồi dưỡng HSG Tin học trở thành một việc làm quan trọng và cấp thiết, góp phần phát triển đội ngũ lập trình viên, phát triển nền kinh tế, tri thức của đất nước
II - KHẢ NĂNG ỨNG DỤNG ĐỀ TÀI VÀO THỰC TIỄN:
Qua những kinh nghiệm đúc kết được trong quá trình nghiên cứu, đề tài của
tôi có khả năng ứng dụng vào thực tiễn, không chỉ ở trường tôi trong những năm học tới mà có thể ứng dụng ở các trường khác và cấp THCS
III - KHẢ NĂNG MỞ RỘNG CỦA ĐỀ TÀI:
Trên cơ sở của đề tài này, chúng ta hoàn toàn có thể ứng dụng vào giải quyết các bài toán có yêu cầu về việc duyệt đoạn con trên mảng một chiều Ngoài ra chúng ta có thể phát triển, mở rộng đề tài để giải quyết các bài toán phức tạp hơn, trên mảng 1 chiều, duyệt ma trận con trên mảng 2 chiều
IV - 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 nội dung khoa học, lựa chọn phương pháp phù hợp, thu hút, tạo sự hứng thú, tạo động cơ học tập cho học sinh với bộ môn Tin học
Rất mong nhận được sự góp ý, nhận xét của các đồng nghiệp để tôi có thêm kinh nghiệm và đạt kết quả tốt hơn trong công tác dạy học
Tôi xin chân thành cảm ơn!
Ngày 27 tháng 03 năm 2022
Trang 22NGƯỜI THỰC HIỆN
Nguyễn Quang Hùng
Trang 23TÀI LIỆU THAM KHẢO
[1] Hồ Sĩ Đàm (chủ biên), Đỗ Đức Đông, Lê Minh Hoàng, Nguyễn Thanh Hùng
(2009), Tài liệu giáo khoa chuyên tin, NXB Giáo dục
[2] Hồ Sĩ Đàm (chủ biên), Hồ Cẩm Hà, Trần Đỗ Hùng, Nguyễn Đức Nghĩa, Nguyễn Thanh Tùng, Ngô Ánh Tuyết (2008), Sách giáo khoa Tin học
11, NXB Giáo dục
[3] Trang Web laptrinhphothong.vn
[4] Trang web thptchuyenntucoder.vn