177
ภภภภภภภภภภภ (ภภภภภภ)

โปรแกรม ภาษาซี

Embed Size (px)

Citation preview

Page 1: โปรแกรม ภาษาซี

ภาษาโปรแกรม (ภาษาซ)

Page 2: โปรแกรม ภาษาซี

2

ภาษาBCPL

ภาษา B

ภาษา C

1. ประวตความเปนมา

บนเครอง PDP-7 (UNIX)พ.ศ. 2513

พ.ศ. 2515โดย เดนนช รทช

Basic CombinedProgrammingLanguage

Page 3: โปรแกรม ภาษาซี

3

# header สวนท 1main( ){ /* เรมโปรแกรม */ declaration สวนท 2 ……… คำาสงตาง ๆ สวนท 3

}

2. โครงสรางพนฐานของภาษาซ

Page 4: โปรแกรม ภาษาซี

4

สวนท 1 เปนสวนทระบใหซคอมไพเลอรเตรยมการทำางานทกำาหนด ในสวนนไว โดยหนาคำาสงจะมเครองหมาย # เชน # include <stdio.h> เปนการระบใหนำาไฟล stdio.h มารวมกบไฟลน เพอทจะ สามารถใชคำาสงทอยในไฟลนมาใชงานได หรอ # define START 0 เปนการกำาหนดคาคงทใหกบตวแปร START โดยใหมคาเปน 0 หรอ # define temp 37 เปนการกำาหนดใหตวแปร temp มคาเทากบ 37

Page 5: โปรแกรม ภาษาซี

5

สวนท 2 declaration เปนการกำาหนดชนดขอมลทจะใชใน โปรแกรมซงตวแปรหรอขอมลตาง ๆ นนจะตองถก ประกาศ(declare) ในสวนนกอน จงจะสามารถนำาไปใช ในโปรแกรมได เชน int stdno; เปนการกำาหนดวาตวแปร stdno เปนขอมลชนดจำานวนเตม หรอ interger ซงอาจไดแกคา 0,4,-1,-3,…. เปนตน float score; เปนการกำาหนดวาตวแปร score เปนขอมลชนดเลขมจด ทศนยม (floating point) ซงอาจมคา0.23, 1.34, -21.002, เปนตน

Page 6: โปรแกรม ภาษาซี

6

สวนท 3 Body คอสวนของตวโปรแกรม โดยจะตองเรมตนดวยฟงกชน main ( ) แลวใสเครองหมายกำาหนดขอบเขตเรมตนของตว โปรแกรมคอ { หลงจากนนใสคำาสงหรอฟงกชนตาง ๆ โดยแต ละคำาสงหรอฟงกชนนน ๆ จะตองปดดวยเครองหมาย ; เมอตองการจบโปรแกรมใหใสเครองหมาย } ปดทาย เชน main ( ) { /* เรมตนโปรแกรม */ คำาสงตาง ๆ ; ฟงกชน; …………… …………... } /* จบโปรแกรม */

Page 7: โปรแกรม ภาษาซี

7

เครองหมายตาง ๆ

{ } - เปนตวกำาหนดขอบเขตหรอบลอกของฟงกชน ( ) - เปนการระบตวผานคาหรอ

อารกวเมนตใหกบฟงกชน ถาภายในวงเลบไมมขอความใด ๆแสดงวาไมมตวผาน คาทตองการระบสำาหรบฟงกชนนน ๆ/* */ - เปนการกำาหนด comment หรอ

ขอความ ทไม ตองการใหคอมไพเลอรปฏบตงานซงขอความทอย ภายในเครองหมายนจะถอวา ไมใชคำาสงปฏบตงาน

Page 8: โปรแกรม ภาษาซี

8

# include <stdio.h>int main (void ){ printf(“Hello, Good morning. \n”);}

ตวอยางโปรแกรม

โปรแกรมท 1

เปนโปรแกรมสงพมพขอความ Hello, Good morning.

Page 9: โปรแกรม ภาษาซี

9

โปรแกรมท 2# include <stdio.h>main ( ){ float point; printf("\n\nPut your score in\n"); scanf("%f", &point); printf("Your score is %f point\n\n", point);}

เปนโปรแกรมรบคะแนนและเกบคาทตวแปร point หลงจากนนสงใหมการพมพคะแนนออกมา

Page 10: โปรแกรม ภาษาซี

10

ชนดของขอมลและตวแปรในภาษาซ

การกำาหนดชอตวแปร หลกการมดงน 1. ตองขนตนดวยตวอกษร 2. หามใชเครองหมายทางคณตศาสตรในชอตวแปร 3. สามารถใชเครองหมาย underline ‘_’ ได 4. หามใช reserved words เชนint, float, etc. Note: คอมไพเลอรในภาษาซสามารถเหนความ

แตกตางของชอตวแปรไดยาวไมเกน 8 ตวอกษรและชอตวแปรจะแตกตางกนถาใชรปแบบของตวอกษรตางกน

Page 11: โปรแกรม ภาษาซี

11

แบบขอมลหรอชนดของตวแปรตาง ๆ ทกำาหนดไวในภาษาซ char ชนดของตวอกษรหรออกขระ

int ชนดจำานวนเตมปกตshort ชนดจำานวนเตมปกตlong ชนดจำานวนเตมทมความ

ยาวเปน 2 เทาunsigned ชนดของเลขทไมคด

เครองหมายfloat ชนดเลขมจดทศนยมdouble ชนดเลขทมจดทศนยมความ

ยาวเปน 2 เทา

แบบขอมลและขนาด

Page 12: โปรแกรม ภาษาซี

12

ชนดขอมล ( )เนอทสำ�หรบเกบไบต ค�ตวเลขทเกบChar 1 เกบตวอกษรASCII 1 0 255ได ตวหรอจำ�นวนเตมระหว�ง ถงInt 2 –32768 32767ค�ตวเลขระหว�ง ถงShort 2 –32768 32767ค�ตวเลขระหว�ง ถงLong 4 ค�ตวเลขประม�ณ 2000 ล�นUnsigned Unsigned short = 2

Unsigned long = 4 0 65535ค�ตวเลขระหว�ง ถง 0 4000 ค�ตวเลขระหว�ง ถง ล�น

Float 4 10ไดค�ตวเลขยกกำ�ลง x โดย x –37 +38มค�ระหว�ง ถงDouble 8 คว�มถกตองของตวเลขจะมค�สงขน

ตารางแสดงเนอทในหนวยความจำาและคาตวเลขทเกบของขอมลแตละชนด

Page 13: โปรแกรม ภาษาซี

13

ในการเขยนโปรแกรม แบบขอมลทใชจะแบงออกเปน 4 กลมใหญ ดงน

ขอมลและตวแปรชนดอกขระ

ขอมลและตวแปรชนดจำานวนเตม

ขอมลและตวแปรชนดเลขมจดทศนยม

ขอมลและตวแปรแบบสตรง

Page 14: โปรแกรม ภาษาซี

14

ขอมลและตวแปรชนดอกขระ1 อกขระแทนดวย char ‘ ’ โดยอยภายในเครองหมาย เชน

# include <stdio.h>main ( ){ char reply;

reply = ‘y’; …………………}

Page 15: โปรแกรม ภาษาซี

15

การใหคาอกขระทเปนรหสพเศษหรอรหสควบคม อกขระเหลานไมสามารถใหคาโดยตรง แตจะ

ทำาไดโดยการใหคาเปนรหส ASCII ซงจะเขยนใน ‘รปของเลขฐานแปด โดยใชเครองหมาย \’ นำา

หนา หรอใชตวอกขระทกำาหนดใหกบรหสนน ๆ ‘เขยนตามเครองหมาย \’ สำาหรบรหสบางตว เชน

รหส BELL แทนดวย ASCII 007 ซงกำาหนดไดดงน beep = ‘\007’; หรอรหสควบคมการขนบรรทดใหม ตวอกขระท

กำาหนดใหกบรหส คอ n สามารถกำาหนดเปน newline = ‘\n’;

Page 16: โปรแกรม ภาษาซี

16

ตวอยางโปรแกรม

# include <stdio.h>main ( ){ char newline;

newline = ‘\n’; printf(“Hello, Good morning. %c”,newline);

printf(“Hello, Good morning.\n”);}

Page 17: โปรแกรม ภาษาซี

17

ขอมลและตวแปรชนดจำานวนเตม จำานวนเตมในภาษาซสามารถใชแทนได 4 รปแบบ

คอ int, short, long และ unsigned สำาหรบการกำาหนดตวแปรแบบ unsigned คอ

จำานวนเตมทไมคดเครองหมายนนจะตองใชควบค กบรปแบบขอมลจำานวนเตมชนดอน ๆ คอ int

หรอ short หรอ long ตวอยางเชน unsigned int plusnum;

unsigned long width; unsigned short absno; /* absolute number */

Page 18: โปรแกรม ภาษาซี

18

ขอมลและตวแปรชนดเลขมจดทศนยม สำาหรบเลขมจดทศนยมนนแทนได 2 แบบคอ float และdouble โดย double เกบคาไดเปน 2 เทาของ float สำาหรบงานทางวทยาศาสตรทตองการความละเอยดในการเกบคา

มกใชการเกบในรปแบบน คอเกบแบบเอกโพเนนซ ดงตวอยางตอไปน

