บทที่ 3 โครงสร้างควบคุม (Control Structures) 05-530-111 Computer Programming 1

Download Report

Transcript บทที่ 3 โครงสร้างควบคุม (Control Structures) 05-530-111 Computer Programming 1

05-530-111 Computer Programming 1
บทที่ 3
โครงสร้ างควบคุม
(Control Structures)
หัวข้ อศึกษา






3.1 กระบวนวิธี (Algorithm)
3.2 โค้ ดเทียม (Pseudocode)
3.3 โครงสร้ างควบคุม (Control structure)
3.4 โครงสร้ างตามลาดับ (Sequence structure)
3.5 โครงสร้ างแบบทางเลือก if
3.6 โครงสร้ างแบบหลายทางเลือก switch
หัวข้ อศึกษา




3.8
3.7
3.9
3.10
โครงสร้ างแบบการทาซา้ while
โครงสร้ างแบบการทาซา้ for
โครงสร้ างแบบการทาซา้ do/while
คาสั่ง break และ continue
หัวข้ อศึกษา

3.11 กระบวนวิธีการสร้ าง (Formulating Algorithm)


กรณีศึกษา 1, การทาซา้ โดยใช้ ตัวนับคุม
(Case Study 1, Counter-Controlled Repetition)
3.12 กระบวนวิธีการสร้ างโดยใช้ วิธีการเกลาจากบนลงล่ าง
(Formulating Algorithm with Top-Down, Stepwise Refinement)


กรณีศึกษา 2, การทาซา้ โดยใช้ ค่าตรวจตราคุม
(Case Study 2, Sentinel-Controlled Repetition)
กรณีศึกษา 3, โครงสร้ างควบคุมแบบซ้ อน
(Case Study 3, Nested Control Structure)
3.1 กระบวนวิธี (Algorithm)
 กระบวนวิธีในที่นี ้ คือ กระบวนการในการแก้ ปัญหาโดยจะ
ประกอบด้ วยขัน้ ตอนของ
– การกระทา
– ลาดับของการกระทา
3.2 โค้ ดเทียม (Pseudocode)
 โค้ ดเทียม คือ ภาษาอย่ างไม่ เป็ นทางการ ที่ผ้ ูเขียนโปรแกรมใช้
ในการพัฒนากระบวนวิธี
 มีลักษณะคล้ ายภาษาที่ใช้ ในชีวิตประจาวัน ซึ่งใช้ ง่ายและเขียน
ได้ โดยสะดวก ไม่ ได้ เป็ นภาษาที่ใช้ ในการเขียนโปรแกรมจริ ง ๆ
 ไม่ ทางานบนคอมพิวเตอร์ แต่ จะช่ วยให้ ผ้ ูเขียนโปรแกรม “คิด”
ก่ อนที่จะเขียนโปรแกรมออกมา การใช้ โค้ ดเทียมทาให้ ผ้ ูเขียน
โปรแกรมไม่ ต้องไปกังวลกับสัญลักษณ์ ย่ ุงยากที่ภาษาโปรแกรม
(เช่ น C หรื อ Java) บังคับให้ ใช้ และสามารถจดจ่ ออยู่กับ
กระบวนวิธีท่ ใี ช้ แก้ ปัญหาจริง ๆ
3.3 โครงสร้ างควบคุม (Control structure)

โปรแกรมทุกโปรแกรมสามารถเขียนขึน้ ได้ โดยใช้ โครงสร้ าง
มาทาการควบคุมเพียง 3 ชนิดเท่ านัน้ คือ
–
–
–
โครงสร้ างตามลาดับ (Sequence structure)
โครงสร้ างทางเลือก (Selection structure)
โครงสร้ างการทาซา้ (Repetition structure)
3.4 โครงสร้ างตามลาดับ (Sequence structure)

เป็ นโครงสร้ างของคาสั่งที่คอมพิวเตอร์ จะทางานไป
ตามลาดับที่เขียนไว้ ถ้ าไม่ ได้ เปลี่ยนขัน้ ตอนการทางานหรื อ
มีเงื่อนไขเพิ่มเติม
ตัวอย่ าง Flowchart ของโครงสร้ างตามลาดับของภาษาซี
3.5 โครงสร้ างแบบทางเลือก if

