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

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



อธิบายโค้ดอย่างละเอียด MinimumSwapQ JAVA


อธิบายโค้ดอย่างละเอียด MinimumSwapQ JAVA

ลำดับขั้นตอนการเขียน
  1. รับค่าข้อมูลทางคีร์บอร์ดแล้วนำค่ามาแปลง Character พร้อมกับจัดเก็บข้อมูลใส่ Array
  2. เก็บข้อมูลใส่ Array ได้แล้ว จากนั้นก็ ทำการเรียงข้อมูลจากน้อยไปมาก
    - ซึ่งในขั้นตอนที่ 2 เราต้อง มีตัว Counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล
  3. พอวนรอบจนครับก็แสดงค่าผลลัทธ์ออก Output
โค้ดทั้งหมด



import java.util.Scanner;

/**
 * @author http://javaagkasit.blogspot.com/
 */
public class MinimumSwapQ {
    private static int counter = 0;// ตัวแปร counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล
    private static String input ;
         public static void main(String[] args){
              Scanner sn =new Scanner(System.in);

            try{
                while(!(input = sn.nextLine()).equals("000")){
                    char [] charecter = charArr(input);
                    int current = 0, last = charecter.length-1;
                    int walker, smallest;
                        while(current < last) {
                            smallest = current;
                            walker = current + 1;
                                //วนหาอักษรที่เล็กที่สุด ในข้อมูลที่เหลือ
                                while(walker <= last) {
                                    if(charecter[smallest] > charecter[walker])                                                        
                                        smallest = walker;
                                        walker++;
                                }//เจอแล้วก็สลับตำแหน่งกัน
                                       swap(charecter, current, smallest);
                                       current++;
                         }
                             print();// แสดงจำนวนที่สลับ
                   }
                }catch(Exception e){
                   System.out.println(e.getClass());
                   System.out.println("Re-enter.!!!");
            }

         }
       //เอา input มาแปลงเป็น char และเก็บข้อใส่ array
         static char[] charArr(String input){
             char [] charecter = new char[input.length()];
                 for(int i=0 ;i< input.length();i++){
                      charecter[i] = (char) input.codePointAt(i);
                 }
            return charecter;
        }
       // เมทอดสำหรับ สำหรับ สลับตำแหน่ง
         static char[] swap(char[] arr, int current, int smallest) {
               if(arr[current] > arr[smallest])
                      counter++;
                  char temp = arr[current];
                  arr[current] = arr[smallest];
                  arr[smallest] = temp;
          return arr;
         }
         // เมทอดสำหรับ สำหรับ แสดงผล output
         static void print(){
                 System.out.println(counter);
                   counter = 0;
          }
}



การทำงานหลักๆของโปรแกรม
    

