Tải bản đầy đủ (.pdf) (43 trang)

SKKN xử lý mảng một chiều trên ngôn ngữ lập trình python và c++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (768.56 KB, 43 trang )

Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++

PHẦN I. ĐẶT VẤN ĐỀ
I. LÝ DO CHỌN ĐỀ TÀI:
Trong thời đại 4.0 - xu hướng kết hợp giữa các hệ thống ảo và thực thể, vạn
vật kết nối internet - đang thách thức ý niệm của chúng ta về vai trò thực sự của
con người, trong đó có người thầy.Vai trị của người thầy trong thế kỉ XXI trở nên
phức tạp ở một thế giới thay đổi nhanh chóng, nơi mà tri thức hầu như vơ tận. Dạy
học phân hóa là quan điểm phải được quan tâm đặc biệt. Người thầy phải quan tâm
đến từng người, nhu cầu họ rất khác nhau trong lớp học khơng đồng nhất, nhiệm
vụ chính của người thầy là tạo mơi trường học tập, tạo điều kiện để họ có cơ hội
học tập theo phương pháp tích cực và sáng tạo.
Vai trị của người thầy sẽ là gì để giúp cho học sinh điều chỉnh những thay
đổi xã hội? Người thầy phải làm cho học sinh chủ động, hào hứng đón nhận như
một cơ hội đồng thời cũng là thách thức phải vượt qua. Người thầy xác định vấn đề
cần quan tâm, đặc biệt là đối tượng người học ngày nay rất khác trước, với động cơ
tình cảm và sự quan tâm rộng hơn về cả không gian lẫn thời gian. Nếu trước đây
học để tham gia một vài lĩnh vực thì ngày nay, người học quan tâm đến rất nhiều
lĩnh vực nếu khơng nói là tất cả -chính sự khôn ngoan này giúp họ tồn tại trong xã
hội thay đổi. Do vậy, phải có cách tiếp cận khác, khơng giống cách cũ.
Là một giáo viên Tin học, tôi nhận thấy chương trình giáo dục phổ thơng
mới đã thay đổi để đáp ứng nhu cầu của thời đại mới. Giáo viên Tin học ngồi việc
dạy kiến thức phổ thơng về tin học ứng dụng thì việc dạy học lập trình cũng hết
sức quan trọng; trách nhiệm của người giáo viên Tin học là giúp học sinh hiểu hơn
về sự hoạt động của máy tính, am hiểu về khoa học kỹ thuật, góp phần định hướng
những học sinh có năng lực và đam mê Tin học vào đội ngũ nhân lực CNTT chất
lượng cao của đất nước.
Tuy nhiên, theo tôi thấy hiện nay dạy lập trình chủ yếu người ta dùng ngơn
ngữ lập trình C++ và gần đây là ngơn ngữ lập trình Python mà hầu hết giáo viên
phổ thơng đang dạy học trên ngơn ngữ lập trình Pascal. Trong q trình tự học
ngơn ngữ lập trình C++ và Python , tơi nhận thấy những khó khăn gặp phải khi tiếp


cận với ngơn ngữ này. Chính vì vậy, để giúp giáo viên và học sinh tiếp cận được
ngôn ngữ Python và C++ một cách dễ dàng nhất. Tôi xin đưa ra SKKN “Chuyên
đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++”.
II. MỤC ĐÍCH NGHIÊN CỨU
- Trong phạm vi đề tài của mình, tơi muốn nghiên cứu, tìm tịi về cách sử dụng
ngơn ngữ lập trình C++ và Python để giải quyết các bài toán về dãy số trong tin
học. Nhằm giúp học sinh:
+ Biết sử dụng mảng một chiều một cách linh hoạt trên C++ và Python
1


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
+ Hiểu và vận dụng linh hoạt một số hàm có sãn trong ngơn ngữ lập trình.
+ Giúp học sinh tiếp cận dễ dàng hơn với C++ và Python
- Cũng qua đề tài, tôi muốn cùng đồng nghiệp trao đổi, trau dồi chun mơn nhằm
góp phần nâng cao trình độ chun mơn nghiệp vụ và khả năng mở rộng kiến thức.
III. ĐỐI TƯỢNG, THỜI GIAN NGHIÊN CỨU:
* Đối tượng nghiên cứu:
Nghiên cứu về mảng một chiều trong ngôn ngữ Python và C++ cho học sinh
từ trung bình trở lên.
* Thời gian nghiên cứu:
Sáng kiến được thực hiện từ tháng 8 năm 2020 đến tháng 3 năm 2021.
IV. PHƯƠNG PHÁP VÀ NHIỆM VỤ NGHIÊN CỨU:
* Phương pháp nghiên cứu:
Phương pháp Đặt vấn đề - giải quyết vấn đề
Phương pháp phân tích tổng hợp.
Phương pháp thực nghiệm, so sánh đối chiếu.
* Nhiệm vụ nghiên cứu:
- Giáo viên hoàn thành nội dung đề tài, báo cáo thành chuyên đề trong các
lần họp tổ chuyên môn để cùng đồng nghiệp bổ sung những thiếu sót của đề tài.

