Friday, January 1, 2010

Python Programming

Condition Statement and Function
ประพัฒน์ สุริยผล

ครั้งนี้ เราจะเขียนโปรแกรมต่อจากครั้งที่แล้ว เราต้องการให้โปรแกรมของเราทำงานได้ซับซ้อนขึ้น สามารถคำนวณได้ทั้งพื้นที่สี่เหลี่ยมและสามเหลี่ยม โดยถามผู้ใช้ว่าต้องการคำนวณพื้นที่อะไร ก่อนที่จะคำนวณ

เราพอจะคิดขั้นตอนการทำงานได้คร่าวๆ ดังนี้ ถามผู้ใช้ว่าต้องการคำนวณพื้นที่ของอะไร ถ้าผู้ใช้กด R แสดงว่าต้องการคำนวณสี่เหลี่ยม ถ้าผู้ใช้กด T แสดงว่าต้องการคำนวณสามเหลี่ยม

จากกระบวนการคิดข้างต้นเราพอจะนำมาเขียนเป็น python code ได้ดังนี้

choice = raw_input("Which type of area you would like to calculate (R/T)? -> ")
if choice == "R":
____calculateRectangle
if choice == "T":
____calculateTriangle

สังเกตรูปแบบการใช้งานคำสั่ง if คำสั่ง if จะตามด้วยเงื่อนไขที่ต้องการใช้ในการเปรียบเทียบ สัญลักษณ์ที่ใช้ในการเปรียบเทียบส่วนใหญ่จะเป็นดังนี้

== หมายถึง เท่ากับ (สังเกตว่า python ใช้เครื่องหมายเท่ากับสองตัวติดกัน เพื่อให้แตกต่างจากการใช้เครื่องหมายเท่ากับอันเดียว ที่หมายถึงการกำหนดค่า)

!= หมายถึง ไม่เท่ากับ

> หมายถึง มากกว่า

< หมายถึง น้อยกว่า

<= หมายถึง น้อยกว่าหรือเท่ากับ

>= หมายถึง มากกว่าหรือเท่ากับ

หลังจากพิจารณา code ที่เขียนไว้ด้านบนแล้ว นึกได้ว่า อาจจะไม่สะดวกกับผู้ใช้ที่จะต้องกด R หรือ T ตัวใหญ่ เพื่อใช้งานโปรแกรม บางครั้ง ผู้ใช้อาจจะกด r หรือ t ตัวเล็ก ก็ได้ ซึ่งถ้าหากเราไม่แก้ไขโปรแกรม การที่ผู้ใช้กดปุ่ม r หรือ t ตัวเล็ก จะไม่ตรงเงื่อนไขใดๆ เลย โปรแกรมก็จะไม่ทำงานตามที่ผู้ใช้ต้องการ เราจึงแก้ไข code เป็นดังนี้

choice = raw_input("Which type of area you would like to calculate (R/T)? -> ")
if choice == "R" or choice == "r":
____calculateRectangle
if choice == "T" or choice == "t":
____calculateTriangle

จะเห็นว่าเราสามารถเพิ่มเงื่อนไขได้ โดยตัวเชื่อมที่สามารถใช้ส่วนใหญ่ คือ
(1) and หมายถึง เงื่่อนไขทั้งสองข้างของ and ต้องเป็นจริง ผลลัพธ์ของเงื่อนไขจึงจะออกมาเป็นจริง
(2) or หมายถึง เงื่อนไขข้างใดข้างหนึ่งของ or เป็นจริงก็จะทำให้ผลลัพธ์ของเงื่อนไขเป็นจริง

เมื่อเราได้ค่าดังนี้ เราก็นำส่วนที่เราเขียนเอาไว้มาแทนตรงตำแหน่งที่เราวางไว้ อย่างเช่น การคำนวณสี่เหลี่ยม

choice = raw_input("Which type of area you would like to calculate (R/T)? -> ")
if choice == "R" or choice == "r":
____print "Program to calculate Area of Rectangle"
____base = raw_input("Please enter base -> ")
____height = raw_input("Please enter height -> ")
____base_int = int(base)
____height_int = int(height)
____print "Rectangle area of base", base, "and height", height, "is", base_int*height_int
if choice == "T" or choice == "t":
____calculateTriangle

แบบฝึกหัด

1. แก้ไขโปรแกรม ให้ครบถ้วน โดยเพิ่มส่วนของการคำนวณสามเหลี่ยมเข้าไป แล้วลองรันโปรแกรมดูว่าทำงานได้อย่างที่ต้องการหรือเปล่า

