คลังเก็บรายเดือน: กรกฎาคม 2014

3. การเลือกทำหรือคำสั่งเงื่อนไข

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

 

 

3. การเลือกทำหรือคำสั่งเงื่อนไข

            คำสั่งเงื่อนไขเป็นหนึ่งในคำสั่งสำหรับการควบคุมโปรแกรมซึ่งอีกอันได้แก่คำสั่งทำซ้ำ ซึ่งทั้ง 2 อย่างนี้มีความสำคัญต่อการเขียนโปรแกรมต่อๆไปเป็นอย่างมาก จึงควรมีต้องฝึกให้ชำนาญ

เงื่อนไข if

เป็นเงื่อนที่ตรวจสอบว่าสิ่งที่ภายใต้เงื่อนไงที่เขียนเอาไว้เป็นจริงหรือไม่ ถ้าจริงจะทำตามเงื่อนที่เขียนไว้ ถ้าไม่เป็นไปตามเงื่อนไขก็จะไม่ทำตามคำสั่ง จะไปตรวจสอบคำสั่งที่อยู่ถัดจาก if ออกไป

 

if(เงื่อนไข)

{

            คำสั่งที่1;  // มีได้มากกว่า 1 คำสั่ง

}

คำสั่งที่2  // มีได้มากกว่า 1 คำสั่ง

รูป 3-1

 

 

ถ้ามีคำสั่งเดียวภายในเงื่อนไข if ไม่ต้องมี { } ได้ เช่น

If(number%2 == 0)

{

            System.out.println(“even number”);

}

เขียนแบบไม่มี { } ก็ได้

If(number%2 == 0)      System.out.println(“even number”);

แต่ถ้ามีมากกว่า 1 ต้องใส่ { } ให้เรียบร้อยจะเห้นได้จากตัวอย่างต่อๆไป

 

ตัวอย่าง

รูป 3-2

โปรแกรมนี้ประกาศตัวแปรเป็นตัวเลขจำนวนเต็มถามว่าจำนวนเต็มนี้เป็นเลขคู่หรือไม่ ซึ่งการจะรู้ว่าเป็นเลขคู่หรือไม่ ต้องรู้ว่า เลขคู่คือตัวเลขที่เมื่อเอาสองไปหารแล้วลงตัว

บรรทัดที่ 6 : ประกาศตัวแปร number เป็นชนิด int

บรรทัดที่ 8 : สร้างเงื่อนไข if ถามว่า number หาร 2 แล้วเศษเป็นศูนย์หรือไม่

บรรทัดที่ 10 : เขียนคำสั่ง ถ้าเงื่อนไขเป็นจริงให้ ให้บอกว่าตัวเลขนั้นเป็นเลขคู่

ได้ผลลัพธ์ใน console ดังนี้

รูป 3-3

คำสั่ง if else

            คำสั่ง if เป็นคำสั่งที่ตรวจสอบว่าเงื่อนไขเป็นจริงหรือไม่ หากจริงจะทำตามคำสั่ง แต่ไม่บอกว่าถ้าเท็จต้องทำอะไรหรือไม่ ส่วน if else จะเพิ่มเติมจาก if ขึ้นมาว่าถ้าจริงให้ทำอะไร หากเท็จให้ทำอะไรต่อ ก็จะเป็นการตรวจสอบเงื่อนไขให้สมบูรณ์ขึ้น

 

 

if(เงื่อนไข)

{

            คำสั่งที่1;  // มีได้มากกว่า 1 คำสั่ง

}

else

{

คำสั่งที่2;  // มีได้มากกว่า 1 คำสั่ง

รูป3-4

 

 

}

คำสั่งอื่น;

 

ตัวอย่าง

รูป 3-5

 

            โปรแกรมนี้ต้องการดูว่าคะแนนสอบผ่านหรือไม่หากมากกว่าหรือเท่ากับ 50 คะแนนถือว่าผ่าน ถ้าไม่ถือว่าสอบไม่ผ่าน

บรรทัดที่ 8 : สร้างเงื่อนไขถามว่าคะแนนมากว่าหรือเท่ากับ50หรือไม่

บรรทัดที่10-11: หากใช่ ให้แสดงข้อความตามคำสั่งทั้งสอง

บรรทัดที่ 14 : หากเงื่อนไขเป็นเท็จ ให้ทำตามคำสั่งในบรรทัดที่ 16-18 จากนั้นให้ออกจากเงื่อนไข

 

นอกจากรูปแบบ

if(เงื่อนไข)

{

            คำสั่งที่1;  // มีได้มากกว่า 1 คำสั่ง

}

else

{

คำสั่งที่2;  // มีได้มากกว่า 1 คำสั่ง

}

คำสั่งอื่น;

 

คำสั่ง if else สามาเขียนได้ในรูปแบบหนึ่งคือ ตัวแปร = เงื่อนไข? คำสั่ง1:คำสั่ง 2;

            c = a > b ? a : b;

            a มากกว่า b หรือไม่ ถ้าใช่ให้ทำ a ถ้าไม่ใช่ ให้ทำ b

เงื่อนไขแบบ Nested if

            คือจะมี การใช้ if else ต่อกันยาวมากกว่า 1 ครั้งติดกัน จึงเรียกว่า Nested if แปลว่า if ที่ซ้อนๆกัน ช่วยในการตรวจสอบ เงื่อนไขที่ซับซ้อนมากขึ้น กล่าวก็คือมีหลายเงื่อนไข

if(เงื่อนไข)

{

            คำสั่งที่1;  // มีได้มากกว่า 1 คำสั่ง

}

else if(เงื่อนไข)

{

คำสั่งที่2;  // มีได้มากกว่า 1 คำสั่ง

}

else if(เงื่อนไข)

{

คำสั่งที่3;  // มีได้มากกว่า 1 คำสั่ง

}

รูป3-6

บรรทัดที่ 9 : ประกาศตัวแปร day เป็นชนิด int

บรรทัดที่ 10 : เรียกใช้คำสั่ง Scan สำหรับ input ข้อมูลจากแป้นพิมพ์

บรรทัดที่ 11 :แสดงผลให้รับข้อมูลเป็นเลขจำนวนเต็ม 1-7 บรรทัดที่ 12 ให้เก็บสิ่งที่ input เข้ามาใส่ไว้ในตัวแปล day

บรรทัด14-61 : จากนั้นตรวจสอบด้วยเงื่อนไข if else ต้องตรวจสอบปีกกาให้ครบคู่กัน

แต่เนื่อง if else แบบข้างบน มีเพียงคำสั่งเดียวในแต่ละเงื่อนไข จึงสามารถเขียนได้อีกวิธีหนึ่ง ดังรูปต่อไปนี้

รูป 3-7

 

ผลลัพธ์ที่ได้

รูป 3-8

 

เงื่อนไขแบบ switch-case

            เป็นอีกรูปแบบหนึ่งของคำสั่งเงื่อนไข เมื่อเรากำหนดเงื่อนไขขึ้น โปรแกรมจะทำการตรวจสอบว่าตรงกับกรณีใดๆที่กำหนดเอาไว้หรือหากมีจะทำกรณีนั้นและจบโปรแกรม

 

switch(ตัวแปรหรือนิพจน์ที่ต้องการตรวจสอบ)

{

            case ค่าที่ 1:

                        คำสั่งที่ 1;

                        break;

case ค่าที่ 2:

                        คำสั่งที่ 2;

                        break;

// ใส่ case เท่าที่ต้องการ

            default :

                        คำสั่งที่ 3;

}

break เป็นสิ่งที่ลืมไม่ได้ในแต่ละ case เพราะเป็นคำสั่งหยุดการทำงานจากเงื่อนไขทันที จะได้ไม่ตรวจสอบ case ที่เหลืออีก (ถ้าเป็น ลูป(loop) คำสั่ง break จะเป็นการออกจากลูป)

default คล้ายกับ else ใน if else กล่าวคือ เป็นส่วนที่ถ้าสิ่งที่รับเข้ามาไม่ตรงกับ case ไหนเลย ก็ให้ กำหนดว่าจะทำคำสั่งอะไร

ตัวอย่าง

รูป 3-9

บรรทัดที่ 9-12 : เป็นการประกาศตัวแปรและรับตัวเลขจากแป้นพิมพ์มาใส่ในตัวแปร

บรรทัดที่ 14 : ใช้คำสั่งเงื่อนไขแบบ switch-case รับตัวแปร num มาตรวจสอบ case

บรรทัดที่ 16-18 : ถ้าเลขที่รับเข้ามาเป็น เลข 1 จะตรงกับ case 1 ก็จะทำคำสั่งแสดงผลออกทางหน้าจอว่า

THE SELFLESS และ case อืนๆก็จะออกตามคำสั่งที่อยู่ในปีกกา

บรรทัดที่ 32 : default หากผู้ใช้ใส่ตัวเลขเข้ามาเกินกว่า 1-5 ก็จะไม่อยู่ใน case ที่เขียนลงไปให้แสดงผลคำว่า

DIVERGENT

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

4. คำสั่งลูป(Loop)หรือการทำงานซ้ำ

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

4. คำสั่งลูป(Loop)หรือการทำงานซ้ำ

            คำสั่งควบคุมอีกประเภทที่ใช้งานบ่อยๆคือคำสั่งลูป หรือการให้โปรแกรมทำงานซ้ำวนๆกันจนกว่าจะถึงเงื่อนไขที่เราได้เขียนเอาไว้

ลูปแบบ while

            ลูป while จะทำงานโดยการตรวจสอบเงื่อนไข หากเงื่อนไขจะทำคำสั่งภายในลูป 1 รอบแล้วกลับมาตรวจสอบการทำงานของเงื่อนไขอีกครั้งหากเงื่อนไขยังเป็นจริงอยู่จะเข้าไปทำตามคำสั่งภายในเงื่อนไขอีกครั้งและทำซ้ำจนกว่าจะพบว่าเงื่อนไขเป็นเท็จก็จะออกไปทำงานนอกลูป

 

while(เงื่อนไข)

{

            คำสั่ง 1;

}

คำสั่ง 2;

 

 

รูป 4-1

 

 

ตัวอย่าง

 

รูป 4-2

 

โปรแกรมนี้เป็นโปรแกรมให้พิมพ์ตัวเลขระหว่าง 1 ถึง 100 ที่หาร3และ5ลงที่

บรรทัดที่ 6 :       ประกาศตัวแปร x  เป็นชนิด int

บรรทัดที่ 8 : กำหนดค่าเริ่มต้นให้กับตัวแปร x โดยให้มีค่าเป็น 1 หมายความว่าเมื่อลูปทำการตรวจสอบเงื่อนไข

      จะเริ่มตรวจสอบจาก 1 เป็นตัวแรก

บรรทัดที่ 10 : คำสั่งลูป while พร้อมกำหนดเงื่อนไข ในที่นี้เงื่อนไขคือ ให้ทำซ้ำเรื่อยๆจนกระทั้ง x มีค่าเท่ากับ

       100 จึงให้ออกจากลูปไปทำคำสั่งนอกลูปได้

บรรทัดที่ 12-16 : ภายในลูป while มีการตรวจสอบเงื่อนไขด้วย if ว่าหากหารด้วย 3 และ 5 แล้วเหลือเศษศูนย์

หรือ หารลงตัว ให้แสดงผลออกทางหน้าจอ

บรรทัดที่ 18 : เพิ่มค่า x ในการตรวจสอบ โดยเพิ่มทีละ 1 จนกว่าค่า i จะถึง 100  กล่าวคือรอบแรกลูปจะใช้ x ที่

        มีค่าเท่ากับ 1 เพราะ ค่าเริ่มต้นเท่ากับ 1 เมื่อเข้าสู่ลูปจนถึงช่วงเพิ่มค่า x จะเพิ่มเป็น 2 และเป็น 3

        4 5 …100

            จะเห็นได้ว่าความสำคัญที่ทำให้ลูป while ทำงานได้ จะต้องไม่ลืม 3 ขั้นตอนสำคัญ ได้แก่ กำหนดค่าเริ่มต้น กำหนดเงื่อนไข เพิ่มค่า/ลดค่า

 