Giao lưu học hỏi, trao đổi kinh nghiệm với các đồng môn ở các trường lân cận.
- Thực nghiệm dạy học: Ở trường THPT tôi đang công tác từ năm học 20202021 đánh giá hiệu quả của đề tài.
- Hướng dẫn học sinh nghiêm túc nghiên cứu và thực hiện đề tài trong quá
trình học tập nhằm nâng cao và phát triển khả năng lập trình của bản thân.

2


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
PHẦN II. NỘI DUNG NGHIÊN CỨU
I. CƠ SỞ LÝ LUẬN:
Để giải quyết các bài toán về mảng một cách tối ưu, học sinh phải biết khái
niệm về mảng một chiều, các thuật tốn thơng dụng trên mảng; Học sinh phải có
kỹ năng nhận dạng bài tốn khi được phát biểu dưới nhiều dạng khác nhau và lựa
chọn thuật tốn thích hợp để giải quyết.
II. THỰC TRẠNG CỦA VẤN ĐỀ:
Môn Tin học khá mới, việc tổ chức thi HSG tỉnh cho các trường THPT
không chuyên khoảng mười lăm năm trở lại đây. Nên đối với giáo viên việc tìm
tịi, học tập, nghiên cứu để nâng cao trình độ gặp rất nhiều khó khăn. Hầu hết, đội
ngũ giáo viên của các trường không chuyên đều quen với ngôn ngữ lập trình
Pascal, chưa mạnh dạn chuyển sang dạy ngơn ngữ C + + và Python bởi vì khơng
quen và chương trình mắc lỗi khơng biết khắc phục. Vì vậy, trong q trình tập
huấn về ngơn ngữ lập trình C++ của sở Giáo dục Nghệ An, tự nghiên cứu về ngơn
ngữ lập trình Python tơi ln trăn trở và tích cực trao đổi kinh nghiệm, thảo luận về
nội dung, phương pháp, kỹ thuật với đồng nghiệp cùng trường và một số ở trường
khác trong khu vực. Chúng tơi đều có nhận xét về những khó khăn khi dạy học và
bồi dưỡng học sinh giỏi bộ môn Tin học như sau:
- Tài liệu viết về C++, Python rất nhiều nhưng khi đi vào giải quyết những
bài toán cụ thể thường hay mắc lỗi và không biết cách xử lý.
- Cú pháp câu lệnh và hàm trong C++ , Python khác so với Pascal.

- Chưa hiểu hết các thư viện trong C++, Python.
- Tài liệu về bộ môn Tin học để bồi dưỡng HSG khơng nhiều, đặc biệt
chương trình chuẩn về C++ , Python rất hiếm cho nên việc tìm kiếm tài liệu dạy
học phù hợp trình độ học sinh rất vất vả.
- Hệ thống bài tập ít ỏi, rời rạc nên việc tổng hợp bài tập và đề thi thành các
dạng bài tập phục vụ dạy học mất rất nhiều thời gian.
- Các đề thi Tin học thường khơng có đáp án. Giáo viên và học sinh muốn
trao đổi với các bạn trường chun thì gặp trở ngại về ngơn ngữ lập trình. Thực tế,
qua các kỳ thi HSG tỉnh Nghệ An đã có rất nhiều học sinh, giáo viên khó hiểu khi
bài thi làm đúng nhưng điểm thi vẫn rất thấp và sự khó hiểu đó vẫn cứ kéo dài do
đáp án tham khảo và test chấm không được công bố.
III. GIẢI QUYẾT VẤN ĐỀ:
1. Khái quát về ngôn ngữ lập trình Python và C++
1.1. Khái qt về ngơn ngữ lập trình Python
Hiện nay với những đặc điểm, tính năng vượt trội thì đa phần lập trình viên
lựa chọn Python là ngơn ngữ lập trình. Vậy Python là gì? Là một ngôn ngữ lập
3


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
trình mã nguồn mở đa mục đích, một loại ngơn ngữ bậc cao, thơng dịch và hướng
đối. Điều gì đặc biệt ở Python ? Đó là cú pháp của python khá dễ hiểu, dễ học và
trong việc phát triển ứng dụng thì ngơn ngữ này cũng rất linh hoạt. Python hỗ trợ
mẫu đa lập trình, bao gồm lập trình hướng đối tượng, lập trình hàm và mệnh lệnh
hoặc là các phong cách lập trình theo thủ tục.
Python không chỉ làm việc trên lĩnh vực đặc biệt như lập trình web mà cịn
sử dụng với web, 3D CAD,.. Và nó là ngơn ngữ lập trình động nên bạn không cần
sử dụng các kiểu dữ liệu khai báo. Python giúp cho việc phát triển ứng dụng và
debug trở nên nhanh chóng hơn.
Là một ngơn ngữ có hình thức sáng sủa, cấu trúc rõ ràng, cú pháp ngắn gọn

