Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore หลักการเขียนโปรแกรม ปวส.

หลักการเขียนโปรแกรม ปวส.

Published by tamcomed50, 2020-12-27 06:22:21

Description: หลักการเขียนโปรแกรม ปวส.

Search

Read the Text Version

! 99 •! ตัวอยางโปรแกรม str_gets.cpp แสดงการใชฟงกชัน gets() จาก Header file ชื่อ stdio.h ทาํ หนา ทร่ี บั คา string หลาย ๆ ครั้งตอกันไปทางคียบอรด แลว นํารายละเอียดใน string ทง้ั หมดมาแสดงผล โดยเขยี นแยกเปน ฟง กช นั ดังนี้ /*Program : str_gets.cpp Process : input string from keyboard by gets() function from stdio.h */ #include <iostream.h> #include <conio.h> #include <stdio.h> //standard input/output function //declaration prototype function void input(); void display(); //declaration global variable char code[9],name[30],address[80]; void main() { clrscr();input(); clrscr();display(); } void input() { cout<<\"Input a string information: \\n\"; cout<<\"Code : \"; gets(code); cout<<\"Name: \"; gets(name); cout<<\"Address : \"; gets(address); } void display() { cout<<\"Your string information : \\n\\a\"; cout<<\"Code : \"<<code<<endl; cout<<\"Name: \"<<name<<endl; cout<<\"Address : \"<<address<<endl; getch(); } ศิริชัย นามบรุ ี สตริง(string)

! 100 ♦!อารเ รย 2 มิติของ String ขอมูลสตริงใน C++ หมายถึง ชดุ อารเ รย 1 มติ ขิ องขอ มลู ชนดิ char นน้ั เอง มีวิธีการกาํ หนด ดังไดกลาวมาแลว เชน char name[30] ถาตองการทาํ ขอ มลู สตรงิ ใหเ ปน ชนดิ อารเ รย สามารถเก็บขอมูลพรอมกันไดหลาย ๆ สตริง ตองกาํ หนดโดยใชร ปู แบบของ อารเ รย 2 มติ ิ ชนดิ char มีรูปแบบกาํ หนดดงั น้ี char string_name[row][column]; ซึ่ง string_name คือ ชอ่ื ของอารเ รยส ตรงิ [row] คือ จํานวนสมาชิกในแนวแถวของสตริง [column] คือ ความยาวสูงสุดของสตริงในแตละรายการ เชน char name[5][31]; ตวั แปร name สามารถเกบ็ ขอ ความหรอื สตรงิ ได 5 รายการ แตละรายการมีความยาว ไมเกิน 30 อกั ขระ การกําหนดคา ใหก บั อารเ รยข องสตรงิ แตล ะรายการ ตองกําหนดผายฟงกชัน string copy ท่ี กําหนดไวใน Header file ทช่ี อ่ื string.h มรี ปู แบบ ดังนี้ strcpy(string_variable , string_value); โดยท่ี string_variable คือ ตวั แปรทเ่ี ปน สตรงิ ใชเก็บคาที่คัดลอกมาจาก string_value ซึ่ง อาจเปน คา คงทอ่ี ยใู นเครอ่ื งหมาย \" \" หรอื เปน ตวั แปรสตรงิ กไ็ ด เชน strcpy(name[0], \"Sirichai\"); strcpy(name[1], \"Sompong\"); strcpy(name[2], \"Somsri\"); strcpy(name[3], name[2]); สามารถกาํ หนดคา ของอารเ รยส ตรงิ ในลกั ษณะ const ในโปรแกรม มรี ปู แบบดงั น้ี const name[][30]={ \"Sirichai\",\"Sompong\",\"Somsri\",\"Sombat\",\"Somsak\"}; ศิริชัย นามบรุ ี สตริง(string)

! 101 •! ตัวอยางโปรแกรม str_exp6.cpp แสดงการกําหนดคา คงทใ่ี หอ ารเ รยส ตรงิ name[5][31] และแสดงผลขอ มลู ในอารเ รย ดังนี้ /*Program : str_exp6.cpp Process : set constant of array string and display */ #include <iostream.h> #include <conio.h> void main() { const char name[5][31]={\"Sirichai\",\"Sompong\",\"Somsri\",\"Somsak\",\"Sombat\"}; int i; clrscr(); //display clrscr(); for(i=0;i<=4;++i) { cout<<name[i]<<endl; } getch(); } •! ตัวอยางโปรแกรม str_exp7.cpp แสดงการรบั ขอ มลู ทางคยี บ อรด เกบ็ ไวต วั แปรอารเ รย สตริง และแสดงผลขอมูลในอารเรยสตริงทางจอภาพ /*Program : str_exp7.cpp Process : enter constant to array string and display */ #include <iostream.h> #include <conio.h> void main() { char name[5][31]; int i; clrscr(); cout<<\"Please enter student name 5 persons : \"<<endl; for(i=0;i<=4;++i) //input string { cout<<\"#\"<<i+1<<\" \"; cin>>name[i]; } ศิริชัย นามบรุ ี สตริง(string)

! 102 //display clrscr(); cout<<\"Name of student \\n\\a\"; for(i=0;i<=4;++i) { cout<<\"#\"<<i+1<<\" \"<<name[i]<<endl; } getch(); } ♦!ฟง กช นั คดั ลอกและนบั ความยาวของสตรงิ ใน string.h •! การคัดลอกสตริง หมายถึงการคัดลอกคาคงที่ของสตริงที่เปนตนฉบับ (source) ไปไวอีกตัว แปรสตรงิ หนง่ึ เรยี กวา สตริงปลายทาง (destination) มีรูปแบบฟงกชันดังนี้ strcpy(destination,source) เชน strcpy(name,\"Sompong\"); •! การนับความยาวของสตริง วามีกี่ตัวอักขระใชฟงกชัน strlen(string) เชน n = strlen(name); หรอื n= strlen(\"Somsri\"); •! ตัวอยางโปรแกรม str_exp8.cpp แสดงการใชฟงกชัน strcpy() และ strlen() /*Program : str_exp8.cpp Process : using function strcpy() and strlen()*/ #include <iostream.h> #include <conio.h> #include <iomanip.h> //for setw() #include <string.h> //for strcpy(),strlen() void main() { char sname[31]; char dname[31]; int n; clrscr(); cout<< \"Please enter your information : \\n\"; cout<< \"Your Name (1-30 char) : \"; cin>>setw(31)>>sname; strcpy(dname,sname); n=strlen(dname); ศิริชัย นามบรุ ี สตริง(string)

! 103 //display clrscr(); cout<< \"Your information : \\n\"; cout<< \"Your Name : \"<<dname<<endl; cout<< \"Your name long \"<<n<<\" characters\"; getch(); } ♦!ฟง กช นั strncpy() , strcat() และ strcmp() ใน string.h •! ฟงกชัน strncpy(destination,source,n) ใชคัดลอกของสตริงจาก source ไปไวยัง destination โดยท่ี n คือ จาํ นวน character ที่จะทาํ การคัดลอกจาก source ไปยัง destination โดยเรม่ิ นบั จาก character ตวั แรก •! ฟงกชัน strncat(t,s,n) ใชใ นการคดั ลอกอกั ขระหรอื ขอ ความจาก string s มาเชอ่ื ตอ กบั string t จํานวน n ตวั แลวเก็บไวใน string t •! ฟงกชัน strcmp(string1,string2) ใชเพือ่ เปรียบเทียบ string1 กับ string2 ถาผลการเปรียบ เทียบเปน 0 แสดงวาเทากัน ถาผลการเปรียบเทียบมากกวา 0 แสดงวา string1>string2 และถาผลเปรียบเทียบนอยกวา 0 แสดงวา string1<string2 •! ตัวอยางโปรแกรม strn_cat.cpp แสดงการการใชฟงกชัน strncpy(), strncat() และ strcmp() /*Program: strn_cat.cpp process: display used function strncpy(),strncat(),strcmp() from string.h */ #include <iostream.h> #include <conio.h> #include <string.h> void main() { char name[20]=\"Sirichai Namburi\"; char std[20]=\"Sompong Deemak\"; char str[40]=\"Name: \",temp[30]=\"\"; clrscr(); //used strncpy() strncpy(temp,name,12); cout<<temp<<endl; strncpy(temp+12,\"buri\",10); ศิริชัย นามบรุ ี สตริง(string)

! 104 cout<<temp<<endl<<endl; //used strncat() cout<<str<<endl; strncat(str,std,7); cout<<str<<endl; cout<<str<<endl; strncat(str,name,8); cout<<str<<endl<<endl; //used strcmp cout<<strcmp(\"Som\",\"Som\")<<\" \"<<\"Som == Som\"<<endl; cout<<strcmp(std,\"Sombat\")<<\" \"<<std<<\">\"<<\"Sombat\"<<endl; cout<<strcmp(std,\"Somsak\")<<\" \"<<std<<\"<\"<<\"Somsak\"<<endl; getch(); } ♦!แบบฝกหัดทายบท 1. ใหเ ขยี นโปรแกรมเพื่อสรางฟงกชันจดั การกบั ขอ มูลแบบสตรงิ ดงั น้ี - Length( ) ทาํ หนา ทใี่ นการนับจาํ นวนอักขระใน string และพิมพความยาวของสตริงบนจอภาพ - Center() ทาํ หนาที่ในการพิมพสตริงกลางจอภาพ ณ ตาํ แหนง ท่ี cursor ชี้อยู - Convert() ทาํ หนาท่ใี นการจดั เรยี งอกั ขระในสตริงจากตวั สดุ ทา ยมายังตวั แรก 2. ใหเ ขยี นโปรแกรมเพอ่ื รบั ขอ มลู รหสั ชื่อนักศึกษา คะแนนระหวา งภาค คะแนนปลายภาค ของ นักศึกษาจํานวน 10 คน และแสดงผลขอมูลทั้งหมด พรอมคะแนนรวมของนักศึกษาแตละคน โดยเขยี นโปรแกรมแยกเปน ฟงกช นั ตามความเหมาะสม 3. ใหเขียนโปรแกรมรับขอมูลสตริง จํานวน 5 ขอความ จัดเรียงขอมูลสตริงทั้ง 5 ขอความนั้น จากนอ ยไปมาก และจากมากไปนอ ย พรอมแสดงทางจอภาพ โดยสรา งฟง กช นั ในการ ทาํ งานใหเ หมาะสม ศิริชัย นามบรุ ี สตริง(string)