ตวเลข แสดงแบบวทยาศาสตร แบบเอกโพเนนซ 9,000,000,000 9.0*109 9.0e9 345,000 3.45*105 3.45e5 0.00063 6.3*10-4 6.3e-4 0.00000924 9.24*10-6 9.24e-6

Page 19: โปรแกรม ภาษาซี

19

ขอมลและตวแปรแบบสตรง

สตรงหมายถงตวอกขระหลาย ๆ ตวมาประกอบกนเปนขอความ ซงการทนำาตวแปรหลาย ๆ ตวมาเกบรวมกนในภาษาซนเรยกวา อะเรย

(array) ดงนนขอมลแบบสตรงคอ อะเรยของตวอกขระ นนเอง เครองหมายของอะเรยคอ [ ] รปแบบการกำาหนดสตรงจงม

ลกษณะดงน char name[30];

หมายถง ตวแปร name เปนชนด char ทมความยาว 30 ตวอกษร โดยเกบเปน อะเรย การเกบนนจะเกบเรยงกนทละไบต และไบตสดทาย

เกบรหส null คอ \0 ดงนนจะเกบไดจรงเพยง 29 ตวอกษร

Page 20: โปรแกรม ภาษาซี

20

การกำาหนดคาใหตวแปรและการสงผลลพธการกำาหนดคาใหตวแปรอาจทำาไดโดยกำาหนดในโปรแกรม

หรอกำาหนดในขณะทมการกำาหนดชนดกได เชนmain ( ){ int age = 18; float height; height = 172.5; printf(“Mr. Surasak is %d years old”,age); printf(“ and tall %f cms.\n”,height);}

Page 21: โปรแกรม ภาษาซี

21

ตวอยางของโปรแกรมในการกำาหนดคาและสงคาผลลพธ# include <stdio.h>main ( ){ int sum,valuea; int count = 1; valuea = 4; sum = count + valuea; printf(“Total value is %d.\n”,sum);}ผลลพธจะปรากฏขอความ : Total value is 5.

Page 22: โปรแกรม ภาษาซี

22

ฟงกชน printf( ) และ scanf( )

รปแบบของ printf ( ) printf( สวนควบคมการพมพ, อารกวเมนต, อารกวเมนต,...)

สวนควบคมการพมพ เปนสตรงทมขอความและ “ รปแบบของการพมพโดยอยในเครองหมาย

อารกวเมนต เปนสวนทจะนำาขอมลมาพมพตามรปแบบทกำาหนดมาในสวนควบคมการพมพ

Page 23: โปรแกรม ภาษาซี

23

รปแบบทใชสำาหรบกำาหนดการพมพในฟงกชน printf %d พมพดวยเลขฐานสบ

%o ” ” เลขฐานแปด %x ” ” เลขฐานสบหก %u ” ” เลขฐานสบแบบไมคดเครองหมาย

%e ” ” ตวเลขแบบวทยาศาสตร เชน 2.13e45%f ” ” ตวเลขมจดทศนยม%g ” ” รปแบบ %e หรอ %f โดยเลอกแบบ

ทสนทสดสำาหรบสตรงมรปแบบการพมพดงน

%c พมพดวยตวอกษรตวเดยว%s ” ”ขอความ

Page 24: โปรแกรม ภาษาซี

24

เครองหมายสำาหรบปรบเปลยนรปแบบของขอมล

เครองหมายลบ ใหพมพขอมลชดขอบซาย (ปกตขอมลทงหมดจะพมพชดขวา) สตรงตวเลข ระบความกวางของฟลด จดทศนยม เปนการกำาหนดความกวางของจดทศนยม

Note การปรบเปลยนรปแบบของขอมลนทำาไดโดย การใส เครองหมายเหลานระหวางเครองหมาย % และเครองหมาย ทกำาหนดรปแบบการพมพ

Page 25: โปรแกรม ภาษาซี

25

รปแบบของ scanf ( )

scanf( สวนควบคมขอมล, อารกวเมนต, อารกวเมนต,...)

สวนควบคมขอมล เปนการกำาหนดรปแบบขอมลใน “ ”เครองหมาย

อารกวเมนต เปนสวนทจะนำาขอมลมาเกบ(ในตวแปร) ซงชนดของขอมลตองตรงตามรปแบบทกำาหนดในสวน

ควบคมขอมล การกำาหนดลกษณะอารกวเมนตมได 2 แบบดงน

ถาขอมลนนอาจจะนำาไปใชในการคำานวณ - จะใสเครองหมาย & หนาตวแปร ถาขอมลนนเปนขอความทจะนำาไปเกบไวในตวแปรเลย - ไมจำาเปนตองใสเครองหมาย & หนาตวแปร

Page 26: โปรแกรม ภาษาซี

26

โอเปอเรเตอรและนพจน

การแทนโอเปอเรเตอรทางคณตศาสตรสำาหรบภาษาซ+ การบวก- การลบ* การคณ/ การหาร% การหารเอาเศษ (โมดลส)

Page 27: โปรแกรม ภาษาซี

27

การเปลยนชนดของขอมล

ทำาไดโดยระบชนดทตองการเปลยนภายใน เครองหมาย ( )

แลววางหนาตวแปรหรอขอมลทตองการเปลยนแปลงชนด

float money; ตองการเปลยนตวแปร float ไปเปน

integer ทำาไดดงน (int) money;

int cost; cost = 2.7+4.5; cost = (int)2.7+(int)4.5;

Page 28: โปรแกรม ภาษาซี

28

การเพมคาและลดคาตวแปร ++n เพมคา n อก 1 - -n ลดคา n ลง 1

ความแตกตางระหวาง count++ และ ++count เชน count = 5; x = count++; จะไดคา x เทากบ5 แลวคา count

เทากบ 6 count = 5; x = ++count; จะไดคา x เทากบ6

Page 29: โปรแกรม ภาษาซี

29

นพจนกำาหนดคา (Assignment expression) เครองหมายทใชกำาหนดคาคอ =

โดยเปนการกำาหนดคาทางขวาของเครองหมายใหกบตวแปรทอย

ทางซาย เชน j = 7+2 หรอ k = k+4

3.4.6 เครองหมายและนพจนเปรยบเทยบ > หรอ >= มากกวา หรอมากกวาเทากบ < หรอ <= นอยกวา หรอนอยกวาเทากบ == เทากบ != ไมเทากบ

Page 30: โปรแกรม ภาษาซี

30

ความแตกตางของเครองหมาย = และ == เครองหมาย = เปนตวกำาหนดคา

ในขณะทเครองหมาย == เปนเครองหมายเปรยบเทยบ ตวอยางเชน

point = 44; หมายถง เปนการกำาหนดคาใหกบตวแปร point ใหมคาเทากบ 44

point == 44; หมายถง เปนการตรวจสอบวาคา point มคาเทากบ 44 หรอไม

Page 31: โปรแกรม ภาษาซี

31

เครองหมายและนพจนเปรยบเทยบแบบตรรกศาสตร && และ (and) | | หรอ (or) ! ไม (not)

คาของนพจนเปรยบเทยบเชงตรรก นพจนท 1 && นพจนท 2 เปนจรง เมอนพจนทงสองเปนจรง นพจนท 1 | | นพจนท 2 เปนจรง เมอนพจนใดนพจนหนง เปนจรงหรอ ทงสองนพจนนนเปนจรง ! นพจนเปรยบเทยบ เปนจรง เมอนพจนเปรยบเทยบเปนเทจ

Page 32: โปรแกรม ภาษาซี

32

คำาสง if รปแบบของคำาสง if (เงอนไข) คำาสงทตองทำา ถาเงอนไขนนเปนจรง; ตวอยางเชน if (score >= 80) grade = ‘A’; /* simple statement */ หรอ if (math >= 60 && eng >= 55) { grade = ‘S’; /* compound statement */ printf(“Your grade is %c\n”,grade); }

Page 33: โปรแกรม ภาษาซี

33

คำาสง if ….. else ….. รปแบบของคำาสง if (คำาสงหรอนพจนเงอนไข) คำาสงทตองทำาเมอเงอนไขนนเปนจรง else คำาสงทตองทำาเมอเงอนไขนนไมเปนจรง

ตวอยางเชน if (value1 > value2) min = value2; else min = value1;

Page 34: โปรแกรม ภาษาซี

34

เครองหมายพเศษทใชในการเปรยบเทยบเงอนไข ? : รปแบบทวไปของคำาสงเปรยบเทยบเงอนไข ? : มดงน นพจนท 1 ? นพจนท 2 : นพจนท 3

ความหมายคอ if นพจนท 1 เปนจรง ทำาตามคำาสงในนพจนท 2 else ทำาตามคำาสงในนพจนท 3 เชน x = (y< 0) ? -y : y;

Page 35: โปรแกรม ภาษาซี

35

คำาสงตรวจสอบเงอนไขหลาย ๆ ทาง : switch และ break

รปแบบคำาสง switch (นพจน) { case label1 : statement1; case label2 : statement2; …………….. …………….. default : statementn; }

Page 36: โปรแกรม ภาษาซี

36

ตวอยาง switch (ch) { case ‘1’ : printf(“Red\n”); case ‘2’ : printf(“Blue\n”); case ‘3’ : printf(“Yellow\n”); default : printf(“White\n”); }

Page 37: โปรแกรม ภาษาซี

37

ตวอยาง switch (ch) { case ‘1’ : printf(“Red\n”); break;

case ‘2’ : printf(“Blue\n”); break;

case ‘3’ : printf(“Yellow\n”); break;

default : printf(“White\n”); }