ลูปแบบ do-while

            ลูป do-while แตกต่างจากลูป while ตรงที่จะมีการทำงานก่อนเข้าลูป 1 ครั้ง

 

do()

{

            คำสั่ง 1;

} while(เงื่อนไข);

คำสั่ง 2;

 

รูป4-3

 

 

ตัวอย่าง

 

รูป4-4

            โปรแกรมนี้ต้องการแสดงตัวเลข 1-10

บรรทัดที่ 6 : ประกาศตัวแปร count เป็นตัวแปรชนิด int ให้ค่าเริ่มเป็น 1

บรรทัดที่ 8 : คำสั่ง do มีคำสั่งภายในคือ คำสั่งแสดงผล หลังจากแสดงผลเสร็จให้ทำการเพิ่มค่าตัวแปร count

     อีก 1

บรรทัดที่ 11 : ทำการวนลูปหาก count มีค่าเท่ากับ 11 หรือมากกว่า ให้ออกจากลูป

ผลลัพธ์ที่ได้

 

รูป4-5

ลูป for

            เป็นคำสั่งสำหรับการวนลูปเช่นเดียวกัน แต่สำหรับลูป for นั้น จะเป็นการเอาค่าเริ่มต้น เงื่อนไขและการเพิ่มค่า/ลดค่ามาไว้ในบรรทัดเดียวกัน

 

 

 

for(ค่าเริ่มต้น;เงื่อนไข;เพิ่มค่า/ลดค่า)

{

            คำสั่ง 1;

}

คำสั่ง 2;

ลูป for จะคล้ายกับ if คือถ้ามีคำสั่งเดียวไม่ต้องมี

{ } ได้

 

รูป 4-6

 

 

 

ตัวอย่าง

 

รูป 4-7

โปรแกรมต้องการให้แสดงตัวอักษร x สิบตัว

บรรทัดที่ 6 : ใช้ลูป for(ค่าเริ่มต้น;เงื่อนไข;เพิ่มค่า/ลดค่า) โดยให้ค่าเริ่มต้นเป็น 1 และกำหนดเงื่อนไขให้พิมพ์ค่าออกตราบเท่าที่ i น้อยกว่าหรือเท่ากับ 10

บรรทัดที่ 8 : คำสั่งแสดงค่า

ได้ผลลัพธ์เป็นตัวอักษร x สิบตัว

 

รูป 4-8

 

 

 

 

 

 

 

 

ลูป Nested for

 

เป็นการใช้ลูป for ซ้อน ลูป for

 

for(ค่าเริ่มต้น;เงื่อนไข;เพิ่ม/ลดค่า)

{

for(ค่าเริ่มต้น;เงื่อนไข;เพิ่ม/ลดค่า)

{

for(ค่าเริ่มต้น;เงื่อนไข;เพิ่ม/ลดค่า)

{

                                    คำสั่ง 1;

}

}

}

 

 

รูป4-9

 

 

คำสั่ง 2;

 

ตัวอย่างการใช้ Nested for loop

 

รูป 4-10

ต้องการให้โปรแกรมแสดงรูปปีรามิดที่มีเงาอยู่ทางซ้ายออกทางหน้าต่าง console.

บรรทัดที่ 7 : เป็นการใช้คำสั่ง for ตัวแรกเพื่อวนลูปสร้างแถวแนวนอน โดยให้สร้างทั้งหมด 11 แถว

บรรทัดที่ 9 : ให้โปรแกรมแสดง เครื่องหมาย – แทนเงาของปีรามิดโดยกำหนดค่าเริ่มต้นที่แถวที่ 1 ให้มีเงื่อนไข

      ว่าต้องแสดงเครื่องหมาย – เป็นจำนวนทั้งหมด 10-i  ครั้งแรก i =1 จะแสดงเครื่องหมาย – 9 ครั้ง

บรรทัดที่ 14 : ให้โปรแกรมแสดง เครื่องหมาย x แทนตัวของปีรามิดโดยให้แสดง x ออกมาครั้งละ (i*2)+1 ครั้ง

      แรก i เป็น 1 จะแสดง x ออกมาหนึ่งครั้ง อย่าลืมเครื่องหมาย “” ใน ( )

ผลลัพธ์ของโปรแกรมเป็นดังนี้

 

รูป 4-11

ลูป while(true) และ for(;;)

            คือนอกจากคำสั่ง while และ for ที่ต้องกำหนดเงื่อนไขให้ลูปทำงานแล้วบางครั้งเราก็ต้องการการทำงานจำพวกที่ให้ผู้ใช้ป้อนข้อมูลได้เรื่อยๆ ไม่จำกัดจนกว่าผู้ป้อนข้อมูลจะพอ สามารถใช้ลูปอีกแบบได้คือ ลูป while(true) หรือ for(;;) สองอย่างนี้มีค่าเท่ากัน คือกำหนดให้ลูปเป็นจริงเสมอก็จะทำการวนลูปไปเรื่อยๆจนกว่าจะพอใจ หรือใช้คำสั่ง break; ในการการออกจากลูป

 

 

คำสั่ง break; และ continue;

 

 

คำสั่ง break; เป็นคำสั่งให้โปรแกรมออกจากลูป

              ทันทีที่เจอคำสั่งนี้ มักใช้กับ while(true)

 

 

 

while ( true )

{

   คำสั่ง;

   break ;

   คำสั่ง;

}

 

 

 

 

 

คำสั่ง continue; เป็นคำสั่งให้โปรแกรมวนกลับขึ้น

ไปตรวจสอบเงื่อนไขลูปใหม่โดยข้ามการ

ทำงานรอบนั้นไปเลย

 

while ( true )

{

   คำสั่ง;

   continue ;

   คำสั่ง;

}

 

การใช้คำสั่ง break; และ continue;

 

รูป 4-12

            โปรแกรมนี้จะแสดงให้เห็นรอบของจำนวนการทำงานของลูป for ที่ให้วนลูปตั้งแต่ 1 ถึง 10 แต่เมื่อ i มีค่าเท่ากับ 3 จะไม่แสดงผลของรอบที่  i = 3 ออกทางหน้าจอเพราะให้ข้าม 3 ด้วยคำสั่ง continue; และเมื่อ i=5 จะทำการ break; ออกจากลูปคือลูปจะไม่วนจนถึง 10 รอบตามที่ได้ตั้งเงื่อนไขไว้

ผลลัพธ์จึงเป็นดังนี้

 

รูป 4-13

 

สิ่งที่ต้องหลีกเลี่ยง infinite loop

            Infinite loop คือลูปไม่รู้จบ เกิดจากความผิดพลาดเวลาที่เรากำหนดเงื่อนไข ทำให้ลูปทำงานวนซ้ำออกจากลูปไม่ได้เครื่องก็จะเริ่มช้าเพราะรันโปรแกรมติดๆกัน

 

รูป 4-14

จากโปรแกรมนี้เมื่อกำหนดให้ค่า i เป็น 1 ยังกำหนดให้เงื่อนไขเป็น เมื่อ i = 1  จะพิมพ์ค่า i ออกมา แต่ i มีค่าเท่ากับ 1 อยู่แล้วมันก็จะพิมพ์ค่า i ออกมาไม่รู้จบ

 

รูป 4-15

เมื่อเกิดการรันโปรแกรมไม่รู้จบให้ทำการกดเครื่องหมายสีเหลี่ยมสีแดงที่มุมขวาบนของหน้าต่าง console เพื่อปิดการันโปรแกรมตามด้วยเครื่องกากบาทข้างๆ

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

5. อาร์เรย์(Array)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

5. อาร์เรย์(Array)

            อาร์เรย์ (หนังสือบางเล่นใช้คำว่าแถวลำดับ ตัวแปรชุด) ช่วยในการเก็บข้อมูลจำนวนมากโดยไม่ต้องประกาศตัวแปรเยอะๆ เช่น ต้องการเก็บข้อมูล 100 ข้อมูลก็ไม่ต้องประกาศตัวแปร 50 ตัวเพราะมันเสียเวลา ประกาศอาร์เรย์เดียวขนาด 100 ช่อง การใช้อาร์เรย์ยังไปได้ด้วยดีกับการใช้ลูป เพราะอาร์เรย์จะเก็บข้อมูลประเภทเดียวกัน เช่น เก็บ int ก็จะเก็บ int ทั้งอาร์เรย์ทำให้ใช้ลูปมาเก็บใส่ได้ดี การใช้งานอาร์เรย์ได้แก่ การเก็บข้อมูล การหาข้อมูลและการเรียงลำดับเป็นสำคัญ

อาร์เรย์

อาร์เรย์จะถูกแบ่งออกเป็นหลายๆช่อง โดยมีสิ่งที่เรียกว่า index เป็นตัวระบุว่าข้อมูลนั้นๆอยู่ช่องไหน โดยในภาษาจาวา อาร์เรย์ช่องแรกจะเริ่มต้นที่ index[0] หมายความว่า ถ้าประกาศอาร์เรย์ 100 ช่อง indexหรือช่องสุดท้ายจะเป็น 99

 

 

จากในรูปจะเห็นว่าเราเก็บข้อมูลเป็นจำนวนเต็ม เลข 1 เก็บไว้ใน อาร์เรย์ช่องแรก index[0] และ 16 เก็บไว้ที่ index[4]

 

 

รูป 5-1

 

 

 

จะเห็นว่าว่าอาร์เรย์ข้างบนมี 5 ช่อง แต่มี index[0-4] ถ้าเผลอเก็บข้อมูลไว้ที่ index[5] จะ error

 

รูป 5-2

เป็นการประกาศอาร์เรย์ 3 ช่อง ดังนั้น index จะมีเพียงแค่ index[0]  index[1]  index[2] พอไปเก็บไว้ที่index[3] ก็จะ เกิด error ต้องระวังไว้ว่าช่องแรกเริ่มที่ 0 เสมอ

 

รูป 5-3

วิธีการประกาศตัวแปรชนิดอาร์เรย์ 1 มิติ

ชนิดตัวแปร [ ] ชื่อตัวแปร;

ชนิดตัวแปร ชื่อตัวแปร[ ];

เช่น int a [ ];                  หรือ      int [ ]a;

 

            อาร์เรย์เป็นอ็อปเจ็ค เวลาสร้างอาร์เรย์ใช้จริงๆต้องใช้คีย์เวิร์ด new คือข้างบนแค่ประกาศเหมือนประกาศตัวแปรทั่วไป แต่การ new คือจะเราอาร์เรย์มาใช้ก็เหมือนการจะให้ค่ากับตัวแปร

 

ชื่อตัวแปร = new ชนิดตัวแปร[ ขนาดของอาร์เรย์ที่อยากได้];

a = new int [5];

แต่จริงๆคือประกาศตัวแปรและเรียกใช้อาร์เรย์ในบรรทัดเดียวกันก็ได้

int a[ ] = new int [5];

อันนี้เท่ากับว่าประกาศตัวแปร x เก็บข้อมูลชนิด int ใส่ อาร์เรย์ 1 มิติ

 

รูป 5-4

 

 

            เมื่อเรา ประกาศตัวแปรa[ ] เราก็ได้กล่อง a ขึ้นมาแต่พอเรา new ก็จะได้บล็อกแถวข้างๆออกมา ต้องมีทั้งกล่องและบล็อกที่จะเอากล่องไปใส่ถึงจะสามารถใช้อาร์เรย์ได้สมบูรณ์

การอ้างอิงอาร์เรย์เดียวกัน

            ในอาร์เรย์ตัวแปรอาร์เรย์สามารถชี้ไปที่อาร์เรย์เดียวกันได้ โดยใช้เครื่องหมาย = กล่าวคือเครื่องหมาย = ในจาวามีได้ 2 ความหมาย คือ

