สรุปก่อนสอบครั้งที่ 1 (Week #5)
โครงสร้างโปรแกรมจาวา
// การคอมเมนต์แบบบรรทัดเดียว โปรแกรมจะไม่รันส่วนคอนเมนต์
/*
การคอมเมนต์แบบหลายบรรทัด โปรแกรมจะไม่รันส่วนคอนเมนต์เหมือนกัน
*/
public class MyProgram // ส่วนหัวของ Class
{ // เริ่มส่วนตัวของ Class
// Method ชื่อ main ภายใน Class ชื่อ MyProgram
public static void main(String[] args) // เริ่มส่วนหัวของ Method
{
} // จบส่วนตัวของ Method
} // จบส่วนตัวของ Classชนิดข้อมูลพื้นฐาน (Primitive Data Type)
ชนิดข้อมูลพื้นฐานในภาษาจาวามีทั้งหมด 8 ประเภทด้วยกัน โดยสามารถสังเกตุเมื่อประกาศตัวแปรจะเป็นตัวพิมพ์เล็กหมด ได้แก่
ชนิดข้อมูลเก็บตัวเลขจำนวนเต็ม
- byte
- short
- int (โดยปกติใช้ตัวแปรนี้ ในการเก็บตัวเลขประเภทนี้)
- long (หากคำนวณเลขเยอะมาก ๆ ควรใช้ตัวนี้)
ชนิดข้อมูลเก็บตัวเลขทศนิยม
- float (โดยปกติใช้ตัวแปรนี้ ในการเก็บตัวเลขประเภทนี้) เช่น
123.45f123.45 - double (หากตัองการความเม่นยำในการคำนวณจุดทศนิยมสูง ๆ ควรใช้ตัวนี้) เช่น
123.45
ชนิดข้อมูลเก็บตัวอักษร
- char (ข้อควรระวัง: ชนิดข้อมูลนี้สามารถเก็บตัวอักษรได้ตัวเดียว เช่น
'A'และ'ก'โดยใช้เครื่องหมาย Single Quote'ล้อมรอบตัวอักษร)
ชนิดข้อมูลเก็บค่าจริงเท็จ
- boolean (สามารถเก็บค่าจริงเท็จได้ 2 ค่าเท่านั้น คือ
true,false)
ตัวดำเนินการ (Operators)
+บวก,-ลบ,*คุณ,/หาร,%เอาเศษจากการหาร<น้อยกว่า,<=น้อยกว่าหรือเท่ากับ,>มากกว่า,>=มากกว่า,==เท่ากับ,!=ไม่เท่ากับ!นิเสธ&&&และ (ส่วนมากใช้&&)||หรือ
ตัวดำเนินการกำหนดค่า (Assignment Operators)
| ตัวดำเนินการ | ตัวอย่างการใช้งาน | เทียบเท่ากับ | ตัวดำเนินการ | ตัวอย่างการใช้งาน | เทียบเท่ากับ |
|---|---|---|---|---|---|
+= | x += y | x = x + y | /= | x /= y | x = x / y |
-= | x -= y | x = x - y | %= | x %= y | x = x % y |
*= | x *= y | x = x * y |
การเพิ่มและการลด (Increment & Decrement)
Prefixเพิ่มหรือลดจำนวนทีละ 1 เข้าไปก่อนค่อยใช้งาน เช่น++countPostfixเพิ่มหรือลดจำนวนทีละ 1 เข้าไปหลังใช้งานเสร็จแล้ว เช่นcount++
ความแตกต่างระหว่าง Prefix และ Postfix
int num1 = 1, num2 = 1;
int num3 = ++num1 + 2; // ตอนแรก num1 มีค่าเป็น 1 แต่ใช้ Prefix เพิ่มค่าเข้าไปก่อนใช้งาน บรรทัดจึงกลายเป็น 2 + 2
System.out.println(num3); //num3 = 4
System.out.println(num1); //num1 = 2
int num4 = num2++ + 2; // ตอนแรก num2 มีค่าเป็น 1 แต่ใช้ Postfix เพิ่มค่าเข้าไปหลังใช้งาน บรรทัดจึงยังเป็น 1 + 2
System.out.println(num4); //num4 = 3
System.out.println(num2); //num2 = 2การอ่านอินพุต (Scanner)
ก่อนการใช้งาน Scanner ทุกครั้งต้องนำเข้าการใช้งานก่อนเสมอ import java.util.Scanner; เวลาใช้ให้สร้างตัวแปรเพื่อมาเก็บ เช่น Scanner sc = new Scanner(System.in);
และเวลาเรียกใช้งาน สามารถเรียกจากตัวแปรที่เรากำหนดไว้ เช่น answer = sc.nextLine();
sc.next()- รับค่าข้อความ 1 คำ (String)sc.nextLine()- รับค่าข้อความ 1 บรรทัด (String)sc.nextInt()- รับค่าตัวเลขจำนวนเต็ม (Int)sc.nextFloat()- รับค่าตัวเลขทศนิยม (Float)sc.nextDouble()- รับค่าตัวเลขทศนิยม (Double)
สตริง (String)
สตริงแต่ไม่จัดอยู่ในชนิดข้อมูลพื้นฐาน แต่มันเป็นชื่อ Class ในจัดเป็นตัวแปรชนิด object ที่สามารถเรียก Method ได้ สามารถสร้างสตริงได้ 2 วิธี คือ String variable = "text" และ String variable = new String("text")
int score [ 30 ]
String text [ ] ---> "Some text"ข้อควรระวัง: ชนิดข้อมูลพื้นฐานเก็บค่าของตัวมันเอง แต่ตัวแปรชนิด object เก็บค่าที่อยู่ของ object เช่น
สังเกตุว่าในหน่วยความจำของ score ซึ่งเป็นชนิดข้อมูลพื้นฐานเก็บค่า 30 ไปเลย แต่หน่วยความจำของ text ซึ่งเป็นตัวแปรชนิด object จองที่อยู่ในหน่วยความจำแล้วชี้ไปหาตำแหน่งของข้อมูลแทน
การเปรียบเทียนสตริง
เนื่องจากสตริงเป็นตัวแปร objects เมื่อเปรียบเทียบข้อความควรใช้เมธอด equals() เช่น text1.equals(text2) แทน หรือหากไม่ต้องการเทียบพิมพ์ใหญ่ - เล็กใช้เมธอด equalsIgnoreCase() เช่น text1.equalsIgnoreCase(text2)
เมธอดในสตริง
สังเกตุโครงสร้างของเมธอดให้สังเกตุว่ามันบอก ค่าพารามิเตอร์และชนิดข้อมูล ที่มันต้องการ และ ชนิดข้อมูลที่มันจะได้กลับเมื่อเรียกใช้เมธอดนี้ แล้ว เช่น public String concat(String index) หมายถึง
- เมธอดชื่อ
concat - รับค่าพารามิเตอร์ 1 ตัว คือ
indexที่มีชนิดข้อมูลเป็นString(สังเกตุในวงเล็บหลังชื่อเมธอด) - เมื่อเรียกใช้งานแล้วจะคืนค่าชนิดข้อมูล
Stringกลับมา (สังเกตุก่อนชื่อเมธอด)
public int length()
ความยาวข้อความ เช่น กำหนดตัวแปร String text = "HelloWorld";
text.length()ได้ค่า10มาเพราะมี 10 ตัวอักษรในข้อความนี้
public char charAt(int index)
เอาตัวอักษรที่ตำแหน่ง index เช่น กำหนดตัวแปร String text = "HelloWorld";
text.charAt(0)หมายถึงเอกตัวอักษรแรกtext.charAt(text.length() - 1)หมายถึงเอกตัวอักษรตัวสุดท้าย (หมายเหตุ: ต้อง - 1 เพราะว่า charAt ใช้ตำแหน่งindexซึ่งเรื่มที่0แต่เมธอด length จะได้ค่าจำนวนนับเริ่มที่1)
public int indexOf(String str)
หาตำแหน่งข้อความ str ที่เจอตัวแรกเริ่มจากตำแหน่งแรกของข้อความ เช่น กำหนดตัวแปร String text = "HelloWorld";
text.indexOf("o")ได้ค่า4เพราะเจอoตัวแรกที่ตำแหน่งนั้นของข้อความ
public int indexOf(String str, int fromIndex)
หาตำแหน่งข้อความ str ที่เจอตัวแรกเริ่มจากตำแหน่ง fromIndex เป็นต้นไป เช่น กำหนดตัวแปร String text = "HelloWorld";
text.indexOf("o", 5)ได้ค่า6เพราะเจอoตัวแรกที่ตำแหน่งนั้นของข้อความ เมื่อเริ่มหาตั้งแต่ตำเแหน่งที่5
public int substring(int beginIndex, int endIndex)
สกัดส่วนของข้อความเริ่มจากตำแหน่ง beginIndex ถึงก่อนตำแหน่ง endIndex และไม่จำเป็นต้องใส่ endIndex ก็ได้ เช่น กำหนดตัวแปร String text = "HelloWorld";
text.substring(5)ได้ค่าWorldเพราะเริ่มสกัดตั้งแต่ตำแหน่งที่5ซึ่งเป็นตัวWไปเรื่อย ๆ จนจบคำtext.substring(5, 7)ได้ค่าWoเพราะเริ่มสกัดตั้งแต่ตำแหน่งที่5ซึ่งเป็นตัวWไปเรื่อย ๆ จนถึงตำแหน่งที่7 - 1ซึ่งเป็นตัวotext.substring(text.length() - 3, text.length())ได้ค่าrldเพราะเริ่มสกัดตั้งแต่ตำแหน่งที่10 - 3ซึ่งเป็นตัวrไปเรื่อย ๆ จนจบข้อความ
หมายเหตุ: text.length() เป็นจำนวนนับตั้งแต่ 1 เหมือนมาใส่ในพารามิเตอร์ endIndex ซึ่งเป็น Index ก่อนจบการสกัด จึงสามารถใส่ได้เลยโดยไม่ต้อง -1 ก่อน
public int compareTo(String anotherString)
public int compareToIgnoreCase(String anotherString)
ตรวจสอบว่าข้อความในสตริงมาก่อนหรือหลังในระบบตัวอักษรตามตารางด้านล่าง
| Characters | Unicode Values |
|---|---|
| 0 - 9 | 48 ถึง 57 |
| A - Z | 65 ถึง 90 |
| a - z | 97 ถึง 122 |
ตัวอย่างการใช้งาน text1.compareTo(name2)
- ถ้า 2 ข้อความเหมือนกันจะได้ค่า
0กลับมา - ถ้าข้อความ
name1มาก่อนจะได้ค่าติดลบกลับมา - ถ้าข้อความ
name1มาหลังจะได้ค่าบวกกลับมา - เมธอดจะตรวจสอบทีละตำแหน่งถ้าเหมือนกันเกือบหมด แต่ความยาวไม่เหมือนกัน มันจะบอกค่าความต่างความยาวแทน
String text1 = "A", text2 = "A";
System.out.println(text1.compareTo(text2));
// ได้ค่า 0 เพราะข้อความเท่ากัน
String text3 = "A", text4 = "B";
System.out.println(text3.compareTo(text4));
// ได้ค่า -1 เพราะในข้อความ text3 ตัว A มาก่อนตัว B ในข้อความ text4 ทั้งหมด 1 ตำแหน่ง
String text5 = "D", text6 = "A";
System.out.println(text5.compareTo(text6));
// ได้ค่า 3 เพราะในข้อความ text5 ตัว D มาหลังตัว A ในข้อความ text6 ทั้งหมด 3 ตำแหน่ง
String text7 = "ADDC", text8 = "AD";
System.out.println(text7.compareTo(text8));
// ได้ค่า 2 เพราะตัวอักษร 2 ตัวแรกเหมือนกัน แต่ความยาวข้อความ text7 มากกว่า 2 ตัวอักษร
String text9 = "AD", text10 = "ADDC";
System.out.println(text9.compareTo(text10));
// ได้ค่า -2 เพราะตัวอักษร 2 ตัวแรกเหมือนกัน แต่ความยาวข้อความ text10 มากกว่า 2 ตัวอักษรเงื่อนไข If-Else
หมายเหตุ: สามารถใช้ if โดด ๆ ได้โดยไม่จำเป็นต้องมี else และสามารถใช้ if และ else if พร้อมกัน โดยไม่จำเป็นต้องมี else
if (a) {
// ถ้า a เป็นจริงโค้ดในนี้ทำงาน
} else if (b) {
// ถ้า a เป็นเท็จ แล้วถ้า b เป็นจริงโค้ดในนี้ทำงาน
} else {
// ถ้า a และ b เป็นเท็จโค้ดในนี้ทำงาน
}เงื่อนไข Switch
switch (ตัวแปรที่ต้องการตรวจสอบ) {
case ค่าที่ 1:
// โค้ดที่จะทำงานเมื่อตัวแปรมีค่าเท่ากับค่าที่ 1
break;
case ค่าที่ 2:
case ค่าที่ 3:
// โค้ดที่จะทำงานเมื่อตัวแปรมีค่าเท่ากับค่าที่ 2 หรือ 3
break;
// ... cases อื่นๆ ...
default:
// โค้ดที่จะทำงานเมื่อไม่ตรงกับ case ใดเลย
}int number = 1;
switch (day) {
case 1:
System.out.println("หนึ่ง");
break;
case 2:
System.out.println("สอง");
break;
case 3:
System.out.println("สาม");
default:
System.out.println("เลขอื่น ๆ ไม่รองรับ");
}หมายเหตุ: อย่าลืม break: ถ้าไม่ใส่ break โปรแกรมจะทำงานต่อไปยัง case ถัดไปโดยไม่ตรวจสอบเงื่อนไข
การลูปและการทำงานซ้ำ
While Loop
while (condition) {
//ทำงานไปเรื่อย ๆ จนกว่า condition จะเป็นเท็จ
}Do-While Loop
do {
//ทำงานก่อนโดยไม่สนเงื่อนไขอย่างน้อย 1 รอบ แล้วทำงานไปเรื่อย ๆ จนกว่า condition จะเป็นเท็จ
} while (condition);For Loop
for (initialization; condition; increment) {
//โค้ดจะทำงานจน condition เป็นเท็จ
}- initialization ส่วนนี้จะทำงานก่อนเริ่มลูป
- increment ส่วนนี้จะทำงานหลังจบการทำงานของลูปทุกรอบ
for (int i = 0; i < 100; i++) {
//กำหนดตัวแปร i เป็น 0 ก่อนเริ่มลูปนอก
//ลูปทำงานไปเรื่อย ๆ จนกว่าเงื่อนไข i < 100 เป็นเท็จ
//เมื่อจบลูปแต่ละรอบให้ i++
for (int j = 100; j > 0; j--) {
//กำหนดตัวแปร j เป็น 100 ก่อนเริ่มลูปใน
//ลูปทำงานไปเรื่อย ๆ จนกว่าเงื่อนไข j > 0 เป็นเท็จ
//เมื่อจบลูปแต่ละรอบให้ j--
}
}การจบการทำงานลูปในทันที Break
for (int i = 0; i < 10; i++) { // ลูปเริ่มตั้งแต่ i เท่ากับ 0
if (i == 5) {
break; //เมื่อ i เป็น 5 ให้จบการทำงานของลูปนี้ในทันที และจะไม่เริ่มรอบใหม่แล้ว
}
System.out.print(i + " "); // จะได้ค่า 0 1 2 3 4
}การทำต่อการทำงานลูปในทันที Continue
for (int i = 0; i < 10; i++) { // ลูปเริ่มตั้งแต่ i เท่ากับ 0 จนถึง 9
if (i % 2 == 0) {
continue; //เมื่อ i หารสองลงตัว ให้ข้ามการทำงานของโค้ดในลูปไปเริ่มรอบใหม่ทันที
}
System.out.print(i + " "); // จะได้ค่า 1 3 5 7 9
}