try{
      while(!(input = sn.nextLine()).equals("000")){ //1. รับค่าข้อมูลทางคีร์บอร์ด               
      char [] charecter = charArr(input);//แล้วนำค่ามาแปลง Character พร้อมกับจัดเก็บข้อมูลใส่ Array
                    int current = 0, last = charecter.length-1;
                    int walker, smallest;
                        //2.เก็บข้อมูลใส่ Array ได้แล้ว จากนั้นก็ ทำการเรียงข้อมูลจากน้อยไปมาก
                        while(current < last) {
                            smallest = current;
                            walker = current + 1;
                                //วนหาอักษรที่เล็กที่สุด ในข้อมูลที่เหลือ
                                while(walker <= last) {
                                    if(charecter[smallest] > charecter[walker])                                                          
                                        smallest = walker;
                                        walker++;
                                }//เจอแล้วก็สลับตำแหน่งกัน
                                       swap(charecter, current, smallest);
                                       current++;
                         }
                           // 3.พอวนรอบจนครับก็แสดงค่าผลลัทธ์ออก Output
                             print();
                   }
 }catch(Exception e){
            System.out.println(e.getClass());
            System.out.println("Re-enter.!!!");
            }

}



  1. รับค่าข้อมูลทางคีร์บอร์ดแล้วนำค่ามาแปลง Character พร้อมกับจัดเก็บข้อมูลใส่ Array

                while(!(input = sn.nextLine()).equals("000")){                                                                        
                    char [] charecter = charArr(input);

       while(!(input = sn.nextLine()).equals("000")) หมายความว่า ถ้า input ที่เข้ามา ไม่เป็น 000 ให้วนลูปไปเรื่อยๆ แต่ถ้าเป็น 000 ก็จบการวนลูป
        char [] charecter = charArr(input); คือ การนำเอา input ที่เข้ามาแปลงเป็น Character พร้อมกับจัดเก็บข้อมูลใส่ Array  ส่วน charArr() เป็นเมทอต สำหรับนำค่าแปลง input ให้เป็น  Character แล้วก็ รีเทิน ค่า Character อาร์เรย์ กลับคืนมา คลิกเพื่อดูเมทอต charArr()
     
       2.    เก็บข้อมูลใส่ Array ได้แล้ว จากนั้นก็ ทำการเรียงข้อมูลจากน้อยไปมาก
         
                - วิธีที่ผมคิดในการเรียนข้อในให้สลับที่ได้น้อยครั้งที่สุด คลิกเพื่อดู
                -  Counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล คลิกเพื่่อดู
       3.     การแสดงผลลัทธ์ออก Output จะใช้ เมทอต   print()
               
         // เมทอดสำหรับ สำหรับ แสดงผล output                                                                                  
         static void print(){
                 System.out.println(counter);
                   counter = 0; //เคีล๋ยค่า couter ทุกครั้งที่มีการ print  ผลลัพธ์        
          }
 


 ผมก็ขอจบแค่นี้ครับ ถ้าสงสัยก็ หรือ แนะนำ การเขียน บทความ ก็คอมเม้นสอบถาม - แนะนำได้ครับ 

share

อัลกอริทึม MinimumSwapQ





อัลกอริทึม MinimumSwapQ


                   วิธีที่ผมคิดในการเรียงข้อมูลให้สลับที่ได้น้อยครั้งที่สุด



รอบที่ 1 ตำแหน่งที่เลือกคือ index 0 (เลข 3) แล้วก็ให้ไปวนหาในข้อมูลในตำแหน่งที่เหลือคือ 1,2,3(เลข 4,2,1 ตามลำดับ)  ปรากฎว่า ข้อมูลที่เล็กที่สุด คือ เลข 1 แล้วนำเลข 3 กับ 1 เปรียบเทียบกัน ปรากฎว่า เลข 1 เล็กว่า 3 นำเลข 3 กับ เลข 1 สลับตำแหน่งกัน (ถ้าข้อมูลที่ค้นหาเจอขนาดใหญ่กว่า ก็ไม่ต้องสลับตำแหน่งกัน)  สลับตำแหน่งกันเรียบร้อยก็ เลื่อน ตำแหน่งที่เลือก ไปข้างหน้า 1 ตำแหน่ง และตำแหน่งที่เลือกคือ index 0 ก็จะกลายเป็น ตำแหน่งทีเรียงเสร็จแล้ว (ตำแหน่งทีเรียงเสร็จแล้วเราจะไม่ไปยุ่งกับมันอีก)

รอบที่ 2 ตำแหน่งที่เลือกคือ index 1 (เลข 4) แล้วก็ให้ไปวนหาในข้อมูลในตำแหน่งที่เหลือคือ 2,3(เลข 2,3 ตามลำดับ)  ปรากฎว่า ข้อมูลที่เล็กที่สุด คือ เลข 2 แล้วนำเลข 4 กับ 2 เปรียบเทียบกัน ปรากฎว่า เลข 2 เล็กว่า 4 นำเลข 4 กับ เลข 2 สลับตำแหน่งกัน สลับตำแหน่งกันเรียบร้อยก็ เลื่อน ตำแหน่งที่เลือก ไปข้างหน้า 1 ตำแหน่ง และตำแหน่งที่เลือกคือ index 1 ก็จะกลายเป็น ตำแหน่งทีเรียงเสร็จแล้ว

รอบที่ 3 ตำแหน่งที่เลือกคือ index 2 (เลข 4) แล้วก็ให้ไปวนหาในข้อมูลในตำแหน่งที่เหลือคือ 3 (เลข 3 ตามลำดับ)  ปรากฎว่า ข้อมูลที่เล็กที่สุด คือ เลข 3 แล้วนำเลข 4 กับ 3 เปรียบเทียบกัน ปรากฎว่า เลข 3 เล็กว่า 4 นำเลข 4 กับ เลข 3 สลับตำแหน่งกัน สลับตำแหน่งกันเรียบร้อยก็ เลื่อน ตำแหน่งที่เลือก ไปข้างหน้า 1 ตำแหน่ง และตำแหน่งที่เลือกคือ index 2 ก็จะกลายเป็น ตำแหน่งทีเรียงเสร็จแล้ว

รอบที่ 4 ตำแหน่งที่เลือกคือ index 3 (เลข 4)  ก็จะไม่ต้องทำอะไร ก็เอาเลข 4 เป็นข้อมูลที่ใหญ่ที่สุดเลย
ก็เสร็จสิ้นการเรียงข้อมูล

จากแนวคิดผมก็นำมาเขียนโค้ด

                    char [] charecter = charArr(input);
                    int current = 0, last = charecter.length-1;
                    int walker, smallest;
                        //
                        while(current < last) {
                            smallest = current;
                            walker = current + 1;
                                //วนหาอักษรที่เล็กที่สุด ในข้อมูลที่เหลือ
                                while(walker <= last) {
                                    if(charecter[smallest] > charecter[walker])                                                          
                                        smallest = walker;
                                        walker++;
                                }//เจอแล้วก็สลับตำแหน่งกัน
                                       swap(charecter, current, smallest);//คือ เมทอต ไว้สลับตำแหน่งข้อมูล
                                       current++;
                         }

}



                  current      คือ ตัวแปรทำหน้าที่ เก็บตำแหน่ง(index)ที่เราเลือก
                  last          คือ ตัวแปรทำหน้าที่ เก็บตำแหน่ง(index)สุดท้ายของข้อมูล
                  wallker    คือ ตัวแปรทำหน้าที่สำหรับ วนหาค่าที่เล็กที่สุดใน ข้อมูลที่เหลืออยู่
                  smallest   คือ ตัวแปรทำหน้าที่เก็บตำแหน่งข้อมูลที่เล็กสุด
                  swap       คือ เมทอต ไว้สลับตำแหน่งข้อมูล

