You are on page 1of 42

Chương 1

MỘT SỐ KHÁI NIỆM


VỀ LẬP TRÌNH & NGÔN NGỮ LẬP TRÌNH
§1. KHÁI NIỆM VỀ LẬP TRÌNH VÀ NGÔN NGỮ
LẬP TRÌNH

Câu hỏi: Em hãy cho biết các bước giải một bài toán trên máy tính? Liệt kê
Trả lời: có 5 bước:
1 xác định bài toán
2 Lựa chọn hoặc thiết kế thuật toán
3 Viết chương trình
4 Hiệu chỉnh
5 Viết tài liệu
Khái niệm lập trình: Lập trình là sử dụng một cấu trúc dữ liệu và các câu lệnh của một ngôn
ngữ lập trình cụ thể để mô tả dữ liệu và diễn đạt thuật toán.
Câu hỏi: Có bao nhiêu loại ngôn ngữ lập trình?
Trả lời: có 3 loại: ngôn ngữ máy, hợp ngữ và ngôn ngữ bậc cao.
 Chương trình viết bằng ngôn ngữ máy có thể nạp trực tiếp và thi hành ngay
 Chương trình viết bằng ngôn ngữ bậc cao nói chung không phụ thuộc loại máy, muốn thi
hành đượ thì nó phải được chuyển sang ngôn ngữ máy => Cần phải có chương trình dịch để
chuyển chương trình viết bằng ngôn ngữ bậc cao sang ngôn ngữ máy để có thể thi hành
được.Chương trình dịch có 2 loại: Biên dịch và thông dịch.
 Biên dịch: duyệt, kiểm tra, phát hiện lỗi và kiểm tra tính đúng đắn của các câu lệnh trong
chương trình nguồn. Dịch toàn bộ chương trình nguồn thành một chương trình đích để có thể
thực hiện trên máy và có thể lưu trữ để sử dụng lại khi cần.
 Thông dịch: dịch lần lượt từng câu lệnh và thực hiện ngay câu lệnh ấy.
Lưu ý: Python là một ngôn ngữ lập trình phiên dịch (interpreter Language), tức là không cần xây
dựng thành chương trình thực thi mà chạy trực tiếp. (Pascal và C++ phải xây dựng hoàn thành
file trước khi thực thi)
Python là gì?
Python là một ngôn ngữ lập trình bậc cao cho các mục đích lập trình đa năng, do Guido van
Rossum tạo ra và lần đầu ra mắt vào năm 1991. Python được thiết kế với ưu điểm mạnh là dễ
đọc, dễ học và dễ nhớ. Python là ngôn ngữ có hình thức rất sáng sủa, cấu trúc rõ ràng, thuận tiện
cho người mới học lập trình và là ngôn ngữ lập trình dễ học. được dùng rộng rãi trong phát
triển trí tuệ nhân tạo hoặc AI. Cấu trúc của Python còn cho phép người sử dụng viết mã lệnh với
số lần gõ phím tối thiểu. Vào tháng 7 năm 2018, Van Rossum đã từ chức lãnh đạo trong cộng
đồng ngôn ngữ Python sau 30 năm làm việc.

Python hoàn toàn tạo kiểu động và dùng cơ chế cấp phát bộ nhớ tự động; do vậy nó tương tự
như Perl, Ruby, Scheme, Smalltalk, và Tcl. Python được phát triển trong một dự án mã mở, do tổ
chức phi lợi nhuận Python Software Foundation quản lý.
Ban đầu, Python được phát triển để chạy trên nền Unix. Nhưng rồi theo thời gian, Python dần mở
rộng sang mọi hệ điều hành từ MS-DOS đến Mac OS, OS/2, Windows, Linux và các hệ điều
hành khác thuộc họ Unix. Mặc dù sự phát triển của Python có sự đóng góp của rất nhiều cá nhân,
nhưng Guido van Rossum hiện nay vẫn là tác giả chủ yếu của Python. Ông giữ vai trò chủ chốt
trong việc quyết định hướng phát triển của Python.
Python vừa hướng thủ tục (procedural-oriented), vừa hướng đối tượng (object -oriented) đồng
thời có thể nhúng vào ứng dụng như một giao tiếp kịch bản (scripting interface).
Thế mạnh của Python là rất gần gũi với ngôn ngữ tự nhiên (tiếng Anh), cấu trúc rõ ràng, dễ đọc,
dễ học. Python hiện nay là ngôn ngữ lập trình phổ biến rộng rãi ở châu Âu, châu Mỹ và được coi
như ngôn ngữ lập trình trường học.
Python được dùng để phát triển các ứng dụng web, game, khoa học dữ liệu (tính toán, phân tích,
khai thác dữ liệu), máy học và trí tuệ nhân tạo hoặc AI,..
Cài Python
Cài Pyscripter: download Pyscripter..
§2. CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH

I. Các thành phần cơ bản