! บทที่ 8 ขอมูลอินิวเมอเรดเต็ด (enumerated) ♦!ความหมายของขอ มลู ชนดิ enumerated enumerated หมายถึง ประเภทขอมูลที่ประกอบดวยสมาชิก(member) จาํ นวนหนึ่งซึ่งมีคาคงที่ และลาํ ดับที่อยูของรายการขอมูลแนนอนและมีความสัมพันธกัน เชน วันในหนึ่งสัปดาห ประกอบดว ย สมาชิก อาทติ ย จนั ทร องั คาร พุธ พฤหัสบดี ศกุ ร และเสาร ♦!วิธกี าํ หนดขอ มลู ใหเ ปน ประเภท enumerated การกาํ หนดหรอื ประกาศใหข อ มลู เปน ชนดิ enumerate มรี ปู แบบดงั น้ี ! enum type_name{member1,member2,member3,…,member n); โดยท่ี enum เปน คยี เ วริ ด ตอ งเขยี นทกุ ครง้ั เมอ่ื กาํ หนด enumerated type_name คือ ชอ่ื ประเภท enumerated ที่ผูใชกาํ หนดเอง member1,… คือ ชื่อสมาชิกและจาํ นวนสมาชิก กาํ หนดไวใ นเครอ่ื งหมาย [ ] มีมากกวา 1 ตัวใช , แบงรายการสมาชิก สมาชกิ ทกุ ตวั ของอนิ วิ เมอเรดเตด็ ถอื เปน constant จงึ เรยี กอกี อยา งหนง่ึ วา enumerated constant ♦ค! า ของอนิ วิ เมอเรดเตด็ เมอ่ื เรากาํ หนดขอ มลู แบบ enumerated ในโปรแกรม C++ จะกาํ หนดใหสมาชิกตัวแรกมีคาเทา กับจาํ นวนเตม็ (integer) 0 และกาํ หนดคา 1,2,3,…ใหแกสมาชิกที่อยูในลาํ ดับตอไปตามลาํ ดบั เชน enum DayOfWeek{sun,mon,tue,wen,thu,fri,sat}; คาของสมาชิกแตละลําดบั เปน ดงั น้ี sum=0, mon=1,tue=2,wen=3,thu=4,fri=5,sat=6 ถาตองการกาํ หนดใหส มาชกิ ตวั แรกเรม่ิ ท่ี 1 สามารถเขียนไดดังนี้ enum DayOfWeek{sun=1,mon,tue,wen,thu,fri,sat}; คา ของ sum=1, mon=2,tue=3,wen=4,thu=5,fri=6,sat=7 enum DayOfWeek{sun=1,mon,tue,wen=50,thu,fri,sat}; คา ของ sum=1, mon=2,tue=3,wen=50,thu=51,fri=52,sat=53 การกาํ หนดคาของสมาชิก enumerated สามารถกาํ หนดคา ใหเ ปน อกั ษรได เชน ศิริชัย นามบรุ ี อนิ วิ เมอเรดเตด็ (enumerated)

! 106 enum FileMenu{FileOpen='O', FileClose='F',FileSave='S',Exit='X'}; หมายเหตุ คาของสมาชิก enumerated ปกติจะเปน integer เรม่ิ ตง้ั แต 0,1,2… เวน แตผ ใู ชจ ะ กําหนดใหเปนอยางอื่นตามที่กลาวมา ♦!การประกาศตวั แปรประเภท enumerated และการกาํ หนดคา ขอ มลู ประเภท enumerated เมอ่ื สรา งชอ่ื ประเภทขอ มลู ขน้ึ แลว สามารถนําไปใชใ นการประกาศ หรอื กาํ หนดตวั แปรชนดิ นน้ั ได เชน enum DayOfWeek {sun,mon,tue,wen,thu,fri,sat}; //กําหนดชื่อประเภท enumerated DayOfWeek day,newday; //day และ newday เปน ตวั แปรประเภท DayOfWeek ซึ่ง //เปน ประเภทขอ มลู enumerated ที่ผูใชกาํ หนดขน้ึ ใหม จากตวั อยา ง ตวั แปร day และ newday เปน ตวั แปรชนดิ DayOfWeek ซง่ึ เปน ประเภท enumerated ดงั นน้ั ตวั แปร day และ newday สามารถมีคาหรือกําหนดคาที่เปน ไปได คือ sun,mon,tue,wen,thu,fri,sat คา ใดคาหนึง่ เทาน้ัน ไมสามารถเก็บคาคงที่ชนิดอื่น ๆ ได เชน day=sun; //sun = 1 newday=sat; //sat = 6 คา ของ day คือ 0 สวนคาของ newday = 6 •! ตัวอยางโปรแกรม enum1.cpp แสดงการสรา งขอ มลู ประเภท enumerated และการ ประกาศตวั แปร รวมถงึ การดําเนนิ การกบั ตวั แปรประเภท enumerated /*Program : enum1.cpp Process : create and manage enumerated data type*/ #include <iostream.h> #include <conio.h> void main() { enum DayOfWeek{sun,mon,tue,wen,thu,fri,sat}; DayOfWeek day,newday; //declar var day,newday are DayOfWeek type //defind value of day and newday variable day=mon; newday=fri; //display clrscr(); cout<< \"Display value of member of DayOfWeek\"<<endl; ศิริชยั นามบรุ ี อนิ วิ เมอเรดเตด็ (enumerated)

! 107 cout<< \"sun = \"<<sun<<endl; cout<< \"mon = \"<<mon<<endl; cout<< \"tue = \"<<tue<<endl; cout<< \"wen = \"<<wen<<endl; cout<< \"thu = \"<<thu<<endl; cout<< \"fri = \"<<fri<<endl; cout<< \"sat = \"<<sat<<endl; cout<< \"day = mon is : \"<<day<<endl; cout<< \"newday =fri is : \"<<newday<<endl; cout<< \"Value between newday and day is : \" <<newday-day<<endl; cout<< \"Value between newday+day is : \" <<newday+day; getch(); } •! ตวั อยา งโปรแกรม Boolean.CPP แสดงการกาํ หนดขอ มลู ชนดิ enumerated กําหนดคา ของขอ มลู ไว 2 คา คอื false และ true /*Program:Boolean.Cpp Process: use enumerated type of data */ #include <iostream.h> #include <ctype.h> #include <conio.h> void main() { enum Boolean { False, True}; Boolean Quit=False; char ch; int count=0; do{ clrscr(); ++count; cout<<\"\\n Count = \"<<count; cout<<\"\\n Continue <y/n> \"; ch=getch(); if(toupper(ch)=='N') Quit=True; ศิริชัย นามบรุ ี อนิ วิ เมอเรดเตด็ (enumerated)

! 108 }while(!Quit); cout<<\"\\n end of program\";getch(); } ♦!แบบฝกหัดทายบท 1. จากขอมูลตอไปนี้ Biggest, Big, Middle, Small, Smallest ใหเ ขยี นโปรแกรมเพอ่ื กาํ หนดใหเ ปน ขอมูลชนิด enumerated แลวกาํ หนดตวั แปรเพอ่ื แสดงคา คงทข่ี องสมาชกิ enumerated ใหถ กู ตอ ง 2. จากขอ มลู ชอ่ื เดอื นในรอบป January, February , March, April, May, June, July, August, September, October, November, December ใหนักศึกษาเขียนโปรแกรมเพื่อกาํ หนดให ขอมูลเหลานี้เปนสมาชิกขอมูลชนิด enumerated โดยกําหนดให January มีคาเทากับ 1 แลว สรา งตวั แปรอารเ รยเ พอ่ื เกบ็ คา ของสมาชกิ enumerated ชดุ น้ี และแสดงคาของอาเรยที่เก็บคา ของ enumerated ออกทางจอภาพ ศิริชยั นามบรุ ี อนิ วิ เมอเรดเตด็ (enumerated)

! บทที่ 9 ขอมูล structure และ union ♦ค! วามหมายของ structure structure หมายถึง กลุมขอมูลซึ่งประกอบดวยขอมูลชนิดเดียวกันหรือหลายชนิดก็ได ขอ มลู แตละรายการใน structure เรยี กวา สมาชกิ ของสตรกั เจอร (members of structure) structure แตกตาง จากอารเ รย คือ สมาชิกของ structure แตละรายการเปน ขอมูลตางชนิดกันได แตส มาชกิ ของอารเ รย แตล ะรายการจะตอ งเปน ชนดิ เดยี วกนั เทา นน้ั ตัวอยางขอมูลที่สามารถนาํ มาเก็บเปนชนิด structure ไดแกขอมูลที่มีรายละเอียดภายในแตละรายการเปนขอมูลตางชนิด(Data Type) กัน เชน - ขอมูลประวัตินักศึกษา ประกอบดว ย รหัสนักศึกษา, ชื่อนักศึกษา, อายุ, วนั เดอื นปเ กดิ - ขอ มลู รายละเอยี ดวชิ า ประกอบดว ย รหสั วชิ า, ชอ่ื วชิ า, จํานวนหนว ยกติ , ผสู อน - ขอมูลประวัติสินคา ประกอบดว ย รหัสสินคา, คําอธิบายรายการ, หนว ยนบั , ราคาตอ หนว ย ♦ว!ิธีสรางขอมลู ประเภท structure และการนําไปใช กอ นทจ่ี ะนําขอ มลู ประเภท structure มาใชใ นโปรแกรม จะมี 2 ขั้นตอน คือ 1. สรา งชอ่ื ประเภทขอ มลู ใหเ ปน ประเภท structure กอนโดยผูใชกาํ หนดชอ่ื structure จาก keyword คําวา struct 2. จากน้นั จากนาํ ชื่อประเภทขอมูล structure ไปประกาศตัวแปรที่ตองการสรางขึ้นใชภายใน โปรแกรม การสรา งประเภทขอ มลู ใหเ ปน structure มรี ปู แบบโครงสรา ง ดงั น้ี struct ชอ่ื สตรกั เจอร { ชนิดขอมูล ชื่อรายการ; ชนิดขอมูล ชื่อรายการ; ชนิดขอมูล ชื่อรายการ; ชนิดขอมูล ชื่อรายการ; }; ศิริชัย นามบุรี ขอมูล structure และ union

! 110 เชน ถาตองการสรางขอมูลแบบ structure เพอ่ื เกบ็ ขอ มลู รหัสนักศึกษา, ชื่อนักศึกษา, คะแนนสอบ ระหวางภาค, คะแนนสอบปลายภาค และเกรด กําหนดรายละเอยี ดใน structure ดงั น้ี struct STD ชอ่ื structure กาํ หนดโดยผใู ช { char code[9]; char name[31]; int midterm; ชอ่ื ฟลด( Field) ในโครงสรา ง int final; char grade; }; STD คอื ชอ่ื ของประเภท structure ที่มีสมาชิกหรือฟลด(Field) 5 รายการ คือ code, name, midterm, final และ grade โดยที่สมาชิกแตละรายการมีชนิดขอมูลที่แตกตางกันได การประกาศตัวแปร เมื่อตองการนาํ ชื่อ STD ไปใชประกาศตัวแปร สามารถประกาศตัวแปรไดตามรูปแบบ การประกาศตัวแปรประเภทอื่น ๆ ทาํ ได 2 วธิ ี คือ วิธีแรก ประกาศตัวแปรไปพรอมกับการสราง structure struct STD { char code[9]; char name[31]; int midterm; int final; char grade; } student; วิธีแรก ประกาศตัวแปร หลงั จากสราง structure แลว struct STD { char code[9]; char name[31]; int midterm; int final; char grade; ชื่อตัวแปร Student เปน ประเภท STD }; STD student; ศิริชัย นามบุรี ขอมูล structure และ union

! 111 ♦!การอา งถงึ structure และสมาชกิ ของ structure การอางถึงสมาชิกใน structure ไมสามารถจะอางถึงชื่อรายละเอียดใน structure โดยตรงได แต จะตองกําหนดตัวแปร(variable) ที่มชี นิดเปน structure ขึ้นมากอน เชน จากตัวอยางที่สราง structure ชื่อ STD ขึ้น เราสามารถประกาศตัวแปร student และ stud ใหเ ปน ประเภท STD ไดด งั น้ี STD student,stud; //ชื่อตัวแปรคือ student และ stud หรอื อาจประกาศในขณะสรา ง structure ก็ได มรี ปู แบบดงั น้ี struct STD { char code[9]; char name[31]; int midterm; int final; char grade; }student,stud; เมอ่ื เรากาํ หนดตวั แปร student และ stud ใหเ ปน ชนดิ STD ซึ่งเปน structure ไดแลว เรา สามารถอางถึงสมาชิกของ STD ไดโดยการเขียนชื่อตัวแปรเครื่องหมายจุดและตามดวยชื่อรายการ สมาชิกหรือฟลด( Field)ของ STD ดงั น้ี student.code หมายถึง รหัสนักศึกษา student.name หมายถึง ชื่อนักศึกษา student.midterm หมายถึง คะแนนสอบระหวางภาค student.final หมายถึง คะแนนสอบปลายภาค student.grade หมายถึง เกรด หรอื stud.code หมายถึง รหัสนักศึกษา stud.code หมายถึง รหัสนักศึกษา stud.name หมายถึง ชื่อนักศึกษา stud.midterm หมายถึง คะแนนสอบระหวางภาค stud.final หมายถึง คะแนนสอบปลายภาค stud.grade หมายถึง เกรด ศิริชัย นามบุรี ขอมูล structure และ union