Page 38: โปรแกรม ภาษาซี

38

คำาสง loop หรอคำาสงวนซำา

คำาสงลป while รปแบบ while (นพจนเงอนไข) { คำาสงทวนลป; ………… compound statements …………. }

Page 39: โปรแกรม ภาษาซี

39

คำาสงลป for รปแบบ for ( นพจนท 1 ; นพจนท 2 ;

นพจนท 3 ) { คำาสงวนรอบ; ……. } เปนคำาสงทใชในการควบคมใหมการวนรอบคำา

สงหลาย ๆ รอบ โดยนพจนท 1 คอการกำาหนดคาเรมตนใหกบตวแปร

ทใชในการวนรอบ นพจนท 2 เปนการเปรยบเทยบ กอนทจะวนรอบถา

เงอนไขของนพจน เปนจรงจะมการทำางานตามคำาสงวนรอบ นพจนท 3

เปนคำาสงในการกำาหนดคาทจะเปลยนแปลงไปในแตละรอบ

Page 40: โปรแกรม ภาษาซี

40

คำาสงวนรอบแบบทตรวจสอบเงอนไขทหลง : do while รปแบบ do statement; while (นพจนเงอนไข); เชน num = 2; do { num++; printf(“Now no is %d\n”,num); } while (num == 10)

Page 41: โปรแกรม ภาษาซี

41

คำาสงควบคมอน ๆ break, continue, goto และ labels

คำาสง break ใชเมอตองการใหการทำางานสามารถหลดออกจากลปและกระโดด

ไปยงคำาสงทอยนอกลปทนท โดยไมตองตรวจสอบเงอนไขใด ๆ

คำาสง continue ใชเมอตองการใหการทำางานนน ยอนกลบไปวนรอบใหมอกครง

ซงมลกษณะทตรงขามกบคำาสง break

Page 42: โปรแกรม ภาษาซี

42

คำาสง goto และ labels คำาสง goto ประกอบดวย 2 สวน คอ

- ตวคำาสง goto เปนคำาสงใหกระโดดไปยงตำาแหนงทกำาหนด โดยจะกำาหนดเปนชอ เรยกวา label name - ชอ (label name) เปนตวกำาหนดตำาแหนงทคำาสงจะกระโดด ไปทำางาน

ขอควรระวง ! คำาสงนถอเปนคำาสงทควรหลกเลยงในการเขยนโปรแกรม แตถาจำาเปนหรอหลกเลยงไมไดเทานน จงจะใชคำาสงน

Page 43: โปรแกรม ภาษาซี

43

ตวอยางโปรแกรมทใชคำาสง goto#include<stdio.h> main(){ int sum,n;

for(n=1;n<10;n++)

if (n==5) goto part1; else printf(“%d\n”,n);

part1 : printf(“Interrupt with no. 5\n”);}

Page 44: โปรแกรม ภาษาซี

44

ฟงกชน ฟงกชน (Function)(Function)

Page 45: โปรแกรม ภาษาซี

45

ฟงกชน ฟงกชน(Functions)(Functions)

การออกแบบโปรแกรมในภาษาซจะอย บนพนฐานของการออกแบบโมดล

(Module Design) โดยการแบง โปรแกรมออกเปนงานยอย ๆ (หรอโมดล)

แตละงานยอยจะทำางานอยางใดอยางหนง เทานน และไมควรจะมขนาดใหญจนเกนไป

งานยอยเหลานเมอนำาไปเขยนโปรแกรมในภาษาซจะเปนการเขยนในลกษณะของฟงกชน

Page 46: โปรแกรม ภาษาซี

46

รบขอมล 2 จำานวนจากผใชบวกเลข 2 จำานวนแลวเกบผลลพธแสดงผลลพธของการทำางาน

โปรแกรมเพอบวกเลขสองจำานวนทรบจากผใช และแสดงผลการคำานวณ

ตวอยาง

สามารถแบงการทำางานเปนงานยอยไดดงน

Page 47: โปรแกรม ภาษาซี

47

ฟงกชนการรบขอมลฟงกชนในการบวกเลขฟงกชนแสดงผลลพธ

จะไดวาโปรแกรมประกอบดวยฟงกชน 4 ฟงกชนคอฟงกชนหลก

ตวอยาง (ตอ)

Page 48: โปรแกรม ภาษาซี

48

Source filefunction

functionfunction

Source filefunction

functionfunction

Object file

Object file

Library file

Execute file

compile

compile

link

link

link

ขนตอนการสรางโปรแกรม ดวยภาษา C

Page 49: โปรแกรม ภาษาซี

49

41. รปแบบของฟงกชน

ชนดขอมลทคนคา ชอฟงกชน ( การ ประกาศตวแปร )

{ การประกาศตวแปรภายในฟงกชน;

คำาสง;return (คาขอมลทตองการ

สงคากลบ);}

int , char , float , double ฯลฯ

แบบท 1

Page 50: โปรแกรม ภาษาซี

50

รปแบบของฟงกชน (ตอ)

void ชอฟงกชน ( การประกาศ ตวแปร )

{การประกาศตวแปรภายใน

ฟงกชน;คำาสง;

}

แบบท 2

Page 51: โปรแกรม ภาษาซี

51

ตวอยาง 41.

แสดงการทำางานของโปรแกรมการบวกเลขจำานวนจรง 2 จำานวนทรบจากผใช

#include <stdio.h>double InputDouble ( ) {

double x; printf ( “\nInput real

value : “ ); scanf ( “%.2f ”, &x ); return ( x );

}

Page 52: โปรแกรม ภาษาซี

52

ตวอยาง 41.

(ตอ)double SumDouble ( double x, double y ) {

return ( x + y );}void PrintOut ( double x ) {

printf ( “\n Result of sum is : %.2f”, x );}

Page 53: โปรแกรม ภาษาซี

53

ตวอยาง 41. (ตอ)

void main ( ) {

double a1, a2, sumVal;

a1 = InputDouble( );

a2 = InputDouble( );

sumVal = SumDouble ( a1, a2 );

PrintOut ( sumVal );}

Page 54: โปรแกรม ภาษาซี

54

42. การประกาศโพรโทไทปของฟงกชน

การประกาศโปรโตไทปเปนสงจำาเปนในภาษาซเนองจากภาษาซเปนภาษาในลกษณะทตองมการประกาศ

ฟงกชนกอนจะเรยกใชฟงกชนนน(Predefined Function)

Page 55: โปรแกรม ภาษาซี

55

จากตวอยางท 4.1 จะเหนวาฟงกชนmain ( ) จะอยใตฟงกชนอน ๆ ทม

การเรยกใช เปนลกษณะทตองประกาศฟงกชนทตองการเรยกใชกอนจากเรยก

ใชฟงกชนนน แตหากตองการยาย ฟงกชน main ( ) ขนไปไวดานบน จะ

ตองมการประกาศโปรโตไทปของฟงกชนทตองการเรยกใชกอนเสมอ

Page 56: โปรแกรม ภาษาซี

56

#include <stdio.h>double InputDouble ( );double SumDouble ( double , double );void PrintOut ( double );

ตวอยาง 42. แสดงการทำางานของ

โปรแกรมการบวกเลขจำานวนจรง 2 จำานวนทรบจากผใช ในลกษณะทมการประกาศโปรโตไทป

Page 57: โปรแกรม ภาษาซี

57

void main ( ) {

double a1, a2, sumVal;

a1 = InputDouble( );

a2 = InputDouble( );

sumVal = SumDouble ( a1, a2 );

PrintOut ( sumVal );}

ตวอยาง 4.2 (ตอ)

Page 58: โปรแกรม ภาษาซี

58

จะเหนวาในโปรโตไทปไมมการประกาศชอตวแปร มแตการเขยนประเภทของตวแปรไวภายใน เปนการชวยใหคอมไพเลอรสามารถตรวจสอบจำานวนของตวแปร ประเภทของตวแปร ประเภทของการคนคา ภายในโปรแกรมวามการเรยกใชงานสงตาง ๆ เกยวกบฟงกชนนนถกตองหรอไม นอกจากนเราอาจจะแยกสวนโปรโตไทปไปเขยนไวในอนคลชไฟลกไดเชนเดยวกน

Page 59: โปรแกรม ภาษาซี

59

43 การเรยกใชฟงกชน

การเรยกใชฟงกชนทมการคนคา จะใชรปแบบดงตอไปน

คาทรบ = ฟงกชน (อารกวเมนต)

Page 60: โปรแกรม ภาษาซี

60

a1 = a1 = InputDouble ( );InputDouble ( );

ใชคกบโปรโตไทปdouble double InputDouble InputDouble ( );( );

ตวอยาง a1 ตองมชนดเปน double เนองจากคาทจะสง

คนกลบมาจากฟงกชนมชนดเปน double

Page 61: โปรแกรม ภาษาซี

61

sumVal = sumVal = SumDouble (a1,a2 );SumDouble (a1,a2 );

ใชคกบโปรโตไทปdouble double InputDouble ( );InputDouble ( );

ตวอยาง a1 และ a2 ตองมชนดเปน double

เพอใหตรงกบชนดตวแปรของอารกวเมนททประกาศในโปรโตไทป

Page 62: โปรแกรม ภาษาซี

62

PrintOut( sumVaPrintOut( sumVal );l );

ใชคกบโปรโตไทปvoid PrintOut void PrintOut

( double );( double );

ตวอยาง