Mỗi ngôn ngữ lập trình thường có 3 thành phần cơ bản là: bảng chữ cái, cú pháp và ngữ nghĩa.
a) Bảng chữ cái: là tập ký hiệu dùng để viết chương trình.
Python sử dụng các ký tự trong bảng mã Unicode. Tên biến và các đối tượng trong chương trình
có thể đặt bằng tiếng Việt có dấu.
b) Cú pháp: là bộ quy tắc dùng để viết chương trình.
c) Ngữ nghĩa: xác định ý nghĩa thao tác cần thực hiện ứng với tổ hợp ký tự dựa vào ngữ
cảnh của nó.
 Cú pháp cho biết cách viết chương trình hợp lệ, ngữ nghĩa xác định ý nghĩa của các tổ hợp
tự trong chương trình.
 Lỗi cú pháp được chương trình dịch phát hiện và thông báo cho người lập trình.
 Lỗi ngữ nghĩa được phát hiện khi chay chương trình
II. Một số khái niệm
a) Tên: tên các đối tượng được đặt bằng các ký tự thường (a-z), ký tự hoa (A-Z), chữ số (0-
9) và dấu gạch dưới. Tên không bắt đầu bằng chữ số, không dùng các ký tự đặc biệt như !, @,
#, .. và được phân biệt chữ hoa, chữ thường.
Tên trong Python không giới hạn độ dài và nên đặt tên có tính gợi nhớ
VD: đặt tên biến để lưu giá trị đếm số lần thực thi là: dem hay count
 Tên dành riêng: tên dành riêng được hiểu là Từ khóa (keyword). Được định nghĩa sắn để
sử dụng. chúng ta không thể dùng keyword để đặt tên biến, tên hàm hoặc bất kỳ đối tượng
nào trong chương trình.
Tất cả keword trong Python đều được viết thường, trừ 3 keyword: True, False, None.
Vd: True, False, await, else, import, pass, break, except, in, and, or, …
 Tên chuẩn: tên chuẩn là những tên đã được định nghĩa (tên module) thuộc thư viện chuẩn
của Python.
Vd: math (module các hàm toán học thông dụng như sin, cos, tan, sqr, sqrt, …)
b) Hằng và biến:
Biến: là đại lượng (đối tượng) được đặt tên, dùng để lưu trữ giá trị và giá trị có thể thay đổi trong
quá trình thực hiện chương trình.
Biến trong Python không cần khai báo trước, không nhất thiết phải khai báo kiểu dữ liệu. Khi đặt
tên và gán giá trị Python tự động nhận dạng và tùy biến theo kiểu dữ liệu được gán.
Hằng: là một loại biến đặc biệt, giá trị của hằng là không đổi trong suốt chương trình sau lần gán
giá trị đầu tiên. Tên hằng được viết hoàn toàn bằng CHỮ HOA và dấu gạch dưới (nếu cần).
c) Chú thích: chú thích trong Python có thể sử dụng các cách sau:
# dùng dấu thăng đầu dòng khi chú thích một dòng.
‘’’ dùng ba dấu nháy đơn hoặc nháy kép để chú thích trên nhiều dòng’’’
CHƯƠNG 2
CHƯƠNG TRÌNH ĐƠN GIẢN
§3. CẤU TRÚC CHƯƠNG TRÌNH

I. Cấu trúc chung


 Python không cần có <phần khai báo>
 Ta có thể thay phần khai báo bằng một ghi chú về chương trình.
II. Các thành phần của chương trình
1. Phần khai báo
 Phần này có thể khai báo bằng một dòng ghi chú về tên chương trình
Vd:

 Python không cần thiết phải khai báo biến, hằng trong phần khai báo mà khi nào dùng đến
đối tượng nào thì khai báo đối tượng ấy.
Vd:

 Khai báo biến:


Vd:

 Khai báo hằng:


Vd:

2. Phần thân chương trình


Phần thân chương trình Python là các câu lệnh thực thi.
III. Ví dụ chương trình đơn giản
Vd1:
Vd2:

Lưu ý: Python sử dụng các ký tự trong bảng mã Unicode nên xâu ký tự có thể gõ tiếng Việt.
§4. MỘT SỐ KIỂU DỮ LIỆU CHUẨN

PYTHON Có 5 kiểu dữ liệu chuẩn gồm: Numers, String, List, Tuple, Dictionary.
 Numers: Kiểu dữ liệu numbers chứa giá trị là một con số, nó được tạo ra khi ta gán các
giá trị là một con số cho biến đó.

Python hỗ trợ 4 kiểu dữ liệu numbers khác nhau: int, long, float, complex

 String: Kiểu dữ liệu strings được xác định khi giá trị được gán cho nó nằm giữa cặp dấu '
' hoặc " ".

 List: Lists trong Python là một kiểu dữ liệu phức hợp linh hoạt, Lists chứa những phần tử