! 112 ♦ก! ารกําหนดคา คงทใ่ี หก บั สมาชกิ ของ structure struct STD { char code[9]; char name[31]; int midterm; int final; char grade; }student,stud; จากโครงสรา งของ STD และการกาํ หนดตวั แปร student , stud สามารถกาํ หนดคาใหกับตัว แปรไดด งั น้ี 1. กําหนดคาคงที่ใหกับ structure เขยี นไดด งั นี้ strcpy(student.code,\"40214514\"); //เนอ่ื งจากเปน string ตอ งใช strcpy() strcpy(student.name, \"Somsak\"); //เนอ่ื งจากเปน string ตอ งใช strcpy() student.midterm = 45; student.final = 30; student.grade=75; 2. การกาํ หนดคา ของตวั แปรใหก บั structure เขยี นไดด งั น้ี char co[9]=”10015210”; strcpy(student.code,co); int x = 25; student.midterm = x; ♦ก! ารรบั ขอ มลู จากคยี บ อรด เกบ็ ในสมาชกิ ของ sturcture การรับคาคงที่จากคียบอรดไปเก็บไวใน structure ทาํ ไดโดยใช cin>> ดงั น้ี cin>>student.code; cin>>student.name; cin>>student.midterm; cin>>student.final; cin>>student.grade; ศิริชยั นามบุรี ขอมูล structure และ union

! 113 ♦!การแสดงขอ มลู จากสมาชกิ ของ structure การแสดงผลขอมูลจาก structure ทาํ ไดโดยใช cout<< ดงั น้ี cout<<student.code; cout<<student.name; cout<<student.midterm; cout<<student.final; cout<<student.grade; •! ตัวอยางโปรแกรม stru_exp1.cpp แสดงการกําหนดโครงสรา ง structure การประกาศตวั แปร การรบั คา ทางคยี บ อรด และแสดงคาใน structure เพื่อเก็บรายละเอียดขอมูลคะแนน สอบนักศึกษา จาํ นวน 1 คน /*Program : stru_ex1.cpp Process : creat structure and manage structure*/ #include <iostream.h> #include <conio.h> //declaration structure STD struct STD { char code[9]; char name[31]; int midterm; int final; char grade; }; //declaration prototype function void input(); void display(); //declaration student is global variable has structure type STD student; void main() //begin main program { clrscr(); input(); clrscr(); display(); getch(); } //end main program void input() //function enter data ขอมูล structure และ union ศิริชยั นามบุรี

! 114 { clrscr(); gotoxy(30,2);cout<< \" Please enter data : \"; gotoxy(5,4);cout<< \"Code : \"; gotoxy(5,5);cout<< \"Name : \"; gotoxy(5,6);cout<< \"Midterm : \"; gotoxy(5,7);cout<< \"Final : \"; gotoxy(5,8);cout<< \"Grade : \"; //input from keyboard gotoxy(15,4);cin>>student.code; gotoxy(15,5);cin>>student.name; gotoxy(15,6);cin>>student.midterm; gotoxy(15,7);cin>>student.final; gotoxy(15,8);cin>>student.grade; } void display() //function display data { gotoxy(30,2);cout<< \" Your Information : \\a\"; gotoxy(5,4);cout<< \"Code : \"<<student.code; gotoxy(5,5);cout<< \"Name : \"<<student.name; gotoxy(5,6);cout<< \"Midterm : \"<<student.midterm; gotoxy(5,7);cout<< \"Final : \"<<student.final; gotoxy(5,8);cout<< \"Grade : \"<<student.grade; } ศิริชัย นามบุรี ขอมูล structure และ union

! 115 ♦!อารเ รยข อง structure การกาํ หนดอารเ รยข อง structure มีวิธีการเชนเดียวกับการกําหนดอารเ รย 1 มติ ปิ กติ เพราะถอื วา structure เปน ขอ มลู 1 รายการในอารเ รย ดงั นน้ั การอา งองิ ถงึ ขอ มลู ทเ่ี ปน อารเ รยช นดิ โครงสรา ง จึงตองอางถึงตาํ แหนงรายการของสมาชิกในอารเ รยรวมกบั การอางถึงสมาชกิ ใน structure struct STD //สราง structure ชื่อ STD { char code[9]; char name[31]; int midterm; int final; char grade; }; STD student[5]; //ประกาศตัวแปรชอื่ student เปน อารเ รยมสี มาชกิ เปน structure ชื่อ STD จาํ นวน 5 รายการ ฟลด( Field) หรือสมาชกิ ของโครงสราง index ของ array code[9] name[31] midterm final grade 0 10000001 somsak 55 20 B 1 ... ... ... ... ... 2 3 4 ดงั นน้ั การอางถึงสมาชิกของอาเรยตองใช [index] ตามหลังชื่อตัวแปรและอางถึงสมาชิกของ structure ตองใช ตามดวยจุด (.) และชื่อรายการสมาชิกใน structure ดงั น้ี student[0].midterm=30; student[1].final=50; strcpy(student[0].code,\"10012512\"); cin>>student[4].code; cout<<student[4].code; ศิริชยั นามบุรี ขอมูล structure และ union

! 116 •! ตัวอยางโปรแกรม stru_exp1.cpp แสดงการใชโ ครงสรา งขอ มลู อารเ รยร ว มกบั โครงสรา ง ขอ มลู แบบ structure เพื่อเก็บรายละเอียดขอมูล รหสั , ชื่อ, คะแนนสอบระหวา งภาค, ปลายภาค และเกรดของนกั ศกึ ษา จาํ นวน 5 คน /*Program : stru_exp1.cpp Process : creat structure and manage structure*/ #include <iostream.h> #include <conio.h> //declaration structure STD struct STD { char code[9]; char name[31]; int midterm; int final; char grade; }; //declaration prototype function void input(); void display(); //declaration array structure is global variable STD student[5]; void main() //begin main program { clrscr(); input(); clrscr(); display(); } //end main program void input() //function enter data { int i; for(i=0;i<=4;++i) { clrscr(); gotoxy(15,2);cout<< \" Please enter data of student No.# \\a\"<<i+1; gotoxy(5,4);cout<< \"Code : \"; gotoxy(5,5);cout<< \"Name : \"; gotoxy(5,6);cout<< \"Midterm : \"; gotoxy(5,7);cout<< \"Final : \"; gotoxy(5,8);cout<< \"Grade : \"; gotoxy(15,4);cin>>student[i].code; ศิริชัย นามบุรี ขอมูล structure และ union

! 117 gotoxy(15,5);cin>>student[i].name; gotoxy(15,6);cin>>student[i].midterm; gotoxy(15,7);cin>>student[i].final; gotoxy(15,8);cin>>student[i].grade; } } void display() //function display data {int i; for(i=0;i<=4;++i) { clrscr(); gotoxy(30,2);cout<< \" Your Information : studen#\\a\"<<i+1; gotoxy(5,4);cout<< \"Code : \"<<student[i].code; gotoxy(5,5);cout<< \"Name : \"<<student[i].name; gotoxy(5,6);cout<< \"Midterm : \"<<student[i].midterm; gotoxy(5,7);cout<< \"Final : \"<<student[i].final; gotoxy(5,8);cout<< \"Grade : \"<<student[i].grade; cout<<endl<<endl<< \"press any key to continue...\"; getch(); } } ♦!ขอมูลชนิด union ยเู นยี น(union) เปนกลุมขอมูลที่มีโครงสรางเชนเดียวกับ structure แตมีความแตกตางกันใน ดานวิธีการกําหนด และวิธีการจัดเก็บขอมูลในหนวยความจาํ การจดั เกบ็ ขอมลู ในหนว ยความจํา สมาชิกแตละรายการของ structure จะจองพน้ื ทจ่ี ดั เกบ็ ขอมูลในหนวยความจาํ อิสระจากกัน แต union สมาชิกทุกตัวจะจองพื้นที่ในหนวยความจําตาํ แหนง เดียวกัน และใชหนวยความจาํ ตาํ แหนง นน้ั รว มกนั สมาชิกแตละตัวจะเขาไปใชหนวยความจําของ พรอ มกนั ไมได จะตองสลับกันใชหนวยความจาํ ตาํ แหนง นน้ั จงึ ตอ งระมดั ระวงั ความถกู ตอ งของขอ มูลเมื่อจะอางถึงสมาชิกแตละตัวใน union มปี ระโยชนใ นเรอ่ื งของการประหยดั หนว ยความจาํ ถาจํา เปน ตอ งใชต วั แปรหลายตวั แตเขาไปใชหนวยความจาํ ไมพรอมกัน ศิริชัย นามบุรี ขอมูล structure และ union

! 118 การกาํ หนดขอ มลู แบบ union มรี ปู แบบดงั น้ี union ช่ือยูเนยี น { ชนดิ ขอ มลู ชื่อรายการสมาชิก; ชนดิ ขอ มลู ชื่อรายการสมาชิก; ชนดิ ขอ มลู ชื่อรายการสมาชิก; ชนดิ ขอ มลู ชื่อรายการสมาชิก; }; เชน union STD2 { char code[9]; char name[31]; int midterm; int final; char grade; }; •! ตัวอยางโปรแกรม union.cpp แสดงการใชขอมูลประเภท structure เปรยี บเทยี บกบั การใช union เนื่องจากสมาชิกของ structure ใชวิธีการเก็บขอมูลในหนวยความจาํ แยกกนั เปน อิสระจึงสามารเก็บขอมูลพรอมกันได และนํามาใชไดถูกตอง สวน union สมาชิก ทกุ รายการใชหนวยความจําตาํ แหนง เดยี วกนั สมาชิกจะเขามาใชพรอมกันไมได ดังนั้นจึง แสดงขอมูลที่เก็บไวไดไมถูกตอง เมื่อกาํ หนดใหเกบ็ ขอมลู พรอ มกนั ถูกตองเฉพาะรายการ สุดทายที่เขาไปใชหนวยความจํา /*Program : union.cpp Process : creat structure and union ,compare using memory*/ #include <iostream.h> #include <conio.h> #include <string.h> ศิริชัย นามบุรี ขอมูล structure และ union

! 119 ขอมูล structure และ union //declaration structure STD struct STD { char code[9]; char name[31]; int midterm; int final; char grade; }; //declare union STD2 union STD2 { char code[9]; char name[31]; int midterm; int final; char grade; }; //declaration global variable STD student; //type is structure STD2 stu; //type is union void main() //begin main program { clrscr(); //set value of student variabel...struct type strcpy(student.code,\"100001\"); strcpy(student.name,\"Somsak\"); student.midterm=35; student.final=30; student.grade='D'; //set value of stu variable... union type strcpy(stu.code,\"100001\"); strcpy(stu.name,\"Somsak\"); stu.midterm=35; stu.final=30; stu.grade='D'; //display data from student (struct) cout<< \"Display data from student variable of struct\"<<endl; cout<< \"student.code= \"<<student.code<<endl; cout<< \"student.name= \"<<student.name<<endl; cout<< \"student.midterm= \"<<student.midterm<<endl; cout<< \"student.final= \"<<student.final<<endl; ศิริชัย นามบุรี