สำหรับการ อธิบาย อัลกอริทึม MinimumSwapQ ตามแนวคิดผม ก็จบแค่นี้ ครับ ถ้าไม่เข้าใจ ส่วนไหน คอมเม้น ถามได้นะครับ เอาไว้เจอกันใน บทความต่อไปคับ

share

เมทอต swap ใน MinimumSwapQ JAVA

เมทอต swap  ใน MinimumSwapQ JAVA


เป็น เมทอต ใช้สำหรับสลับตำแหน่ง ข้อมูลใน Array


       // เมทอดสำหรับ สำหรับ สลับตำแหน่ง
         static char[] swap(char[] arr, int current, int smallest) {
      //จะมีการเปรียบเทียบก่อนว่าค่าที่ index current มีค่ามากกว่า index  smallest   ค่อยจะเพิ่มค่า  counter                                                                
               if(arr[current] > arr[smallest])
                      counter++;
                  char temp = arr[current];
                  arr[current] = arr[smallest];
                  arr[smallest] = temp;
          return arr;
         }



หมายเหตุ
              input หรือ ค่าที่ป้อนเข้า เมทอด นี้ คือ Char ที่เป็น อาร์เรย์ ,int ,int 
              output  คือ   จะรีเทิน อาร์เรย์ char กลับคืนไป
              counter คือ ตัวแปร counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล


share

เมทอต charArr()




 เมทอต  charArr() 

เป็น เมทอต สำหรับนำค่าแปลง input ทีเป็น String แล้วก็ รีเทิน ค่า Character อาร์เรย์ กลับไป

 //เอา input มาแปลงเป็น char และเก็บข้อใส่ array
         static char[] charArr(String input){   //รับ String เข้ามา
             // ทำการจอง array = ความยาวของ Stringที่เข้ามา
             char [] charecter = new char[input.length()];
                 //วนลูป ดึง char ขี้นมาเก็บทีละช่อง
                 for(int i=0 ;i< input.length();i++){
                      charecter[i] = (char) input.codePointAt(i);                                                                         
                 }
            // วนลูปเสร็จก็ รีเทิน ค่ า char Array กลับไป
            return charecter;
        }
    }


     
            ทดสอบว่าใช้ได้จริง หรือไม่




                   ผลการรัน


                    จากผลการรัน ก็แสดงว่า  เมทอต  charArr()  ใช้งาานได้จริง สำหรับ เมทอต  charArr()  ก็ขอจบแค่นี้ครับ ถ้าสงสัยก็ คอมเม้นสอบถามได้ครับ


share

ACM InceptionWatchQ JAVA

Select language :

ACM InceptionWatchQ JAVA


โจทย์  เป็นโจทย์ที่ยาวมาก อ่านแล้ว  งง ก็ขอสรุปง่ายล่ะกันนะ
การแก้ปัญหา

             การแก้ปัญหาในข้อนี้ใช้การคำนวณทางคณิตศาสตร์ธรรมดา เพื่อค่าหาเวลาที่ผ่านไปของแต่ละชั้น   ให้แปลงเวลาทั้งหมดเป็นหน่วยวินาที
             ตอนแรกต้องหาค่าเวลา(วินาที) ณ จุดที่เข้าไปสู่ฝันชั้นถัดไป (Tnext) ให้ทำจากฝันชั้นแรกไปยังชั้นสุดท้าย
             จากนั้น ให้คำนวณกลับจากชั้นสุดท้ายมายังชั้นแรก ในชั้นสุดท้าย (level n) จะคำนวณเวลาของ Tsk ที่ชั้นนั้นได้โดยตรง ส่วนชั้น n-1 ต้องเอาเวลาทั้งหมด(elapsed time) ของชั้น n หารด้วย 12 แล้วบวกกับ Tnext ของชั้นนั้น ก็จะได้ Tsk ของชั้น n-1

input/output


