หัดเขียนโปรแกรม ภาษาจาวา

Java basic | Java OOP | โครงสร้างข้อมูล | โจทย์ ACM



[Java OOP]Class และ Object คืออะไร

1 comment
               วันนี้มารู้จัก Class และ Object กัน ซึ่งในหัวข้อนี้มันจะเกี่ยวข้องกับเรื่อง Object-oriented programming โดยเรามาฝึกมองสิ่งที่ต่างๆเป็นวัตถุ  ก่อนจะเข้าเรื่องผมขอบอกเลยว่าถ้าเข้าใจเรื่องนี้จะสามารถนำความรู้ไปประยุกต์ใช้ได้อย่างมากมายและอาจจะช่วยให้เขียนโปรแกรมได้ง่ายขึ้นอีกด้วยในบ้างกรณี

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

หลักการเขียน class จะมีองค์ประกอบอยู่ 3 ส่วนด้วยกัน
  • คุณสมบัติ(Field)  คือ ตัวแปรที่เราจะสร้างให้กับคุณสมบัติ
  • คอนทรักเจอร์(Constructor) คือ เป็นกำหนดการรูปแบบการเรียกใช้ Class
  • เมทธอต(Method) คือ ฟังชั่นก์ หรือ เหตุการณ์ เช่น การตั้งชื่อให้กับสนัข การกำหนดสายพันธุ์ หรือ จะใส่เหตุการณ์ต่างๆก็ได้เช่น การกิน นอน เดินเล่น เห่า เป็นต้น  

จากนั้นเอาหลักการเขียน class มาสร้างคลาส Dog
         ให้เรานึกถึงความเป็นจริงในชีวิตของเราว่าสนัขควรมีคุณสมบัติอะไรบ้าง ในที่นี่จะให้สุนัขมีคุณสมบัติ คือ  มีชื่อ มีสายพันธฺุ์ มีเมทธอต คือ  ตั้งชื่อสุนัขได้ กำหนดสายพันธฺุ์ได้ และสามารถเรียกดู ชื่อ กับ สายพันธุ์ ได้ด้วย
/*
* @author http://javaagkasit.blogspot.com
 */
public class Dog {
    //กำหนดคุณสมบัติ(Field)
    String Name;
    String Breed;

    //คอนทรักเจอร์(Constructor)
    Dog(){
    }
    // เมทธอต สำหรับ กำหนดชื่อสุนัข
    public void setName(String name){
        Name = name;
    }
    // เมทธอต สำหรับ กำหนดสายพันธุ์
    public void setBreed(String breed){
        Breed = breed;
    }

     // เมทธอต สำหรับไว้ให้เรียกดูชื่อสุนัข
    public String getName(){
        return Name;
    }
    // เมทธอต สำหรับไว้ให้เรียกดูสายพันธุ์สุนัข
    public String getBreed(){
        return Breed;
    }
}
เมื่อสร้างคลาสเสร็จ เรามาลองเรียกใช้งานคลาส Dog เราจะได้ทราบว่า Object มันคืออะไรกันแน่
/**
 *class สำหรับ ทดสอบ class Dog
 * @author http://javaagkasit.blogspot.com
 */