! 120 cout<< \"student.grade= \"<<student.grade<<endl; cout<< \"*** correct value of student ***\\a\"<<endl<<endl; //display data from stu (union) cout<< \"Display data from stu variable of union\"<<endl; cout<< \"stu.code= \"<<stu.code<<endl; cout<< \"stu.name= \"<<stu.name<<endl; cout<< \"stu.midterm= \"<<stu.midterm<<endl; cout<< \"stu.final= \"<<stu.final<<endl; cout<< \"stu.grade= \"<<stu.grade<<endl; cout<< \"*** error value of stu ***\\a\"<<endl; getch(); } ♦!แบบฝกหัดทายบท 1. ใหเ ขยี นโปรแกรมเพอ่ื เกบ็ ประวตั พิ นกั งานของบรษิ ทั แหง หนง่ึ มจี ํานวนพนักงานสูงสุดไมเกิน 100 คน รายละเอียดขอมูลที่จัดเก็บไดแก รหัสพนักงาน, ชื่อสกุล, ที่อย,ู อายุ, เงนิ เดอื น,ตาํ แหนง , สถานภาพสมรส กาํ หนดการจดั เกบ็ รายละเอยี ดขอ มลู เปน ชนดิ โครงสรา ง โดยสรา งเปน ฟง กช นั ตา ง ๆ ใหทาํ งาน ดงั น้ี - กรอกขอ มลู ไดต ามจํานวนคนทต่ี อ งการ (แตไ มเ กนิ 100 คน) - แสดงรายงานรายละเอียดประวัติของพนักงานทุกคนได, แสดงอายุเฉลี่ย, เงนิ เดอื นรวม, เงนิ เดอื นเฉลย่ี และคาํ นวณภาษีหัก ณ ที่จาย 5% ของเงนิ เดอื นพนกั งานแตล ะคน - คน หาประวัติพนกั งานเปน รายบคุ ล โดยการกรอกรหสั พนกั งานเพอ่ื คน หาได 2. ใหนักศึกษาเขียนโปรแกรมเพอ่ื คาํ นวณการตดั เกรดนกั ศกึ ษา โดยจดั เกบ็ ขอ มลู เปน ชนดิ โครงสรา ง จํานวนไมเกิน 50 คน กาํ หนดเงอ่ื นไขการตดั เกรด ดงั น้ี คะแนนระหวา ง 1-49 เกรด F คะแนนระหวา ง 50-59 เกรด D คะแนนระหวา ง 60-69 เกรด C คะแนนระหวา ง 70-79 เกรด B คะแนนระหวา ง 80-100 เกรด A โปรแกรมมคี วามสามารถดงั น้ี ศิริชัย นามบุรี ขอมูล structure และ union

! 121 - กรอกรายละเอยี ด รหสั , ชื่อนักศึกษา, คะแนนระหวางภาค, คะแนนปลายภาค โดยสามารถ กาํ หนดจํานวนคนทต่ี อ งการกรอกขอ มลู ได (แตไ มเ กนิ 50 คน) หรอื สามารถหยดุ กรอกขอ มลู ไดโ ดยทไ่ี มจ ําเปน ตอ งกรอกครบ 50 คน - รวมคะแนนเพอ่ื นําไปคาํ นวณตดั เกรด - คํานวณการตดั เกรดตามเกณฑท ก่ี าํ หนดไว - นบั จาํ นวนคนทไ่ี ดร บั เกรดแตล ะเกรด - แสดงผลการตดั เกรดเรยี งตามคะแนนจากมากไปหานอ ย โดยทก่ี ารเขยี นโปรแกรมจะตอ งสรา งเปน ฟง กช นั แบง ตามหนา ทก่ี ารทํางานในโปรแกรมให เหมาะสม ศิริชยั นามบุรี ขอมูล structure และ union

! บทที่ 10 พอยนเ ตอร (Pointer) ♦!address คอื อะไร ในการทาํ งานของคอมพวิ เตอร จะเก็บขอมูล(data) และโปรแกรมหรอื ชดุ ของคาํ สั่ง (instruction set)ไวในหนวยความจําหรอื ทเ่ี รยี กวา เมโมรี (memory) เพอ่ื นําไปประมวลผลใน CPU หรอื เกบ็ ผลการทําจาก CPU หนว ยความจํานม้ี หี นว ยนบั เปน ไบต (byte) หนวยความจําทกุ หนว ยหรอื ไบตจ ะมเี ลขประจาํ ตาํ แหนงเพื่อใชสําหรบั อา งถงึ หมายเลข ตาํ แหนง ของหนว ยความจําเปรียบเสมือนบานเลขที่ที่เราใชอางถึงในการสงจดหมาย หมายเลขตาํ แหนง หนวยความจําหนว ยหนง่ึ เราเรยี กวา แอดเดรส (address) ของหนว ยความจํา โดยหมายเลขของแอดเด รสจะเรม่ิ ตําแหนง ท่ี 0, 1, 2, 3,…จนถึงคาสูงสุดของหนวยความจําทต่ี ดิ ตง้ั อยใู นคอมพวิ เตอรใ นเครอ่ื ง นน้ั ๆ เชน ในเครอ่ื งคอมพวิ เตอรท ม่ี หี นว ยความจํา 640 KB. มคี า ของแอดเดรสสงู สดุ คือ 0 - 655,359 ในเครอ่ื งคอมพวิ เตอรท ม่ี หี นว ยความจํา 1 MB. มคี า ของแอดเดรสสูงสดุ คือ 0 -1,048,575 ในเครอ่ื งคอมพวิ เตอรท ม่ี หี นว ยความจํา 8 MB. มคี า ของแอดเดรสสงู สดุ คือ 0- 8,388,607 หมายเหตุ ในระบบคอมพิวเตอร การอา งองิ ถงึ address ของหนว ยความจํา จะใชเลขฐานสิบหก (hexadecimal) สาํ หรับการอางอิงถงึ การใชหนวยความจํา การกาํ หนดตําแหนง หนว ยความจาํ เมอ่ื C++ มกี ารประกาศใชต วั แปร ซึ่งจะตองจองพื้นที่ใน หนว ยความจํา C++ Compiler จะดําเนนิ การจองหรอื กําหนดตําแหนง แอดเดรสและจดั สรรหนว ยความ จําผานซอฟตแวรระบบปฏิบัติการ (Operating System) เชน DOS, Windows'95 ซึ่งกระบวนการเหลา นเ้ี ปน หนา ทข่ี องระบบปฏบิ ตั กิ ารโดยตรง ♦!การแสดงแอดเดรส ใน C++ เราสามารถทราบ address ของหนว ยความจําทต่ี วั แปรตวั ใดตวั หนง่ึ ทก่ี ําลงั จองหนว ย ความจําหรอื ใชง านอยไู ดโ ดยใช operator คือ & (address of - แอดเดรสของ) กาํ กบั หนาชอื่ ตวั แปร ทเ่ี ราตอ งการทราบ address เชน ประกาศตัวแปร number เปน integer และกาํ หนดคาคงที่ใหเปน 250 ดงั น้ี int number = 250; ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 123 ถา ตอ งการแสดงตําแหนง หรอื คา address ในหนวยความจาํ ที่เก็บคา 250 ซง่ึ เปน คา ของ ตวั แปร number เขียน statement ไดด งั น้ี cout<<&number; โปรแกรมจะแสดงคา ตําแหนง address เปนคาเลขฐานสบิ หก เชน 0x8fa6fff4 สาํ หรบั คา ของ address ที่ไดจากการทาํ งานของโปรแกรมแตล ะครง้ั น้ี ไมจาํ เปน จะตอ งไดค า address เปน คา เดมิ ทกุ ครง้ั นน่ั คอื การจองหนว ยความจําของตวั แปร address อาจเปลี่ยนแปลงตาํ แหนง ได ดงั รายละเอยี ดโปรแกรม disp_add.cpp ตอ ไปน้ี •! ตัวอยางโปรแกรม disp_add.cpp แสดงคา address ของตวั แปรในโปรแกรมแตล ะตวั /*Program : disp_add.cpp Process : disply address value of variable */ #include <iostream.h> #include <conio.h> void main() { int number1=250; float number2=1005.25; double number3=1254025.25212; char name[]=\"Mr.Sirichai\"; //display address by & operator clrscr(); cout<< \"Display address of variable...\"<<endl; cout<< \"Address of number1 = \"<<&number1<<endl; cout<< \"Address of number2 = \"<<&number2<<endl; cout<< \"Address of number3 = \"<<&number3<<endl; cout<< \"Address of name = \"<<&name<<endl; getch(); } ผลการ run โปรแกรมครง้ั แรก แสดงผลลัพธดังนี้ Display address of variable... Address of number1 = 0x8f5afff4 Address of number2 = 0x8f5afff0 Address of number3 = 0x8f5affe8 Address of name = 0x8f5affdc ศิริชัย นามบรุ ี พอยนเตอร(pointer)

! 124 ผลการ run โปรแกรมครง้ั ทส่ี อง แสดงผลลัพธคา address ตางกัน ดังนี้ Display address of variable... Address of number1 = 0x8f5afff4 Address of number2 = 0x8f5afff0 Address of number3 = 0x8f5affe8 Address of name = 0x8f5affda ♦ต! วั แปรชนดิ pointer ตัวแปร(variable) ที่ไดศึกษามาแลวไดแก ตวั แปรชนดิ int, float, double, char ตวั แปรเหลา น้ี จะใชเก็บคาคงที่ตามชนิดที่ไดประกาศตัวแปรไว เชน int number; แสดงวา ตวั แปร number ใชเก็บคา คงที่ชนิด integer เทา นน้ั ไมสามารถเก็บคาจํานวนทศนิยมได สาํ หรบั ตวั แปรชนดิ pointer จะเปน ตวั แปรทป่ี ระกาศหรอื กําหนดขน้ึ มาเพอ่ื เตรยี มไวเ กบ็ คา address ของตวั แปรโดยเฉพาะ ไมสามารถเก็บคาคงที่ประเภทอื่น ๆ ได วธิ กี ารประกาศตวั แปรชนดิ pointer ทาํ ไดด งั น้ี ชนิดตัวแปร* ชื่อตัวแปร; //หรอื ชนิดตัวแปร *ชื่อตัวแปร, *ชื่อตัวแปร, *ชื่อตัวแปร; เชน int* add_number; //ตวั แปร add_number เปน ตวั แปรชนดิ pointer ใชเก็บคา address ของ ตวั แปรชนดิ integer เทา นน้ั float* position; //ตวั แปร position เปน ตวั แปรชนดิ pointer ใชเก็บคา address ของตวั แปรชนดิ float เทา นน้ั char *choice, *ptr, *pnt; //ตวั แปร choice,ptr,pnt เปน ตวั แปรชนดิ pointer ใชเก็บคา address ของตวั แปรชนดิ character เทา นน้ั เราเรยี กตวั แปรชนดิ ทเ่ี ปน pointer สั้น ๆ นว้ี า pointer คา ทน่ี าํ มาเก็บใน pointer น้ี ไดจะเปนคาของ address เทา นน้ั และสามารถเก็บคา address ของตัวแปรชนิดเดียวกับชนิดของ pointer เทา นน้ั เชน กําหนด pointer เปน int* ก็สามารถนํา address ของตวั แปรประเภท int มาเก็บ ไดเ ทา นน้ั ศิริชัย นามบรุ ี พอยนเตอร(pointer)

