การทำงานแบบวงวน
ภาควิชาวิศวกรรมคอมพิวเตอร์
จุฬาลงกรณ์มหาวิทยาลัย
๒๕๖๒

ผังงาน (Flowchart)

ผังงานสามแบบ: แบบลำดับ เลือกทำ และวงวน
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
3

วงวน: while

ผังงานวงวน while สองแบบ พร้อมเส้นทางย้อนกลับสีแดง
ต้องมีเครื่องหมาย
:
while
เงื่อนไข
:
กลุ่มคำสั่งที่ทำงานเมื่อเงื่อนไขเป็นจริง
คำสั่งในกลุ่มต้องเยื้องเข้าไปทางขวา ให้ตรงกันหมด
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
4

ตัวอย่าง:

ผลรวมของ (2k-1) ยกกำลังสอง เมื่อ k = 0 ถึง 4 ผังงานของวงวน while ที่บวกสะสมค่า s เมื่อ k น้อยกว่า 5
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
5

ตัวอย่าง:

ผลรวมของ (2k-1) ยกกำลังสอง เมื่อ k = 0 ถึง 4
s = 0
s += (2*0 - 1)**2
s += (2*1 - 1)**2
s += (2*2 - 1)**2
s += (2*3 - 1)**2
s += (2*4 - 1)**2
print(s)
s = 0; k = 0
s += (2*k - 1)**2; k += 1
s += (2*k - 1)**2; k += 1
s += (2*k - 1)**2; k += 1
s += (2*k - 1)**2; k += 1
s += (2*k - 1)**2;
print(s)
s = 0; k = 0

while k < 5 :
    s += (2*k - 1)**2
    k += 1

print(s)
ลูกศรวนซ้ำ ผังงานของวงวน while ที่บวกสะสมค่า s เมื่อ k น้อยกว่า 5
❶
❷
❸
หมุนทำซ้ำ 5 รอบ k เริ่มที่ 0 แต่ละรอบเพิ่ม 1
เมื่อ k เป็น 5 เงื่อนไขเป็นเท็จ ออกจากวงวน
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
6

รูปแบบ: วงวนเพื่อทำชุดคำสั่งซ้ำ ๆ

วงเล็บปีกกา
A
A
A
...
A
ทำซ้ำ
n
ครั้ง
k = 0
while k < n:
    A
    k += 1
k = 1
while k <= n:
    A
    k += 1
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
7

ตัวอย่าง: หาค่าน้อยสุดจากข้อมูล 5 ตัว

min_v = float(input())
v = float(input())
if v < min_v:
    min_v = v
v = float(input())
if v < min_v:
    min_v = v
v = float(input())
if v < min_v:
    min_v = v
v = float(input())
if v < min_v:
    min_v = v
print("min =", min_v)
min_v = float(input())
k = 0
while k < 4:
    v = float(input())
    if v < min_v:
        min_v = v
    k += 1
print("min =", min_v)
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
8

ตัวอย่าง: หาค่าน้อยสุดจากข้อมูลหลายตัว

4
10.0
11.2
15.5
12.4
10.0
11.2
15.5
12.4
q
บอกก่อนว่า
จะต้องรับกี่ตัว
รับจนจบที่ q
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
9

แบบฝึกหัด: หาค่าเฉลี่ยจากข้อมูลหลายตัว

Input           Output
10.0
10.0
11.0
12.0
q
10.75
10.5
q
10.5
q
No Data
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
10

ตัวอย่าง: หารากที่สองด้วยวิธี bisection

2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
11

ตัวอย่าง: หารากที่สองด้วยวิธี bisection

ลูกศรวนซ้ำ
•
ต้องการหารากที่สองของ a
•
ให้ L = 0, U = a
•
คำตอบอยู้ใน [L, U]
•
x = จุดกึ่งกลางของช่วง
•
ทำข้างล่างนี้ซ้ำ ถ้า x
2
≠
a
–
ถ้า x
2
> a:
เปลี่ยนช่วงเป็น [L, x]
–
ถ้า x
2
< a:
เปลี่ยนช่วงเป็น [x, U]
–
x = จุดกึ่งกลางของช่วง
a
= 25
L
U
x
0
25
12.5
0
12.5
6.25
0
6.25
3.125
3.125
6.25
4.6875
4.6875
6.25
5.46875
4.6875
5.46875
5.078125
4.6875
5.078125
4.882813
4.882813
5.078125
4.980469
4.980469
5.078125
5.029297
4.980469
5.029297
5.004883
x เท่ากับ (L + U) หารสอง
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
12