public class TestDog {
    public static void main(String [] args){
        Dog d = new Dog();  //สุนักตัวที่ 1
        d.setName("มี่มี้");    // ตั้วชื่อว่า มี่มี้
        d.setBreed("ชิวาวา"); // สุนักพันธุ์ ชิวาวา
     
        Dog d2 = new Dog();   //สุนักตัวที่ 2
        d2.setName("ก้าน");    // ตั้วชื่อว่า ก้าน
        d2.setBreed("บางแก้ว"); // หมาพันธุ์ บางแก้ว
     
        System.out.println("สุนักตัวที่ 1");
        System.out.println(" ชื่อ :"+d.getName());
        System.out.println("พันธุ์ :"+d.getBreed());
     
        System.out.println("สุนักตัวที่ 2");
        System.out.println(" ชื่อ :"+d2.getName());
        System.out.println("พันธุ์ :"+d2.getBreed());
    }
}
               เวลาเราจะเรียกใช้ class Dog ก็จะทำการ   Dog d = new Dog(); ตัว d นั้นล่ะเค้าเรียก Object ซึ่งออปเจกนี้จะมีคุณสมบัติเหมือนกับที่เรากำหนดไว้ใน class Dog ทุกประการ ในหนึ่งออปเราจะมองให้เป็นวัตถุอย่าง ซึ่ง ออปเจก d ที่เราได้ new เราจะมองเป็นสนุกหนึ่งต้ว
         
           Dog d = new Dog();  //สุนักตัวที่ 1
               d.setName("มี่มี้");    // ตั้วชื่อว่า มี่มี้
               d.setBreed("ชิวาวา"); // สุนักพันธุ์ ชิวาวา
               เป็นการสร้าง ออปเจก สุนัข มาหนึ่งตัว แล้วก็ตั้งชื่อให้มัน โดยการ d.setName("มี่มี้"); แล้วก็ระบุสายพันธุ์ให้มันโดยการ d.setBreed("ชิวาวา");  จะเห็นว่าการที่จะเรียกใช้เมทธอตใน class Dog ได้โดยการใช้ "." พอเรากำหนดชื่อ สายพันธุ์ อยากจะแสดงรายของสุนัขตัวนี้( ออปเจก d)ก็ทำได้ไดย
        
        System.out.println("สุนักตัวที่ 1");
        System.out.println(" ชื่อ :"+d.getName());
        System.out.println("พันธุ์ :"+d.getBreed());

ผลการรันโปรแกรม


สรุป Class และ Object
               Class เป็นการกำหนดคุณสมบัติของวัตถุสิ่งใดสิ่งหนึ่ง และObject ก็เป็นการเรียกใช้ Class นั้นๆโดยที่ object นั้นๆจะมีคุณสมบัติเหมือนกับ class ที่เรียกใช้ทุกประการ
เรื่องที่ควรศึกษาเพิ่มเติม 

share

1 comment :

Post a Comment

[Java]การใช้ while loop

1 comment

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


           /**
            * โปรแกรมนับเลข 1 - 10
            * @author http://javaagkasit.blogspot.com
            */
                public class whileloop {
                       public static void main(String[] args) {
                              int count = 1 ;
                         
                        while (true) {    
                                 if(count <= 10){
                                       System.out.println(count++);
                                }else{
                                       break;
                                }
                         }
                        }
                 }
          จากโค้ดด้านบนเป็นโปรแกรมนับเลข 1 ถึง 10 การทำงานก็คือว่า ในลูป while จะวนไปเรื่อยๆภายใน{}ของ while  ถ้า count น้อยกว่าหรือเท่า 10 ก็จะปริํนค่า count ออกมาพร้อมทั้งเพิ่มค่า count ขึ้นที่ละหนึ่ง เมื่อใดที่ค่า count มีค่าไม่ได้อยู่ในเงื่อนไข ก็จะออกจากลูป while
           ในการใช้คำสั้งวนใดๆก็ตาม จะมี 2 คำสั้งที่เกี่ยวข้อ คือ break กับ continue การใช้งานก็ง่ายนิดเดียว  break คือ ออกจากลูป ส่วน continue คือทำงานต่อไป ซึ่งการใช้งานจริงส่วนใหญ่ก็เป็น break ซะมากกว่า continue 

ศึกษาเพิ่มได้ที่
         - การใช้ if else http://javaagkasit.blogspot.com/2012/08/if-else.html
         - การสร้างโปรเจกใน NetBeans IDEhttp://javaagkasit.blogspot.com/2012/09/netbeans-ide.html
         - Class และ object คืออะไร

share

1 comment :

Post a Comment

[Java]การใช้ for-each