được ngăn cách nhau bởi dấu , và nằm trong cặp dấu ngoặc vuông [ ]. Theo một vài đánh
giá thì Lists trong Python gần giống với Array trong C, sự khác biệt chính là các phần tử
của Lists có thể tồn tài nhiều kiểu dữ liệu khác nhau.

 Tuple: Tuples là một kiểu dữ liệu tương tự như với Lists. Các phần tử trong Tuples cũng
được ngăn cách nhau bởi dấu ,. Tuy nhiên, không giống với Lists, Tuples mở đầu và kết
thúc với dấu ngoặc đơn ( ).

Lưu ý: Ngoài điểm khác nhau nêu trên giữa Lists và Tuples thì còn một điểm khác nhau lớn: Các
phần tử và độ lớn của Lists có thể cập nhật nhưng với Tuples thì không.
 Dictionary: Lấy tư tưởng từ cuốn từ điển trong đời sống hằng ngày, kiểu dữ liệu
Dictionary trong Python gồm nhiều bộ (key, value) có key khác nhau. Key trong
Dictionary có thể là numbers, string hoặc tuple. Dictionary mặc định hỗ trợ lập trình viên
thêm, sửa, xóa các bộ (key, value) đó.

1. Kiểu nguyên
 Kiểu nguyên (int) trong Python không giới hạn ký tự mà chỉ phụ thuộc vào bộ nhớ máy
tính.
 Khi gán một giá trị là số nguyên cho một biến thì biến đó tự động được gán kiểu số
nguyên.

2. Kiểu thực
 Kiểu thực (float) trong Python có giới hạn tối đa 15 chữ số phần thập phân.
 Khi gán một giá trị là số thực cho một biến thì biến đó tự động được gán kiểu số thực.
3. Kiểu ký tự
 Python không có kiểu ký tự (char) như Pascal. Một ký tự (kiểu char của Pascal) được coi
như một xâu có độ dài bằng 1 trong Python. Kiểu xâu (str) hay còn gọi là kiểu chuỗi không
giới hạn độ dài.
 Tuy nhiên, Python cung cấp các hàm chr() va ord() để lấy vị trí của ký tự trong bảng mã
Unicode và ngược lại.

4. Kiểu logic
 Kiểu logic (bool) trong Python có giá trị True hoặc False.
 Ngoài ra, Python còn có các kiểu dữ liệu: complex, list, tuple, range, dict, set, frozenset,
bytearray, memoryview… chúng ta sẽ tìm hiểu thêm ở các phần sau.


§5. KHAI BÁO BIẾN
Cú pháp: tên biến = giá trị

 Trong Python một biến không cần khai báo kiểu dữ liệu. khi ta gán giá trị thì tự động
Python sẽ tùy biến kiểu dữ liệu của biến cho phù hợp với dữ liệu được gán vào. Như vậy,
một biến có thể có nhiều kiểu dữ liệu tùy thuộc vào giá trị mà ta gán.

 Ta có thể ép kiểu cho biến bằng cách khai báo kiểu cho giá trị gán cho biến.

Một số hàm cơ bàn:

 Ngoài ra, có thể khai báo nhiều biến bằng 1 giá trị trên 1 lần khai báo.
 Hay khai báo với nhiều biến với các giá trị tương ứng của nó trên 1 dòng.
§6. PHÉP TOÁN, BIỂU THỨC, CÂU LỆNH GÁN

Phép toán
Các phép toán số học:
Toán tử Ý nghĩa Ví dụ
+ Cộng x + y +2
- Trừ x–y–2
* Nhân x*y
/ Chia x/y
% Lấy phần dư của phép chia x%y
(mod)
// Lấy phần nguyên của phép chia x // y
(div)
** Lũy thừa x ** y (xy)

Các phép toán quan hệ:


Toán tử Ý nghĩa Ví dụ
> Lớn hơn x>y
< Nhỏ hơn x<y
== Bằng x == y
!= Khác x != y
>= Lớn hơn hoặc bằng x >= y
<= Nhỏ hơn hoặc bằng x <= y

Các phép toán logic:


Toán tử Ý nghĩa Ví dụ
and Và: True khi cả hai đều True x and y
or Hoặc: True nếu một trong hai là x or y
True
not Không: True khi False not x

Biểu thức số học


Là một dãy các phép toán +, -, *, /, //, % từ các hằng, biến kiểu số và các hàm.
Dùng cặp dấu () để quy định trình tự tính toán.
Thứ tự thực hiện các phép toán:
Trong ngoặc trước, ngoài ngoặc sau.
Nhân chia trước cộng trừ sau.
Giá trị của biểu thức có kiểu là kiểu của biến hoặc hằng có miền giá trị lớn nhất trong biểu thức.
Hàm số học chuẩn
Trước khi dùng hàm số học chuẩn, ta phải thực hiện khai báo thư viện math.
Vd:

Lưu ý:
Hàm Biểu diễn trong Biểu diễn trong
toán học Python
Lũy thừa xy X**y
Căn bậc hai x math.sqrt(x)
Giá trị tuyệt đối x abs(x)
Loogarit tự nhiên lnx math.log(x)
Luỹ thừa của số e ex math.exp(x)
Sin Sinx math.sin(x)
cos cosx math.cos(x)
Làm tròn round round(x,y)
Ví dụ