Python với tốc độ xử lý cực nhanh, python có thể tạo ra những chương trình
từ những script siêu nhỏ tới những phần mềm cực lớn như Biender 3D.
1.2 . Khái qt về ngơn ngữ lập trình C++
C ++ là một ngơn ngữ lập trình đa năng thường tham gia vào việc phát triển
các hệ thống lớn và phức tạp. Ngôn ngữ này là ngơn ngữ di động nhất trong tồn bộ
vịng trịn của các ngơn ngữ lập trình.
Khi so sánh Python và C ++, Python tuân theo quy tắc “viết một lần, chạy ở
bất kỳ đâu”, có nghĩa là một mã sẽ hoạt động trên tất cả các hệ điều hành. Tuy
nhiên, mã C ++ cần được biên dịch trên mỗi hệ điều hành trước khi nó có thể thực
thi.
Sự khác biệt lớn nhất trong cuộc thảo luận về Python với C ++ là mã nguồn
C ++ cần trở thành mã máy. Python tuân theo một chiến thuật khác khi nó được
diễn giải. Tuy nhiên, việc giải mã thường chậm hơn so với chạy mã trực tiếp trên
phần cứng.
2. Kiểu mảng một chiều trên ngơn ngữ lập trình Python
Trong Python, mảng là một loại dữ liệu đặc biệt, nó gồm nhiều phần tử và
mỗi phần tử là một dữ liệu riêng biệt. Mảng một chiều còn gọi là List hoặc danh
sách
2.1. Khái niệm List một chiều
List một chiều là dãy hữu hạn các phần tử cùng kiểu. List được đặt tên và
mỗi phần tử của nó có một chỉ số. Để mô tả List một chiều cần xác định kiểu của
các phần tử và cách đánh số các phần tử của nó.
Để người lập trình có thể xây dựng và sử dụng kiểu List một chiều, các ngơn ngữ
lập trình có quy tắc cách thức cho phép xác định:
• Tên kiểu List một chiều;
• Số lượng phần tử;
4


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++

• Kiểu dữ liệu của phần tử;
• Cách khai báo biến;
• Cách tham chiếu đến phần tử.
2.2. Khai báo kiểu List
Tổng quát, khai báo biến List một chiều có dạng:
<tên biến> = [] # khai báo List rỗng
<tên biến> = [<giá trị 1>, <giá trị 2>,<giá trị 3>,<giá trị 4>,…,<giá trị n>] # khai
báo List có giá trị
Trong đó:
<tên biến>: là tên do người lập trình đặt, tuân theo quy tắc đặt tên;
[<giá trị 1>, <giá trị 2>,<giá trị 3>,<giá trị 4>,…,<giá trị n>] : là một dãy giá trị
được viết cách nhau bởi dấu phẩy và bao hàm trong dấu ngoặc vuông [].
<tên biến> = [0]*10 # khai báo List có 10 giá trị bằng 0
<tên biến> = [0.5]*10 # khai báo List có 10 giá trị bằng 0.5
Ví dụ:
>>> A=[] #Tạo list rỗng
>>> B=[1,2,6,7,8] # Tạo List số nguyên
>>> C=[2.3,5.6,7.8] #Tạo List số thực
>>> D=[1,"ONE",4,5.7,"TWO"] #Tạo List hỗn hợp
*) List có khả năng chứa các kiểu dữ liệu khác nhau bao gồm cả chính nó.
Ví dụ 1:
>>> x=20; y="Nghệ An";z=True;
>>> E=[x,y,z,3.14,90]
>>> E
[20, 'Nghệ An', True, 3.14, 90]
Ví dụ 2:
>>> A=[1,2,[24,56,7],"Nghệ An"]
>>> A
[1, 2, [24, 56, 7], 'Nghệ An']
*) Tạo List có giá trị liên tục gồm n phần tử bắt đầu từ 0 bằng cấu trúc lặp for

Ví dụ:
>>> A=[i for i in range(20)] # Tạo List có giá trị liên tục từ 0 đến 19
>>> A
5


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
*) Tạo list dựa vào công thức chung
Ví dụ 1: Cơng thức chung tạo list [n,n*2,n*3] và n nhận các giá trị 1,2, 3
>>> A=[[n,n*2,n*3] for n in range(1,4)]
>>> A
[[1, 2, 3], [2, 4, 6], [3, 6, 9]]
Ví dụ 2: Cơng thức chung tạo list [n,n*2,n*3] và n nhận các giá trị 0,1, 2
>>> A=[[n,n*2,n*3] for n in range(3)]
>>> A
[[0, 0, 0], [1, 2, 3], [2, 4, 6]]
>>>
Như vậy:
- List giới hạn bởi cặp ngoặc vuông []
- Các phần tử cách nhau bởi dấu phẩy
- List có khả năng chứa các kiểu dữ liệu khác nhau bao gồm cả chính nó.
2.3. Cách tham chiếu đến phần tử.
Tham chiếu tới phần tử của List một chiều được xác định bởi tên List cùng với
chỉ số, được viết trong cặp ngoặc [ và ].
• Cách truy cập phần tử mảng của danh sách A với chỉ số k như sau: A[k]
Ví dụ 1: Các phần tử của một danh sách có thể có các kiểu dữ liệu khác nhau
>>>A=[5, 'Nghệ An', True, 3.14]
>>> A[0]
5