1.ตัวแปรธรรมดา = คือเอาค่าทางขวาไปใส่ทางซ้าย เช่น x = 3; คือเอา 3 ไปใส่ x

2.ตัวแปรอาร์เรย์  = คือตัวทางซ้ายกับตัวทางขวา ชี้ไปที่ อาร์เรย์เดียวกัน เช่น

 

int [ ]d = new int [5];

int [ ]a = d;

 

รูป 5-5

 

            สร้างอาร์เรย์ d ขึ้นมา 5 ช่อง d ก็จะชี้ไปที่อาร์เรย์ 5ช่อง พอสร้าง a ขึ้นมาก็ให้ชี้ไปที่เดียวกับที่ d ชี้อยู่ โดยใช้ เครื่องหมาย =

กำจัดขยะด้วย Garbage collector

            ในจาวาอาร์เรย์ที่ไม่มีตัวแปรอ้างอิงจะถูกกำจัดเพื่อให้ประหยัดหน่วยความจำ

 

int a = new int[6];

a = new int[2];

 

รูป 5-6

 

ตัวอย่างการสร้าง เพิ่ม และใช้งานอาร์เรย์

ให้รับข้อมูลใส่อาร์เรย์10ตัวถามว่าในอาร์เรย์มีเลขคู่หรือไม่มี

 

รูป 5-7

 

บรรทัดที่ 8 : ใช้ Scanner เพื่อรับข้อมูลจากทางแป้นพิมพ์(Scanner ก็ใช้วิธีการ new เช่นเดียวกับ array)

บรรทัดที่ 9 : ประกาศตัวแปร x เป็นอาร์เรย์ โดยกำหนดขนาดอาร์เรย์เป็น 10 ช่อง

บรรทัดที่ 10 : จากนั้นวนลูป for โดยมีเงื่อนไขคือ i<x.length โดย .length หมายความว่า ขนาดของ กล่าวคือ

        ตราบเท่าที่ i ยังไม่เกินขนาดของอาร์เรย์ x ให้ทำการรับข้อมูลต่อ

บรรทัดที่ 13 : ให้x[ ] เก็บข้อมูลจากการวนลูปของ i

บรรทัดที่ 15 : ประกาศตัวแปร count สำหรับใช้นับว่ามีจำนวนที่เป็นเลขคู่หรือไม่

บรรทัดที่ 16 : ใช้ลูปวน for วนลูปเท่าขนาดอาร์เรย์อีกครั้ง

 

บรรทัดที่ 18 : ใช้เงื่อนไขเพื่อตรวจสอบว่าในอาร์เรย์มีจำนวนที่หารด้วย 2 ลงตัวหรือไม่

บรรทัดที่ 20-21 : หากมีตัวที่เป็นไปตามเงื่อนไขของบรรทัดที่ 18 ให้ทำ count นับ 1 และทำการ break; ออก

จากลูปเลยเพราะมีอย่างน้อย 1 ตัวเป็นเลขคู่ก็หมายความว่า อาร์เรย์นี้มีเลขคู่

บรรทัดที่ 24 – 31 : สร้างเงื่อนไขอีก ถ้า count มากกว่า 0 ให้ แสดงผลว่ามีเลขคู่ แต่ถ้าไม่มีให้บอกไม่มี

ได้ผลลัพธ์ดังนี้

 

รูป 5-8

การหาค่ามากสุด

 

รูป 5-9

            โปรแกรมนี้ต้องการทำให้โปรแกรมเรียงลำดับของอาร์เรย์จากน้อยไปมากและแสดงผลออกทางหน้าจอ

บรรทัดที่ 9 : ประกาศอาร์เรย์ x ขนาด 10 ช่อง

บรรทัดที่ 11-15: ทำการวนลูปโดยให้ลูปมีขนาดเท่ากับอาร์เรย์ จากนั้นทำการ random ตัวเลข0-50 มาใส่ใน

อาร์เรย์ จากนั้นแสดงผลออกทางหน้าจอ

บรรทัดที่ 17-19 : จากนั้นจะทำการเปรียบเทียบค่าในอาร์เรย์ทีละสองตัวเพื่อเรียงลำดับโดยให้ลูปแรกมีขนาด

เท่ากับอาร์เรย์ที่เราประกาศ ส่วนลูปที่ 2 ลดขนาดลง 1 เพราะไม่ต้องทำการเปรียบเทียบกับตัวเอง

บรรทัดที่ 21 :สร้างเงื่อนไง ถ้า ตัวก่อนหน้า x[i] มากกว่า ตัวข้างหลัง x[i+1]

บรรทัดที่ 23 : สร้างตัวแปร temp มาเก็บค่า x[i]

บรรทัดที่ 24 : เอาค่า x[i+1] มาใส่ x[i]

บรรทัดที่ 25 : จากนั้นเอา temp ที่เก็บค่าเดิมของ x[i] มาใส่ที่ x[i+1]

            พูดง่ายๆก็คือถ้าอาร์เรย์มันเป็นแถวบล็อกยาวๆ แล้ว x[i] มันมากกว่า x[i+1] ก็ให้สลับค่ากัน ค่าที่มากกว่าจะได้มาอยู่ฝั่งขวาแล้วพอวนลูปรอบต่อไปค่ามากกว่าก็จะดูว่าตัวเองมากกว่าตัวถัดไปหรือเปล่าถ้าใช่ก็สลับอีก สลับจนตัวมากกว่าสุดไปอยู่ขวาสุด

บรรทัดที่ 31 : ให้แสดงผลออกทางหน้าจอ

บรรทัดที่ 31 : ใช้เมท็อด Arrays.toString(int []) เพื่อช่วยพิมพ์ข้อความออกมาเป็นรูปแบบอาร์เรย์สวยๆ

ผลลัพธ์ที่ได้หลังจากสลับกันจนเรียบร้อยแล้ว

 

รูป 5-10

อาร์เรย์ 2 มิติ

            เนื่องจากอาร์เรย์มีลักษณะเป็นแถวๆจึงสามารถสร้างแถวได้มากกว่า 1 กล่าวคือสร้าง 2แถวติดกันก็ได้

วิธีการสร้างอาร์เรย์ 2มิติ ก็เพิ่ม [ ] มาอีก 1 อัน

int a[ ][ ]= new int [5][5];

            แบบนี้ก็จะได้ตารางอาร์เรย์แบบ 5×5 ช่อง

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

5.1 อาร์เรย์(ต่อ)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

5.1 อาร์เรย์(ต่อ)

          อาร์เรย์ก่อนหน้านี้จะเป็นอาร์เรย์ที่มีแถวเดียว คือเมื่อมีข้อมูล อาร์เรย์จะจัดเก็บในลักษณะเป็นแถวเรียงกันเป็นแถวยาว แต่แถวยาวก็บล็อกใส่ของที่สามารถนำมาเรียงต่อกันหลายแถวเป็นอาร์เรย์ที่เรียกว่า อาร์เรย์สองมิติและสามมิติ

อาร์เรย์ 2 มิติ

            อาร์เรย์ธรรมดาก็คล้ายกับบล็อกสำหรับเก็บของ บล็อกนั้นแบ่งออกเป็นช่องสำหรับเก็บของ ส่วนอาร์เรย์ 2 มิติ ก็เปรียบเสมือนตู้ล็อกเกอร์ที่ใช้ในมหาวิทยาลัยหรือตามสนามกีฬาที่มีหลายแถวแต่ละแถวมีหลายช่อง

            การสร้างอาร์เรย์สองมิติ หากประกาศให้ตัวแปรอาร์เรย์เก็บข้อมูลประเภทใดทั้งอาร์เรย์ก็จะเก็บแต่ข้อมูลที่เป็นตัวแปรประเภทนั้น เช่น การสร้างอาร์เรย์ xx ขนาด 2×4(2แถวแนวตั้ง 4แถวแนวนอน) ให้เป็น int ก็ประกาศว่า

int [][]xx = new int[2][4];

หรือจะประกาศอาร์เรย์แบบกำหนดค่าเริ่มต้นก็ทำดังนี้

int [][]xx = {{7, 8, 4, 9},

       {9, 2, 3, 6}};

 

รูป 5-1-1

สำหรับดัชนีของอาร์เรย์สองมิติต้องระบุแถวแนวนอนคู่กับแถวแนวตั้ง เช่น เลข 7 ถูกเก็บอยู่ที่ช่อง xx[0][0] แถวที่ 0 ช่องที่ 0 ส่วน ช่องที่xx[1][2] เก็บค่า 3 เอาไว้ การตรวจสอบดัชนีมีความสำคัญเพราะถ้าเรียกผิดหรือเกินจำนวนช่องจำทำให้เกิด error ในจาวาสามารถใช้ .length เพราะใช้แทนขนาดอาร์เรย์ เช่น xx.length จะเป็นจำนวนของแถวแนวตั้ง ส่วนxx[0].length จะเป็นแถวแนวนอน และเวลาที่เขียนลูปเพื่อรับค่าเข้าหรือแสดงค่าออกของอาร์เรย์สองมิติจะต้องใช้ลูปวน 2 ชั้น

 

รูป 5-1-2

บรรทัดที่ 6 : ประกาศตัวแปร x เป็นอาร์เรย์สองมิติมี 4 แถวแนวตั้ง 5 แถวแนวนอน

บรรทัดที่ 8 : วนลูปชั้นแรกใช้เปลี่ยนแปลงตามแถวแนวตั้ง โดยมีค่าเริ่มต้นที่ 0 วนเท่าขนาดของ x โดยใช้

x.length

บรรทัดที่ 10 : วนลูปชั้นที่สองใช้เปลี่ยนแปลงตามแถวแนวนอน โดยมีค่าเริ่มต้นที่ 0 วนเท่าขนาดของ x[0] โดยใช้x[0].length

บรรทัดที่ 12 : เอาตัวแปรของลูป i และ j มาใส่ในช่องอาร์เรย์ของ x จากนั้นทำการแรนดอมเลขมาใส่

บรรทัดที่ 13 : แสดงค่าอาร์เรย์ออกทางหน้าจอ “\t” เพื่อทำการ tab เลขที่อยู่ติกันให้ห่างกันจะได้เหมือนกับรูป

ของอาร์เรย์

บรรทัดที่ 15 : เมื่อออกจากลูปของแถวแนวนอนในขึ้นบรรทัดใหม่ อาร์เรย์จะได้ไม่เรียงต่อกันเป็นแถวเดียว

ผลลัพธ์ที่ได้

 

รูป 5-1-3

 

คลาสสำหรับอาร์เรย์จาวา

            สิ่งที่ทำกับอาร์เรย์บ่อยๆก็จะมี การค้นหา การเรียงลำดับ การเปลี่ยนอาร์เรย์เป็นสตริง ซึ่งในจาวาก็มีคลาสที่ทำให้ไม่ต้องเขียนโค๊ดพวกนี้เอง ซึ่งอยู่ในคลาส java.util.Arrays ต้อง import มา

            binarySearch(a,x) จะเป็นหารค้นหาว่า x คือคีย์(key)หรือเลขที่เราต้องรู้ว่าอยู่ตรงไหน อยู่ดัชนีไหนในอาร์เรย์ คลาสที่จะค้นด้วยวิธี binary search

 

รูป 5-1-4

บรรทัดที่ 9 : ประกาศอาร์เรย์ที่เรียงลำดับแล้ว

บรรทัดที่ 10 : ใช้ binarySearch เพื่อหาตำแหน่ง ซึ่งจากตัวอย่างจะได้ 2 แต่ถ้าไม่มีลขนั้นอยู่ในอาร์เรย์จะคืนค่าเป็นลบ

            equals(a,b) ใช้ในการตรวจสอบอาร์เรย์แต่ละอาร์เรย์เหมือนกันหรือไม่ ซึ่งข้อมูลจะต้องเหมือนกันทั้งหมดถึงจะได้ค่า true ถ้าไม่เหมือนกันจะได้ค่า false

 

