66
การเขียนโปรแกรมคอมพิวเตอร์ จัดทําโดย อาจารย์จิราพร พุกสุข ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยนเรศวร 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

บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 2: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

2

2. การเขยนโปรแกรมเชงวตถ (object or iented programming) มคณสมบตพเศษคอ - ออกแบบโปรแกรมในรปแบบของวตถ - สามารถมการถายทอดคณสมบตระหวางวตถได - สามารถแบงโคดเขยนแยกเปนสวนๆแลวนามารวมกนได - สามารถเขยนโคดทบสวนของการกระทาของวตถท�ไดรบการถายทอดมาได - สามารถกาหนดใหบางคณสมบตของโปรแกรมไมสามารถแกไขเปล�ยนแปลงได ตวอยางภาษาท(ใชรปแบบการเขยนแบบน; ไดแก Ruby , PHP , Perl , Python , C++ , JAVA

ซ( งภาษาโปรแกรมท(พฒนาข;นในปจจบนน; สวนมากมรปแบบภาษาท(รองรบการเขยนโปรแกรมเชงวตถ แตทวาการเขยนโปรแกรมเชงวตถน;น วธการเขยนสวนหน(งมพ;นฐานมาจากรปแบบการเขยนโปรแกรมแบบมข;นตอนรวมอยดวย ดงน;นในการเขยนโปรแกรมเบ;องตน ผเรยนควรทาความเขาใจรปแบบการเขยนโปรแกรมแบบมข;นตอนอยางละเอยดกอนการเรยนการเขยนโปรแกรมเชงวตถตอไป

สาหรบเน;อหาตอไปน;จะมงเนนการทาความเขาใจในรปแบบการเขยนโปรแกรมแบบมข;นตอนและการออกแบบโปรแกรมมากกวาท(จะมงเนนภาษาใดเปนสาคญ เน(องจากการใชภาษาในการเขยนโปรแกรมน;นเปนเพยงการเลอกเคร(องมอสาหรบใชงานเทาน;น เม(อผเรยนสามารถเขาใจวธการเขยนโปรแกรม และหลกการในการออกแบบโปรแกรมแลว ไมวาจะเลอกใชภาษาใดในการเขยนโปรแกรมกจะไมเปนเร(องยากอกตอไป เพราะจะแตกตางกนตรงท(รปแบบของชดคาส(งเทาน;น แตวธการหลกๆยงคงอยบนพ;นฐานเดยวกน แตเน(องจากตองมการยกตวอยางประกอบความเขาใจและเพ(อฝกฝนการเรยนร เน;อหาในเอกสารเลมน; จงองกบภาษาซพลสพลส เน(องจากภาษาซพลสพลสเปนภาษาท(ไดรบความนยม อกท;งยงรองรบรปแบบการเขยนท;งสองรปแบบ ลกษณะชดคาส(งไมซบซอนเกนไปนก เหมาะแกการเรยนรสาหรบผเร(มตนเปนอยางย(ง

Page 3: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 4: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

4

จะเหนวาตวอยางแรก ฟงกชน functionA ไมไดถกทางาน เพราะท(ฟงกชนหลกไมไดมชดคาส(งใหฟงกชน functionA ทางาน แตในตวอยางท(สอง ฟงกชน functionA จะทางาน เพราะฟงกชนหลกมการส(งใหฟงกชน funcitonA ทางานดวยการเขยนช(อฟงกชนไวท(ฟงกชนหลก และการทางานของคอมไพเลอรจะเรยงลาดบต;งแตบรรทดแรกในฟงกชนหลกทละบรรทด เม(อพบวามการเรยกใชฟงกชนอ(นๆใหทางาน กจะทางานท(ฟงกชนน;นๆ และกลบมาทางานตอยงบรรทดตอมาจนกระท(งจบชดคาส(งท;งหมดในฟงกชนหลก

code void functionA() { cout<<” A”; } int main() { cout<<”1 “<<endl; A(); cout<<”2 “<<endl; return 0; }

output 1 A2

Page 5: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 ตวอกษรขนาดใหญ

Page 6: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 ;

Page 7: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 8: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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>

Page 9: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 10: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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;

Page 11: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 12: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 13: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

13

บทท� 5 การเขยนโปรแกรมแบบซบซอน

ในโปรแกรมจรงๆท(เขยนข;นไมไดมเพยงฟงกชนเดยว ในหน(งไฟล .cpp อาจจะมก(ฟงกชนกได แตจะมฟงกชนท(ทางานเสมอ เพยงฟงกชนเดยวคอฟงกชนหลก ดงน;นในบทน; เราจะเรยนรวธการเขยนโปรแกรมท(มหลายๆฟงกชนถกเรยกใชงาน

หลกการคอใหจาไววา 1 ฟงกชน คอหน(งวตถประสงค เพราะฉะน;น การเขยนโปรแกรมออกแบบใหมก(ฟงกชน หรออาจจะไมมฟงชนเลยกตาม ข;นอยกบการออกแบบของผเขยนโปรแกรม

ถาสมมตใหโปรแกรมเมอรคอคนเขยนบทละคร แลวแตละฟงกชนกคอแตละตวละคร ซ(งมหนาท(ตางๆกนไป ละครหน(งเร(อง กอาจจะใชตวละครไมเทากนกได ถงแมวาตอนจบของละครจะเหมอนกน เพราะคนเขยนบทอาจจะใหตวละครคนหน(งทาหลายหนาท( อกคนอาจจะใหตวละครหน(งทาหนาท(เดยว จานวนตวละครท(ใชกอาจจะไมเทากน เหมอนกบโปรแกรม ในโปรแกรมท(มคาตอบเดยวกน กอาจจะมวธการเขยนออกมาไมเหมอนกนได ตวอยางสมมตให ฟงกชนหลกเปรยบเหมอน ผกากบท(เลนละครเร(องน;นดวย แตละฟงกชน คอ ตวละครแตละตวหนาท(ตางกน และโปรแกรมเมอรคอคนเขยนบท เขยนโปรแกรมการเปล�ยนจากองศาฟาเรนไฮนไปเปนองศาเคลวน บทละครท� 1 (ออกแบบแบบน2เพราะรวาสมการเปล�ยนองศาฟาเรนไฮน เปนเคลวน คออะไร) มตวละครหน(งตวคอ ผกากบ ทาหนาท(ทกอยาง ต;งแต 1. รบคา input องศาฟาเรนไฮน 2. คานวณเปล(ยนองศาฟาเรนไฮนไปเปนองศาเคลวน 3. แสดงผลคาตอบ บทละครท� 2 (ออกแบบแบบน2เพราะรวาสมการเปล�ยนองศาฟาเรนไฮน เปนเคลวน คออะไร) มตวละครสองตว ตวละคร 1 คอ ผกากบ ทาหนาท( 1. รบคา input องศาฟาเรนไฮน 2. ส(งใหตวละครสองเลน 3. แสดงผลคาตอบ ตวละคร 2 ทาหนาท( 1. คานวณเปล(ยนองศาฟาเรนไฮนไปเปนองศาเคลวน

Page 14: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 15: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 16: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 17: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 18: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 19: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

19

บทท� 6 การเขยนโปรแกรมแบบมเง�อนไข

จากบทเรยนกอนหนา คาตอบของโปรแกรมท(ไดมกจะเปนคาตอบท(มาจากสมการเดยวหรอมาจากรปแบบๆเดยว ซ(งในความเปนจรงแลว คาตอบของโปรแกรมท(ได อาจจะไมไดมาจากสมการเดยวกนหรอมาจากรปแบบเดยวกนกได เพราะฉะน;นเม(อคาตอบของโปรแกรมมาจากสมการหรอรปแบบท(มากกวา 1 รปแบบ ตองใชเทคนคการเขยนโปรแกรมแบบมเง(อนไข การเขยนโปรแกรมแบบมเง(อนไขจะเขามาชวยในการตดสนใจวา ถา input น; จะตองใชสมการน;หรอรปแบบคาตอบน; ถา input อกอนนงกใชอกรปแบบนง เร(มตน เราจะเรยนรการเขยนโปรแกรมแบบมเง�อนไขสาหรบคาตอบสองรปแบบกอน โครงสรางภาษาซพลสพลสท�ใชกคอ if( เง�อนไข ) { ส�งท�จะใหทา ฯลฯ }else { ส�งท�จะใหทา ฯลฯ } หมายเหตโจทยท(มกจะใชการเขยนโปรแกรมแบบมเง(อนไขคอ โจทยท(มกจะมคาวา หรอไม , ตรวจสอบ , แบงประเภท ฯลฯ

เคร�องหมายท�ใชกบการเปรยบเทยบเง�อนไขตาง มๆดงน2

= = เทากน

!= ไมเทากน

> มากกวา

< นอยกวา

> = มากกวาหรอเทากบ

< = นอยกวาหรอเทากบ

ความหมายกคอ ถา เปนอยางน; { จะใหทาอะไร } ถาไมใชกรณแรก แลว(พดงายๆกคอไมใชตามเง(อนไข) { จะใหทาอะไรอก }

Page 20: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 21: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 22: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

22

หมายเหต การแสดงคาตอบจะออกมาในรป 0 กบ 1 เพราะ bool ใน C++ จะแสดง 0 หมายถง false และ 1 หมายถง true การเขยนโปรแกรมแบบมเง�อนไขสาหรบคาตอบหลายรปแบบ โครงสรางภาษาซพลสพลสท�ใชกคอ if( เง�อนไข ) { ส�งท�จะใหทา ฯลฯ }else if(เง�อนไข ) { ส�งท�จะใหทา ฯลฯ } else if(เง�อนไข ) { ส�งท�จะใหทา ฯลฯ } . . . else { ส�งท�จะใหทา ฯลฯ }

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

ความหมายกคอ ถา เปนอยางน; { จะใหทาอะไร } ถาไมใชกรณแรก แลว(พดงายๆกคอไมใชตามเง(อนไข) { จะใหทาอะไรอก } ถาไมใชกรณแรกและกรณท(สอง แลว(พดงายๆกคอไมใชตามเง(อนไขสองอนแรก) { จะใหทาอะไรอก } . . . ถาไมใชกรณทกกรณขางตน { จะใหทาอะไรอก }

เร(ม

จบ

รบคาเวลา ชม. , นาท , วนาท

checkHour

0 <= ชม< 24 ?

ถกตอง

ไมถกตอง

N

Y

Page 23: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 ?

เปนจานวนเตมลบ

เปนจานวนเตมศนย

Page 24: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 25: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 26: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 27: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 28: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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ากตอเม�อ เง�อนไขเปนจรง

Page 29: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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า }

Page 30: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 31: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

31

Main function code

int main() { int number; cout<<"type a number "; cin>>number; cout<<"sum of number is "<<sumNumber(number)<<endl; return 0; }

Page 32: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 33: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 34: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 35: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 36: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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]; กจะเหนวาเพยงแคตองแสดงสญญลกษณ [ ] ของท;งสองมต และบอกตาแหนงขอมลในท;งสองมตเทาน;นเอง

Page 37: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 38: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 39: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 สามารถทาไดโดยใช . แลวตามดวยช(อตวแปรขางใน

Page 40: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 ข;นตอนท(เราเรยนไวแลวตอนตน

Page 41: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 42: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 43: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

ปรมาตร

Page 44: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 45: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 46: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

46

สมมตวาเปล(ยนคาตวแปร x เปน 15 x = 15; และถา cout<< *pt_x<<endl; //ไดคาตอบคอ 15 cout<< *pt_x<<endl; //ไดคาตอบคอ 0001 cout<<&pt_x<<endl; //ไดคาตอบคอ 0002 cout<<&x<<endl; //ไดคาตอบคอ 0001

Page 47: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 จานวน ดงน;นจะได

Page 48: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 49: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 50: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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;

Page 51: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 52: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 53: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 54: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 ของลงกลสเกา จะเทากบ ลงกลสใหม

Page 55: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

55

แตจะมขอยกเวนอย 1 กรณ คอ กรณท(ลงกลสใหมถกแทรกใหอยดานหนาสด กจะไดหลกการดงน; next ของลงกลสใหม จะเทากบ ลงกลสเกา เพราะะน;นจะไดเปนดงน;

การลบลงกลส การลบลงกลสท(เปนแบบไปทางเดยว มหลกการงายๆ คอ ความหมายสามารถอธบายไดดงรป สมมตใหลงกลสเกาเปนดงรปน; แลวทาการลบตาแหนงท( 2 กจะไดเปนดงน; หมายเหตเสนสแดงคอเสนใหมตามหลกการดานบน กจะไดเปนดงน; แตจะมขอยกเวนอย 1 กรณ คอ กรณท(ลบลงกลสท(อยดานหนาสด กจะไดหลกการดงน; เพราะะน;นจะไดเปนดงน;

5 1 2 3

1 2 3

1 2 3

1 3

2 3

next ของลงกลสตวกอนหนา จะเทากบ next ของลงกลสตวท�ถกลบ

ลงกลสตวแรก จะเทากบ next ของลงกลสตวแรก

Page 56: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 สามารถทาไดโดยใช -> แลวตามดวยช(อตวแปรขางใน

Page 57: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 58: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 59: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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;

Page 60: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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;

Page 61: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 62: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 แรก

Page 63: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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

Page 64: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

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 ของลสกขางหลง จะเทากบ ลงกลสใหม

Page 65: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

65

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

การลบลงกลส การลบลงกลสท(เปนแบบช;สองทาง มหลกการงายๆ คอ ความหมายสามารถอธบายไดดงรป สมมตใหลงกลสเกาเปนดงรปน; แลวทาการลบตาแหนงท( 2 กจะไดเปนดงน; หมายเหตเสนสแดงคอเสนใหมตามหลกการดานบน กจะไดเปนดงน;

2 1 3

1 2 3

2 1 3

2 1 3

3 1

Prev ของลงกลสขางหลง จะเทากบ ลงกลสใหม next ของลงกลสใหม จะเทากบ ลงกลสขางหลง

prev ของลงกลสขางหลง จะเทากบ prev ของลงกลสตวท�ถกลบ next ของลงกลสตวกอนหนา จะเทากบ next ของลงกลสตวท�ถกลบ

Page 66: บทที 1 ร้จักกับการเขียนโปรแกรม ู · 2018-01-07 · การเขียนโปรแกรมเชิงวัตถุ

การเขยนโปรแกรมคอมพวเตอร

จดทาโดย อาจารยจราพร พกสข ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยนเรศวร

66

แตจะมขอยกเวนอย 1 กรณ คอ กรณท(ลบลงกลสท(อยดานหนาสด กจะไดหลกการดงน; prev ของลงกลสขางหลง จะเทากบคาวาง ลงกลสตวแรก จะเทากบ next ของลงกลสตวแรก เพราะฉะน;นจะไดเปนดงน;

3 2