! 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
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197