โค้ดที่เขียนได้นะครับ

  
            import java.util.Scanner;
            import java.util.Stack;

            public class InceptionW {
static int s =1;//sec
static int m =60;//sec
static int h=3600;//=60*60
static int d=86400;//=24*60*60
static int y =31536000;//=365*24*60*60

public static void main(String[] args){
Scanner sc =new Scanner(System.in);
InceptionW IW = new InceptionW();
Stack<Integer> stack = new Stack<Integer>();
 
                     String[] levels = new String[10];
int num=0,ans =0,count=0,co=0;
char unit;
String charten ="";

while(true){

IW.cler(levels);
                            String sin = sc.nextLine();
                     if(!sin.equals("-1")){
                             String[] in = sin.split(" ");
count = Integer.parseInt(in[0]) ;
unit = IW.findunit(sin);
num = IW.tosecont(in[1], unit);                                                                                
                              stack.push (num);
                              count ++;
                    }else{
                               co = count;

                         while(!stack.empty ()){
if(co-1 ==  ( int )stack.peek ()-1){
ans = (int)stack.pop();//
                                 }else{
ans = ans/12 + (int)stack.pop();  
                                 }
                                   co--;
                                   levels[co]=charten;
}
count = 0;
                        co = 0;
                       ans = 0;
IW.print(levels);
             }

}
}

public char findunit(String s){
return s.charAt(s.length()-1);
}

public int tosecont(String str,char c){
int num = Integer.parseInt(str);
if(c == 's'){
num *= s;
}else if(c == 'm'){
num *= m;
}else if(c == 'h'){
num *= h;
}else if(c == 'd'){
num *= d;
}else if(c == 'y'){
num*=y;
}else
num =0;
return num;
}

public String addcharecter(int num){
String n = num +"";
String ans ="";
String nr =revers(n);
for(int i =0 ; i < 10 ;i++){
if(i > nr.length())
nr+="0";
}
return ans = revers(nr);
}

public String revers(String num){
StringBuffer str_buff = new StringBuffer(num);
str_buff.reverse();
String nr =str_buff.toString();
return nr;
              }
public void print(String[] levels){
for(int i=0;i <levels.length;i++){
                     if(!(levels[i] =="0"))
                  System.out.println(levels[i]);
           }
}
public void cler(String[] levels){
for(int i=0;i <levels.length;i++){
levels[i]="0";
}
}
         }





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





share

โจทย์ ACM MinimumSwapQ JAVA



โจทย์ ACM MinimumSwapQ JAVA



          เป็นการหาจำนวน ครั้งในการสลับที่ ที่น้อยที่สุดสำหรับการจัดเรียงข้อมูลตัวอักษรจากน้อยไปมาก
โจทย์ 


Minimum Swap
การเรียงข้อมูลเป็นขั้นตอนวิธีที่ถูกเรียกใช้บ่อยครั้งในการพัฒนาซอฟต์แวร์ซึ่งมีทั้งแบบจากน้อยไปมาก
และทั้งจากมากไปน้อย ซึ่งในการเรียงข้อมูลจะต้องมีการเปรียบเทียบและการสลับที่ของข้อมูล จงหาจำนวน
ครั้งในการสลับที่ ที่น้อยที่สุดสำหรับการจัดเรียงข้อมูลตัวอักษรจากน้อยไปมาก
input
แต่ละบรรทัดประกอบด้วยชุดของตัวอักษรตัวเล็ก (a ถึง z) โดยอินพุทแต่ละชุดจะไม่มีตัวอักษรที่
ซ้ำกัน อินพุทสิ้นสุดเมื่อพบข้อความ “000”
output
ผลลัพธ์แต่ละบรรทัดให้ค่าจำนวนครั้งต่ำสุดในการสลับที่ข้อมูลที่ทำการเรียงลำดับของตัวอักษรจาก
น้อยไปมาก



ดูจาก output ของโปรแกรม คือ จะนับเฉพาะตำแหน่งที่อยู่ผิกตำแหน่งเท่านั้น สังเกตุจาก cba โปรแกรมจะนับเฉพาะที่ c สลับกับ a เท่านั้น output เลยได้ 1

code ที่ผมเขียนนะครับ


          import java.util.Scanner;
          /**
         *
         * @author JOKE
         */
         public class MinimumSwap {
              int counter= 0;
         public static void main(String[] args){
              MinimumSwap MT = new MinimumSwap();
Scanner sn =new Scanner(System.in);
String input ="";
try{

while(!(input = sn.nextLine()).equals("000")){
char [] charecter = MT.charArr(input);
int current = 0, last = charecter.length-1;
int walker, smallest;
while(current < last) {
smallest = current;
walker = current + 1;
while(walker <= last) {                                //วนหาอักษรที่เล็กที่สุด
if(charecter[smallest] > charecter[walker])
smallest = walker;
walker++;
}//เจอแล้วก็สลับตำแหน่งกัน
MT.swap(charecter, current, smallest);
current++;
}
MT.print();// แสดงจำนวนที่สลับ
}
}catch(Exception e){
System.out.println(e.getClass());
System.out.println("Re-enter.!!!");
            }

         }

          public char[] charArr(String input){
char [] charecter = new char[input.length()];
for(int i=0 ;i< input.length();i++){
charecter[i] = (char) input.codePointAt(i);
}
return charecter;
        }
       // เมทอดสำหรับ สำหรับ สลับตำแหน่ง
         public char[] swap(char[] arr, int current, int smallest) {
if(arr[current] > arr[smallest])
counter++;
char temp = arr[current];
arr[current] = arr[smallest];
arr[smallest] = temp;
return arr;
         }

         void print(){
System.out.println(counter);
counter = 0;
          }
}