! 125 ตัวอยาง int number = 500; //กําหนดตวั แปร number เปน ชนดิ integer float total = 2500.25; //กําหนดตวั แปร total เปน ชนดิ float int* int_ptr; //กําหนดตวั แปร pointer ชื่อ int_ptr ชนดิ integer float float_ptr; //กําหนดตวั แปร pointer ชื่อ float_ptr ชนดิ float กาํ หนดคา ให pointer โดยใช & ดงั น้ี int_ptr= &number; float_prt = &total; int_ptr = &total; //ไมถกู ตอ ง เพราะ int_prt เปน pointer ชนดิ integer float_ptr = &number; //ไมถ ูกตอ ง เพราะ float_ptr เปน pointer ชนดิ float •! ตัวอยางโปรแกรม pointer.cpp แสดงการเปรยี บเทยี บการใช & operator และการใชตัว แปรชนดิ pointer แสดงคาของ address ของตวั แปร /*Program : pointer.cpp Process : disply address value of variable */ #include <iostream.h> #include <conio.h> void main() { int number1=250; //integer variable float number2=1005.25; //float variable double number3=1254025.25212; //double variable int* int_pointer; //pointer variable float* float_pointer; //pointer variable double* doub_pointer; //pointer variable char* char_pointer; //pointer variable //display address by & operator clrscr(); cout<< \"Display address of variable by & operator\"<<endl; cout<< \"Address of number1 = \"<<&number1<<endl; cout<< \"Address of number2 = \"<<&number2<<endl; cout<< \"Address of number3 = \"<<&number3<<endl<<endl; // set address from memory to pointer variable int_pointer = &number1; float_pointer = &number2; doub_pointer = &number3; ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 126 //display address by pointer variable cout<< \"Display address from pointer variable \"<<endl; cout<< \"Address of number1 = \"<<int_pointer<<endl; cout<< \"Address of number2 = \"<<float_pointer<<endl; cout<< \"Address of number3 = \"<<doub_pointer<<endl; getch(); } ผลลัพธของการ run โปรแกรม แสดงใหเ หน็ วา การใช & operator และการใช pointer จะ ใหคา address เหมอื นกนั Display address of variable by & operator Address of number1 = 0x8f5efff4 Address of number2 = 0x8f5efff0 Address of number3 = 0x8f5effe8 Display address from pointer variable Address of number1 = 0x8f5efff4 Address of number2 = 0x8f5efff0 Address of number3 = 0x8f5effe8 ♦!การอา งถงึ คา คงทซ่ี ง่ึ address ชอ้ี ยทู างออ ม ดวย indirection operator เมอ่ื เราทราบทอ่ี ยหู รอื address ของตวั แปรใด ๆ เราสามารถที่จะใชคาของ address นน้ั อา งถงึ คา คงทท่ี ต่ี วั แปรนน้ั เกบ็ อยไู ด โดยใชเ ครอ่ื งหมาย * กํากบั ทห่ี นา ตวั แปรชนดิ pointer เรยี ก เครอ่ื งหมาย * ทอ่ี ยหู นา pointer วา indirection operator และเรียกการเขาถึงขอมูลที่อยู ณ ตาํ แหนง address นั้นดวยการใช * วา การอา งแอดเดรสทางออ ม (indirect accessing or dereferencing) เชน int number = 500; //ตวั แปร number เปน ชนดิ integer เก็บคาคงที่ 500 ไว int* ptr; //ตวั แปร ptr เปน pointer ชนดิ เกบ็ address ของตวั แปร integer ptr = &number; //ptr เก็บคา address ของตวั แปร number cout<< number ; //แสดงคาตัวแปร number โดยตรงทางจอภาพ จะไดคา 500 cout<<*ptr; //แสดงคาคงที่ ณ ตาํ แหนง address ทพ่ี อยนเ ตอร ptr ชี้อยู ซึ่งก็คือคา 500 ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 127 •! ตัวอยางโปรแกรม pointer2.cpp แสดงคา คงทีข่ องตัวแปร โดยเปรยี บเทยี บจากการแสดง คา ตวั แปรโดยตรง และแสดงคา ตวั แปรโดยใช * อางถึงโดยออมผาน address ในตัวแปร pointer ซึ่งจะใหผลลัพธเหมือนกัน /*Program : pointer2.cpp Process : disply and compare constant from variable and *pointer */ #include <iostream.h> #include <conio.h> void main() { int number1=250; //integer variable float number2=1005.25; //float variable double number3=1254025.25212; //double variable int* int_pointer; //pointer variable float* float_pointer; //pointer variable double* doub_pointer; //pointer variable char* char_pointer; //pointer variable //display constant of variable clrscr(); cout<< \"Display constant from variable (direct access)\"<<endl; cout<< \"Constant of number1 = \"<<number1<<endl; cout<< \"Constant of number2 = \"<<number2<<endl; cout<< \"Constant of number3 = \"<<number3<<endl<<endl; // set address from memory to pointer variable int_pointer = &number1; float_pointer = &number2; doub_pointer = &number3; //display constant at address in pointer variable cout<< \"Display constant from pointer by * (indirect access)\"<<endl; cout<< \"Constant of number1...*int_pointer = \"<<*int_pointer<<endl; cout<< \"Constant of number2 ...*float_pointer = \"<<*float_pointer<<endl; cout<< \"Constant of number3 ...*doub_pointer = \"<<*doub_pointer<<endl; getch(); } ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 128 ♦พ! อยนเตอรที่ไมกําหนดชนิดขอมูล ตวั แปร pointer ที่ผานมา จะตองกาํ หนดชนดิ ขอ มลู ให เชน int* int_ptr; float flt_ptr; เปน ตน ขอ จํากัดของการกาํ หนดชนดิ ของ pointer คือสามารถเก็บ address ไดเ ฉพาะของตวั แปรทเ่ี ปน ประเภทเดยี วกนั เทา นน้ั ดงั นน้ั เพอ่ื ความยดื หยนุ ในโปรแกรม ถาตองการกาํ หนด pointer ใหสามารถเก็บ address ของ ตวั แปรหลาย ๆ ชนิดก็สามารถทาํ ได โดยการกาํ หนดให pointer เปน ชนดิ void หรอื ชไ้ี ปท่ี void เชน void* many_add; //pointer ชื่อ many_add สามารถใชเก็บ address ของตวั แปรหลายชนดิ ได •! ตัวอยางโปรแกรม pointer3.cpp แสดงการใช pointer ชนิด void ทช่ี อ่ื many_ptr ท่ี สามารถเก็บ address ของตวั แปรทีเ่ ปนชนดิ ตวั เลขไดห ลายชนิด ดังนี้ /*Program : pointer3.cpp Process : disply void pointer type */ #include <iostream.h> #include <conio.h> void main() { int number1=250; //integer variable float number2=1005.25; //float variable double number3=1254025.25212; //double variable void* many_ptr; //pointer of many type of variable clrscr(); //display constant at address in pointer variable cout<< \"Display address from 'void* many_ptr' pointer\"<<endl; many_ptr = &number1; cout<< \"Address of number1 integer...many_ptr = \"<<many_ptr<<endl; many_ptr = &number2; cout<< \"Address of number2 float...many_ptr = \"<<many_ptr<<endl; many_ptr = &number3; cout<< \"Address of number3 double...many_ptr = \"<<many_ptr<<endl; getch(); } ศิริชัย นามบรุ ี พอยนเตอร(pointer)

! 129 ♦!ความสมั พนั ธร ะหวา ง pointer กับ array การอา งถงึ ขอ มลู ทอ่ี ยใู นตวั แปรประเภท array นน้ั ปกติจะใช อินเด็กซ (index) เปน ตวั ช้ถี งึ คา คงทห่ี รือขอมลู ที่อยใู น array แตละชอง ตามที่ไดศึกษามาแลว เชน int number[5] = {10,20,30,40,50}; cout<<number[0]; //จะไดคา 10 บนจอภาพ cout<<number[2]; //จะไดคา 30 บนจอภาพ นอกจากการใช index ดังกลาวแลว เรายังสามารถใช pointer ชเ้ี พอ่ื อา งถงึ คา คงทข่ี อง array ไดโดยการใช * (indirection operator) ซึ่งทาํ ไดได 2 วิธี คือ 1. ใช * นาํ หนาชื่อของ array เพื่ออางถึงคาใน array แตละชองได ทงั้ น้เี นอื่ งจากช่ือของ array นน้ั เปน pointer ชี้ address ของ array ชอ งแรกสดุ อยแู ลว เชน cout<< *(number); // จะไดคา 10 เนอ่ื งจากชอ่ื ของ array จะเรม่ิ ชต้ี ําแหนง ชอ งแรกคอื 0 cout<< *(number+1); // จะไดคา 20 เนอ่ื งจากชอ่ื ของ array จะชต้ี าํ แหนง ชอ งท่ี 0+1 คือ ชอ งที่ 1 หรอื สมาชกิ ตวั แรกของ array cout<< *number+3; // จะไดคา 40 เนอ่ื งจากชอ่ื ของ array จะช้ตี าํ แหนง ชอ งท่ี 0+3 คือ ชอ งท่ี 3 2. ใช * นาํ หนาชื่อของ pointer ที่ไดสรางขึ้นและเก็บ address ของ array ชอ งแรกสุดไว กส็ ามารถอา งถงึ ชอ งถดั ไปได เนอ่ื งจากโครงสรา งของ array จะจองพน้ื ที่ในหนว ยความจําตอ เนอ่ื งกนั ไป เชน int number[5] = {10,20,30,40,50}; int* num_add; num_add = number; //เกบ็ address ของอารเ รย ณ ตาํ แหนง สมาชกิ ตวั แรก คือสมาชิกตัวที่ 0 //เขยี นอกี อยา งหนง่ึ ดังนี้ num_add = &number[0]; cout<< *(num_add); // จะไดคา 10 เนอ่ื งจากชอ่ื ของ array จะเรม่ิ ชต้ี ําแหนง ชอ งแรกคอื 0 cout<< *(num_add+1); // จะไดคา 20 เนอ่ื งจากชอ่ื ของ array จะชต้ี าํ แหนง ชอ งท่ี 0+1 คือ ชอ ง ที่ 1 cout<< *num_add+3; // จะไดคา 40 เนอ่ื งจากชอ่ื ของ array จะชีต้ าํ แหนง ชอ งท่ี 0+3 คือ ชองท่ี 3 ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 130 •! ดงั ตวั อยา งโปรแกรม pointer4.cpp แสดงการอา งถงึ คา คงทใ่ี นอารเ รย โดยวิธีปกติคือใช index และการใช pointer โดยใช * นาํ หนาชื่อของอารเรย และนําหนาชื่อของตัวแปร pointer ดังนี้ /*Program : pointer4.cpp Process : disply relation array and pointer */ #include <iostream.h> #include <conio.h> void main() { int number[5]= {10,20,30,40,50}; //integer variable int i; int* num_ptr; clrscr(); num_ptr = number; //same as write this => num_ptr = &number[0] //display by index cout<<\"Display constant by index of array\"<<endl; for(i=0;i<=4;++i) cout<<\"number\"<<i<<\" = \"<<number[i]<<endl; //display by defined pointer of array cout<<endl<<\"Display constant by * (indirect operator) of pointer\"<<endl; for(i=0;i<=4;++i) cout<<\"number\"<<i<<\" = \"<< *(num_ptr+i) <<endl; //display by * (indirect operator) of array name cout<<endl<<\"Display constant by * (indirect operator) of array name\"<<endl; for(i=0;i<=4;++i) cout<<\"number\"<<i<<\" = \"<< *(number+i) <<endl; getch(); } ผลลัพธที่ไดจากการ run โปรแกรม จะใหคาคงที่ของ array ถูกตอง เนื่องจากเปนการอางถึงคา คงท่ี ณ ตาํ แหนง address เดียวกัน ดังนี้ Display constant by index of array number0 = 10 number1 = 20 number2 = 30 number3 = 40 number4 = 50 ศิริชัย นามบรุ ี พอยนเตอร(pointer)

