Transcript Function

Structure Programming
การเขียนโปรแกรมเชิง
โครงสร ้าง
สัปดาห ์ที่ 12
ฟั งก ์ช ัน (Function)
objectives
้ ก
ั และเข้า ใจการนิ ย ามและการ
เพื่อให้นิ ส ิต รู จ
เขียนฟั งก ์ช ันในภาษาซี
สา มา ร ถเขี ย น ฟั ง ก ช
์ น
ั ร่ ว ม กับ ค า สั่ง ท า ซ ้า
้ าแหน่ ง ตวั แปรชนิ ดโครงสร ้าง
อาเรย ์ ตวั แปรชีต
ในภาษาซีได้อย่างมีประสิทธิภาพ
่
่
สามารถนาความรู เ้ รืองฟั
งก ์ชน
ั ไปประยุกต ์เพือ
แก้ไ ขโจทย ์ปั ญ หาในชีว ต
ิ ประจาวันได้ไ ด้อ ย่ า ง
ถูกต้องเหมาะสม
Outline
1
2p
Function
User-Defined Function
3
Function Format
4
Passing Parameters
5
Assignment
What is function?
่
่ กเขียนขึนให้
้
ฟั งก ์ช ัน คือ ชุดคาสังของการท
างานทีถู
โปรแกรมเมอร ์สามารถเรียกใช้งานได้โดยง่ าย
** ฟั งก ์ช ัน คือ ชุดของการทางาน
** ฟั งก ์ช ัน ถูกเรียกใช้งานได้
Why the function is essential?
่ ดขึนในการพั
้
่ ับซ ้อน
ปั ญหาทีเกิ
ฒนาโปรแกรมทีซ
โปรแกรมเมอร ์ไม่สามารถทราบการทางานของระบบ
โดยละเอียดได้ เช่น ไม่ทราบกระบวนการส่งข้อมู ล
่
่
ผ่านเครือข่าย แต่ตอ
้ งเขียนโปรแกรมเพือเชื
อมต่
อ
ระบบเครือข่าย
้
โปรแกรมเมอร ์ไม่สามารถทราบขันตอนการท
างาน
้
ของคอมพิวเตอร ์ทังหมดได้
เช่น ทาอย่างไรตัวอ ักษร
จึงปรากฏในหน้าจอภาพได้
่ ับซ ้อน และ
โปรแกรมบางโปรแกรมมีการทางานทีซ
้ กเรียกใช้งานบ่อยครง้ั เช่น
การทางานซ ับซ ้อนนันถู
การหาผลลัพธ ์ทางวิทยาศาสตร ์ การวิเคราะห ์ข้อมูล
ขนาดใหญ่เป็ นต้น
Solution
วิธก
ี ารแก้ไข
เ พื่ อใ ห้ โ ป ร แ ก ร ม เ ม อ ร ส
์ า ม า ร ถ ท า ง า นไ ด้ โ ด ยไ ม่
้
จ าเป็ นต้อ งทราบรายละเอีย ดการท างานทังหมดของ
ระบบ จะให้โ ปรแกรมเมอร ์ที่ทราบการท างานโดย
่
ละเอีย ดของกระบวนการต่ า งๆ จะเขีย นชุ ด ค าสังใน
รู ป แบบของ ฟั งก ์ช น
ั แล้ว แจกจ่ า ยให้โ ปรแกรมเมอร ์
่ ได้ใช้งาน
อืนๆ
โปรแกรมเมอร ์สามารถเรียกใช้ฟังก ์ช ันโดยทราบเพียง
่ ด ขึนหลั
้
วิธ ก
ี ารใช้ง าน และผลลัพ ธ ์ทีเกิ
ง จากเรีย กใช้
้
งานฟั งก ์ช ันเท่านัน
่ ทราบว่าทาอย่างไรตัวอักษรจึงจะ
• เช่น โปรแกรมเมอร ์ทีไม่
ปรากฎหน้าจอ สามารถใช ้คาสั่ง printf
ไดเ้ ลย โดย
The Advantage of Function
ข้อดีของฟั งก ์ช ัน
ทาให้โปรแกรมเมอร ์สามารถพัฒนาโปรแกรมได้
โดยง่ าย โดยโปรแกรมเมอร ์ไม่จาเป็ นต้องทราบว่าการ
ทางานของฟั งก ์ช ันทางานอย่างไรทราบเพียงผลลัพธ ์
้
ของการทางานเท่านัน
โปรแกรมเมอร ์สามารถเขียนโปรแกรมให้มก
ี ารทางาน
่ ับซ ้อนได้ โดยไม่จาเป็ นต้องเขียนโปรแกรมส่วนที่
ทีซ
้
ซ ับซ ้อนนันหลายๆ
ครง้ั
โปรแกรมเมอร ์สามารถออกแบบฟั งก ์ช ันได้ตามความ
ต้องการของโปรแกรมเมอร ์
Type of Function
FUNCTIONS IN
C
C STANDARD
LIBRARY
PROGRAMMER
DEFINED
FUNCTION
Type of Function (cont.)
กลุ่มฟั งก ์ช ันมาตรฐาน (Standard Library Functions)
่ อยู ่ใน Library มาตรฐานของภาษาซี
• เป็ นฟั งก ์ช ันทีมี
มาตรฐาน ANSI C มี 15 ประเภท
่ บ
• ใช้ Preprocessor #include อ้างถึง Library ทีเก็
ฟั งก ์ช ันมาตรฐาน
• เช่น #include <stdio.h>
่ ใ้ ช้กาหนดเอง (User-defined Functions)
ฟั งก ์ช ันทีผู
้
่ างาน
• เป็ นฟั งก ์ช ันที่ programmer เขียนขึนมาเอง
เพือท
่
เฉพาะเรือง
่ องใช้ preprocessor #include
• ถ้าอยู ่ในไฟล ์อืนต้
เช่นเดียวก ัน แต่อยู ่ใน “ ” แทน < >
Standard Library Function
ฟั งก ์ช ันไลบรารีมาตรฐาน (Standard Library
่ อยู ่แล้วเก็บไว้ใน Library ใน
Function) เป็ นฟั งก ์ช ันทีมี
การใช้งานต้อง include ก่อน
่ เป็
่ นการนาเอา header
Include directive คือคาสังที
่ ยน
file มารวมไว้ก ับไฟล ์ทีเขี
การ include directives จะเป็ นเหมือนการประกาศ
้
ให้ก ับ compiler ทราบว่าจะใช้คาสัง่ ใน Library นันๆ
่
เช่น การใช้คาสัง่ sin() ซึงอยู
่ใน math.h จะต้องมีการ
ประกาศ Library ก่อนเสมอ ดังตัวอย่าง
#include <math.h>
Standard Library Function (cont.)
่
ชือไฟล
์
การทางานของฟั งก ์ช ัน
ส่วนหัว
่ ในการตรวจสอบ
assert.h ประกาศมาโครและข้อมู ลทีใช้
และช่วยการแก้ไขข้อผิดพลาดของโปรแกรม
(debugging)
่ ในการตรวจสอบชนิ ด
ctype.h ประกาศตวั แบบของฟั งก ์ช ัน ทีใช้
ของตัวอ ักษร
และแปลงตัวอ ักษรระหว่างตัวพิมพ ์เล็กกบ
ั ตัวพิมพ ์ใหญ่
่
่ ในการรายงาน
errno.h ประกาศค่าคงทีและต
วั แปรภายนอกทีใช้
ข้อผิดพลาด
่ าหร ับการกาหนดขนาดและ
float.h ประกาศมาโครและค่าคงทีส
การจัดการกับเลขทศนิ ยม
่ าหร ับการกาหนดขนาดและ
limits.h ประกาศมาโครและค่าคงทีส
การจัดการกับเลขจานวนเต็ม
Standard Library Function (cont.)
่
ชือไฟล
์
การทางานของฟั งก ์ช ัน
ส่วนหัว
่ ยวกั
่
setjump. ประกาศต ัวแบบของฟั งก ์ช ันและข้อมู ลทีเกี
บการ
h
กระโดดไปทางาน
่ วนของโปรแกรมแทนการเรียกใช้ฟังก ์ช ันแบบปกติ
ทีส่
signal.h ประกาศต ัวแบบของฟั งก ์ช ัน มาโครและค่าคงที่
่ งมาให้กบ
สาหร ับการจ ัดการกับสัญญาณทีส่
ั ซีพย
ี ู ระหว่าง
การทางาน
่ จ ัดการกับลาดบ
่ ง
stdarg.h ประกาศมาโครทีใช้
ั ของอาร ์กิวเมนต ์ทีส่
ให้ก ับฟั งก ์ช ัน
่ นอน
ในกรณี ทไม่
ี่ รู ้จานวนของอาร ์กิวเมนต ์ทีแน่
่
้ั อชนิ
่
stddef.h ประกาศค่าคงทีและต
งชื
ดข้อมู ลแทนชนิ ดข้อมู ล
แบบปกติ
่
สาหร ับการทางานเฉพาะเรือง
่ ยวกั
่
stdio.h ประกาศต ัวแบบของฟั งก ์ช ันและข้อมู ลทีเกี
บการร ับ
How to use Standard Library Function?
้ั
การเรียกใช้ Standard Library Function มีขนตอน
ดังนี ้
่ ยนต้องการการทางานอะไร
• ทราบว่าโปรแกรมทีเขี
่
• การทางานดังกล่าวคือฟั งก ์ช ันชืออะไร
่ นสารบัญของคาสัง่
• ทราบ header file ทีเป็
้
• Include header file นันๆ
• เรียกใช้ฟังก ์ช ันในโปรแกรม
Example 1
#include<stdio.h>
#include<conio.h>
#include<math.h>
int main()
{
double rad = -1.0;
do {
printf ( "Sine of %f is %f\n", rad, sin(rad));
rad += 0.1;
} while (rad <= 1.0);
return 0;
}
Mathematics Function
#include<math.h>
sin(var);
cos(var);
tan(var);
sqrt(var);
pow(var1,var2);
log(var);
log10(var);
exp(var);
fabs(var);
Mathematics Function (cont.)
Function
sin(x)
เป็ นเรเดียน
cos(x)
หน่ วยเป็ นเรเดียน
tan(x)
หน่ วยเป็ นเรเดียน
sqrt(x)
pow(x,y)
log(x)
x, x>=0
log10(x)
Description
sine ของ x, x มีหน่ วย
cosine ของ x, x มี
tangent ของ x, x มี
่
รากทีสองของ
x, x>=0
x ยกกาลัง y
logarithm ฐาน e ของ
logarithm ฐาน 10
Example 2
#include<stdio.h>
#include<math.h>
int main(){
float a = 3.14;
float b = -123.456;
float c = 2.7;
int d = -2000;
printf ("%.3f \n", sin(a));
printf ("%.3f \n", cos(a));
printf ("%.3f \n", tan(a));
printf ("%.3f \n", sqrt(a));
printf ("%.3f \n", pow(a,c));
printf ("%.3f \n", log(a));
printf ("%.3f \n", log10(a));
printf ("%.3f \n", exp(a));
printf ("%.3f \n", fabs(b));
printf ("%d \n",
abs(d));
return 0;
}
//ผลลัพธ ์
0.002
-1.000
-0.002
1.772
21.964
1.144
0.497
23.104
123.456
2000
String Function
#include<string.h>
strcpy(str1, str2);
strcat(dest1, src2);
strcmp(dest1, src2);
strcmpi(str1, str2);
strlen(str);
#include<ctype.h>
tolower(ch);
toupper(ch);
String Function (cont.)
Function
Description
ฟั งก ์ช ันสาหร ับอ ักขระ – string.h
strcpy(str1, str2)
คัดลอกข้อความจาก str2 ไป
เก็บที่ str1
strcat(str1, str2)
ต่อข้อความใน str1 ด้วย str2
strcmp(str1, str2)
เปรียบเทียบตัวอ ักษรใน
ข้อความ
ถ้า str1 = str2 จะได้ 0
strlen(str)
หาความยาวข้อความ
ฟั งก ์ช ันสาหร ับอ ักขระ – ctype.h
่
tolower(ch)
เปลียนอ
ักขระเป็ นตวั พิมพ ์เล็ก
Example 3
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//strlen
printf("%d\n",strlen
(string));
int main(void)
{
char string[10];
char *str = "Abc";
//tolower and toupper
string[0] =
tolower(string[0]);
string[1] =
toupper(string[1]);
printf("%s\n", string);
return 0;
//strcpy
strcpy(string, str);
printf("%s\n", string);
//strcat
strcat(string, "Def");
printf("%s\n", string);
//strcmp and strcmpi
printf("%d\n",strcmp(str,
"abc"));
printf("%d\n",strcmpi(str,
"abc"));
}
//ผลลัพธ์
Abc
AbcDef
-1
0
6
aBcDef
Size of Variable Function
้ ในหน่
่
่ บตัว
sizeof(x) หาขนาดพืนที
วยความจาทีเก็
่ องการหา
แปร มีหน่ วยเป็ น byte, x คือตัวแปรทีต้
่
ขนาด ไม่ตอ
้ งมี include ใดๆ เพิม
size of age = 2 bytes
#include <stdio.h>
#include <conio.h>
size of grade = 4 byte
size of song = 15 byte
size of double = 8 byt
void main() {
int age = 14;
float grade = 4.00;
char song[] = "More than word";
printf("size of age = %d bytes\n", sizeof(age));
printf("size of grade = %d bytes\n", sizeof(grade));
printf("size of song = %d bytes\n", sizeof(song));
printf("size of double = %d bytes\n", sizeof(double));
}
Outline
1
2p
Function
User-Defined Function
3
Function Format
4
Passing Parameters
5
Assignment
User-Defined Function
้
เนื่ องจาก Standard Library Function ทังหมด
เป็ น
่ เฉพาะการทางานพืนฐานต่
้
ฟั งก ์ช ันมาตรฐานทีมี
างๆ
้
เท่านัน
่ การทางานเฉพาะกิจ
หากต้องการฟั งก ์ช ันทีมี
้
โปรแกรมเมอร ์ต้องเขียนฟั งก ์ช ันขึนมาเอง
User-Defined Function (cont.)
้
ข้อกาหนดพืนฐานของ
User-defined Function
่ น
1. ต้องมีการประกาศ function prototype ทีต้
้ ได้
โปรแกรมเสมอ จึงจะเรียกใช้งาน function นันๆ
่ งั กล่าวคือฟั งก ์ช ัน
(เป็ นการบอก Compiler ว่าคาสังด
ไม่ใช่ syntax error)
่ ประกาศไว้
2. ต้องมีการเขียนฟั งก ์ช ันตามโครงสร ้างทีได้
้
ใน function prototype เท่านัน
User-Defined Function (cont.)
#include<file.h>
พรีโปรเซสเซอร์ไดเร็คทีฟ
type function_name(type); ฟั งก์ชน
ั โพรโทรไทพ์
สว่ นหัวโปรแก
type variable
ตัวแปรชนิดโกบอล
int main()
{
type variable; ตัวแปรชนิดโลคอล
statement-1;
ั หลัก
ฟั งก์ชน
คำสงั่
...
statement-n;
return 0;
สว่ นตัวโปรแก
}
type function_name(type variable)
{
statement-1;
ั ย่อย
ฟั งก์ชน
...
statement-n;
return(var);
}
User-Defined Function (cont.)
่ างานทีมี
่ การร ับค่าแล้ว
ฟั งก ์ช ัน : กลุ่มคาสังท
่
่ ั และมีการส่งค่ากลับ
ทาตามคาสังในฟั
งก ์ชน
(return)
รับค่ำมำ
Process (ทำงำน)
สง่ ค่ำกลับ
Function
Return_Type Function_name(Type variable)
User-Defined Function (cont.)
Function
่ ตอ
 การเขียนฟั งก ์ช ันโดยทีไม่