ประกาศใหรวาฟงกชนนไมมการคนคา

Page 63: โปรแกรม ภาษาซี

63

4.4 ขอบเขต( Scope)

การทำางานของโปรแกรมภาษาซจะ ทำางานทฟงกชน main ( ) กอนเสมอ

เมอฟงกชน main ( ) เรยกใชงาน ฟงกชนอน กจะมการสงคอนโทรล

(Control) ทควบคมการทำางานไปยง ฟงกชนนน ๆ จนกวาจะจบฟงกชน

หรอพบคำาสง return

Page 64: โปรแกรม ภาษาซี

64

เมอมการเรยกใชงานฟงกชนจะมการจองพนทหนวยความจำาสำาหรบตวแปรทตองใชภายในฟงกชนนน และเมอสนสดการทำางานของฟงกชนกจะมการคนพนทหนวยความจำาสวนนนกลบสระบบ การใชงานตวแปรแตละตวจะมขอบเขตของการใชงานขนอยกบตำาแหนงทประกาศตวแปรนน

Page 65: โปรแกรม ภาษาซี

65

a1a2

sumVal

main ( )

xInputDouble ( )

a1 = a1 = InputDouble( )InputDouble( )

;;

ตวอยาง

step1step1

จากตวอยาง 41. และ 42. สามารถแสดงขอบเขตการทำางานไดดงน

Page 66: โปรแกรม ภาษาซี

66

a1a2

sumVal

main ( )

xInputDouble ( )

a2 = a2 = InputDouble( )InputDouble( )

;;

ตวอยาง (ตอ)

step2step2

Page 67: โปรแกรม ภาษาซี

67

a1a2

sumVal

main ( )

xsumDouble ( )

sumVal=SumDouble(a1,asumVal=SumDouble(a1,a2)2)

ตวอยาง (ตอ)

Step3Step3

y

Page 68: โปรแกรม ภาษาซี

68

a1a2

sumVal

main ( )

xPrintSum ( )

PrintSum(sumVal);PrintSum(sumVal);

ตวอยาง (ตอ)

step4step4

Page 69: โปรแกรม ภาษาซี

69

จะเหนวาตวแปร x ทประกาศในแตละขนตอนจะทำางานอยภายในฟงกชนทมการ

ประกาศคาเทานน และใชพนทในการเกบ ขอมลคนละสวนกน

ขอบเขตการทำางานของตวแปรแตละตวจะกำาหนดอยภายบลอกของคำาสงภายใน

เครองหมายปกกา ( { } ) หรอการ ประกาศในชวงของการประกาศฟงกชน

เรยกตวแปรเหลานวา ตวแปรโลคอล ตวแปรโลคอล(Local Variable)(Local Variable)

Page 70: โปรแกรม ภาษาซี

70

นอกจากนสามารถประกาศตวแปรไวทภายนอกฟงกชนบรเวณสวนเรมของ

โปรแกรมจะเรยกวา ตวแปรตวแปร โกลบอล โกลบอล (Global Variable)(Global Variable) ซง

เปนตวแปรทสามารถเรยกใชทตำาแหนง ใด ๆ ในโปรแกรมกได ยกเวนในกรณท

มการประกาศตวแปรทมชอเดยวกนตวแปรโกลบอลภายในบลอกหรอ

ฟงกชน

Page 71: โปรแกรม ภาษาซี

71

#include <stdio.h>int x;void func1 ( ) {

x = x + 10; printf ( “func1 ->

x : %d\n”, x );}

ตวอยาง 43.

แสดงการทำางานของโปรแกรมในลกษณะทมตวแปรโกลบอล แสดงขอบเขตการใชงานของตวแปรภายในโปรแกรม

Page 72: โปรแกรม ภาษาซี

72

void func2 ( int x ) {

x = x + 10; printf ( “func2 -> x :

%d\n”, x );}void func3 ( ) {

int x=0; x = x + 10; printf ( “func3 -> x :

%d\n”, x );}

ตวอยาง 43. (ตอ)

Page 73: โปรแกรม ภาษาซี

73

void main ( ){

x = 10;printf ( “main (start) -> x :

%d\n”, x );func1 ( );

printf ( “main (after func1) -> x : %d\n”, x ); func2 ( x );

printf ( “main (after func2) -> x : %d\n”, x); func3 ( );

printf ( “main (after func3) -> x : %d\n”, x);}

ตวอยาง 43. (ตอ)

Page 74: โปรแกรม ภาษาซี

74

main (start) -> x : 10func1 -> x : 20main (after func1) -> x : 20func2 -> x : 30main (after func2) -> x : 20func3 -> x : 10main (after func3) -> x : 20

ตวอยาง 43. (ตอ) ผลการทำางาน

Page 75: โปรแกรม ภาษาซี

75

ขอมลแบบโครงสร�งและยเนยน

(Structures and Unions)

Page 76: โปรแกรม ภาษาซี

76

51. คว�มรทวไปเกยวกบโครงสร�ง

(0,0)

(4,3)

ห�กตองก�รเกบขอมลจดบนแกนโคออดเนท จะประกอบไปขอมลแกน x และ y เปนขอมล

จำ�นวนเตมประเภท int ประเภทขอมลทใชได แกประเภทขอมลแบบโครงสร�ง ส�ม�รถ

ประก�ศประเภทขอมลทใชดงน

Page 77: โปรแกรม ภาษาซี

77

struct point { int x;

int y;

};

การประกาศประเภทขอมลประเภทขอมลแบบโครงสราง

Member

หมายเหต การประกาศชอสมาชกภายในstruct จะใชชอใดกไดอาจจะซำากบชอตวแปรทอย

ภายนอก struct แตชอทอยภายใน struct เดยวกนหามประกาศชอซำากน

Page 78: โปรแกรม ภาษาซี

78

struct point { int x;

int y;

} x, y , z;

การประกาศตวแปรขอมลตวแปรขอมลแบบโครงสราง

หมายเหต จะเหนวาชอของ struct จะ ประกาศหรอไมกได หากไมมการประกาศจะไม

สามารถนำา struct นนกลบมาใชไดอก

แบบท 1

Page 79: โปรแกรม ภาษาซี

79

struct point { int x;

int y;

};

struct point x,y,z

แบบท 2 การประกาศ

แบบขอมล

โครงสรางการ

ประกาศตวแปร ขอมลแบบ

โครงสราง

Page 80: โปรแกรม ภาษาซี

80

struct point pt = {320,200};

การกำาหนดคาเรมตนใหกบตวแปรขอมลแบบโครงสราง

struct_name.member

การอางถงสมาชกภายในตวแปรขอมลแบบโครงสราง

Page 81: โปรแกรม ภาษาซี

81

เมอตองการอางถงสมาชกภายในstruct

วาอยตรงกบจดใดบนแกนโคออดเนทจะใช

printf ( “%d, %d”, pt.x, pt.y );

หรอหากตองการคำานวณระยะทางจะวา หางจากจดเรมตน (0, 0) เทาใด

สามารถใช double dist, sqrt (double);

dist =sqrt ((double)pt.x * pt.x +(double)pt.y * pt.y );

ตวอยาง

Page 82: โปรแกรม ภาษาซี

82

หมายเหต สมาชกของขอมลประเภทstruct อาจจะเปนตวแปรประเภทใด

กได ทงขอมลพนฐาน และประเภท ขอมลอน ๆ เชน อาเรย และยง

ประกาศ ตวแปรของขอมลประเภทstruct ไดอกดวยตวอย

าง pt2pt

1

หากตองการเกบขอมลของ

สเหลยมดงรปสามารถทำาการประกาศตวแปร

ไดดงน

Page 83: โปรแกรม ภาษาซี

83

struct rect {

struct point pt1; struct point pt2; };struct rect screen;int co_x;co_x = screen.pt1.x

การประกาศ

แบบขอมล

โครงสราง

การประกาศ ตวแปร

ขอมลแบบโครงสรางการอางถง

สมาชก

Page 84: โปรแกรม ภาษาซี

84

52 ก�รเกบขอมลแบบโครงสร�ง

การเกบขอมลแบบโครงสรางภายในหนวยความจำาจะเกบตามลำาดบทมการประกาศสมาชกของขอมลนน โดยทวไปขอมลแบบโครงสรางจะประกอบขนจากขอมลหลาย ๆ ชนด และขอมลแตละชนดมกจะมการจองพนทใชงานแตตางกน เนองจากการจองพนทหนวยความจำาในระบบสวนใหญจะจองทแอดเดรสทหารดวย 2 หรอ 4 ลงตว

Page 85: โปรแกรม ภาษาซี

85

struct alignment { int num1; char ch; int num2;} example;

ตวอยาง

num1

ch

num2

member

0 2 3 4Byte Offset

จะเหนวา num2 จะไมสามารถใชพนททตดกบ ch ได

เนองจาก num2 เปนขอมลประเภทเลขจำานวนตองใชพนททม

แอดเดรสหารดวย 2 หรอ 4 ลงตว ทำาใหเกดทวางทไมสามารถ

นำามาใชประโยชนได เพราะฉะนนการประกาศสมาชกของโครงสรางจะมผลตอการใชพนทในหนวยความจำาดวย

Page 86: โปรแกรม ภาษาซี

86

53 ก�รใชขอมลแบบโครงสร�งกบฟงกชน

การทำางานของตวแปรทเปนประเภท โครงสรางสามารถทำางานตาง ๆ ไดเชน