! 131 Display constant by * (indirect operator) of pointer number0 = 10 number1 = 20 number2 = 30 number3 = 40 number4 = 50 Display constant by * (indirect operator) of array name number0 = 10 number1 = 20 number2 = 30 number3 = 40 number4 = 50 ♦!ความสมั พนั ธร ะหวา ง pointer กับ function การสงคา argument ของฟงกชั่น (function) โดยวิธี passed argument by reference เปนการ เรียกใชฟงกชั่นโดยสงคา argument ไปใหฟงกชั่น และมีการเปลี่ยนแปลงคา argument สงคืนกลับมา วิธีการดังกลาวก็สามารถทาํ ไดโ ดยใชก ารสง argument ที่เปน pointer ไป เรยี กวา passed argument pointer •! ตัวอยางโปรแกรม pointer5.cpp แสดงการสงคา argument ดวยวิธี passed argument by reference ที่ไดศกึ ษามาแลว และโปรแกรม pointer6.cpp แสดงการสงคา argument ดวย วิธี passed argument pointer ซึ่งใหผ ลลพั ธเหมอื นกนั /*Program : pointer5.cpp Process : passed argument by reference */ #include <iostream.h> #include <conio.h> //prototype function void CelToFah(float& degree); void main() //begin main program { float celsius; clrscr(); ศิริชัย นามบรุ ี พอยนเตอร(pointer)

! 132 cout<< \"Enter Celsius degree for convert to Fahenhiet : \"; cin>>celsius; //call function and passed argument by reference CelToFah(celsius); //value of celsius will return and changed cout<< \"Result = \"<<celsius<<\" Fahrenhiet degree\"; getch(); } //end main program void CelToFah(float& degree) //function convert Celsius to Fahrenhiet { degree = degree*9/5+32; } •! ตัวอยางโปรแกรม pointer6.cpp แสดงการผานคาใหแกฟงกชันดวย pointer เมื่อมีการ เรียกใชฟ งกช ัน CelToFah จะตองสงคา argument มาใหฟงกชันในลักษณะของ reference คือสงคา celsius มาให degree ซึ่งเปน parameter ของฟงกชัน จากนั้นนํามา แปลงคาแลวสงกลับไปยังชื่อของ celsius ซึ่งเปน argument ทาํ ใหค าของ celsius เปลย่ี น ไป /*Program : pointer6.cpp Process : passed argument by pointer */ #include <iostream.h> #include <conio.h> //prototype function void CelToFah(float* degree); void main() { float celsius; clrscr(); cout<< \"Enter Celsius degree for convert to Fahenhiet : \"; cin>>celsius; //call function and passed argument by address of celsius CelToFah(&celsius); //value of celsius will return and changed cout<< \"Result = \"<<celsius<<\" Fahrenhiet degree\"; getch(); } void CelToFah(float* degree) //function convert Celsius to Fahrenhiet { //* operater refer to value at address in degree pointer *degree = (*degree)*9/5+32; } ศิริชัย นามบรุ ี พอยนเตอร(pointer)

! 133 •! ตัวอยางโปรแกรม Ptr_Arr4.cpp แสดงการใช pointer ในการเขยี นทเ่ี ปน ฟง กช นั แบบมี การใชอากิวเมนตที่เปน pointer /*Proram: Ptr_Arr4.cpp Process: Uses pointer in parameter function manage array*/ #include <iostream.h> #include <conio.h> void Input(); void Display(int *point); void Sum_avg(int *ptr_number); int number[5]; void main() { clrscr(); Input(); Display(&number[0]); getch(); Sum_avg(&number[0]); } void Input() { int i, *ptr; ptr=&number[0]; cout<<\"Enter number 5 item to array by pointer: \"<<endl; for (i=0;i<=4;i++) cin>> *(ptr+i); } void Display(int *point) { int i; clrscr(); cout<<\"Display number 5 item from array by pointer: \"<<endl; for (i=0;i<=4;i++) cout<< *(point+i)<<endl; } void Sum_avg(int *ptr_number) { float sum, average, *ptr_avg; sum=average=0; ptr_avg=&average; for (int i=0;i<=4;i++) sum = sum+ *(ptr_number+i); *ptr_avg =sum/5; cout<<\"Summation of array 5 item: \"<<sum<<endl; cout<<\"Average of array 5 item: \"<< *ptr_avg; getch(); } ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 134 ♦!ความสมั พนั ธร ะหวา ง pointer กับ string เน่อื งจากใน C++ ขอ มลู ประเภท string ก็คือ อารเ รย 1 มติ ิ ชนดิ ทเ่ี ปน character ดงั นน้ั เราจงึ สามารถใช pointer ชต้ี ําแหนงแตละสมาชิกของ string ได •! ตัวอยางโปรแกรม str_ptr1.cpp แสดงการอางถึงขอมูลในสตริง โดยใช pointer โดยตรง การใชตัวแปร pointer และการอางโดยใชชื่อสตริงตามปกติ Program : str_ptr1.cpp Process : display string by name of array and pointer */ #include <iostream.h> #include <conio.h> void main() { char text[] = \"Mr.Sirichai Namburi\"; char* ptr_str = \"Computer Department , RIPA\"; char* ptr_var; //comparative display constant from string clrscr(); cout<< \"Display constant of string by...\"<<endl<<endl; cout<< \" Name of teacher : \"<<text<<endl; //display by array cout<< \"Office : \"<<ptr_str<<endl; //display by pointer ptr_var=text; //use pointer variable store address of text[0] cout<< \"Name of teacher(*ptr_var)= \"<<*ptr_var<<endl;//refer only address of text[0] cout<< \"Name of teacher(ptr_var)= \"<<ptr_var<<endl; //point at text[0] cout<< \"Name of teacher(++ptr_var)= \"<<++ptr_var<<endl; //point at text[1] cout<< \"Name of teacher(++ptr_var)= \"<<++ptr_var<<endl; //point at text[2] cout<< \"Name of teacher(++ptr_var)= \"<<++ptr_var<<endl; //point at text[3] cout<< \"Name of teacher(++ptr_var)= \"<<++ptr_var<<endl; //point at text4] getch(); } •! ตัวอยางโปรแกรม str_ptr2.cpp แสดงการใช array 2 มิติ และใช pointer ของสตรงิ ในการ อางถึงสมาชิกแตละรายการ เพอ่ื แสดงรายการเมนใู หเ ลอื ก /*Program : str_ptr2.cpp Process : display 2 dimension array and use pointer */ #include <iostream.h> #include <conio.h> ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 135 void main() { const int no = 4; const char* MenuItem[no] = { \"0. Open File\", \"1. Write File\", \"2. Read File\", \"3. Exit\"}; //begin statement clrscr(); int choice,row=4; do { gotoxy(30,2);cout<< \"Main Menu\"; for(int i=0;i<=3;++i) {gotoxy(30,row); cout<<MenuItem[i]; //display menu item by pointer row++; } gotoxy(30,row);cout<<\"Select your choice <0-3> : \"; cin>>choice; if((choice<0)||(choice>3)) { cout<<endl<< \"Error !! choice \\a\"; getch();clrscr();row=4; } }while((choice<0)||(choice>3)); cout<<endl<<endl<<\"Your choice is : \" <<choice<<endl; getch(); } •! ตัวอยางโปรแกรม prt_str.cpp แสดงการใช pointer เพื่อจัดการขอมูลประเภท string โดย กําหนดคาคงที่โดยใชตัวแปรชนิด pointer ทเ่ี ปน อาเรย 1 มิติ /*Program: ptr_str.cpp*/ #include <iostream.h> #include <conio.h> const num=4; //declaration pointer and set value char* size[num]={\"Big\",\"Middel\",\"Small\",\"Little\"}; void main() { clrscr(); //display first character of array by pointer for(int i=0;i<=3;i++) cout<< *size[i]; cout<<endl<<endl; ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 136 //display string by first to last pointer for(i=0;i<=3;i++) cout<<size[i]<<\" \"; cout<<endl<<endl; //display string by last to first pointer for(i=3;i>=0;i--) cout<<size[i]<<\" \"; getch(); } ผลการทํางานของโปรแกรม เปน ดงั น้ี BMSL Big Middel Small Little Little Small Middel Big ♦P! ointer กับขอมูลชนิด Structure เราสามารถใช pointer กบั ขอ มลู ชนดิ โครงสรา งได โดยใช operator เครอ่ื งหมาย -> ตามหลัง pointer แลวตามดวยชื่อ field ใน structure เพื่ออางอิงถึงขอมูลในแตละ field ได ดงั ตวั อยา ง struct STUDENT //สรา ง structure ชื่อ STUDENT { char code[8]; char name[25]; int midterm; int final; char grade; } STD; //ประกาศตวั แปร STD เปน ชนดิ structure ทช่ี อ่ื STUDENT STUDENT *ptr; //ประกาศตวั แปร pointer ชื่อ ptr เปนชนิดเก็บ address ของ //structure ptr = &STD; //ให pointer ptr เกบ็ address ของตวั แปร STD ซึ่งเปนชนิด //structure การอางอิงถึงขอมูลใน structure โดยใช pointer มีรูปแบบ คือ pointer->field_name ดงั ตวั อยาง ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 137 strcpy(ptr->code, \"1000105\"); strcpy(ptr->name,\"Sirichai Namburi\"); ptr->midterm=30; ptr->final=50; ptr->grade='A'; cin>>ptr->code; //รับขอมูลทางแปนพิมพ cin>>ptr->midterm; //รับขอมูลทางแปนพิมพ cout<<ptr->code; //แสดงขอมูล cout<<ptr->midterm; //แสดงขอมูล •! ตัวอยางโปรแกรม ptr_stru.cpp แสดงการใชเครื่องหมาย -> เพื่อใช pointer อางอิงถึง ขอมูลประเภท structure ทง้ั การกําหนดคา คงทดี่ วยเครื่องหมาย = และการรบั คา คงท่ี ทางแปนพิมพผาน cin และแสดงผลขอมูลใน structure โดยเปรยี บเทยี บกบั การใช . ใน การอางอิงถึงฟลดขอมูลในโครงสรางตามที่เคยไดศึกษามา /*Program: ptr_stru.cpp พอยนเตอร(pointer) Process: display to use pointer refered to structure for input and display data in structure */ #include <iostream.h> #include <conio.h> #include <stdio.h> #include <string.h> void set_display(); void Input(); void Display1(); void Display2(); //daclare structure struct mystruct { int number; char name[21]; double age; } s; //declare variable mystruct *sptr = &s; //declare pointer and set pointer void main() ศิริชยั นามบรุ ี

