Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
ภาษาซเบองตนส าหรบไมโครคอนโทรเลอร
ปฏบตการเกยวกบวศวกรรมคอมพวเตอร(01204223)
ผศ.ดร.ชยพร ใจแกว และ ผศ.ดร.อภรกษ จนทรสรางภาควชาวศวกรรมคอมพวเตอร
คณะวศวกรรมศาสตร มหาวทยาลยเกษตรศาสตร
2
คณสมบตของภาษาซ• พฒนาข นโดย Dennis Ritchie เมอป 1972 ท Bell
Telephone Laboratories เพอใชพฒนาระบบปฏบตการยนกซ
• ออกแบบใหงายตอการเขาถงหนวยความจ าโดยตรง• ค าสงในภาษาซงายตอการแปลเปนค าสงภาษาเครอง
➢ กลายเปนทนยมในการสรางซอฟตแวรทเคยเขยนดวยภาษาแอสเซมบล
➢ มความเรวในการท างานสง• เกอหนนการโปรแกรมทไมยดกบสถาปตยกรรมเครอง
3
ตวอยางโปรแกรมภาษาซ#include <stdio.h>
int main(){int a, b, sum;printf("Enter A: ");scanf("%d", &a);printf("Enter B: ");scanf("%d", &b);sum = a+b;printf("Sum = %d\n", sum);return 0;
}คนคา 0 เพอระบวา
โปรแกรมจบการท างานโดยไมมขอผดพลาด
อานไฟล stdio.h เพอเอาฟงกชนมาตรฐานมาใช
ฟงกชน main ระบจดเรมตนของโปรแกรม คนคากลบเปน int
ประกาศตวแปรแบบ int สามตวคอ a, b และ sum
ฟงกชนมาตรฐาน printf() ใชพมพขอความ
ออกทางหนาจอฟงกชนมาตรฐาน scanf()ใชรบอนพทจากแปนพมพ
4
การทดสอบโปรแกรมบนพซ• บนทกไฟลดวยนามสกล .c (เชน myprog.c) และใชค าสง gcc ในการคอมไพลโปรแกรม
• ค าสงขางตนจะใหผลลพธเปนไฟลโปรแกรม (executable) ชอ myprog.elf ซงสามารถเรยกทดสอบการท างานได
$ gcc -o myprog.elf myprog.c
$ ./myprog.elfEnter A: 3Enter B: 8Sum = 11
5
โปรแกรมส าหรบไมโครคอนโทรลเลอร• มกไมใช printf หรอ scanf เพราะมกไมมแปนพมพ/จอภาพ
➢ ตดตอกบอนพท/เอาทพทผานรจสเตอรพเศษ
• ไมมการจบการท างาน (ไม return จากฟงกชน main)
• การรนโปรแกรมตองการขนตอนเพมเตมเพอสงโคดไปยงอปกรณ
อาศยคอมไพเลอรชนดทแปลค าสงใหสถาปตยกรรมอน (เรยกวา cross-compiler) เชน avr-gcc
#include <avr/io.h>
int main(){
DDRD = 0b00001000;PORTD = 0b00000000;while (1)
;}
ก าหนดคาใหรจสเตอรเพอควบคมอนพท/เอาทพท ไมปลอยใหจบการท างาน
แมงานจะเสรจสแลว
6
ตวอยางการทดสอบโปรแกรมบน MCU• ใชค าสง avr-gcc เพอคอมไพลโปรแกรมส าหรบ MCU เบอร ATMega168
• สกดโคดภาษาเครองออกจากไฟล executable
• ดาวนโหลดโคดภาษาเครองลงสไมโครคอนโทรลเลอร➢ บอรดไมโครคอนโทรลเลอรตองพรอมในโหมด Boot Loader
$ avr-gcc -mmcu=atmega168 –O -o myprog.elf myprog.c
$ avr-objcopy -j .text -j .data -O ihex myprog.elf myprog.hex
$ avrdude -p atmega168 -c usbasp -U flash:w:myprog.hex
โครงสรางหนวยความจ า
• พ นท 8 บต เกบขอมลไดแตกตางกน 28 = 256 รปแบบ เชน➢ 0, 1, 2, …, 254, 255➢ -128, -127, …, -1, 0, 1, …, 126, 127
7
1 ชอง = 1 ไบต (8 บต)
ต ำแหนงทอย(address)
ขอมลทเกบ(data)
0000 320001 670002 2550003 00004 121
: :
ตวอยางการแทนขอมล 8 บต
8
คา 8 บตการตความ
จ านวนเตมไมมเครองหมาย
จ านวนเตมมเครองหมาย
อกขระตามมาตรฐาน ASCII
0000 0000 0 0 NUL
0000 0001 1 1 SOH
0000 0010 2 2 STX
: : : :
0011 0000 48 48 '0'
: : : :
0100 0001 65 65 'A'
: : : :
0111 1111 127 127 DEL
1000 0000 128 -128
: : :
1111 1111 255 -1
ขอมลเกน 8 บต และ Endianness• จ านวนเตมขนาดใหญ เชน 529 ไมสามารถจลงไบตเดยวได• แตกจ านวนเปนหลายหลกในระบบเลขฐาน 256
9
529 = 22561 + 172560 = (2,17)256
ต ำแหนงทอย(address)
ขอมลทเกบ(data)
a :a+1 :a+2 :a+3 :
ต ำแหนงทอย(address)
ขอมลทเกบ(data)
a:a+1:a+2:a+3:
2,17
ล าดบไบตแบบ Big Endian ล าดบไบตแบบ Little Endian
217
172
10
ชนดขอมลพนฐาน
ชอชนด มาตรฐาน C99 (ระบขนาด)
ขนาด(บต) คาต าสด คาสงสด
char int8_t 8 -128 +127unsigned char
uint8_t 8 0 255
short int16_t 16 -32,768 +32,767unsigned short
uint16_t 16 0 65,535
int - 16/32 -32,768/-2,147,483,648 +32,767/+2,147,483,647unsigned int
- 16/32 0 65,535 หรอ 4,294,967,295
long int32_t >=32 -2,147,483,648 +2,147,483,647unsigned long
uint32_t >=32 0 4,294,967,295
long long int64_t 64 -9,223,372,036,854,775,808 +9,223,372,036,854,775,807unsigned long long
uint64_t 64 0 18,446,744,073,709,551,615
11
• ใชแทนการอางถงหนวยความจ า ณ ต าแหนงหนง ๆ➢ เพอใชในการเกบขอมล (ทเปลยนคาได) ในขณะประมวลผล
ตวแปร (Variable)
uint16_t a, b, sum;a = 10;b = 5;sum = a+b;
ต ำแหนง คำ: :
1000 2
1001 30
1002 211
1003 5
1005 23
: :
1004 8
10
0
5
0
0
15
b มคา 5 (อางถงคา)&b มคา 1002 (อางถงต าแหนง)
a
b
sum
(สมมตใหใชการเรยงล าดบไบตแบบ Little Endian)
12
คาคงท (หรอสญพจน – Literal)• จ านวนเตม (ชนดขอมล char, short, long,...)
➢ เชน 10, -30• จ านวนเตมแบบยาว (ชนดขอมล long long)
➢ เชน 123456789012LL• เลข Floating point (ชนดขอมล float, double)
➢ เชน 3.14, 500.0• อกขระโดด (ชนดขอมล char)
➢ เชน 'a'
• คาจรง/เทจ (ชนดขอมล bool)➢ ไดแก true และ false
• สตรง (ชนดขอมล char*)➢ เชน "Hello"
13
คาคงทจ านวนเตมในฐานอน• คาคงทแบบตวเลขโดยทวไปตความเปนฐานสบ• ตวเลขทน าหนาดวย 0b ตความเปนฐานสอง
➢ 0b00101101 เทากบ 45➢ 0b1111011101001011 เทากบ 63307
• ตวเลขทน าหนาดวย 0x ตความเปนฐานสบหก➢ 0x41 เทากบ 65➢ 0xA00F เทากบ 40975
• ตวเลขทน าหนาดวย 0 ตความเปนฐานแปด➢ 051 เทากบ 41➢ 0775 เทากบ 509
14
การด าเนนการทางคณตศาสตร• ตวด าเนนการ + - * / มล าดบความส าคญตางกน
➢ * / ถกด าเนนการกอน + -➢ ความส าคญเทากนด าเนนการจากซายไปขวา➢ ใชวงเลบ () เพอจดล าดบการด าเนนการ
int a = 8+3*5-7*2;
int b = 8+(3*5)-(7*2);
int c = (((8+3)*5)-7)*2;
15
การด าเนนการทางคณตศาสตร• การด าเนนการทางคณตศาสตรบนจ านวนเตมไดผลลพธเปนจ านวนเตมเสมอ (รวมถงการหาร)
• / เปนการหารเอาผลลพธ สวน % เปนการหารเอาเศษ• หากผลลพธมคามากหรอนอยเกนกวาทขนาดตวแปรแบบจ านวนเตมจะเกบได ผลลพธจะถกคดทบกลบ
int a = 56/22349 + 32/30;
uint8_t a = 120+38;
uint16_t b = 3-10;
16
ตวด าเนนการแบบแกไขและตงคา• ตวด าเนนการทางคณตศาสตรสามารถใชคกบ "=" เพอค านวณคาและตงคาใหมใหตวแปรไดทนท
• ตวอยางsum += x; // เทยบเทากบ sum = sum + xprod *= 2.5; // เทยบเทากบ prod = prod * 2.5y -= 3+a; // เทยบเทากบ y = y – (3+a)
17
ตวด าเนนการเพมคา• ตวด าเนนการ ++ และ -- สามารถใชเพมและลดคาใหกบตวแปรหนงคา ตามล าดบ
• ตวอยางint n = 0;
n++; // เทยบเทากบ n = n+1 หรอ n += 1n++; // n มคาเปน 2n--; // n มคาเปน 1
18
ชนดขอมลอน ๆ• เลขทศนยม (floating point)
➢ float (4 ไบต) เกบเลขทศนยมแบบ single precision➢ double (8 ไบต) เกบเลขทศนยมแบบ double
precision** ไมแนะน ำใหใชในไมโครคอนโทรลเลอรขนำดเลก เนองจำกใชทรพยำกรของระบบมำก **
• ตวช (pointer)• อารเรย (array)
19
การแปลงชนดขอมลตวเลข• เรยกวาการท า type casting
• การเปลยนชนดขอมลทมรายละเอยดสงกวาไปเปนขอมลทรายละเอยดต ากวาอาจเกดการเปลยนแปลงคาของขอมลได
int a = 10;float b = (float) a;
อาจไมตองใสกได
float f = 3.8;int i = (int) f;
20
นพจนบลน• นพจนและตวแปรแบบบลน (Boolean) ใหคาทเปนไปไดสองคาคอ "จรง" และ "เทจ"
• ในภาษาซ➢ คา 0 มคาเทยบเทา "เทจ"➢ คาทไมใช 0 มคาเทยบเทา "จรง"
• มาตรฐาน C99 รองรบสญพจน true และ false
21
นพจนบลน• นพจนบลนสามารถน ามาผสมกนผานตวด าเนนการทางตรรกศาสตร
เพอสรางนพจนใหมได• ตวด าเนนการทางตรรกศาสตร
➢ && - AND➢ || - OR➢ ! - NOT
• ตวอยาง
➢ ถา x เปน 10 นพจนขางตนเปนเทจ➢ ถา x เปน 15 นพจนขางตนเปนจรง
(x > 12) && (x < 20)
22
• เปนตวแปรทเกบต าแหนงของหนวยความจ า➢ เพอใชอางองขอมลในหนวยความจ าต าแหนงอน ๆ
ตวแปรแบบตวช (Pointer)
uint16_t a = 57;uint16_t *p;p = &a;*p = 78;
ต ำแหนง คำ: :
0020 2
0021 30
0022 211
0023 5
0025 23
: :
0024 8
57
0
20
0
p
78
0
a
p มคา 20 (คาของ p)&p มคา 22 (ต าแหนงของ p)*p มคา 78 (คาในต าแหนงท p ชอย)
23
อารเรยและสตรง• ขอมลแบบอารเรยเปนการรวมกลมขอมลชนดเดยวกนไวเปนแถวล าดบ
• จดเปนตวแปรแบบตวชประเภทหนง
uint16_t arr[3];arr[0] = 50;arr[2] = 89;
arr มคา 20arr[0] มคา 50&arr มคา 20*arr มคา 50
23
8
ต ำแหนง คำ: :
0020 2
0021 30
0022 211
0023 5
0027 12
: :
0026 33
0025
0024
50
0
89
0
arr
24
ขอมลประเภทสายอกขระ (สตรง)• “สตรง” คออารเรยของอกขระโดด (array of char)
char s[] = "Hello";printf("%c %c %c\n", s[0], s[1], s[2]);
H e l
ผลลพธ:
25
ขอมลประเภทสตรค (struct)• ใชรวมขอมลใหเปนกลมเดยวกนstruct MyStruct{uint16_t a;uint8_t b[4];
};
int main(){struct MyStruct m;m.a = 3;m.b[0] = 4;m.b[2] = 5;:
}
23
8
ต ำแหนง คำ: :
0020 2
0021 30
0022 211
0023 5
0027 12
: :
0026 33
0025
0024
3
0
4
5
mm.a
m.b
26
การนยามรปแบบขอมลใหม• ใช typedef เพอสรางรปแบบขอมลทตองการ
➢ เพมความสะดวกในการใช structstruct MyStruct
{
uint16_t a;
uint8_t b[4];
};
typedef struct MyStruct MyStruct
int main()
{
MyStruct m;
:
}
typedef struct
{
uint16_t a;
uint8_t b[4];
} MyStruct;
int main()
{
MyStruct m;
:
}
27
การใชงานตวชกบสตรค
typedef struct{uint16_t a;uint8_t b[4];
} MyStruct;
int main(){MyStruct m;MyStruct *p = &m;(*p).a = 5; // เทยบเทำ p->a = 5p->b[1] = 4; // เทยบเทำ (*p).b[1] = 4
}
23
8
ต ำแหนง คำ: :
0020 2
0021 30
0022 211
0023 5
0027 12
0026 33
0025
0024
2
0029 7
0028
p
5
0
4
m
20
0
ขอมลประเภทยเนยน (union)• ใชนยามขอมลกอนเดยวกนใหมมมมองทแตกตางกน
28
50 ? ? ?
78 56 34 12
78 56 34 12
typedef struct {
uint32_t word;
uint8_t byte[4];
} MyStruct;
MyStruct s;
s.word = 0x12345678;
s.byte[0] = 0x50
typedef union {
uint32_t word;
uint8_t byte[4];
} MyUnion;
MyUnion u;
u.word = 0x12345678;
s.word
s.byte
u.word
u.byte
หมายเหต: คาในหนวยความจ าแสดงในฐาน 16
29
การรบ/แสดงผล• เหมาะส าหรบอปกรณทมหนาจอแสดงผล และใชทดสอบการท างานบางอยางบนเครองพซ
• ฟงกชนมาตรฐาน (เพอการรบ/แสดงผลขอมล) ถกเตรยมไว ในเฮดเดอรไฟล “stdio.h”
• ฟงกชนรบขอมล➢ scanf ส าหรบตวแปรทกชนด (ระบดวย %format)➢ getchar, getch ส าหรบตวแปรชนดอกขระโดด➢ gets ส าหรบตวแปรชนดสตรง
• ฟงกชนแสดงผลขอมล (Output Function)➢ printf ส าหรบตวแปรทกชนด (ระบดวย %format)
30
การแสดงผลขอมล• ทกอยางในหนวยความจ าลวนเปนตวเลข• การแสดงผลลพธดวยฟงกชน printf จงตองระบรปแบบตามทเราตองการจะเหน
char c = 65;
printf("c (as a number) = %d\n", c);
printf("c (as a character) = %c\n", c);
หนวยควำมจ ำ:
2
30
65
5
23
:
8
c
c (as a number) = 65
c (as a character) = A
ผลลพธ:
31
%format ใน scanf และ printfชนดขอมล ชนดตวแปร %format
จ านวนเตม
int %d
long %ld
long long %lld
unsigned int %u
unsigned long %lu
unsigned long long %llu
จ านวนมทศนยมfloat %f
double %lf
อกขระโดด char %c
สตรง char array[] %s
32
ตวอยางการใช scanf
char name[20];
int age;
printf("Enter your name and age: ");
scanf("%s %d", name, &age);
printf("Hello %s. You are %d years old.\n",
name, age);
Enter your name and age: Tony 38
Hello Tony. You are 38 years old.
ผลลพธ:
33
การด าเนนการระดบบต• ด าเนนการโดยตความจ านวนเตมเปนเลขฐานสอง• ใชมากในโปรแกรมส าหรบไมโครคอนโทรลเลอร
➢ เซตคาบตบางบตใหกบรจสเตอรโดยไมกระทบบตอน➢ อานคาบตบางบตจากรจสเตอร
34
ตวด าเนนการ AND, OR, NOT• & - ตวด าเนนการ AND
• | - ตวด าเนนการ OR
• ~ - ตวด าเนนการ NOT
uint8_t a = 0b01001011;uint8_t b = 0b01111000;uint8_t c = a & b;
0 1 0 0 1 0 1 1
AND 0 1 1 1 1 0 0 0
---------------
0 1 0 0 1 0 0 0
uint8_t a = 0b01001011;uint8_t b = 0b01111000;uint8_t c = a | b;
0 1 0 0 1 0 1 1
OR 0 1 1 1 1 0 0 0
---------------
0 1 1 1 1 0 1 1
uint8_t a = 0b01001011;uint8_t b = ~a;
NOT 0 1 0 0 1 0 1 1
---------------
1 0 1 1 0 1 0 0
35
ตวด าเนนการชฟตบต• >> N - ชฟตบตไปทางขวา N บต
➢ เทยบเทาการหารดวย 2N
** การชฟตไปทางขวาจะคงความเปน +/- ของตวตงไวเสมอ **
• << N - ชฟตบตไปทางซาย N บต➢ เทยบเทาการคณดวย 2N
uint8_t a = 0b01001011;uint8_t b = a >> 2;
0 1 0 0 1 0 1 1 >> 2
---------------
0 0 0 1 0 0 1 0
uint8_t a = 0b01001011;uint8_t b = a << 2;
0 1 0 0 1 0 1 1 << 2
---------------
0 0 1 0 1 1 0 0
36
ตวอยางการเซตคาบต• Ex. ตงคำใหขำ PD3 ท ำงำนเปนเอำทพท ทเหลอเปนอนนพท
➢ คา PD3 ถกนยามไวเทากบ 3 ในไฟลเฮดเดอร avr/io.h จงเขยนไดเปน
• Ex. ตงคำใหขำ PD3 ท ำงำนเปนเอำทพท โดยไมกระทบบนตอน
➢ หรอ
DDRD = (1 << 3);
DDRD = (1 << PD3);
DDRD = DDRD | (1 << PD3);
DDRD |= (1 << PD3);
37
ตวอยางการเซตคาบต• Ex. ใหขำ PC0, PC1, PC2, PC4 เปนเอำทพท ทเหลอไมเปล ยนแปลง
• Ex. ใหขำ PC3 เปนอนนพท ทเหลอไมเปล ยนแปลง
• Ex. สงลอจนก 1 ไปท PC0 และ PC1 และลอจนก 0 ไปท PC2
DDRC |= (1 << PC0) | (1<<PC1) | (1<<PC2) | (1<<PC4);
PORTC |= (1<<PC0) | (1<<PC1);PORTC &= ~(1<<PC2)
DDRC &= ~(1 << PC3);
38
ตวอยางการตรวจสอบคาบต• Ex. ตรวจสอบวำขำ PD7 มลอจนกเปน 1 หรอไม
• Ex. ตรวจสอบวำขำ PD5 มลอจนกเปน 0 หรอไม
if (PIND & (1<<PD7))// do something
if ( (PIND & (1<<PD5)) == 0)// do something
39
ตวอยางการประมวลผลระดบบต• Ex. น ำบนตทมคำนยส ำคญต ำทสด 3 บนตของตวแปร xมำก ำหนดลอจนกใหขำ PC2, PC1 และ PC0 โดยไมกระทบกบลอจนกของขำอน ๆ ของ PORTC
PORTC &= ~(0b00000111); // Clear bits PC2-PC0PORTC |= (x & 0b00000111);
40
ตวอยางการประมวลผลระดบบต• Ex. ตควำมคำในบนตท 6, 5 และ 4 ของรจสเตอร REG ใหเปนคำในชวง 0-7 เพอเกบคำไวในตวแปร x➢ ชฟตบต [6,5,4] มาทต าแหนง [2,1,0] แลวตดมาเฉพาะบต [2,1,0]
➢ เลอกตดบต [6,5,4] แลวชฟตมาทต าแหนง [2,1,0]
uint8_t x = (REG >> 4) & 0b00000111;
uint8_t x = (REG & 0b01110000) >> 4;
41
การไหลของโปรแกรม
• โปรแกรมแบบงาย ท างานรวดเดยวจากบนลงลาง
START
END
Statement
โปรแกรมทมค ำสงเดยว
โปรแกรมทมหลำยค ำสง
Statement1
Statement2
Statementn
END
START
Statement3
42
การควบคมการไหลของโปรแกรม• ค าสงก าหนดเงอนไข
➢ โครงสราง if➢ โครงสราง if…else
• ค าสงวนซ า➢ โครงสราง while loop➢ โครงสราง do…while loop➢ โครงสราง for loop
• โปรแกรมยอย (ฟงกชน)
43
โครงสราง ifif (condition)
{
statement1;
:
statementN;
}
C Syntax
START
END
Statement
conditiontrue
false
Statement
Flowchart
• สวนของ condition ตความเปนขอมลแบบ int
• ท าค าสงใน {} หาก conditionเปนจรง (ไมเปนศนย)
• หากมค าสงเดยวไมจ าเปนตองใชวงเลบปกกา
44
โครงสราง if…else
if (condition)
{
statementt1;
statementt2;
}
else
{
statementf1;
statementf2;
}
C SyntaxFlowchart
START
END
Statementf1
conditiontrue false
Statementt1
Statementf2Statementt2
45
โครงสราง if แบบหลายเงอนไขif (x==1)
Action1;
else if (x==2)
Action2;
else if (x==3)
Action3;
else if (x==4)
Action4;
else
Default_Action;
false
Action1;x==1
Action2;x==2
Action3;x==3
Action4;x==4
true
true
true
true
false
false
false
Default_Action;
46
โครงสราง switch-caseswitch (x)
{
case 1: Action1;
break;
case 2: Action2;
break;
case 3: Action3;
break;
case 4: Action4;
break;
default: Default_Action;
break;
}
false
Action1;x==1
Action2;x==2
Action3;x==3
Action4;x==4
true
true
true
true
false
false
false
Default_Action;
47
โครงสราง while ลป
• วนท าค าสง stmt1 ถง stmtNตราบเทาท condition เปนจรง
condition
END
START
true
Statement
Statement
false
while (condition)
{
stmt1;
stmt2;
:
stmtN;
}
48
โครงสราง do…while ลป
• ท าค าสง stmt1...stmtNและวนท าซ าอกตราบเทาทcondition ยงคงเปนจรง
• นนคอ stmt1...stmtN จะถกกระท าอยางนอยหนงครง END
condition
false
START
Statement1
StatementN
true
do
{
stmt1;
stmt2;
:
stmtN;
} while (condition);
49
ลปวนนบ (Counting Loop)• หากพจารณาโครงสรางของลปทใชในโปรแกรมสวนใหญ มกจะเปนลปแบบวนนบ
• ลปวนนบจะมสวนประกอบดงตวอยางตอไปนเสมอ
int i, sum = 0;
i = 1;
while (i <= 10)
{
sum = sum + i;
i = i + 1;
}
printf("Sum = %d\n", sum);
ตวแปรทใชนบ
สวนก าหนดคาเรมตน
การปรบคาตวนบ
เงอนไขของตวนบ
ค าสงทถกท าซ า
50
โครงสราง for ลป• เปนโครงสรางทใหความสะดวกในการเขยนลปวนนบ
• การท างาน1. ท าค าสง init_stmt หนงครง2. ถา condition เปนจรง ท าค าสง statement1...statementN3. ท าค าสง update_stmt จากนนกลบไปท าขอ 2
for (init_stmt; condition; update_stmt)
{
statement1;
statement2;
:
statementN;
}
51
การท างานของ for ลปSTART
END
falsecondition
true
Statement1
StatementN
init_stmt
update_stmt
for (init_stmt; condition; update_stmt)
{
statement1;
statement2;
:
statementN;
}
52
โปรแกรมยอย (Subroutine)• ในภาษาซเรยกวา "ฟงกชน" (Function)• เปนสวนของโปรแกรมทมหนาทการท างานชดเจนในตวเอง ซงถกเรยกใชในโปรแกรมหลกอกทหนง
• การเขยนโปรแกรมโดยแยกเปนฟงกชนมขอดหลายประการ➢ ชวยแบงงานทซบซอนเปนงานยอยหลายงาน➢ ลดการเขยนโคดทซ าซอน➢ ซอนรายละเอยดไวในสวนอน ท าใหโปรแกรมเขาใจไดงายข น➢ ฟงกชนทเขยนขนมาสามารถน าไปใชในโปรแกรมอนได
53
ชนดของฟงกชน• ฟงกชนมาตรฐาน (Standard Functions)
➢ เปนฟงกชนทอยในชดไลบรารของภาษาซ เรยกใชไดทนท➢ เชน printf(), scanf(), ...
• ฟงกชนทผใชก าหนด (User Defined Functions)➢ เปนฟงกชนทผใชสรางข นเอง ➢ เรยกใชใน main() หรอจากฟงกชนอนๆ ไดเหมอนฟงกชนมาตรฐาน
54
ตวอยางฟงกชนมาตรฐาน
กลมฟงกชน เฮดเดอรไฟล ตวอยางฟงกชน
จดการอนพท/เอาทพท stdio.hscanf, printf, gets, puts
คณตศาสตร math.h sin, cos, exp, pow
แยกประเภทขอมลอกขระ ctype.hisalpha, isdigit, islower, isupper
จดการกบสตรง string.hstrlen, strcpy, strcmp
อน ๆ stdlib.h rand, atoi, atof
55
ฟงกชนทผใชก าหนดเอง• แบบไมสงคากลบ
➢ ระบชนดขอมล void➢ ไมตองมค าสง return
• แบบสงคากลบ➢ ระบชนดขอมลทตองการ➢ ใชค าสง return สงคาคนตามชนดทระบ
void say_hi(char *name)
{
printf("Hi, %s\n", name);
}
int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
56
การไหลของโปรแกรมเมอใชฟงกชน
int incr(int i)
{
int j;
j = i + 1;
return j;
}
int main()
{
int k, m = 4;
k = incr(m);
printf ("k = %d, m = %d\n", k, m);
return 0;
}
57
ขอผดพลาดทพบบอย#include <stdio.h>
int main ()
{
int i;
scanf("%d", i);
if (i = 0)
puts("false");
else
puts("true");
return 0;
}
สงคา i ให scanf แทนทจะสงต าแหนง
ใชค าสงก าหนดคา (=) แทนการเปรยบเทยบ (==)
58
ขอผดพลาดทพบบอย#include <stdio.h>
int main ()
{
char s[10];
printf("Enter password: ");
scanf("%s", s);
if (s == "pass")
puts("Correct password");
else
puts("Incorrect password");
return 0;
}
ใช == เปรยบเทยบสตรงไมไดใชฟงกชน strcmp() แทน