Nếu điều kiện (conditions) nào đó xảy ra thì ta sẽ làm gì? Câu lệnh (starement) IF có dạng như sau: (câu lệnh là những dòng lệnh bạn viết trong chương trình)
If condition
những câu lệnh thụt vào (indented statements)
Cái điều kiện cần thoả mãn thường là một biểu thức Boole (Boolean expression) tức là máy sẽ test xem điều kiện đó Đúng (True) hay Sai (false). Nếu đúng (True: (thoả mãn) thì thi hành những câu lệnh bao hàm và thụt vào bên dưới dòng lệnh IF. Nếu không (False) thì bỏ qua không thi hành những lệnh đó mà tiếp tục phần còn lại của chương trình.
Bạn xem thí dụ với chương trình sau đây sẽ thấy ứng dụng của lệnh IF.
# IfSpiral.py - Thí dụ về câu lệnh IF import turtle t = turtle.Pen() t.width(2) # bề dầy của “con ruà” (cây bút) là 2 pixels answer = input("Do you want to see a spiral? y/n:") # nhấn y nếu đúng và n nếu không if answer == 'y': # dấu == có nghiã là equal, là bằng, trong Python print("Working...") # để ra chữ này,Working…, cho biết máy đang làm việc # loop for dưới này là để in (đúng ra là display cho hiện ra) trên màn hình vòng xoắn ốc hình vuông for x in range(100): t.forward(x*2) t.left(89) print("Okay, we're done!") # xong rồi.
Trong thí dụ này máy hỏi bạn có muốn in hình xoắn ốc vuông không? Nếu muốn, bạn nhấn y trên bàn phím, nó sẽ vẽ hình bằng vòng lặp for bên dưới, đúng 100 hình vuông thì nó ra khỏi vòng và báo xong. Nếu bạn nhấn n thì điều kiện không thoả mãn (false), máy không thi hành vòng lặp for mà nhảy ra ngoài vòng, thi hành dòng cuối cho biết đã xong chương trình.
Bài tập: Sửa lại chương trình bằng cách: nếu trả lời yeah thì máy sẽ in vòng xoắn tròn có màu bằng chương trình XoanocTronNenDen ở chương 2. Nếu không, trả lời no. Cho chạy thử chương trình.
Những Toán Tử so sánh (comparison operators) của biểu thức Boole trong Python.
Xem bảng sau:
Và xem chương trình sau để thấy ứng dụng của câu lệnh IF và các toán tử của biểu thức Boole: trong chương trình này bạn cho tuổi bạn, và tuổi có quyền lái xe ở điạ phương bạn. Máy (Python) sẽ cho bạn biết bạn đủ tuổi chưa hay còn bao năm nữa mới được lái xe.
# OldEnoughOrElse.py - Để xem bạn đủ tuổi lái xe chưa? driving_age = eval(input("What is the legal driving age where you live? ")) # Máy hỏi ở chỗ bạn tuổi được phép lái xe your_age = eval(input("How old are you? ")) # Hàm eval bạn đã biết trong chương trước if your_age >= driving_age: # nếu tuổi bạn lớn hơn hay bằng tuổi được phép lái thì: print("You're old enough to drive!") # máy cho biết bạn đủ tuổi lái xe else: # nếu không, thì: print("Sorry, you can drive in", driving_age - your_age, "years.") # máy sẽ cho bạn biết bạn còn bao năm nữa mới được lái.
if your_age < driving_age: # nếu tuổi bạn nhỏ hơn tuổi cho phép thì:
print(“Sorry, you can drive in”, driving_age – your_age, “years.”) # máy sẽ cho bạn biết bạn còn bao năm nữa mới được lái.
Câu lệnh if …>= ….cho bạn thấy ứng dụng rõ ràng của lệnh if và toán tử.
LỆNH ELSE (ELSE STATEMENT)
Nếu điều kiện (condition) không thoả thì….(else) …Lệnh này phối hợp lệnh IF có dạng tổng quát như sau:
else
div style=”text-indent: 32px;”>Other Indented statements (những câu lệnh thụt vào kh ác)
Lấy lại ví dụ trên để thấy ứng dụng của lệnh else:
# OldEnoughOrElse.py - Để xem bạn đủ tuổi lái xe chưa? driving_age = eval(input("What is the legal driving age where you live? ")) # Máy hỏi ở chỗ bạn tuổi được phép lái xe your_age = eval(input("How old are you? ")) # Hàm eval bạn đã biết trong chương trước if your_age >= driving_age: # nếu tuổi bạn lớn hơn hay bằng tuổi được phép lái thì: print("You're old enough to drive!") # máy cho biết bạn đủ tuổi lái xe else: # nếu không, thì: print("Sorry, you can drive in", driving_age - your_age, "years.") # máy sẽ cho bạn biết bạn còn bao năm nữa mới được lái.
MỘT SỐ VÍ DỤ KHÁC
1) CHỌN VẼ ĐA GIÁC HAY HOA HỒNG?
# PolygonOrRosette.py # để bạn chọn vẽ đa giác hay hoa hồng import turtle t = turtle.Pen() # Hỏi bạn bao nhiêu cạnh hay vòng tròn, định sẵn là 6 number = int(turtle.numinput("Number of sides or circles", "How many sides or circles in your shape?", 6)) # Hỏi bạn muốn vẽ đa giác hay hoa hồng shape = turtle.textinput("Which shape do you want?", "Enter 'p' for polygon or 'r' for rosette:") # gõ p là chọn đa giác, r là chọn hoa hồng for x in range(number): if shape == 'r': # bạn chọn hoa hồng t.circle(100) else: # Định sẵn là đa giác t.forward (150) t.left(360/number)
2) CHỌN MỘT SỐ CHẴN (EVEN) ĐẺ VẼ HOA HỒNG HAY SỐ LẺ (ODD) ĐỂ VẼ ĐA GIÁC.
Trong ví dụ này ta cho biến m của vòng lặp for đi từ 5 tới 75. Nếu (IF) m%2 là số chẵn (even) ta cho rùa vẽ hoa hồng, nếu không (ELSE) thì vẽ đa gíác tuỳ theo số cạnh (sides).
# RosettesAndPolygons.py - vẽ vòng xoắn ốc đa giác hay hoa hồng import turtle t = turtle.Pen() # Hỏi bạn số cạnh đa giác, chương trình định sẵn là 4 sides = int(turtle.numinput("Number of sides", "How many sides in your spiral?", 4)) # Vòng lặp ngoài cho các đa giác và các hoa hồng với size từ 5 tới 75: for m in range(5,75) : # vòng lặp ngoài t.left(360/sides + 5) t.width(m//25+1) # bề dầy con rùa mỗi lúc một to ra t.penup() # Nhắc bút khỏi màn hình t.forward(m*4) # Di chuyển đến góc kế đó t.pendown() # Sẵn sàng để vẽ # Vẽ một bông hồng nhỏ ở mỗi góc chẵn (Even corner) của vòng xoắn ốc: if (m % 2 == 0): # m % 2 == 0 nghiã là m modulo cho 2 bằng 0 tức là không có số dư (là even, là chẵn) for n in range(sides) : t.circle(m/3) # bán kính vòng tròn là m/3 t.right(360/sides) # rùa quẹo phải 1 góc 360/sides độ # Hay là vẽ một đa giác nhỏ ở mỗi góc Lẻ (odd corner) của vòng xoắn ốc: else: # nếu không for n in range(sides): t.forward(m) t.right(360/sides)
Cho Run, với 4 cạnh kết quả sẽ là hình trên của hình 5-2 dưới đây và với 5 cạnh sẽ có hình dưới của hình 5-2 như sau:
LỆNH ELIF (ELIF STATEMENTS
ELIF có nghiã là else if thường đi cặp với các lệnh – IF ELSE khi ta cần kiểm soát thêm nhiều điều kiện nữa. Ví dụ sau đây cho bạn thấy ứng dụng của lệnh ELIF.
Những dòng # là chú thích (comments) để giải thích dòng lệnh, bạn không cần gõ cũng được. Những chữ đậm cũng chỉ để nhấn mạnh những lệnh bạn cần chú ý, nhất là những lệnh IF, ELSE, ELIF, bạn không cần gõ thành chữ đậm (bold).
#WhatsMyGrade.py - Xếp hạng học sinh có thưởng import turtle name=input("Please type in your name or press Enter to quit: ") # bạn cho tên while name != "": # trong khi bạn chưa bấm ENTER : Vòng lặp while loop grade = eval(input("Enter a score (0-100): ")) # bạn cho điểm mình vào máy if grade >= 90: # nếu điểm bạn lớn hơn hay bằng 90 print(name, "You got an A! You won a 40$ toy!") # bạn được điểm A và 40$ elif grade >= 80: # nếu không, điểm bạn có lớn hơn hay bằng 80 print(name, "You got an B! You won a 30$ toy!") # bạn được điểm B và 30$ elif grade >= 70: # nếu không nữa, nếu điểm bạn lớn hơn hay bằng 70 print(name, "You got an C! You won a 20$ toy!") # bạn được điểm C và 20$ elif grade >= 60: # nếu không phải nữa và nếu điểm bạn lớn hơn hay bằng 60 print(name, "You got an D! You won a 10$ toy!") # bạn được điểm D và 10$ elif grade >= 50: # nếu không phải nữa, và nếu điểm bạn lớn hơn hay bằng 50 print(name, "You got an E... You got nothing.") # bạn được điểm E và chẳng được gì else: # ngoài những điểm trên tức là dưới 50 điểm print(name, "You got an F. Tell your parents to see the teacher!") # bạn được điểm F, bạn mời bố mẹ đến gặp thầy, cô! print() name=input("Next student - Please type in your name or press Enter to quit:") # Cho tên bạn khác và trở lên vòng lặp while hay nhấn ENTER để thôi
NHỮNG LỆNH PHỨC TẠP HƠN: IF, AND, OR và NOT
IF: Nếu
AND: điều kiện 1 VÀ điều kiện 2 đều được thoả
OR: điều kiện 1 HOẶC điều kiện 2 được thoả
NOT: Nếu điều kiện này KHÔNG xảy ra
Bạn xem bảng tóm tắt sau:
Ví dụ ứng dụng:
# WhatToWear.py rainy = input("How's the weather? Is it raining? (y/n)").lower() # Hỏi có mưa không? cold = input("Is it cold outside? (y/n)").lower() # Hỏi có lạnh không? if (rainy == 'y' and cold == 'y'): # nếu có mưa và lạnh nữa: Tệ quá! print("You'd better wear a raincoat.") # Bạn nên khoác áo mưa elif (rainy == 'y' and cold != 'y'): # nếu không, và nếu có mưa và không lạnh print("Carry an umbrella with you.") # bạn nên mang dù theo elif (rainy != 'y' and cold == 'y'): # nếu không nữa, và nếu không mưa và có lạnh print("Put on a jacket, it's cold out!") # bạn hãy khoác jacket vào, trời lạnh đó elif (rainy != 'y' and cold != 'y'): # Không mưa, ấm và có nắng, Tốt! print("Wear whatever you want, it's beautiful outside!") # Đẹp trời, bạn muốn mặc gì thì mặc
Chú thích: == dấu bằng (equal) đừng lầm với một dấu = là assign, là gán một trị (value) vào Biến (variable).
!= Không bằng, không là
Hàm lower(): để chắc chắn khi bạn bấm trả lời y hay n thì hàm này chuyển nó thành lower case (chữ thường) hết cho dù bạn bấm trả lời là upper case Y hay N hay y/n.
Bài tập: viết chương trình có tên là #reactine.py với những đòi hỏi sau: cho tên bạn vào máy, cho tuổi bạn. Nếu bạn dưới 12 tuổi báo “bạn không được uống reactine”. Nếu bạn lớn hơn hay bằng 12 tuổi: cho máy hỏi bạn có bầu hay có bệnh gan, thận gì không?. Nếy bạn nói có (gõ Y) thì máy bảo “Đừng uống reactine nếu bạn chưa muốn chết”. Nếu không, nếu bạn dưới 65 tuổi và nếu bạn trả lời “N” cho câu hỏi về sức khoẻ thì máy cho toa: “Bạn uống 1 viên mỗi 24 giờ bất cứ giờ nào trong ngày”. Còn nếu bạn từ 65 tuổi trở lên thì báo cho bạn là: “ uống reactine loại thường viên 5mg hay hỏi Bác sĩ”. Sau cùng cho tên bạn nữa vào rồi tiếp tục vòng lặp While hay bấm ENTER để quit.
Bạn thử Run coi chương trình bạn viết có chạy được không?. Nếu không, hay xem “thuốc giải” sau đây để so sánh và tìm lỗi.
BỘ MÃ SỐ ASCII VÀ TRÒ CHƠI MẬT MÃ CAESAR CIPHER.
- ASCII = American Standard Code for Information Interchange.
Xin xem bảng mã của ASCII dưới đây:
Giá trị bằng Số (numeric value) cho các ký tự (characters) của bộ mã số ASCII
Trong bảng mã ASCII này, các ký hiệu được gọi là symbols (cột symbol) gồm các chữ alphabet từ A đến Z, các ký tự đặc biệt (special characters) như ! dấu , dấu . dấu &, dấu $ dấu <, > , =, ?, & ; các số (numbers ) từ 0 đến 9 v.v…Các symbols này được gán cho trị tương ứng bằng số ở cột Value. Tên của chúng ở cột Description. Thí dụ chữ K được gán cho trị bằng số là 75, số 2 được gán value là 50 v.v..
Muốn chuyển từ value sang symbol, ta dùng hàm chr(). Thí dụ chr(90) sẽ là Z. Chr(51) là số 3, chr(60) là dấu < ….Ngược lại muốn chuyển một symbol sang value ta dùng hàm ord(). Thí dụ ord(‘A’) sẽ cho value là 65, ord(‘2’) sẽ cho value là 90….
2) MẬT MÃ CỦA CAESAR, một trò chơi “thú vị”
Hoàng đế La Mã Julius Ceasar hay chơi trò mật mã mà hậu thế cho cái tên Caesar Cipher. Thay vì viết chữ A, ông ta cho nhích tới 13 chữ kế để có chữ N, chữ H thành chữ U, chữ L thành chữ Y v.v…Xem hình:
Vòng ngoài là chữ capital (chữ in, chữ hoa) từ A đến Z. Vòng trong là chữ đã bị Ceasar đổi thành chữ tương đương dùng làm mật mã. Nhận xét: Nếu vòng ngoài là chữ M thì tương đương với chữ Z của mật mã của vòng trong là chữ cuối cùng rồi. Vậy muốn mã hóa chữ N ta phải đi vòng lại chữ A lần nữa, chữ O phải đi vòng tới chữ B và cứ như thế…Trong thí dụ này ta cho nhích tới 13 chữ. Bạn muốn 4, 5, 7, 10…tùy ý. Miễn là người nhận dòng chữ mật mã thoả thuận với nhau là đủ. Sau đây là chương trình thực hiện trò làm mật mã và giải mã của Caesar:
# EncoderDecoder.py message = input("Enter a message to encode or decode: ") # Cho dòng tin tức muốn chuyển thành mật mã vào message = message.upper() # Chuyển hết tin tức trong biến message thành UPPERCASE :) output = "" # Tạo một vùng chuỗi (string) trống rỗng để chứa kết quả xuất ra có tên là output for letter in message: # Loop qua mỗi chữ của tin đã đưa vào if letter.isupper(): # Nếu chữ có trong mẫu tự từ A-Z, value = ord(letter) + 13 # nhích trị của chữ (value) ở cột value tới 13 nữa letter = chr(value) # chuyển trị cuả chữ trở lại thành một chữ, if not letter.isupper(): # và check coi mình có nhích đi quá xa không value -= 26 # Nếu có, cho quay vòng trở lại từ A->Z # bằng cách – 26 vào trị của chữ letter = chr(value) # chuyển trị lại thành chữ output += letter # Thêm chữ vừa được mã hoá vào chuỗi xuất print("Output message: ", output) # Cho xuất (in ra hay display) tin tức đã được mã hóa/giải mã lên màn hình.
Chú thích thêm: if not letter.isupper(): có nghiã là test chữ chứa trong letter có còn là chữ từ A đến Z không. Chữ đậm là của Python.
Bài tập: Run-> Run module bài này rồi cho vào hàng chữ: v ybir lbh qneyvat. Sẽ thấy ra dòng chữ gì? Sau đó cho Run lại rồi cho lại kết quả vừa rồi vào lại từ bàn phím, bạn sẽ có lại dòng chữ v ybir lbh qneyvat. Có thể thử sửa lại chương trình cho nhích lại 5 chữ thôi. Trong gián điệp, để bảo mật tin tức bạn có thể cho vào dòng chữ, thí dụ The enemy is coming today. Nếu nhích 13 chữ thì máy sẽ mã hóa là GUR RARZL VF PBZVAT GBQNL rồi bạn gởi dòng chữ này cho quân bạn. Với máy điện toán có Python và có chương trình này quân bạn sẽ cho dòng chữ này vào máy sẽ thấy báo The enemy is coming today. (Quân thù sẽ đến ngày hôm nay). Bạn không cần lưu tâm chữ lower hay upper case vì với lệnh message.upper() Python sẽ chuyển đổi tất cả trong message thành upper case.
HẾT CHƯƠNG V