b  b 2  4ac
Biểu thức toán học 2a trong Python có thể viết dưới dạng:
(-b+math.sqrt(b*b - 4*a*c))/(2*a)
Ngoài những hàm số học chuẩn trên, còn có các hàm chuẩn khác được giới thiệu trong những
phần sau.

Biểu thức quan hệ


Có dạng như sau:
<biểu thức 1> <phép toán quan hệ> <biểu thức 2>
Trong đó: Biểu thức 1 và biểu thức 2 cùng là chuỗi hoặc cùng là biểu thức số học.
Kết quả của biểu thức quan hệ là True hoặc False.
Biểu thức quan hệ được thực hiện theo trình tự:
 Tính giá trị các biểu thức.
 Thực hiện phép toán quan hệ.
Vd:
x<5
i+1 >= 2*j
Trong ví dụ trên, nếu x có giá trị 3, thì biểu thức x < 5 có giá trị true. Nếu i có giá trị 2 và j có giá
trị 3 thì biểu thức i + 1 >= 2*j sẽ cho giá trị false.
Ví dụ
Điều kiện để điểm M có toạ độ (x; y) thuộc hình tròn tâm I(a; b), bán kính R là:
sqrt((x-a)*(x-a) + (y-b)*(y-b)) <= R
hoặc
sqr(x-a) + sqr(y-b) <= R*R
Biểu thức logic
Biểu thức lôgic đơn giản là biến lôgic hoặc hằng lôgic.
Biểu thức lôgic là các biểu thức lôgic đơn giản, các biểu thức quan hệ liên kết với nhau bởi phép
toán lôgic. Giá trị biểu thức lôgic là true hoặc false. Các biểu thức quan hệ thường được đặt trong
cặp ngoặc ( và ).
Dấu phép toán not được viết trước biểu thức cần phủ định, ví dụ:
not(x < 1) thể hiện phát biểu "x không nhỏ hơn 1" và điều này tương đương với biểu thức quan hệ
x >= 1.
Các phép toán and và or dùng để kết hợp nhiều biểu thức lôgic hoặc quan hệ, thành một biểu
thức thường được dùng để diễn tả các điều kiện phức tạp.
Ví dụ 1
Để thể hiện điều kiện 5 £ x £ 11, trong Python cần phải tách thành phát biểu dưới dạng "5 £ x và
x £ 11" và được viết như sau:
(5 <= x) and (x <= 11)
Ví dụ 2
Giả thiết M và N là hai biến nguyên. Điều kiện xác định M và N đồng thời chia hết cho 3 hay
đồng thời không chia hết cho 3 được thể hiện trong Python như sau:
((M % 3 == 0) and (N % 3 == 0)) or ((M % 3 != 0) and (N % 3 != 0))
Câu lệnh gán
Câu lệnh gán trong Python dùng dấu = để gá giá trị bên phải cho biến bên trái.
Cú pháp: <tên biến>= <biểu thức>
§7. CÁC THỦ TỤC CHUẨN VÀO RA ĐƠN GIẢN

1. Nhập dữ liệu vào từ bàn phím


Trong Python để nhập liệu từ bàn phím ta dùng hàm input(). Giá trị nhập vào của hàm input()
mặc định là kiểu xâu, do đó ta cần chuyển kiểu nếu như muốn lưu trữ giá trị nhập vào không phải
kiểu chuỗi.
Vd:

Nhập giá trị và nhấn Enter lần lượt cho từng biến.
2. Đưa dữ liệu ra màn hình
Python sử dụng hàm print() để hiển thị dữ liệu ra màn hình. Ta cũng có thể in thông báo nhập dữ
liệu ra màn hình ngay trong lệnh input().
Vd:
Để nhập giá trị M từ bàn phím ta có thể code như sau:

Hoặc

Vd:
Định dạng dữ liệu in ra màn hình
Vd: tính tổng 2 số nguyên nhập từ bàn phím

In với số thập phân

Kết quả là 3.32


Ở đây, %2f là định dạng của dữ liệu cần in. kết quả in ra màn hình sữ chỉ lấy 2 chữ số thập phân
của biến a mà thôi. Một lưu ý quan trọng là kết quả sẽ được làm tròn.
§8. SOẠN THẢO, DỊCH, THỰC HIỆN VÀ HIỆU CHỈNH
CHƯƠNG TRÌNH
CHƯƠNG III: CẤU TRÚC RẼ NHÁNH VÀ LẶP
§9. CẤU TRÚC RẼ NHÁNH