>>> A[2]
True
>>> A[1]
'Nghệ An'
>>> A[-1] # Chỉ số -1 đưa ra giá trị phần tử cuối cùng của danh sách
3.14

6


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
Ví dụ 2: A=['H', 'Ọ', 'C', ' ', 'P', 'Y', 'T', 'H', 'O', 'N']
Mảng A
H

C
P

Y

T

H

O

N

Chỉ số dương
Chỉ số âm


0

1

2

3

4

5

6

7

8

9

-10

-9

-8

-7

-6


-5

-4

-3

-2

-1

2.4. Nhập và xuất dữ liệu cho mảng một chiều
• Đối với nhập dữ liệu chúng ta có thể dùng lệnh append hoặc phép cộng(+)
• Đối với in mảng chúng ta dùng lệnh: print(<Biến mảng>
Ví dụ:
Cách 1: Sử dụng phép(+)

7


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++

Cách 2: Dùng hàm append

2.5. Các phép toán và phương thức của List
a. Các phép toán
*) Phép cộng (+): Phép + dùng để ghép nối tự nhiên nhiều List với nhau.
Ví dụ:
>>> A=[1,3,5]
>>> B=[4,"Python",10,"Nghệ An"]

>>> C=A+B
>>> C
[1, 3, 5, 4, 'Python', 10, 'Nghệ An']
*) Phép nhân (*): Phép nhân List với số tự nhiên chính là phép cộng nhiều lần một
danh sách.
Ví dụ:
>>> A=[1,3,5]
>>> B=A*3
>>> B
[1, 3, 5, 1, 3, 5, 1, 3, 5]
>>> G=[6]*10
>>> G
8


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
[6, 6, 6, 6, 6, 6, 6, 6, 6, 6]
b. Một số hàm thường dùng trong List
*) Hàm tính độ dài danh sách
Cú pháp: len(<tên biến>)
Ý nghĩa: Cho giá trị là kích thước của mảng
Ví dụ:
>>> A=[4,5,6,4,3,5,6,7,8,9]
>>> len(A)
10
*) Hàm bổ sung phần tử append:
Cú pháp: <tên biến>.append(<giá trị>)
Trong đó: <giá trị> có thể là hằng số, biến hoặc là một List…
Ý nghĩa:Bổ sung <giá trị> vào cuối danh sách <tên biến> như một phần tử
Ví dụ:

Với <giá trị> là hằng số
>>> A=[1, 2, 3, "Việt Nam",99]
>>> A.append(100)
>>> A
[1, 2, 3, 'Việt Nam', 99, 100]
+) Với <giá trị> là một List
>>> A=[1,2,3,"Việt Nam"]
>>> B=[4,5,6]
>>> A.append(B)
>>> A
[1, 2, 3, 'Việt Nam', [4, 5, 6]]
*) Hàm insert:
Cú pháp: <tên biến>.insert(<vị trí>,<giá trị>)
Ý nghĩa: chèn <giá trị> vào danh sách ở trước <vị trí>
Ví dụ:
>>> A=[1, 2, 3, 'Việt Nam', 99, 100]
>>> A.insert(3,500)
>>> A
9


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
[1, 2, 3, 500, 'Việt Nam', 99, 100]
*) Xóa một giá trị đầu tiên có trong List
Cú pháp: <tên biến>.remove(<giá trị>)
Ví dụ: Xóa giá trị 22 đầu tiên trong A
>>> A=[1, 22, 3,22, 99, 100]
>>> A.remove(22)
[1, 3, 22, 99, 100]
*) Hàm del:

Cú pháp: del <tên biến>[vị trí]
Ý nghĩa: Xóa phần tử tại [vị trí] bất kỳ trong List
Ví dụ 1: Xóa phần tử có chỉ số 4 trong A
A = [2,5,6,8,100000,11,9,12,45,32]
print ("Danh sách trước khi xóa la ", A)
del A[4]
print ("Danh sách sau khi xóa là ", A)
Kết quả: Danh sách sau khi xóa là [2, 5, 6, 8, 11, 9, 12, 45, 32]
Chú ý:
Nếu như muốn xóa nhiều vị trí ta dùng câu lệnh <giá trị đầu> : cuối>
Ví dụ 2: Xóa phần tử 1 và 2 khỏi danh sách A
A = [2,5,6,8,9,11,9,12,45,32]
print ("Danh sách trước khi xóa la ", A)
del A[1:3]
print ("Danh sách sau khi xóa là ", A)
Kết quả: Danh sách sau khi xóa là [2, 8, 9, 11, 9, 12, 45, 32]
*) Hàm đảo các phần tử trong List
Cú pháp: <tên biến>.reverse()
Ý nghĩa: Hàm cho giá trị đảo ngược của mảng đã cho
Ví dụ: Cho danh sách A, in ra danh sách đảo ngược của A
A = [1,2,3,4,5,6,7,8,9]
print ("Danh sách trước khi đảo là ", A)
A.reverse()
10


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
print ("Danh sách sau khi đảo là ", A)
Kết quả:

Danh sách trước khi đảo là [1, 2, 3, 4, 5, 6, 7, 8, 9]
Danh sách sau khi đảo là [9, 8, 7, 6, 5, 4, 3, 2, 1]
*) Hàm sort:
Cú pháp: <tên biến>.sort()
Ý nghĩa: Sắp xếp lại danh sách theo thứ tự tăng dần của giá trị các phần tử.

Ví dụ:
*) Hàm count:
Cú pháp: <tên biến>.count(<giá trị>)
Ý nghĩa: đếm tần số xuất hiện <giá trị> trong danh sách
Ví dụ: Đếm tần số xuất hiện 6 trong mảng A

2.6 . Bài toán áp dụng
Bài toán 1: Viết chương trình thực hiện cơng việc sau:



Nhập từ bàn phím số tự nhiên N(1Nhập dãy A gồm N phần tử. Đưa ra dãy con B chứa các phần tử là nguyên
tố trong A.

*) Phân tích và ý tưởng giải quyết bài toán.
- Dùng hàm append để nhập danh sách A gồm N phần tử.
11


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
- Viết hàm kiểm tra nguyên tố rồi lọc sang danh sách B.
*) Chương trình tham khảo


Kết quả:
Dãy đã nhập là: [59, 1, 3, 8, 11]
Dãy nguyên tố là: [59, 3, 11]
Bài toán 2: Cho trước 2 dãy A,B. Dãy C được tạo ra bằng cách lần lượt lấy các
phần tử từ A,B và đưa vào C.
*)Phân tích và ý tưởng giải quyết bài tốn.
- Tìm kích thước nhỏ nhất p=min(len(A),len(B))
- Đổ cả 2 mảng vào với số phần tử là p
for k in range(p):
C.append(A[k])
C.append(B[k])
12


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
-Tìm phần cịn lại của mảng có kích thước lớn hơn đổ vào C.
*) Chương trình tham khảo

Kết quả: Dãy C là: [1, 14, 7, -7, 8, 9, 9, 8, 15, 56, 17, 6, 59]
Bài toán 3: Cho trước dãy A. Dãy B được thiết lập bằng cách tách các phần tử là
số (số nguyên hoặc số thực ) từ dãy A.
Ví dụ:
A= [ 1.2 , “ one ” , 0.15 , “ A ” , “B ”, “ C ” , 1 , 50 , 4.56 , “ C ” ].
Khi đó dãy B sẽ là :
B= [ 1.2 , 0 , 15 ,1 , 50 , 4.56 ]
*)Phân tích và ý tưởng giải quyết bài toán.
- Viết một hàm số với tham số đầu vào là dãy A và kết quả trả lại dãy B.Kiểm tra
nếu gặp phần tử giá trị số thì đưa vào B. Dùng hàm:
def tachso(A):
B=[]

for s in A:
if str(type(s))!="<class 'str'>":
B.append(s)
return B
13


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
*) Chương trình tham khảo

Kết quả: Dãy đã nhập là: [1, 1.3, 'mot', 2, 'one', 3, 'A', 5]
Dãy kết quả là: [1, 1.3, 2, 3, 5]
Bài toán 4: Viết các hàm số với đầu vào là dãy A ( bao gồm số và xâu kí tự ).
a. Tính tổng các phần tử là số trong dãy.
b. Đếm số các phần tử là xâu kí tự từ dãy A
c. Đưa ra kết quả là 2 dãy B, C. Dãy B bao gồm các phần tử là số của A, dãy
C bao gồm các phần tử là xâu kí tự của A
*)Phân tích và ý tưởng giải quyết bài tốn.
- Viết hàm tính tổng các phần tử số.
Kiểm tra điều kiện str(type(s))!="<class 'str'>" nếu đúng đó là phần tử số
tiến hành tính tổng sum. Xây dựng hàm tính tổng như sau:
def tinhtongcacso(A):
sum=0
for s in A:
if str(type(s))!="<class 'str'>":
sum=sum+s
return sum
- Viết hàm đếm phần tử là xâu
Nếu là phần tử xâu thì tăng biến dem lên 1 đơn vị bằng cách kiểm tra biểu
thức điều kiện str(type(s))=="<class 'str'>"

14


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
def demkytu(A):
dem=0
for s in A:
if str(type(s))=="<class 'str'>":
dem=dem++1
return dem
- Viết hàm tách phần tử số vào B và phần tử xâu vào C:
Kiểm tra điều kiện str(type(s))=="<class 'str'>" nếu đúng bổ sung vào C, ngược lại
bổ sung vào B.
def xuly(A):
B=[]
C=[]
for s in A:
if str(type(s))=="<class 'str'>":
C.append(s)
else:
B.append(s)
return B,C
*) Chương trình tham khảo