1.     

รูป 5-1-5

            sort(a) เอาสำหรับเรียงรำดับข้อมูลในอาร์เรย์ ส่วน toString(a) ช่วยเปลี่ยนอาร์เรย์ให้แสดงออกในรูปแบบของสตริงหรือข้อความ

 

รูป 5-1-6

ผลลัพธ์ที่ได้

 

รูป 5-1-7

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

6. ฟังก์ชัน(Function)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

6. ฟังก์ชัน(Function)

            ฟังก์ชันหรือเรียกอีกชื่อหนึ่งว่าเมท็อด(method) มีความสำคัญต่อการเขียนโปรแกรมมากเพราะช่วยในการนำส่วนของโปรแกรมที่มีการทำงานซ้ำๆแยกออกมาเป็นส่วนย่อยๆ ช่วยลดความซ้ำซ้อนของโค๊ดภายในโปรแกรมและทำให้อ่านง่ายด้วย

เรื่องทั่วไปของเมท็อด

            จริงๆก่อนหน้าที่จะสังเกตเห็นว่าเราได้มีการใช้งานเมท็อดอยู่แล้วนั่นก็คือเมท็อด main ซึ่งมีความสำคัญคือการเป็นจุดเริ่มต้นการทำงานของโปรแกรม เพราะเป็นสิ่งที่จาวากำหนดมา โดยในตอนแรกๆที่เริ่มเขียนโปรแกรมเราจะเขียนทุกอย่างลงไปใน main แต่ถ้าเขียนไปเรื่อยๆจะพบว่าการเขียนใน main อย่างเดียวนั้น โปรแกรมจะยาวมากๆและเมื่อเกิด error ขึ้น ก็อาจจะทำให้การแก้ไขเกิดความลำบาก ดังนั้นการนำเมท็อดเข้ามาช่วยจะทำให้เป็นการลดความซับซ้อนในตรงนี้ลงไป เพราะเมท็อดจะนำสิ่งที่ใช้บ่อยๆแยกออกมาเขียนต่างหาก สำหรับการตั้งชื่อของเมท็อดนิยมตั้งชื่อที่เป็นคำกริยาที่สื่อความหมายเพราะว่าเมท็อดก็คือฟังก์ชัน ฟังก์ชันก็คือการทำงานพอเป็นเรื่องเกี่ยวกับการทำๆจึงตั้งชื่อคำกริยา เช่น getName, setName, random, paint เป็นต้น

ตัวอย่างของฟังก์ชัน

            โปรแกรมต่อไปนี้จะเป็นโปรแกรมเพื่อหาผลบวกและผลลบของเลขสองจำนวน โดยให้รับตัวเลขเข้าจากทางแป้นพิมพ์จากนั้นให้คำนวณหาเลขผลบวกและผลลบของจำนวนที่ให้มา

 

รูป 6-1

บรรทัดที่ 6-11 : การเขียนฟังก์ชันจะวางไว้บนหรือล่างของเมท็อด main ก็ได้ ที่หัวเมท็อด readInt

ในบรรทัดที่ 6 จะ มีปุ่มที่เป็นเครื่องหมายขีดลบอยู่ข้างๆ เมื่อกดจะเป็นการหุบเมท็อดนั้นเอาไว้เพื่อให้อ่านโค๊ดได้ง่ายๆเราอาจหุบเมท็อดที่เขียนเสร็จแล้วเอาไว้จะได้ใส่ใจกับเมท็อดที่เหลือได้เลย โดนเมท็อด readInt จะ ทำหน้าที่ในการแสดงข้อความออกทางหน้าจอเพื่อให้ผู้ใช้ใส่ข้อมูลและการรับข้อมูลจากแป้นพิมพ์ มาใส่ตัวแปล value จากนั้นก็ส่งค่า (return) value กลับไปที่ที่เรียกเมท็อดนี้

บรรทัดที่ 12-17 : เมท็อด add จะทำหน้าที่ในการบวกข้อมูล จากนั้นจึงส่งค่าผลรวมกลับไปยังที่ที่

เรียกเมท็อดนี้

บรรทัดที่ 18-24 : เช่นเดียวกับ add แต่จะทำหน้าที่ลบ

บรรทัดที่ 25 : ภายในเมท็อด main จะมีการทำงานดังนี้

บรรทัดที่ 27 : ประกาศตัวแปร sc เป็น Scanner โดยที่บรรทัดที่ 28 ประกาศอีกตัวแปรนึงเป็น int และเรียกใช้

เมท็อด readInt เพื่อเก็บค่าจากทางแป้นพิมพ์ การทำงานของโปรแกรมก็จะกระโดดไปทำบรรทัดที่ 8-

10 จากนั้นจึงกลับมาที่ บรรทัดที่ 28 อีกครั้งเพื่อทำบรรทัดต่อไป

บรรทัดที่ 29 : ประกาศอีกตัวแปรเพื่อรับเลขจำนวนที่สองที่ใช้สำหรับการคำนวณ และจะทำแบบเดียวกับ

บรรทัดที่ 27

บรรทัดที่ 31 : เรียกใช้เมท็อด add

บรรทัดที่ 32 :  เรียกใช้เมท็อด minus

ผลลัพธ์ที่ได้

 

รูป6-2

            ดูโดยผิวเผินจะคิดว่าการเขียนโดยใช้ฟังก์ชันนั้นยาวแต่เมื่อเปรียบเทียบกับการเขียนปกติจะพบว่าการเขียนด้วยฟังค์ชันนั้นทำให้ดูง่ายขึ้นคือเราสามารถที่จะดูที่เมท็อดได้เลยเพื่อจะรู้ว่าโปรแกรมนี้ต้องการทำงานอะไรบ้าง

รายละเอียดเมท็อด

            รายละเอียดของเมท็อดที่สำคัญๆมีอยู่ 3 เรื่อง คือการเขียนหัวของเมท็อด ตัวของเมท็อดและการเรียกใช้งานเมท็อดให้ถูกวิธี

หัวเมท็อด

            สิ่งที่สำคัญในส่วนหัวของเมท็อดก็คือ ประเภทของผลลัพธ์ที่จะส่งออกไป ชื่อเมท็อดแล้วก็พารามิเตอร์ที่จะรับเข้ามาสู่เมท็อด มีรูปแบบดังนี้

            Public static ประเภทของลัพธ์ ชื่อเมท็อด (พารามิเตอร์ที่เข้าเมท็อด)

–          ชื่อของเมท็อดก็คือชื่อที่ใช้ระบุว่าเมท็อดนี้ทำงานอะไร การตั้งชื่อเหมือนกับการตั้งชื่อตัวแปรแต่นิยมใช้คำกริยาสำหรับบอกว่าเมท็อดจะทำอะไร บางทีก็ตั้งเป็นคำนาม แต่การตั้งเป็นคำนามจะนิยมใช้สำหรับการคืนค่าของนามนั้นออกไปเช่น x, width แต่บางคนก็พยายามตั้งเป็นคำกริยาเช่น getWidth, getX

–          ประเภทองผลลัพธ์คือเมื่อเมท็อดทำงานเสร็จจำให้คืนค่าอะไรออกไปก็ให้ตั้งให้ตรงกับที่จะสิ่งออกไป เช่นในเมท็อด add ของบน ต้องคืนผลลัพธ์ที่ได้จากการบวกตัวเลขจำนวนเต็มสองจำนวนดังนั้นก็ต้องคืนค่าผลลัพธ์ที่เป็นจำนวนเต็ม จึงมีคำว่า int หน้าชื่อเมท็อด add

–          พารามิเตอร์(parameter) คือตัวแปรที่รับเข้ามาจากที่ๆเรียกเมท็อดเพื่อให้มาประมวลผลภายในเมท็อด ดังนั้นถ้ามีหลายๆเมท็อดที่ชื่อเหมือนกันโปรแกรมจะเลือกเมท็อดที่พารามิเตอร์ตรงกับเมท็อดนั้นๆ เรียกว่า overloading

 

รูป 6-3

จากในรูปมีเมท็อด add สองอันแต่รับพารามิเตอร์คนละตัวดังนั้นถ้ามีการเรียกใช้โปรแกรมๆจะดูว่าเมท็อดไหนรับพารามิเตอร์แบบไหนแล้วจะส่งการทำงานไปที่เมท็อดนั้นๆ ดังนั้นในบรรทัดที่ 23 จะส่งการทำงานไปที่บรรทัดที่ 11 ส่วนบรรทัดที่ 28 จะส่งการทำงานไปที่บรรทัดที่ 6

ตัวเมท็อด

            ตัวเมท็อดคือส่วนที่เขียนอยู่ระหว่าง { และ } ภายใต้หัวของเมท็อด หลังจากการทำงานของเมท็อดเสร็จเรียบร้อยก็จะกลับไปทำงานคำสั่งต่อไปใน main ต่อ

–          ภายในตัวเมท็อดหากเราทำการประกาศตัวแปร ตัวแปรนั้นจะเป็นของเมท็อดๆนั้นเท่านั้น ไม่สามารถนำไปใช้ที่อื่นได้ เรียกว่า ตัวแปรเฉพาะที่(local variable) ซึ่งตัวแปรเฉพาะที่ชื่อเหมือนกันแต่อยู่กันคนละเมท็อดก็ถือว่าเป็นคนละตัวแปรเลยไม่เกี่ยวข้องกัน

–          ถ้าเมท็อดมีผลลัพธ์ที่ต้องคืนค่าออกไป จะต้องมีคำสั่ง return x; ซึ่งตัวแปร x จะต้องเป็นตัวแปรประเภทเดียวกันกับประเภทของตัวแปรที่จะคืนค่าออกไป แต่ถ้าไม่มีการคืนค่าออกไปเมท็อดจะสิ้นสุดการทำงานที่เครื่องปิดของ } พอดี

 

รูป 6-4

บรรทัดที่ 17 : ใช้เมท็อด f โดยให้ประเภทตัวแปรที่คืนค่าออกไปเป็น double แต่เมื่อ บรรทัดที่ 19 คืนค่าของไป

เป็น int จะเปลี่ยนเป็น double ให้อัตโนมัติ

บรรทัดที่ 23 : ใช้เมท็อด f โดยให้ประเภทตัวแปรที่คืนค่าออกไปเป็น int แต่เมื่อต้องการคืนค่าคืนเป็น

double(0.0) โปรแกรมจะ error เพราะไม่สามารถเปลี่ยนค่าจาก double  เป็น int ได้

ดังนั้นการต้องคืนค่าประเภทเดียวกันกับประเภทของตัวแปรที่จะคืนค่าออกไป

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

6.1 ฟังก์ชัน(ต่อ)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

6.1 ฟังก์ชัน(ต่อ)

ต่อไปนี้จะเป็นการพูดถึงในส่วนที่เหลือที่เกี่ยวข้องกับฟังก์ชัน ได้แก่ การเรียกใช้ฟังก์ชันทั้งจากภายในคลาสเดียวกันและจากต่างคลาสกัน อีกเรื่องได้ฟังก์ชันเรียกซ้ำ(recursive function)

Pass-by-value และ Pass-by-reference

            เนื่องจากการเรียกใช้ฟังก์ชันจะมีวิธีการที่ต้องเรียกเมท็อดแบบสร้าง reference ดังนั้นจะขออธิบายเรื่อง pass-by-value และ pass-by-reference ก่อน

Pass-by-value เป็นเรื่องของการส่งค่าระหว่างตัวแปรของประเภทข้อมูลชนิดต่างๆ ซึ่งจริงๆก็เป็นการส่งค่าตัวแปรแบบธรรมดาอย่างที่ได้ทำกันมาแล้ว เช่น a = 1; b = 6; a = b;    ผลลัพธ์ a =6; เป็นต้น เพราะฉะนั้นเครื่องหมาย = จึงมีความหมายว่าเอาค่าทางขวาไปใส่ทางซ้าย

