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

Preview:

DESCRIPTION

ภาษาโปรแกรม (ภาษาซี). 1. ประวัติความเป็นมา. ภาษา BCPL. ภาษา B. ภาษา C. Basic Combined Programming Language. พ.ศ. 2515 โดย เดนนิช ริทชี่. บนเครื่อง PDP-7 (UNIX) พ.ศ. 2513. # header ส่วนที่ 1 main( ) - PowerPoint PPT Presentation

Citation preview

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

2

ภาษาBCPL

ภาษา B

ภาษา C

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

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

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

Basic CombinedProgrammingLanguage

3

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

}

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

4

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

5

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

6

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

7

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

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

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

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

8

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

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

โปรแกรมท 1

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

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 หลงจากนนสงใหมการพมพคะแนนออกมา

10

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

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

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

11

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

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

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

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

ยาวเปน 2 เทา

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

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 คว�มถกตองของตวเลขจะมค�สงขน

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

13

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

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

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

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

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

14

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

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

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

15

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

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

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

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

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

16

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

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

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

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

17

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

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

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

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

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

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

19

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

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

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

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

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

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

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);}

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.

22

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

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

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

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

23

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

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

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

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

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

24

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

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

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

25

รปแบบของ scanf ( )

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

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

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

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

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

26

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

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

27

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

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

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

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

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

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

28

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

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

29

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

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

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

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

30

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

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

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

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

31

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

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

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); }

33

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

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

34

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

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

35

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

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

36

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

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”); }

38

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

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

39

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

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

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

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

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

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

40

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

41

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

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

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

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

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

42

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

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

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

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”);}

44

ฟงกชน (Function)

45

ฟงกชน (Functions)

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

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

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

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

46

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

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

ตวอยาง

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

47

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

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

ตวอยาง (ตอ)

48

Source filefunction

functionfunction

Source filefunction

functionfunction

Object file

Object file

Library file

Execute file

compile

compile

link

link

link

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

49

4.1 รปแบบของฟงกชน

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

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

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

สงคากลบ);}

int , char , float , double ฯลฯ

แบบท 1

50

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

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

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

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

}

แบบท 2

51

ตวอยาง 4.1

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

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

double x; printf ( “\nInput real

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

}

52

ตวอยาง 4.1 (ตอ)double SumDouble

( double x, double y ) {

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

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

53

ตวอยาง 4.1 (ตอ)

void main ( ) {

double a1, a2, sumVal;

a1 = InputDouble( );

a2 = InputDouble( );

sumVal = SumDouble ( a1, a2 );

PrintOut ( sumVal );}

54

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

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

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

55

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

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

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

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

56

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

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

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

57

void main ( ) {

double a1, a2, sumVal;

a1 = InputDouble( );

a2 = InputDouble( );

sumVal = SumDouble ( a1, a2 );

PrintOut ( sumVal );}

ตวอยาง 4.2 (ตอ)

58

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

59

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

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

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

60

a1 = InputDouble ( );

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

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

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

61

sumVal = SumDouble (a1,a2 );

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

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

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

62

PrintOut( sumVal );

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

( double );

ตวอยาง

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

63

4.4 ขอบเขต( Scope)

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

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

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

พบคำาสง return

64

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

65

a1a2

sumVal

main ( )

xInputDouble ( )

a1 = InputDouble( )

;

ตวอยาง

step1

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

66

a1a2

sumVal

main ( )

xInputDouble ( )

a2 = InputDouble( )

;

ตวอยาง (ตอ)

step2

67

a1a2

sumVal

main ( )

xsumDouble ( )

sumVal=SumDouble(a1,a2)

ตวอยาง (ตอ)

Step3

y

68

a1a2

sumVal

main ( )

xPrintSum ( )

PrintSum(sumVal);

ตวอยาง (ตอ)

step4

69

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

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

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

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

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

70

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

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

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

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

71

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

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

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

ตวอยาง 4.3

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

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 );}

ตวอยาง 4.3 (ตอ)

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);}

ตวอยาง 4.3 (ตอ)

74

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

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

75

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

(Structures and Unions)

76

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

(0,0)

(4,3)

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

แกประเภทขอมลแบบโครงสร�ง ส�ม�รถประก�ศประเภทขอมลทใชดงน

77

struct point { int x;

int y;

};

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

Member

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

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

78

struct point { int x;

int y;

} x, y , z;

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

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

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

แบบท 1

79

struct point { int x;

int y;

};

struct point x,y,z

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

แบบขอมล

โครงสรางการ

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

โครงสราง

80

struct point pt = {320,200};

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

struct_name.member

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

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 );

ตวอยาง

82

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

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

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

าง pt2pt

1

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

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

ไดดงน

83

struct rect { struct

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

การประกาศ

แบบขอมล

โครงสราง

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

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

สมาชก

84

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

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

85

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

ตวอยาง

num1

ch

num2

member

0 2 3 4Byte Offset

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

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

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

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

86

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

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

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

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

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

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

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

87

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

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

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

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 );

89

ตวอยาง 5.2

ฟงกชนการบวก x และ y ของจด 2 จด และคนคาผลของการบวกเปน

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

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

90

ตวอยาง 5.3