1. Rẽ nhánh
Thường ngày, có rất nhiều việc chỉ được thực hiện khi một điều kiện cụ thể nào đó được
thoả mãn.
Ví dụ, Châu và Ngọc thường cùng nhau chuẩn bị các bài thực hành môn Tin học.
Một lần Châu hẹn với Ngọc: "Chiều mai nếu trời không mưa thì Châu sẽ đến nhà Ngọc".
Một lần khác, Ngọc nói với Châu: "Chiều mai nếu trời không mưa thì Ngọc sẽ đến nhà
Châu, nếu mưa thì sẽ gọi điện cho Châu để trao đổi".
Câu nói của Châu cho ta biết một việc làm cụ thể (Châu đến nhà Ngọc) sẽ được thực hiện
nếu một điều kiện cụ thể (trời không mưa) thoả mãn. Ngoài ra không đề cập đến việc gì sẽ xảy ra
nếu điều kiện đó không thoả mãn (trời mưa).
Cách diễn đạt như vậy thuộc dạng mệnh đề thiếu:
Nếu... thì…
Câu nói của Ngọc khẳng định một trong hai việc cụ thể (Ngọc đến nhà Châu hay Ngọc gọi
điện cho Châu) chắc chắn sẽ xảy ra. Tuy nhiên, việc nào trong hai việc sẽ được thực hiện thì tuỳ
thuộc vào điều kiện cụ thể (trời không mưa) thoả mãn hay không.
Cách diễn đạt như vậy thuộc dạng mệnh đề đủ:
Nếu… thì…, nếu không thì…
Từ đó có thể thấy, trong nhiều thuật toán, các thao tác tiếp theo sẽ phụ thuộc vào kết quả
nhận được từ các bước trước đó.
Cấu trúc dùng để mô tả các mệnh đề có dạng như trên được gọi là cấu trúc rẽ nhánh.
Ví dụ, để giải phương trình bậc hai:
ax2 + bx + c = 0, (a ¹ 0)
trước tiên ta tính biệt số delta D = b2 – 4ac.
Nếu D không âm, ta sẽ đưa ra các nghiệm. Trong trường hợp ngược lại, ta phải thông báo
là phương trình vô nghiệm.
Như vậy, sau khi tính D, tuỳ thuộc vào giá trị của D, một trong hai thao tác sẽ được thực
hiện.
Mọi ngôn ngữ lập trình đều có các câu lệnh để mô tả cấu trúc rẽ nhánh.
Nhập a, b, c

Tính D  b2 – 4ac

Sai Đúng
Delta 0 ?

Thông báo vô Tính và đưa ra


nghiệm, rồi kết thúc nghiệm thực, rồi kết
thúc

Sơ đồ thể hiện cấu trúc rẽ nhánh


2. Câu lệnh if
2.1 Câu lệnh if dạng thiếu

Ví dụ:

2.2 Câu lệnh if dạng đủ:


Ví dụ:

2.3 Câu lệnh if – elif – else

Ví dụ:

Trong đó:
 . Điều kiện: biểu thức quan hệ hoặc logic.
 . Câu lệnh, khối lệnh: là câu lệnh của Python.
Đúng Sai Đúng

Điều kiện Câu lệnh Câu lệnh Điều kiện Câu lệnh
2 1

Sai

Ở dạng thiếu: điều kiện sẽ được tính và kiểm tra. Nếu điều kiện đúng (có giá trị true) thì
câu lệnh sẽ được thực hiện, ngược lại thì câu lệnh sẽ bị bỏ qua.
Ở dạng đủ: điều kiện cũng được tính và kiểm tra. Nếu điều kiện đúng thì câu lệnh 1 sẽ
được thực hiện, ngược lại thì câu lệnh 2 sẽ được thực hiện .
3. Câu lệnh ghép
Câu lệnh ghép trong Python hay còn gọi là “khối lệnh” được thụt đầu dòng cùng một khoảng
cách như nhau (không cần dùng ngoặc hay từ khóa begin – end).
Ví dụ:

4. Một số ví dụ
Ví dụ 1
Tìm nghiệm thực của phương trình bậc hai:
ax2 + bx + c = 0 , với a ¹ 0.
Input: Các hệ số a, b, c nhập từ bàn phím.
Output: Đưa ra màn hình các nghiệm thực hoặc thông báo "Phương trình vô nghiệm".
Ví dụ 2
Tìm số ngày của năm N, biết rằng năm nhuận là năm chia hết cho 400 hoặc chia hết cho 4 nhưng
không chia hết cho 100. Ví dụ, các năm 2000, 2004 là năm nhuận và có số ngày là 366, các năm
1900, 1945 không phải là năm nhuận và có số ngày là 365.
Input: N nhập từ bàn phím.
Output: Đưa số ngày của năm N ra màn hình.
§10 CẤU TRÚC LẶP
1. Lặp
Với a là số nguyên và a > 2, xét các bài toán sau đây:
Bài toán 1. Tính và đưa kết quả ra màn hình tổng
1 1 1 1
S    ... 
a a1 a2 a  100 .
Bài toán 2. Tính và đưa kết quả ra màn hình tổng
1 1 1 1
S    ...   ...
a a 1 a 2 aN
1
cho đến khi a  N < 0,0001.
Với cả hai bài toán, dễ thấy cách để tính tổng S có nhiều điểm tương tự:
1
 Xuất phát, S được gán giá trị a ;
1
 Tiếp theo, cộng vào tổng S một giá trị a  N với N = 1, 2, 3, 4, 5,… Việc cộng này được
lặp lại một số lần.
Đối với bài toán 1, số lần lặp là 100 và việc cộng vào tổng S sẽ kết thúc khi đã thực hiện việc
cộng 100 lần.
Đối với bài toán 2, số lần lặp chưa biết trước nhưng việc cộng vào tổng S sẽ kết thúc khi điều
1
kiện a  N < 0,0001 được thoả mãn.
Nói chung, trong một số thuật toán có những thao tác phải thực hiện lặp đi lặp lại một số
lần. Một trong các đặc trưng của máy tính là có khả năng thực hiện hiệu quả các thao tác lặp. Cấu
trúc lặp mô tả thao tác lặp và được phân biệt hai loại là lặp với số lần biết trước và lặp với số lần
chưa biết trước.
Các ngôn ngữ lập trình đều có các câu lệnh để mô tả cấu trúc điều khiển lặp.
2. Lặp với số lần biết trước và câu lệnh for
Có hai thuật toán Tong_1a và Tong_1b để giải bài toán 1 như sau:
Thuật toán Tong_1a
Bước 1. S ¬ 1/a; N ¬ 0; {Khởi tạo S và N}
Bước 2. N ¬ N + 1;
Bước 3. Nếu N > 100 thì chuyển đến bước 5;
Bước 4. S ¬ S + 1/(a + N) rồi quay lại bước 2;
Bước 5. Đưa S ra màn hình, rồi kết thúc.
Thuật toán Tong_1b
Bước 1. S ¬ 1/a; N ¬ 101; {Khởi tạo S và N}
Bước 2. N ¬ N – 1;
Bước 3. Nếu N < 1 thì chuyển đến bước 5;
Bước 4. S ¬ S + 1/(a + N) rồi quay lại bước 2;
Bước 5. Đưa S ra màn hình rồi kết thúc.
Lưu ý, số lần lặp của cả hai thuật toán trên là biết trước và như nhau (100 lần).
Trong thuật toán Tong_1a, giá trị N khi bắt đầu tham gia vòng lặp là 1 và sau mỗi lần lặp N
tăng lên 1 cho đến khi N > 100 (N = 101) thì kết thúc lặp (thực hiện đủ 100 lần). Trong thuật toán
Tong_1b, giá trị N bắt đầu tham gia vòng lặp là 100 và sau mỗi lần lặp N giảm đi 1 cho đến khi N
< 1 (N = 0) thì kết thúc lặp (thực hiện đủ 100 lần). Ta nói cách lặp trong thuật toán Tong_1a là
dạng tiến và trong thuật toán Tong_1b là dạng lùi.
Để sử dụng câu lệnh for trước tiên chúng ta cùng tìm hiểu hàm range
range(<bắt đầu>, <kết thúc>, <bước nhảy>)
Ví dụ: range(10) → 0; 1; 2; 3; 4; 5; 6; 7; 8; 9
range(1, 10) → 1; 2; 3; 4; 5; 6; 7; 8; 9
range(1, 10, 2) → 1; 3; 5; 7; 9
range(10, 0, -1) → 10; 9; 8; 7; 6; 5; 4; 3; 2; 1
range(10, 0, -2) → 10; 8; 6; 4; 2
Nếu bước nhảy để trống thì mặc định bước nhảy là 1.
Câu lệnh for
for <tên biến> in range(<bắt đầu>, <kết thúc>, <bước nhảy>) :
<Câu lệnh>
Ví dụ 1: Chương trình cài đặt thuật toán Tong_1a

Chương trình Tong_1b học sinh tự làm.


Ví dụ 2: Chương trình sau thực hiện việc nhập từ bàn phím hai số nguyên dương M và N (M <
N), tính và đưa ra màn hình tổng các số chia hết cho 3 hoặc 5 trong phạm vi từ M đến N.
3. Lặp với số lần chưa biết trước và câu lệnh While
Có thể xây dựng thuật toán Tong_2 như sau để giải bài toán 2.
Thuật toán Tong_2
Bước 1. S ¬ 1/a; N ¬ 0; {Khởi tạo S và N}
Bước 2. Nếu 1/(a + N) < 0,0001 thì chuyển đến bước 5;
Bước 3. N ¬ N + 1;
Bước 4. S ¬ S + 1/(a + N) rồi quay lại bước 2.
Bước 5. Đưa S ra màn hình, rồi kết thúc
Như vậy, việc lặp với số lần chưa biết trước sẽ chỉ kết thúc khi một điều kiện cho trước được thoả
mãn.
3.1 Cấu trúc While

Giải thích: Nếu điều kiện đúng, các lệnh bên trong vòng lặp sẽ được thực hiện cho đến khi nó
nhận giá trị sai.
Lưu ý: khi sử dụng vòng lặp while cần lưu ý các điểm sau đây:
 Vòng lặp phải có tính dừng. Nghĩa là điều kiện phải có trường hợp sai. Trong một số tình