้ งมีการ
ประกาศก่อน
 สามารถประกาศตัวแปรไว้ใช้งานเฉพาะ
ในฟั งก ์ช ันได้
 ฟั งก ์ช ันประกอบไปด้วย
• คาสัง่ (Statement) : การทางานอย่าง
หนึ่ง เรียงกันไป
่ นผลลัพธ ์การ
• Return : การคืนค่าทีเป็
ทางานของฟั งก ์ช ัน
Function Main
่
่
Main Function
้ กโปรแกรมจะต้องมี โดยโปรแกรมหลักจะ
ส่วนนี ทุ
่ นด้วย main() และตามด้วยเครืองหมายปี
่
เริมต้
ก
กาเปิ ด ‘{’ และปี กกาปิ ด ‘}’
ร ะ ห ว่ า ง ปี ก ก า จ ะ ป ร ะ ก อ บไ ป ด้ ว ย ค า สั่ ง
่
(Statement) ต่างๆ ทีจะให้
โปรแกรมทางาน
แ ต่ ล ะ ค า สั่ ง จ ะ ต้ อ ง จ บ ด้ ว ย เ ซ มิ โ ค ล อ น ‘ ; ’
#include <stdio.h>
(Semicolon)
void main(void)
{
...
Statement ;
}
Main Function (cont.)
ตัวอย่าง
#include <stdio.h>
int feet,inches;
void main()
{
feet = 6;
inches = feet * 12;
printf("Height in inches is %d",inches);
}
ผลการทางาน
Height in inches
is 72
Main Function
ตัว Main Function จะมีสามารถร ับค่าจากภายนอก
เข้ามาในโปรแกรมได้ โดยรู ปแบบการเขียนจะเป็ นดังนี ้
#include <stdio.h>
int main(int argc, char *argv[])
{
...
Statement ;
return 0;
}
่ งเข้ามาในโปรแกรม
argc คือ จานวนของข้อความทีส่
่ งเข้ามาในโปรแกรม
argv
คือ กลุ่มของข้อความทีส่
(array of char pointer)
การ return ของ main function เป็ นการส่งค่ากลับไป
Main Function (Example)
User-Defined Function (cont.)
สรา้ งฟั งก ์ชน
ั หรือคาใหม่ขนมาใช้
ึ้
งานตามที่
เราต้องการ
ร ะ ห ว่ า ง ปี ก ก า จ ะ ป ร ะ ก อ บ ด้ ว ย ค า สั่ ง
#include <stdio.h>
่ function()
(Statement) ต่างๆ ทีint
จะให้
ฟังก ์ช ันทางาน
void main(void)
{
สามารถเรียกใช้ภายใน
...
Statement ;
โปรแกรมได้ทุกที่
}
int function()
{
Statement ;
...
return (int value);
}
Example 4
ตัวอย่าง
#include <stdio.h>
int Feet2Inch(int);
int feet,inches;
void main()
{
feet = 6;
inches = Feet2Inch(feet);
printf("Height in inches is %d",inches);
}
int Feet2Inch(int f)
{
return f*12;
}
ผลการทางาน
Height in inches is 72
Example 5
#include <stdio.h>
void adder(int , int );
int summ;
int main()
{
ั โพรโตไทป์
adder(20, 30); // จุดทีเ่ รียกใชฟั้ งก์ชน
printf(“summary = %d”,summ)
return 0;
}
void adder(int a, int b)
{
summ = a+b;
}
How to process function?
int main()
{
f1()
f2()
f1()
{
return;
}
f2()
{
f1()
return;
}
return 0;
}
f1()
{
return;
}
Outline
1
2p
Function
User-Defined Function
3
Function Format
4
Passing Parameters
5
Assignment
Function Declaration
่ ั อยู
่ ่หลัง main()
เป็ นการประกาศการใช้งานฟั งก ์ชนที
type function_name(type-1,type-2,...,type-n);
่ าการ
คือ ชนิ ดของฟั งก ์ช ัน ว่าฟั งช ันทีท
สร ้างจะส่งข้อมู ลชนิ ดใดกลับ
่ งก ์ช ันทีจะสร
่
้
function_name
คือ ชือฟั
้างขึน
่
type-n
คือ ชนิ ดของข้อมู ลทีจะส่
งให้ฟังก ์ช ัน
type
Function Declaration(cont.)
่ ้างขึนเองมี
้
การเขียนโปรแกรมโดยมีฟังก ์ช ันทีสร
2
รู ปแบบ
• สร ้างฟั งก ์ช ัน ก่อน ฟั งก ์ช ันหลัก
่ ้างขึนได
้ ้
• ฟังก ์ชันหลักสามารถเรียกใช ้งานฟังก ์ชันทีสร
• สร ้างฟั งก ์ช ัน หลัง ฟั งช ันหลัก
่ ้ฟังก ์ชัน
• ต ้องประกาศ Function Prototype ก่อนเพือให
่ ้างขึน้
หลักรู ้ว่ามีฟังก ์ชันทีสร
Function Declaration(cont.)
#include<file.h>
type variable;
type function_name(type variable)
{
statement-1;
...
statement-n;
return(var);
}
int main()
{
type variable;
statement-1;
...
statement-n;
return 0;
}
Function Declaration(cont.)
#include<file.h>
type function_name(type);
type variable;
int main()
{
type variable;
statement-1;
...
statement-n;
return 0;
}
type function_name(type variable)
{
statement-1;
...
statement-n;
return(var);
}
Function Format #1
แบบที่ 1: ฟั งก ์ช ันแบบไม่มก
ี ารส่งค่ากลับและไม่ม ี
พารามิเตอร ์
่ มก
่ ยก
เป็ นฟังก ์ชันทีไม่
ี ารส่งค่ากลับไปให ้กับฟังก ์ชันทีเรี
่ ยกมาให ้ด ้วย
มา และไม่มก
ี ารส่งค่าจากฟังก ์ชันทีเรี
void main()
{
my_print();
}
void my_print()
{
printf(“Hello world”);
}
Function Format #2
แบบที่ 2 ฟั งก ์ช ันแบบไม่มก
ี ารส่งค่ากลับแต่ม ี
พารามิเตอร ์
่
มก
ี ารส่งค่ากลับไปให้ฟังก ์ช ันที่
• เป็ นฟั งก ์ช ันทีจะไม่
้
่ ยกมาให้
เรี
ย
กขึ
นมา
แต่
ม
ก
ี
ารส่
ง
ค่
า
จากฟั
งก
์ช
ันที
เรี
void
main()
void main()
{
{ ด้วย
my_print(2);
}
void my_print(int x)
{
printf(“%d”, x);
}
my_print(‘a’, 5);
}
void my_print(char ch, int x)
{
while (x > 0)
{
printf(“%c”, ch);
x--;
}
}
Function Format #3
แบบที่ 3 ฟั งก ์ช ันแบบมีการส่งค่ากลับและไม่ม ี
พารามิเตอร ์
่
่ ยก
•เป็ นฟั งก ์ช ันทีจะมี
การส่งค่ากลับไปให้ฟังก ์ช ันทีเรี
่ ยกมาให้ดว้ ย
มา แต่ไม่มก
ี ารส่งค่าจากฟั งก ์ช ันทีเรี
void main()
{
printf(“%d”,my_func());
}
int my_func()
{
int a;
scanf(“%d”,&a);
return (a*5);
}
Function Format #4
แบบที่ 4 ฟั งก ์ช ันแบบมีการส่งค่ากลับและมี
พารามิเตอร ์
่
•เป็ นฟั งก ์ช ันทีจะมี
การส่งค่ากลับไปให้ก ับฟั งก ์ช ันที่
่ ยกมาให้ดว้ ย
เรียกมา แต่มก
ี ารส่งค่าจากฟั งก ์ช ันทีเรี
void main()
char my_print(int x)
{
{
char ch;
char lch;
ch = my_print(5);
printf(“Enter your character: ”);
printf(“%c\n”, ch);
scanf(“%c”, &lch);
}
while (x > 0)
{
printf(“%c”, lch);
x--;
}
printf(“\n”);
return lch;
}
Example 4
*********
* EE-UP *
*********
START
show_star(n)
num=9
i=1
show_star(num)
i<=n
kmitl
F
T
*
i++
show_star(num)
end
END
Example 4 (cont.)
Example 5
Test yourself
จากโปรแกรมตัวอย่างจงอธิบาย
่
1. ฟั งก ์ช ันชืออะไร
?
2. มีการร ับค่าหรือไม่ ถ้ามี มีกพารามิ
ี่
เตอร ์ ?
3. ฟั งก ์ช ันร ับค่าเป็ นตัวแปรชนิ ดใด ?
4. ฟั งก ์ช ันมีการส่งค่ากลับหรือไม่ ถ้ามี ส่งค่ากลับเป็ นตัว
แปรชนิ ดใด ?
5. ถ้าต้องการตัดบรรทัด /*Function Prototype*/ ออก
่
ต้องปร ับเปลียนโปรแกรมอย่
างไร ?
6. โปรแกรมทางานอะไร ?
Variable & Scope of Function
ตวั แปร global
่ งก ์ช ันใดก็สามารถเรียกใช้ได้โดยจะ
เป็ นตวั แปรทีฟั
ประกาศสร ้างตัวแปรต่อจาก พรีโปรแซสเซอร ์ไดเร็คทีฟ
ตวั แปร local
่
เป็ นตวั แปรทีสามารถเรี
ยกใช้ได้ภายในเฉพาะฟั งก ์ช ันที่
้
ประกาศสร ้างตัวแปรนันโดยจะประกาศสร
้างตัวแปร
ภายในแต่ละฟั งก ์ช ัน
Example 6
Example 7
Outline
1
2p
Function
User-Defined Function
3
Function Format
4
Passing Parameters
5
Assignment
Passing Parameters (Arguments Passing)
การส่งค่าต ัวแปรให้ก ับฟั งก ์ช ันมีสองแบบคือ
1.
2.
่ บอยู ่ในตัวแปรให้กบ
การส่งค่าทีเก็
ั ฟั งก ์ช ัน (pass by
value)
การส่งค่าตาแหน่ งของตัวแปรให้กบ
ั ฟั งก ์ช ัน (pass
by pointer)
Passing by Value
่ งเข้าไป
ในการส่งผ่านค่าแบบ pass by value ค่าทีส่
่
ในฟั งก ์ชน
ั อาจเป็ นค่าคงทีโดยตรง
หรืออาจส่งเป็ น
ค่าจากตัวแปรก็ได้ เช่น result = add( a, b ); หรือ
result = add( 5, 10);
โปรแกรมจะน าค่ า คงที่ หรือ ค่ า ที่คัด ลอกมาจากตัว
่ ยกใช้ ส่งผ่านให้กบ
่ น
แปร ณ จุดทีเรี
ั พารามิเตอร ์ซึงเป็
่ กเรียกใช้เท่านัน
้
ตัวแปรภายในฟั งก ์ช ันทีถู
หากค่ า ที่ ส่ ง เข้า ไปท างานภายในฟั งก ช
์ น
ั มี ก าร
่
เปลียนแปลงไปจากเดิ
มจะไม่มผ
ี ลกระทบกบ
ั ค่าของตัว
่
Example 8
ในการเรียกใช้ฟังก ์ช ัน swap เราอาจมีการ
่
เปลียนแปลงค่
าอาร ์กิวเมนต ์ a และ b ภายในฟั งก ์ช ัน
void swap(int a, int b)
{
int temp;
printf(“swap: a = %d, b = %d\n”, a, b);
temp = a;
a = b;
b = temp;
printf(“swap: a = %d, b = %d\n”, a, b);
}
Example 8 (cont.)
int main()
{
int x = 5, y = 10;
printf(“main: x = %d, y = %d\n”, x, y);
swap(x, y);
printf(“main: x = %d, y = %d\n”, x, y);
return 0;
}
main: x = 5, y = 10
swap: a = 5, b = 10
swap: a = 10, b = 5
main: x = 5, y = 10
Pass by Pointer
การส่งผ่านค่าแบบ pass by Pointer เป็ นการส่งผ่าน
ค่าตาแหน่ ง (address) ของตัวแปร แทนการส่งค่า
่ บอยู ่ในตัวแปร
ของข้อมู ลทีเก็
่ างาน
การส่งค่าแบบนี ้จะทาให้ตาแหน่ งของข้อมู ลทีท
่ งก ์ชน
ภายในฟั งก ์ช ัน เป็ นตาแหน่ งเดียวกบ
ั ข้อมู ลทีฟั
ั
ส่งผ่านเข้ามาให้
่ การเปลียนแปลงค่
่
่ งผ่านเข้าไป
เมือมี
าของข้อมู ลทีส่
่ ่นอกฟั งก ์ชน
ทางานในฟั งก ์ชน
ั ค่าของตวั แปรทีอยู
ั ก็
่
จะเปลียนตามไปด้
วย
Pass by Pointer(cont.)
ภาษาซีใช้วธ
ิ ก
ี ารส่งผ่านค่าตาแหน่ งของตัวแปร โดย
ใช้ชนิ ดข้อมู ลแบบพอยน์เตอร ์ (pointer) เข้ามาช่วย
• การประกาศชนิ ดข้อมู ลแบบตัวชี ้ ใช้ตวั ดาเนิ นการ
* (Dereferencing operator)
Pass by Pointer(cont.)
นาฟั งก ์ช ัน swap จากตัวอย่างข้างต้นมาปร ับใหม่
 โดยใช้การส่งผ่านค่าแบบ pass by pointer