เดยวกบตวแปรอน ๆ ยกเวนการเปรยบ เทยบตวแปร struct กบตวแปร struct

เนองจากขอมลของตวแปร struct จะเกบ อยในตวแปรทเปนสมาชกของ struct การ

เปรยบเทยบจงตองทำาผานตวแปรทเปน สมาชกของ struct เทานน การใชงาน

ตวแปร struct กบฟงกชนสามารถทำาได หลายลกษณะ ทงการใหฟงกชนคนคาเปน

struct การสงอากวเมนทใหฟงกชนเปน ตวแปร struct

Page 87: โปรแกรม ภาษาซี

87

ตวอยาง 51. ฟงกชนใชในการกำาหนดคาใหกบ

ตวแปร structstruct point makepoint ( int x, int y ) { struct point temp; temp.x = x; temp.y = y; return temp;}

หมายเหต ตวอยางนแสดงฟงกชนททำาการสงคากลบเปนรปแบบโครงสราง

Page 88: โปรแกรม ภาษาซี

88

การเรยกใชงานฟงกชนstruct rect screen;struct point middle;struct point makepoint ( int, int );screen.pt1 = makepoint ( 0, 0 );screen.pt2 = makepoint ( XMAX, YMAX );middle = makepoint ((screen.pt1.x + screen.pt2.x) / 2, (screen.pt1.y + screen.pt2.y) / 2 );

Page 89: โปรแกรม ภาษาซี

89

ตวอยาง 52. ฟงกชนการบวก x และ y ของจด

2 จด และคนคาผลของการบวก เปน struct

struct point addpoint(struct point p1, struct point p2){ p1.x += p2.x; p1.y += p2.y; return p1;}

หมายเหต ตวอยางนแสดงการสงอารกวเมนทแบบstruct ใหกบฟงกชน

Page 90: โปรแกรม ภาษาซี

90

ตวอยาง 53. ฟงกชนการหาวาจดอยในพนท

สเหลยมหรอไมint pinrect ( struct point p, struct rect r ) { return p.x >= r.pt1.x && p.x < r.pt2.x && p.y >= r.pt1.y && p.y < r.pt2.y;}หมายเหต ตวอยางนเปนการหาวาจดทระบอยในพนทสเหลยมหรอไม โดยสงคาจดและพนทสเหลยมเปนอากวเมนทใหกบฟงกชน หากจดอยในพนทสเหลยมจะคนคา1 แตหากจดอยนอกพนทสเหลยมจะคนคาเปน 0

Page 91: โปรแกรม ภาษาซี

91

ตวชและอ�รเรย(Pointer and Array)

Page 92: โปรแกรม ภาษาซี

92

รปท 61. ก�รแทนขอมลในหนวยคว�มจำ�ของตวแปรประเภทพนฐ�น

int i; i 40

0402404

i = 10; i 40

0402404

10

int i;i = 10;

6.1 ตวชกบแอดเดรส (Pointers and Address)

Page 93: โปรแกรม ภาษาซี

93

p

i

360400

40010

p

i10

p

i10

รปท 62 ก�รแทนขอมลในหนวยคว�มจำ�ของตวแปรประเภทตวช

Page 94: โปรแกรม ภาษาซี

94

62. ก�รประก�ศตวแปรประเภทตวช

การประกาศตวแปรประเภทพอยนเตอรจะใชUnary Operator * * ซงมชอเรยกวาIndirection หรอ Dereferencing Operator โดยจะตองประกาศประเภทของตวแปรพอยนเตอรใหสอดคลองกบ

ประเภทของตวแปรทเราตองการ (ยกเวน ตวแปรพอยนเตอรประเภท void ท

สามารถชไปยงตวแปรประเภทใดกได)

Page 95: โปรแกรม ภาษาซี

95

int *ip; เปนการประกาศตวแปร ip ใหเปนตว

แปรพอยนเตอรทชไปยงตวแปรประเภทint

double *dp, atof(char *);

เปนการประกาศตวแปร dp เปนตวแป รพอยนเตอรทชไปยงตวแปรประเภท

double และประกาศฟงกชน atof มพารามเตอรเปนตวแปรพอยนเตอร

ประเภท char

ตวอยาง

Page 96: โปรแกรม ภาษาซี

96

63. ก�รกำ�หนดค�และก�รอ�นค�ตวแปรประเภทตวช

การกำาหนดคาใหกบตวแปรพอยนเตอรจะเปนการกำาหนดแอดเดรสของตวแปรทมประเภทสอดคลองกบประเภทของ

ตวแปรพอยนเตอรเทานน โดยการใชUnary Operator && เปนโอเปอเรเตอรทอางถงแอดเดรสของออป

เจค (Object) ใด ๆ

Page 97: โปรแกรม ภาษาซี

97

int x = 1, y = 2;int *ip, *iq;ip = &x;y = *ip;*ip = 0;y = 5;ip = &y;*ip = 3;iq = ip;

รปท 63. ก�รกำ�หนดค�และก�รอ�นค�ตวแปรตวช

Page 98: โปรแกรม ภาษาซี

98

400

500

402

502

x

ip

y

iq

12 int x = 1, y

= 2;int *ip, *iq;

Page 99: โปรแกรม ภาษาซี

99

x

ip

400

500

y 402

502iq

12

400

ip = &x;

Page 100: โปรแกรม ภาษาซี

100

x

ip

400

500

y 402

502iq

11

400

y = *ip;

Page 101: โปรแกรม ภาษาซี

101

x

ip

400

500

y 402

502

iq

01

400

*ip = 0;

Page 102: โปรแกรม ภาษาซี

102

x

ip

400

500

y 402

502iq

05

400

y = 5;

Page 103: โปรแกรม ภาษาซี

103

x

ip

400

500

y 402

502iq

05

402

ip = &y;

Page 104: โปรแกรม ภาษาซี

104

x

ip

400

500

y 402

502iq

03

402

*ip = 3;

Page 105: โปรแกรม ภาษาซี

105

x

ip

400

500

y 402

402 502iq

03

402

iq = ip;

Page 106: โปรแกรม ภาษาซี

106

6.4 ตวชและอ�รกวเมนทของฟงกชน(Pointer and Function

Arguments) เนองจากภาษาซมการสงอากวเมนตให

กบฟงกชนแบบ By Value และ ฟงกชนสามารถคนคา (return) คาได

เพยงหนงคา หากตองการใหฟงกชนมการเปลยนแปลงคาและคนคากลบมายงฟงกชนทเรยกใชมากกวาหนงคาจะตองนำาพอยนเตอรเขามาชวย

Page 107: โปรแกรม ภาษาซี

107

ตวอยางเชน หากตองการเขยนฟงกชนเพอสลบคาของตวแปร 2 ตว ผลลพธทตองการไดจากฟงกชนนจะม 2คาของตวแปรททำาการสลบคา หากอารกวเมนตเปนตวแปรธรรมดาจะไมสามารถแกปญหานได จงตองใชพอยนเตอรเขามาชวย โดยการสงคาแอดเดรสของตวแปรทง 2 ใหกบฟงกชนทจะสลบคาของตวแปรทง 2 ผานทางตวแปรพอยนเตอรทเปนอารกวเมนตของฟงกชน

Page 108: โปรแกรม ภาษาซี

108

ตวอยาง 61. โปรแกรมตวอยางการสลบคาตว

แปร 2 ตวโดยผานฟงกชน จะแสดงการสงอารกวเมนตในเปนพอยนเตอร#include

<stdio.h>void swap (int *, int *);

Page 109: โปรแกรม ภาษาซี

109

void main ( ) { int x = 5, y = 10; printf(“Before swap : x = %d”, x, “, y = %d\n”, y); swap ( &x, &y); printf(“After swap : x = %d”, x, “, y = %d\n”, y);}

ตวอยาง (61 ตอ)

Page 110: โปรแกรม ภาษาซี

110

void swap (int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp;}

ตวอยาง 61. (ตอ)

Page 111: โปรแกรม ภาษาซี

111

อารกวเมนททเปนประเภทพอยนเตอรจะชวยใหฟงกชนสามารถเปลยน

คาใหกบตวแปรทสงเขามาได เนองจากอารกวเมนทนนจะเกบแอดเดรส

ของตวแปรทสงเขามา เมอมการ เปลยนแปลงคาของอารกวเมนทผาน

Dereferencing Operator ( * ) คาของตวแปรทสงเขามาจะถก

เปลยนคาพรอมกนในทนท

Page 112: โปรแกรม ภาษาซี

112

รปท 64. แสดงคว�มสมพนธของก�รสงอ�รกวเมนทแบบพอยนเตอรกบฟงกชน

xy

in main ( )

pxpy

in swap ( )

Page 113: โปรแกรม ภาษาซี

113

6.5 ตวชกบอ�รเรย (Pointer and Arrays)

อารเรยเปนประเภทขอมลทเกบชดของขอมลประเภทเดยวกน มกใชกบการทำางานทตองทำางานกบตวแปรชนดเดยวกนหลายตวทมการทำางานเหมอนกน เชน คะแนนของนกศกษาภายในหอง 20 คน เปนตน อารเรยในภาษาซจะนำาหลกการของพอยนเตอรเขามาใช การทำางานใด ๆ ของอารเรยสามารถใชพอยนเตอรเขามาแทนท

Page 114: โปรแกรม ภาษาซี

114

int table[10]; เปนการกำาหนดอารเรยชอ table เปน