huống, người ta vẫn sử dụng vòng lặp vô hạn, nhưng cần có cơ chế để thoát khỏi vòng lặp
khi cần thiết. Để thoát khỏi vòng lặp vô hạn trong Python ta sử dụng tổ hợp phím Ctrl + C
 Nếu có nhiều lệnh chịu sự chi phối của while, thì chúng cần được đặt trong dấu khối
lệnh.
Ví dụ 1: Chương trình cài đặt thuật toán Tong_2
Ví dụ 2: Tìm ước chung lớn nhất (UCLN) của hai số nguyên dương M và N.
Có nhiều thuật toán khác nhau tìm UCLN của M và N. Sau đây là một thuật toán tìm UCLN.
Thuật toán
Bước 1: Nhập M, N;
Bước 2: Nếu M = N thì lấy giá trị chung này làm UCLN rồi chuyển đến bước 5;
Bước 3: Nếu M > N thì M ← M - N rồi quay lại bước 2;
Bước 4: N ← N - M rồi quay lại bước 2;
Bước 5: Đưa ra kết quả UCLN rồi kết thúc.
Chương trình cài đặt thuật toán:

3.2 Cấu trúc lặp While - else


Có một sự mới mẻ đối với vòng lặp while trong Python đó là bạn có thể kết hợp
thêm từ khóa ELSE để xử lý cho lần lặp không được thực hiện khi điều kiện lặp
false.
Ví dụ:

Chạy ví dụ này kết quả sẽ như sau:

Lần lặp thứ 6 sẽ không xảy ra nên code trong lệnh else sẽ được thực hiện.
CHƯƠNG IV: KIỂU DỮ LIỆU CÓ CẤU TRÚC
§11. KIỂU MẢNG
Mảng là một cấu trúc dữ liệu cơ bản của tất cả các ngôn ngữ lập trình, nó là tập hợp các
phần tử của một kiểu dữ liệu duy nhất, ví dụ mảng số nguyên, mảng xâu,…
Python không có cấu trúc dữ liệu mảng mà sử dụng kiểu “Danh sách” (List) thay cho
mảng. Tuy nhiên, trong bài giảng này chúng ta vẫn sử dụng thuật ngữ “mảng” để gần gũi với
người học.
Mảng trong python có thể lưu trữ phần tử với bất kì kiểu dữ liệu nào và làm được mọi thứ
mà kiểu mảng thông thường có thể làm.
Chúng ta có thể lưu trữ số nguyên, số thập phân, chuỗi trong cùng một mảng trong python.
1. Kiểu mảng một chiều:
Ví dụ, xét bài toán nhập nhiệt độ (trung bình) của mỗi ngày trong tuần, tính và đưa ra màn
hình nhiệt độ trung bình của tuần và số lượng ngày trong tuần có nhiệt độ cao hơn nhiệt độ trung
bình của tuần.
Ta có thể dùng bảy biến thực để lưu trữ nhiệt độ các ngày trong tuần. Chương trình giải bài toán
được viết bằng Python như sau:
Khi cần giải bài toán trên với N ngày (N khá lớn) thì cách làm tương tự đòi hỏi một lượng
tính toán cũng khá dài.
Để giải quyết vấn đề đó, ta sử dụng kiểu dữ liệu mảng – list. Chương trình giải bài toán
tổng quát với N ngày trong Python như sau:
Trong chương trình này chúng ta sử dụng biến a có kiểu mảng để lưu nhiệt độ của các
ngày. Biến a không cần khai báo mà được khởi tạo bằng cách gán vào a một mảng rỗng [].
a) Khai báo và truy xuất mảng một chiều:
Mảng được khai báo trên Python bằng cặp ngoặc [], ở giữa là các phần tử của mảng, cách
nhau bằng dấu phẩy (,), như ví dụ bên dưới:
a =[]: khai báo mảng rỗng.
a = [1, 4, 5, 7]: mảng gồm 4 phần tử nguyên.
Lưu ý: Mảng trong Python không cần khai báo số lượng phần tử, không cần khai báo kiểu dữ
liệu. (biến trong Python tự nhận biết kiểu dữ liệu được gán để tự động thay đổi kiểu cho phù
hợp).
Truy xuất mảng:
Các phần tử trong mảng có chỉ số bắt đầu từ 0 và chiều ngược lại bắt đầu từ -1.
VD:
Mảng 1 4 5 7
Chỉ số 0 1 2 3
Chỉ số âm -4 -3 -2 -1

Ta có thể gọi một hay nhiều phần tử trong mảng bằng các đối số trong cặp ngoặc [].
print ( a [0]) à 1
print (a [1]) à 4
print (a[4]) à list index out of range: truy xuất vượt tầm giới hạn của mảng.
b) Nhập – In mảng
Dùng vòng lặp for để nhập mảng.
Nhập mảng gồm n phần tử (n nhập từ bàn phím)

