introduction to python -...
TRANSCRIPT
Nguyen Chi Trung – FIT.HNUE
INTRODUCTION TO PYTHON
Dr. Nguyen Chi Trung
(FIT – HNUE)
Faculty of Information Techonology
Hanoi National University of Education
CHAPTER 1. THE FIRST PROGRAM IN PYTHON
1.1. Introduction to Python
Say Hello
Tính diện tích hcn
Tính diện tích hình tròn
So sánh 2 cách nhập dữ liệu
Nhập từng biến, có xuống dòng Nhập đồng thời nhiều biến a = float(input('nhap a = '))
b = float(input('nhap b = ')) a, b = map(float, input('Nhap a va b: ').split())
1.2. Home work
1. Tính diện tích một số hình
2. Tính thể tích một số hình
3. Tính giá trị một số biểu thức
4. Giải bất phương trình ax + b < 0
CHAPTER 2: CONTROL STATEMENTS
2.1. Condition Statement
2.1.1. Syntax of condition Statement
if đk:
statements
if đk:
statements_1
else: statements_1
if đk1:
statements_1
elif đk2: statements_2
2
2.1.2. Practice
Ex1. Giải bất phương trình bậc 1: ax + b < 0 a, b = map(float, input('Nhap a va b: ').split())
if a==0:
if b < 0:
print('Bat phuong trinh vo so nghiem')
else:
print('Bat phuong trinh vo nghiem')
elif a>0:
print('Bat phuong trinh co nghiem x < %0.3f' %(-b/a))
else:
print('Bat phuong trinh co nghiem x > %0.3f' %(-b/a))
Ex2. Giải phương trình bậc 2: ax^2 + bx + c = 0
from math import sqrt
a,b,c = map(float, input('Nhap a, b, c: ').split())
d = b * b - 4 * a * c
if d < 0:
print('Phuong trinh vo nghiem')
elif d == 0:
print('Phuong trinh co nghiem kep x0 = %0.3f' %(-b/(2 * a)))
else:
x1 = (-b + sqrt(d)) / (2 * a)
x2 = (-b - sqrt(d)) / (2 * a)
print('Phuong trinh co 2 nghiem phan biet:')
print('x1 = %0.3f x2 = %0.3f' %(x1,x2))
Ex3. Giải hệ phương trình bậc nhất 2 ẩn số theo D, Dx, Dy
222
111
cybxa
cybxa
Step 1: Nhập a1, b1, c1; Nhập a2, b2, c2
Step 2: Tính các định thức:
D = a1b2 – a2b1
Dx = c1b2 – c2b1
Dy = a1c2 – a2c1
Step 3: Giải và biện luận bằng câu lệnh điều kiện: if, if – elif, if - else
D = 0, Dx = Dy = 0: In ra: Hệ Vô định
D = 0, Dx 0 or Dy 0: In ra: Hệ Vô nghiệm
D 0: In ra: Hệ có nghiệm duy nhất x = Dx/D, y = Dy/D
Operator Meaning Example Result + addition 5+ 8 13
- subtraction 90 -10 80
3
* multiplication 4 * 7 28
/ division 7 / 2 3.5
// integer division 7 //2 3
% remainder 7 % 2 1
** exponent 3 ** 4 81
Operator Meaning Example Result lambda Lambda expression
if–else Conditional expression
or Boolean OR
and Boolean AND
notx Boolean NOT
in,notin,is,isnot,<,<=
,>,>=,!=,==
Comparisons, incl.
membership tests and
identity tests
| Bitwise OR
^ Bitwise XOR
& Bitwise AND
<<,>> Shifts
+,- Addition and
subtraction
*,@,/,//,% Multiplication, matrix multiplication,
division, remainder
+x,-x,~x Positive, negative,
bitwise NOT
** Exponentiation
awaitx Await expression
x[index],x[index:inde
x],x(arguments...),x.
attribute
Subscription, slicing,
call, attribute
reference
(expressions...),[expressions...],{key:value
...},{expressions...}
Binding or tuple display, list display,
dictionary display, set
display
Ex4. Lập trình chuyển đổi giữa 2 loại nhiệt độ C (Celsious) và F (Fahrenheit)
Công thức:
325
9
)32(9
5
CF
FC
Khi chạy chương trình
4
Lần 1 Lần 2
Choose: 1. C F, 2. F C: 1
Enter temperator: 22
Conversional temperator is: 71.6
Choose: 1. C F, 2. F C: 2
Enter temperator: 71.7
Conversional temperator is: 22.0
Bài làm
choice = int(input('Select: 1. C -> F, 2. F -> C: '))
degree = float(input('Enter a degree: '))
if choice == 1:
result = ((9/5) * degree) + 32
else:
result = (5/9) * (degree - 32)
print('Result: ',result)
2.1.3. Homework
Ex1. Xếp loại học lực
Nhập điểm tổng kết học kì I của một HS. Đưa ra màn hình xếp loại học lực của HS đó theo qui
định sau:
Điểm Xếp loại
[9, 10] Excellent (Giỏi)
[8, 9) Very good (Khá)
[7, 8) Good (Trung bình khá)
[5, 7) Medium (Trung bình)
(0, 5) Bad (Yếu Kém)
Ex2. Phân loại con thú
Lập trình phân cho robot phân loại động vật khi nó quan sát con vật đó qua một cảm biến hình
ảnh. Nhập 2 đặc trưng: kích thước („to‟ và „nho‟), lông („co long‟, „khong long‟). Giả sử robot sẽ
quan sát một trong các con vật sau: mèo, gấu và thằn lằn.
INPUT: s_furry? (co/khong), s_small (nho/to)
OUTPUT: One of answers as bellow:
- it is a cat
- it is a bear
- it is a skink
- it may be a man or hairless bear
Suggestions:
furry == (sfurry == 'co')
là dạng rút gọn của lệnh sau
if sfurry == 'co':
furry = True
else:
furry = False
Tham khảo:
5
sfurry = input('Con vat co long hay khong (co/khong): ')
furry = (sfurry == 'co')
if sfurry == 'co':
furry = True
else:
furry = False
print(sfurry, furry)
http://fit.hnue.edu.vn/~trungnc/
2.2. Loop by “for” and “while” statement
2.2.1. Syntax
statement explaination
for biến in range(value1, value2):
statements
Lặp statements với số lần biết trước
là: value2 – value1 – 1
Lưu ý: s += a nghĩa là s = s + a
while đk:
statements
Lặp với số lần không biết trước. Còn
lặp khi đk sau while còn đúng. Dừng
lặp khi đk sau while sai.
2.2.1. Practice
Ex1. Tính tổng dãy lũy thừa
S = a + a2 + a
3 + … + a
n
Với a, n là các số nguyên dương được nhập từ bàn phím
Example
a = 3, n = 3
S = 3 + 32 + 3
3 = 39
Code:
a, n = map(int, input('Enter a & n: ').split())
S = a
for i in range(2,n+1):
S += a**i
print('Result: ', S)
Ex2. Bài toán lãi suất tiết kiệm
Một người gửi tiết kiệm ban đầu là a (triệu đồng) với lãi suất là k (%) và chu kì tính lãi là c
(tháng).
1) Hãy cho biết người đó rút được bao nhiêu tiền sau t (tháng) (kể cả gốc và lãi)
INPUT: a, k, c, t
OUTPUT: b
2) Hãy cho biết người đó phải gửi bao nhiêu tháng thì sẽ nhận được số tiền b
INPUT: a, k, c, b
6
OUTPUT: t
Câu 1
t = int(input('Nhap so thang gui: '))
b = a
for i in range(1,t+1):
if i % c == 0:
b += b*k/100
print('So tien rut duoc sau %d thang la %0.3f' % (t,b))
Câu 2
đích: b,
s = 0 với t = 0
{t++ mod c == 0 s = s + s*k/100 } Đây là một vòng lặp
Còn lặp khi s < b, dừng khi s ≥ b
b = float(input('Nhap so tien can rut: '))
t = 0
s = a
while s < b:
t += 1
if t % c == 0:
s += s*k/100
print('De co duoc so tien >= %0.f, ban can gui %d thang' %(b,t))
CHAPTER 3: ARRAY AND SOME BASIC ALGORITHM
3.1. Input and print out an array
Cách 1: Nhập mảng: Mỗi phần tử một dòng
Các dòng lệnh Giải thích
1. n = int(input('Nhap so phan tu: ')) 2. a = [0] * n 3. for i in range(n):
print('Nhap phan tu thu ',i, ':',end='')
a[i] = int(input())
4. print('Mang a la:', a)
1. Nhập n 2. Khởi tạo một mảng a có
n số 0
3. Với mỗi i = 0,1, …, n-1 tiến hành nhập a[i]
4. In mảng a ra màn hình
Cách 2: Nhập mảng: Nhập tất cả các phần tử trên một dòng
1. print('Hay nhap mang a tren 1 dong') 2. a = [int(x) for x in input().split()] 3. n = len(a) 4. print('So phan tu cua mang la: ', n) 5. print('Mang a la:', a)
1. Thông báo nhập mảng
2. Nhập các phần tử trên
một dòng
3. Tính n là số phần tử
của mảng
7
3.1. The use of an array
Ex1.
Nhập điểm thi môn Python của n sinh viên và đưa ra màn hình các thông tin sau đây
1) Điểm trung bình (DTB)
2) Số SV có điểm cao hơn DTB
3) Tỉ lệ SV đạt (điểm ≥ 3) và không đạt (điểm < 3)
4) Tỉ lệ SV khá (điểm ≥ 7.5)
#Nhap diem
n = int(input('Nhap so SV: '))
a = [0] * n
for i in range(n):
print('Nhap diem cua SV thu ',i+1, ': ', end = '')
a[i] = float(input())
print('Day diem sau khi nhap la:', a)
#Tinh diem TB
dtb = 0
for x in a:
dtb += x
dtb /=n
print('Diem trung binh la: %4.1f ' %dtb)
#Tinh so SV co diem cao hon DTB
s = 0
for x in a:
if x > dtb:
s += 1
print('So SV co diem cao hon diem trung binh la : ', s)
#Tinh ti le SV dat va khong dat; Tinh ti le SV kha
kd = 0
kha = 0
for x in a:
if x < 3:
kd += 1
if x >= 7.5:
kha += 1
print('Ti le diem khong dat la %4.1f ' %(kd*100/n), '%')
print('Ti le diem dat la %4.1f ' %((n-kd)*100/n),'%')
print('Ti le SV dat diem kha la %4.1f ' %(kha*100/n),'%')
HOMEWORK
Ex2.
Nhập từ bàn phím cân nặng của một nhóm HS của một trường THPT trong một đợt điều tra sức
khỏe học đường.
Đưa ra màn hình các thông tin sau đây
1) Cân nặng của các HS đã được nhập
2) Cân nặng trung bình của HS
8
3) Số HS có cân nặng cao hơn cân nặng trung bình của các HS
4) Tỉ lệ HS có cân nặng > 70 kg
Ex3.
Nhập từ bàn phím chiều cao và cân nặng của n HS của một trường. Đưa ra màn hình các thông
tin sau đây
1) Chiều cao và cân nặng của các HS đã được nhập, mỗi HS một dòng
2) Chỉ số BMI của các HS (BMI = Cân nặng/ (chiều cao)2)
3) Đưa ra số lượng và tỉ lệ HS thiếu cân, bình thường, thừa cân dựa trên bảng sau đây
4) Đưa ra số lượng và tỉ lệ HS béo phì cấp độ I
3.2. Selection Sort Algorithm
http://10.1.47.118:7070
Ví dụ
n = 6
a = {9, 7, 5, 1, 3, 2} {1, 2, 3, 5, 7, 9} ?
k Lần j 0 1 2 3 4 5 Ghi chú: j = i + 1 n-1
a[k] 0 9 7 5 1 3 2
i = 0 1 1 7 9 5 1 3 2 Xét dãy n phần tử, đầu dãy i = 0
2 5 9 7 1 3 2 a[j] < a[i] ? Đổi giá trị a[i] và a[j]
3 1 9 7 5 3 2
4 1 9 7 5 3 2
5 1 9 7 5 3 2
i=1 2 2 1 7 9 5 3 2 a[j] < a[i] ? Đổi giá trị a[i] và a[j]
3 1 5 9 7 3 2
4 1 4 9 7 5 2
5 1 2 9 7 5 4
i=2 3 3 1 2 7 9 5 4
4 1 2 5 9 7 4
9
5 1 2 4 9 7 5
i=3 4 4 1 2 4 7 9 5
5 1 2 4 5 9 7
i=4 5 5 1 2 4 5 7 9
n = 6
{0, 1, 2, 3, 4, 5}
a = {9, 7, 5, 1, 3, 2}
Lần 1: Xét tất cả dãy n phần tử
Đầu dãy i = 0
So sánh a[i] với các phần tử a[j] phía sau (j=i+1,n-1) kiểm tra nếu a[j] < a[i]
thì đổi giá trị của 2 phần tử ở vị trí i và j cho nhau
Cụ thể:
j = 1 a[j] < a[i] = True 7, 9, 5, 1, 3, 2
j = 2 a[j] < a[i] = True 5, 9, 7, 1, 3, 2
j = 3 a[j] < a[i] = True 1, 9, 7, 5, 3, 2
j = 4 a[j] < a[i] = False 1, 9, 7, 5, 3, 2
j = 5 a[j] < a[i] = False 1, 9, 7, 5, 3, 2
Lần 2: Làm tương tự đối với dãy n – 1 phần tử còn lại
Đầu dãy i = 1
So sánh a[i] với các phần tử a[j] phía sau (j=i+1,n-1) kiểm tra nếu a[j] < a[i]
thì đổi giá trị của 2 phần tử ở vị trí i và j cho nhau
Cụ thể:
Trước đó 1, 9, 7, 5, 3, 2
j = 2 a[j] < a[i] = True 1, 7, 9, 5, 3, 2
j = 3 a[j] < a[i] = True 1, 5, 9, 7, 3, 2
j = 4 a[j] < a[i] = True 1, 3, 9, 7, 5, 2
j = 5 a[j] < a[i] = True 1, 2, 9, 7, 5, 3
Lần 3: Làm tương tự đối với dãy n – 2 phần tử còn lại, ta nhận được 3 phần tử
được SX
10
Lần 4: Làm tương tự đối với dãy n – 3 phần tử còn lại, ta nhận được 4 phần tử
được SX
….
Cứ tiếp tục như vậy, đến lần thứ n-1 ta nhận được n-1 phần được SX, và hiển nhiên
phần tử cuối cùng lớn nhất, do đó ta thu được dãy gồm n phần tử được SX.
Ý tưởng thuật toán
Giả sử dãy có 5 phần tử, có vị trí từ 0 đến 4.
Gọi i là vị trí đầu dãy, j là các vị trí sau i
Quá trình SX diễn ra như sau
- Lần 1: Xét tất cả dãy 5 phần tử, đầu dãy là i = 0
o Tiến hành so sánh phần tử đầu dãy a[i] với các phần a[j] phía sau (j=
1, …, 4), nếu gặp phần tử a[j] < a[i] thì đổi giá trị a[i] và a[j] cho
nhau.
o Vậy kết thúc quá trình trên thì ta đưa được phần tử bé nhất về đầu
dãy. Dãy có 1 phần tử được SX.
- Lần 2: Làm tương tự với dãy 4 phần tử còn lại, đầu dãy là i = 1
o Tiến hành so sánh phần tử đầu dãy a[i] với các phần a[j] phía sau (j=
2, …, 4), nếu gặp phần tử a[j] < a[i] thì đổi giá trị a[i] và a[j] cho
nhau.
o Vậy kết thúc quá trình trên thì ta đưa được phần tử bé nhất về đầu dãy
mới. Ta nhận được dãy ban đầu có 2 phần tử được SX.
- Lần 3: Làm tương tự với dãy 3 phần tử còn lại, đầu dãy là i = 2
o Tiến hành so sánh phần tử đầu dãy a[i] với các phần a[j] phía sau (j=
3, …, 4), nếu gặp phần tử a[j] < a[i] thì đổi giá trị a[i] và a[j] cho
nhau.
o Vậy kết thúc quá trình trên thì ta đưa được phần tử bé nhất về đầu dãy
mới. Ta nhận được dãy ban đầu có 3 phần tử được SX.
- Cứ tiếp tục quá trình trên, sau 4 lần ta nhận được dãy ban đầu có 4 phần tử
được SX, phần tử cuối cùng phải là phần tử lớn nhất. Do đó ta nhận được
dãy gồm 5 phần tử được SX.
Tóm tắt ý tưởng:
- Giả sử dãy có n = 5 phần tử, có vị trí từ 0 đến 4.
- Ta lặp quá trình so sánh phần tử đầu dãy (i = 0, 1, …, 3) với các phần tử
phía sau nó (j=i+1, …, 4). Mỗi lần lặp, nếu gặp a[j] < a[i] thì đưa phần tử
a[j] bé hơn đó lên đầu dãy (đổi giá trị của a[i] và a[j] cho nhau).
11
- Sau lần 1, xét dãy 5 phần tử, ta đưa được phần tử bé nhất về đầu dãy.
- Sau lần 2, xét dãy 5 phần tử còn lại, ta đưa được phần tử bé nhì về vị trí 2.
- …
- Sau lần 4 ta nhận được dãy gồm 4 phần tử được SX, phần tử thứ 5 phải là
phần tử lớn nhất. Do đó, ta đã SX được dãy đã cho.
Tóm tắt ngắn gọn hơn nữa: Lặp n-1 lần việc so sánh phần tử đầu dãy với các phần
tử phía sau nó (nếu phần tử phía sau nhỏ hơn thì đổi giá trị nó với phần tử đầu dãy)
để đưa được phần tử bé nhất về đầu các dãy (đầu dãy là 0, 1, 2, …n-1). Sau n-1 lần
lặp thì đã nhận được dãy gồm n-1 phần tử được SX, phần tử cuối cùng là lớn nhất.
Đó là toàn bộ dãy được SX.
CODE
Chú ý câu lệnh “for i in range(1,5):” i chỉ chạy đến 4 thì dừng.
Code của thuật toán SX kiểu chọn trực tiếp (Selection Sort) đối với dãy
a0, a1,…,an-1 như sau.
Giả sử n = 5, i = 0, .., 3
for i in range(0, n-1)
for j in range(i+1, n) if a[j] < a[i]:
tg = a[i]
a[i] = a[j]
a[j] = tg
Ex4.
1) Nhập từ bàn phím chiều cao và cân nặng của n HS của một trường.
2) Đưa ra màn hình chỉ số BMI của các HS được sắp xếp tăng dần theo chiều cao
3) Giả sử các HS có mã từ 1 đến n. Đưa ra màn hình danh sách mã HS và chỉ BMI được sắp
xếp tăng dần theo BMI
3.3. Other Sort Algorithms
- Sắp xếp chọn trực tiếp (Selection Sort)
- Sắp xếp nổi bọt (Bubble Sort)
- Sắp xếp chèn trực tiếp (Insertion Sort)
3.3.1. Bubble Sort
a) Phân tích thuật toán
n = 5
a = {7, 5, 6, 4, 2}
12
Lần 1, i = 1
7 7 7 7 2
i → 5 5 5 2 ← j 7
6 6 2 ← j 5 5
4 2 ← j 6 6 6
j → 2 4 4 4 4
a[j] < a[j-1] → Swap(j, j-1)
Lần 2, xét dãy còn lại, i = 2
2 2 2 2
7 7 7 4
i → 5 5 4 ← j 7
6 4 ← j 5 5
j → 4 6 6 6
a[j] < a[j-1] → Swap(j, j-1)
Lần 3, xét dãy còn lại, i = 3
2 2 2
4 4 4
7 7 5
i → 5 5 ← j 7
j → 6 6 6
a[j] < a[j-1] → Swap(j, j-1)
Lần 4, xét dãy còn lại, i = 4
2 2
4 4
5 5
7 6
i, j → 6 7
a[j] < a[j-1] → Swap(j, j-1)
b) Thuật toán
Tóm tắt lại ta có (chú ý các phần tử của mảng có STT từ 0 đến n – 1)
Với mỗi i = 1, 2, …, n-1 (sát mặt nước) làm việc sau đây
Với mỗi j = n-1, …, i làm việc sau
Nếu a[j] < a[j-1] (dưới nhẹ hơn trên) Thì DoiGiaTri(j, j-1) (Nhẹ nổi lên, nặng chìm xuống)
n =5,
i = 2
k = 1, …, n-i=n-2
k j=n-k
1 4
2 3
13
3 2
4 1
c) Chương trình
#Nhap mang
n = int (input('Nhap so phan tu mang: '))
a = [0] * n
for i in range(n): #ngam hieu i = 0, 1, ..., n-1
print('a[',i,']= ', end ='')
a[i]=int(input())
print('Mang truoc khi SX: ', a)
#Sap xep mang
for i in range(0,n): #ngam hieu i = 0, 1, ..., n-1
for k in range(1,n-i):
j=n-k #ngam hieu j = n-1, ..., i
if a[j] < a[j-1]:
tg = a[j]
a[j]= a[j-1]
a[j-1] = tg
print('Mang sau khi SX: ', a)
Cách 2
#Sap xep mang
for i in range(0,n): #ngam hieu i = 0, 1, ..., n-1
for j in reversed(range(i+1,n):
if a[j] < a[j-1]:
tg = a[j]
a[j]= a[j-1]
a[j-1] = tg
print('Mang sau khi SX: ', a)
Cách 3 ?
#Sap xep mang
for i in range(0,n): #ngam hieu i = 0, 1, ..., n-1
for j in range(1,n-i):
if a[j] < a[j-1]:
tg = a[j]
a[j]= a[j-1]
a[j-1] = tg
print('Mang sau khi SX: ', a)
14
3.3.1. Insertion Sort
Phân tích thuật toán
n = 5
a = {7, 5, 6, 4, 2}, STT là 0, 1, 2, 3, 4
Lần 0 {7} {5, 6, 4, 2}
Lần 1 {7} {5, 6, 4, 2}
i = 1, x = a[i], j = i -1
Lặp khi j >= 0 và x < a[j]
a[j+1] = a[j]
j = j – 1
quá trình tịnh tiến những phần tử lớn hơn x sang bên phải
Sau lặp:
a[j+1] = x Đặt x vào đúng vị trí cần chèn của dãy đã được SX phía bên trái
7 5 6 4 2
5 7 6 4 2
Lần 2 {5, 7} {6, 4, 2}
i = 2, x = a[i], j = i -1
Lặp khi j >= 0 và x < a[j]
a[j+1] = a[j]
j = j – 1
quá trình tịnh tiến những phần tử lớn hơn x sang bên phải
Sau lặp:
a[j+1] = x Đặt x vào đúng vị trí cần chèn của dãy đã được SX phía bên trái
5 7 6 4 2
5 6 7 4 2
Lần 3 {5, 6, 7} {4, 2}
i = 3, x = a[i], j = i -1
Lặp khi j >= 0 và x < a[j]
a[j+1] = a[j]
j = j – 1
quá trình tịnh tiến những phần tử lớn hơn x sang bên phải
Sau lặp:
a[j+1] = x Đặt x vào đúng vị trí cần chèn của dãy đã được SX phía bên trái
5 6 7 4 2
4 5 6 7 2
Lần 4 {4, 5, 6, 7} {2}
i = 4, x = a[i], j = i -1
Lặp khi j >= 0 và x < a[j]
15
a[j+1] = a[j]
j = j – 1
quá trình tịnh tiến những phần tử lớn hơn x sang bên phải
Sau lặp:
a[j+1] = x Đặt x vào đúng vị trí cần chèn của dãy đã được SX phía bên trái
4. 5. 6. 7. 2
2 4 5 6 7
Thuật toán (Mảng có STT từ 0 đến n - 1)
Lần 0 dãy bên trái đã có 1 phần tử được sắp xếp là {a[0]}
Với mỗi i = 1, 2, …n – 1
Gán x = a[i] Để tìm cách chèn x vào đúng vị trí của dãy trái như sau
j = i – 1
Lặp quá trình sau khi j >= 0 và x < a[j]
a[j+1] = a[j] tịnh tiến những phần tử lớn hơn x sang bên phải
j = j – 1 lùi j để xét tiếp
Sau quá trình lặp
a[j+1] = x Đặt x vào đúng vị trí cần chèn của dãy đã được SX phía bên trái
Chương trình
#Nhap mang
n = int (input('Nhap so phan tu mang: '))
a = [0] * n
print('Hay nhap ',n,' phan tu cua mang tren 1 dong:')
a = [int(x) for x in input().split()]
print('Mang truoc khi SX: ', a)
#Sap xep mang theo thuat toan Insertion Sort
for i in range(1,n): #ngam hieu i = 0, 1, ..., n-1
x = a[i]
j = i - 1
while j >= 0 and x < a[j]:
a[j+1] = a[j]
j = j - 1
a[j+1] = x
print('Mang sau khi SX: ', a)
16
3.4. Searching Algorithms
3.4.1. Sequential Searching Algorithms (tìm kiếm tuần tự)
INPUT: n, a0, a1, .., an-1 và x
OUTPUT:
1) Có x trong a không?
2) Nếu có x trong a thì nó ở những vị trí nào
#Nhap mang
n = int (input('Nhap so phan tu mang: '))
a = [0] * n
print('Hay nhap ',n,' phan tu cua mang tren cung 1
dong:')
a = [int(x) for x in input().split()]
x = int(input('Hay nhap x: '))
#Tim kiem tuan tu
for i in range(0,n): #ngam hieu i = 0, 1, ..., n-1
if x == a[i]:
found = True
if not found:
print('Khong co ',x,' trong mang a')
else:
print('Co ',x,' trong mang a, tai cac vi tri: ',
end ='')
for i in range(0,n):
if a[i]==x:
print(i,',', end ='')
3.4.1. Binary Searching Algorithms (tìm kiếm nhị phân)
INPUT: n, a0, a1, .., an-1 đã được sắp xếp tăng và x
OUTPUT: Có x trong a không?
n = 10, x = 8
a = {2, 3, 4, 4, 5, 6, 7, 8, 9, 9}
d = 0, c = n – 1
Lặp quá trình sau khi L <= R và Chưa tìm thấy x (Found = False)
m = (d + c) / 2
Nếu a[m] = x Thì Found = True
17
Nếu x > a[m] Thì L = M + 1
Nếu x < a[m] Thì R = M - 1
Nhận xét:
- Sau lần 1: quãng duyệt còn ½
- Sau lần 2: quãng duyệt còn ¼
- ….
- Sau lần k: quãng duyệt còn 1/2k
Chương trình
#Nhap mang
n = int (input('Nhap so phan tu mang: '))
a = [0] * n
print('Hay nhap ',n,' phan tu cua mang tren 1 dong:')
a = [int(x) for x in input().split()]
x = int(input('Hay nhap x: '))
#Tim kiem nhi phan
Found = False
L = 0
R = n - 1
while L <= R and not Found:
m = (L + R)// 2
if x == a[m]:
Found = True
elif x > a[m]:
L = m + 1
else:
R = m - 1
if not Found:
print('Khong co ',x,' trong mang a')
else:
print('Co ',x,' trong mang a')
M L R
L R M
18
3.5. Using 2-dimension array
3.5.1. Mẫu nhập mảng và in mảng
#Nhap mang
m, n = map(int, input('nhap so hang va so cot cua mang: ').split())
a = [0] * m
for i in range(m):
a[i] = [0] * n # de tao mang 2 chieu m * n
for j in range(n):
print('Nhap a[',i,',',j,']= ', end='')
a[i][j] = int(input())
#in mang
print('Mang vua nhap la:')
for i in range(m):
for j in range(n):
print(a[i][j],' ',end='')
print('')
Hãy thử thay đoạn chương trình in mảng bằng một trong 2 cách sau và
cho nhận xét
Cách 2
print('Mang vua nhap la:', a)
Cách 3: Cách thường dùng nếu chỉ để in ra mảng 2 chiều
print('Mang vua nhap la:')
for i in range(m):
print(a[i])
3.5.1. Duyệt và tính toán trong mảng
Ex1
Người ta vận chuyển hàng từ m kho đến n cửa hàng
1) Nhập số hàng từ m kho đến n cửa hàng (kho: xuất; cửa hàng: nhập)
2) In ra bảng dữ liệu đã nhập
3) Tính tổng số hàng xuất của từng kho
4) Tính tổng số hàng nhập của từng cửa hàng
5) Tìm xem kho nào xuất được nhiều hàng nhất, cụ thể bao nhiêu
m = 3 kho hàng, n = 4 cửa hàng
0 1 2 3
0 50 70 80 60
1 20 30 50 40
2 55 44 22 33
Sửa dữ liệu hàng thứ 3 là
2 90 90 20 60
Câu 1: Nhập mảng 2 chiều a[m n]
Câu 2: In mảng 2 chiều a
Kết quả có dạng
19
So luong hang tu 3 kho den 4 cua hang la:
[50, 70, 80, 60]
[20, 30, 50, 40]
[55, 44, 22, 33]
Câu 3: Tính tổng các phần tử của từng hàng và in ra
Kết quả là:
Tong so hang XUAT tu cac KHO la:
Kho 1 : 260
Kho 2 : 140
Kho 3 : 154
Câu 4: Tính tổng các phần tử của từng cột và in ra
Kết quả là:
Tong so hang ma tung cua hang duoc NHAP la:
Cua hang 1 : 125
Cua hang 2 : 144
Cua hang 3 : 152
Cua hang 4 : 133
Câu 5: Liên quan đến câu 3: Tìm tổng các phần tử của các hàng và đưa ra chỉ số của các hàng
mà có tổng lớn nhất , và in ra tổng lớn nhất đó:
Kết quả là:
Cau 5: Ten cac Kho hang XUAT voi so luong nhieu nhat la 1 , 3 ,
So luong lon nhat la: 260
Chương trình:
#Cau 1: Nhap mang
m, n = map(int, input('nhap so hang va so cot cua
mang: ').split())
a = [0] * m
for i in range(m):
a[i] = [0] * n # de tao mang 2 chieu m * n
print('Nhap so luong hang XUAT tu kho thu
',i+1)
for j in range(n):
print('cua hang ',j+1,' :',end='')
a[i][j] = int(input())
#Cau 2: In mang
print('Cau 2: So luong hang tu ',m,' kho den ',n,'
20
cua hang la:')
for i in range(m):
print(a[i])
#Cau 3 va mot phan cau 5
#Tinh tong cac phan tu tren tung hang va tinh tong
lon nhat
print('Cau 3: Tong so hang XUAT tu cac KHO la:')
maxh = 0
for i in range(m):
tong = 0
for j in range(n):
tong += a[i][j]
print('Kho ',i+1,':',tong)
if maxh < tong:
maxh = tong
#Cau 4: Tinh tong cac phan tu tren tung cot
print('Cau 4: Tong so hang ma tung cua hang duoc
NHAP la:')
for j in range(n):
tong = 0
for i in range(m):
tong += a[i][j]
print('Cua hang ',j+1,': ',tong)
#Cau 5: Dua ra ten kho hang XUAT voi so luong lon
nhat
print('Cau 5: Ten cac Kho hang XUAT voi so luong
nhieu nhat la ', end='')
for i in range(m):
tong = 0
for j in range(n):
tong += a[i][j]
if tong == maxh:
print(i+1,' ,',end='')
print('')
print('So luong lon nhat la: ', maxh)
Ex2
Người ta vận chuyển hàng từ m kho đến n cửa hàng
1) Nhập số hàng từ m kho đến n cửa hàng
2) In ra bảng dữ liệu đã nhập
21
3) Đưa ra các cửa hàng và số lượng hàng nhập tương ứng nếu số lượng hàng nhập của
chúng lớn hơn trung bình cộng lượng hàng nhập của các cửa hàng
4) Đưa ra các kho và số lượng hàng xuất tương ứng được sắp xếp tăng dần theo số lượng
hàng
Ex3
Tại một thời điểm có m máy chủ cùng chuyển các gói tin của mình đến n trạm
1) Nhập số gói tin của từng máy chủ đến n trạm
2) Người ta gọi hiệu năng của một máy chủ là số lượng gói tin ít nhất mà một trạm nhận
được khi so sánh với số gói tin của các trạm khác nhận được từ máy chủ này. Hãy tìm
máy chủ có hiệu năng cao nhất và cụ thể là bao nhiêu?
CHAPTER 4. FILE ACCESS (TEXT FILE)
4.1. Các khái niệm cơ bản
4.1.1. File là gì?
- File là một tập hợp dữ liệu (số hoặc văn bản) được lưu trữ trên bộ nhớ ngoài (HDD, SSD,
USB, Clouds)
- File được xác định bởi tên và vị trí. Tên gồm tên chính và phần đặc trưng. Phần đặc trưng
chỉ ra kiểu của file: .bat, .com, .exe, .bin, .txt, .doc, mp3, .jpg, …
4.1.2. File văn bản
- File văn bản là những file có nội dung là văn bản đơn thuần (gồm các kí tự và các chữ số)
đọc được bởi các ứng dụng xử lí văn bản như Notepad, MS.Word
- Ví dụ phần đặc trưng (đuôi ) file văn bản: .txt, .pas, .py, .html, .cpp
4.1.3. File nhị phân
- File nhị phân là những file có nội dung được mã hóa nhị phân.
- Phần lớn các file đa phương tiện là file nhị phân: pictures, videos, music
- Ví dụ phần đuôi file: pictures (.jpg, .png, .bmp), videos (.avi, .mp4), music (.wav, .mp3)
4.2. Truy cập file văn bản trong python
Qui tắc chung
Truy cập file để ĐỌC Truy cập file để GHI
Giả sử tên biến file là fi
s là một biến kiểu string
Giả sử tên biến file là fo
s là một biến có kiểu dữ liệu nào đó
Mở
file
Mở file để đọc dữ liệu từ file ra biến
Cách 1:
fi = open(„Tên file‟, „r‟)
Cách 2:
Mở file để ghi dữ liệu từ biến vào file
Cách 1:
fo = open(„Tên file‟, „wt‟)
Cách 2:
22
with open(„Tên file‟, „r‟) as fi with open(„Tên file‟, „wt‟) as fo
Truy
cập
file
Đọc tất cả dòng của file ra biến
s = fi.read()
Đọc dòng hiện tại của file ra biến
s = fi.readline()
Ghi dữ liệu từ biến hoặc biểu thức vào
dòng hiện tại của file
print(s, file = fo)
print(biểu_thức_cụ_thể, file = fo)
Đóng
file
fi.close() fo.close()
Chú ý: Lệnh đọc file read() và readline() đọc cả kí tự xuống dòng ra biến
Ví dụ 1: Đọc dữ liệu văn bản từ file
Giả ta có tệp văn bản sau:
DSHS.TXT
Nguyen Thu Thao
Do Anh Van
Le Hai Binh
Chương trình sau đọc tệp nội dung tệp và in lên màn hình
Cách 1 Cách 2
fi = open('DSHS.TXT','r')
#doc tat ca cac dong cua
file ra mot bien
s = fi.read()
print(s)
fi.close()
fi = open('DSHS.TXT','r')
#doc tung dong cua file
ra bien
while True:
s = fi.readline()
print(s, end='')
if not s:
break
fi.close()
Ví dụ 2: Giải bài tập 2 với dữ liệu vào/ra từ file
Người ta vận chuyển hàng từ m kho đến n cửa hàng
1) Nhập số hàng từ m kho đến n cửa hàng
2) In ra bảng dữ liệu đã nhập
3) Đưa ra các cửa hàng và số lượng hàng nhập tương ứng nếu số lượng hàng nhập của
chúng lớn hơn trung bình cộng lượng hàng nhập của các cửa hàng
4) Đưa ra các kho và số lượng hàng xuất tương ứng được sắp xếp tăng dần theo tổng số
lượng hàng xuất của từng kho
Các dữ liệu vào/ra tương ứng trong các tệp MATHANG.TXT và KETQUA.TXT được ghi
theo định dạng như bảng sau.
MATHANG.TXT KETQUA.TXT
4 5
10 50 30 20 40
Cau 2
4 5
23
44 22 55 33 66
21 61 31 71 11
22 52 32 12 32
10 50 30 20 40
44 22 55 33 66
21 61 31 71 11
22 52 32 12 32
Câu 1: Đọc dữ liệu số liệu từ file
Đoạn chương trình đọc dữ liệu từ tệp trên ra các biến m, n và mảng a[m n] như sau:
fi = open('MATHANG.TXT','rt')
line1 = fi.readline()
m, n = map(int, line1.split())
a = [0]*m
for i in range(m):
a[i] = [0]*n
line2 = fi.readline()
j = 0
for k in map(int, line2.split()):
a[i][j] = k
j = j + 1
fi.close()
Câu 2: In dữ liệu từ m, n và mảng a vào file
#Cau 2
fo = open('KETQUA.TXT','w')
print('Cau 2 ', file = fo)
print(m,' ',n, file = fo)
for i in range(m):
for j in range(n):
print(a[i][j],' ',end='', file = fo)
print('', file = fo)
#Cau 3
#Cau 4
fo.close()
Lưu ý: Vì tất cả các dữ liệu cần tính toán được ghi vào file KETQUA.TXT nên làm xong các
câu 3 và câu 4 mới dùng lệnh fo.close()
Câu 3: In ra số hiệu các mặt hàng có số lượng hàng nhập > TBC số lượng hàng
#Viec 1: Tinh tbc luong hang nhap
tbc = 0
for j in range(n):
for i in range(m):
tbc += a[i][j]
24
tbc /= n
#Viec 2: Dua ra cac cua hang co so luong nhap > tbc
print('Cau 3', file = fo)
for j in range(n):
s = 0
for i in range(m):
s += a[i][j]
if s > tbc:
print(j+1,', ', end ='', file = fo )
Câu 3: In ra số hiệu các mặt hàng có số lượng hàng nhập > TBC số lượng hàng
#Cau 4
#Viec 1: Tinh toan
ten = [0]*m
sl = [0]*m
for i in range(m):
s = 0
for j in range(n):
s += a[i][j]
ten[i] = i+1
sl[i] = s
#Viec 2: Sap xep
for i in range(0,m-1):
for j in range(i+1,m):
if sl[j] < sl[i]:
tg1 = sl[i]
sl[i] = sl[j]
sl[j] = tg1
tg2 = ten[i]
ten[i] = ten[j]
ten[j] = tg2
#Viec 3: In cac mang ten, sl ra file
print('\nCau 4', file = fo)
for i in range(m):
print(ten[i], ' ', sl[i], file = fo)
fo.close()
Dặn SV: Tuần sau KT bài tập dạng Ex2 và Ex3 nhưng DL vào/ra là file văn bản