ฟงกชนการหาวาจดอยในพนทสเหลยมหรอไม

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

91

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

92

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

int i; i 40

0402404

i = 10; i 40

0402404

10

int i;i = 10;

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

93

p

i

360400

40010

p

i10

p

i10

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

94

6.2 ก�รประก�ศตวแปรประเภทตวช การประกาศตวแปรประเภทพอยนเตอรจะใช

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

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

ไปยงตวแปรประเภทใดกได)

95

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

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

double *dp, atof(char *);

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

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

แปรพอยนเตอรประเภท char

ตวอยาง

96

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

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

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

เจค (Object) ใด ๆ

97

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

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

98

400

500

402

502

x

ip

y

iq

12 int x = 1, y

= 2;int *ip, *iq;

99

x

ip

400

500

y 402

502iq

12

400

ip = &x;

100

x

ip

400

500

y 402

502iq

11

400

y = *ip;

101

x

ip

400

500

y 402

502

iq

01

400

*ip = 0;

102

x

ip

400

500

y 402

502iq

05

400

y = 5;

103

x

ip

400

500

y 402

502iq

05

402

ip = &y;

104

x

ip

400

500

y 402

502iq

03

402

*ip = 3;

105

x

ip

400

500

y 402

402 502iq

03

402

iq = ip;

106

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

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

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

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

107

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

108

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

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

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

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);}

ตวอยาง 6.1 (ตอ)

110

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

ตวอยาง 6.1 (ตอ)

111

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

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

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

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

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

112

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

xy

in main ( )

pxpy

in swap ( )

113

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

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

114

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

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

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

ดวย 1

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

115

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

table[0]

table[1]

table[2]

table[9]

table

116

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

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

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

117

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

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

ตวอยาง

118

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

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

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

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

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;

ตวอยาง

120

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

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

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

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

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

สงทตองระวง

121

ตวอยาง 6.2

ใหอานคาของจำานวนเตม 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]);}

122

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

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

#define TSIZE 10

#define NAMESIZE 20#define ADDRSIZE

30enum month { JAN,

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

SEP, OCT, NOV, DEC }

123

typedef enum month Month;

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

address[ADDRSIZE];

124

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

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

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

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

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

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

125

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

a[0]

a[1]

a[2]

a[9]

a

pa

126

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

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

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

อารเรยผานทางพอยนเตอรสามารถทำาไดโดยการเพมคาพอ

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

เพอเลอนไป N ตำาแหนงหรออาจจะลดคาเพอเลอนตำาแหนงลง

127

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

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

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

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

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

128

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

a[0]

a[1]

a[2]

a[9]

a

pa

pa+1

pa+2

129

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

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

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

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

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

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

130

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

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

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

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

131

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

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

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

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

132

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

133

ตวอยาง 6.3

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

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

134

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

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

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

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

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

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

135

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

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

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

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

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

136

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

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

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

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

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

ตวอยาง

137

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

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

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

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

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

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

138

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

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

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

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

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

139

ตวอยาง 6.3

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

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

140

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

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

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

เรมตนกจะไดความยาวของขอมลทสงเขามา

141

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

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

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

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

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

“ ” เครอง

142

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

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

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

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

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

ตวอยาง

143

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

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

144

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

( ) เชนprintf ( “Hello,

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

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

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

มาตรฐาน

145

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

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

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

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

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

“Hello, world”;

146

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

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

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

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

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

147

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

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

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

pmessage

148

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

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

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

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

149

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

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

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

150

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

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

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

151

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

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

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

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

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

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

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

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

152

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

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

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

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

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

153

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

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

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

ผดพลาดขน

154

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

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

p->member-of-structure

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

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

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

155

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

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

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

ตวอยาง

156

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

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

157

typedef struct {

int day;

int month;

int year;

} Date;Date today;

Date *ptrdate;

การประกาศ

แบบขอมล

โครงสรางการ

ประกาศ ตวแปร

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

ตวแปรpointer ช

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

แบบท 1

158

struct date { int

day; int

month; int

year;}

*ptrdate;

แบบท 2

159

typedef struct {

int day;

int month;

int year;

} Date;typedef Date *PtrDate;

PtrDate ptrdate;

การประกาศ

แบบขอมล

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

ประเภท ตวแปร

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

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

pointer ช ไปยง

โครงสราง

แบบท 3

160

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

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

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

ptrdate = &today;

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) );

162

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

ตวอยาง 6.8

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

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 );}

ตวอยาง 6.8 (ตอ)

164

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

เชนDate xmas = { 25, 12,

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

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

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

165

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

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

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

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

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

ใชอาเรยเขามาชวย เชนPerson

staff[STAFFSIZE];

166

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

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

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

167

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

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

print_person ( staff[k] );

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

( Person employee )

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

168

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

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

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

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

void sort_forename ( Person staff[ ], int size )

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

169

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

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

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

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

170

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

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

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

171

#define NUMBER_OF_PAPERS 5

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

5.6 8.5 12.6 24.1 16.0student[0]student[1]student[2]student[3]student[4]

172

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

173

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

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

5.68.512.624.116.06.07.215.025.018.0

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]

175

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

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

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]

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]

Recommended