introduction to python -...

24
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 din tích hcn Tính din tích hình tròn So sánh 2 cách nhp dliu Nhp tng biến, có xung dòng Nhập đồng thi nhiu 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 mt shình 2. Tính thtích mt shình 3. Tính giá trmt sbi u thc 4. Gii 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

Upload: others

Post on 31-Aug-2019

13 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 2: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 3: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 4: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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:

Page 5: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 6: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 7: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 8: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 9: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 10: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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).

Page 11: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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}

Page 12: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 13: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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)

Page 14: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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]

Page 15: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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)

Page 16: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 17: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 18: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 19: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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,'

Page 20: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 21: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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:

Page 22: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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

Page 23: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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]

Page 24: INTRODUCTION TO PYTHON - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/PYTHON/LECTURE NOTE... · INTRODUCTION TO PYTHON Dr. Nguyen Chi Trung (FIT – HNUE) Faculty

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