โครงสร้ างแบบทางเลือก if คือ โครงสร้ างสาหรั บใช้ เลือกทา
คาสั่ง (หรื อกลุ่มคาสั่ง) โดยอาศัยการตรวจสอบเงื่อนไข ซึ่ง
มี 3 รู ปแบบคือ



1. หนึ่งทางเลือก (One Alternative)
2. สองทางเลือก (Two Alternative)
3. หลายทางเลือก (Multiple-Alternative)
3.5.1 โครงสร้ างแบบทางเลือก if หนึ่งทางเลือก


โครงสร้ างแบบนี ้ จะเลือกทาคาสั่ง (หรือกลุ่มคาสั่ง) ก็ต่อเมื่อ
ตรวจสอบเงื่อนไขแล้ วเป็ นจริง
ตัวอย่ าง Flowchart ของโครงสร้ างแบบทางเลือก if หนึ่งทางเลือก
FALSE
เงือ่ นไข
condition
TRUE
คำสั ่งหรือกลุ่มคำสั ่ง
statement T
รูปแบบของโครงสร้ างแบบทางเลือก if หนึ่งทางเลือก
รูปแบบการทา 1 คาสั่ง :
if (condition)
Statement T;
รูปแบบการทากลุ่มคาสั่ง :
if (condition)
{
True task;
}
ตัวอย่ างของโครงสร้ างแบบทางเลือก if หนึ่งทางเลือก
ตัวอย่ าง1 :
if (x > 0)
total = total * x;
ตัวอย่ าง2 :
if (x>y)
{
temp=x;
x=y;
y=temp;
}
3.5.2 โครงสร้ างแบบทางเลือก if สองทางเลือก


โครงสร้ างแบบนีม้ ีสองทางเลือก กล่ าวคือ เลือกทาคาสั่ง (หรือ
กลุ่มคาสั่ง) เมื่อตรวจสอบเงื่อนไขแล้ วเป็ นจริง หรือ ทาคาสั่ง
(หรือกลุ่มคาสั่ง) เมื่อตรวจสอบเงื่อนไขแล้ วเป็ นเท็จ
ตัวอย่ าง Flowchart ของโครงสร้ างแบบทางเลือก if สองทางเลือก
FALSE
คำสั ่งหรือกลุ่มคำสั ่ง
statement F
เงือ่ นไข
condition
TRUE
คำสั ่งหรือกลุ่มคำสั ่ง
statement T
รูปแบบของโครงสร้ างแบบทางเลือก if สองทางเลือก
รูปแบบการทา 1 คาสั่ง :
if (condition)
statement T ;
else
statement F ;
รูปแบบการทากลุ่มคาสั่ง :
if (condition)
{
true task;
}
else
{
false task;
}
ตัวอย่ างของโครงสร้ างแบบทางเลือก if สองทางเลือก
ตัวอย่ าง1 :
if (x >= 0)
cout << "positive\n”;
else
cout << “negative\n”;
ตัวอย่ าง2 :
if (x>y)
{
temp = x ;
x=y ;
y=temp ;
}
else
{
count=count + 1 ;
cout << "smaller\n”;
}
3.5.3 โครงสร้ างแบบทางเลือก if หลายทางเลือก

โครงสร้ างแบบนีม้ ีหลายทางเลือก กล่ าวคือ ในกรณีท่ ี
ตรวจสอบเงื่อนไขแล้ ว ทาให้ เกิดทางเลือกของการทา
คาสั่งมากกว่ า 2 ทางเลือก สามารถใช้ โครงสร้ างแบบ
ทางเลือก if หลายทางเลือกโดยทาการโปรแกรมให้ อยู่ใน
รูป Multiple–Alternative
รู ปแบบของโครงสร้ างแบบทางเลือก if หลายทางเลือก
รูปแบบ:
if (condition 1)
statement 1;
else if (condition 2)
statement 2;
:
:
else if (condition n)
statement n;
else
statement;
ตัวอย่ างของโครงสร้ างแบบทางเลือก if หลายทางเลือก
/*increment mum-pos, num_neg, or num_zero depending on x*/
if (x > 0)
num_pos = num_pos + 1;
else if (x < 0)
num_neg = num_neg + 1;
else
num_zero = num_zero + 1;
3.6 โครงสร้ างแบบหลายทางเลือก switch