ส่วน pass-by-reference มีความพิเศษกว่าแบบบนตรงที่เป็นเรื่องเกี่ยวกับอ็อปเจ็คด้วย เป็นเรื่องเกี่ยวกับการชี้[1](ด้วยเครื่องหมาย = ) กล่าวคือ เครื่องหมาย = จะมีความหมายว่าค่าทางซ้ายและค่าทางขวาชี้ไปที่อ็อปเจ็คเดียวกัน ค่าก็จะเหมือนกันด้วย

ตัวอย่างของ pass-by-reference

 

รูป 6-1

บรรทัดที่ 11 : สร้างตัวแปร x1 เป็นอ็อปเจ็คของคลาส StudyReference โดยกำหนดตัวแปรใน () เป็น 1

บรรทัดที่ 12 : สร้างตัวแปร x2 เป็นอ็อปเจ็คของคลาส StudyReference โดยกำหนดตัวแปร เป็น null หรือว่าง

เปล่า ถ้าสั่งแสดงผลของ x2 เลยันที จะเกิด java.lang.NullPointerException

บรรทัดที่ 14 : สั่งแสดงผลค่าของ x1

บรรทัดที่ 16 : ให้ x2 ชี้ไปยังอ็อปเจ็คที่ x1 ชี้อยู่

บรรทัดที่ 17 : ให้ x1 ชี้ไปยังอ็อปเจ็คใหม่คือเลข 25

บรรทัดที่ 19 : ให้แสดงค่าของ x1 ที่ชี้ไปที่อ็อปเจ็คใหม่ออกมา

บรรทัดที่ 20 : เนื่องจาก x2 ชี้ไปสิ่งเดียวกันกับที่ x1 ชี้อยู่ ดังนั้นเมื่อ x1 ชี้ไปสิ่งใหม่ x2 ก็จะต้องเปลี่ยนสิ่งที่ชี้ไป

ตาม x1 ด้วย ดังนั้น x2 จะต้องได้แสดงค่า 25

ผลลัพธ์ที่ได้

 

รูป 6-2

การเรียกใช้เมท็อด

            การเรียกใช้งานฟังก์ชัน จะต้องทำการพิมพ์ชื่อฟังก์ชันและใส่พารามิเตอร์ที่ถูกต้องกันกับฟังก์ชันนั้นไว้ใน ( ) ดังนี้

ชื่อเมท็อดที่ต้องการเรียกใช้(พารามิเตอร์);

สิ่งที่ต้องต้องรู้คือ

–          เวลาที่เราส่งค่าพารามิเตอร์ไปให้เมท็อด ค่านั้นจะเป็นค่าเริ่มต้นของเมท็อดทันทีโดยแม้เมท็อดจะกำหนดค่าใหม่ก็ไม่ได้มีผลอะไร

 

รูป 6-1-1

บรรทัดที่ 6-7 : ตั้งค่าเริ่มต้นให้กับตัวแปร a และ b

บรรทัดที่ 9-10 : เรียกใช้เมท็อด set ที่รับพารามิเตอร์เป็นตัวแปรจำนวนเต็ม ใส่พารามิเตอร์เป็นตัว

แปร a และ b ลงไป

บรรทัดที่ 18 : ภายในเมท็อด set รับพารามิเตอร์เป็นตัวแปร b และตั้งค่า b เป็น 0

ผลลัพธ์ที่ได้

 

รูป 6-1-2

            จะเห็นได้ว่าผลลัพธ์ที่ได้ยังเป็นเลขที่ส่งออกไปตั้งแต่แรกคือ a = 25 และ b = 60 การที่ทั้ง aและ b ไม่เกิดการเปลี่ยนแปลงก็เพราะว่าเมท็อดจะรับค่าตั้งต้นเป็นพารามิเตอร์จากจุดที่มีการเรียกใช้เมท็อด การเปลี่ยนแปลงที่เกิดขึ้นจากการตั้งค่าใหม่ในเมท็อดก็จะไม่เปลี่ยนค่าของตัวแปรไป และอีกประการคือตัวแปร b ที่กำหนดที่เมท็อด set ก็ถือว่าเป็นคนละตัวกับตัวแปร b  ที่อยู่ในmain ด้วย

การเรียกใช้เมท็อดในคลาสอีกแบบคือการเรียกเมท็อดแบบสร้าง reference แบบที่ได้พูดถึงข้างบน

 

รูป6-1-3

บรรทัดที่ 8 : ประกาศตัวแปร x เป็นตัวแปรไม่ธรรมดา

บรรทัดที่ 9 : ให้ x เรียกเมท็อด print มาใส่ตัวเอง จากนั้นนำค่าไปเก็บใส่ a

การเรียกใช้เมท็อดต่างคลาสกัน

            ในกรณีที่เราเขียนโปรแกรมที่มีขนาดใหญ่ๆซึ่งประกอบไปหลายๆคลาส บางครั้งเราก็ต้องการทำงานที่เหมือนๆกัน เช่น ในคลาส a เราเขียนเมท็อดสำหรับการบวก แต่เมื่อเราเขียนคลาส b เราก็ต้องการใช้งานเมท็อดสำหรับการบวกอีก ในจาวาสามารถที่จะเรียกใช้งานเมท็อดการบวกในคลาส a มาใช้ในคลาส b ได้เลยโดยไม่ต้องเขียนเมท็อดสำหรับการบวกใหม่ หรือก็คือของต่างคลาสกันสามารถใช้งานกันได้เพื่อจะได้ไม่ต้องเขียนเมท็อดเดิมเพิ่มขึ้นมาอีกครั้งหนึ่ง

แบบที่ 1 สร้างตัวแปรไม่ธรรมดา

class xx

{

               public static void main(String args[]) {

               ชื่อคลาสที่เมท็อดนั้นอยู่  a = new ชื่อคลาสที่เมท็อดนั้นอยู่();

  }

}

 

หรืออาจเรียกใช้งานได้โดย การ new ขึ้นมาเลย

class xx
{
                public static void main(String args[]) {
                new ชื่อคลาสที่เมท็อดนั้นอยู่  ();
  }
}

 

 เมื่อสร้างตัวแปรของคลาสนั้นมาแล้วทำให้เครื่องหมาย “.”  เพื่อ

class xx
{
               public static void main(String args[]) {
                ชื่อคลาสที่เมท็อดนั้นอยู่    a = new ชื่อคลาสที่เมท็อดนั้นอยู่  ();
               a.เมท็อดที่ต้องการเรียกใช้();
  }

ฟังก์ชันเรียกซ้ำ(Recursive function)

            การเขียนฟังก์ชันมากๆ บางครั้งก็มีการเรียกใช้งานกันไปมาเช่น ฟังก์ชัน a เรียก ฟังก์ชัน b แต่ในฟังชัน b ก็มีการเรียกใช้งาน a และก็เป็นไปได้ที่ฟังก์ชันจะมีการเรียกตัวเองให้ทำงาน

 

ตัวอย่างการหาจำนวนฟิโบนัคชี(Fibonacci number) ด้วยการเขียนฟังก์ชันแบบเรียกซ้ำ

 

รูป 6-1-4

ในเมท็อด main ทำการวนลูปจาก 0-10 และเรียกใช้ฟังก์ชัน fibo เพื่อคำนวณหาเลขฟิโบนัคชี การเรียกซ้ำอยู่ตรงที่ บรรทัดที่ 19 จะให้หาค่าจนกว่าจะได้ตามที่เขียน ถ้าเขียนเมท็อดนี้ด้วย ลูปก็ได้แต่จะยาวและดูยากมาก

ผลลัพธ์จำนวนฟิโบนัคชี 10 ตัวแรก

 

รูป 6-1-5

 


[1] การชี้หมายถึงชี้ยัง memory ที่ตัวแปรจองตำแหน่งไว้ใน heap memory

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

7. อ็อปเจ็ค(Objects)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

7. อ็อปเจ็ค(Objects)

            เรื่องอ็อปเจ็คเป็นเรื่องต่อเนื่องกับเรื่องฟังก์ชัน ต่อไปนี้จะพูดถึงเรื่องคลาสกับอ็อปเจ็คซึ่งเป็นเรื่องสำคัญสำหรับภาษาจาวา

คลาส(Class)

            เป็นเหมือนแบบร่างของวัตถุ เป็นเหมือนแปลนหรือแบบของบ้านเวลาจะสร้างบ้าน แต่แบบบ้านไม่ใช่บ้านจริงๆถ้าอยากอยู่ในบ้านได้จริงๆก็ต้องสร้างบ้านตามแบบแปลนขึ้นมาก่อน คลาสก็เช่นเดียวกันเป็นแบบแปลนที่เก็บข้อมูล เมท็อดว่าจะทำงานอะไรบ้าง สำหรับรอการสร้างเป็นอ็อปเจ็คที่สามารถใช้งานได้จริง

รูปแบบของคลาส

(modifier) class ชื่อคลาส[1] {

ประกาศตัวแปรคลาส

เมท็อดต่างๆของคลาส

}

ตัวแปรคลาส

            ตัวแปรจะเป็นตัวกำหนดลักษณะ ต้องประกาศภายในวงเล็บของคลาส

modifier ชนิดข้อมูล ชื่อตัวแปรคลาส;

เช่น

                public class Student  {

                        public int Stu_Id

public String name

private String phone

}

อ็อปเจ็ค(Object)

เป็นสิ่งที่สร้างขึ้นมาจากแบบแปลที่วางไว้ก็คือการทำให้แบบแปลนสามารถใช้งานได้จริงๆ ซึ่งอ็อปเจ็คจะมีสมบัติอยู่ 2 อย่าง อย่างแรกก็คือ ลักษณะ(attribute หรือ data) ก็คือรูปร่าง ลักษณะของวัตถุ และ สิ่งที่ทำได้(behavior หรือ method) ก็คือความสามารถของวัตถุ

ตัวอย่างเช่น หากเราจะสร้างหุ่นยนต์ขึ้นมา ก็ต้องมีการกำหนดรูปร่างหน้าตาขอหุ่นยนต์ หุ่นยนต์กู้ซากปรักหักพังก็จะมีหน้าตาต่างกับหุ่นยนต์ที่เป็นโอเปอเรเตอร์ต้อนรับคนหน้าโรงแรม ซึ่งเราก็ต้องกำหนดว่าจะมีสี มีรูปร่าง อย่างไร ส่วนการทำงานก็เช่น จะเก็บของอะไรบ้าง จะกระโดข้ามสิ่งกีดขวางหรือบุกไปเลย

หรืออีกตัวอย่างก็เช่นเวลาต้องการสร้างอ็อปเจ็คของพนักงานบริษัท พนักงานบริษัทก็ต้องประกอบไปด้วยคุณลักษณะคือมีรหัสพนักงาน ชื่อ นามสกุล ตำแหน่ง เงินเดือน และเมท็อดหรือสิ่งที่ทำก็เช่นการรับเงินเดือน เป็นต้น

การประกาศตัวแปรอ็อปเจ็ค

ชื่อคลาส ตัวแปรอ็อปเจ็ค ;

Student student;

การสร้างอ็อปเจ็ค

new ชื่อคลาส(พารามิเตอร์);

new Student();

หรือจะประกาศไว้ในบรรทัดเดียวกันก็ได้

Student student = new Student();

            เมื่อทำการประกาศตัวแปรอ็อปเจ็คถึงตรงนี้ก็จะทำให้มีอ็อปเจ็คที่สร้างขึ้นมามีคุณลักษณะและการทำงานแบบเดียวกับที่ตัวแปรคลาสและเมท็อดได้กำหนดเอาไว้ โดยที่มี student เป็นตัวอ้างอิงอ็อปเจ็คประเภท Student (เวลาเราสร้างคลาสก็จะถือว่าคลาสนั้นเป้นตัวแปรแบบพิเศษเหมือนพวก Array ก็เลยสร้างด้วยการ new ขึ้นมาได้)

การใช้ตัวแปรและเมท็อดประจำอ็อปเจ็ค