ตัวอย่าง: หารากที่สองด้วยวิธี bisection

ลูกศรวนซ้ำ
•
ต้องการหารากที่สองของ a
•
ให้ L = 0, U = a
•
คำตอบอยู้ใน [L, U]
•
x = จุดกึ่งกลางของช่วง
•
ทำข้างล่างนี้ซ้ำ ถ้า x
2
≠
a
–
ถ้า x
2
> a:
เปลี่ยนช่วงเป็น [L, x]
–
ถ้า x
2
< a:
เปลี่ยนช่วงเป็น [x, U]
–
x = จุดกึ่งกลางของช่วง
a = float(input())
L = 0; U = a
x = (L + U)/2
while x**2 != a:
    if x**2 > a:
        U = x
    else:
        L = x
    x = (L + U)/2
print(x)
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
13

ตัวอย่าง: หารากที่สองด้วยวิธี bisection

a = float(input())
L = 0; U = a
x = (L + U)/2
while x**2 != a:
    if x**2 > a:
        U = x
    else:
        L = x
    x = (L + U)/2
print(x)
a = float(input())
L = 0; U = a
x = (L + U)/2
while
    if x**2 > a:
        U = x
    else:
        L = x
    x = (L + U)/2
print(x)
ยังไม่ใกล้กัน
(x**2,a):
มีปัญหา
a
กับ
b
ยังไม่ใกล้กันเมื่อ
ค่าสัมบูรณ์ของ a ลบ b มากกว่า เอปไซลอน คูณ max(a, b)
ให้
a
กับ
b
เป็นบวก
,
ε
และ
10
-9
abs(a-b) > 1e-9*max(a,b)
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
14

แบบฝึกหัด: หา log10a ด้วย bisection

เขียนโปรแกรมรับ
a
เพื่อหา log
10
a
ด้วย bisection
โดยที่ 1
≤
a
≤
600
ถ้าต้องการให้ท้าทายขึ้น ก็ให้
a
เกิน 600 มาก ๆ ได้
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
15

วงวน for

for k in range(start, stop, step) :
    ...
for c in a_string :
    ...
for e in a_list :
    ...
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
16

แบบที่ 1: for k in range(start, stop, step)

for k in range(4,100,2) :
    ...
k =
4, 6, 8, ..., 98
for k in range(100, 0,-1) :
    ...
k =
100, 99, 98, ..., 1
for k in range(5,100) :
    ...
k =
5, 6, 7, ..., 99
for k in range(100) :
    ...
k =
0, 1, 2, ..., 99
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
17

แบบที่ 1: for k in range(start, stop, step)

ผังงาน: วนค่า i = 0,1,...,n-1 แล้วบวกสะสมลง s ผังงาน: วนค่า i = 2,4,...,30 แล้วบวกสะสมเฉพาะเลขคี่
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
18

ตัวอย่าง: μ และ σ

input
5
10
11
13
10
12
mu เท่ากับผลรวมของ x ตั้งแต่ i = 1 ถึง N หารด้วย N sigma เท่ากับรากที่สองของผลรวม (x ลบ mu) กำลังสอง หารด้วย N
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
20

ตัวอย่าง: Dot Product u·v

1 2 0 2 1
2 2 1 2 2
12.0
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
21

แบบฝึกหัด: ตรวจคำตอบปรนัย

เติมคำสั่งให้นับว่า sol กับ ans มีตัวตรงกันกี่ตัว
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
22

แบบที่ 2: for each_character in a_string

2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
23

ตัวอย่าง: นับจำนวนตัวเลขในสตริง

s = input()
digit_counts = 0
for ch in s:
    if "0" <= ch <= "9":
        digit_counts += 1