อารเรยประเภท int ทมสมาชกทงหมด10 ตว ตงแต table[0], table[1], table[2], ... , table[9] สมาชกภายในอารเรยจะ

เรมท 0 เสมอ และสมาชกตวสดทายจะอยทตำาแหนงของขนาดทประกาศไวลบ

ดวย 1

การประกาศการประกาศอารเรยอารเรย

Page 115: โปรแกรม ภาษาซี

115

รปท 65 แสดงภาพจำาลองของอารเรยขนาดสมาชก 10 ตว

table[0]

table[1]

table[2]

table[9]

table

Page 116: โปรแกรม ภาษาซี

116

จะใชระบบดชนโดยผานเครองหมาย [ ] เชน

อางถงสมาชกตวท 3 ของอารเรยดวยtable[2] เปนตน การใชงานสมาชกของอารเรยสามารถใชงานไดเหมอนตวแปรพนฐานทวไป

การอางถงสมาชกในอารเรยการอางถงสมาชกในอารเรย

Page 117: โปรแกรม ภาษาซี

117

sumThird = table[0] + table[1] + table[2];table[0] = 5;if ( a[0] > a[9] )

printf (“First is greater than last\n” );

ตวอยาง

Page 118: โปรแกรม ภาษาซี

118

เราสามารถอางถงสมาชกทก ตวภายในอารเรยอยางอสระ

ภายในขอบเขตของขนาดทได ประกาศอารเรยไว แตการใช

อารเรยมกจะเปนการเขาถงสมาชกในลกษณะทวไปโดยใช

ตวแปรประเภท int มาชวย

Page 119: โปรแกรม ภาษาซี

119

สมมตให i, j, k เปนตวแปรประเภทint

for (int k = 0; k < 9; k++) printf (“Value at %d =

%d\n”, k+1, table[k]);table[i + j] = 0;table[7 – table[j]] = j;

ตวอยาง

Page 120: โปรแกรม ภาษาซี

120

ในภาษาซจะไมมการกำาหนดใหตรวจ สอบขอบเขตของอารเรย

โปรแกรมเมอรจะตองพยายามเขยนโปรแกรมทเกยวของกบสมาชกของอารเรยภายในขอบเขตทประกาศอารเรย

ไว หากมการอางองถงสมาชกอารเรย นอกขอบเขตทไดระบไว เชน

table[12] สงทไดคอการไปอานขอมลในพนทของหนวยความจำาทอาจจะ

เกบคาของตวแปรตวอน หรอคาอนใด ทไมอาจคาดเดาได

สงทตองระวง

Page 121: โปรแกรม ภาษาซี

121

ตวอยาง 62.

ใหอานคาของจำานวนเตม 5จำานวนจากคยบอรด และแสดงผลในลำาดบทกลบกน# include <stdio.h>

#define SIZE 5main ( ) { int k; int table[SIZE];

for (k = 0; k < SIZE; k++)

scanf (“%d”, &table[k]);

for (k = SIZE-1; k >= 0; k--)

printf (“%d\n”, table[k]);}

Page 122: โปรแกรม ภาษาซี

122

สมาชกของอารเรยอาจเปน ประเภทขอมลพนฐานใด ๆ กได หรอ

อาจเปนขอมลประเภทEnumeration เชน

#define TSIZE 10

#define NAMESIZE 20#define ADDRSIZE

30enum month { JAN,

FEB, MAR, APR, MAY, JUN, JUL, AUG,

SEP, OCT, NOV, DEC }

Page 123: โปรแกรม ภาษาซี

123

typedef enum month Month;

int age[TSIZE];float size[TSIZE+1];Month date[8];char name[NAMESIZE],

address[ADDRSIZE];

Page 124: โปรแกรม ภาษาซี

124

6.6 ก�รใชตวชกบอ�รเรย การทำางานใด ๆ ของอารเรยสามารถใชพอ

ยนเตอรเขามาชวย ซงจะทำาใหมความเรว ในการทำางานสงขน สมมตวามอารเรย a

และพอยนเตอร pa ดงนint a[10];int *pa;

กำาหนดใหพอยนเตอร pa ชไปยงอารเรยa ดวยคำาสง

pa = &a[0]; /* หรอ ใชคำาสง pa = a; */

pa จะเกบคาแอดเดรสเรมตนของ อารเรย a

Page 125: โปรแกรม ภาษาซี

125

รปท 66. แสดงตวชชไปยงแอดเดรสเรมตนของอารเรย

a[0]

a[1]

a[2]

a[9]

a

pa

Page 126: โปรแกรม ภาษาซี

126

การนำาไปใชงานจะสามารถอานคาอารเรยผานพอยนเตอรไดดงน

x = *pa; จะเปนการกำาหนดคาให x มคาเทากบ

a[0] การเลอนไปอานคาสมาชก ตำาแหนงตาง ๆ ของอารเรยผานทาง

พอยนเตอรสามารถทำาไดโดยการเพม คาพอยนเตอรขน 1 เพอเลอนไปยง

ตำาแหนงถดไป หรอเพมคาขน N เพอเลอนไป N ตำาแหนง หรอ

อาจจะลดคาเพอเลอนตำาแหนงลง

Page 127: โปรแกรม ภาษาซี

127

กรณท pa ชอยท a[0] คำาสง

pa+1; จะเปนการอางถงแอดเดรสของ

a[1] หากเปน pa+i เปนการ อางถงแอดเดรส a[i] หาก

ตองการอางถงขอมลภายในของ สมาชกของอารเรยตำาแหนงท

a[i] จะใช *(pa+i)

Page 128: โปรแกรม ภาษาซี

128

รปท 67 แสดงการอางถงตำาแหนงในอารเรยผานตวช

a[0]

a[1]

a[2]

a[9]

a

pa

pa+1

pa+2

Page 129: โปรแกรม ภาษาซี

129

การสงใหบวก 1 หรอบวก i หรอ ลบ i เปนเหมอนการเลอนไปยงสมาชกของ

อารเรยตำาแหนงทตองการ เนองจาก ประเภทของขอมลแตละประเภทของอารเรย

เชน int, float, double และอน ๆ ม ขนาดของขอมลทตางกน ทำาใหขนาดของ

สมาชกภายในอารเรยแตละประเภทมขนาด แตกตางกนดวย การสงใหบวกหรอลบดวย

จำานวนทตองการนนจะมกลไกททำาหนาท คำานวณตำาแหนงทตองการใหสอดคลอง

กบขอมลแตละประเภทโดยอตโนมต

Page 130: โปรแกรม ภาษาซี

130

นอกจากนยงสามารถใชพอยน เตอรแทนอารเรย การอางโดยใช a[i]

สามารถใช *(a+i) เนองจากทกครงท อางถง a[i] ภาษาซจะทำาหนาทแปลง

เปน *(a+i) เพราะฉะนนการเขยนในรปแบบใดกใหผลลพธในการทำางานเชน

เดยวกน และการอางถงแอดเดรส เชน &a[i] จะมผลเทากบการใช a+i

Page 131: โปรแกรม ภาษาซี

131

ในลกษณะเดยวกนการใชงานพอยน เตอรกสามารถใชคำาสงในลกษณะอารเรยกได

เชน การอางถง *(pa+i) สามารถเขยน ดวย pa[i] กไดผลเชนเดยวกนสงทแตกตางกนของอารเรยและพอยน เตอร คอ พอยนเตอรเปนตวแปร แต

อารเรยไมใชตวแปร สมมตให a เปน อารเรยและ pa เปนพอยนเตอร การอาง

ถง pa = a หรอ pa++ จะสามารถคอม ไพลได แตจะไมสามารถใชคำาสง a = pa

หรอ a++ ได

Page 132: โปรแกรม ภาษาซี

132

เมอมการสงชอของอารเรยใหแกฟงกชน จะเปนการสงตำาแหนงแอดเดรสของสมาชกตวแรกของอารเรยใหแกฟงกชน ดงนนพารามเตอรในฟงกชนนนจะเปนตวแปรประเภทพอยนเตอร

Page 133: โปรแกรม ภาษาซี

133

ตวอยาง 63

ฟงกชนทรบพารามเตอรเปนพอยนเตอร โดยอารกวเมนททสงมาเปนอารเรยint strlen (char *s)

{ int n; for ( n = 0; *s != ‘\0’; s++ ) n++; return n;}

Page 134: โปรแกรม ภาษาซี

134

จะเหนวา s เปนพอยนเตอร ในฟงกชนจะ ‘มการตรวจสอบขอมลวามคาเทากบ \0’

หรอไม และมการเลอนตำาแหนงทละ 1 คา(นบวาขอมลมความยาวเพมขนทละ1)

โดยใช s++ การเรยกใชฟงกชนstrlen สามารถทำาไดหลายลกษณะ

strlen (“hello world”); /* string constant */

strlen (array); /* char array[10] */

strlen (ptr); /* char *ptr; */

Page 135: โปรแกรม ภาษาซี

135

นอกจากนยงอาจจะประกาศ พารามเตอรภายในฟงกชน strlen ได

ใน 2 ลกษณะ คอ char *s char *s แบบใน ตวอยาง หรออาจจะใช char s[ ] char s[ ]

กได โดยทวไปจะใชในลกษณะแรก เพราะชวยในรไดทนทวา s เปนตวแป

รพอยนเตอร และยงสามารถสงสวนใด สวนของอารเรยใหแกฟงกชนกได โดย