2. เพิ่มส่วนของการคำนวณพื้นที่วงกลมเข้าไป สูตรพื้นที่วงกลมคือ 3.14159 * radius^2 โดยถ้าผู้ใช้กดปุ่ม C ตัวเล็กหรือตัวใหญ่ให้คำนวณพื้นที่วงกลมออกมา ข้อสังเกตคือการคำนวณพื้นที่วงกลม ต้องการแค่รัศมีอย่างเดียว

3. เพื่อให้โปรแกรมดูดีขึ้น ให้พิมพ์บอกผู้ใช้ว่า Please type R, T or C to choose the type of area to calculate ถ้าหากว่าผู้ใช้ไม่ได้กดปุ่มดังกล่าว แต่ถ้าหากผู้ใช้กดปุ่มดังกล่าว และคำนวณผลได้ตามปกติ ก็ไม่ต้องพิมพ์ข้อความนี้บอกผู้ใช้ (hint:- ใช้เครื่องหมาย != ในเงื่อนไข)

Function

หลังจากนั่งเขียนโปรแกรมหาพื้นที่รูปร่างต่างๆ มาสองครั้ง อาจารย์จอมจู้จี้ยังอยากให้เพิ่มความสามารถของโปรแกรมขึ้นไปอีก ด้วยการหาพื้นที่สี่เหลี่ยมคางหมู (trapezoids)

สูตรการหาพื้นที่สี่เหลี่ยมคางหมูคือ 1/2 * ผลบวกของด้านคู่ขนาน * ความสูง

ด้านคู่ขนานใช้คำว่า parallel base

ตัวอักษรที่จะใช้เลือก ตอนแรกคิดว่าจะให้เป็น T แต่ว่า T ถูกใช้ไปแล้วกับรูปร่างสามเหลี่ยม จึงเป็น Z แทน

ทำไปทำมาโปรแกรมเริ่มจะยาว ตรงส่วน if condition ก็เริ่มจะอ่านไม่ง่ายแล้ว เพราะอยู่กระจัดกระจาย

น่าจะมีวิธีที่ทำให้โปรแกรมอ่านง่ายขึ้น ยังจำได้ถึง pseudocode ที่เคยกล่าวถึง

choice = raw_input("Which type of area you would like to calculate (R/T)? -> ")
if choice == "R":
____calculateRectangle
if choice == "T":
____calculateTriangle

ถ้าส่วนในการคำนวณพื้นที่ต่างๆ เขียนไว้แค่นั้นได้ก็คงจะดี ข่าวดีก็คือเราสามารถทำได้ ด้วยการกำหนด function แยกต่างหากออกไป ดังตัวอย่าง

def calculateRectangleArea():
____print "Program to calculate Area of Rectangle"
____base = raw_input("Please enter base -> ")
____height = raw_input("Please enter height -> ")
____base_int = int(base)
____height_int = int(height)
____print "Rectangle area of base", base, "and height", height, "is", base_int*height_int

choice = raw_input("Which type of area you would like to calculate (R/T)? -> ")
if choice == "R":
____calculateRectangleArea()
if choice == "T":
____calculateTriangleArea()

ให้สังเกตการสร้างฟังก์ชัน เราสามารถทำได้ด้วยการใช้ keyword def ตามด้วยชื่อฟังก์ชัน และ () คำสั่งของฟังก์ชันกำหนดอยู่ในบล็อคที่ย่อหน้าไว้ วิธีการเรียกใช้ฟังก์ชัน ทำได้โดยพิมพ์ชื่อฟังก์ชันตามด้วย ()

จุดสำคัญอีกสิ่งหนึ่งคือนิยามของฟังก์ชันจะต้องมาก่อนการเรียกใช้ ฟังก์ชัน เพราะฉะนั้น เราจะนำเอา
def calculateTriangleArea มาไว้ด้านล่างไม่ได้ ต้องเอาไว้ก่อนที่จะมีการเรียกใช้

ด้วยการแยกฟังก์ชันออกมา ทำให้เราเห็นโครงสร้างของ if condition ได้ง่ายขึ้น เราเพิ่มส่วนในการคำนวณพื้นที่สี่เหลี่ยมคางหมูได้ง่ายขึ้น

แบบฝึกหัด

แปลงส่วนที่คำนวณพื้นที่ทั้งหมด ให้แยกออกมาเป็นฟังก์ชัน เพื่อให้โปรแกรมอ่านง่ายและแก้ไขได้ง่ายขึ้น เมื่อเสร็จสิ้นในส่วนนี้ โปรแกรมควรจะสามารถคำนวณพื้นที่สี่เหลี่ยม, สามเหลี่ยม, วงกลม และสี่เหลี่ยมคางหมูได้

No comments:

Post a Comment