15


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++

Chương trình cho kết quả

Dãy đã nhập là: [1, 1.3, 'one', 'two', 7, 8, 'Nghệ An']
Tổng các số có trong A là: 17.3
Số phần tử là xâu kí tự của A là: 3
Dãy phần tử kiểu số của A là: [1, 1.3, 7, 8]
Dãy phần tử kiểu xâu của A là: ['one', 'two', 'Nghệ An']
3. Kiểu mảng một chiều trên ngơn ngữ lập trình C++
Chúng ta chỉ xét hai kiểu mảng thông dụng với nhiều ngôn ngữ lập trình là
kiểu mảng một chiều và kiểu mảng hai chiều.
3.1. Khái niệm mảng một chiều
Mảng một chiều là dãy hữu hạn các phần tử cùng kiểu. Mảng được đặt tên
và mỗi phần tử của nó có một chỉ số. Để mô tả mảng một chiều cần xác định kiểu
của các phần tử và cách đánh số các phần tử của nó.
Để người lập trình có thể xây dựng và sử dụng kiểu mảng một chiều, các ngôn
ngữ lập trình có quy tắc cách thức cho phép xác định:
• Tên kiểu mảng một chiều;
• Số lượng phần tử;
• Kiểu dữ liệu của phần tử;
• Cách khai báo biến;
• Cách tham chiếu đến phần tử.
16


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
3.2. Khai báo mảng một chiều
Tổng quát, khai báo biến mảng một chiều có dạng:
<kiểu dữ liệu> <tên biến mảng>[kích thước tối đa];
Ví dụ . Các khai báo kiểu mảng một chiều sau đây là hợp lệ:
float A[365]; Khai báo mảng A có 365 phần tử kiểu số thực có chỉ số từ 0 đến 364
int B[100]; Khai báo mảng B có 100 phần tử kiểu số nguyên có chỉ số từ 0 đến 99
3.3. Cách tham chiếu đến phần tử.

Tham chiếu tới phần tử của mảng một chiều được xác định bởi tên mảng cùng
với chỉ số, được viết trong cặp ngoặc [ và ].
Cú pháp: biến mảng[chỉ số]
• Cách truy cập phần tử mảng A với chỉ số k như sau: A[k]
Ví dụ 1:
Chỉ số phần tử →:
Mảng A →

0

1

2

3.5

7.0

6.8

3
7.5

4
6.0

5




364

9.5

- Tham chiếu tới phần tử thứ 5 của mảng A ta viết: A[5]
3.4. Nhập và xuất mảng một chiều trong C++
*) Nhập dữ liệu mảng một chiều trong C++:
- Nhập dữ liệu cho mảng A gồm n phần tử
Cách 1:
int i,n, a[1000];
cin>>n;
for (int i=1; i<=n;i++) cin>>a[i];
Cách 2:
int x,a[1000], n=0;
while (cin>>x)
{
n++;
a[n]=x;
}
*) Xuất dữ liệu mảng một chiều trong C++:
- Xuất dữ liệu cho mảng A gồm n phần tử
17


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
int i,n,a[1000];
for (int i=1; i<=n;i++) cout<Ví dụ: Chương trình nhập và in dãy A gồm n phần tử như sau:

3.5. Một số bài toán áp dụng

Bài toán 1: Bài tập 5 trang 79 sách giáo khoa Tin 11.
Viết chương trình nhập từ bàn phím số nguyên dương N(N<=100) và dãy A
gồm N số nguyên A1, A2, . . AN có giá trị tuyệt đối khơng lớn hơn 1000. Hãy cho biết
A có phải là một cấp số cộng hay không và thông báo kết quả ra màn hình.
Dữ liệu vào:
- Dịng 1 chứa số ngun dương N (N < 100).
- Dòng 2 chứa N số nguyên a1, ..., an (|ai| < 1000).
Dữ liệu ra: - Một dịng duy nhất ghi YES hoặc NO
Ví dụ:
Dữ liệu vào
10

Dữ liệu ra
YES

1 3 5 7 9 11 13 15 17 19
*) Phân tích và ý tưởng giải quyết bài tốn.
- Tính cơng sai d=A[2]-A[1]
- Kiểm tra điều kiện (d==A[i+1]-A[i]) nếu đúng thì biến kt=true cịn ngược lại
kt=false. Dùng đoạn lệnh:
for(i=1;i<=n-1;i++)
18


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
if(d != A[i+1]-A[i]) kt = false;
if(kt) cout<<"YES";
else cout<<"NO";
*) Chương trình tham khảo:
#include<bits/stdc++.h>