ไมจำาเปนตองสงสมาชกตวแรกกไดเชน กน

Page 136: โปรแกรม ภาษาซี

136

f (&a[2]) หรอ f (a+2)

เปนการสงแอดเดรสของสมาชก a[2] ใหกบฟงกชน f การ

ประกาศฟงกชน f สามารถทำาไดโดยการประกาศ

f (int arr[ ]) { ......... }

หรอ f (int *arr) { ............ }

ตวอยาง

Page 137: โปรแกรม ภาษาซี

137

67 ก�รคำ�นวณกบแอดเดรส

ให p เปนพอยนเตอรชไปยงอารเรยใด ๆ คำาสง p++ เปนการเลอน p ไปยง

สมาชกถดไป และคำาสง p += i เปนการเลอนพอยนเตอรไป i ตำาแหนง

จากตำาแหนงปจจบน นอกจากนยง สามารถใชเครองหมายความสมพนธ

(Relational Operator) เชน==, !=, <, >= และอน ๆ ทำางาน

รวมกบพอยนเตอรได สมมตให p และq ชไปยงสมาชกของอารเรยเดยวกน

Page 138: โปรแกรม ภาษาซี

138

p < q จะเปนจรงเมอ p ชไปทสมาชกทอย

กอนหนาสมาชกท q ชอย การเปรยบ เทยบในลกษณะจะใชไดตอเมอ p และ

q ชไปทอารเรยเดยวกนเทานนนอกจากนยงสามารถใชการลบ

หรอการบวกกบพอยนเตอรไดเชน เดยวกน แตสงทควรระวงคอ การทำา

เชนนนจะตองอยในขอบเขตขนาดของ อารเรยเทานน

Page 139: โปรแกรม ภาษาซี

139

ตวอยาง 63.

ฟงกชน strlen( ) ปรบปรงใหกระชบขน

int strlen (char *s) { char *p = s; while (*p != ‘\0’) p++; return p-s;}

Page 140: โปรแกรม ภาษาซี

140

เนองจาก s ชอยทตำาแหนง เรมตน โดยม p ชไปท s เชน เดยวกน แตจะมการเลอน p ไปท

ละหนงตำาแหนง จนกวาคาท ตำาแหนงท p ‘ชอยจะเทากบ \0’

เมอนำา p คาสดทายมาลบกบ s ทตำาแหนงเรมตนกจะไดความยาวของขอมลทสงเขามา

Page 141: โปรแกรม ภาษาซี

141

6.8 ตวชตวอกษรและฟงกชน(Character Pointer and

Function) การทำางานกบขอความหรอท

เรยกวา สตรง (String) เปนการ ใชขอมลตวอกษรหลาย ๆ ตว หรอ

อารเรยของขอมลประเภท char หรออาจจะใชพอยนเตอรชไปยง

ขอมลประเภท char การทำางานกบคาคงทสตรง (String Constant) สามารถเขยนภายใน

“ ” เครอง

Page 142: โปรแกรม ภาษาซี

142

“I am a string”เมอมการใชคาคงทสตรงจะมการพนทในหนวยความจำาเทากบความยาวของคา

คงทสตรงบวกดวย 1 เนองจากลกษณะการเกบขอมลประเภทขอความในหนวย

ความจำาจะมการปะตวอกษร null หรอ‘\0’ ตอทายเสมอเพอใหรวาเปนจดสน

สดของขอมล การจองพนทดงกลาวจะเหมอนการจองพนทของขอมลประเภท

อารเรย เปนอารเรยของ char

ตวอยาง

Page 143: โปรแกรม ภาษาซี

143

รปท 68 แสดงแบบจำาลองการเกบขอมลประเภท สตรงในหนวยความจำา

I a m a s t r i n g \0

Page 144: โปรแกรม ภาษาซี

144

คาคงทสตรงทพบเหนไดเสมอ ไดแกขอความทใชในฟงกชน printf

( ) เชนprintf ( “Hello,

world\n” ); ฟงกชน printf ( ) จะรบ

พารามเตอรเปนพอยนเตอรชไปยงแอดเดรสของขอมลทตำาแหนงเรม

ตนของอารเรย และนำาขอความนนแสดงออกทางอปกรณแสดงขอมล

มาตรฐาน

Page 145: โปรแกรม ภาษาซี

145

ในการเขยนโปรแกรมจะสามารถใชพอยนเตอรชไปคาคงท

สตรงใด ๆ กได เชนchar *pmessage =

“Hello, world”;pmessage จะเปนพอยน

เตอรประเภท char ชไปทอารเรย ของตวอกษร จะแตกตางจากการใช

อารเรยทวไปเชนchar amessage[ ] =

“Hello, world”;

Page 146: โปรแกรม ภาษาซี

146

ลกษณะของอารเรยเชนamessage จะมการจองพนทใช

กบอารเรยขนาด 13 ตวอกษรรวม ทง null สวนลกษณะของพอยน

เตอรทชไปยงคาคงทสตรง จะมการ จองพนทใหกบคาคงทสตรงขนาด

13 ตวอกษรเชนเดยวกน แตจะมการจองพนทใหกบพอยนเตอรและทำาการชพอยนเตอรนนไปยงพนท

ของคาคงทสตรงทจองเอาไว

Page 147: โปรแกรม ภาษาซี

147

รปท 69. การจองพนทใหกบอารเรยและตวชชไปยงคาคงทสตรง

H e l l o , w o r l d \0

H e l l o , w o r l d \0amessage

pmessage

Page 148: โปรแกรม ภาษาซี

148

void strcpy ( char *s, char *t ) {

int i=0; while ( ( s[i] = t[i] ) != ‘\0’ ) i++;}

ตวอยาง 65. ฟงกชน strcpy ( ) ทำา

หนาทสำาเนาขอความจากตวแปรหนงไปยงอกตวแปรหนงเขยนในลกษณะอารเรย

Page 149: โปรแกรม ภาษาซี

149

void strcpy ( char *s, char *t ) { while ( ( *s = *t ) != ‘\0’ ) { s++; t++; }}

ตวอยาง 66. ฟงกชน strcpy ( )

เขยนในลกษณะพอยนเตอร

Page 150: โปรแกรม ภาษาซี

150

void strcpy ( char *s, char *t ) { while ( ( *s++ = *t++ ) != ‘\0’ ) ;}

ตวอยาง 67

ฟงกชน strcpy ( ) เขยนในลกษณะพอยนเตอรแบบสน

Page 151: โปรแกรม ภาษาซี

151

การประกาศตวแปรช (pointer) ช ไปยง struct กรณการสงอากวเมนทเปนตวแปร struct จะไม

เหมาะกบ struct ทมขนาดใหญ เนองจากทกครงทสงตวแปร

struct จะเปนการสำาเนา ตวแปรตวใหมขนมาในฟงกชน ซงจะทำาใหชาและ

เปลองพนทหนวย ความจำา เราจะใชพอยนเตอรเขามาชวยแกปญหาน

โดยสงแอดเดรสของตวแปร struct มายง

ฟงกชนซงรบอากวเมนท เปนพอยนเตอร อากวเมนทจะชไปยงแอดเดรสเรมตนของ

ตวแปร struct จะชวยใหการทำางานเรวขนและ เปลองหนวยความจำานอยลง แตสงทตองระวงคอ

หากมการเปลยนแปลงคาทอากวเมนทพอยนเตอรช อย คาในตวแปร struct ทสงมายงฟงกชนจะ

เปลยนตามโดยอตโนมต

Page 152: โปรแกรม ภาษาซี

152

ตวอยาง struct point origin, *pp;

pp = &original;printf ( “origin is (%d, %d)\n”, (*pp).x, (*pp).y );

จะไดตวแปร pp ชไปยงขอมลแบบ โครงสรางชอ struct point การ

เขยน *pp จะเปนการอางถงโครงสรางการอางถงสมาชกสามารถทำาไดการอางถงสมาชกสามารถทำาได

โดยอาง โดยอาง (*pp).x (*pp).x หรอ หรอ(*pp).y (*pp).y

Page 153: โปรแกรม ภาษาซี

153

หมายเหต สงทตองระวงคอ(*pp).x จะไมเหมอนกบ*pp.x เนองจาก

เครองหมาย . จะมลำาดบความ สำาคญสงกวา * ทำาจะการแปล

ความหมาย *pp.x จะเหมอน กบการอาง *(pp.x) ซงจะ

ทำาใหเกดความผดพลาดขน

Page 154: โปรแกรม ภาษาซี

154

การอางถงสมาชกอาจเขยนอก ลกษณะหนงโดยใชเครองหมาย ->

สมมต p เปนพอยนเตอร รปแบบการใชเปนดงน

p->member-of-structure

จะสามารถแปลงประโยคการใช พอยนเตอรอางสมาชกของ struct

จากตวอยางขางบนไดวาprintf ( “origin is (%d,

%d)\n”, pp->x, pp->y);

Page 155: โปรแกรม ภาษาซี

155

หากมพอยนเตอรชไปยง struct rect ดงน

struct rect r, *rp = r;การอางถงสมาชกตอไปนจะมผลเทากบ

การอางถงสมาชกตวเดยวกนr.pt1.xrp->pt1.x(r.pt1).x(rp->pt1).x

ตวอยาง

Page 156: โปรแกรม ภาษาซี

156

6.9 ตวช (pointer) ชไปยง โครงสร�ง