No comments


             นอกเหนือจากการใช้ For loop แบบมี ค่าเริ่ม;เงื่อนไข;เพิ่มค่า ยังมีการวนลูปอีกแบบหนึ่งในภาษา Java คือ for - each  loop โดยมีรูปแบบคำสั่งดังนี้

                         for(declaration : expression) {
                               statement
                         }

                - declaration : เป็นการประกาศตัวแปรทั่วไป เช่น String color
                - expression : จะเป็นอาร์เรย์ (array) หรือ Object
                - statement : อาจจะเป็น การคำนวน การแสดงค่า(print)

              แล้วมันต่างจาก for ธรรมดาอย่างไร ข้อดีของ for-each คือกรณีที่เราต้องการโชว์ข้อมูลใน Array ทั้งหมด for -each จะทำได้ง่ายกว่า อาจจะมองภาพยังไม่ออกลองดูตัวอย่างโค้ดด้านล่าง

               /*
                * การใช้งาน foreach
                * @author http://javaagkasit.blogspot.com/
                */
                  public class foreach {
                         public static void main(String [] args){
     
                         String [] colors = {"Red","Blue","Pink","Yellow","Orange"};
                         //for ธรรมดา
                         for(int i =0 ; i< colors.length ;i++){
                                  System.out.println(colors[i]);
                         }
                         //for -each 
                         for(String c : colors){
                                 System.out.println(c);
                         }
                    }
              }

              จากโค้ดด้านบน จะเห็นได้ว่าการใช้ for-each จะทำได้ง่ายและเร็วกว่าการใช้ for ธรรมดา แต่ในทางกลับกันในความสะดวกสะบายของ for - each ยังมีข้อเสียอยู่ ในกรณี ถ้าเราต้องการแสดงเฉพาะตำแหน่งเราต้องการโชว์ เช่น โชว์เฉพาะตำแหน่ง colors[0]  จะทำไม่ได้


เนื่้อหาที่เกี่ยวข้อง
        - การใช้ for http://javaagkasit.blogspot.com/2012/08/for.html
        - การใช้ switch casehttp://javaagkasit.blogspot.com/2012/08/switch-case.html
        - การใช้ if else http://javaagkasit.blogspot.com/2012/08/if-else.html
        - การใช้ if else if http://javaagkasit.blogspot.com/2012/08/if-else-if.html

share

No comments :

Post a Comment

[JAVA] Inception Watch step by step


วันนี้เราจะมาทำโจทย์ Inception Watch แบบ step by step 

        โจทย์ Inception Watch สามารถดาวโหลดได้ที่ลิงค์ http://goo.gl/48Zvud
จากบทความเดิมที่ผมเคยเขียนไว้ ACM InceptionWatchQ JAVA วิธีทำ คือ ให้คำนวณกลับจากชั้นสุดท้ายมายังชั้นแรก ในชั้นสุดท้าย (level n) จะคำนวณเวลาของ Tsk ที่ชั้นนั้นได้โดยตรง ส่วนชั้น n-1 ต้องเอาเวลาทั้งหมด(elapsed time) ของชั้น n หารด้วย 12 แล้วบวกกับ Tnext ของชั้นนั้น ก็จะได้ Tsk ของชั้น n-1
อ่านแล้วคงรู้งงๆมาลองคำนวน เพื่อจะช่วยให้เห็นภาพมากขึ้น ซึ่งมองภาพการเขียนโปรแกรมของเราได้ชัดเจนมากยิ่งขึ้นด้วย

1.การวิเคราะห์โจทย์และลองคำนวณผลลัพธ์ด้วยมือก่อนเขียนโปรแกรม

1.1 แปลงเวลาทั้งหมดให้เป็นหน่วยวินาทีทั้งหมดของทุกๆชั้น

 โดยอ้างอิงจากโจทย์ตัวอย่างต่อไปนี้

   0 0 s
   1 48 m
   2 6 h
   3 2 d
   4 24 d
  -1

หน่วยเวลาทีควรรู้นะครับ 

   1 วินาที(s) = 1 
   1 นาที(m) = 60 วินาที
   1 ชั่วโมง(h) = 3600 วินาที ->ได้จาก  60*60
   1 วัน(d) = 86400 วินาที ->ได้จาก 24*60*60
   1 ปี(y) = 31536000 วินาที  ->ได้จาก 365*24*60*60

ผลจากการแปลงให้อยู่ในหน่วย วินาที ก็จะได้ตัวเลขดังนี้
   0 0 
   1 2880 
   2 21600
   3 172800
   4 2073600