print(digit_counts)
แบบนี้ง่ายกว่า
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
24

ตัวอย่าง: สร้างสตริงที่ไม่มีเครื่องหมาย ( [ { } ] )

หยิบออกมาทีละตัว
ถ้าไม่ใช่
( [ { } ] )
ก็ต่อเพิ่มให้กับสตริงผลลัพธ์
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
25

แบบฝึกหัด: [ ] กับ ( )

Input   
Output
[x + (y - z)]
(x + [y - z])
Programming
Programming
สร้างสตริงใหม่ที่
แทนวงเล็บ
( )
ด้วย
[ ]
และ
แทนวงเล็บ
[ ]
ด้วย
( )
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
26

แบบที่ 3: for each_element in a_list

2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
27

ตัวอย่าง: หาค่าเฉลี่ย

Input   
Output
10 20 30 20 10
Average = 18.0
input().split()
["10", "20", "30", "20", "10"]
หยิบมาทีละตัว แปลงเป็น
float แล้วหาค่าเฉลี่ย
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
28

Tips: ใช้ได้กับสตริงและลิสต์

หยิบทีละตัวจากซ้ายไปขวา
for e in x :
    ...
หยิบทีละตัวจากขวามาซ้าย
for e in x[::-1] :
    ...
หยิบทีละตัวจากซ้ายไปขวา ไม่เอาตัวสุดท้าย
for e in x[:-1] :
    ...
หยิบเฉพาะตัว index คี่จากซ้ายไปขวา
for e in x[1::2] :
    ...
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
29

แบบฝึกหัด: นับจำนวน the และ The

The word "the" is one of the most common words in English.
" ( ) , . '
เปลี่ยนเครื่องหมายวรรค
ตอนด้วยช่องว่าง
The word the is one of the most common words in English
split()
["The", "word", "the", "is", "one", "of", "the",
"most", "common", "words", "in", "English"]
นับ
the
กับ
The
3
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
30

break : คำสั่งเพื่อให้ออกจากวงวน

ผังงานวงวน while ที่มีทางออกกลางวงวนด้วยลูกศรสีแดง ผังงานวงวน for ที่มีทางออกกลางวงวนด้วยลูกศรสีแดง
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
31

break : คำสั่งเพื่อให้ออกจากวงวน for

for k in range(n):
    ...
    if 
เงื่อนไข
:
break
...
ผังงาน: วงวน for ที่ออกจากวงวนกลางคันเมื่อเงื่อนไขเป็นจริง
รับจำนวนเต็ม n
หา k ที่หาร n ลงตัว k = 2,3,...,n
เมื่อออกนอกวงวน
ถ้า k เท่ากับ n
→
เป็นจำนวนเฉพาะ
ไม่เช่นนั้น
→
เป็นจำนวนประกอบ
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
32

break : คำสั่งเพื่อให้ออกจากวงวน while

while 
เงื่อนไข
:
...
if 
เงื่อนไข
:
break
...
ผังงาน: วงวน while ที่ออกจากวงวนกลางคันเมื่อเงื่อนไขเป็นจริง
t = input()
s = 0; n = 0
while t != "q":
    s += float(t)
    n += 1
    t = input()
print( "Average =", s/n )
10.0
10.0
11.0
12.0
q
while True
คือวงวนที่หมุนไปเรื่อย ๆ
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
33

แบบฝึกหัด: เกมทายตัวเลข

Guess my number (0 to 99)
You have seven tries
50
Higher
75
Lower
57
Higher
68
Lower
62
Lower
60
Lower
59
You win
Guess my number (0 to 99)
You have seven tries
1
Higher
2
Higher
3
Higher
4
Higher
5
Higher
6
Higher
7
Higher
You lose, the number is 9
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
34

แบบฝึกหัด: เกมทายตัวเลข

import random

print("Guess my number (0 to 99)")
print("You have seven tries")
n = random.randint(0, 99)
for k in range(7):
    m = int(input())
สุ่มเลขระหว่าง 0 ถึง 99
ให้ลองทายอย่างมาก 7 ครั้ง
2110101 วิศวกรรมคอมพิวเตอร์ จุฬาฯ (14/09/67)
35