300 likes | 466 Views
886201 หลักการ โปรแกรม 1. Lecture 4 : โปรแกรมย่อย. โปรแกรม. โปรแกรมภาษา C++ ประกอบด้วย โปรแกรมหลัก - มีเพียงโปรแกรมเดียว และกำหนดให้มีชื่อเป็น main เท่านั้น เมื่อ โปรแกรมมีขนาดใหญ่ขึ้น มีความจำเป็นต้องแบ่งโปรแกรมออกเป็นส่วนย่อย
E N D
886201 หลักการโปรแกรม 1 Lecture 4: โปรแกรมย่อย
โปรแกรม โปรแกรมภาษา C++ ประกอบด้วย โปรแกรมหลัก - มีเพียงโปรแกรมเดียว และกำหนดให้มีชื่อเป็น main เท่านั้น เมื่อโปรแกรมมีขนาดใหญ่ขึ้น มีความจำเป็นต้องแบ่งโปรแกรมออกเป็นส่วนย่อย เรียกว่าโปรแกรมย่อย เพื่อให้สามารถทำความเข้าใจได้ง่าย, พัฒนาได้ง่าย, และ สามารถนำโปรแกรมย่อยที่พัฒนาแล้วไปใช้ในโปรแกรมอื่นต่อไปได้ โปรแกรมย่อย (subprogram) - มีจำนวนไม่จำกัด แต่ละโปรแกรม มีหน้าที่ในการ ทำงานเพียงอย่างเดียว
โปรแกรมย่อย โปรแกรมย่อย มีสองชนิดคือ ฟังก์ชันและกระบวนความ - ฟังก์ชัน(function) – เขียนขึ้นตามนิยามของฟังก์ชันทางคณิตศาสตร์ ต้องรับค่าจากผู้เรียกเพื่อนำไปดำเนินการ และต้องคืนผลลัพธ์ หรือ "ค่า" ให้แก่ผู้เรียก และสามารถคืนค่าได้เพียงค่าเดียว เช่น การเรียกใช้ฟังก์ชัน sine ผู้เรียกต้องส่งมุมในหน่วย Radian เช่น x ให้แก่ฟังก์ชัน และฟังก์ชันคืนค่า sin(x) ให้แก่ผู้เรียก - กระบวนความ(procedure) - ได้แก่โปรแกรมย่อยที่ใช้ทำงานใดงานหนึ่ง และไม่ใช่ฟังก์ชัน ภาษาบางภาษาเช่น Pascal (Delphi) มีการแยกฟังก์ชันแและกระบวนความออกจากกันโดยเด็ดขาด มีคำสั่งและมีวิธีเขียนแตกต่างกัน แต่ภาษา C และ C++ กำหนดให้ฟังก์ชันและกระบวนความมีรูปแบบเดียวกัน และเรียกรวมว่า "ฟังก์ชัน" ดังนั้นคำว่าฟังก์ชันในภาษา C จึงอาจหมายถึง ฟังก์ชัน หรือ กระบวนความก็ได้
ฟังก์ชัน ฟังก์ชันในภาษา c++แบ่งออกได้เป็นสองชนิดคือ 1. ไลบราลี่ฟังก์ชัน (Library Function) 2. ฟังก์ชันที่ผู้เขียนโปรแกรมกำหนดขึ้นเอง (UserDefined Function)
Library Function • เป็นฟังก์ชันมาตรฐานจากคลัง • ก่อนจะนำฟังก์ชันใดมาใช้งานต้องประกาศรูปแบบการใช้งานของฟังก์ชันนั้นก่อน สำหรับฟังก์ชันมาตรฐานจากคลังทำได้โดยการโดยการ include ชื่อ header file ที่ต้องการ เช่น#include <iostream> • การรับข้อมูลเข้าและแสดงผลข้อมูล cin, cout, และ cerrกำหนดใน <iostream> • ฟังก์ชันเกี่ยวกับการคำนวณเช่น sin(), cos(), tan(), sqrt(), pow(), log() กำหนดใน <cmath> • ฟังก์ชันเกี่ยวกับการทำงานกับกลุ่มอักขระเช่นstrcat(), strcpy(), strcmp(), strlen() กำหนดใน <cstring>
UserDefined Function • ฟังก์ชันจากคลังเป็นฟังก์ชันสำหรับใช้งานทั่วไป ไม่เฉพาะเจาะจงกับงานใดงานหนึ่ง เมื่อเขียนโปรแกรมประยุกต์และต้องการฟังก์ชันเฉพาะงาน ผู้ใช้เขียนขึ้นเองได้ • ข้อกำหนดของการเขียนฟังก์ชันขึ้นใช้เอง • การกำหนดรูปแบบการใช้งาน (function prototype) • การเรียกใช้งาน (function invocation)
การกำหนดรูปแบบการใช้งาน (Function Prototype) ส่วนประกอบหลัก 3 ส่วนของ function header typefunction_name (param 1, …,param n) ชนิดของข้อมูลที่ส่งกลับ (function return type) ชื่อฟังก์ชัน(function name) พารามิเตอร์(parameter list)
การกำหนดรูปแบบการใช้งาน (Function Prototype) ชนิดข้อมูลที่จะส่งคืน ชื่อฟังก์ชัน doublesin(doublex); ชนิดของตัวแปรรับค่า ชื่อตัวแปรรับค่า
ชนิดของข้อมูลที่ส่งกลับ(function return type) ชนิดของข้อมูลที่ส่งกลับ (function return type) สามารถใช้ชนิดของข้อมูล(type) ในภาษา C++ ชนิดใดก็ได้เช่น char, int, long, float, double ตัวอย่าง: intfunc1(…) /* ค่าที่ส่งกลับเป็นข้อมูลชนิดint */ float func2(…) /* ค่าที่ส่งกลับเป็นข้อมูลชนิด float */ void func3 (…) /* ไม่มีการส่งค่ากลับ */
ชื่อฟังก์ชัน(function name) และ พารามิเตอร์ (parameter list) ชื่อฟังก์ชัน(function name) ชื่อฟังก์ชันเป็นไปตามกฏการตั้งชื่อในภาษา C++ พารามิเตอร์(parameter list)คือ ค่าที่ถูกส่งไปยังฟังก์ชันเมื่อฟังก์ชันถูกเรียกใช้ ตัวอย่าง: float cube (float x) /* พารามิเตอร์ 1 ตัวคือ x */ void func1 (int x, float y, char z) /* พารามิเตอร์ 3 ตัวคือx, y, z */ void func2 (void) /* ไม่มีพารามิเตอร์ */
การเรียกใช้งาน (Function Invocation) เมื่อผู้เรียกต้องการเรียกใช้งานฟังก์ชันใดต้องรู้รูปแบบการใช้งานของฟังก์ชันนั้น เช่นหากต้องการเรียกใช้งานฟังก์ชัน sin ซึ่งมีรูปแบบการใช้งานเป็น double sin ( double x ); ซึ่งจะทำให้รู้ว่า "ค่า" ที่จะส่งเป็น argument หรือ actual parameters นั้นต้องมีชนิดเป็น double (หรือเทียบเท่า double) และฟังก์ชันคืนค่าเป็น double จะได้ประกาศตัวแปรสำหรับรับค่าที่ฟังก์ชันส่งคืนได้อย่างถูกต้อง เช่นมีการประกาศตัวแปรเป็น double a = 5.87; double b; intc = 3; และมีการเรียกใช้ฟังก์ชัน sin ดังนี้ b = sin(a); // ถูกต้อง argument และตัวแปรรับค่าเป็น double b = sin(c); // ถูกต้องเพราะ intเป็นเซตย่อยของ double c = sin(5.87); // ไม่ถูกต้องเพราะค่าที่ส่งคืนเป็น double แต่ตัวแปรรับค่าเป็น int หมายเหตุ: อย่าลืมว่าค่าที่ส่งให้ฟังก์ชัน sin เป็นมุมในหน่วย radian
ฟังก์ชันทำงานอย่างไร • โดยปกติการประมวลผลโปรแกรมจะเริ่มจาก ฟังก์ชันหลัก (main) • หาก ฟังก์ชันหลักมีการเรียกใช้ฟังก์ชันอื่น (ในที่นี้คือ ฟังก์ชันที่ผู้ใช้กำหนดขึ้น) ก็จะมีการย้ายการทำงานจาก ฟังก์ชันหลัก ไปยังฟังก์ชันที่ถูกเรียกใช้(called function) นั้น (เริ่มทำงานในส่วนของ function definition) • การทำงานในฟังก์ชันที่ถูกเรียกใช้จะสิ้นสุดเมื่อมีการเรียกใช้คำสั่ง return หรือ ทำงาน จน คำสั่ง สุดท้ายสิ้นสุดลง (นั่นก็คือพบเครื่องหมาย ‘}’ ท้ายสุดฟังก์ชัน) • หลังจากนั้น จะมีการย้ายการทำงาน จากฟังก์ชันที่ถูกเรียกใช้ (called function)กลับไปยัง ฟังก์ชันหลัก โดยจะเริ่มประมวลผลคำสั่งถัดไปจากการเรียกใช้ ฟังก์ชัน
ฟังก์ชันทำงานอย่างไร main program func1 ( ) { } int main(void) { func1( ) func2 ( ) func3 ( ) } func2 ( ) { } func3 ( ) { }
การส่งพารามิเตอร์ไปยังฟังก์ชันการส่งพารามิเตอร์ไปยังฟังก์ชัน • Pass by value ทำการ copy ค่าส่งไปยังฟังก์ชัน ไม่มีการเปลี่ยนแปลงค่าตัวแปรทางฝั่งของผู้เรียก • Pass by reference ส่งตัวแทนของตัวแปรไปยังฟังก์ชัน (reference)ฟังก์ชันรับ "ตัวแทนของตัวแปร" ไปดำเนินการเปลี่ยนแปลงตัวแปร ส่งผลต่อค่าของตัวแปรทางฝั่งของผู้เรียก
ตัวอย่าง pass by value #include <iostream> using namespace std; // การประกาศรูปแบบการใช้งานของฟังก์ชัน double square ( double x ); // การประกาศฟังก์ชัน - การกำหนดรายละเอียดการทำงาน double square ( double x ) { return x * x; } intmain ( ) // โปรแกรมหลัก { double a; // การเรียกใช้งานฟังก์ชัน a = square(4); cout << "a = " << a << endl; return 0; }
ตัวอย่าง pass by value #include <iostream> using namespace std; intlarger_of(int a, int b); // การประกาศรูปแบบการใช้งานของฟังก์ชัน // การประกาศฟังก์ชัน - การกำหนดรายละเอียดการทำงาน intlarger_of(int a, int b) { if ( a > b ) return a; return b; } intmain ( ) // โปรแกรมหลัก { int x, y; cin >> x >> y; cout << larger_of(x, y) << endl; // การเรียกใช้งานฟังก์ชัน return 0; }
Variable Scope Which main?
Local and global variable • Local variable (ตัวแปรเฉพาะที่) เป็นตัวแปรที่ถูกประกาศใช้เฉพาะที่ ในฟังก์ชันใดฟังก์ชันหนึ่ง การเปลี่ยนแปลงค่าของตัวแปรชนิดนี้ จะเกิดขึ้นภายในฟังก์ชันที่ประกาศใช้ตัวแปรเท่านั้น การเปลี่ยนแปลงภายนอกฟังก์ชันจะไม่มีผลต่อตัวแปรดังกล่าว • Global variable (ตัวแปรส่วนกลาง) เป็นตัวแปรที่อยู่นอกฟังก์ชัน ค่าของตัวแปรชนิดนี้สามารถถูกเปลี่ยนแปลงได้ตลอดเวลาโดยฟังก์ชันอื่น
Local Variable double cube_volume(double side_len) { double volume= side_len * side_len * side_len; return volume; } int main() { double volume= cube_volume(2); cout << volume << endl; return 0; } ?
Local Variable double withdraw(double balance, double amount) { { double amount = 10; ... } ... } ?
Global Variable intbalance = 10000; // A global variable void withdraw(double amount) { if (balance >= amount) { balance = balance - amount; } } int main() { withdraw(1000); cout << balance<< endl; return 0; }
ตัวอย่าง intx=1, y=2; void demo( ); intmain( ) { cout << “Before calling demo( ), x = ” << x <<“ and y =” << y << endl; demo( ); cout << “After calling demo( ), x = ” << x << “ and y = ” << y << endl; return 0; } void demo( ) { intx=88, y=99; /* declare and initialize two local variables */ cout << “Within the demo( ), x= ” << x << “ and y= ” << y<< endl; } Result: Before calling demo( ), x=1 and y=2 Within the demo( ), x=88 and y=99 After calling demo ( ), x=1 and y=2
แบบฝึกหัด double f(double x) { return g(x) + sqrt(h(x)); } double g(double x) { return 4 * h(x); } double h(double x) { return x * x + k(x) - 1; } double k(double x) { return 2 * (x + 1); } a. double x1 = f(2); b. double x2 = g(h(2)); c. double x3 = k(g(2) + h(2)); d. double x4 = f(0) + f(1) + f(2); e. double x5 = f(-1) + g(-1) + h(-1) + k(-1);
แบบฝึกหัด void prevnext(int a, int& prv, intnxt) { prv = a - 1; nxt = a + 1; } int main() { int a = 100; int b = 0; int c = 0; prevnext(a, b, c); cout << "Previous = ” << b << “Next = ” << c << endl; return 0; }
แบบฝึกหัด 25 int main() 26 { 27 inti = 1; 28 int b = g(i); 29 cout << a + b + i << endl; 30 return 0; 31 } 1 int a = 0; 2 int b = 0; 3 int f(int c) 4 { 5 int n = 0; 6 7 a = c; 8 9 n = a + b; 10 11 return n; 12 } 13 14 int g(int c) 15 { 16 int n = 0; 17 int a = c; 18 19 a++; 20 n = a + b; 21 22 return n; 23 } 24