โครงสร้ างแบบหลายทางเลือก switch จะถูกใช้ บ่อยในกรณี
ของ การเลือกหนึ่งทางเลือกในหลายๆทางเลือก โดยค่ าที่
ใช้ ตรวจสอบ จะต้ องเป็ นจานวนเต็ม (int) หรื อ ข้ อมูลชนิด
ตัวอักษร(char) แต่ จะต้ องไม่ เป็ นจานวนจริงแบบยาว
(double) โดยอาจจะอยู่ในรู ปของตัวแปร, นิพจน์ หรื อ
ฟั งก์ ชันก็ได้
รูปแบบของโครงสร้ างแบบหลายทางเลือก switch
รูปแบบ: switch (controlling expression)
{
case lable_set1:
statements1
break;
case label_set2:
statements2
break;
:
:
case lable_setn:
statementsn
break;
default :
}
ตัวอย่ างของโครงสร้ างแบบหลายทางเลือก switch
ตัวอย่ าง: switch (class)
{
case ‘B’ :
case ‘b’ :
cout << "Bat\n”;
break ;
case ‘C’ :
case ‘c’ :
cout << "Cat\n”;
break ;
default :
cout << "Unknown class \n” << class;
}
3.7 โครงสร้ างแบบการทาซา้ for

เป็ นโครงสร้ างที่ใช้ สาหรั บทาซา้ คาสั่ง โดยการทางานของ
การทาซา้ จะขึน้ อยู่กับองค์ ประกอบที่สาคัญ 3 ส่ วนคือ
–
–
–
1. ค่ าเริ่มต้ นของตัวแปรควบคุมการทาซา้
2. ส่ วนตรวจสอบเงื่อนไข
3. ส่ วนเปลี่ยนแปลงค่ าของตัวแปรควบคุมการทาซา้
รูปแบบของโครงสร้ างการทาซา้ for
รูปแบบ: for (initialization expression ;
loop repetition condition ;
update expression)
ตัวอย่ างของโครงสร้ างการทาซา้ for
ตัวอย่ าง: /*Display N asterisks*/
for (count = 0 ;
count < 10 ;
count += 1)
cout << "*";
หรือ:
for (count = 0; count <10; count += 1)
cout << "*";
ผลลัพธ์ :
**********
ตัวอย่ างของโครงสร้ างการทาซา้ for
ตัวอย่ าง: /*Display Round No.*/
for (i = 1; i <5; i += 1)
cout << “Round : “ << i << endl;
ผลลัพธ์ :
Round : 1
Round : 2
Round : 3
Round : 4
3.8 โครงสร้ างแบบการทาซา้ while

เป็ นโครงสร้ างที่ใช้ ในการทาซา้ คาสั่งต่ าง ๆ โดยจะมีการ
ตรวจสอบเงื่อนไข ซึ่ง
–
–
กรณีท่ ผี ลลัพธ์ ของเงื่อนไขไม่ เท่ ากับศูนย์ (จริง) จะทาคาสั่ง
หรือกลุ่มคาสั่งในแต่ ละรอบ
ส่ วนกรณีท่ ผี ลลัพธ์ ของเงื่อนไขเท่ ากับศูนย์ (เท็จ) จะหยุดทา
คาสั่งหรือกลุ่มคาสั่งในรอบ โดยข้ ามไปทาคาสั่งถัดไปจาก
รอบของโครงสร้ าง while เลย
รูปแบบของโครงสร้ างการทาซา้ while
รูปแบบ: while (loop repetition condition)
statement;
ตัวอย่ างของโครงสร้ างการทาซา้ while
ตัวอย่ าง: /*Display N asterisks.*/
count = 0;
while (count < 10)
{ cout << "*”;
count = count + 1;
}
ผลลัพธ์ :
**********
ตัวอย่ างของโครงสร้ างการทาซา้ while
ตัวอย่ าง: /*Display Round No.*/
i = 1;
while (i < 5)
{ cout << “Round : “ << i << endl;
i = i + 1;
}
ผลลัพธ์ :
Round : 1
Round : 2
Round : 3
Round : 4
3.9 โครงสร้ างแบบการทาซา้ do/while