In mảng
Print (a)
c) Một số ví dụ
Ví dụ 1: Tìm phần tử lớn nhất của dãy số nguyên.
Input: số nguyên dương N (N<=250) và dãy N số nguyên dương A1, A2, …., AN, mỗi số đều
không vượt quá 500.
Output: Chỉ số và giá trị của phần tử lớn nhất trong dãy số đã cho (nếu có nhiều phần tử lớn nhất
chỉ cần đưa ra một trong số chúng).
Bước 1: Nhập N và dãy A1, A2,…, AN;
Bước 2: Max ← A1, i ←2;
Bước 3: Nếu i>N thì đưa ra giá trị Max rồi kết thúc;
Bước 4:
Bước 4.1: Nếu Ai > Max thì Max ← Ai;
Bước 4.2: i← i+1 rồi quay lại bước 3;
Thuật toán tìm phần tử lớn nhất của dãy số.
Chương trình dưới đây thực hiện việc duyệt tuần tự các phần tử để tìm ra số lớn nhất của
dãy số nguyên.

Ví dụ 2: Sắp xếp dãy số nguyên bằng thuật toán tráo đổi.


Input: số nguyên dương N (N<=250) và dãy N số nguyên dương A1, A2, …., AN, mỗi số đều
không vượt quá 500.
Output: Dãy số A được sắp xếp thành dãy không giảm.
Bước 1. Nhập N, các số hạng A1, A2,…, AN;
Bước 2. M := N;
Bước 3. Nếu M < 2 thì đưa ra dãy A đã được sắp xếp rồi kết thúc;
Bước 4. M := M – 1, i := 0;
Bước 5. i := i + 1;
Bước 6. Nếu i > M thì quay lại bước 3;
Bước 7. Nếu Ai > Ai+1 thì tráo đổi Ai và Ai+1 cho nhau;
Bước 8. Quay lại bước 5.
Thuật toán sắp xếp dãy tăng dần.
Chương trình giải bài toán trên:

Trong Python có thể dùng hàm sort() để sắp xếp mảng mà không cần viết chương trình sắp
xếp như trên.
Chương trình dùng hàm sort() để sắp xếp:
Ví dụ 3: Tìm kiếm nhị phân.
Input: Dãy A là dãy tăng dần gồm N (N<=250) số nguyên dương A1, A2, …, AN và số nguyên k.
Output: Chỉ số i mà Ai = k hoặc thông báo “Không tìm thấy” nếu không có số hạng nào của dãy
A có giá trị bằng k.

Bước 1: Nhập N, nhập số hạng A1, A2, …, AN và khóa k;


Bước 2: Dau ← 1, Cuoi ← N;
Dau+Cuoi
Bước 3: Giua ← [ 2 ]
Bước 4: Nếu AGiua= k thì thông báo chỉ số Giua, rồi kết thúc;
Bước 5: Nếu AGiua >k thì đặt Cuoi ← Giua - 1 rồi chuyển đến bước 7;
Bước 6: Dau ← Giua + 1;
Bước 7: Nếu Dau > Cuoi thì thông báo dãy A không có số hạng có giá trị bằng k
rồi kết thúc;

Thuật toán tìm kiếm nhị phân.


Python cung cấp hàm in, index để xử lý tìm kiếm trong mảng. Ta có thể áp dụng cho ví
dụ trên như sau:
2. Kiểu mảng hai chiều
Mảng 2 chiều có thể hiểu là mảng trong mảng. Giống như mảng 1 chiều mà trong đó mỗi
phần tử của mảng cũng là một mảng 1 chiều.
Python cho phép tạo list trong list. Vì vậy ta xử lý dữ liệu mảng 2 chiều tương tự như
mảng 1 chiều.
a) Khai báo và tham chiếu
Ví dụ mảng manga là mảng 2 chiều có 2 hàng, 3 cột như sau:

1 2 3
4 5 6
Ta tạo mảng manga như sau:

Tham chiếu tới các phần tử trong mảng


print(manga[0] [0]) à1
print(manga[0] [1]) à2
b) Nhập – In mảng từ bàn phím.

c) Một số ví dụ:
Ví dụ 1: Viết chương trình tính và đưa ra màn hình bảng nhân.
Ví dụ 2: Chương trình sau nhập vào từ bàn phím các phần tử của mảng 2 chiều B gồm 5 hàng, 7
cột với các phần tử là các số nguyên và một số nguyên k. Sau đó, đưa ra màn hình các phần tử
của mảng có giá trị nhỏ hơn k.

3. Các thao tác xử lý mảng:


Phần này được bổ sung để cung cấp thêm các thao tác xử lý với dữ liệu kiểu mảng (list)
a) Tạo mảng:
b) Truy xuất phần tử:

c) Thêm, sửa, xóa phần tử:


Thêm
Sửa:

Xóa:
d) Các phương thức thường dùng với list:

You might also like