1.2 การคำนวน inception watch โดยใช้สูตร


         sum = sum / 12 +incept[i - 1].getNumSecond();


    โดยกำหนดให้          
            sum                                คือ  ตัวแปรสำหรับเก็บผลลัพธ์
            Incept[i - 1].getNum()    คือ  จำนวนเวลาในหน่วยวินาที ในชั้นรองจากชั้นปัจจุบันที่เราอยู่
            i                                       คือ  ชั้นปัจจุบันที่เราอยู่
            getNumSecond ()          คือ  เป็นฟังก์ชันก์สำหรับการดึงจำนวนเวลาในหน่วยวินาทีของชั้น i -1
            Incept                              คือ  เป็น object ที่เก็บลำดับชั้นจำนวนเวลาในวินาที

วิธีทำ 

เริ่มจากชั้นที่ 5
         ค่า ณ ปัจจุบัน sum = 0 , Incept[i - 1].getNum() = 2073600, i = 5
         แทนค่า sum = 0/ 12 + 2073600
                      sum =  2073600;
ชั้นที่ 4 
         ค่า ณ ปัจจุบัน sum =  2073600  , Incept[i - 1].getNum() = 172800 , i = 4
         แทนค่า sum =  2073600  / 12 +  172800  
                      sum = 345600

ชั้นที่ 3 
         ค่า ณ ปัจจุบัน sum =   345600   , Incept[i - 1].getNum() =  21600 , i = 3
         แทนค่า sum =   345600   / 12 +    21600  
                      sum =   50400

ชั้นที่ 2
         ค่า ณ ปัจจุบัน sum =    50400    , Incept[i - 1].getNum() = 2880 , i = 2
         แทนค่า sum =    50400   / 12 +    2880 
                      sum =   7080

ชั้นที่ 1
         ค่า ณ ปัจจุบัน sum =     7080     , Incept[i - 1].getNum() = 0 , i = 1
         แทนค่า sum =  7080   / 12 +    0 
                      sum =  590
 เป็นอันเสร็จการคำนวน แล้วเราจะมาแสดงค่ายังไงล่ะ   เราก็เรียงจากด้านล่างไปด้านหน้าก็จบ 

        590
        7080
        50400
        345600
        2073600

ส่วนการทำให้ได้ตัวเลขแสดง 10 หลักอ่านลงไปด้านล่างของบทความก็จะเจอครับ


share

[Java] ACM CommonPermutationQ


The Problem

             Given two strings a and b, print the longest string x of letters such that there is a
permutation of x that is a subsequence of a and there is a permutation of x that is a
subsequence of b.

Sanple Input / Output

 source code 

import java.util.Scanner;
import java.util.Arrays;

/**
 *
 * @author http://www.javaagkasit.blogspot.com/
 */
public class CommonPermutation {

    int[] d = new int[1000];
    static String strtemp;

  public static void main(String[] args) throws Exception {
       Scanner sc = new Scanner(System.in);
       CommonPermutation cp = new CommonPermutation();

        while (true) {

            String[] a = (sc.nextLine()).split("");
            String[] b = (sc.nextLine()).split("");
       if (a.length <= 1000 | b.length <= 1000) {
                int c = 0;
                char[] out = new char[a.length];
                for (int i = 1; i < a.length; i++) {
                    for (int j = 1; j < b.length; j++) {
                        if (cp.check(j) == false) {          //not in store index
                            if (a[i].equals(b[j])) {       //if chalacter
                                s1[i] == s2[j]                 
                                out[c++] = b[j].charAt(0);//then store output    
                                cp.store(j);               //then store index
                                break;                     //then stop Search
                            }
                        } else {
                            continue;
                        }
                    }
                }

                cp.printout(out, c);//print output
                cp.clearArr(); //clear arrays store index
                System.out.println();

            }
        }

    }

    public boolean check(int i) {
        boolean c = true;
        int m = Arrays.binarySearch(d, i);
        if (m < 0) {
            c = false;
        }
        return c;
    }

    public void printout(char[] s, int c) {
        char[] ans = new char[c];
        for (int i = 0; i < ans.length; i++) {
            ans[i] = s[i];
        }
        Arrays.sort(ans);
        System.out.print(ans);
    }

    public void store(int p) {
        int c = 0;
        d[c++] = p;
        Arrays.sort(d);
    }

    public void clearArr() {
        for (int i = 0; i < d.length; i++) {
            d[i] = 0;
        }

    }
}

 Download source code here !!!

share