โครงสร้ างแบบการทาซา้ while และ for จะต้ องมีการ
ตรวจสอบค่ าของเงื่อนไขก่ อนว่ าเป็ นจริงหรื อเท็จ ก่ อนที่จะ
ทาคาสั่ง (กลุ่มคาสั่ง) ภายในรอบ แต่ การทางานบาง
ลักษณะจะต้ องทาคาสั่งภายในรอบก่ อนอย่ างน้ อย 1 ครัง้
ซึ่งการทางานในลักษณะที่กล่ าวนีส้ ามารถใช้ คาสั่ง do-while
ได้
รูปแบบของโครงสร้ างการทาซา้ do/while
รูปแบบ: do
statement;
while (loop repetition condition);
ตัวอย่ างของโครงสร้ างการทาซา้ do/while
ตัวอย่ าง: /* Display Round No.*/
i=1;
do
{ cout << “Round : “ << i << endl;
i = i + 1;
}
while ( i < 5);
ผลลัพธ์ :
Round : 1
Round : 2
Round : 3
Round : 4
3.10 คาสั่ง break และ continue




คาสั่ง break เป็ นคาสั่งที่ใช้ ในการหยุดการทาคาสั่งภายใน
รอบของโครงสร้ างแบบการทาซา้ มีรูปแบบดังนี ้
break;
คาสั่ง continue เป็ นคาสั่งที่ใช้ ยกเลิกคาสั่งที่ยังเหลืออยู่ใน
กลุ่มคาสั่ง ภายในรอบของโครงสร้ างแบบการทาซา้ มี
รู ปแบบดังนี ้
continue;
3.11 Formulating Algorithm

กรณีศึกษา 1, การทาซา้ โดยใช้ ตัวนับคุม
–
เป็ นกระบวนวิธีการสร้ างการทาซา้ แบบ while หรือ do/while
แต่ จะใช้ ตัวแปรตัวหนึ่งที่เรียกว่ า ตัวนับ (Counter) เพื่อระบุ
จานวนครัง้ ที่จะทาคาสั่งชุดหนึ่ง ๆ เราจะใช้ วิธีการทาซา้ โดย
ใช้ ตัวนับคุม เมื่อทราบจานวนการทาซา้ ก่ อนที่การวนรอบ
ทาซา้ จะเริ่มต้ น
ตัวอย่ างกรณีศึกษา 1, การทาซา้ โดยใช้ ตัวนับคุม
โจทย์
ต้ องการหาคะแนนเฉลี่ยของนักศึกษา 10 คนในชัน้ เรี ยน
ซึ่งได้ ทาแบบฝึ กหัดและได้ ผลคะแนนเป็ นเลขจานวนเต็ม
ตัง้ แต่ 0 ถึง 100
กระบวนวิธีท่ ใี ช้ แก้ ปัญหา
จะต้ องรั บคะแนนเข้ าไป, คานวณหาค่ าเฉลี่ย และพิมพ์
ผลลัพธ์ ออกมา ในการเขียนโปรแกรมจะใช้ การทาซ้า
โดยใช้ ตัวนับคุม เพื่อรั บคะแนนเข้ าไปทีละหนึ่ง
ตัวอย่ างกรณีศึกษา 1, การทาซา้ โดยใช้ ตัวนับคุม
/* Class average program with counter-controlled repetition */
#include <iostream.h>
int main()
{
int counter, grade, total, average;
/* initialization phase */
total = 0;
counter = 1;
/* processing phase */
while (counter <= 10)
{
cout << "Enter grade: ";
cin >> grade;
total = total + grade;
counter = counter + 1;
}
ตัวอย่ างกรณีศึกษา 1, การทาซา้ โดยใช้ ตัวนับคุม(ต่ อ)
/* termination phase */
average = total / 10;
cout "Class average is " << average << endl);
return 0; /* indicate program ended successfully */
}
ผลลัพธ์ กรณีศึกษา 1, การทาซา้ โดยใช้ ตัวนับคุม
Enter grade: 98
Enter grade: 76
Enter grade: 71
Enter grade: 87
Enter grade: 83
Enter grade: 90
Enter grade: 57
Enter grade: 79
Enter grade: 82
Enter grade: 94
Class average is 81
3.12 Formulating Algorithm with Top-Down Stepwise Refinement

Top-Down Stepwise Refinement เป็ นวิธีท่ จี าเป็ นต้ องใช้ ใน
การพัฒนาโปรแกรมให้ มีโครงสร้ างที่ดี
–
–
การเขียน pseudocode ระดับบนสุดที่บรรยายถึง การทางาน
ทัง้ หมดของโปรแกรม
ทากระบวนการเกลา โดยแบ่ ง pseudocode ระดับบนสุด
ออกเป็ นงานที่เล็กลงชุดหนึ่งแล้ วเขียนงานเหล่ านีเ้ รียงกันไป
ตามลาดับที่จะทางาน
กรณีศึกษา 2 การทาซ ้าโดยใช้ คา่ ตรวจตราคุม
เป็ นกระบวนวิธีการสร้ างการทาซา้ แบบ while
หรือ do/while แต่ จะใช้ ตัวแปรตัวหนึ่งที่เรียกว่ า
ค่ าตรวจตรา (sentinel value) เพื่อบอกว่ าการ
รั บข้ อมูลเข้ ามาเสร็จสิน้ แล้ ว
ตัวอย่ างกรณีศึกษา 2, การทาซา้ โดยใช้ ค่าตรวจตราคุม
โจทย์
ต้ องการหาคะแนนเฉลี่ยของนักศึกษาในชัน้ เรี ยน
เช่ นเดียวกับกรณีศึกษา 1 แต่ ไม่ ทราบจานวนนักศึกษาที่
แน่ นอนล่ วงหน้ า
กระบวนวิธีท่ ใี ช้ แก้ ปัญหา
ใช้ ค่าตรวจตรา เพื่อบอกว่ าการรั บข้ อมูลเข้ ามาเสร็จสิน้
แล้ ว โดยผู้ใช้ จะพิมพ์ คะแนนเข้ าไปจนหมด แล้ วจึงพิมพ์
ค่ าตรวจตราลงไป เพื่อให้ โปรแกรมรู้ ว่าได้ พมิ พ์ คะแนน
เสร็จสิน้ แล้ ว
โค๊ ดเทียมตัวอย่ างกรณีศึกษา 2
ตัง้ ค่าเริ่ มต้นของ total ให้เป็ น 0
ตัง้ ค่าเริ่ มต้นของ counter ให้เป็ น 0
รั บคะแนนค่ าแรกเข้ าไป
While ผู้ใช้ ยังไม่ ได้ ป้อนค่ าตรวจตราเข้ าไป
บวกคะแนนเข้ ากับ total
เพิ่มค่ าของ counter ขึน้ หนึ่ง
รั บคะแนนค่ าต่ อไป (ซึ่งอาจจะเป็ นค่ าตรวจตราก็ได้ )
If counter ไม่ เท่ ากับ 0
กาหนดให้ average เท่ ากับ total หารด้ วย counter
พิมพ์ average
Else
พิมพ์ “No grades were entered” (ยังไม่ มีการป้ อนคะแนนเข้ า
มา)
ตัวอย่ างกรณีศึกษา 2, การทาซา้ โดยใช้ ค่าตรวจตราคุม
/* Class average program with sentinel-controlled repetition */
#include <iostream.h>
int main()
{
float average;
/* new data type */
int counter, grade, total;
/* initialization phase */
total = 0;
counter = 0;
/* processing phase */
cout << "Enter grade, -1 to end: ";
cin >> grade;
while (grade != -1)
{
total = total + grade;
counter = counter + 1;
cout << "Enter grade, -1 to end: ";
cin >> grade;
}
ตัวอย่ างกรณีศึกษา 2, การทาซา้ โดยใช้ ค่าตรวจตราคุม(ต่ อ)
}
/* termination phase */
if (counter != 0)
{
average = (float) total / counter;
cout << “Class average is” << average;
}
else
cout << "No grades were entered\n";
return 0;
/* indicate program ended successfully */
ผลลัพธ์ กรณีศึกษา 2, การทาซา้ โดยใช้ ค่าตรวจตราคุม
Enter grade: 75
Enter grade: 94
Enter grade: 97
Enter grade: 88
Enter grade: 70
Enter grade: 64
Enter grade: 83
Enter grade: 89
Enter grade: -1
Class average is 8250
กรณีศึกษา 3 โครงสร้ างควบคุมแบบซ้ อน
โครงสร้ างควบคุมที่ผ่านมาเป็ นโครงสร้ าง
ควบคุมที่สามารถนามาต่ อกันไปเรื่อย ๆ ได้
แต่ โครงสร้ างควบคุมแบบซ้ อนเป็ นโครงสร้ าง
ที่เกิดจากการประกอบโครงสร้ างควบคุมซ้ อน
เข้ าด้ วยกัน
ตัวอย่ างกรณีศึกษา 3, โครงสร้ างควบคุมแบบซ้ อน
โจทย์
ต้ องการเขียนโปรแกรมเพื่อสรุ ปผลลัพธ์ ผลการสอบขอรั บใบอนุญาตเป็ นตัวแทน
จาหน่ ายที่ดนิ โดยได้ รับรายชื่อของนักศึกษา 10 คน
หากนักศึกษาคนนัน้ สอบผ่ าน ถัดจากรายชื่อจะมีตัวเลข 1 เขียนอยู่
หากนักศึกษาคนนัน้ สอบตก ถัดจากรายชื่อจะมีตัวเลข 2 เขียนอยู่
และถ้ าหากมีนักศึกษามากกว่ า 8 คนสอบผ่ าน ให้ พมิ พ์ ข้อความ “Raise
tuition”
กระบวนวิธีท่ ใี ช้ แก้ ปัญหา
รับผลการสอบ (นั่นคือ เลข 1 หรือ 2) เข้ าไป แสดงข้ อความ “Enter result” (ใส่ ผล
การสอบ) บนหน้ าจอทุกครัง้ ที่โปรแกรมต้ องการรับผลการสอบค่ าต่ อไป
นับจานวนผลการสอบแต่ ละชนิด (ผ่ านและตก)
แสดงสรุ ปผลการสอบ เพื่อบอกจานวนของนักศึกษาที่สอบผ่ านและนักศึกษาที่สอบ
ตก
ถ้ านักศึกษามากกว่ า 8 คนสอบผ่ าน ให้ พมิ พ์ ข้อความ “Raise tuition” (ขึน้ ค่ าเล่ า
เรียน)
โค๊ ดเทียมตัวอย่ างกรณีศึกษา 3
ตัง้ ค่าเริ่ มต้นของ passes (จานวนการสอบผ่าน) ให้เป็ น 0
ตัง้ ค่าเริ่ มต้นของ failures (จานวนการสอบตก) ให้เป็ น 0
ตัง้ ค่าเริ่ มต้นของ student counter ให้เป็ น 1
While student counter น้ อยกว่ าหรื อเท่ ากับ 10
รั บค่ าผลการสอบค่ าต่ อไป
If นักศึกษาสอบผ่ าน
เพิ่มหนึ่งให้ แก่ passes
Else
เพิ่มหนึ่งให้ แก่ failures
เพิ่มหนึ่งให้ กับ student counter
พิมพ์ จานวนของ passes
พิมพ์ จานวนของ failures
If นักศึกษามากกว่ า 8 คนสอบผ่ าน
พิมพ์ “Raise tuition”
ตัวอย่ างกรณีศึกษา 3, โครงสร้ างควบคุมแบบซ้ อน
/* Analysis of examination results */
#include <iostream.h>
int main()
{
/* initializing variables in declarations */
int passes = 0, failures = 0, student = 1, result;
/* process 10 students; counter-controlled loop */
while (student <= 10)
{
cout << "Enter result (1=pass, 2=fail): ";
cin >> result;
if (result == 1) /* if/else nested in while */
passes = passes + 1;
else
failures = failures + 1;
student = student + 1;
}
ตัวอย่ างกรณีศึกษา 3, โครงสร้ างควบคุมแบบซ้ อน
}
cout << “Passed “ << passes;
cout << "Failed " << failures);
if (passes > 8)
cout << "Raise tuition\n";
return 0;
/* successfully termination */
ผลลัพธ์ กรณีศึกษา 3, โครงสร้ างควบคุมแบบซ้ อน
Enter Result (1=pass, 2=fail): 1
Enter Result (1=pass, 2=fail): 1
Enter Result (1=pass, 2=fail): 1
Enter Result (1=pass, 2=fail): 2
Enter Result (1=pass, 2=fail): 1
Enter Result (1=pass, 2=fail): 1
Enter Result (1=pass, 2=fail): 1
Enter Result (1=pass, 2=fail): 1
Enter Result (1=pass, 2=fail): 1
Enter Result (1=pass, 2=fail): 1
Passed 9
Failed 1
Raise tuition