่ งผ่านเข้าไปมีการ
่
ขอ
้ มู ลของตัวแปรทีส่
เพือให้
่
่ กเปลียนภายในฟั
่
เปลียนแปลงตามค่
าทีถู
งก ์ช ัน
ด้วย
Example 9
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
/* Program: case2.c
swap values using pass by reference
*/
#include <stdio.h>
/* function prototypes */
void swap(int *a, int *b);
int main()
{
int x = 5, y = 10;
printf(“main: x = %d, y = %d\n”, x, y);
swap(&x, &y);
printf(“main: x = %d, y = %d\n”, x, y);
return 0;
}
Example 9 (cont.)
20: /* swap values of a and b */
21: void swap(int *a, int *b)
22: {
23:
int temp;
24:
25:
printf(“swap: a = %d, b = %d\n”, *a, *b);
26:
27:
temp = *a;
28:
*a = *b;
29:
*b = temp;
30:
31:
printf(“swap: a = %d, b = %d\n”, *a, *b);
32: }
Result
main: x = 5, y = 10
swap: a = 5, b = 10
swap: a = 10, b = 5
main: x = 10, y = 5
จากผลการทางานของโปรแกรม แสดงให้เห็นผลของ
่ าให้ค่า
การส่งผ่านค่าแบบ pass by pointer ซึงท
่ งผ่านให้กบ
่ ยกใช้ มีผล
ของตัวแปรทีส่
ั ฟั งก ์ชน
ั ทีเรี
่
้
ตามการเปลียนแปลงของค่
านันภายในฟั
งก ์ช ันด้วย
Pass by Reference Analysis
เราเคยใช้การส่งผ่านค่าแบบ pass by pointer มา
ก่อนในฟั งก ์ช ัน scanf
สังเกตได้ว่าส่วนอาร ์กิวเมนต ์ของฟั งก ์ชน
ั
scanf มี
ลักษณะเหมือนกัน โดยใช้ตวั ดาเนิ นการ & กาหนด
่
ต าแหน่ งของตัว แปร ทีจะร
ับค่ า เข้า มาจากคีย ์บอร ์ด
เช่น
scanf(“%d”, &no);
scanf(“%c”, &choice);
Example 10
Example 10 (cont.)
Result
Example 11
Example 12
Example 13
Summary Passing Parameters
้
การเลือ กใช้วธ
ิ ก
ี ารส่งผ่า นค่า ให้กบ
ั ฟั งก ์ช น
ั ขึนอยู
่กบ
ั
ว ัตถุประสงค ์การใช้
• ปกติการส่งค่าให้กบ
ั ฟั งก ์ชน
ั จะใช้วธ
ิ แ
ี บบ pass by
value เพราะการทางานภายในฟั งก ์ชน
ั ไม่ควรจะมี
ผลกระทบต่อค่าของตัวแปรภายนอก
• ฟั งก ช
์ น
ั มีช่ อ งทางในการส่ ง ค่ า กลับ มาให้ต วั แปร
ภายนอกอยู ่แล้ว โดยใช้ return
่ งกลับจากประโยค return
• แต่ค่าทีส่
มีได้เพียงค่า
เดียว หากต้องการผลลัพธ ์กลับจากฟั งก ์ชน
ั มากกว่า
1 ค่า ต้องใช้การส่งผ่านแบบ pass by pointer
Outline
1
2p
Function
User-Defined Function
3
Function Format
4
Passing Parameters
5
Assignment
Assignment #11
1. โปรแกรมเก็บข้อมู ลสินค้า 1 ชนิ ด ภายในโปรแกรม
ประกอบด้วย ฟั งก ์ช ันต่างๆดังนี ้
ฟั งก ์ช ันใส่ขอ
้ มู ลสินค้า
getdata()
่ านวนสินค้า 10 ชิน
้
ฟั งก ์ช ันเพิมจ
add10()
้
ฟั งก ์ช ันลดจานวนสินค้า 10 ชิน
sub10()
และฟั งก ์ช ันแสดงจานวนรายละเอียดภายในสินค้า
้ งไม่สมบรู ณด
โปรแกรมนี ยั
์ ี ให้นก
ั ศึกษาเขียนคา
่
ประกาศฟั งก ์ช ัน getdata() และ add10 และคาสังภายใน
ให้สมบรู ณ ์
Assignment #11 (cont.)
Assignment #11 (cont.)
้ เห
2. ให้นิสต
ิ อธิบายการทางานของโปรแกรมนี ้ พร ้อมก ับชีให้
แกรมคือจุดใด Hint: มีทผิ
ี่ ด 1 จุด
Assignment #11 (cont.)
้
3. โปรแกรมต่อไปนี แสดงผลเลขอะไรจอภาพ
ใช้เวลาคิด
่ ดเสร็จแล้วให้ลองพิมพ ์ code
ไม่เกิน 10นาที เมือคิ
ดังกล่าวลงคอมพิวเตอร ์ และตรวจสอบคาตอบ
Assignment #11 (cont.)
Assignment #11 (cont.)
้
4. จงวิเคราะห ์โจทย ์ วิเคราะห ์การทางาน เขียนขันตอนการ
ทางานอย่างละเอียด เขียนรหัส
เที ย ม เขี ย นแผนภาพการไหลของข้อ มู ล (Flowchart)
้ ยนโปรแกรมการเรียงลา
พร ้อมทังเขี
ดับตัวเลข (Bubble
sort) 10
จานวน จากน้อยไปมาก
ก า ห น ด ใ ห้ มี ก า ร ร ั บ ค่ า ตั ว เ ล ข 10
จ านวนจากแป้ นพิม พ ์ ให้เ ขีย นฟั งก ช
์ น
ั ในการเรีย งล าดับ
ตั ว เ ล ข ชื่ อ ฟั ง ก ์ ช ั น
“Sort_function”
โดยฟั งก ช
์ น
ั นี ้ จะส่ ง ผลลัพ ธ ์ของการเรีย งล าดับ ตัว เลขมา
แ ส ด ง ผ ล ใ น ฟั ง ก ์ ช ั น ห ลั ก
(main
function) และมีขอ
้ กาหนดให้ฟังก ์ช ันดังกล่าวมีการส่งค่าใน
ส อ ง รู ป แ บ บ คื อ pass
by
reference และ pass by value ตามลาดับ