using namespace std;
int n,A[100];
void doctep()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>A[i];
}
void xuly()
{
int i,d; bool kt= true;
d = A[2]-A[1];
for(i=1;i<=n-1;i++)
if(d != A[i+1]-A[i]) kt = false;
if(kt) cout<<"YES";
else cout<<"NO";
}
int main()
{
doctep();
xuly();
}
Bài toán 2: LÂP TRÌNH
(Đề thi HSG lớp 12 - tỉnh Nghệ An – Năm học 2013 -2014)
Trong cuộc thi lập trình có N bài thi giải đúng yêu cầu đặt ra. Ban tổ chức
quyết định trao phần thưởng đặc biệt cho bài thi tốt nhất, đó là bài thi có thời gian
chạy chương trình ít nhất. Cho biết bài thi thứ i (1< i < N) có thời gian chạy là một
số nguyên ai (tính theo đơn vị centisecond, 1centisecond = 1/100 giây).
19



Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
Yêu cầu: Hãy cho biết thời gian của bài thi được trao thưởng và có bao nhiêu bài
thi được trao thưởng.
Dữ liệu vào:
- Dòng 1 chứa số nguyên dương N (N < 100).
- Dòng 2 chứa N số nguyên a1, ..., an (0 < ai < 100).
Dữ liệu ra:
- Dòng thứ nhất chứa một số nguyên là thời gian ít nhất tìm được
- Dịng thứ hai chứa một số nguyên là số bài thi cùng đạt thời gian ít nhất.
Ví dụ.
Dữ liệu vào

Dữ liệu ra

5

8

10 8 12 8 11

2

*) Phân tích và ý tưởng giải quyết bài tốn.
- Bản chất bài tốn là tìm giá trị nhỏ nhất và số lượng giá trị nhỏ nhất. Phạm
vi dữ liệu nhập vào nhỏ nên không cần coi trọng vấn đề cải tiến cải tiến chương
trình.
Ý tưởng giải quyết bài toán như sau:
Sử dụng kỹ thuật dùng mảng để đánh dấu.
- Sử dụng mảng A với kiểu chỉ số [0..100], khởi tạo toàn bộ các phần tử
bằng 0. Dùng lệnh: memset(a,0,sizeof(a));

- Đọc các giá trị từ tệp vào biến x. Tính tần suất xuất hiện số x bằng lệnh
{ cin>>x; a[x]++; }
- Duyệt các chỉ số i của mảng từ nhỏ đến lớn, khi gặp phần tử đầu tiên khác
0 thì kết thúc việc duyệt. Lúc đó, chỉ số i chính là thời gian ngắn nhất cần tìm, a[i]
chính là số lượng bài có thời gian ngắn nhất.
*) Chương trình tham khảo:
#include<bits/stdc++.h>
using namespace std;
long i,n,x,a[10000];
void doc()
{
cin>>n;
memset(a,0,sizeof(a));
20


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
for(i=0;i{ cin>>x; a[x]++;}
}
void xuly()
{
for(i=0;i<=10000;i++)
if (a[i]>0)
{
cout<<"So nho nhat la: "<cout<<"So lan xuat hien la:"<break;
}
}

int main()
{
doc(); xuly();
}
Bài toán 3: DÃY NGUYÊN TỐ
(Đề thi HSG Lớp 11 Tỉnh Nghệ An năm học 2014 -2015)
Cho số tự nhiên k và dãy A gồm N (N < 104) số tự nhiên khơng vượt q
32000.
u cầu: Tìm k số ngun tố nhỏ nhất khác nhau xuất hiện trong dãy A.
Dữ liệu vào:
• Dòng đầu tiên chứa hai số tự nhiên N và k (1 < k < N).
• N dịng tiếp theo, mỗi dòng chứa một số tự nhiên là một phần tử của dãy A.
Dữ liệu ra: Đưa ra trên cùng một dịng k số ngun tố tìm được theo thứ tự tăng
dần, các số cách nhau ít nhất một ký tự trống.
Lưu ý: Dữ liệu vào đảm bảo ln tìm được k số nguyên tố thỏa mãn.
Ví dụ:
Dữ liệu vào

Dữ liệu ra

10 3

3 13 17

12 13 6 17 9 3 12 42 59 20
21


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
*) Phân tích và ý tưởng giải quyết bài toán:

Sử dụng mảng A với kiểu chỉ số là [0..3200], khởi tạo toàn bộ các phần tử
bằng 0. Dùng lệnh: memset(a,0,sizeof(a));
• Đọc các giá trị từ tệp vào biến x đánh dấu sự có mặt vào mảng a[x]=1 để loại
bỏ sự trùng lặp. Sử dụng đoạn lệnh:
for(i=0;i{
cin>>x; a[x]=1;
}
• Duyệt mảng A từ đầu trở đi, kiểm tra tính ngun tố của các chỉ số có giá trị
bằng 1 để tìm k số nguyên tố đầu tiên.
for(i=2;i<=32000;i++)
if ((a[i] >= 1) and ngto(i))
{
cout<dem=dem+1;
if (dem==k)
break;}
Khi dùng mảng để đánh dấu sự xuất hiện không lặp lại của các phần tử. Do
đó nó có một số ưu điểm: thứ nhất không cần dùng thủ tục sắp xếp, thứ hai loại bỏ
được sự trùng lặp của các số nên hạn chế được số lần gọi hàm kiểm tra nguyên tố.
*) Chương trình tham khảo:
#include<bits/stdc++.h>
using namespace std;
long i,n,x,k,a[10000];
void doc()
{ memset(a,0,sizeof(a));
cin>>n>>k;
for(i=0;i{ cin>>x; a[x]=1;}
}

bool ngto(int n)
{ int k,i;
if ((n==2) or (n==3)) return true;
22


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
if ((n<2) or (n%2 ==0) or (n%3 ==0)) return false;
for(i=2;i<=int(sqrt(n));i++)
if (n%i==0) return false;
return true;
}
void xuly()
{ int i,dem;
{ dem=0;
for(i=2;i<=32000;i++)
if ((a[i] >= 1) and ngto(i))
{ cout<dem=dem+1;
if (dem==k) break;}
}
}
int main()
{
doc(); xuly();
}
Bài toán 4: Dãy con bằng nhau
Cho dãy A gồm N (N < 103) số tự nhiên không vượt quá 32000.
Yêu cầu: Tìm dãy con bằng nhau dài nhất xuất hiện trong dãy A.
Dữ liệu vào:

- Dòng đầu tiên chứa một số tự nhiên N (N < 106)
- N dòng tiếp theo, mỗi dòng chứa một số tự nhiên là một phần tử của dãy A.
Dữ liệu ra: - Dòng 1: Ghi độ dài dãy con dài nhất.
- Dịng 2: Ghi dãy con bằng nhau dài nhất
Ví dụ:

Dữ liệu vào

Dữ liệu ra

10

4

5552222333

2222
23


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
*) Phân tích và ý tưởng giải quyết bài toán:
- Duyệt mảng A từ đầu trở đi, kiểm tra điều kiện a[i]==a[i+1] thỏa mãn thì tăng
biến đếm tăng 1 đơn vị.Nếu không thỏa mãn, kiểm tra maxd có độ dài lớn nhất và lưu vị trí để đánh dấu đoạn con. Ta dùng đoạn lệnh sau;
for(i=1;i<=n;i++)
{
if(a[i]==a[i+1]) dem++;
else
{

if(maxd{
maxd=dem;
luuvt=i;
}
dem=1;
}
}
*) Chương trình tham khảo:
#include<bits/stdc++.h>
using namespace std;
int a[1000];
int n,i,j;
void nhap()
{
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
}
void xuly()
{
int dem=1,luuvt,maxd=0;
for(i=1;i<=n;i++)
{ if(a[i]==a[i+1]) dem++;
24


Chuyên đề xử lý mảng một chiều trên ngôn ngữ lập trình Python và C++
else
{ if(maxd{ maxd=dem;luuvt=i;}

dem=1;
}
}
cout<for(i=luuvt-maxd+1;i<=luuvt;i++) cout<}
int main()
{
nhap() ; xuly();
}
4. Mỗi liên hệ của xử lý mảng trong Python và C++
4.1. So sánh C++ và Python
Python tương đối dễ đọc, dễ sử dụng: Python có cấu trúc dễ đọc hơn C++. Với
Python ta sẽ tìm thấy hứng thú khi làm việc, bởi nó cung cấp cho chúng ta giải
pháp chữ không đơn thuần là những cú pháp khô khan cứng nhắc. Trong khi với
C++ cấu trúc của nó phức tạp hơn so với lập trình Python. Điều này cũng là điều
hiển nhiên, bởi lẽ với công nghệ đời cao luôn luôn tốt hơn đời thấp và dễ sử dụng
hơn. Với Python, bạn có thể thiết kế trang web giới thiệu với thời gian chỉ bằng 1/2
so với ngôn ngữ C++, một điều tuyệt vời mà mọi lập trình viên đều mong muốn
khi code chính là rút ngắn thời gian lập trình của mình.Ta có thể kết hợp các phần
code C++ vào trong code Python. Điều này sẽ giúp cho ứng dụng của bạn có nhiều
tính năng hơn
Lệnh trong C ++ cần dấu ngoặc nhọn và dấu chấm phẩy để hoạt động. Python
cung cấp một cách tiếp cận thân thiện hơn vì nó từ bỏ các quy tắc lập trình như
vậy. Nó chủ yếu phụ thuộc vào thụt đầu dịng lệnh. Tính năng này đề cập đến thực
tế là mỗi cấp độ thụt lề tạo ra cấu trúc của câu lệnh.
- Thay vì sử dụng dấu chấm phẩy, Python coi phần cuối của dòng là phần cuối của
câu lệnh. Nếu ta cần câu lệnh của mình tiếp tục trong vài dòng, nên sử dụng dấu
gạch chéo ngược (). Trong C ++, cần sử dụng dấu chấm phẩy để biểu thị phần cuối
của câu lệnh.

- Biểu thức Boolean khác nhau trong Python và C ++. C ++ trả về false hoặc true
dựa trên các giá trị số. Ví dụ: mọi thứ được gắn nhãn là 0 là sai và các giá trị số
25


×