ดูโค้ดแล้วสงสัยก็ เข้าไปดู อธิบายโค้ดอย่างละเอียด MinimumSwapQ JAVA ได้นะครับ
หรือ จะเอา code ไปรันดู ก็ได้ นะครับ

share

[Java]การอ่านข้อมูลจากไฟล์ โดยการใช้ BufferedReader

2 comments

การอ่านข้อมูลจากไฟล์ โดยการใช้ BufferedReader

การอ่านข้อมูลจากไฟล์ โดยการใช้ BufferedReader


ถ้าเราต้องการข้อมูลจาก ไฟล์ c.in ที่ไดร์ C: 
มีตัวอย่างดังนี้ ไฟล์ c.in จะมีข้อมูลดังนี้
   
5
+/+-*%
142Sp94r09y+j0i50*5i198++07m6743
40
/*--++
10234*x12bx3000001033309-81632@1200
200
--//%%
1234567810000000
50
--//
sdjf23349fjdhy36458!@#$%^&09*()xc00bn567800000000                      
20
++--
0000j*09
9

โค้ดที่เราจะเขียนดึงข้อในไฟล์ c.in คือ

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class readerfile {
    public static void main (String [] args) throws FileNotFoundException, IOException{
     File infile = new File("C:/c.in");
     FileReader in = new FileReader(infile);
     BufferedReader bin = new BufferedReader(in) ;
   
     String Stringin;
   
     while((Stringin = bin.readLine()) != null){//เช็ค ถ้าไม่เท่ากับ null ก็อ่านข้อมูลมาทีละบรรทัด จนหมด
         System.out.println(Stringin);  
     }
    }
}


หมายเหตุ
      -  bin.readLine() คือ อ่านข้อมูลในไฟล์ ได้ทีละ 1 บรรทัด


ผลที่ได้จากการ รัน


                               

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

วิดีโอนี้ เอามาให้ดูเพี่อจะให้เห็น การเขียน แบบ OOP สำคัญมากในการเขียน JAVA เขา(นิรนาม จักใคร)พูดว่า ถ้าไม่เข้าใจ OOP ก็ไม่มีประโยชน์ที่จะมาเขียนจาวา

share

2 comments :

Post a Comment

โจทย์ ACM OpStringQ JAVA


โจทย์ opstring

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

input/output


หลักการ ที่สำคัญ มี

  1. ตัวเลขที่ปนกับตัวอักษรให้ดึงเอาเฉพาะตัวเลขมาคิด
  2.  แล้วก็ดึงตัวเลขลออกมาเป็นชุดๆโดยไม่ให้เกินค่าที่้เขากำหนด 
  3. จากนั้นก็เอาตัวเลข มากระทำกับตัวดำเนินการ(operators) เพื่อหาผลลัพธ์
ผลลัพธ์ ที่รันได้

ดาวโหลดตัวโปรแกรมที่นี่ code 

ดาวโหลดตัวโปรแกรมที่นี่ code นี้นำ arraylist มาเก็บข้อมูล

+!!! อย่าลืมสร้างไฟล์ c.in ไว้ที่ C:\c.in 

ข้อมูลอ่านเพิ่มเติม

share