บทที2 แนวคิด ทฤษฎีและงานวิจัยทีเกยีวข้อง · บทที2 แนวคิด ทฤษฎีและงานวิจัยทีเกยีวข้อง
บทที 1 ร้จักกับการเขียนโปรแกรม ู ·...
Transcript of บทที 1 ร้จักกับการเขียนโปรแกรม ู ·...
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
1
บทท� 1 รจกกบการเขยนโปรแกรม
การเขยนโปรแกรมคอมพวเตอร คอการเขยนชดคาส(งเพ(อใหคอมพวเตอรทางานตามตองการ ซ(งชดคาส(งสาหรบใหคอมพวเตอรทางานมมากมายหลายแบบ แตชดคาส(งท(คอมพวเตอรเขาใจไดคอภาษาเคร(อง (machine code) แตเน(องจากวาการเขยนชดคาส(งโดยใชภาษาเคร(องน;นมความยงยาก จงไดเกดชดคาส(งใหมๆข;นอกมากมาย เชน ภาษาแอสเซมบล ภาษาซ ภาษาปาสคาล ภาษาเบสก ภาษาซพลสพลส ภาษาจาวา ฯลฯ โดยท(แตละภาษากจะมความซบซอนและรปแบบการเขยนท(แตกตางกนไป ซ(งภาษาเหลาน; จะตองมตวแปรภาษา หรอเรยกวาคอมไพเลอร หรอ อนเตอพรเตอร (compiler or interpreter) ตางๆกนไป ท(คอยทาหนาท(แปลชดคาส(งท(เขยนเพ(อใหเปนภาษาเคร(องใหคอมพวเตอรสามารถเขาใจไดและทางานไดตามความตองการ นอกจากภาษาสาหรบเขยนโปรแกรม ตวแปรภาษาแลว ยงมเคร�องมอสาหรบใชเขยนโปรแกรม หรอเรยกวา Editor ปจจบนมหลายๆบรษทสราง editor ท(รองรบการเขยนชดคาส(งของภาษาตางๆมากมายโดยท( editor เหลาน;กจะรวมเอาตวแปรภาษาของภาษาน;นๆเขาไปดวย ทาใหการเขยนโปรแกรมเกดความสะดวกย(งข;น เพยงม editor ท(รองรบตวแปรภาษาท(ตองการเขยนเพยงอยางเดยว กสามารถทาใหเขยนโปรแกรมไดแลว จากขอมลขางตนสามารถสรปตวอยางเพ(อความเขาใจไดดงตาราง
ช�อภาษา ตวแปรภาษา ตวอยางโปรแกรม editor ภาษาซ ภาษาซ Turbo C ,Borland C++, Visual
C++, Visual Studio.net 2005 ภาษาซพลสพลส ภาษาซพลสพลส Turbo C++,Borland C++,Visual
C++ , Visual Studio.net 2005 ภาษาจาวา ภาษาจาวา JCreator,Netbeans,Eclipse ภาษาปาสคาล ภาษาปาสคาล Turbo Pascal
รปแบบการเขยนโปรแกรม (Programming Paradigm)
รปแบบการเขยนโปรแกรมน;นมหลากหลายรปแบบ ซ(งแตละรปแบบมคณสมบตและจดเดนแตกตางกนไปในท(น; จะยกตวอยางเพยงบางสวนเพ(อประกอบความเขาใจในการเรยน
1. การเขยนโปรแกรมแบบมข2นตอน (procedural programming) มคณสมบตพเศษคอ - สามารถใชโคดเดม ในตาแหนงอ(นๆของโปรแกรมได โดยไมตองคดลอกโคดน;นซ;าอกคร; ง - สามารถแบงโคดเขยนแยกเปนสวนๆแลวนามารวมกนได - มวธการเขยนโคดสาหรบการเขยนชดคาส(งสาหรบใหโปรแกรมยายไปทางานในจดตางๆไดงายกวาการ
ใชคาส(ง GOTO หรอ JUMP ตวอยางภาษาท(ใชรปแบบการเขยนแบบน; ไดแก Ruby , PHP , Perl , Python ,C , C++ , JAVA
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
2
2. การเขยนโปรแกรมเชงวตถ (object or iented programming) มคณสมบตพเศษคอ - ออกแบบโปรแกรมในรปแบบของวตถ - สามารถมการถายทอดคณสมบตระหวางวตถได - สามารถแบงโคดเขยนแยกเปนสวนๆแลวนามารวมกนได - สามารถเขยนโคดทบสวนของการกระทาของวตถท�ไดรบการถายทอดมาได - สามารถกาหนดใหบางคณสมบตของโปรแกรมไมสามารถแกไขเปล�ยนแปลงได ตวอยางภาษาท(ใชรปแบบการเขยนแบบน; ไดแก Ruby , PHP , Perl , Python , C++ , JAVA
ซ( งภาษาโปรแกรมท(พฒนาข;นในปจจบนน; สวนมากมรปแบบภาษาท(รองรบการเขยนโปรแกรมเชงวตถ แตทวาการเขยนโปรแกรมเชงวตถน;น วธการเขยนสวนหน(งมพ;นฐานมาจากรปแบบการเขยนโปรแกรมแบบมข;นตอนรวมอยดวย ดงน;นในการเขยนโปรแกรมเบ;องตน ผเรยนควรทาความเขาใจรปแบบการเขยนโปรแกรมแบบมข;นตอนอยางละเอยดกอนการเรยนการเขยนโปรแกรมเชงวตถตอไป
สาหรบเน;อหาตอไปน;จะมงเนนการทาความเขาใจในรปแบบการเขยนโปรแกรมแบบมข;นตอนและการออกแบบโปรแกรมมากกวาท(จะมงเนนภาษาใดเปนสาคญ เน(องจากการใชภาษาในการเขยนโปรแกรมน;นเปนเพยงการเลอกเคร(องมอสาหรบใชงานเทาน;น เม(อผเรยนสามารถเขาใจวธการเขยนโปรแกรม และหลกการในการออกแบบโปรแกรมแลว ไมวาจะเลอกใชภาษาใดในการเขยนโปรแกรมกจะไมเปนเร(องยากอกตอไป เพราะจะแตกตางกนตรงท(รปแบบของชดคาส(งเทาน;น แตวธการหลกๆยงคงอยบนพ;นฐานเดยวกน แตเน(องจากตองมการยกตวอยางประกอบความเขาใจและเพ(อฝกฝนการเรยนร เน;อหาในเอกสารเลมน; จงองกบภาษาซพลสพลส เน(องจากภาษาซพลสพลสเปนภาษาท(ไดรบความนยม อกท;งยงรองรบรปแบบการเขยนท;งสองรปแบบ ลกษณะชดคาส(งไมซบซอนเกนไปนก เหมาะแกการเรยนรสาหรบผเร(มตนเปนอยางย(ง
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
3
บทท� 2 รจกกบภาษาซพลสพลส
ภาษาซพลสพลส (C++ programming language) คอภาษาเขยนโปรแกรมท(สามารถจดหมวดหมใหอยในภาษาระดบสงและระดบต(าได และมรปแบบการเขยนโปรแกรมรวมอยหลากหลายรปแบบ ท;งรปแบบการเขยนโปรแกรมแบบมข;นตอน การเขยนโปรแกรมเชงวตถ และการเขยนโปรแกรมโดยท(วไป (Generic programming) ดงน;นภาษาซพลสพลสจงจดใหเปนหมวดหมภาษาระดบกลาง ซ( งภาษาซพลสพลสน;นถกสรางโดย Dr. Bjarne Stroustrup ท(หองแลปเบลล (Bell Labs) ในป ค.ศ. 1979 โดยอางองพ;นฐานมาจากภาษาซ และเพ(มคณสมบตใหมๆใหภาษาซพลสพลสมความแตกตางและมความสามารถมากย(งข;น
คณลกษณะสาคญของภาษาซพลสพลสท�ควรร
1. เฉพาะ ฟงกชนหลก(main function) เทาน;นท(ถกทางานเปนอนดบแรกเสมอในโปรแกรม 2. ลกษณะการทางาน โปรแกรมเร(มทางานต;งแตชดคาส(งบรรทดแรกในฟงกชนหลกและ
เรยงลาดบตามชดคาส(งไปจนจบ 3. เม(อเจอช(อฟงกชนใดๆในฟงกชนหลก คอมไพเลอรกจะกระโดดไปทางานท(ฟงกชนช(อน;นๆ
และเม(อทางานเสรจ กจะกลบมายงตาแหนงกอนหนาท(จะไป 4. ไฟลโคดของโปรแกรม นามสกล .cpp 5. เม(อทาการแปลชดคาส(งแลวจะได ไฟลนามสกล .obj 6. เม(อทาการรนโปรแกรมแลวจะไดไฟลนามสกล .exe ซ(งไฟลนามสกล .exe คอผลลพธของ
โปรแกรมสาหรบนาไปใชงานตอไป
ตวอยางแสดงคณสมบตขางตน
code void functionA() { cout<<” A”; } int main() { cout<<”1 “<<endl; cout<<”2 “<<endl; return 0; }
output 1 2
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
4
จะเหนวาตวอยางแรก ฟงกชน functionA ไมไดถกทางาน เพราะท(ฟงกชนหลกไมไดมชดคาส(งใหฟงกชน functionA ทางาน แตในตวอยางท(สอง ฟงกชน functionA จะทางาน เพราะฟงกชนหลกมการส(งใหฟงกชน funcitonA ทางานดวยการเขยนช(อฟงกชนไวท(ฟงกชนหลก และการทางานของคอมไพเลอรจะเรยงลาดบต;งแตบรรทดแรกในฟงกชนหลกทละบรรทด เม(อพบวามการเรยกใชฟงกชนอ(นๆใหทางาน กจะทางานท(ฟงกชนน;นๆ และกลบมาทางานตอยงบรรทดตอมาจนกระท(งจบชดคาส(งท;งหมดในฟงกชนหลก
code void functionA() { cout<<” A”; } int main() { cout<<”1 “<<endl; A(); cout<<”2 “<<endl; return 0; }
output 1 A2
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
5
บทท� 3 เร�มตนเรยนรภาษาซพลสพลส
1. ส�งท�ควรร การเขยนโปรแกรมในภาษาซพลสพลส เม(อจบหน(งชดคาส(งจะตองลงทายดวยเคร(องหมาย ; เสมอ โคดโปรแกรมจะถกคอมไพเลอรแปลคาส(งเพ(อไปทางานเสมอ แตโคดสวนท(อยภายในเคร(องหมาย คอมเมนท(comment)จะไมถกนาไปคอมไพล ดงน;นนกเขยนโปรแกรมนยมเขยนคอมเมนทไวเพ(อเตอนความจา ฯลฯ ซ(งวธการเขยนคอมเมนทม 2 รปแบบ ดงน;
1.2.1 ใชเคร(องหมาย // ตามดวยขอความ หน(งบรรทด รปแบบน;สามารถคอมเมนทไดเพยงบรรทดเดยว 1.2.2 ใชเคร(องหมาย /* ตามดวยขอความท(ตองการคอมเมนท แลวตามดวยเคร(องหมาย */ รปแบบน;สามารถคอมเมนทไดหลายบรรทด ซ(งขอความท(อยภายในเคร(องหมาย /* */ จะไมถกแปล
การเขยนโปรแกรมในภาษาซพลสพลส จะตองมการบอกขอบเขตของชดคาส(งเสมอ ซ(งขอบเขตของแตละชดคาส(ง จะอยในเคร(องหมาย { }
2. ชนดขอมล ภาษาซพลสพลสมชนดขอมลพ;นฐานหลายชนดดงน;
ช�อเรยก คณสมบต ขนาด ขนาดความจในการเกบขอมล
char ตวอกษรหน(งตว หรอ เลขจานวนเตมขนาดนอยๆ 1byte signed: -128 to 127 unsigned: 0 to 255
short int (short)
เลขจานวนเตมขนาดเลก 2bytes signed: -32768 to 32767 unsigned: 0 to 65535
int เลขจานวนเตม 4bytes signed: -2147483648 to 2147483647 unsigned: 0 to 4294967295
long int (long) เลขจานวนเตมขนาดยาวๆ 4bytes signed: -2147483648 to 2147483647 unsigned: 0 to 4294967295
bool คาตรรกศาสตรเปนไดแคสองอยาง คอ true หรอfalse
1byte true or false
float เลขทศนยม 4bytes 3.4e +/- 38 (7 digits)
double เลขทศนยมขนาดมากกวา float 8bytes 1.7e +/- 308 (15 digits)
long double เลขทศนยมขนาดความละเอยดมากกวา 8bytes 1.7e +/- 308 (15 digits)
wchar_t ตวอกษรขนาดใหญ 2bytes 1 ตวอกษรขนาดใหญ
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
6
3. ตวแปร การประกาศตวแปรแตละคร; ง จะมการจองเน;อท(หนวยความจา เพ(อใชสาหรบบนทกคาตางๆ ซ(งจะจองดวยขนาดเทาไหรน;นข;นอยกบชนดขอมลของตวแปรน;นๆ 3.1 การต2งช�อตวแปร ตองข;นตนดวยตวอกษร หรอเคร(องหมาย _ เทาน;น แลวตามดวย ตวอกษร หรอ ตวเลข หรอเคร(องหมาย _ โดยไมสามารถเวนชองวางระหวางตวแปรหน(งช(อได และไมสามารถมเคร(องหมาย _ มากกวา 1 ตวได (ท;งน;ข;นอยกบแตละคอมไพเลอร) 3.2 วธการประกาศตวแปร
ถาตวแปรหลายๆตวมชนดขอมลเดยวกนสามารถประกาศในชดคาส(งเดยวกนได โดยใชเคร(องหมาย , ค(นระหวางแตละตวแปร เชน int x , y ;
นอกจากจะประกาศตวแปรแลวยงกาหนดคาเร(มตนใหกบตวแปรดวยกได ดวยการเขยนเคร(องหมาย = แลวตามดวยคาท(กาหนดให เชน int x = 10; หรอ char y = ‘A’ , z = ‘B’ ; 3.3 รปแบบตวแปร ม2 รปแบบคอ 3.3.1 ตวแปรแบบสาธารณะ (global var iable ) ตวแปรชนดน;จะเปนท(รจกไปท(วท;งไฟล โคดโปรแกรม วธการประกาศตวแปรชนดน;จะตองประกาศไวท(ตนไฟลโคดโปรแกรม กอนท(จะถกเอามาเรยกใชเทาน;น 3.3.2 ตวแปรแบบทองถ�น (local var iable ) ตวแปรชนดน;จะเปนท(รจกเฉพาะในขอบเขตของ { } ท(ตวแปรถกประกาศไวเทาน;น วธการประกาศตวแปรชนดน; ประกาศไวในฟงกชนท(ใชงานเทาน;น ตวอยาง การประกาศตวแปรแบบ global var iable
int x ; void functionA() { cout<<” A”; } int main() { cout<<” x= “<<x<<endl; return 0; }
ชนดขอมล ช�อตวแปร เชน int x ;
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
7
ตวอยาง การประกาศตวแปรแบบ local var iable 4. ฟงกชน ในภาษาซพลสพลส ฟงกชนท(ถกทางานคอ ฟงกชนหลก ซ(งจะตองต;งช(อฟงกชนน; วา main เทาน;น เพราะฉะน;นการสรางฟงกชนอ(นๆมขอกาหนดดงน; โครงสรางการเขยนฟงกชน มดงน2 หมายเหต ช(อของฟงกชนตองตดกนเปนคาๆเดยวเทาน;น ฟงกชนม สองชนดหลก คๆอ
ฟงกชนท�มการคนคา ฟงกชนท�ไมมการคนคา
ถาเขยนแบบท( 1.1 จะได int functionTest ( int x ) { return x; } จะพบวาถาเขยนแบบน; มการคนคา เพราะฉะน;นจะตองมคาวา return ซ( งจะตามดวยคาท(ตองการคนใหเพ(อเปนคาตอบของฟงกชนน;นๆ
void functionA(int x) { cout<<” x = ”<<x<<endl; } int main() { คอมไพเลอรไมรจก x เขยนแบบน;ไมได cout<<” x= “<<x<<endl; return 0; }
void functionA(int x) { cout<<” x = ”<<x<<endl; } int main() { int x=10; cout<<” x= “<<x<<endl; return 0; }
x ในฟงกชน main เปนคนละตวกบใน functionA จะไมรจกกน เพราะฉะน;นคากไมเทากนดวย
ชนดขอมลของ output ช�อฟงกชน ( ชนดขอมลของ input ) { }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
8
ถาเขยนแบบท( 1.2 จะได void functionTest () { } จะพบวาถาเขยนแบบน; ไมมการคนคา เพราะฉะน;นไมตองมคาวา return และชนดขอมลของ output จะตองเปนคาวา void เทาน;น 5. การแสดงผลทางหนาจอกบการรบคาทางคยบอรด ชดคาส�งท�ใชในการแสดงผลทางหนาจอคอ ช�อ object ช�อ cout สวนคาส�งท�ทาการแสดงคา คอ << เพราะฉะน;น จะเขยนไดวา cout<< “ ขอความ” ; การ ใช << หน(งคร; งคอการส(งใหแสดงผลทางหนาจอหน(งขอมล เพราะฉะน;นถาขอมลคนละชนดกนตองใชคนละ << เชน cout<<” ขอความ ” << 1.0<<endl; และคาส(งท(ใชข;นบรรทดใหมคอ endl หรอ “\n” ชดคาส�งท�ใชในการรบคาขอมลจากทางคยบอรดคอ ช�อ object ช�อ cin สวนคาส�งท�ทาการแสดงคา คอ >> เพราะฉะน;นจะเขยนไดวา cin>> ช(อตวแปรท(จะเกบคาขอมล การใช >> หน(งคร; งคอการเกบคาขอมลลงในตวแปรหน(งคร; ง ถามการเกบหลายคร; งกใชคนละ >> เชน cin>> x>>y; ขอควรจา คาส(ง cin , cout อยใน library ( ท(เกบรวบรวมคาส(งท(มอยแลวในภาษาซพลสพลส ) ท(ช(อวา iostream ดงน;นจาเปนตองระบช(อ library ลงไปในโคดโปรแกรมทกคร; งท(มการใช cin,cout การระบช(อ library ใชคาวา #include< ช(อ library > เชน #include<iostream>
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
9
บทท� 4 เร�มตนออกแบบโปรแกรม
ในการออกแบบโปรแกรม เปรยบไดเหมอนกนกบการแกโจทยคณตศาสตร เพราะฉะน;นตองรกอนวา 1. โจทยตองการใหหาอะไร 2. ตองใสอะไรเขาไปในโจทย 3. อะไรคอคาตอบของโจทยขอน; การเขยนโปรแกรมสาหรบผท(เร(มตน ควรจะมลาดบการคดท(มประสทธภาพ การเขยนโปรแกรมจงจะเปนไดอยางงายดาย ดงน;นควรมลาดบการคดดงน; การคดข2นตอนท� 1 คดแบบกวางท�สดตามโจทยกาหนด สมมตวา โจทยใหเขยนโปรแกรมเปล(ยนอณหภมในหนวยองศาเซลเซยสไปเปนหนวยองศาเคลวน 1. จดประสงค (purpose) : เปล(ยนอณหภมในหนวยองศาเซลเซยสไปเปนหนวยองศาเคลวน 2. ขอมลท�ตองใชในโปรแกรม(input) : อณหภมในหนวยองศาเซลเซยส 3. คาตอบของโปรแกรม(output) : อณหภมในหนวยองศาเคลวน การคดข2นตอนท� 2 ระบความตองการของโจทยใหอยในขอบเขตของภาษาท�เขยน จาก สามส(งท(ไดวเคราะหไว กตองมาคดตามภาษาท(ใชเขยนวา ถาเขยนดวยภาษาน;นๆ จะตองมขอกาหนดกฎเกณฑอะไรบาง เพราะฉะน;นจากหลกการเขยนฟงกชนในภาษาซพลสพลส สามารถระบลงไปแตละสวนไดวา ช�อฟงกชน มาจาก จดประสงค (purpose) จะได C_to_K ชนดขอมลของ input มาจาก ขอมลท�ตองใชในโปรแกรม(input) : อณหภมในหนวยองศาเซลเซยส อณหภมกสามารถเปนทศนยมได กจะได double ชนดขอมลของ output มาจาก คาตอบของโปรแกรม(output) : อณหภมในหนวยองศาเคลวน อณหภมกสามารถเปนทศนยมได กจะได double เพราะฉะน;นจากข;นตอนท( 2 กจะได 4. โครงสรางฟงกชน (contract) : C_to_K double->double การคดข2นตอนท� 3 สมการท�ใชในโปรแกรม ตองคดวาสมการท(จะใชคออะไร และถาใส input เทาน; จะได output ออกมาเทาไหร จากความรเดมการเปล(ยนจาก องศาเซลเซยสไปเปนเคลวน กคอ องศาเคลวน = องศาเซลเซยส + 273 ดงน;นถาม input คอองศาเซลเซยสเทาน; จะได องศาเคลวนเทาไหร กจะได
ชนดขอมลของ output ช�อฟงกชน ( ชนดขอมลของ input ) { }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
10
5. ตวอยางโปรแกรม (example) : C_to_K(0) = 273.0 C_to_K(50.0) = 323.0 C_to_K(100.0) = 373.0 ทดลองทาสก 3-4 ตวอยางเพ(อท(จะไดแนใจในคาตอบของโปรแกรมเม(อเขยนเสรจทดลองวาโปรแกรมใหคาตอบถกหรอไมดวยการใส input เทากบตวอยางท(เราคดดวยตนเอง แลวดคาตอบวาตรงกนหรอไม การคดข2นตอนท� 4 ข2นตอนของโคดของโปรแกรมอยางละเอยด เราจะเขยนลาดบของการทางานของโปรแกรมอยางละเอยดโดยเขยนโดยคานงถงโครงสรางภาษาและขอจากดของภาษามากข;น เขยนออกมาในรปแบบของแผนผงอยางละเอยด จะได 6. แผนผงการทางานของโปรแกรม (flowchar t ) และข;นตอนสดทายคอการเขยนโคดโปรแกรมจรงๆ ซ(งกมสองสวนคอ สวนของฟงกชนท(เราออกแบบไว และสวนของฟงกชนเพ(อท(จะใหโปรแกรมทางานได 7. โคดของฟงกชน (function code ) double C_to_K (double degree ) { return 273.0+degree; } 8. โคดของฟงกชนหลก (main function code ) int main() // ตองต;งช(อฟงกชนวา main เทาน;น { int degree; cout<<” type number of celcius degree “; cin>>degree; cout<<” Kelvin degree = “<<C_to_K(degree)<<endl; return 0; // คนคา 0 เพ(อบอกวาจบโปรแกรมสมบรณ }
เร(ม จบ รบคาองศาเซลเซยส
องศาเซลเซยส + 273
C_To_K
Kelvin
การเรยกใชฟงกชนจะใชช(อฟงกชน และถาฟงกชนน;นๆม input กตองใสคา input ลงไป จะเปนคาขอมลโดยตรง หรอช(อตวแปรท(มชนดขอมลตรงกบท(ฟงกชนกาหนด โดยการใส input คาจะเรยงลาดบตาม input ในฟงกชนท(เขยนไว กรณฟงกชนท(ไมมการคนคา จะทาไดเรยกช(อฟงกชนเพ(อใหทางานเทาน;นเพราะไมมการคนคาใดๆกลบ
นอกจากcout เพ(อโชวคาตอบอาจเกบคาท(ไดจากฟงกชนลงในตวแปรกอนไดดงน; double result ; result = C_to_K(degree) ; แลว cout<<result;
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
11
สรปท2ง 8 ข2นตอนจะได Purpose เปล(ยนจากองศาเซลเซยสไปเปนองศาเคลวน Input องศาเซลเซยส Output องศาเคลวน Contract C_to_K : double->double Example C_to_K (0) = 273.0
C_to_K (50) = 323.0 C_to_K (100) = 373.0
Flowchart
Function code
double C_to_K (double degree ) {
return 273.0+degree; }
Main function code
int main() {
int degree; cout<<” type number of celcius degree “; cin>>degree; cout<<” Kelvin degree = “<<C_to_K(degree)<<endl; return 0;
} ซ( งในข;นตอนท;งหมดจะเปนเพยงแนวความคดของเราเทาน;น ดงน;นหากพมพลงไปในโปรแกรมกจะตองทาการใสคอมเมนทไวดวย เพ(อท(จะไดไมถกคอมไพล แตสวนท(จะเปนโคดท(จะคอมไพลจรงๆกคอข;นตอน 2 ข;นตอนสดทาย ดงน;นใน โคดของสองข;นตอนน; จะไมตองใสคอมเมนท ดงน;นโคดท;งหมดของโปรแกรมจะเปนดงรปตอไปน;
เร(ม จบ รบคาองศาเซลเซยส
องศาเซลเซยส + 273
C_To_K
Kelvin
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
12
ไฟล C_to_K.cpp
#include<iostream> /* Purpose เปล(ยนจากองศาเซลเซยสไปเปนองศาเคลวน Input องศาเซลเซยส Output องศาเคลวน Example C_to_K (0) = 273.0 C_to_K (50) = 323.0 C_to_K (100) = 373.0 Flowchart
เร(ม จบ รบคาองศาเซลเซยส
องศาเซลเซยส + 273
C_To_
K
Kelvi
n
*/ //Function code
double C_to_K (double degree ) { return 273.0+degree; }
//Main function code int main() { int degree; cout<<” type number of celcius degree “; cin>>degree; cout<<” Kelvin degree = “<<C_to_K(degree)<<endl; return 0; }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
13
บทท� 5 การเขยนโปรแกรมแบบซบซอน
ในโปรแกรมจรงๆท(เขยนข;นไมไดมเพยงฟงกชนเดยว ในหน(งไฟล .cpp อาจจะมก(ฟงกชนกได แตจะมฟงกชนท(ทางานเสมอ เพยงฟงกชนเดยวคอฟงกชนหลก ดงน;นในบทน; เราจะเรยนรวธการเขยนโปรแกรมท(มหลายๆฟงกชนถกเรยกใชงาน
หลกการคอใหจาไววา 1 ฟงกชน คอหน(งวตถประสงค เพราะฉะน;น การเขยนโปรแกรมออกแบบใหมก(ฟงกชน หรออาจจะไมมฟงชนเลยกตาม ข;นอยกบการออกแบบของผเขยนโปรแกรม
ถาสมมตใหโปรแกรมเมอรคอคนเขยนบทละคร แลวแตละฟงกชนกคอแตละตวละคร ซ(งมหนาท(ตางๆกนไป ละครหน(งเร(อง กอาจจะใชตวละครไมเทากนกได ถงแมวาตอนจบของละครจะเหมอนกน เพราะคนเขยนบทอาจจะใหตวละครคนหน(งทาหลายหนาท( อกคนอาจจะใหตวละครหน(งทาหนาท(เดยว จานวนตวละครท(ใชกอาจจะไมเทากน เหมอนกบโปรแกรม ในโปรแกรมท(มคาตอบเดยวกน กอาจจะมวธการเขยนออกมาไมเหมอนกนได ตวอยางสมมตให ฟงกชนหลกเปรยบเหมอน ผกากบท(เลนละครเร(องน;นดวย แตละฟงกชน คอ ตวละครแตละตวหนาท(ตางกน และโปรแกรมเมอรคอคนเขยนบท เขยนโปรแกรมการเปล�ยนจากองศาฟาเรนไฮนไปเปนองศาเคลวน บทละครท� 1 (ออกแบบแบบน2เพราะรวาสมการเปล�ยนองศาฟาเรนไฮน เปนเคลวน คออะไร) มตวละครหน(งตวคอ ผกากบ ทาหนาท(ทกอยาง ต;งแต 1. รบคา input องศาฟาเรนไฮน 2. คานวณเปล(ยนองศาฟาเรนไฮนไปเปนองศาเคลวน 3. แสดงผลคาตอบ บทละครท� 2 (ออกแบบแบบน2เพราะรวาสมการเปล�ยนองศาฟาเรนไฮน เปนเคลวน คออะไร) มตวละครสองตว ตวละคร 1 คอ ผกากบ ทาหนาท( 1. รบคา input องศาฟาเรนไฮน 2. ส(งใหตวละครสองเลน 3. แสดงผลคาตอบ ตวละคร 2 ทาหนาท( 1. คานวณเปล(ยนองศาฟาเรนไฮนไปเปนองศาเคลวน
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
14
บทละครท� 3 (ออกแบบแบบน2เพราะไมรวาสมการเปล�ยนองศาฟาเรนไฮน เปนเคลวน คออะไร แตรวาเปล�ยนจากองศาฟาเรนไฮนเปนองศาเซลเซยสคออะไร และ เปล�ยนจากองศาเซลเซยสเปนเคลวนคออะไร) มตวละครสามตว ตวละคร 1 คอ ผกากบ ทาหนาท( 1. รบคา input องศาฟาเรนไฮน 2. ส(งใหตวละครสองเลน 3. ส(งใหตวละครสามเลน 4. แสดงผลคาตอบ ตวละคร 2 ทาหนาท( 1. คานวณเปล(ยนองศาฟาเรนไฮนไปเปนองศาเซลเซยส ตวละคร 3 ทาหนาท( 1. คานวณเปล(ยนองศาเซลเซยสไปเปนองศาเคลวน ถาเขยนโปรแกรมตามแบบบทละครท2งสามแบบจะไดดงน2 บทละครท� 1 มตวละครเดยวคอผกากบ ดงน;นกจะมฟงกชนหลกอยางเดยว
Purpose เปล(ยนจากองศาองศาฟาเรนไฮนไปเปนองศาเคลวน Input องศาฟาเรนไฮน Output องศาเคลวน Contract F_to_K : double->double Example F_to_K (32.0) = 273.0
F_to_K (122.0) = 323.0 F_to_K (212.0) = 373.0
Flowchart
Function code
Main function code
int main() {
int degree; cout<<” type number of farenhite degree “; cin>>degree; cout<<” Kelvin degree = “<< 273.0+((degree-32.0)*5/9)<<endl; return 0;
}
เร(ม จบ รบคาองศาฟาเรนไฮน
273+องศา(ฟาเรนไฮน -32)*5/9
F_To_K
Kelvin
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
15
บทละครท� 2 มตวละคร 2 ตว Purpose เปล(ยนจากองศาองศาฟาเรนไฮนไปเปนองศาเคลวน Input องศาฟาเรนไฮน Output องศาเคลวน Contract F_to_K : double->double Example F_to_K (32.0) = 273.0
F_to_K (122.0) = 323.0 F_to_K (212.0) = 373.0
Flowchart
Function code
double F_to_K (double degree) { return 273.0+((degree-32.0)*5/9); }
Main function code
int main() {
int degree; cout<<” type number of farenhite degree “; cin>>degree; cout<<” Kelvin degree = “<<F_to_K(degree)<<endl; return 0;
}
เร(ม จบ รบคาองศาฟาเรนไฮน
273+องศา(ฟาเรนไฮน -32)*5/9
F_To_K
Kelvin
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
16
บทละครท� 3 มตวละครสามตว ออกแบบใหกบตวละครท� 2
Purpose เปล(ยนจากองศาฟาเรนไฮนไปเปนองศาเซลเซยส Input องศาฟาเรนไฮน Output องศาเซลเซยส Contract F_to_C : double->double Example F_to_C (32.0) = 0.0
F_to_C (122.0) = 50.0 F_to_C (212.0) = 100.0
Flowchart
Function code
double F_to_C (double degree) { return (degree-32.0)*5/9; }
ออกแบบใหกบตวละครท� 3
Purpose เปล(ยนจากองศาเซลเซยสไปเปนองศาเคลวน Input องศาเซลเซยส Output องศาเคลวน Contract C_to_K : double->double Example C_to_K (0) = 273.0
C_to_K (50) = 323.0 C_to_K (100) = 373.0
Flowchart
Function code
double C_to_K (double degree ) { return 273.0+degree;
}
เร(ม จบ รบคาองศาฟาเรนไฮน
องศา(ฟาเรนไฮน -32)*5/9
F_To_C
Celcius
เร(ม จบ รบคาองศาเซลเซยส
องศาเซลเซยส + 273
C_To_K
Kelvin
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
17
ออกแบบใหกบตวละครท� 1 คอผกากบ Purpose เปล(ยนจากองศาองศาฟาเรนไฮนไปเปนองศาเคลวน Input องศาฟาเรนไฮน Output องศาเคลวน Contract F_to_K : double->double Example F_to_K (32.0) = 273.0
F_to_K (122.0) = 323.0 F_to_K (212.0) = 373.0
Flowchart
Main function code
int main() {
int degree; cout<<” type number of farenhite degree “; cin>>degree; int toC=F_to_C(degree); cout<<” Kelvin degree = “<<C_to_K(toC)<<endl; return 0;
} แบบน; คอทาการเปล(ยนคาองศาฟาเรนไฮนเปนองศาเซลเซยสกอน เกบไวในตวแปร ช(อ toC และทาการเปล(ยนองศาเซลเซยสเปนองศาเคลวนอกทนง โดยท(ม input คอตวองศาเซลเซยสในตวแปรช(อ toC
เร(ม
จบ
รบคาองศาฟาเรนไฮน
องศาเซลเซยส =องศา(ฟาเรนไฮน -32)*5/9 F_To_C
Celcius
รบคาองศาเซลเซยส
องศาเคลวน =273+องศาเซลเซยส
C_To_K Kelvin
มาจากตวแปร toC
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
18
หรอ Purpose เปล(ยนจากองศาองศาฟาเรนไฮนไปเปนองศาเคลวน Input องศาฟาเรนไฮน Output องศาเคลวน Contract F_to_K : double->double Example F_to_K (32.0) = 273.0
F_to_K (122.0) = 323.0 F_to_K (212.0) = 373.0
Flowchart
Main function code
int main() {
int degree; cout<<” type number of farenhite degree “; cin>>degree; cout<<” Kelvin degree = “<<C_to_K(F_to_C(degree))<<endl; return 0;
} แบบน; คอทาการเปล(ยนคาองศาฟาเรนไฮนเปนองศาเซลเซยสกอน แตไมเกบคาตวแปร แตสงใหเปน input ของฟงกชนท( ทาการเปล(ยนองศาเซลเซยสเปนองศาเคลวนอกทนง สรป จะเหนวาโปรแกรมเดยวกน แตเขยนไดไมเหมอนกนข;นอยกบการออกแบบโปรแกรมของผเขยนโปรแกรมแตละคน สาหรบวธการออกแบบท(มการสรางหลายฟงกชนจดประสงคคอ
1. เพ(อใหงายตอการแกไขโปรแกรมในอนาคต 2. เพ(อเปนการนาเอาฟงกชนมาใชไดอก (Reuse) 3. เพ(อสะดวกตอการพฒนา โดยเฉพาะการพฒนาโปรแกรมท(มขนาดใหญ
เร(ม
จบ
รบคาองศาฟาเรนไฮน
องศาเซลเซยส =องศา(ฟาเรนไฮน -32)*5/9 F_To_C
Celcius
รบคาองศาเซลเซยส
องศาเคลวน =273+องศาเซลเซยส
C_To_K Kelvin
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
19
บทท� 6 การเขยนโปรแกรมแบบมเง�อนไข
จากบทเรยนกอนหนา คาตอบของโปรแกรมท(ไดมกจะเปนคาตอบท(มาจากสมการเดยวหรอมาจากรปแบบๆเดยว ซ(งในความเปนจรงแลว คาตอบของโปรแกรมท(ได อาจจะไมไดมาจากสมการเดยวกนหรอมาจากรปแบบเดยวกนกได เพราะฉะน;นเม(อคาตอบของโปรแกรมมาจากสมการหรอรปแบบท(มากกวา 1 รปแบบ ตองใชเทคนคการเขยนโปรแกรมแบบมเง(อนไข การเขยนโปรแกรมแบบมเง(อนไขจะเขามาชวยในการตดสนใจวา ถา input น; จะตองใชสมการน;หรอรปแบบคาตอบน; ถา input อกอนนงกใชอกรปแบบนง เร(มตน เราจะเรยนรการเขยนโปรแกรมแบบมเง�อนไขสาหรบคาตอบสองรปแบบกอน โครงสรางภาษาซพลสพลสท�ใชกคอ if( เง�อนไข ) { ส�งท�จะใหทา ฯลฯ }else { ส�งท�จะใหทา ฯลฯ } หมายเหตโจทยท(มกจะใชการเขยนโปรแกรมแบบมเง(อนไขคอ โจทยท(มกจะมคาวา หรอไม , ตรวจสอบ , แบงประเภท ฯลฯ
เคร�องหมายท�ใชกบการเปรยบเทยบเง�อนไขตาง มๆดงน2
= = เทากน
!= ไมเทากน
> มากกวา
< นอยกวา
> = มากกวาหรอเทากบ
< = นอยกวาหรอเทากบ
ความหมายกคอ ถา เปนอยางน; { จะใหทาอะไร } ถาไมใชกรณแรก แลว(พดงายๆกคอไมใชตามเง(อนไข) { จะใหทาอะไรอก }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
20
เคร�องหมายท�เก�ยวของกบประพจน และคาประพจน เคร�องหมาย && (AND)
a b a && b
true true true
true false false
false true false
false false false
เคร�องหมาย || (OR)
a b a || b
true true true
true false true
false true true
false false false
เคร�องหมาย ! (NOT)
a !a
true false
false true
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
21
Purpose ตรวจสอบวาตวเลขท(ไดรบเปนเลขจานวนเตมบวกหรอไม Input ตวเลข Output เปนจานวนเตมบวกหรอไม Contract isPositive int->bool Example isPositive (32) = true
isPositive (-5) = false isPositive (0) = false
Flowchart
Function code
bool isPositive (int number) { if(number>0) { return true; }else { return false; } }
Main function code
int main() { int number; cout<<"type a number for checking positive number "; cin>>number; cout<<"your number is positive ,right? "<<isPositive(number)<<endl; return 0; }
เร(ม
จบ
รบคาตวเลข
isPositive
ตวเลข>0 ?
เปนจานวนเตมบวก
ไมเปนจานวนเตมบวก
N
Y
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
22
หมายเหต การแสดงคาตอบจะออกมาในรป 0 กบ 1 เพราะ bool ใน C++ จะแสดง 0 หมายถง false และ 1 หมายถง true การเขยนโปรแกรมแบบมเง�อนไขสาหรบคาตอบหลายรปแบบ โครงสรางภาษาซพลสพลสท�ใชกคอ if( เง�อนไข ) { ส�งท�จะใหทา ฯลฯ }else if(เง�อนไข ) { ส�งท�จะใหทา ฯลฯ } else if(เง�อนไข ) { ส�งท�จะใหทา ฯลฯ } . . . else { ส�งท�จะใหทา ฯลฯ }
หมายเหต จานวนเง(อนไขกจะมจานวนเทากบรปแบบของคาตอบ
ความหมายกคอ ถา เปนอยางน; { จะใหทาอะไร } ถาไมใชกรณแรก แลว(พดงายๆกคอไมใชตามเง(อนไข) { จะใหทาอะไรอก } ถาไมใชกรณแรกและกรณท(สอง แลว(พดงายๆกคอไมใชตามเง(อนไขสองอนแรก) { จะใหทาอะไรอก } . . . ถาไมใชกรณทกกรณขางตน { จะใหทาอะไรอก }
เร(ม
จบ
รบคาเวลา ชม. , นาท , วนาท
checkHour
0 <= ชม< 24 ?
ถกตอง
ไมถกตอง
N
Y
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
23
Purpose ตรวจสอบวาตวเลขท(ไดรบเปนเลขจานวนเตมบวก จานวนเตมลบ หรอ จานวนเตมศนย Input ตวเลข Output จานวนเตมบวก หรอ จานวนเตมลบ หรอ จานวนเตมศนย Contract integerType int->char Example integerType (32) = +
integerType (-5) = - integerType (0) = 0
Flowchart
Function code
char integerType (int number) { if(number> 0) { return ‘+’; }else if (number < 0) { return ‘-‘; }else {
เร(ม
จบ
รบคาตวเลข
integerType
ตวเลข>0 ?
เปนจานวนเตมบวก N
Y
ตวเลข < 0 ?
เปนจานวนเตมลบ
เปนจานวนเตมศนย
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
24
return ‘0’; } }
Main function code
int main() { int number; cout<<"type a number for checking type of number "; cin>>number; cout<<"your number is "<<integerType(number)<<endl; return 0; }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
25
บทท� 7 การเขยนโปรแกรมแบบมการทาซ2า (Recursive programming)
ในการเขยนโปรแกรมนอกจากท(คอมไพลเลอรจะทางานโดยอานชดคาส(งเรยงตามบรรทดตามลาดบแลว ยง
สามารถใหคอมไพลเลอรวนอานซ;าในบางจดท(เรากาหนดไวได ซ(งการเขยนโปรแกรมแบบมการทาซ;าน;มกจะใชในกรณท(จะตองมการคานวณสมการน;นหลายๆคร; ง หรอเกดการทางานในรปแบบเดมหลายๆคร;ง ทาใหไมตองเขยนหลายบรรทด อยางเชนถาตองการเขยนเลข 1 ท;งหมด 5 บรรทด กอาจจะตองเขยนโคดดงน; ซ( งจะพบวามการทางานแบบเดมซ;าๆถง หาคร; ง หรอเชน ถาตองการบวกเลขต;งแต 1 ถง 5 กจะตองเขยนโคดดงน; ถาดลาดบการเปล(ยนแปลงของตวเลขกจะพบวา 1+2 = 1+ (1+1) +3 = +(2+1) หรอ = + (1+1+1) +4 = + (3+1) หรอ = +(1+1+1+1) +5 = + (4+1) หรอ = + (1+1+1+1+1) จะพบวาการบวกเลขตวตอมา คอเลขตวกอนหนาบวกอก 1 เพราะฉะน;นการทางานซ;ากจะเกดข;นกบการเปล(ยนแปลงท(เปล(ยนอยางเปนลาดบข;นตอน
int main() { cout<<” 1 “<<endl; cout<<” 1 “<<endl; cout<<” 1 “<<endl; cout<<” 1 “<<endl; cout<<” 1 “<<endl; return 0; }
int main() { cout << 1+2+3+4+ 5 <<endl; return 0; }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
26
สาหรบการเขยนโปรแกรมแบบมการทาซ;าท(เราจะเขยนกนคอ เขยนแบบ recursive กคอการวนซ;าใชงานฟงกชนตวเอง จนกวาจะหมดเง(อนไข สาหรบวธการคดมสองจดสาคญคอ
1. จะตองมจดจบของการทาซ;าวา เง(อนไขใดท(จะเปนตวกาหนดการจบรอบการทางานท;งหมด 2. จะตองมสมการท(จะถกทาซ;า
Purpose คานวณหาผลรวมของเลขจานวนเตมบวก ต;งแต 1 ถงเลขท(ตองการ Input ตวเลข Output ผลรวมของเลขจานวนเตมบวก ต;งแต 1 ถงเลขท(ตองการ Contract sumNumber int->int Example sumNumber (2) = 1+2=3
sumNumber (1) = 1 sumNumber (5) = 1+2+3+4+5 =15
Flowchart
Function code
int sumNumber (int number) { if(number >= 1) { return number + sumNumber(number - 1); }else { return 0 ; } }
เร(ม
จบ
รบคาตวเลข
sumNumber
ตวเลข>=1 ?
บวกเลขเพ(มไป
N
Y
ลดจานวนตวเลขลง 1
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
27
Main function code
int main() { int number; cout<<"type a number "; cin>>number; cout<<"sum of number is "<<sumNumber(number)<<endl; return 0; }
จะเหนวาตรงจดท(โปรแกรมจะจบ คาท( return คอ เลขตวเดยวไมมการเรยกใหฟงกชนน;นทางานซ;าอก
แตตางจากตรงจดท(ตองทาซ;า จะมการ return การบวกเลขตวน;นเขาไปเปนผลลพธ และเรยกใหฟงกชนทางานซ;าอกรอบ return คอการ return ไปยงจดกอนหนาท(จะมาตรงน; ดงน;นภาพการทางานของคอมไพเลอรในแตละรอบจะเปนดงน; สมมตวา input คอ 5 รอบท( 1 input = 5 return 5 + sumNumber(5 - 1); รอบท( 2 input = 4 return 4 + sumNumber(4 - 1); รอบท( 3 input = 3 return 3 + sumNumber(3 - 1); รอบท( 4 input = 2 return 2 + sumNumber(2 - 1); รอบท( 5 input = 1 return 1 + sumNumber(1 - 1); รอบท( 6 input = 0 return 0 ; คาตอบจะออกมากตอเม(อการบวกสมบรณ เพราะฉะน;นตองทาครบหกรอบกอนการบวกถงจะสมบรณไดเปน return 5 + sumNumber(5 - 1) รวมแลวกจะเปน 5+4+3+2+1+0 พอด หรออาจจะนบแบบเพ(มข;นกได เปน 1+2+3+4+5 โดยการเปล(ยนเง(อนไข
4 + sumNumber(4 - 1)
3 + sumNumber(3 - 1)
2 + sumNumber(2 - 1)
1 + sumNumber(1 - 1)
0
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
28
บทท� 8 การเขยนโปรแกรมแบบมการทาซ2า (Loop programming)
นอกจากท(เราใชการ recursive function เพ(อการทาซ;าแลว เราจะพบวา การใช recursive น; จะไมสามารถ
ประกาศตวแปรในฟงกชนเพ(อจาคาได เพราะวาทกคร; งท(มการเรยกใชฟงกชนอก กจะตอง reset คาตวแปรใหเปนคาด;งเดม ดงน;น มชดคาส(งประเภทหน(งท(ทาใหเกดการเขยนโปรแกรมแบบมการทาซ;าได ซ( งมท;งหมดสามโครงสรางดวยกน คอ
1. while 2. do while 3. for
โครงสราง while มดงน; while(เง�อนไข) { ส�งท�จะทาซ2า } ซ�งโครงสราง while จะทาซ2ากตอเม�อ เง�อนไขเปนจรง โครงสราง do while มดงน; do { ส�งท�จะทาซ2า } while(เง�อนไข) ; ซ�งโครงสราง do while จะทากอนหน�งรอบ และคอยเชคเงอนไขจะทาซ2ารอบใหมกตอเม�อ เง�อนไขเปนจรง โครงสราง for มดงน; for (คาเร�มตน ; เง�อนไข ; การเพ�ม/ลดจานวนรอบ) { ส�งท�จะทาซ2า } ซ�งโครงสราง for จะทาซ2ากตอเม�อ เง�อนไขเปนจรง
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
29
การเขยนโปรแกรมดวย 3 โครงสรางน;จะประกอบไปดวยสวนสาคญ 4 จดดวยกนคอ 1. กาหนดตวนบรอบเร(มตน (จะถกใชเพยงคร;งแรกคร; งเดยวเทาน;น) 2. เง(อนไขท(จะใชในการนบรอบ 3. ส(งท(จะทาซ;า (จะมก(บรรทดกได อยากใหอะไรซ;าบางกส(งๆไป) 4. การเพ(ม / ลด จานวนรอบ
ดงน;นถานาโครงสรางท;งสามมาเขยนจะพบวามโครงสรางเหมอนกน ดงน; สาหรบลาดบการทางานของคอมไพเลอร จะเปนดงน; Loop while กบ loop for จะมการทางานเหมอนกนคอ เรยงตามลาดบขอไดเลย อนดบแรก เร(มตนโดยกาหนดตวนบรอบกอนวาใหเร(มตนมคาเทาไหร อนดบสอง เชคเง(อนไขวาจรงหรอไม ถาเง(อนไขเปนจรง กจะทางานในส(งท(ทาซ;า สดทายกเพ(ม / ลดจานวนรอบ
สงเกตวา ใน loop while และ do while ตวเพ(มลดจานวนรอบอยใน { } ซ(งจะถกทาซ;าดวย จะมากอนหนา ขอ 3 คอส(งท(จะทาซ; ากไดหรอขางหลงกได ข;นอยกบจดประสงคของการเขยนโปรแกรม ไมเหมอนกบ loop for ท(จะกาหนดตายตวเลยวาตวเพ(มลดจานวนรอบจะถกทางานตอนสดทายของแตละรอบ
1. กาหนดตวนบรอบเร�มตน while(2. เง�อนไข) { 3. ส�งท�จะทาซ2า 4. เพ�ม/ลดจานวนรอบ }
1. กาหนดตวนบรอบเร�มตน do { 3. ส�งท�จะทาซ2า 4. เพ�ม/ลดจานวนรอบ } while(2. เง�อนไข);
for (1. กาหนดตวนบรอบ ;2. เง�อนไข ;4. เพ�ม/ลดจานวนรอบ ) { 3. ส�งท�จะทาซ2า }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
30
Purpose คานวณหาผลรวมของเลขจานวนเตมบวก ต;งแต 1 ถงเลขท(ตองการ Input ตวเลข Output ผลรวมของเลขจานวนเตมบวก ต;งแต 1 ถงเลขท(ตองการ Contract sumNumber int->int Example sumNumber (2) = 1+2=3
sumNumber (1) = 1 sumNumber (5) = 1+2+3+4+5 =15
Flowchart
Function code
int sumNumber (int number) { int round=1 , sum =0; while(round < = number) { sum = sum + round; ( บวกดวย round เพราะ round เปล(ยนคาจาก 1 ถง เลขท(กาหนดคอ number ) round=round+1; (หรอจะเขยน round ++ กมคาเทากน) } return sum; }
เร(ม
จบ
รบคาตวเลข
sumNumber
รอบ<= เลขท(ตองการ ?
sum=sum+ตวนบรอบ
N
Y
เพ(มคาตวนบรอบอก 1
กาหนดตวนบรอบ = 1 sum =ผลลพธ = 0
จดท( 1 จดท( 2
จดท( 3
จดท( 4
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
31
Main function code
int main() { int number; cout<<"type a number "; cin>>number; cout<<"sum of number is "<<sumNumber(number)<<endl; return 0; }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
32
บทท� 9 โครงสรางขอมลแบบ Ar ray
จากบทเรยนท(ผานมาเรารจกกบชนดขอมลแลว กคอแบงขอมลออกเปนประเภทตางๆ แตวาคาศพทใหมท(เราจะเรยนคอ โครงสรางขอมลน; ไมเหมอนกนกบชนดขอมล เพราะฉะน;นอยาสบสน โครงสรางขอมล คอแนวความคดท(จะจดรปแบบขอมลใหเปนแบบตางๆ ซ(งโครงสรางแบบ Array น; มแนวคดท(จะรวมเอาขอมลท(มชนดเดยวกน อยรวมกนเปนกลมภายใตตวแปรช(อเดยวกน แตเพ(มตวบอกตาแหนงเขามาเทาน;นเอง
ตวแปร ช(อหน(งจะเกบคาขอมลไดหน(งคา แตวาพอตวแปรตวน;นมโครงสรางเปน array แลวจะสามารถเกบขอมลไดหลายคา จะก(คากข;นอยกบวาตวแปรตวน;นมขนาดเทาไหร แตวาถงแมวาหน(งตวแปรเกบไดหลายคาแตกยงคงตองมตวบอกตาแหนงเพ(มข;นมาเพ(อท(จะบอกวา คาไหน อยตรงไหน ซ(งตวบอกตาแหนงน; จะมคาเร(มตนต;งแต 0 ถง N-1 เม(อให N คอขนาดตวแปรท(มโครงสรางเปน array อธบายดงรป
ตวแปร ช(อ X
จาก 0 -> N -1 เม(อ N = ขนาด อารเรย ซ( งตอนน; ขนาด N = 4 เพราะฉะน;นแสดงวาตวแปร X สามารถเกบขอมลได 4 คา
อารเรยหน�งมต 9.1 การประกาศตวแปรท�มโครงสรางเปนอาเรย ปกต การประกาศตวแปร ทาไดโดย ชนดขอมล ช(อตวแปร ; การประกาศใหเปนอารเรย กแคเพ(ม สญญลกษณ [ ] ซ( งขางในวงเลบคอขนาดอารเรยน(นเอง จะได ชนดขอมล ช�อตวแปร [ ขนาดอารเรย ] ; เชน int x[4] ; char y [10]; หรออาจจะประกาศตวแปรและกาหนดคาใหเลยกไดทาไดโดย ชนดขอมล ช�อตวแปร [ ขนาดอารเรย ] = { คาของขอมลเรยงตามลาดบของตาแหนงในอาเรย } ; เชน int x[4] = {1,2,3,4};
ตาแหนง 0 ตาแหนง 1 ตาแหนง 2 ตาแหนง 3
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
33
9.2 การเขาถงคาขอมลในตวแปรอารเรย ถาตวแปรปกต กใช ช(อตวแปร แลวจะกาหนดคาใหหรอนาคาแสดงมาด กตามแต แตพอเปนตวแปรแบบอารเรย กเพ(มตาแหนงท(ตองการเขาไป เชน กาหนดคาใหกบตวแปรอารเรย int x[4]; x[0] = 1; x[1]=2; x[2]=3; x[3]=4; หรอแสดงคาออกมา cout<<x[0]; จะเหนวาไมแตกตางจากตวแปรปกต เพยงแคตองแสดงสญญลกษณ [ ] และบอกตาแหนงขอมลเทาน;นเอง การเขยนโปรแกรมกบอารเรย ถาเราตองการบวกคาตวเลขท(อยในอารเรย ท;งหมด กสามารถทาไดโดย ถากรณท(อาเรยของเรามขนาดมากๆ อาจจะ 100 หรอ 1000 กจะตองเขยนยาวมาก เพราะฉะน;นการเขยนโปรแกรมจะไมสะดวก และยากตอการแกไข ถาสงเกตดจะพบวา ตวแปรอารเรย มตาแหนงเร(มจาก 0 ถง N-1 เม(อ N คอขนาดอารเรย ดงน;นจะเหนวาตาแหนงของอารเรยเพ(มข;นทละ 1 ซ(งตรงน;สามารถนาการเขยนโปรแกรมแบบมการทาซ;าเขามาใชได
int main() { int x[4]; x[0] = 1; x[1]=2; x[2]=3; x[3]=4; cout<<x[0]+x[1]+x[2]+x[3]<<endl; return 0; }
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
34
Purpose คานวณหาผลรวมของเลขจานวนเตมใดๆ 10 ตว Input ชดตวเลข 10 ตว Output ผลรวมของเลข Contract sumNumber int->int Example sumNumber ({1,2,3,4,5,6,7,8,9,10}) = 55
sumNumber ({0,1,2,3,4,5,6,7,8,9}) = 45 sumNumber ({-5,-4,-3,-2,-1,0,1,2,3,4}) = -5
Flowchart
Function code
int sumNumber (int number[]) (ใส [ ] หลงตวแปรท(เปนอาเรยทกคร; ง) { int round=0 , sum =0; while(round < = 9) { sum = sum + number[round]; ( บวกดวย เลขตาแหนงท( round เพราะ round เปล(ยนคาจาก 0 ถง เลขท(กาหนด คอ 9 ) round=round+1; (หรอจะเขยน round ++ กมคาเทากน) } return sum; }
เร(ม
จบ
รบคาตวเลข
sumNumber
รอบ<= 9 ?
sum=sum+ตวเลขตาแหนงท(ตวนบรอบ
N
Y
เพ(มคาตวนบรอบอก 1
กาหนดตวนบรอบ = 0 sum =ผลลพธ = 0
จดท( 1 เร(มท( 0 เพราะตาแหนงอาเรยเร(มท( 0 จดท( 2 แค 9 เพราะตาแหนงอาเรยจบท( 9 เพราะขนาด 10
จดท( 3
จดท( 4
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
35
Main function code
int main() { int number[10]; for(int i =0 ;i< 10 ;i++) (ประกาศตวนบรอบใน loop for กได โดยใช int ช(อตวแปร แตวาตวแปรน;จะมองเหนเฉพาะใน loop for ของมนเทาน;น ) { cout<<"type a number ["<<i<<”] “; cin>>number[i]; (เกบคาไวในตวแปรอาเรยตาแหนงท( i ) } cout<<"sum of number is "<<sumNumber(number)<<endl; return 0; }
อารเรยสองมต จากเดมท(ตวแปรเกบคาไดมากข;นแลว การทาเปนสองมต คอเพ(มมตท(สองใหเกบคาไดอก หมายความ
วาจากเดมตวแปรเกบได N คา ในพ;นท( N ตาแหนงน;นกจะเกบไดอก อนละ M คา เพราะฉะน;นตวแปรจะเกบคาไดท;งหมด N * M คา เม(อ N คอขนาดอาเรยมตท(หน(ง และ M คอขนาดอาเรยมตสอง
ตวแปร ช(อ X ตาแหนง 0 ตาแหนง 1 ตาแหนง 2 ตาแหนง 3
มตท( 1 จาก 0 -> N -1 เม(อ N = ขนาด อารเรยมตท( 1 ซ( งตอนน; ขนาด N = 4 มตท( 2 จาก 0 -> M -1 เม(อ M = ขนาด อารเรยมตท( 2 ซ(งตอนน; ขนาด M = 3
เพราะฉะน;นแสดงวาตวแปร X สามารถเกบขอมลได 4 * 3 คา 9.3 การประกาศตวแปรท�มโครงสรางเปนอาเรย จากการประกาศของอารเรยหน�งมต การประกาศใหเปนอารเรย กแคเพ(ม สญญลกษณ [ ] ซ( งขางในวงเลบคอขนาดอารเรยของมตน;นๆน(นเอง จะได ชนดขอมล ช�อตวแปร [ ขนาดอารเรยมตท� 1 ] [ ขนาดอารเรยมตท� 2 ] ; เชน int x[4] [3]; char y [10][5];
ใชเง(อนไข < 10 กมคาเทากบ <= 9
ตาแหนงท( 0 ตาแหนงท( 0 ตาแหนงท( 0 ตาแหนงท( 0 ตาแหนงท( 1 ตาแหนงท( 1 ตาแหนงท( 1 ตาแหนงท( 1 ตาแหนงท( 2 ตาแหนงท( 2 ตาแหนงท( 2 ตาแหนงท( 2
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
36
หรออาจจะประกาศตวแปรและกาหนดคาใหเลยกไดทาไดโดย ชนดขอมล ช�อตวแปร [ ขนาดอารเรยมตท� 1 ] [ ขนาดอารเรยมตท� 2 ] = { {คาของขอมลเรยงตามลาดบของตาแหนงในอาเรยมตท�สอง } , {คาของขอมลเรยงตามลาดบของตาแหนงในอาเรยมตท�สอง } } ; ซ( งค { } ขางในแตละคคอตาแหนงในอาเรยมตท(หน(งเรยงตามลาดบ เชน int x[4][3] = {{1,2,3} , {4,5,6} ,{7,8,9} , {10,11,12} }; วงเลบ {1,2,3} คออาเรยมตท(หน(ง ตาแหนงท( 0 และคาขางใน 1, 2, 3 คอคาในอาเรยมตท(สอง เรยงตาแหนงตามลาดบ จะได 1 คอตาแหนงท( 0 และ 2 คอตาแหนงท( 1 และ 3 คอตาแหนงท( 2 * *เปรยบเทยบงายๆ เหมอน ตาแหนงมตท( 1 คอ บานเลขท( และตาแหนงในมตท(สอง คอ / น(นเอง เชน 123/7 9.4 การเขาถงคาขอมลในตวแปรอารเรย กเพ(มตาแหนงท(ตองการเขาไปแตตองอางถงตาแหนงท;งในมตท( 1 และในมตท(สอง เชน กาหนดคาใหกบตวแปรอารเรย int x[4][3]; x[0][0] = 1; x[0][1] = 2; x[0][2] = 3; x[1] [0] =4; x[1][1] = 5; x[1][2] = 6; x[2] [0] =7; x[2][1] = 8; x[2][2] = 9; x[3] [0] =10; x[3][1] = 11; x[3][2] = 12; หรอแสดงคาออกมา cout<<x[0][2]; กจะเหนวาเพยงแคตองแสดงสญญลกษณ [ ] ของท;งสองมต และบอกตาแหนงขอมลในท;งสองมตเทาน;นเอง
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
37
Purpose คานวณหาผลรวมของเลขจานวนเตมใดๆ 12 ตว Input ชดตวเลข 12 ตว Output ผลรวมของเลข Contract sumNumber int->int Example sumNumber ({{1,2,3} , {4,5,6} ,{7,8,9} , {10,11,12} }) = 78
sumNumber ({{1,2,3} , {4,5,6} ,{7,8,9} , {10,11,0} }) = 66 sumNumber ({{1,2,3} , {4,5,6} ,{7,-8,9} , {10,11,12} }) = 70
Flowchart
เร(ม
จบ
รบคาตวเลข
sumNumber
รอบ<= 3 ?
sum=sum+ตวเลขตาแหนงท(ตวนบรอบ
N
Y
เพ(มคาตวนบรอบมตท( 1อก 1
กาหนดตวนบรอบมต 1 = 0 sum =ผลลพธ = 0
รอบ<= 2 ?
Y
N
กาหนดตวนบรอบมตท( 2 = 0
เพ(มคาตวนบรอบมตท(สองอก 1
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
38
Function code
int sumNumber (int number[][3]) (ใส [ ] หลงตวแปรท(เปนอาเรยทกคร; งและตองใสขนาดของมตท(สองดวย) { int round1=0 , sum =0; while(round1 < = 3) { int round2=0; while(round2 < = 2) { sum = sum + number[round1] [round2]; ( บวกดวย เลขตาแหนงท( round 1 และ round2) round2=round2+1; (หรอจะเขยน round2 ++ กมคาเทากน) } round1=round1+1; (หรอจะเขยน round1 ++ กมคาเทากน) } return sum; }
Main function code
int main() { int number[4][3]; for(int i =0 ;i< 4 ;i++) (ประกาศตวนบรอบใน loop for กได โดยใช int ช(อตวแปร แตวาตวแปรน;จะมองเหนเฉพาะใน loop for ของมนเทาน;น ) { for(int j =0 ; j< 3 ; j++) (ประกาศตวนบรอบใน loop for กได โดยใช int ช(อตวแปร แตวาตวแปรน;จะมองเหนเฉพาะใน loop for ของมนเทาน;น ) { cout<<"type a number ["<<i<<”][ “<<j<<”] “; cin>>number[i][j]; (เกบคาไวในตวแปรอาเรยตาแหนงท( i j ) } } cout<<"sum of number is "<<sumNumber(number)<<endl; return 0; }
จดท( 1 เร(มท( 0 เพราะตาแหนงอาเรยเร(มท( 0
จดท( 2 แค 3 เพราะตาแหนงอาเรยจบท( 3 เพราะขนาดมตท( 1 = 4
จดท( 3
จดท( 4
ใชเง(อนไข < 4 กมคาเทากบ <= 3
จดท( 1 เร(มท( 0 เพราะตาแหนงอาเรยเร(มท( 0
จดท( 2 แค 3 เพราะตาแหนงอาเรยจบท( 2 เพราะขนาดมตท( 2 = 3
จดท( 4
จดท( 3
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
39
บทท� 10 การเขยนโปรแกรมแบบมโครงสราง ( struct )
จากบทเรยนท(ผานมาไดรจกกบชนดขอมลท;งหมดแลว เราจะพบวา ชนดขอมลอยางหน(งกเกบคาประเภทนง ทน; ถาเราจะรวมเอาขอมลหลายๆอยางไวดวยกน กไมสามารถทาได ดงน;นเราจะใชโครงสรางขอมลชนดหน(งเขามาชวย กคอ struct
การเขยนstruct เปนการเขยนโครงสรางท(เราสรางข;นเองในโปรแกรม โดยท(เราสามารถกาหนดไดวาจะใหประกอบไปดวยอะไรบาง กอนอ(นเรากตองเร(มออกแบบกอนวาจะใหโครงสรางเราประกอบไปดวยอะไรบาง ซ(งมข;นตอนดงน;
1. ออกแบบโครงสราง 2. เขยนโคดเพ(อใหเกดโครงสราง 3. วธการสรางวตถออกมาจากโครงสรางท(กาหนดไว
เชน จะทาโครงสรางของกลองส�เหล�ยม
1. ออกแบบโครงสราง(struct pattern ) เปนคานยามท(เราใหไวกบโครงสรางของเรา กกาหนดวา กลองส(เหล(ยมเปนโครงสรางท( ประกอบไปดวย ความกวาง ความยาว และ ความสง 2. เขยนโคดเพ�อใหเกดโครงสราง(struct code) เปนโคดตามขอกาหนดของภาษาซพลสพลส * เปรยบเทยบไดกบโรงงานสรางวตถ มแตโรงงานแตยงไมมกลอง ซ(งโครงสรางในการเขยน struct มดงน; struct ช�อ { ตวแปรท�เปนองคประกอบ };
ดงน;นถาเขยนโครงสรางของกลองกจะได struct box { double width; double length; double height; }; 3. วธการสรางวตถออกมาจากโครงสรางท�กาหนดไว (struct example) เปนวธการเขยนโคดเพ(อสรางวตถ
จาก struct ท(สรางไวตามขอกาหนดของภาษาซพลสพลส การประกาศตวแปรท(เปน struct เหมอนกบการประกาศตวแปรปกต เพยงแตชนดขอมลคอ ช(อ struct เชน box b; การเขาถงขอมลท(อยในตวแปร struct สามารถทาไดโดยใช . แลวตามดวยช(อตวแปรขางใน
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
40
เชน b.width หรอ b.length หรอ b.height เพราะฉะน;นถาเราจะกาหนดคาตางๆใหกบกลอง ท(ช(อ b กทาไดโดย b.width = 2.0; b.legth = 3.0 ; b.height = 2.0; สรปท2ง 3 ข2นตอนได
Struct pattern
box เปนโครงสรางท(ประกอบไปดวย - width เปนขอมลเลขทศนยม - length เปนขอมลเลขทศนยม - height เปนขอมลเลขทศนยม
Struct code struct box {
double width; double length; double height;
}; Struct example
box b; b.width= 2.0; b.length = 3.0; b.height = 2.0 ;
ตอมาเราจะทาการเขยนโปรแกรมท(ตองนาเอาวตถเขามาใช เม(อเราทาการสราง struct เสรจแลวตามข;นตอน 3 ข;นตอนดานบน (เราสรางโรงงานสรางกลองไวแลว ดงน;นตอไปเราจะทาอะไรท(เก(ยวกบกลองกใชโรงงานน; ) เชน โปรแกรมคานวณหาความตางของปรมาตรกลองสองใบ เม(อเราจะเขยนโปรแกรม เรากตองทาการวเคราะหโจทยดวย 8 ข;นตอนท(เราเรยนไวแลวตอนตน
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
41
Purpose คานวณหาความตางของปรมาตรกลองสองใบ Input กลองใบท( 1 , กลองใบท( 2 Output ความตางปรมาตร Contract volumeDiffer : box,box->double Example box b1,b2;
b1.width= 4.0; b1.length = 5.0; b1.height = 2.0 ; b2.width= 2.0; b2.length = 3.0; b2.height = 2.0 ; volumeDiffer (b1,b2) = 273.0
Flowchart
Function code
double volumeDiffer (box box1,box box2 ) { return (box1.width*box1.length*box1.height)- (box2.width*box2.length*box2.height);
} Main function code
int main() { box b1,b2; cout<<” type properties of box 1 width ,length , height “; cin>>b1.width; cin>>b1.length; cin>>b1.height ; cout<<” type properties of box 2 width ,length , height “; cin>>b2.width; cin>>b2.length ; cin>>b2.height ; cout<<” box 1 have volume more than box 2 = “<<volumeDiffer(b1,b2)<<endl; return 0; }
เร(ม จบ รบคากลองสองใบ
ปรมาตรกลองใบท( 1 - ปรมาตรกลองใบท(สอง volumeDiffer
ปรมาตร
*การหาปรมาตรเกดข;นสองคร; ง อาจเขยนเปนฟงกชนไวแยกกได
คาของ input จะกลายเปนคา box1 หรอ box2 ในฟงกชนน;นข;นอยกบลาดบการเรยง input อยางน; box1 ในฟงกชน กจะเทากบ b1 และ box2 ในฟงกชน กจะเทากบ b2
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
42
สรปโคดท2งหมดในโปรแกรม /* Struct pattern box เปนโครงสรางท(ประกอบไปดวย
- width เปนขอมลเลขทศนยม - length เปนขอมลเลขทศนยม - height เปนขอมลเลขทศนยม
*/ // Struct code struct box {
double width; double length; double height; };
/* Struct example box b; b.width= 2.0; b.length = 3.0; b.height = 2.0 ;
Purpose คานวณหาความตางของปรมาตรกลองสองใบ Input กลองใบท( 1 , กลองใบท( 2 Output ความตางปรมาตร Contract volumeDiffer : box,box->double Example box b1,b2; b1.width= 4.0; b1.length = 5.0; b1.height = 2.0 ; b2.width= 2.0; b2.length = 3.0; b2.height = 2.0 ; volumeDiffer (b1,b2) = 273.0
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
43
Flowchart */ // Function code double volumeDiffer (box box1,box box2 ) { return (box1.width*box1.length*box1.height)- (box2.width*box2.length*box2.height); }
// Main function code void main() { box b1,b2; cout<<” type properties of box 1 width ,length , height “; cin>>b1.width; cin>>b1.length; cin>>b1.height ; cout<<” type properties of box 2 width ,length , height “; cin>>b2.width; cin>>b2.length ; cin>>b2.height ; cout<<” box 1 have volume more than box 2 = “<<volumeDiffer(b1,b2)<<endl; }
เร(ม จบ รบคากลองสองใบ
ปรมาตรกลองใบท( 1 - ปรมาตรกลองใบท(สอง volumeDiffer
ปรมาตร
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
44
บทท� 11 โครงสรางขอมลแบบ Pointer
โครงสรางขอมลแบบพอยเตอร (pointer) มลกษณะคอตวของพอยเตอรเองไมไดทาหนาท(เกบคาขอมลใดๆไว แตวาจะทาการเกบคาตาแหนงของ memory ของตวแปรขอมลตวใดตวหน(งไว ดงน;นไมวา ณ ตาแหนง memory ตาแหนงน;นจะมคาขอมลใดอย ตวพอยเตอรกจะเหนคาขอมลน;นๆดวย อธบายไดดงรป address 0001 0002 0003 0004
ถาสมมตใหกลองส(เหล(ยมอนใหญน; คอหนวยความจา (memory) ดงน;น memory กจะแบงเน;อท(ออกเปนสวนๆในการเกบขอมล สมมตใหเกบขอมล 4 สวน ดงน;นกจะมตาแหนงของแตละสวน ใหเปนตาแหนง address คอ 0001 ,0002,0003 และ 0004 ดงน;นถาใหท(ตาแหนง 0001 คอขอมลท(มโครงสรางเปนพอยเตอรแลว (บรเวณสเหลอง) และถกกาหนดใหขอมลน; ช;คาไปยง address ตาแหนง 0004 ดงน;น ขอมลพอยเตอรกจะเกบคาขอมลคอ address ของmemory ท(มนอางถง ซ( งกคอ 0004 (ตวหนงสอสแดง ) ซ( ง ณ ตาแหนง 0004 เองมการเกบคาขอมลเปนชนดเลขทศนยม มคาคอ 56.68 ถาตองการแสดงคา 56.68 กสามารถท(จะแสดงไดสองวธคอ
1. โดยการอางถงคาใน address ตาแหนง 0004 โดยตรง หรอ 2. โดยการอางผานตวแปร พอยเตอร ใน address ตาแหนง 0001
และไมวาท(ตาแหนง 0004 จะเปล(ยนขอมลเปนคาใดกตาม ตวแปรพอยเตอรกจะเหนขอมลน;นเสมอ เน(องจากมนอางดวยคา address ของ memory ไมไดอางตรงๆไปท(ตวขอมลน;นๆ ( เชน เปล(ยนจาก 56.68 เปน 12.01 ท(ตาแหนง 0001 กจะเหนเปนเลข 12.01 เชนกน) 11.1 การสรางตวแปรพอยเตอร การประกาศตวแปรท�ว ไๆปแลวมวธการคอ
ชนดขอมล ช�อตวแปร ; เชน int x ; สาหรบโครงสรางขอมลแบบพอยเตอรกเชนกน ยงคงใชวธเดยวกน แตตางกนตรงท( จะตองมเคร�องหมาย * ดานหนาของช(อตวแปร ดงน; ชนดขอมล * ช�อตวแปร ; เชน int *x ; ซ( งหมายความวา ตวแปร ช(อ x มโครงสรางเปนพอยเตอร มชนดขอมลเปน integer ดงน;น ตวแปร พอยเตอร x จะสามารถอางถง memory ตาแหนงท(มชนดขอมลเปน integer ไดเหมอนกนเทาน;น หมายเหต ตวแปรพอยเตอรมลกษณะพเศษคอ จะสามารถอางองขอมลไดเฉพาะตวแปรท(มชนดขอมลเดยวกนเทาน;น
0004 56.68
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
45
ตวอยางเชน int x ; char y; ถาตองการสรางตวแปรพอยเตอรเพ(ออางขอมลใน x และ y กจาเปนจะตองสรางสองตวใหมชนดเปน integer และ character ตามลาดบ กคอ int *pt_x; char *pt_y; 11.2 การกาหนดใหตวแปรพอยเตอรอางถงขอมลอ�น ๆม 2 วธดงน; 1. กาหนดต;งแตเร(มประกาศตวแปรพอยเตอร โดยการใชเคร(องหมายวงเลบ () และดานในกใสช(อ address
ของตวแปรท(ตองการใหช;ไป ซ(ง address ของตวแปรใดๆ สามารถเขาถงไดโดยใชเคร(องหมาย & นาหนาช(อตวแปรน;นๆ
เชน int x = 10 , *pt_x(&x); 2. กาหนดหลงจากประกาศตวแปร ทาไดเหมอนกบการกาหนดคาใหกบตวแปรปกต คอ ใชเคร(องหมาย
เทากบ = แลวตามดวย address ของตวแปรท(ตองการใหช;ไป เชน int x = 10, *pt_x; pt_x = &x;
ดงน;นสรปไดวา ตวแปร x และ pt_x มคณสมบต ดงน;
Address ใน memory ช�อตวแปร คาขอมลท�เกบไว 0001 x 10 0002 pt_x 0001
11.3 การอางถงขอมลกบตวแปรพอยเตอร การอางถงขอมลท(ตวแปรพอยเตอรช; สามารถทาไดโดยใชเคร(องหมาย * นาหนาช(อตวแปรพอยเตอร เชน int x = 10, *pt_x; pt_x = &x; ถาตองการแสดงคาวาตวแปรพอยเตอรมองเหนขอมลอะไรอย จะไดวา cout<< *pt_x<<endl; //ไดคาตอบคอ 10 ถาตองการแสดงวาตวแปรพอยเตอรเกบขอมลอะไรอย จะไดวา cout<< *pt_x<<endl; //ไดคาตอบคอ 0001 ถาตองการด address ของ memory ของตวแปรใดๆ จะไดวา cout<<&x<<endl; //ไดคาตอบคอ 0001 cout<<&pt_x<<endl; //ไดคาตอบคอ 0002
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
46
สมมตวาเปล(ยนคาตวแปร x เปน 15 x = 15; และถา cout<< *pt_x<<endl; //ไดคาตอบคอ 15 cout<< *pt_x<<endl; //ไดคาตอบคอ 0001 cout<<&pt_x<<endl; //ไดคาตอบคอ 0002 cout<<&x<<endl; //ไดคาตอบคอ 0001
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
47
บทท� 12 โครงสรางขอมลแบบ linked-list
โครงสรางขอมลแบบลงกลส (linked-list ) คอโครงสรางขอมลท(มการเช(อมตอกบตวแปรท(มโครงสรางขอมลชนดเดยวกนไดอยางไมส;นสด ลงกลสมสองแบบ คอ ลงกลสแบบช;ไปทางเดยว (singly linked-list ) กบ ช;ไปสองทาง (doubly linked-list) ในท(น; เราจะพดถง ลงกลสแบบช2ไปทางเดยวกอน ลงกลส คอโครงสรางขอมลชนดหน(ง ซ(งอาจจะเปน ลสวางเปลา หรอ เปน โ ครงสรางขอมลท�ประกอบไปดวย ขอมลสองสวน กคอ - สวนเกบขอมล - สวนท�ทาหนาท�ช "ไปยงลงกลสตวตอไป วธการสรางโครงสรางขอมลแบบลงกลส สามารถทาไดโดย การประกาศโครงสรางข;นมาตามรปแบบของ struct ท(เรยนไปแลวในบทท( 10 ดงน; 1. ออกแบบโครงสราง(struct pattern ) เปนคานยามท(เราใหไวกบโครงสรางของเรา
กกาหนดวา linkedList เปนโครงสรางท( ประกอบไปดวย สวนเกบขอมล สวนท(ทาหนาท(ช; ไปยงลงกลสตวตอไป
2. เขยนโคดเพ�อใหเกดโครงสราง(struct code) เปนโคดตามขอกาหนดของภาษาซพลสพลส ซ( งโครงสรางในการเขยน struct มดงน; struct ช�อ { ตวแปรท�เปนองคประกอบ }; 3. วธการสรางวตถออกมาจากโครงสรางท�กาหนดไว (struct example) เปนวธการเขยนโคดเพ(อสรางวตถ
จาก struct ท(สรางไวตามขอกาหนดของภาษาซพลสพลส การประกาศตวแปรท(เปน linkedListเหมอนกบการประกาศตวแปร struct โดยชนดขอมลคอ ช(อstruct แตจะตองมเคร(องหมาย * (คอพอยเตอรน(นเอง ) หนาช(อตวแปรท(เปนโครงสราง linkedList ตองมการใช keyword คอ new เพ(อเปนการกาหนดคาเร(มตนใหกบโครงสราง ดงน; ช(อโครงสราง * ช(อตวแปร = new ช(อโครงสราง (แบบน; เปนการประกาศตวแปร พรอมกบทาการ new ดวย) หรอจะประกาศตวแปรกอน แลวคอยทา ช(อตวแปร = new ช(อโครงสราง การเขาถงขอมลท(อยในตวแปร struct สามารถทาไดโดยใช -> แลวตามดวยช(อตวแปรขางใน ตวอยางเชน ทาการสรางลงกลสท(เกบขอมลเพยงอยางเดยว กคอ ตวเลขจานวนเตม 1 จานวน ดงน;นจะได
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
48
ข2นตอน 1 ออกแบบโครงสราง(struct pattern ) ไดทาไปแลวดานบน ข2นตอน 2 เขยนโคดเพ�อใหเกดโครงสราง(struct code) ไดคอ struct linkedList { int number ; struct linkedList *next; /* สวนท�ช2ไปยงขอมลลงกลสตวตอไป มโครงสรางแบบพอยเตอรดวย ดงน2นจงตอง ม * นาหนาช�อ และตรงชนดขอมลของตวแปร สงเกตวา ไมใชคาวา linkedList เฉย เๆน�องจากวา มนซอนอยใน struct จงตองอางชนดขอมลเตม ๆคอ struct linkedList*/ }; ข2นตอน 3 การสรางวตถออกมาจากโครงสรางท�กาหนดไว (struct example) เม(อมโครงสรางของลงกลสแลว เรากสามารถกระทาการสรางตวแปรท(มโครงสรางแบบน;ได ซ( งเหมอนกบการประกาศตวแปรปกต สมมตใหตวแปร ลงกลสน; เกบตวเลข คอ เลข 1 จะได linkedList *first; // ประกาศตวแปรตามปกตกอน first = new linkedList; // การสรางตวแปรท(เปน struct pointer ตองมการกาหนดคาเร(มตนใหตวแปรกอน จงจะนาไปใชได โดยการใชคยเวรด new first->number = 1; // การเขาถงองคประกอบท(อยใน struct pointer ใชเคร(องหมาย -> first->next= NULL; // คยเวรด NULL หมายถงวางเปลา ใชกบการกาหนดตวแปรท(เปนวตถใหมคาวาง หมายถง first ไมมขอมลตวถดไปอก เพ(อความเขาใจ ถาสมมตใหรปรางลงกลสเปนดงน; จะได สรางลงกลงกลส ท(มจานวนตวเลข 1 ตอดวย 2 มสองวธ 1. ไมประกาศช(อตวแปรใหม จะได linkedList *first,*second; first= new linkedList; second = new linkedList; first->number = 1 ; first->next=new linkedList ; //กาหนดใหตวแปร first ช;ขอมลถดไปคอตวแปรใหม
สวนเกบตวเลข สวนเกบพอยเตอรช;ตวตอไป
1
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
49
first->next->number = 2; // ตรงตาแหนง first->next เปนการช;ตวลงกลสตวใหมแลว ถาจะกาหนดคาตวเลขใหกบลสใหมกตองอาง first->next กอน ถงจะอาง ->number ตอ (คลายๆกบ first->number แตตรงตาแหนง first ถกขยายเปน first->next )
first->next->next = NULL; 2. ประกาศช(อตวแปรสาหรบทกลงกลสใหม จะได linkedList *first,*second; first= new linkedList; second = new linkedList; first->number = 1 ; first->next=second; //กาหนดใหตวแปร first ช;ขอมลถดไปคอตวแปร second second->number=2; second->next=NULL; จะไดดงรป หมายเหต ตวพอยเตอรท(ทาหนาท(ช;ลงกลสตวถดไป จะมองเหนลงกลสท;งหมด ไมใชเหนเพยงสวนขอมล
สวนแรกหรอสวนหลงเพยงอยางเดยว เพราะฉะน;นรปลกศรจากรปสมมต จงช;อยเพยงดานหนาของลงกลส สรปท2งสามข2นตอนได
Struct pattern
linkedList เปนโครงสรางท(ประกอบไปดวย - number เปนขอมลเลขจานวนเตม - next เปนตวแปรโครงสรางพอยเตอรท(ช;ลงกลสตวถดไป
Struct code struct linkedList {
int number; struct linkedList *next;
}; Struct example
linkedList *first; first = new linkedList; first->number = 1; first->next = NULL;
2 1
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
50
บทท� 13 การเขยนโปรแกรมโครงสรางขอมลแบบ singly linked-list
กอนอ(นกทาการสรางโครงสรางลงกลสกอน 1. ออกแบบโครงสราง(struct pattern ) เปนคานยามท(เราใหไวกบโครงสรางของเรา
กกาหนดวา linkedList เปนโครงสรางท( ประกอบไปดวย สวนเกบขอมล คอชนด integer สวนท(ทาหนาท(ช; ไปยงลงกลสตวตอไป คอ ชนด linkedList 2. เขยนโคดเพ�อใหเกดโครงสราง(struct code) struct linkedList { int number; struct linkedList *next; }; 3. วธการสรางวตถออกมาจากโครงสรางท�กาหนดไว (struct example) linkedList *first; // ประกาศตวแปรตามปกตกอน first = new linkedList; // การสรางตวแปรท(เปน struct pointer ตองมการกาหนดคาเร(มตนใหตวแปรกอน จงจะนาไปใชได โดยการใชคยเวรด new first->number = 1; // การเขาถงองคประกอบท(อยใน struct pointer ใชเคร(องหมาย -> first->next= NULL; // คยเวรด NULL หมายถงวางเปลา ใชกบการกาหนดตวแปรท(เปนวตถใหมคาวาง สรปท2ง 3 ข2นตอนได
Struct pattern
linkedList เปนโครงสรางท(ประกอบไปดวย - number เปนขอมลเลขจานวนเตม - next เปนตวแปรโครงสรางพอยเตอรท(ช;ลงกลสตวถดไป
Struct code struct linkedList {
int number; struct linkedList *next;
}; Struct example
linkedList *first; first = new linkedList; first->number = 1; first->next = NULL;
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
51
ตอมาเราจะทาการเขยนโปรแกรมท(ตองนาเอาวตถเขามาใช เม(อเราทาการสราง struct เสรจแลวตามข;นตอน 3 ข;นตอนดานบน (เราสรางโรงงานสรางลงกลสสาหรบเลขจานวนเตม 1 จานวนไวแลว ดงน;นตอไปเราจะทาอะไรท(เก(ยวกบลงกลสท(เกบเลขจานวนเตมกใชโรงงานน; ) เม(อเราจะเขยนโปรแกรม เรากตองทาการวเคราะหโจทยดวย 8 ข;นตอนท(เราเรยนไวแลวตอนตน
โจทยคอ ใหเขยนโปรแกรมคานวณหาผลรวมของเลขจานวนเตมท;งหมดในลงกลส 1 ลส วธท( 1 เขยนแบบ recursive function จะได
Purpose คานวณหาผลรวมของเลขจานวนเตมท;งหมดในลงกลส 1 ลส Input ลงกลส 1 ลงกลส Output ผลรวมของเลขจานวนเตมท;งหมดในลงกลส Contract sumLinkedList : linkedList->int Example linkedList *first,*second;
first = new linkedList; second = new linkedList; first->number = 1; first->next =second; second->number = 2; second->next = NULL; sumLinkedList (first) = 3
Flowchart
จะเหนวาการหาปรมาตรเกดข;นสองคร; ง อาจจะเขยนเปนฟงกชนไวแยกกได
เร(ม
จบ
รบคาลงกลส
sumLinkedList
ลงกลสเปนวาง ?
เรยกฟงกชนอกคร; งนง + เลขในลส โดยใหinput ฟงกชนคอลงกลสตวตอไป
N
Y
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
52
Function code
int sumLinkedList (linkedList lList ) { if (lList!=NULL) // ตรวจสอบวาวถตเปนวางหรอไม { return 0; }else { return lList->number + sumLinkedList(lList->next); // ให input คอ ลสตวถดไป }
} Main function code
int main() {
linkedList *first,*second; first = new linkedList; second = new linkedList; first->number = 1; first->next =second; second->number = 2; second->next = NULL; cout<<sumLinkedList (first) <<endl; return 0; }
จะเหนวาตวแปรท(ใสเปน input ใหกบฟงกชน sumLinkedList คอ first เน(องจากวา first เปนช(อตวแปรลงกลสลาดบแรกสด จะทาใหได input ต;งแตเลข 1
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
53
วธท( 2 เขยนแบบ ใช loop programmingจะได Purpose คานวณหาผลรวมของเลขจานวนเตมท;งหมดในลงกลส 1 ลส Input ลงกลส 1 ลงกลส Output ผลรวมของเลขจานวนเตมท;งหมดในลงกลส Contract sumLinkedList : linkedList->int Example linkedList *first,*second;
first = new linkedList; second = new linkedList; first->number = 1; first->next =second; second->number = 2; second->next = NULL; sumLinkedList (first) = 3
Flowchart
Function code
int sumLinkedList (linkedList lList ) { int sum= 0; while(lList!=NULL) // ตรวจสอบวาวถตเปนวางหรอไม { sum=sum+lList->number; // บวกคา sum กบคาตวเลขในลงกลส lList=lList->next; // เล(อนพอยเตอรไปยงลงกลสถดไป } return sum; }
จะเหนวาการหาปรมาตรเกดข;นสองคร; ง อาจจะเขยนเปนฟงกชนไวแยกกได
เร(ม
จบ
รบคาลงกลส
sumLinkedList
ลงกลสเปนวาง ?
sum = sum + เลขในลส ลงกลสเล(อนไปช;ตวตอไป
N
Y
sum = 0
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
54
Main function code
int main() {
linkedList *first,*second; first = new linkedList; second = new linkedList; first->number = 1; first->next =second; second->number = 2; second->next = NULL; cout<<sumLinkedList (first) <<endl; return 0; }
การแทรกลงกลส การแทรกลงกลสท(เปนแบบไปทางเดยว มหลกการงายๆ คอ ความหมายสามารถอธบายไดดงรป สมมตใหลงกลสเกาเปนดงรปน; และลงกลสใหม เปนดงน; เราจะนาลงกลสใหมไปแทรกระหวางเลข 1 กบ 2 เพราะฉะน;นจะไดดงรปน; หมายเหตเสนสแดงคอเสนใหมตามหลกการดานบน กจะไดเปนดงน;
จะเหนวาตวแปรท(ใสเปน input ใหกบฟงกชน sumLinkedList คอ first เน(องจากวา first เปนช(อตวแปรลงกลสลาดบแรกสด จะทาใหได input ต;งแตเลข 1
1 2 3
5
1
5
2 3
1 5 2 3
next ของลงกลสใหม จะเทากบ next ของลงกลสเกา next ของลงกลสเกา จะเทากบ ลงกลสใหม
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
55
แตจะมขอยกเวนอย 1 กรณ คอ กรณท(ลงกลสใหมถกแทรกใหอยดานหนาสด กจะไดหลกการดงน; next ของลงกลสใหม จะเทากบ ลงกลสเกา เพราะะน;นจะไดเปนดงน;
การลบลงกลส การลบลงกลสท(เปนแบบไปทางเดยว มหลกการงายๆ คอ ความหมายสามารถอธบายไดดงรป สมมตใหลงกลสเกาเปนดงรปน; แลวทาการลบตาแหนงท( 2 กจะไดเปนดงน; หมายเหตเสนสแดงคอเสนใหมตามหลกการดานบน กจะไดเปนดงน; แตจะมขอยกเวนอย 1 กรณ คอ กรณท(ลบลงกลสท(อยดานหนาสด กจะไดหลกการดงน; เพราะะน;นจะไดเปนดงน;
5 1 2 3
1 2 3
1 2 3
1 3
2 3
next ของลงกลสตวกอนหนา จะเทากบ next ของลงกลสตวท�ถกลบ
ลงกลสตวแรก จะเทากบ next ของลงกลสตวแรก
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
56
บทท� 14 โครงสรางขอมลแบบ linked-list แบบช2ไปสองทาง
ลงกลสมสองแบบ คอ ลงกลสแบบช;ไปทางเดยว (singly linked-list ) กบ ช;ไปสองทาง (doubly linked-list) สาหรบโครงสรางลงกลสแบบช;ไปสองทางมดงน; ลงกลส คอโครงสรางขอมลชนดหน(ง ซ(งอาจจะเปน ลสวางเปลา หรอ เปน โ ครงสรางขอมลท�ประกอบไปดวย ขอมลสองสวน กคอ - สวนเกบขอมล - สวนท�ทาหนาท�ช "ไปยงลงกลสตวกอนหนา - สวนท�ทาหนาท�ช "ไปยงลงกลสตวตอไป วธการสรางโครงสรางขอมลแบบลงกลส สามารถทาไดโดย การประกาศโครงสรางข;นมาตามรปแบบของ struct ท(เรยนไปแลวในบทท( 10 ดงน; 1. ออกแบบโครงสราง(struct pattern ) เปนคานยามท(เราใหไวกบโครงสรางของเรา
กกาหนดวา linkedList เปนโครงสรางท( ประกอบไปดวย สวนเกบขอมล สวนท(ทาหนาท(ช; ไปยงลงกลสตวกอนหนา สวนท(ทาหนาท(ช; ไปยงลงกลสตวตอไป
2. เขยนโคดเพ�อใหเกดโครงสราง(struct code) เปนโคดตามขอกาหนดของภาษาซพลสพลส ซ( งโครงสรางในการเขยน struct มดงน; struct ช�อ { ตวแปรท�เปนองคประกอบ }; 4. วธการสรางวตถออกมาจากโครงสรางท�กาหนดไว (struct example) เปนวธการเขยนโคดเพ(อสรางวตถ
จาก struct ท(สรางไวตามขอกาหนดของภาษาซพลสพลส การประกาศตวแปรท(เปน linkedListเหมอนกบการประกาศตวแปร struct โดยชนดขอมลคอ ช(อstruct แตจะตองมเคร(องหมาย * (คอพอยเตอรน(นเอง ) หนาช(อตวแปรท(เปนโครงสราง linkedList ตองมการใช keyword คอ new เพ(อเปนการกาหนดคาเร(มตนใหกบโครงสราง ดงน; ช(อโครงสราง * ช(อตวแปร = new ช(อโครงสราง (แบบน; เปนการประกาศตวแปร พรอมกบทาการ new ดวย) หรอจะประกาศตวแปรกอน แลวคอยทา ช(อตวแปร = new ช(อโครงสราง การเขาถงขอมลท(อยในตวแปร struct สามารถทาไดโดยใช -> แลวตามดวยช(อตวแปรขางใน
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
57
ตวอยางเชน ทาการสรางลงกลสท(เกบขอมลเพยงอยางเดยว กคอ ตวเลขจานวนเตม 1 จานวน ดงน;นจะได ข2นตอน 1 ออกแบบโครงสราง(struct pattern ) ไดทาไปแลวดานบน ข2นตอน 2 เขยนโคดเพ�อใหเกดโครงสราง(struct code) ไดคอ struct linkedList { int number ; struct linkedList *prev; /* สวนท�ช2ไปยงขอมลลงกลสตวกอนหนา struct linkedList *next; /* สวนท�ช2ไปยงขอมลลงกลสตวตอไป }; ข2นตอน 3 การสรางวตถออกมาจากโครงสรางท�กาหนดไว (struct example) เม(อมโครงสรางของลงกลสแลว เรากสามารถกระทาการสรางตวแปรท(มโครงสรางแบบน;ได ซ( งเหมอนกบการประกาศตวแปรปกต สมมตใหตวแปร ลงกลสน; เกบตวเลข คอ เลข 1 จะได linkedList *first; // ประกาศตวแปรตามปกตกอน first = new linkedList; // การสรางตวแปรท(เปน struct pointer ตองมการกาหนดคาเร(มตนใหตวแปรกอน จงจะนาไปใชได โดยการใชคยเวรด new first->number = 1; // การเขาถงองคประกอบท(อยใน struct pointer ใชเคร(องหมาย -> first->prev= NULL; // คยเวรด NULL หมายถงวางเปลา ใชกบการกาหนดตวแปรท(เปนวตถใหมคาวาง หมายถง first ไมมขอมลตวกอนหนา first->next= NULL; // คยเวรด NULL หมายถงวางเปลา ใชกบการกาหนดตวแปรท(เปนวตถใหมคาวาง หมายถง first ไมมขอมลตวถดไปอก เพ(อความเขาใจ ถาสมมตใหรปรางลงกลสเปนดงน; จะได
สวนเกบพอยเตอรช;ตวกอนหนา สวนเกบตวเลข สวนเกบพอยเตอรช;ตวตอไป
1
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
58
สรางลงกลงกลส ท(มจานวนตวเลข 1 ตอดวย 2 มสองวธ 1. ไมประกาศช(อตวแปรใหม จะได linkedList *first,*second; first= new linkedList; second = new linkedList; first->number = 1 ; first->prev=NULL ; //กาหนดใหตวแปร first ช;ขอมลกอนหนาคอวาง first->next=new linkedList ; //กาหนดใหตวแปร first ช;ขอมลถดไปคอตวแปรใหม first->next->number = 2; // ตรงตาแหนง first->next เปนการช;ตวลงกลสตวใหมแลว ถาจะกาหนดคาตวเลข
ใหกบลสใหมกตองอาง first->next กอน ถงจะอาง ->number ตอ (คลายๆกบ first->number แตตรงตาแหนง first ถกขยายเปน first->next )
first->next->prev = first; first->next->next = NULL; 2. ประกาศช(อตวแปรสาหรบทกลงกลสใหม จะได linkedList *first,*second; first= new linkedList; second = new linkedList; first->number = 1 ; first->prev=NULL; //กาหนดใหตวแปร first ช;ขอมลกอนหนาคอวาง first->next=second; //กาหนดใหตวแปร first ช;ขอมลถดไปคอตวแปร second second->number=2; second->prev=first; //กาหนดใหตวแปร second ช;ขอมลกอนหนาคอ first second->next=NULL; จะไดดงรป หมายเหต ตวพอยเตอรท(ทาหนาท(ช;ลงกลสตวถดไป จะมองเหนลงกลสท;งหมด ไมใชเหนเพยงสวนขอมล
สวนแรกหรอสวนหลงเพยงอยางเดยว เพราะฉะน;นรปลกศรจากรปสมมต จงช;อยเพยงดานหนาของลงกลส
1 2
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
59
สรปท2งสามข2นตอนได Struct pattern
linkedList เปนโครงสรางท(ประกอบไปดวย - number เปนขอมลเลขจานวนเตม - prev เปนตวแปรโครงสรางพอยเตอรท(ช;ลงกลสตวกอนหนา - next เปนตวแปรโครงสรางพอยเตอรท(ช;ลงกลสตวถดไป
Struct code struct linkedList {
int number; struct linkedList *next , *prev ;
}; Struct example
linkedList *first; first = new linkedList; first->number = 1; first->prev = NULL; first->next = NULL;
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
60
บทท� 15 การเขยนโปรแกรมโครงสรางขอมลแบบ doubly linked-list
กอนอ(นกทาการสรางโครงสรางลงกลสกอน 1. ออกแบบโครงสราง(struct pattern ) เปนคานยามท(เราใหไวกบโครงสรางของเรา กกาหนดวา linkedList เปนโครงสรางท( ประกอบไปดวย สวนเกบขอมล คอชนด integer สวนท(ทาหนาท(ช; ไปยงลงกลสตวกอนหนา คอ ชนด linkedList สวนท(ทาหนาท(ช; ไปยงลงกลสตวตอไป คอ ชนด linkedList 2. เขยนโคดเพ�อใหเกดโครงสราง(struct code) struct linkedList { int number; struct linkedList *prev,*next; }; 3. วธการสรางวตถออกมาจากโครงสรางท�กาหนดไว (struct example) linkedList *first; // ประกาศตวแปรตามปกตกอน first = new linkedList; // การสรางตวแปรท(เปน struct pointer ตองมการกาหนดคาเร(มตนใหตวแปรกอน จงจะนาไปใชได โดยการใชคยเวรด new first->number = 1; // การเขาถงองคประกอบท(อยใน struct pointer ใชเคร(องหมาย -> first->prev= NULL; // คยเวรด NULL หมายถงวางเปลา ใชกบการกาหนดตวแปรท(เปนวตถใหมคาวาง first->next= NULL; // คยเวรด NULL หมายถงวางเปลา ใชกบการกาหนดตวแปรท(เปนวตถใหมคาวาง สรปท2ง 3 ข2นตอนได
Struct pattern
linkedList เปนโครงสรางท(ประกอบไปดวย - number เปนขอมลเลขจานวนเตม - prev เปนตวแปรโครงสรางพอยเตอรท(ช;ลงกลสตวถดไป next เปนตวแปรโครงสรางพอยเตอรท(ช;ลงกลสตวถดไป
Struct code struct linkedList {
int number; struct linkedList *prev,*next;
}; Struct example
linkedList *first; first = new linkedList; first->number = 1;
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
61
first->prev = NULL; first->next = NULL;
ตอมาเราจะทาการเขยนโปรแกรมท(ตองนาเอาวตถเขามาใช เม(อเราทาการสราง struct เสรจแลวตามข;นตอน 3 ข;นตอนดานบน (เราสรางโรงงานสรางลงกลสสาหรบเลขจานวนเตม 1 จานวนไวแลว ดงน;นตอไปเราจะทาอะไรท(เก(ยวกบลงกลสท(เกบเลขจานวนเตมกใชโรงงานน; ) เม(อเราจะเขยนโปรแกรม เรากตองทาการวเคราะหโจทยดวย 8 ข;นตอนท(เราเรยนไวแลวตอนตน
โจทยคอ ใหเขยนโปรแกรมคานวณหาจานวน node ของลงกลสในลงกลส 1 ลส ( node คอแตละสวนของลงกลส หรอลงกลสยอยๆน(นเอง)
วธท( 1 เขยนแบบ recursive function นบไปขางหนา จะได Purpose คานวณหาจานวน node ของลงกลสในลงกลส 1 ลส Input ลงกลส 1 ลงกลส Output จานวน node ท;งหมดในลงกลส Contract countLinkedList : linkedList->int Example linkedList *first,*second;
first = new linkedList; second = new linkedList; first->number = 1; first->next =second; second->number = 2; second->next = NULL; countLinkedList (first) = 2
Flowchart
จะเหนวาการหาปรมาตรเกดข;นสองคร; ง อาจจะเขยนเปนฟงกชนไวแยกกได
เร(ม
จบ
รบคาลงกลส
countLinkedList
ลงกลสเปนวาง ?
เรยกฟงกชนอกคร; งนง + 1 โดยใหinput ฟงกชนคอลงกลสตวตอไป
N
Y
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
62
Function code
int countLinkedList (linkedList lList ) { if (lList!=NULL) // ตรวจสอบวาวถตเปนวางหรอไม { return 0; }else { return 1 + countLinkedList(lList->next); // ให input คอ ลสตวถดไป } }
Main function code
int main() {
linkedList *first,*second; first = new linkedList; second = new linkedList; first->number = 1; first->prev =NULL; first->next =second; second->number = 2; second->prev = first; second->next = NULL; cout<<countLinkedList (first) <<endl; return 0; }
จะเหนวาตวแปรท(ใสเปน input ใหกบฟงกชน countLinkedList คอ first เน(องจากวา first เปนช(อตวแปรลงกลสลาดบแรกสด จะทาใหไดนบต;งแต node แรก
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
63
วธท( 2 เขยนแบบ ใช loop programming นบถอยหลง จะได Purpose คานวณหาจานวน node ของลงกลสในลงกลส 1 ลส Input ลงกลส 1 ลงกลส Output จานวน node ท;งหมดในลงกลส Contract countLinkedList : linkedList->int Example linkedList *first,*second;
first = new linkedList; second = new linkedList; first->number = 1; first->next =second; second->number = 2; second->next = NULL; countLinkedList (first) = 2
Flowchart
Function code
int sumLinkedList (linkedList lList ) { int count= 0; while(lList!=NULL) // ตรวจสอบวาวถตเปนวางหรอไม {
count=count+1 ; // บวกคา count เพ(มอก 1 lList=lList->prev; // เล(อนพอยเตอรไปยงลงกลสกอนหนา } return sum; }
จะเหนวาการหาปรมาตรเกดข;นสองคร; ง อาจจะเขยนเปนฟงกชนไวแยกกได
เร(ม
จบ
รบคาลงกลส
countLinkedList
ลงกลสเปนวาง ?
count=count +1
N
Y
count = 0
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
64
Main function code
int main() {
linkedList *first,*second; first = new linkedList; second = new linkedList; first->number = 1; first->next =second; second->number = 2; second->next = NULL; cout<<sumLinkedList (second) <<endl; return 0; }
การแทรกลงกลส การแทรกลงกลสท(เปนแบบช;สองทาง มหลกการงายๆ คอ ความหมายสามารถอธบายไดดงรป สมมตใหลงกลสเกาเปนดงรปน; และลงกลสใหม เปนดงน; เราจะนาลงกลสใหมไปแทรกระหวางเลข 1 กบ 2 เพราะฉะน;นจะไดดงรปน;
จะเหนวาตวแปรท(ใสเปน input ใหกบฟงกชน countLinkedList คอ secondเน(องจากวา first เปนช(อตวแปรลงกลสลาดบสดทาย เราตองการแสดงใหเหนวาการเล(อนพอยเตอรไปยงตวแปรกอนหนาน;นทาได
3 1
2
2 3 1
2
next ของลงกลสใหม จะเทากบ next ของลงกลสกอนหนา prev ของลสกใหม จะเทากบ ลงกลสกอนหนา (หรอเทากบ prev ของลงกลสขางหลง) next ของลงกลสกอนหนา จะเทากบ ลงกลสใหม prev ของลสกขางหลง จะเทากบ ลงกลสใหม
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
65
หมายเหตเสนสแดงคอเสนใหมตามหลกการดานบน กจะไดเปนดงน; แตจะมขอยกเวนอย 1 กรณ คอ กรณท(ลงกลสใหมถกแทรกใหอยดานหนาสด กจะไดหลกการดงน; เพราะะน;นจะไดเปนดงน;
การลบลงกลส การลบลงกลสท(เปนแบบช;สองทาง มหลกการงายๆ คอ ความหมายสามารถอธบายไดดงรป สมมตใหลงกลสเกาเปนดงรปน; แลวทาการลบตาแหนงท( 2 กจะไดเปนดงน; หมายเหตเสนสแดงคอเสนใหมตามหลกการดานบน กจะไดเปนดงน;
2 1 3
1 2 3
2 1 3
2 1 3
3 1
Prev ของลงกลสขางหลง จะเทากบ ลงกลสใหม next ของลงกลสใหม จะเทากบ ลงกลสขางหลง
prev ของลงกลสขางหลง จะเทากบ prev ของลงกลสตวท�ถกลบ next ของลงกลสตวกอนหนา จะเทากบ next ของลงกลสตวท�ถกลบ
การเขยนโปรแกรมคอมพวเตอร
จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร
66
แตจะมขอยกเวนอย 1 กรณ คอ กรณท(ลบลงกลสท(อยดานหนาสด กจะไดหลกการดงน; prev ของลงกลสขางหลง จะเทากบคาวาง ลงกลสตวแรก จะเทากบ next ของลงกลสตวแรก เพราะฉะน;นจะไดเปนดงน;
3 2