(pointer to structures) พอยนเตอรเปนตวแปรทเกบแอดเดรสของตวแปรอน สามารถใชชไปยงขอมลประเภทใด ๆ การใชพอยนเตอรชไปยงโครงสรางสามารถทำาไดดงน

Page 157: โปรแกรม ภาษาซี

157

typedef struct {

int day;

int month;

int year;

} Date;Date today;

Date *ptrdate;

การประกาศ

แบบขอมล

โครงสรางการ

ประกาศ ตวแปร

ขอมลแบบโครงสรางการประกาศ

ตวแปรpointer ช

ไปยงโครงสราง

แบบท 1

Page 158: โปรแกรม ภาษาซี

158

struct date { int

day; int

month; int

year;}

*ptrdate;

แบบท 2

Page 159: โปรแกรม ภาษาซี

159

typedef struct {

int day;

int month;

int year;

} Date;typedef Date *PtrDate;

PtrDate ptrdate;

การประกาศ

แบบขอมล

โครงสรางการประกาศ

ประเภท ตวแปร

pointer ชไปยงโครงสราง

การประกาศ ตวแปร

pointer ช ไปยง

โครงสราง

แบบท 3

Page 160: โปรแกรม ภาษาซี

160

การประกาศตวแปร ptrdate ทง 3 ลกษณะจะสามารถใชงานได

เหมอนกนทงหมด หากตองการให ptrdate ช

ไปยงตวแปรโครงสรางสามารถทำาไดดงน

ptrdate = &today;

Page 161: โปรแกรม ภาษาซี

161

การอางถงสมาชกของโครงสรางผานตวแปรพอยนเตอรptrdate->day = 7;if ( ptrdate->day == 31 && ptrdate->month == 12 ) .....

scanf ( “%d”, &ptrdate->year );

การอางถงสมาชกโครงสรางโดยใช เครองหมาย ->

(*ptrdate).day = 7;if ( (*ptrdate).day == 31 && (*ptrdate).month == 12 ) .....

scanf ( “%d”, &((*ptrdate).year) );

Page 162: โปรแกรม ภาษาซี

162

#include <stdio.h>struct date { /*date template */ int day; int month; int year;};typedef struct date Date;typedef Date *PtrDate;

ตวอยาง 68

โปรแกรมตวอยางการใชตวช(pointer) ชไปยงโครงสราง

Page 163: โปรแกรม ภาษาซี

163

main ( ) { Date today; PtrDate ptrdate; ptrdate = &today; ptrdate->day = 27; ptrdate->month = 9; ptrdate->year = 1985; printf ( “Today\’s date is %2d/%2d/%4d\n”,

ptrdate->day, ptrdate->month, ptrdate->year );

}

ตวอยาง 68. (ตอ)

Page 164: โปรแกรม ภาษาซี

164

นอกจากนยงสามารถทำาการกำาหนด คาเรมตนใหกบตวแปรแบบโครงสราง

เชนDate xmas = { 25, 12,

1986 };และหากมการกำาหนดคาเรมตนใหกบ

สมาชกของโครงสรางไมครบทกตว หาก ตวแปรนนเปน external หรอ static

คาของสมาชกทขาดไปจะถกกำาหนดใหเปน0 แตหากเปนประเภท automatic จะไมสามารถคาดไดวาคาของสมาชกทไปจะเปนคาใด

Page 165: โปรแกรม ภาษาซี

165

610 อ�รเรยของโครงสร�ง การใชงานโครงสรางนอกจากใชในลกษณะ

ของตวแปรแลว ยงสมารถใชงานใน ลกษณะของอาเรยไดอกดวย เชน การเกบ

ขอมลประวตของพนกงาน จะมโครงสรางท ใชเกบขอมลของพนกงานแตละคน หากใช

ในลกษณะของตวแปรปกตจะสามารถเกบ ขอมลของพนกงานไดเพยง 1 คน ซง

พนกงานทงบรษทอาจจะมหลายสบหรอ หลายรอยคน การเกบขอมลในลกษณะนจะ

ใชอาเรยเขามาชวย เชนPerson staff[STAFFSIZE];

Page 166: โปรแกรม ภาษาซี

166

การอางโดยใชคำาสงตาง ๆstaff อางถงอาเรยของโครงสรางstaff[i] อางถงสมาชกท i ในอาเรยstaff[i].forename อางถงชอหนาของ

สมาชกท I ของอาเรยstaff[i].surname[j] อางถงตว

อกษรตวท j ในนามสกล ของสมาชกท i ของอาเรย

Page 167: โปรแกรม ภาษาซี

167

การใชขอมลสมาชกแตละตวจะอางถงโดยการอางผานระบบดชนเหมอน

อารเรยทวไป เชน ฟงกชนทใชในการ พมพชอสมาชกคนทระบ จะเรยกใชโดย

print_person ( staff[k] );

รปแบบฟงกชนสามารถกำาหนดดวยvoid print_person

( Person employee )

การเรยกใชงานสมาชกบางตวในอารเรยของโครงสรางผานฟงกชน

Page 168: โปรแกรม ภาษาซี

168

หากตองการเรยกใชงานฟงกชนท ทำางานกบทงอารเรย เชน การเรยกใช

งานฟงกชนททำาการเรยงลำาดบอารเรย ตามชอหนา จะตองสงอารเรยและ

ขนาดของอารเรยไปยงฟงกชนนน เชนsort_forename ( staff,

STAFFSIZE );รปแบบฟงกชนสามารถกำาหนดดวย

void sort_forename ( Person staff[ ], int size )

การเรยกใชงานสมาชกทกตวในอารเรยของโครงสรางผานฟงกชน

Page 169: โปรแกรม ภาษาซี

169

การกำาหนดคาเรมตนใหกบอารเรยของโครงสรางสามารถทำาไดโดย Person staff[ ] = { { “Bloggs”, “Joe”, MALE, 21 },

{ “Smith”, “John”, MALE, 30 },

{ “Black”, “Mary”, FEMALE, 25 } };

การกำาหนดคาเรมตนใหกบอารเรยของโครงสราง

Page 170: โปรแกรม ภาษาซี

170

6.11 อ�รเรยแบบหล�ยมต(Multi-dimensional

Arrays) จากพนฐานทผานมาเรองอารเรยจะ

เปนลกษณะของอารเรยมตเดยว แตอารเรยอาจจะมมากกวา 1 มตกได เชน ขอมลคะแนนสอบของนกศกษาแตละคนภายในชนซงแบงเปนคะแนนเกบหลายสวน จะพบวาหากตองการเกบขอมลคะแนนสอบของนกศกษาแตละคนสามารถใชอารเรยมตเดยว ดงตวอยาง

Page 171: โปรแกรม ภาษาซี

171

#define NUMBER_OF_PAPERS 5

int student [ NUMBER_OF_PAPERS ]; /* int student[5]; */

56 85 126 241 160. . . . .student[0]student[1]student[2]student[3]student[4]

Page 172: โปรแกรม ภาษาซี

172

แตหากเพมเตมวาใหเกบขอมลคะแนนสอบของนกศกษาทกคน จะตองใชอารเรยหลายมตเขามาเกยวของ ตวอยางเชนการเกบขอมลคะแนนสอบของนกศกษา 2 คนโดยมคะแนนสอบของการสอบทงสน

5 ครง

Page 173: โปรแกรม ภาษาซี

173

รปท 610. แสดงตวอยางการเกบขอมลคะแนนของ นกศกษา

ครงท 1 2 3 4 5นาย กนาย ข56.85.126.241.16060.72.150.250.180.

Page 174: โปรแกรม ภาษาซี

174

การอางองถงขอมลในอารเรย 2 มต เราจะมองอารเรย 2 มตในลกษณะทประกอบดวยแถว(row) และคอลมน(column) โดยขอมลทอางองตว

แรกหมายถง แถว และขอมลถดมาคอ คอลมนmarks[row][column]

row

column

marks[0][0]

marks[0][1]

marks[0][2]

marks[0][8]

marks[1][0]

marks[1][8]

marks[2][0]

marks[2][8]

Page 175: โปรแกรม ภาษาซี

175

จากลกษณะความตองการเกบขอมลดงกลาวจะตองเตรยมอารเรยเพอเกบ

ขอมลในลกษณะ 2 มต สามารถประกาศอารเรยดงน #define NUMBER_OF_PAPERS 5 #define NUMBER_OF_STUDENTS 50 int marks[NUMBER_OF_STUDENTS][NUMBER_OF_PAPERS]; /* int marks[50][5]; */

Page 176: โปรแกรม ภาษาซี

176

โปรแกรมการรบคาอารเรย 2 มต#include<stdio.h>main(){ float score[10][3]; int i,j; printf(“Please put score\n”); for(i=0;i<10;i++) for(j=0;j<3;j++) scanf(“%f”,&score[i][j]);}

score[0][0]score[0][1]score[0][2]score[1][0]score[1][1]score[1][2]

score[9][0]score[9][1]score[9][2]

Page 177: โปรแกรม ภาษาซี

177

score[0][0]score[0][1]score[0][2]score[1][0]score[1][1]score[1][2]

score[9][0]score[9][1]score[9][2]

score[2][0]score[2][1]score[2][2]

ลกษณะขอมล หนวยความจำา

200202204206208210

210212214216218220

220222224226228230

[0][0][0][1][0][2][1][0][1][1][1][2]

[2][0][2][1][2][2][3][0][3][1][3][2]

[4][0][4][1][4][2][5][0][5][1][5][2]