            เวลาที่สร้างตัวแปรแปรอ้างอิงอ็อปเจ็คขึ้นมาแล้ว ก็ต้องมีการเรียกใช้ตัวแปรและเมท็อด กล่าวคือ ตัวแปรอ็อปที่สร้างอ็อปเจ็คขึ้นมาจะทำให้อ็อปเจ็คมีรูปร่างหน้าตาและทำงานได้แบบในคลาส เช่น คลาส Student นักเรียน กำหนดว่านักเรียนมีรูปร่างเป็นน้ำหนักกับความสูง มีเมท็อดคือการรับเวลาเข้า-ออกโรงเรียน  พอสร้างตัวชี้อ็อปเจ็ค student ขึ้นมา student ก็จะมีน้ำหนักและส่วนสูงได้ แต่ยังไม่ได้บอกว่าเท่าไหร่ ทีนี้ถ้าจะกำหนดค่าน้ำหนักและส่วนสูงให้ student ก็ต้องกำหนดว่าให้น้ำหนักของ student เป็นเท่าๆไหร่  โดยการใช้เครื่องหมาย . (dot operator)ต่อด้วยตัวแปรประจำอ็อปเจ็ค

ตัวแปรอ้างอิงอ็อปเจ็ค. ชื่อตัวแปรประจำอ็อปเจ็ค

เช่น สมมติจะให้ h เก็บความสูง ก็เขียน student. h (อ่าน . ว่าของ ในที่นี้อ่านว่า h ของ student) student. h = 165 เป็นต้น

ในทำนองเดียวกนหากจะให้ตัวแปรอ็อปเจ็คเรียกเมท็อดก็ให้ใช้ เครื่องหมาย .

ตัวแปรอ้างอิงอ็อปเจ็ค. ชื่อเมท็อด();

 

รูป7-1

สร้างคลาสใหม่ขึ้นมาหนึ่งคลาสประกอบด้วยตัวแปรคลาส 3 ตัวคือ width, height, depth ให้เป็น double พร้อมด้วยเมท็อด volume ที่ทำหน้าที่คำนวณและคืนค่าออกไป สังเกตว่าตัวแปรเป็น double เมื่อเอาคำนวณก็ต้องคืนค่า double ออกไป

 

รูป 7-2

            หลังจากนั้นสร้างขึ้นมาอีก 1 คลาส

บรรทัดที่ 6 : สร้างตัวแปรอ้างอิงอ็อปเจ็ค box1 อ้างอิงตัวแปรประเภท Box

บรรทัดที่ 7 : สร้างตัวแปรอ้างอิงอ็อปเจ็ค box2 อ้างอิงตัวแปรประเภท Box

บรรทัดที่ 9-11 : กำหนดค่าตัวแปรคลาสของอ็อปเจ็ค box1 ด้วย . (dot operator)กลายเป็น width ของ box1

คือ 9

บรรทัดที่ 13-15 : กำหนดค่าตัวแปรคลาสของอ็อปเจ็ค box2 ด้วย . (dot operator) กลายเป็น depth ของ

box2 คือ 12

บรรทัดที่ 17 : ให้แสดงผลออกทางหน้าจอ โดยให้เอาค่าจากการคำนวณของเมท็อด volume มาแสดง ก็ใช้วิธี

เดียวกับตัวแปรคือใช้เครื่องหมาย . เรียกเมท็อด เมื่อทำการ .volume ขึ้นมา width, height, depth ของ box1 จะถูกนำไปคำนวณ

บรรทัดที่ 19 : ให้แสดงผลออกทางหน้าจอ โดยให้เอาค่าจากการคำนวณของเมท็อด volume ของ box 2 มา

แสดง

จะเห็นได้ว่าตอนที่เรียกเมท็อด volume เรียกจากอ็อปเจ็คคนละตัวคือ box1 และ box2 ดังนั้นแม้ในเมท็อด volme จะเขียนว่า width * height * depth แต่ก็จะเป็นค่า width, height, depthที่มาจากคนละค่ากัน ผลลัพธ์ก็จะไม่เหมือนกัน

ผลลัพธ์ที่ได้

 

รูป7-3

            นี่ก็คือตัวอย่างของคลาสและอ็อปเจ็ค คลาส Box ประกอบไปด้วยตัวแปรและมีเมท็อดที่ทำหน้าที่คำนวณ เมื่อสร้างคลาส BoxTest ขึ้นมา ก็สร้างอ็อปเจ็คขึ้นมาโดยที่อ็อปเจ็คนั้นจะใช้ตัวแปรและมีการทำงานแบบที่คลาสกำหนดไว้เลย

Modifier

            มี 2 แบบคือ access modifier กับ non- access modifier แต่จะพูดแค่ access modifier ก็คือสิ่งที่ประกาศไว้เพื่อระบุถึงการถูกเข้าถึง จะประกาศหน้าคลาส เมท็อดหรือตัวแปรคลาส ซึ่งได้แก่ public, protected, private และ package (แต่ protected และ private ใช้หน้าคลาสไม่ได้) ที่ได้เห็นกันมาตั้งแต่ในเมท็อด main ตรงด้านหน้า public static void main(String [] args)

            เป็นส่วนหนึ่งของเรื่อง OOP เรื่อง encapsulation ทำหน้าที่ในห่อหุ้มข้อมูลไม่ให้ถูกเห็นหรือเรียกใช้งานได้จากภายนอก ดังนั้นข้อมูลก็จะไม่ถูกแก้ไข

 

รูป 7-4

อธิบายรูป

public – ถ้าประกาศ public หน้าคลาส เมท็อด ตัวแปรคลาสใด คือคลาสอื่นๆจะสามารถนำไปใช้ได้อย่าง

อิสระ

protected – สามารถใช้ได้กับคลาสเดียวกัน package เดียวกัน และ คลาสที่เป็นแม่ลูกกัน แต่กับ package

อื่นๆจะไม่สามารถเรียกใช้ได้

private – จะปิดการเข้าถึงจากภายนอกทั้งหมด (ใช้กับ recursive ฟังก์ชัน)

 

เกี่ยวกับเมท็อดเพิ่มเติม

            เวลาที่กำหนด modifier เป็น private ให้กับตัวแปรคลาส คลาสอื่นเวลาเรียกตัวแปรนี้เอาไปใช้ก็เปลี่ยนแปลงอะไรไม่ได้ แต่ผู้เขียนโปรแกรมก็ต้องใช้วิธีอื่นสำหรับให้ผู้อื่นเปลี่ยนแปลงค่าของตัวแปรเหล่านั้น โดยใช้วิธี Accessor Method กับ Mutator Method

            Accessor Method ใช้ดึงค่าจากตัวแปรคลาสแล้วส่งออกไปนอกเมท็อด ใช้คำว่า getตามด้วยตัวแปรที่ถูกตั้งเป็น private

Mutator Method เมท็อดสำหรับการเปลี่ยนแปลงแก้ไข ใช้คำว่า set ตามด้วยตัวแปรที่ถูกตั้งเป็น private

 

รูป 7-5

สร้างคลาสหนึ่งขึ้นมา สร้างตัวแปรที่เป็น private คือไม่สามารถเปลี่ยนแปลงค่าที่ให้ได้ แต่ก็ให้เมท็อดสำหรับการเปลี่ยนค่าด้วย

บรรทัดที่ 6 : เมท็อด setNumber สำหรับรับเลขที่เป็น int เข้ามาแล้วไปเก็บไว้ในตัวแปร number

บรรทัดที่ 7 : เมท็อด getNumber สำหรับการส่งค่าของเมท็อดที่แก้ไขแล้วออกไป

 

รูป7-6

บรรทัดที่ 6 : สร้างอ็อปเจ็คเพื่อเรียกใช้สิ่งต่างๆจากคลาส Number

บรรทัดที่ 11 : ให้แสดงค่าของ x ซึ่งเป็นค่าเดียวกับ number ที่ getNumber มา ต้องเป็น 5

บรรทัดที่ 13 : ใช้ เมท็อด setNumber เพื่อเปลี่ยนแปลงค่าให้ให้เป็น 26

บรรทัดที่ 14 : ใช้เมท็อด getNumber อีกครั้งเพื่อแสดงค่าที่เปลี่ยนแปลงแล้วออกมา

ผลลัพธ์

 

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

8. สตริง(String)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

8. สตริง(String)

            สตริงใช้สำหรับเก็บตัวอักษร ตัวเลข ทำให้เข้าใจได้ง่ายมากขึ้นเพราะปกติคอมพิวเตอร์จะทำงานด้วยตัวเลข แต่มนุษย์สื่อสารด้วยตัวหนังสือ สตริงจะมีเครื่องหมายเปิด ปิดคือ “ และ ” เช่น “Hello World” สตริงจะทำการเรียงตัวอักษรต่อกันในหน่วยความจำ อย่างเช่น “Hello World” จะถือว่ามีสตริงอยู่ 11 ตัว โดยดัชนี(index)เริ่มต้นที่ 0

เมท็อดในสตริง

            นอกเหนือจากเมท็อดที่สตริงมีให้ยังมีเรื่องเครื่องหมาย + ที่ได้เขียนกันมาแล้ว เครื่องหมาย + ในจาวานอกจากจะหมายถึง บวก ในตัวดำเนินการ ยังหมายถึงการต่อสตริงด้วย  เช่น System.out.println(“สวัสดีคุณ ”+name)  หมายถึงเอาสตริงของตัวแปร name ไปต่อกับสตริงที่อยู่ใน ( )

นอกจากนี้ในสตริงยังมีเมท็อดสำหรับการใช้งานซึ่งเมท็อดที่สำคัญๆและใช้งานบ่อยๆมีดังนี้

String s;

s.length( ) คือขนาดของสตริง จำนวนตัวอักษรทั้งหมด เช่น Hello มี length 5 ตัวอักษร

s.trim( ) ใช้สำหรับตัดช่องว่างด้านหน้าและด้านหลังสตริง คือเวลาที่ทำกล่องให้กรอกข้อมูลบางครั้งผู้กรอกข้อมูลอาจใส่ช่องว่างโดยที่ไม่ได้ตั้งใจ การตัดช่องว่างออกจะทำให้การประมวลผลเข้าใจได้ง่าย เช่น เวลานับตัวอักษรบนสตริงก็จะไม่งง

s.substring( i, j ) เอาสับสตริงตัวที่ i ถึง j-1 ออกมาจากสตริง เช่น Hello substring(2, 5) จะได้สับสตริง ell คือ e เป็นตัวที่ 2 ส่วน l เป็นตัวที่ 3 และ l อีกตัวเป็นตัวที่ j-1 คือ 5-1 = 4 ของสตริง

s.indexOf( t, i ) หาตัวอีกษรหรือข้อความ t โดยเริ่มหาจากตัวที่ i ใช้ในกรณีที่ต้องการหาคำบางคำและอาจจะตัดคำๆนั้นด้วย substring เอาไปใช้งานต่อ

s.equals( t ) ถ้า s เหมือนกับ t ทุกประการให้คืนค่าจริง

s.equalsIgnoreCase( t ) ถ้า s เหมือนกับ t ทุกประการให้คืนค่าจริงโดยไม่สนว่าจะตัวใหญ่เล็กไม่เหมือนกัน ถ้าข้างบนคือตัว T t ถือว่าเป็นคนละตัวเลย

s.toUpperCase( ) เปลี่ยนทุกตัวในสตริงให้เป็นตัวอักษรใหญ่(capital letter)

s.toLowerCase( ) เปลี่ยนทุกตัวในสตริงให้เป็นตัวอักษรเล็ก(small letter)

ข้อมูลประเภท char

char จะเป็นการเก็บข้อมูลแค่ 1 ตัวอักษร โดยจะเขียนเครื่องหมาย ‘ และ ’ เพื่อเปิดปิดตัวอักษรนั้น เช่น char c = ‘a’; เนื่องจากในจาวา char จะถูกมองเป็นตัวเลขเหมือน 1 2 จึงสามารถใช้เครื่องหมาย ==   >=   <=   !=  ในการตรวจสอบ char ได้ รวมถึง operation ต่างๆ เช่น + – * / % ได้ด้วย อย่าง ‘ก’+1 จะได้ ข

เมท็อดที่เกี่ยวข้องกับ char ได้แก่ s.charAt(i) คืนค่า char ตำแหน่งที่ i ของสตริง s

การใช้

 

รูป 8-1

โปรแกรมนี้ต้องการตรวจสอบว่าถ้ามีสตริง 2 สตริง จะมีสตริง2 เป็นสับสตริงของสตริงแรกหรือไม่

บรรทัดที่ 8 : ประกาศตัวแปรสตริง s1 และ s2 จากนั้นให้รับข้อมูลจากแป้นพิมพ์มาใส่สตริง

บรรทัดที่ 11,13: รับข้อมูลจากแป้นพิมพ์มาใส่สตริง โดยใช้ nextLine()

บรรทัดที่ 15 : ใช้เงื่อนไขตรวจสอบ ถ้าตรวจข้อความในสตริง s2 เทียบกับ s1 แล้วคืนค่า -1 ก็คือไม่

มี s2 อยู่ใน s1 ให้แสดงผลทางหน้าจอว่าไม่มี

บรรทัดที่ 20 : วนลูปโดยให้ตัวแปร i มีค่ามากกว่า 0 แต่ไม่เกินขนาดของสตริงs1 ให้วนลูป

ตรวจสอบคำสั่งในลูป

บรรทัดที่ 22 : ให้หาว่ามี s2 อยู่ใน s1 หรือไม่ โดยตรวจสอบจากดัชนีที่เริ่มและสิ้นสุดตามการวน

ลูปของตัวแปร i

บรรทัดที่ 23 : ตรวจสอบเพื่อความมั่นใจว่าถ้ามีค่าเป็น -1 ให้ break หรือหยุดทำงานเลย

บรรทัดที่ 24 : แต่ถ้าเจอให้แสดงผลออกทางหน้าจอว่าเจอ s2 ทีดัชนีที่เท่าไหร่ของ s1

ผลลัพธ์

            ใส่คำว่า Study Java ลงไป และให้หาคำว่า Jav ซึ่งพบที่ดัชนีที่ 6 (ช่องก็นับด้วย)

 

รูป 8-2

พาลินโดรม

            พาลินโดรมคือคำ ตัวเลข สัญลักษณ์ที่มีสมมาตร เช่น dad Anna 123454321หรือประโยคก็ได้ เช่น  Eva, can I stab bats in a cave? ภาษาไทยก็เช่น ทายาท หรือประโยค ดีใจคุณแม่คุณใจดี

            โปรแกรมต่อไปนี้จะตรวจสอบว่าสตริงที่รับเข้ามาเป็นพาลินโดรมหรือไม่

 

รูป 8-3

บรรทัดที่ 9-12 : ประกาศตัวแปรสตริงและรับข้อมูลจากแป้นพิมพ์เข้ามาใส่สตริง

บรรทัดที่ 14-15 : ให้ x เก็บความยาวของสตริงและ y เก็บดัชนีตัวหลังสุดของครึ่งซ้ายของสตริง(เวลาดูพาลินโด

รมก็ตรวจดูที่ละครึ่งว่าครึ่งหน้าเหมือนครึ่งหลังไหม)

บรรทัดที่ 16 : ประกาศตัวแปร isPalindrome ให้มีค่าเป็นจริง

บรรทัดที่ 19 : ตรวจว่าเท่ากันไหมระหว่างครึ่งแรกเท่ากับครึ่งหลังคือตัวที่ความยาวทั้งหมดลบ1 โดยใช้ == ได้

เพราะ char จะเก็บข้อมูลแบบหนึ่งตัวอักษร (ถ้าเทียบสตริงต้องใช้ .equals)

บรรทัดที่ 22 : ถ้าไม่ใช่พาลินโดรมให้ออกจากลูป

บรรทัดที่ 28 : ประกาศตัวแปร result เก็บค่าจากการตรวจสอบโดยใช้ if ถ้าจริงให้แสดงว่าเป็น ถ้าไม่ให้แสดง

ว่าไม่เป็น

ผลลัพธ์

 

รูป 8-4

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

9. คอนสตรัคเตอร์(Constructor)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

9. คอนสตรัคเตอร์(Constructor)

            คอนสตรัคเตอร์ คือ สิ่งที่มีไว้สำหรับกำหนดค่าเริ่มต้นให้กับตัวแปรคลาสของอ็อปเจ็ค คอนสตรัคเตอร์จะทำงานอัตโนมัติเมื่อมีการ new อ็อปเจ็คขึ้นมา ระบบจะทำการจองพื้นที่ในหน่วยความจำสำหรัวแปรอ็อปเจ็คแล้วตามด้วยคอนสตรัคเตอร์

การเขียน คอนสตรัคเตอร์

–          หัวของคอนสตรัคเตอร์ต้องชื่อเหมือนคลาสนั้นๆ วิธีการเรียกใช้ก็คือ new Student(…)เช่น

public class Student

{

            public double weight;

                        public Student()

{

                                    Weight = 55.75;

}

}

–          คอนสตรัคเตอร์ต้องไม่มีประเภทของผลลัพธ์ที่จะคืนค่าออกไป และก็ไม่ต้องมีคำว่า void ด้วย เพราะมันจะทำให้กลายเป็นเมท็อด

–          ไม่มีคำว่า static

 

 

รูป9-1

            สร้างคลาส Box ขึ้นมา และสร้างคอนสตรัคเตอร์ public Box() ในบรรทัดที่ 8 ภายในคอนสตรัคเตอร์ก็สามารถตั้งค่าให้กับตัวแปรได้เลย

 

รูป 9-2

บรรทัดที่ 6-7 : สร้างอ็อปเจ็คขึ้นมา ตรงBox() จะถือว่าเป็นการเรียกเรียกคอนสตรัคเตอร์ของ Box ค่าต่างๆใน

คอนสตรัคเตอร์ก็จะมาอยู่ที่ตัวอ็อปเจ็คเลย

บรรทัดที่ 9-10 : ให้แสดงค่าออกทางหน้าจอโดยจะเห็นว่าตรง +box1.volume() ไม่ต้องให้ค่าอะไรลงไปอีก

เพราะ .volume จะเอาค่าของ box1 มาใช้ และ box1 ก็ได้ค่ามาจากคอนสตรัคเตอร์อีกที

ผลลัพธ์

            box1 และ box2 เรียกคอนสตรัคเตอร์ Box() เหมือนกัน ดังนั้นผลลัพธ์ที่ได้จากการคำนวณย่อมต้องเหมือนกัน

 

รูป 9-3

คอนสตรัคเตอร์ที่รับพารามิเตอร์(Parameterized constructors)

            จากตัวอย่างข้างบนจะเห็นว่าหากมีการ new Box() ขึ้นมาค่าต่างๆจะเหมือนกันทำให้การใช้งานยังไม่ดีเท่าที่ควร constructor ควรจะกำหนดค่าได้ดังนั้นก็ใช้วิธีแบบเมท็อดมาช่วยคือให้คอนสตรัคเตอร์รับพารามิเตอร์ โดยการรับพารามิเตอร์จะเป็นเกณฑ์แบบเดียวกันกับฟังก์ชัน[1] เรียกว่า overloaded constructor

ตัวอย่างของ overloaded constructor คือมีคอนสตรัคเตอร์ที่ต้องชื่อเหมือนกันแต่รับพารามิเตอร์ต่างๆกันเวลาที่จะเรียกใช้เมื่อ new ขึ้นมา ใน() ก็ให้ใส่ค่าลงไปตามที่พารามิเตอร์ต้องการ

                public class Student

{

                        public Student( ) {}

public Student(int id) {}

public Student(double weight, double height) {}

public Student(int id, double weight, double height ) {}

}

 

 

รูป9-4

ในคลาส Box เหมือนเดิม แต่เปลี่ยนคอนสตรัคเตอร์ใหม่ให้คอนสตรัคเตอร์รับพารามิเตอร์เป็น double 3 ตัวจากนั้นเอาค่าจากพารามิเตอร์ที่รับเข้ามาไปเก็บไว้ในตัวแปรคลาส

 

 

รูป9-5

            จะเห็นได้ว่า หากให้คอนสตรัคเตอร์รับพารามิเตอร์ แต่เมื่อ new ขึ้นมาแล้วไม่ใส่พารามิเตอร์ลงไปจะเกิด error แบบบรรทัดที่ 6-7 วิธีแก้ error ก็ใส่พารามิเตอร์ให้ถูกต้อง

 

 

รูป9-6

            หลังจากใส่พารามิเตอร์ลงไปแล้ว error ก็จะหายไป พารามิเตอร์ที่ใส่ไปตรงนี้จะถูกนำไปเป็นค่าตั้งต้นในคอนสตรัคเตอร์

ผลลัพธ์

            จะเห็นได้ว่าหากใช้คอนสตรัคเตอร์ที่รับพารามิเตอร์ เมื่อเรา new และใส่พารามิเตอร์ลงไป ค่าในคอนสตรัคเตอร์ของอ็อปเจ็คที่ไป new มาก็มีค่าต่างกัน ผลลัพธ์ที่ได้ก็จะมีค่าต่างกันไปด้วย

 

 

รูป9-7

Default constructor

            คือสิ่งคอมไพล์เลอร์สร้างขึ้นอัตโนมัติเพื่อกำหนดค่าให้กับตัวแปรเป็น 0 สำหรับ int และ 0.0 สำหรับ double รวมถึง false สำหรับ Boolean ใช่ในกรณีที่เราไม่ได้กำหนดค่าเริ่มต้นให้กับตัวแปร

            ภายใน default constructor จะไม่มีคำสั่งใดๆ

            class Student( ) { }

อธิบายเพิ่มเติม

            ก่อนหน้านี้สิ่งที่เขียนบ่อยก็คือ คลาส Scanner ที่ใช้สำหรับรับข้อมูลเข้ามาจากแป้นพิมพ์ เวลาที่เราใช้คำสั่ง new Scanner(…) เช่น new Scanner(System.in) ก็จะเป็นการส่งค่าพาราเตอร์ที่รับเข้าจากแป้นพิมพ์(System.in) ไปให้คอนสตรัคเตอร์ของ Scanner

            new Scanner(new File(“c:/file.txt”)) แบบนี้ก็จะเป็นการสร้างอ็อปเจ็ค 2 ตัวคือ จากการ new File ทำหน้าไปเอาสตริงจาก file มาเก็บเป็นอ็อปเจ็ค แล้วส่งอ็อปเจ็คตัวนี้ไปเป็นพารามิเตอร์ของอ็อปเจ็ค Scannerอีกที ก็จะทำให้ Scanner อ่านไฟล์ได้

คีย์เวิร์ด this กับ super

            คีย์เวิร์ด this ทำหน้าที่อยู่ 2 อย่าง

1.คือเวลาที่เราตั้งชื่อตัวแปรในพารามิเตอร์เป็นตัวเดียวกับตัวแปรคลาส ซึ่งปกติการตั้งชื่อตัวแปรซ้ำกันจะทำไม่ได้ แต่ในกรณีนี้ได้โดยการใช้คีย์เวิร์ด thisเข้ามาช่วย

 

รูป9-8

            2.ใช้เวลาที่จะเรียกใช้คอนสตรัคเตอร์ที่อยู่ในคลาสเดียวกัน

            คีย์เวิร์ด super ใช้เมื่อต้องการเรียกให้คอนสตรัคเตอร์ของคลาสแม่ทำงาน

 

รูป9-9

            สร้างคลาสชื่อ Calculator

บรรทัดที่ 14 : ให้คอนสตรัคเตอร์ของคลาส Calculator รับพารามิเตอร์เป็น int 2ตัว แต่ตัวแปรในพารามิเตอร์

กับตัวแปรคลาสเหมือนกัน ดังนั้นในคอนสตรัคเตอร์ก็เขียน this ลงไปด้วย(จริงๆคือถ้าไม่อย่างเขียน this ก็ตั้งตัวแปรตรงพารามิเตอร์เป็นชื่อคล้ายๆกันก็ได้ เช่น ตัวแปรคลาสชื่อ x กลัวลืมว่าจะต้องเอาค่าไปใส่ตัวแปรชื่อ xในพารามิเตอร์ก็ตั้งเป็น xx พอชื่อไม่เหมือนกันก็ไม่ต้องใส่ this)

บรรทัดที่ 6 : ต้องการตั้งค่าให้ x,y ก็สามารถเรียกใช้คอนสตรัคเตอร์ที่มีอยู่ปล้วในคลาสเดียวกันได้ด้วยคีย์เวิร์ด

this(..);

 

รูป9-10

            สร้างอีกคลาสโดยให้คลาสนี้รับคุณสมบัติมาจากคลาสCalculator โดยใช้คีย์เวิร์ด extends ในคอนสตรัคเตอร์ของ Calculator2 ให้เรียกคอนสตรัคเตอร์ของ Calculator ได้โดยใช้ super();

 

รูป9-11

เมื่อมาถึงเมท็อด main ให้เรียกแค่อ็อปเจ็คCalculator2 ก็จะได้ของจากทั้ง Calculator และ Calculator2

 

 

 


[1] อ่านเรื่องฟังก์ชัน

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

10. การเขียนโปรแกรมเชิงวัตถุ Object Oriented Programming(OOP)

10. การเขียนโปรแกรมเชิงวัตถุ

Object Oriented Programming(OOP)

            เมื่ออ่านเรื่องคลาสและอ็อปเจ็คแล้ว สิ่งที่จะพิจารณาต่อไปคือเรื่องของการเขียนโปรแกรมเชิงวัตถุซึ่งเป็นจุดเด่นของการเขียนโปรแกรมในภาษาจาวา ประกอบไปด้วย Encapsulation, Inheritance และPolymorphism

Encapsulation การห่อหุ้มข้อมูล

 คือการปกปิดข้อมูลหรือเมท็อดบางอย่างไม่ให้ภายนอกมองเห็นและเปลี่ยนแปลงได้(อ่านเพิ่มเติมจากเรื่อง อ็อปเจ็ค)

Inheritance การสืบทอดคุณสมบัติ

ช่วยในการประหยัดเวลาสำหรับการเขียนโปรแกรม คือสามารถที่จะสร้างคลาสใหม่โดยสืบทอดคุณสมบัติจากคลาสเก่าได้โดยไม่ต้องเขียนอะไรให้ยุ่งยากใหม่ทั้งหมด นอกจากนี้ยังสามารถปรับเปลี่ยนลักษณะบางประการของจากคลาสที่ไปสืบทอดคุณสมบัติมาได้ด้วยเรียกว่า overriding

ปกติถ้าไม่ใช้การสืบทอดคุณสมบัติเวลาเขียนคลาสใหม่ก็จะต้องไปก็อปปี้คลาสเดิมแล้วมาสร้างคลาสใหม่เวลาเกิด error ก็ต้องนั่งแก้ทุกจุดทำให้ลำบาก แบบเขียนยาวแล้วแก้ยาก แต่ถ้าสืบทอดคุณสมบัติมาก็แก้แค่จุดเดียวเป็นต้น

คลาสแม่และคลาสลูก(superclass and subclass)

คลาสลูกคือคลาสที่ไปสืบทอดคุณสมบัติมาจากคลาสอื่น ส่วนคลาสที่ถูกเขาสืบทอดคุณสมบัติไปเรียกว่าคลาสแม่ เช่น คลาส B สืบทอดคุณสมบัติจากคลาส A คลาสจะเป็นคลาสแม่ ส่วนคลาส B จะเป็นคลาสลูก วิธีการสืบทอดคุณสมบัติจะใช้คีย์เวิร์ด extends

Modifier cass ชื่อคลาสลูก extends ชื่อคลาสแม่{ }

            เมื่อมีการสืบทอดคุณสมบัติแล้วมีการเปลี่ยนแปลงเกิดขึ้นกับคลาสแม่ ผลของการเปลี่ยนแปลงจะส่งมาที่คลาสลูกอัตโนมัติ สิ่งที่คลาสแม่สามารถสืบทอดคุณสมบัติไปให้คลาสลูกได้ ได้แก่ ตัวแปรคลาสแม่และเมท็อดภายใน คือเมื่อคลาสลูกสืบทอดคุณสมบัติไปแล้วจะสามารถเรียกใช้ตัวแปรและเมท็อดจากคลาสแม่ได้เหมือนกับคลาสลูกสร้างมันขึ้นมาเอง แต่อย่างไรก็ตามถ้าคลาสแม่มีสิ่งที่ถูกประกาศเป็น private ในคลาสแม่ สิ่งนั้นจะไม่สามารถถ่ายทอดมายังลูกได้ และอีกประการคือคอนสตรัคเตอร์ก็จะไม่ถ่ายทอดมายังลูก เปรียบเหมือนแม่มีคุณสมบัติสูง 170 แต่คุณสมบัติไม่จำเป็นต้องเป็นของลูก ลูกอาจสูง 180 ก็ได้

การสืบทอดคุณสมบัติบางครั้งก็ต้องมีการเปลี่ยนแปลงแก้ไข เช่น การเพิ่มตัวแปรและเมท็อดอื่นๆในคลาสลูกเพิ่มเติม

 

รูป10-1

            กลับมีที่คลาส Box อีกครั้ง ในคลาสนี้ปรกาศตัวแปร width, height, depth และสร้างคอนสตรัคเตอร์ 2 คอนสตรัคเตอร์ คือ default constructor กับคอนสตรัคเตอร์แบบรับพารามิเตอร์ จากนั้นก็สร้างเมท็อดสำหรับคำนวณ

 

รูป10-2

            สร้างคลาส BoxWeight โดยให้คลาส BoxWeight สืบทอดคุณสมบัติมาจากคลาส Box ด้วยคีย์เวิร์ด extends ในบรรทัดที่ 2

บรรทัดที่ 4 : ประกาศตัวแปร weight เพื่อเก็บค่าน้ำหนักของกล่อง

บรรทัดที่ 6 : สร้างคอนสตรัคเตอร์ของคลาส BoxWeight จะเห็นว่าในคอนสตรัคเตอร์ของ BoxWeight( ) มีตัว

แปร width, height, depth แบบเดียวกับคลาส Box โดยที่ไม่ต้องประกาศตัวแปร เพราะ BoxWeight( ) ได้ทำการสืบทอดคุณสมบัติมาจาก Box ดังนั้น ตัวแปรคลาสและเมท็อด volume ของ Box นั้น BoxWeight( )ก็จะสามารถใช้งานได้

บรรทัดที่ 8 : ถ้าไม่สร้าง default constructor ในบรรทัดที่ 7 ของคลาส Box จะต้องใส่พารามิเตอร์ในคีย์เวิร์ด

super ตรงนี้แทน ไม่อย่างนั้นจะ error

 

รูป10-3

บรรทัดที่ 6-7 : new อ็อปเจ็คจากคลาส BoxWeight

บรรทัดที่ 10 : เรียกเมท็อด volume ที่เรียกได้ก็เพราะ BoxWeight สืบทอดเมท็อดนี้มาแล้ว

บรรทัดที่ 12 : เรียกตัวแปร weight ของ BoxWeight มาแสดงผล

ผลลัพธ์

 

รูป10-4

Overriding

คือการแก้ไขเมท็อดที่สืบทอดมาจากคลาสแม่ หรือก็คือการเปลี่ยนแปลงเพิ่มเติมตัวแปรและเมท็อดบางอย่างจากคลาสแม่ แต่เมท็อดนั้นต้องชื่อเหมือนกันและรับพารามิเตอร์เหมือนกัน

 

รูป10-5

สร้างคลาสชื่อ Overriding ประกาศตัวแปร a กับ b จากนั้นสร้างคอนสตรัคเตอร์รับพารามิเตอร์ 2 ตัวจากนั้นเก็บค่าไว้ในตัวแปร a b

สร้างเมท็อดชื่อ print สำหรับแสดงค่าออกทางหน้าจอ

 

รูป10-6

สร้างคลาสชื่อ Overriding2 ให้สืบคุณสมบัติมาจาก คลาส Overriding ด้วยคีย์เวิร์ด extends จากนั้นสร้างตัวแปรของคลาส Overriding2 ให้ชื่อ c

ในคอนสตรัคเตอร์ของ Overriding2 เพิ่ม c ลงไป

บรรทัดที่ 10 : นี่คือการ Override คือให้เมท็อดชื่อเหมือนเดิมแต่เปลี่ยนคำสั่งข้างใน จากคลาส Overriding ให้

แสดงค่า a และ b ออกทางหน้าจอ แต่เมท็อดที่สืบทอดคุณสมบัติมาในคลาส Overriding2 ให้แสดงค่า c

 

รูป10-7

บรรทัดที่ 8 : เรียกเมท็อด print( ) จากคลาส Overriding2 โปรแกรมจะแสดง ผลลัพธ์ว่า c : 15 เพราะในคลาส

Overriding2เป็นเมท็อดที่ได้รับการ override แล้ว

Polymorphism การพ้องรูป

สำหรับการพ้องรูปเป้นเรื่องที่มีความเกี่ยวเนื่องกันกับการสืบทอดคุณสมบัติอย่างแยกไม่ออก แปลตามตัวอักษร poly หลาย morph รูปร่าง คือการที่หนึ่งอ็อปเจ็คสามารถมีหน้าที่ได้หลายบทบาท เวลาที่สร้างคลาสแม่ลูกขึ้นมา คลาสแม่จะถือว่าเป็นอะไรที่ใหญ่กว่าคลาสลูก คลาสแม่จะเป็นกรณีทั่วไปแต่คลาสลูกจะเป็นกรณีพิเศษ เช่น คลาสแม่เป็นดอกไม้ มีคุณสมสมบัติคือมีกลีบดอก มีสี คลาสลูกเป็นคลาสดอกมะลิก็จะมีกลีบ มีสีที่เฉพาะเจาะจงกว่าพูดว่าดอกไม้ ดังนั้นสามารถใช้ตัวแปรอ้างอิงของแม่ไปอ้างอิงลูกได้ เช่น Flower f = new Jasmine(); เหมือนบอกว่า ให้คลาส Flower เก็บดอกไม้ สามารถเก็บดอกมะลิได้ แต่ Jasmine j = new Flower(); ไม่ได้ เพราะบอกให้เก็บดอกมะลิ ไม่ใช่ว่าจะไปเก็บดอกไม้อะไรมาให้ก็ได้

 

รูป 10-8

 

รูป10-9

            จากตัวอย่างรูป 10-9 นี้จะเห็นว่าคลาส Rect สืบทอดคุณสมบัติมาจาก Ball แต่ในรูป 10-8 ประกาศอ็อปเจ็ค balls ของ Ball ขึ้นมาเพียงอันเดียว พอจะ new อ็อปเจ็คของคลาส Rect ขึ้นมา ก็สามารถใช้ตัวอ้างอิง ball ไป new ได้เลยเพราะ Rect  เป็นลูกของ Ball

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________