2. หนาที่ 142 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ เนื้อหาบทเรียน ♦ ตัวแปรอารเรย(array of local variable) ♦ สมาชิกอารเรย(array of attribute) ♦ อารเรยของคลาส(array of class) ♦ การสงผานขอมูลอารเรยระหวางเมธอด ♦ อารเรยหลายมิติ(multi dimensional array)
3. หนาที่ 143 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวแปรอารเรยคือ ตัวแปรชุดชนิด reference data type แบบพิเศษ ที่สามารถเก็บขอมูลชนิด เดียวกันไดหลายคา เปนชุดของขอมูลที่มีประเภทเดียวกัน เชน ขอมูลคะแนนสอบของนักเรียน 15 คน ขอมูลอุณหภูมิของชวงหกโมงเย็นใน 1 เดือน ขอมูลปริมาณน้ําฝนใน 1 ป เปนตนเราสามารถ ประยุกตใชตัวแปรอารเรยชวยจัดการกับขอมูลดังกลาวเพื่อนํามาประมวลผลตอไป เชนใชในการหา คาเฉลี่ยของปริมาณน้ําฝนในรอบ 12 เดือน เก็บขอมูลนิสิตสาขาวิทยาการคอมพิวเตอร เปนตน ซึ่งสา มาชิกของอารเรยอาจเปนตัวแปรพื้นฐาน(Primitive Data Types)หรือตัวแปรอางอิง(Reference Data Types)ก็ได จํานวนสมาชิกของอารเรยมีขนาดแนนอนไมสามารถเปลี่ยนแปลงขนาดได และสมาชิก ของอารเรยแตละตัวจะมีลําดับประจําตัวอยู อารเรยในภาษาจาวาเปนวัตถุ ดังนั้นจึงเปนการดีที่จะไดเห็นตัวอยางการเอาแนวคิดเรื่องวัตถุไป ใชจริง อยางไรก็ตามอารเรยเปนวัตถุพิเศษจึงมีวิธีการใชงานและคําสั่งที่ไมเหมือนกับวัตถุทั่วไปนัก ตัวอยาง การเขียนโปรแกรมเพื่อคํานวณคาเฉลี่ยดวยวิธีธรรมดาไมไดใชตัวแปรอารเรย import javax.swing.JOptionPane; public class InputTest { public static void main(String args[]){ float sum = 0.0f, rainfall, annualAverage; for (int i=0; i < 12; i++) { String input = JOptionPane.showInputDialog("Rainfall for month" + (i+1)); rainfall =Float.parseFloat(input); sum += rainfall; } annualAverage = sum / 12.0f; JOptionPane.showMessageDialog(null,"Annual Average " + annualAverage); System.exit(0); } } จากโปรแกรมนี้เมื่อทําการรันจะปรากฎหนาจอเพื่อรับคาปริมาณน้ําฝนจํานวน 12 ครั้งดังหนาจอตอไปนี้
4. หนาที่ 144 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ เมื่อครบ 12 ครั้งแลวจะแสดงคาเฉลี่ยดังหนาจอตอไปนี้ จากโปแกรมดังกลาวหากตองการทราบปริมาณน้ําฝนในแตละเดือนจะไมสามารถนํากลับมาแสดงได ดังนั้นหากขอมูลที่ตองการจัดเก็บมีลักษณะนี้ใหทําการเก็บขอมูลไวในตัวแปรชนิดอารเรย 6.1. การประกาศตัวแปรอารเรย 1 มิติสําหรับตัวแปรชนิดพื้นฐาน อารเรยเปนวัตถุ ดังนั้นตองมีการประกาศตัวแปรอางอิง และสรางอินสแตนท การประกาศ อารเรยหรือการประกาศตัวแปรอางอิงแบบอารเรยมี 2 รูปแบบคือ รูปแบบที่ 1 Data_type[] data_identifier; เชน double[ ] rainfall; int[] a , b ,c ; // a ,b ,c เปนตัวแปร integer ชนิดอารเรย 1 มิติ รูปแบบที่ 2 Data_type data_identifier[]; เชน double rainfall[ ]; int a , b[] , c ; // a , c เปนตัวแปร integer สวน b เปนตัวแปร integer ชนิดอารเรย หมายเหตุ ในการประกาศตัวแปรอารเรยนั้นไมสามารถระบุขนาดของ array ในสวน declare ได เชน int a[3]; // error
5. หนาที่ 145 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ 6.2 การสราง Array เมื่อทําการประกาศตัวแปรแลวใหทําการสรางตัวแปรอารเรยโดยใชคําสั่ง new รูปแบบที่ 1 สรางเมื่อประกาศตัวแปรอารเรยแลว Data_identifier[] = new data_type[size_of_arry]; เชน rainfall = new double[12]; a = new int[5]; b = new int[20]; รูปแบบที่ 2 ทําการประกาศตัวแปรอารเรยพรอมสรางตัวแปรอารเรย Data_type Data_identifier = new data_type[size_of_arry]; เชน double[ ] rainfall = new double[12]; //ทําการประกาศ &สราง rainfall 0 1 2 3 4 5 6 7 8 9 10 11 rainfall[2]ตําแหนงแรกตําแหนงแรก ของของ AArrrraayy จะเปนตําแหนงที่จะเปนตําแหนงที่ 00 หมายเหตุ : หากตองการทราบขนาดของอารเรยสามารถหาไดจาก รูปแบบ ชื่อตัวแปรอารเรย.length เชน int a ; double[] rainfall = new double[12]; a = rainfall.length; // a = 12
6. หนาที่ 146 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวอยาง แสดงการกําหนดคาเริ่มตนใหกับอารเรย 1 มิติ ดวยตัวอักษร A – Z class testArray{ public static void main(String[] args) { char ch[]; ch = new char[26]; // loop กําหนดคาเริ่มตนใหกับตัวแปรอารเรย for(int i = 0; i < ch.length ; i ){// สิ่งที่ไดจาก ch.length คือขนาดของอารเรย ch ch[i] = (char)('A'+i); } // นําคาที่อยูในตัวแปรอารเรยมาแสดงบนหนาจอ for (int i=0; i< ch.length ;i ){ System.out.print(ch[i] + "t"); } } } ผลลัพธที่ไดคือ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ตัวอยาง การใชงาน Array import javax.swing.JOptionPane; public class InputTest { public static void main(String args[]){ double[ ] rainfall = new double[12]; double annualAverage, sum = 0.0f; for (int i = 0; i < rainfall.length ; i++) { String input = JOptionPane.showInputDialog("Rainfall for month" + (i+1)); rainfal[i]l =Float.parseFloat(input);//ทําการแปลงคาจากตัวหนังสือเปน float sum += rainfall[i]; }
7. หนาที่ 147 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ annualAverage = sum / rainfall.length; // rainfall.length = ขนาดของอารเรย rainfall JOptionPane.showMessageDialog(null,"Annual Average " + annualAverage); System.exit(0); } } ตัวอยาง สวนของโปรแกรมเพื่อกําหนดคาเริ่มตนใหกับตัวแปรอารเรย double[ ] rainfall = new double[12]; String[ ] monthName = new String[12]; monthName[0] = “January”; monthName[1] = “February”; … double annualAverage, sum = 0.0f; for (int i = 0; i < rainfall.length; i++) { String input = JOptionPane.showInputDialog("Rainfall for month" + monthName[i]); rainfal[i]l =Float.parseFloat(input); sum += rainfall[i]; } annualAverage = sum / rainfall.length; ตัวอยาง สวนของการหาคาเฉลี่ยปริมาณน้ําฝนในแตละไตรมาศ double[ ] quarterAverage = new double[4]; for (int i = 0; i < 4; i++) { sum = 0; for (int j = 0; j < 3; j++) {//compute the sum of one quarter sum += rainfall[3*i + j]; } quarterAverage[i] = sum / 3.0; //Quarter (i+1) average ประกาศและสรางตัวแปรอารเรย กําหนดคาเริ่มตนใหแกตัวแปรอารเรย
8. หนาที่ 148 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ หมายเหตุ - Array ใน Java นั้นไมอยูในรูปแบบขอมูลเรียงตอๆกัน หากแตเปน Object ชนิดหนึ่ง - Array ที่ยังไมทําการสราง(Construct)โดยใชคําสั่ง new จะมีคาเปน null หากมีการใชจะเกิด Runtime Exception (NullException) จะกลาวถึงในบทที่ 13 ในตอนนี้ทราบเพียงวาสิ่งที่เกิดขึ้นเปนขอผิดพลาด ชนิดหนึ่ง เกิดในขณะ run โปรแกรม 6.4 การกําหนดคาเริ่มตนให Array เราสามารถทําการประกาศตัวแปร Array และทําการกําหนดคาเริ่มตนใหตัวแปร Array ในณะ เดียวกันเชนเดียวกับการประกาศตัวแปรชนิดอื่นๆ ตัวอยาง การสรางและกําหนดคาเริ่มตนใหอารเรย int[ ] number = { 2, 4, 6, 8 }; double[ ] samplingData = { 2.443, 8.99, 12.3, 45.009, 18.2, 9.00, 3.123, 22.084, 18.08 }; char[] ch = {‘w’,’x’,’y’,’z’}; String[ ] monthName = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October" , "November", "December" }; สังเกตวา กรณีที่กําหนดคาให array พรอมๆกับ declare ไมตองใช new เชน int []a = { 1,2,3}; ตัวอยาง สรางและกําหนดคาแบบ Anonymous Array char [] ch; ch = new char[] {‘a’ , ‘b’, ‘c’}; หมายเหตุ - การอางอิงเลข index ของ array ที่มากกวา length นั้นจะทําใหเกิด Run Time Exception เรียกวา ArrayIndexOutofBoundException - จะตองกําหนด size ของ array ที่จะสรางเสมอ หรือไมเชนนั้นก็ตองระบุสมาชิกใหแก array int [] a ; a = new int[5]; int [] b ; b = new int[] {1,2,3}; Object [] c = new Object[3]; Object [] d = new Object[] {new Object(),”Test”}
9. หนาที่ 149 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ - จากการใชคําสั่ง char [] ch = new char[4]; ตัวอยาง หากไมไดกําหนดคาเริ่มตนใหตัวแปร Array จาวาเวอรชัวร(JVM) เปนผูกําหนดคาเริ่มตนใหใน ขณะที่สรางตัวแปรอารเรยดวยคําสั่ง new class NonInitial { public static void main(String[] args) { int size = 3; byte b[] = new byte[size]; short s[] = new short[size]; int in[] = new int[size]; float f[]=new float[size]; boolean bl[] = new boolean[size]; System.out.println(" tbytetshorttinttfloattboolean"); for(int i =0; i<b.length; i++){ System.out.println("index "+ i + "t"+b[i] +"t"+s[i]+"t"+in[i]+"t" +f[i]+"t" + bl[i]+"t"+ "stop"); } } } ผลลัพธที่ได byte short int float boolean index 0 0 0 0 0.0 false stop index 1 0 0 0 0.0 false stop index 2 0 0 0 0.0 false stop Stack Execution ch
10. หนาที่ 150 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ 6.5 อารเรยของ Objects นอกจาก Arrays จะสามารถใชงานกับขอมูลประเภท Primitive Data Type แลว เรายังสามารถ ใชงาน Array กับขอมูลประเภท Reference Data Type ไดอีกดวย ตัวอยาง Class Person ขั้นตอนที่ 1 Person[ ] person; // ประกาศออบเจ็ค ขั้นตอนที่ 2 person = new Person[5]; // สรางออบเจ็ค ขั้นตอนที่ 3 person[0] = new Person ( ); Person name : String inpStr : String age : int gender : char setName(String) : void setinpStr(String) : void setAge(int ) : void setGender(char) : void ppeerrssoonn ppeerrssoonn 0 1 2 3 4 Person ppeerrssoonn 0 1 2 3 4
11. หนาที่ 151 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ ตัวอยาง การสราง Person objects และการสราง person array import javax.swing.JOptionPane; class Person{ String name; int age; char gender; void setAge(int a){age = a;} void setName(String s){name =s;} void setGender(char g){gender = g;} }; public class TestCreateObjectArray{ public static void main(String[] args) { Person[ ] person = new Person[2]; String name, inpStr; int age; char gender; // ทําการรับคาใหเพื่อกําหนดคาใหกับ Object Person for (int i = 0; i < person.length; i++) { name = JOptionPane.showInputDialog("Enter name:"); //รับชื่อ inpStr = JOptionPane.showInputDialog("Enter age:");//รับขอมูลอายุ age = Integer.parseInt(inpStr);//ทําการเปลี่ยนคาที่รับเปนชนิด integer inpStr = JOptionPane.showInputDialog("Enter gender:");//รับขอมูลเพศ gender = inpStr.charAt(0);// gender ตัดเฉพาะตัวอักษรตัวแรกของ inpStr person[i] = new Person( ); //สราง object Person person[i].setName(name); // เรียกใช method setName เพื่อกําหนด name ใหกับ person[i] person[i].setAge ( age ); // เรียกใช method setName เพื่อกําหนด name ใหกับ person[i] person[i].setGender( gender ); // เรียกใช method setName เพื่อกําหนด name ใหกับ person[i] } // แสดงคาที่อยูใน Object Person บนหนาจอ Output for(int i = 0 ; i < person.length;i++){ System.out.println("Person Number " + (i+1) );
12. หนาที่ 152 เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง อ.สุรางคนา ระวังยศ System.out.println(person[i].name + " " + person[i].age + " " +person[i].gender); } System.exit(0); }} เมื่อทําการกรอกขอมูลจํานวน 2 คนแลวจะปรากฎขอมูลตอไปนี้ในผลลัพธ Person Number 1 surangkana 20 F Person Number 2 suda 24 m ตัวอยาง การหาคนที่อายุมากและอายุนอยที่สุด int minIdx = 0; //index to the youngest person int maxIdx = 0; //index to the oldest person for (int i = 1; i < person.length; i++) { if ( person[i].getAge() < person[minIdx].getAge() ) {