! 138 { clrscr(); set_display(); Input(); Display1(); Display2();getch(); } void set_display() { sptr->number=300; strcpy(sptr->name,\"Sirichai\"); sptr->age=250.125; //display by pointer cout<<\"Display data from structure by pointer -> \\a\"<<endl; cout<<sptr->number<<endl; cout<<sptr->name<<endl; cout<<sptr->age<<endl; } void Input() { cout<<endl<<\"Input data to structure by pointer 3 Item: \\a\"<<endl; cout<<\"Code: \";cin>>sptr->number; cout<<\"Name: \";cin>>sptr->name; cout<<\"Age: \";cin>>sptr->age; } void Display1() { cout<<endl<<\"Display data from structure by use pointer ->\\a\"<<endl; cout<<sptr->number<<endl; cout<<sptr->name<<endl; cout<<sptr->age<<endl; } void Display2() { cout<<endl<<\"Display data from structure by use . reference...\"<<endl; cout<<s.number<<endl; cout<<s.name<<endl; cout<<s.age<<endl; } ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 139 •! ตัวอยางโปรแกรม pt_stra.cpp แสดงการใช array จัดเก็บ pointer เพื่ออางอิงถึงขอมูลใน structure /*Program: pt_stra.cpp Process: display to use pointer refered to array of structure for input and display data in array of structure */ #include <iostream.h> #include <conio.h> #include <stdio.h> #include <string.h> //declaration prototype functions in program void Input(); void Display(); //daclare structure struct mystruct { int number; char name[21]; double age; }; mystruct s[3]; //declare variable array of structure 3 elements mystruct *sptr[3]; //declare array of pointer 3 elements void main() { clrscr(); Input(); Display(); getch(); } void Input() // input data to array by pointer { cout<<endl<<\"Input data to structure by pointer 3 Item: \\a\"<<endl; for(int i=0;i<=2;i++) { sptr[i]=&s[i]; //pointer point at each array of structure cout<<\"Code: \";cin>>sptr[i]->number; ศิริชัย นามบรุ ี พอยนเตอร(pointer)

! 140 cout<<\"Name: \";cin>>sptr[i]->name; cout<<\"Age: \";cin>>sptr[i]->age; cout<<endl; } } void Display() //display all data from array by using pointer sptr[i] { cout<<endl<<\"Display data from structure by use pointer ->\\a\"<<endl; for(int i=0;i<=2;i++) { cout<<sptr[i]->number<<endl; //use pointer cout<<sptr[i]->name<<endl; cout<<sptr[i]->age<<endl<<endl; } } ♦แ! บบฝกหัดทายบท 1. กาํ หนดตวั แปรดงั น้ี A=250 B=1250.125 C=’p’ Str[]=”Computer” จงสรา ง pointer เพอ่ื แสดง address ของตวั แปรตา ง ๆ พรอมทั้งแสดงผลคาคงที่ของตัวแปร เหลา นโ้ี ดยใช pointer 2. จงเขยี นโปรแกรมโดยกาํ หนดตวั แปรประเภทอารเ รย 1 มติ ิ number[10] นาํ คา 10, 15, 20, 25, 30, 35, 40, 45,50,55 เขา ไปเกบ็ ในตวั แปรอารเ รยน้ี และใหกาํ หนดตวั แปรอารเ รยช นดิ ทเ่ี ปน พอยนเ ตอร ชื่อ num_ptr[10] เพอ่ื เกบ็ ตําแหนง address ของตวั แปรอาเรเ รย number[10] แตละสมาชิก ใหแ สดงการตําแหนง ของ address ของแตละสมาชิกใน number[10] และแสดงคา คงที่ที่เก็บไวใน number[10] โดยใชต วั แปร num_ptr ซง่ึ เปน พอยนเ ตอรแ สดงคา คงทข่ี องตวั แปร บนจอภาพ โดยใหโ ปรแกรมแสดงผล ดงั น้ี num_ptr[i] *num_ptr[i] address 0x8f8effe2 Value 5 address 0x8f8effe4 Value 10 address 0x8f8effe6 Value 15 address 0x8f8effe8 Value 20 address 0x8f8effea Value 25 address 0x8f8effec Value 30 ศิริชยั นามบรุ ี พอยนเตอร(pointer)

! 141 address 0x8f8effee Value 35 address 0x8f8efff0 Value 40 address 0x8f8efff2 Value 45 address 0x8f8efff4 Value 50 3. ใหนักศึกษาเขียนโปรแกรมเก็บรายละเอียดสินคา โดยมรี ายละเอยี ดทต่ี อ งจดั เกบ็ คือ รหัสสินคา, ชื่อสินคา, ราคาตอ หนว ย, สวนลดเงินสด(%), หมายเลขโกดังที่เก็บสินคา, จํานวนหนวยสนิ คา คงเหลือ โดยใช pointer อางอิงถึงขอมูลสินคา โดยสรางฟงกชันที่ทําหนาที่ - รบั ขอ มลู (ยกเลิกการกรอกขอมูลเมื่อกรอกรหัสสินคาเปน 0) - แสดงผลรายงานขอมูลทั้งหมด - คนหาสินคาดวยสหัสสินคา โดยโปรแกรมสามารถจัดเก็บประวตั ิสนิ คา ไดไมเกนิ 100 ชนดิ ศิริชัย นามบรุ ี พอยนเตอร(pointer)

! บทที่ 11 การเขียนโปรแกรมแบบ OOP ♦!ววิ ฒั นาการของเทคนคิ การเขยี นโปรแกรม เมอ่ื มกี ารพฒั นาเครอ่ื งคอมพวิ เตอรข น้ึ ในชว งประมาณป 1950 โปรแกรมเมอรใ นยคุ แรกสดุ ใช วิธีการเขียนโปรแกรมโดยการโยกสวิตชไฟฟาที่มีอยูจาํ นวนมากที่แผงวงจรไฟฟา เพื่อสลับไปมา ระหวางการปดและการเปด เพอ่ื ใหเ กดิ รหสั คาํ สั่ง 0 และ 1 โปรแกรมเมอรต อ งใชเ วลา ความรอบคอบ และความอดทนเปนอยางยิ่ง ตอ มาไดม กี ารคดิ คน พฒั นาวธิ กี ารเขยี นโปรแกรมใหส ะดวกและรวดเรว็ ขน้ึ จึงทาํ ใหเกิดภาษาระดับตาํ่ ขึ้น คือ ภาษาแอสเซมบลี้ (Assembly) และในเวลาตอมาก็เกิดภาษาระดับสูง ภาษาแรกขึ้นคือ ฟอรแทน (Fortran) ภาษาระดับสูง หมายถึงภาษาที่มีการกาํ หนดชนดิ ขอ มลู มีการควบคุมลาํ ดับการทาํ งานอยางเปน ระบบ เขียนรหัสดวยภาษาอังกฤษ มีการใชคาํ และรูปแบบคาํ สั่ง ที่ใกลเคียงกับภาษาที่ใชในการสื่อสาร ทั่วไป ภาษาระดับสูงจึงทาํ ใหง านเขยี นโปรแกรมของโปรแกรมเมอรง า ยขน้ึ คนทั่วไปก็สามารถศึกษา วธิ ีการเขยี นโปรแกรมนไ้ี ด ปญหาที่เกิดขึ้นในสมัยนั้นคือ การเขียนโปรแกรมที่มีความซับซอนและมีความยาวมาก ภาษา คอมพวิ เตอรท ม่ี อี ยเู มอ่ื นํามาเขยี นโปรแกรมทําใหเกิดความสับสนและวกวน (spaghetti code) ซึ่งมีผล ทาํ ใหก ารตดิ ตามแกไขและปรบั ปรงุ โปรแกรมยงุ ยาก ใชเวลามากเกินไป เชน การเขยี นโปรแกรมดว ย ภาษา BASIC เปน ตน จึงทาํ ใหมีการคิดคนวิธีการแกปญหาดังกลาว ดว ยเหตนุ จ้ี งึ ทาํ ใหเกิดภาษา คอมพวิ เตอรท ใ่ี ชเ ทคนคิ การเขยี นทเ่ี รยี กวา Structured Programming โดยวธิ กี ารน้ี ผูเขียนจะสนใจวา โปรแกรมทาํ งานอะไรมากกวาการที่จะสนใจวาโปรแกรมนั้นทาํ งานอยางไร หมายถึงวาตองคาํ นึงถึง กอนวาในโปรแกรมมีการทํางานตางๆ อะไรบา ง มีการจดั แบงการทาํ งานของโปรแกรมเปน สว น ๆ ตาม ประเภทของงาน จึงทาํ ใหผูเขียนโปรแกรมสามารถแบงงานกันทาํ สามารถนํางานยอ ย ๆ ที่มีอยูแลวไป ใชใ นโปรแกรมอน่ื ๆ อีกโดยไมตอ งสรา งใหม เชน การเขยี นโปรแกรมดว ยภาษาระดบั สงู ตา ง ๆ ไดแก PASCAL, COBOL, TURBO, BASIC Cเปน ตน ในปจ จุบนั ถึงแมวาวิธีการของ Structure Programming จะเพิ่มประสิทธิภาพของการเขียน โปรแกรมไดด ขี น้ึ แตต ลอดเวลาทผ่ี า นมามกี ารพฒั นาขดี ความสามารถของฮารด แวรค อมพวิ เตอรอ ยา ง ไมม ขี อ จํากัด จึงทาํ ใหก ารเขยี นโปรแกรมหรอื ซอฟตแ วรต อ งมกี ารพฒั นาควบคไู ปดว ย ลักษณะของ โปรแกรมสมยั ปจ จบุ นั มีขนาดยาวมาก เปน ลา น ๆ บรรทดั มีความซับซอนยุงยาก ตอ งใชทมี งานนกั โปรแกรมเมอรใ นการพฒั นาซอฟตแ วรเ ปน จํานวนมาก จึงทาํ ใหม กี ารคดิ คน วธิ กี ารเขยี นโปรแกรมแบบ ใหม ที่มีประสิทธิภาพยิ่งขึ้น เหมาะกบั การพฒั นาซอฟตแ วรข นาดใหญ วิธีดังกลาวไดแก วิธีที่เรียกวา ! ศิริชยั นามบุรี การเขียนโปรแกรมแบบ OOP

! 143 การโปรแกรมแบบกาํ หนดวัตถุเปาหมาย หรอื โอโอพี OOP (Object Oriented Programming) ซึ่งผูเชี่ยว ชาญทางดา นโปรแกรมกลา ววา โปรแกรมทม่ี ขี นาดตง้ั แต 100,000 บรรทดั ขน้ึ ไป วธิ กี ารของ OOP จะ ชวยลดความซํา้ ซอนของโปรแกรมไดอยางมีประสิทธิภาพ ♦!ความหมายของ OOP OOP (Object Oriented Programming) เปน วธิ กี ารเขยี นโปรแกรมซง่ึ จดั ดาํ เนินการกับกลุม ของ ออบเจ็กต (Object) ทม่ี อี ยใู นโปรแกรม ออบเจ็กต เปนชนิดของขอมูลซึ่งประกอบไปดวยกลุมของ ขอ มูล(data) และกลุมของ ฟงกชัน(Function) โดยการใชขอมูลและฟงกชันเหลานี้ แตล ะออบเจก็ ตจ ะทาํ งาน 1 งานไดสมบูรณ (ท้งั นเ้ี น่อื งจากตวั ออบเจก็ ตเ องประกอบไปดว ยขอ มูลและฟง กชนั ) ออบเจ็กต เปนสมาชิกของ ตัวแปรคลาส (class variable) มีลักษณะเปนโมดูล (modularity) ซึ่ง ประกอบไปดวย ตัวแปร ชนดิ ตา ง ๆ ที่สัมพันธกัน และประกอบดวย ฟงกชัน ตา ง ๆ โดยท่ี คลาส (class) จะหอหุมขอมูลและฟงกชันรวมไวดวยกันมีลักษณะที่เรียกวา encapsulation ดงั นน้ั จงึ มคี วาม สะดวกในการใชงาน สามารถปองกันสวนอื่น ๆ ของโปรแกรมไมใ หเ ขา ถงึ ตวั แปรชนดิ โลคอลภายใน คลาสไดอยางดีเยี่ยม ดงั นน้ั การเขยี นโปรแกรมแบบ OOP คือ การสรา งและ/หรอื การเรยี กใชอ อบเจก็ ตใ หท าํ งาน ตามทเ่ี ราตอ งการ ในการเรยี กใชอ อบเจก็ ตน น้ั เราจะสนใจเฉพาะการทาํ งานของออบเจก็ ตเ็ ทา นน้ั ไม จําเปน ตอ งสนใจรายละเอยี ดภายในของออบเจก็ ตว า เปน อยา งไร การใชออบเจ็กตของโปรแกรมจะมีลักษณะคลายกับการใชสิ่งของในชีวิตประจาํ วนั ของเรา เชน การใชโ ทรทศั น เราสามารถใชไดโดยไมจาํ เปน ตอ งรวู า ภายในเครอ่ื งโทรทศั นม ี \"สวนประกอบ\" อะไร บาง และไมจําเปน ตอ งรวู า แตล ะสว นประกอบทาํ งานอยางไร เราจะรูเพียงแควิธีใช เชน วิธีเปด วิธี เปลี่ยนชอง วิธีปรับเสียง วิธีปรับสี วิธีตั้งเวลา วธิ ปี ด เครอ่ื ง เปน ตน ลักษณะของโปรแกรมแบบ OOP กม็ ลี ักษณะคลา ยกบั การใชโ ทรทศั นใ นชวี ติ ประจําวัน ซึ่งจะไดศึกษาถึงวิธีการสรางและวิธีการใช OOP ตอ ไป ♦ค! ุณสมบัติของ OOP ลักษณะของ OOP มีคุณสมบัติสาํ คัญ 3 ประการ ดงั น้ี 1. มีการรวมขอมูลเขากับฟงกชัน (encapsulation) เพอ่ื ใหเ ปน ขอ มลู ชนดิ ออบเจก็ ต โดย ออบเจก็ ตห นง่ึ จะมคี ณุ สมบตั เิ หมอื นสง่ิ ของอยา งหนง่ึ คอื มที ัง้ \"สวนประกอบ\" และ \"การทํางาน\" ซึ่ง สามารถใชงานไดทันที จะไดกลาวถึงรายละเอียดในหัวขอตอไป ! ศิริชยั นามบุรี การเขียนโปรแกรมแบบ OOP

! 144 2. มกี ารสืบทอด (inheritance) เปน คุณสมบัติตาง ๆ ของออบเจก็ ตห นง่ึ ซง่ึ เปน บรรพบรุ ษุ หรอื ตนตอ เรยี กวา แอนเซสเตอร (ancestor) และไดสืบทอดคุณสมบัติตาง ๆ ที่มีอยูใหกับ ออบเจก็ ตท เ่ี ปน ลกู หลานหรอื ผสู บื ทอด เรยี กวา ดีเซนแด็นต (descendant) ไดห ลายออบเจก็ ต ทาํ ใหเกิด ความสัมพันธเกี่ยวโยงเปนลาํ ดับชั้น จะไดกลาวถึงรายละเอียดในหัวขอตอไป 3. มหี ลายรปู แบบ (polymorphism) คอื คณุ สมบตั ทิ เ่ี มอ่ื ออบเจก็ ตต า งๆ ไดร บั คาํ สั่งเดียวกัน จากโปรแกรมแลว แตล ะออบเจก็ ตจ ะทาํ งานตามแบบของตวั เอง ซึ่งทาํ ใหไดผลลัพธแตกตางกัน คุณ สมบัตินี้จะกลาวในหัวขอตอ ๆ ไป ♦ค! วามหมายของออปเจก็ ต (Object) Object หมายถึง สง่ิ ของหรอื วตั ถเุ ปา หมาย การเขยี นโปรแกรมแบบ OOP นน้ั หมายถึง กลุมขอ มูล(data) และกลุมหนาที่การทาํ งาน (function) ทถ่ี กู รวมเปน หนง่ึ หนว ย เราเรยี กวา Object สามารถสรุปไดวา Object เปน การนําเอาขอมูลและฟงกชันรวมไวดวยกัน ดังภาพ ! Code ของ ! ! Function ! Data ! Object หรือแสดงลักษณะของ Object และสวนประกอบคือ กลุมของฟงกชันและขอมูล ไดดงั ภาพ Data ! Object ! Function Data ! Function Data ! Function ลักษณะของออปเจ็กตดังกลาว เปนลักษณะของการรวมเอาขอมูลและฟงกชันไวในหนวยเดียว กัน เรยี กวา เอนทติ ี (Entity) เดย่ี ว ๆ ซึ่งเปนแนวคิดสาํ คญั ของการเขยี นโปรแกรมแบบ OOP การสรางออปเจ็กตตองสรางจากขอมูลชนิดที่เรียกวา คลาส (class) ดังจะไดศึกษาในหัวขอตอ ไป ! ศิริชยั นามบุรี การเขียนโปรแกรมแบบ OOP

! 145 ♦!วธิ สี รา งคลาส (class) ตนกําเนดิ ของออปเจก็ ต ออบเจ็กต (object) ตอ งสรา งขึ้นจากขอ มูลชนดิ คลาส (class) รูปแบบของขอมูลชนิดคลาส มี ลกั ษณะโครงสรา ง ดงั น้ี คลาส ! ขอมูล ! data1 ! data2 ! data3 ฟงกชัน ! function1() ! function2() ! function3() รูปแบบของการสรางขอมูลชนิด คลาส (class) เปน ดงั น้ี class ชอ่ื คลาส { private: หรือ public: หรือ protected: ดาตาเมมเบอร; ดาตาเมมเบอร; ดาตาเมมเบอร; private: หรือ public: หรือ protected: เมมเบอรฟงกชัน; เมมเบอรฟงกชัน; เมมเบอรฟงกชัน; }; ! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

! 146 คลาส (class) เปน ขอ มลู แบบสตรกั เจอร(strucuture) ซึ่งประกอบไปดวยสมาชิกที่เรียกวา คลาสเมมเบอร (class member) หรือสมาชิกของคลาส ซึ่งมีสมาชิกอยู 2 ประเภท คือ 1. ดาตาเมมเบอร(data member) หรอื กลุมขอมูลที่เปนสมาชิกของคลาส ซง่ึ อาจเรยี กอยา งอน่ื ได เชน member variable, data item เปน ตน 2. เมมเบอรฟงกชัน (member functions) หรือกลุมของฟงกชันที่เปนสมาชิกของคลาส อาจ เรยี กชอ่ื เปน อยา งอน่ื ได เชน Method, Behavior จากรูปแบบสวนประกอบของคลาส มีความหมายดังนี้ - class ชื่อคลาส คาํ วา class เปน คยี เ วริ ด (keyword)ที่ตองพิมพไวเพื่อกาํ หนดใหเ ปน ขอ มลู ชนดิ class เพอ่ื เรม่ิ ตน สรา งแหลง กาํ เนิดของออปเจ็กต( object) ทจ่ี ะใชใ นโปรแกรม สวน ชื่อคลาส ตง้ั ตามกฎเกณฑก ารตง้ั ชอ่ื ของ C++ เพอ่ื นําไวใชอางอิงใน การสรางออปเจ็กต ในโปรแกรมตอ ไป สวนรายละเอยี ดอื่น ๆ ของคลาสกาํ หนดไวใ นเครอ่ื งหมาย { ….. }; - private: หรอื public: หรอื protected: เปน คยี เ วริ ด (keyword) ตองพิมพเพื่อกาํ หนด คณุ สมบตั ขิ องดาตา เมมเบอรแ ละเมมเบอรฟ ง กช นั มีความหมายดังนี้ private: หมายถึง ชอ่ื ของดาตา เมมเบอรแ ละเมมเบอรฟ ง กช นั นน้ั จะเรียกใชได เฉพาะภายในคลาสนี้เทานั้น public: หมายถึง ชอ่ื ของดาตา เมมเบอรแ ละเมมเบอรฟ ง กช นั นน้ั จะเรียกใชได ภายในคลาสนี้และจากภายนอกคลาสได protected: หมายถึง ชอ่ื ของดาตา เมมเบอรแ ละเมมเบอรฟ ง กช นั นน้ั จะเรียกใชได เฉพาะภายในคลาส และใน คลาสที่สืบทอดตอ ๆ กันไป เทา นน้ั •! ตัวอยางการสรางคลาสชื่อ Date อยางงาย ๆ มีดังตอไปนี้ class Date //class name { private: // use only in this class int Year; //ดาตา เมมเบอร int Month; //ดาตา เมมเบอร int Day; //ดาตา เมมเบอร public: //use internal and external from another class void SetDate(int Y, int M, int D); //เมมเบอรฟ ง กช นั void Display(); //เมมเบอรฟ ง กช นั }; ! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

! 147 จากตัวอยางการกาํ หนดคลาสนี้ ชื่อคลาสคือ Date ประกอบไปดว ยดาตา เมมเบอรท เ่ี รยี ก ใชไดเฉพาะในคลาสนี้เทานั้น 3 ตวั คือ Year, Month, Day และในคลาสประกอบไปดวยฟงกชันเมม เบอร ที่สามารถเรียกใชไดทั้งภายในและภายนอกของคลาส (เพราะกําหนดไวดว ยคาํ วา public) อกี 2 ฟงกชัน คือ SetDate() และ Display() ซึ่งรายละเอียดการเขียน code ของทง้ั 2 ฟงกชันจะไดศึกษาใน ตวั อยา งตอ ไป รปู แบบของการสรา ง เมมเบอรฟงกชัน มวี ธิ กี ารเขยี นเหมอื นกบั ฟง กช นั ปกตขิ อง C++ ท่ี ไมไดเปนสมาชิกของคลาส ดังที่ไดศึกษามาแลว แตมีรูปแบบที่แตกตางกันบาง ดังนี้ รปู แบบท่ี 1 กําหนดรายละเอยี ดของเมมเบอรฟ ง กช นั ตอ จากฟง กช นั main() จะตอ งเขยี น ชื่อคลาส ใชเครื่องหมายแบงแยกขอบเขต :: (scope resolution operator) ตามหลังชื่อคลาส เชอ่ื มกบั ชอ่ื เมมเบอรฟ ง กช นั เพื่อบอกวาเปนสมาชิกของคลาสนั้น เชน class Date สรา งคลาสชอ่ื Date กอ นเพอ่ื นําไปสรา ง Object { private: // use only in this class int Year; //ดาตา เมมเบอร int Month; //ดาตา เมมเบอร int Day; //ดาตา เมมเบอร public: //use internal and external of this class void SetDate(int Y, int M, int D); //เมมเบอรฟ ง กช นั void Display(); //เมมเบอรฟ ง กช นั }; void main() { สเตตเมนตใ นโปรแกรม; สเตตเมนตใ นโปรแกรม; } ! ศิริชยั นามบุรี การเขียนโปรแกรมแบบ OOP

! 148 void Date::SetDate(int Y, int M, int D); //เมมเบอรฟง กช นั ของคลาส Date { สรา ง member function ชื่อ SetDate สเตตเมนตใ นฟง กช นั ; เปนสมาชิกของคลาส Date โดยกําหนด สเตตเมนตใ นฟง กช นั ; ดว ยเครอ่ื งหมาย :: } void Date:: Display() //เมมเบอรฟง กชันของคลาส Date { สรา ง member function ชื่อ Display() สเตตเมนตใ นฟง กช นั ; เปนสมาชิกของคลาส Date โดยกําหนด สเตตเมนตใ นฟง กช นั ; ดว ยเครอ่ื งหมาย :: } รปู แบบท่ี 2 กําหนดรายละเอยี ดของเมมเบอรฟงกช นั กอนฟง กชนั main และอยูภายนอกคลาส จะตองเขียนชื่อคลาสใชเครื่องหมายแบงแยกขอบเขต :: (scope resolution operator) ตามหลังชื่อคลาส เชอ่ื มกบั ชอ่ื เมมเบอรฟ ง กช นั เพื่อบอกวาเปนสมาชิกของคลาสนั้น class Date { private: // use only in this class int Year; //ดาตา เมมเบอร int Month; //ดาตา เมมเบอร int Day; //ดาตา เมมเบอร public: //use internal and external of this class void SetDate(int Y, int M, int D); //เมมเบอรฟ ง กช นั void Display(); //เมมเบอรฟ ง กช นั }; void Date::SetDate(int Y, int M, int D); //เมมเบอรฟ งกช ันของคลาส Date { สรา ง member function ชื่อ SetDate() สเตตเมนตใ นฟง กช นั ; เปนสมาชิกของคลาส Date โดยกําหนด สเตตเมนตใ นฟง กช นั ; ดว ยเครอ่ื งหมาย :: } ! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook