34
บทที2 ภาษา Java พื้นฐาน Java Language Fundamentals เนื้อหาในบทนี้กล่าวถึงรูปแบบการเขียนภาษา Java เครื่องหมายการทางาน (Operator) ชนิดของข้อมูล การเขียนโปรแกรมทาซ้า และคาสั่งเงื่อนไข การเขียนคาอธิบายในโปรแกรมภาษา Java การเขียนโปรแกรมโดยทั่วไป ผู้เขียนโปรแกรมควรแทรกคาอธิบายไว้ในตัวโปรแกรมด้วย เพื่อให้ผู้อ่าน โปรแกรมเข้าใจโปรแกรมได้ง่าย การเขียนคาอธิบายหรือ Comments ในภาษา Java มี 3 แบบคือ 1. In-line Comments เป็นการแทรกคาอธิบายโปรแกรมภายในหนึ่งบรรทัด ใช้เครื่องหมาย “//” เป็น จุดเริ่มต้นการเขียนคาอธิบาย และสิ้นสุดเมื่อจบบรรทัด การอธิบายแบบนี้เหมือนการเขียนคาอธิบาย ในภาษา C++ 2. Block Comments เป็นการแทรกคาอธิบายเป็นกลุ่ม หรือหลายบรรทัด ใช้เครื่องหมาย “/*” เป็น จุดเริ่มต้นและเครื่องหมาย “*/” เป็นจุดสิ้นสุดคาอธิบาย รูปแบบการเขียนคาอธิบาบแบบนี้เหมือนการ เขียนคาอธิบาบในภาษา C 3. Javadoc Comments เป็นคาอธิบายที่ถูกสร้างเป็นรูปแบบภาษา HTML โดยโปรแกรม javadoc ใช้ เครื่องหมาย /**เป็นจุดเริ่มต้น และเครื่องหมาย */ เป็นจุดสิ้นสุดการเขียนคาอธิบาย (สาหรับการ เขียน Javadoc Comments ผู้อ่านควรมีความรู้เรื่องการเขียนโปรแกรมแบบเชิงวัตถุก่อน ดังนั้นจะ กล่าวถึงการเขียน Javadoc Comments ในบทที3 ต่อไป) ตัวอย่างการเขียนคาอธิบายโปรแกรมแบบ In-line และ Block แสดงดังต่อไปนี// This is an in-line comment. This looks like C++ comment style. // You can write many comments as you would like to // But the beginning of the line must include “//” /* This is a block comment. Anything you can put here. The compiler will ignore everything in this block. This comment looks like C comment style. */ In-line comment Block comment

บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

  • Upload
    tranthu

  • View
    263

  • Download
    3

Embed Size (px)

Citation preview

Page 1: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

บทท 2

ภาษา Java พนฐาน Java Language Fundamentals

เนอหาในบทนกลาวถงรปแบบการเขยนภาษา Java เครองหมายการท างาน (Operator) ชนดของขอมล การเขยนโปรแกรมท าซ า และค าสงเงอนไข

การเขยนค าอธบายในโปรแกรมภาษา Java

การเขยนโปรแกรมโดยทวไป ผเขยนโปรแกรมควรแทรกค าอธบายไวในตวโปรแกรมดวย เพอใหผอานโปรแกรมเขาใจโปรแกรมไดงาย การเขยนค าอธบายหรอ Comments ในภาษา Java ม 3 แบบคอ

1. In-line Comments เปนการแทรกค าอธบายโปรแกรมภายในหนงบรรทด ใชเครองหมาย “//” เปนจดเรมตนการเขยนค าอธบาย และสนสดเมอจบบรรทด การอธบายแบบนเหมอนการเขยนค าอธบายในภาษา C++

2. Block Comments เปนการแทรกค าอธบายเปนกลม หรอหลายบรรทด ใชเครองหมาย “/*” เปนจดเรมตนและเครองหมาย “*/” เปนจดสนสดค าอธบาย รปแบบการเขยนค าอธบาบแบบนเหมอนการเขยนค าอธบาบในภาษา C

3. Javadoc Comments เปนค าอธบายทถกสรางเปนรปแบบภาษา HTML โดยโปรแกรม javadoc ใชเครองหมาย “/**” เปนจดเรมตน และเครองหมาย */ เปนจดสนสดการเขยนค าอธบาย (ส าหรบการเขยน Javadoc Comments ผอานควรมความรเรองการเขยนโปรแกรมแบบเชงวตถกอน ดงนนจะกลาวถงการเขยน Javadoc Comments ในบทท 3 ตอไป)

ตวอยางการเขยนค าอธบายโปรแกรมแบบ In-line และ Block แสดงดงตอไปน

// This is an in-line comment. This looks like C++ comment style.

// You can write many comments as you would like to

// But the beginning of the line must include “//”

/* This is a block comment.

Anything you can put here.

The compiler will ignore everything in this block.

This comment looks like C comment style.

*/

In-line comment

Block comment

Page 2: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

10 การเขยนโปรแกรมภาษา Java

Keywords ค าหลกเปนค าทภาษา Java ไดก าหนดขนมาเพอใชในวตถประสงคทตางกนในการเขยนโปรแกรม เชน

ค าหลก boolean ใชในการประกาศตวแปรชนดตรรกะ หรอค าหลก new ใชในการสรางวตถจากคลาสเปนตน ค าหลกเหลานไมสามารถน าไปตงเปนชอคลาส ตวแปร หรอ Method ได ดงตารางท 2.1

ตารางท 2.1 แสดงถง 49 ค าหลกในภาษา Java (คา true, false และ null ไมใชค าหลกใน Java)

abstract continue for new switch assert default goto package synchronized boolean do if private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while

Identifier

การตงชอคลาส หรตวแปร ตองมกฎเกณฑตามทภาษา Java ก าหนดไว ซงชอดงกลาวเรยกวา Identifier ตวอยางของ Identifier ในภาษา Java เชน TestFruit หรอ total_cal

กฎการตงชอของ Identifier มดงน Identifier ตองขนตนดวยตวอกษร เครองหมาย “$” หรอเครองหมาย “_” เทานน ส าหรบตวเลข “0” ถง “9” สามารถใชไดแตตองไมใชตวแรกของ Identifiers หามมชองวางใน Identifiers และหามตงชอตรงกบค าหลก (Keywords) ในภาษา Java ดวย ดงตวอยาง Identifier ทถก Identifier ทผด TestFruit Test Fruit (มชองวาง) Good_Morning Good Morning (มชองวาง) Test1 1Test (ตวเลขไมสามารถขนตนได) $age #age (# ไมสามารถขนตนได) _OK true (เปนคาของ Boolean ในภาษา Java) ตวแปร (Variable) ตวแปรใชในการเกบขอมล ชอของตวแปรตองเปน Identifier ดวย การประกาศตวแปรในโปรแกรม (Variable Declaration) จะมรปแบบดงน

Data Type Identifier [, Identifier];

Page 3: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 11

Data Type Data Type คอชนดของขอมลในตวแปรซงแบงเปน 2 ประเภทคอ Primitive และ Reference ซงมความ

แตกตางกน แตมความส าคญในในการเขยนโปรแกรมภาษา Java เทาเทยมกน Primitive เปน Data Type พนฐานในภาษา Java ซงสามารถเกบคาไดเพยงคาเดยวและมขนาดทแนนอน

เชน เลขจ านวนเตม (Integer) เลขทศนยม (Floating Point) ตวอกษร (Character) หรอ คาจรงและเทจ (Boolean) 1. Data Type ชนดตวเลขคอ byte, short, int และ long 2. Data Type ชนดทศนยมคอ float และ double 3. Data Type ชนดตวอกษรคอ char 4. Data Type ชนดจรงและเทจคอ boolean

ตารางท 2.2 แสดง Data Type ชนดตางๆ

Keywords ค าอธบาย ชวงขอมล แบบตวเลข

byte Two’s Complement 8 บต -128 ถง 127 short Two’s Complement 16 บต -32,768 ถง 32,767 int Two’s Complement 32 บต -2,147,483,648 ถง

2,147,483,647 long Two’s complement 64 บต -263 ถง 263-1

แบบทศนยม float IEEE 754 32 บต -3.4E38 ถง 3.4E38 double IEEE 754 64 บต -1.7E308 ถง 1.7E308

แบบตวอกษร char 16 บต 65,536 ตวอกษร

แบบคาจรงและเทจ boolean 1 บต true และ false

การเลอกชนดของ Data Type ขนอยกบลกษณะของโจทยปญหาและชวงคาของขอมลทตองการเกบขอมล เชนโปรแกรมการบวกเลขสองหลก ถาประกาศตวแปรเปนแบบ byte อาจไมเหมาะสม เพราะถาตวเลขสองตวเปน 99 และ 98 ท าใหผลรวมเปน 197 ซงเกนคาสงสดทตวแปรชนด byte จะเกบไดดงตารางท 2.2 ดงนนตวแปรแบบ short จงมเหมาะสมมากกวาส าหรบโปรแกรมบวกเลขสองหลก ไมมความจ าเปนทตองใชตวแปรชนด long เพราะคาของตวแปรชนด long สามารถเกบคาตวเลขจ านวนเตมไดสงเกนกวาผลลพธทเปนไปไดของโปรแกรมบวกเลขสองหลก และอาจสงผลใหโปรแกรมท างานไดชาลง เพราะการบวกขอมลทจ านวนบตมาก ท างานไดชากวาการบวกขอมลทมจ านวนบตนอย ดงนนการเลอกชนดของตวแปรควรพจารณาถงขอบเขตคาทตองการเกบขอมลและโจทยปญหาเปนหลก ตวอยางของการประกาศตวแปรแบบ Primitive คอ int integer;

char ch;

Page 4: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

12 การเขยนโปรแกรมภาษา Java

float f;

boolean b;

//ในกรณทประกาศตวแปรชนดเดยวกนเปนจ านวนมาก สามารถใชเครองหมาย “,” ในการคนได int i, j, k, l, m, n, o, p, q, u, r;

ตวแปรแบบทสองคอ Reference ซงเปนตวแปรแบบตวช (Pointer) ไปทวตถ ตวแปรประเภทนมความซบซอนมากกวาแบบแรก Primitive เนองจากเปนตวแปรทอางถงกลมของตวแปรแบบ Primitive ในภาพท 2.1 แสดงตวอยางของการใชตวแปรแบบ Reference // สรางตวแปรชนด Reference ชอ MyHouse ซงเปนชนด House ซงตวแปรนยงไมสามารถน าไปใชได House MyHouse;

// สรางวตถ House และให MyHouse ชไปทวตถ House MyHouse = new House(“Wooden”);

MyHouse เปน Data Type แบบ Reference เพราะท าหนาทเปนตวชเทานน ถามการประกาศตวแปร House MyHouse; เพยงเทาน ตวแปร MyHouse ยงไมสามารถน าไปใชไดเพราะ MyHouse ชไปท Null (ไมมคา) ดงนนตองใชค าสง new เพอท าการสรางวตถบานขนมากอน และให MyHouse ชไปทวตถนน (บทท 3 จะกลาววธการใชงานตวแปรประเภทนโดยละเอยด)

ภาพท 2.1 แสดงตวอยางการสรางตวแปรแบบ Reference

การเขยนคาในตวแปร (Literals) คาของตวแปรมทงหมด 5 ประเภทคอ Integer, Floating Point, Character, String, และ Boolean Literals ซงสามารถเกบขอมลทแตกตางกน Integer literals การเขยนคาแบบเลขจ านวนเตม สามารถเขยนได 3 แบบคอ

1. แบบเลขฐานสบ เชน 3 หรอ 3L 2. แบบเลขฐานแปด ขนตวดวยเลขศนย เชน 03 หรอ 03L 3. แบบเลขฐานสบหก ขนตนดวยเลขศนยและเอกซ เชน 0xA หรอ 0xAL

MyHouse

House

Object MyHouse

Null House MyHouse;

MyHouse = new House(“Wooden”);

Page 5: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 13

การค านวณตวเลขจ านวนเตมในภาษา Java ถาไมมการระบชนดตอทายตวเลข มการค านวณแบบ 32 บตหรอ Integer เทานน การใสคา และค านวณตวแปรทเปนชนด 64 บตหรอ Long จ าเปนตองเขยน L หรอ l ลงทายทกครงเสมอ เพอใหตวแปรภาษา Java เปลยนคาจาก Integer เปน Long long a = 2147483647; // ไมเกด Error เมอมการผานตวแปลภาษา เพราะจ านวนตวเลขไมเกนคาท // Integer สามารถเกบได long b = 2147483648; // เกด Error เพราะตวเลขมคาเกนคาสงสดท Integer เกบคาได long c = 214748648L; // ไมเกด Error เพราะมการเขยน L ลงทายเพอบอกใหตวแปลภาษา // เปลยนคา Integer เปน Long /* Error เมอผานตวแปลภาษา Java เพราะ a+b เปนการบวกแบบ 32 บตตามขอก าหนดของ Java เนองจากไมมการระบชนดตอทายขอมล ท าใหไมสามารถใหตวแปร a ไปเทากบ a+b ได เนองจาก a+b ผลลพททไดเปนคา Integer */ byte a = 3, b = 5;

a = a + b; /* ถกตอง การทก าหนดตวแปร Byte ใหเทากบ Integer ตองใส (byte) เพอบอกใหตวแปรภาษาเปลยนขอมลจากการบวก 32 บตใหเทากบตวแปรขนาด 8 บต ซงอาจเสยความแมนย า (Loss of Precision) บางสวน */ a = (byte) (a + b);

Floating point literals การค านวณตวเลขทศนยมในภาษา Java ใชการค านวณแบบ 64 บตหรอ Double ดงนนการใสคาใหตวแปรทเปน Float ตองเขยนลงทายดวย F หรอ f และตวแปรทเปนชนด Double ตองลงทายดวย D หรอ d แตไมจ าเปนตองเขยนกได เพราะการค านวณตวเลขทศนยมในภาษา Java โดยปกตเปน Double

ตวอยางของ Float Literals คอ 2.0F 3.f 5e7f 0.4e+38f ตวอยางของ Double Literals คอ 2.0 3. 3e-7 .9E+200

double m = 2.3; // ถกตอง /* ผด ตองเขยน f ตอทายตวเลข เนองจากไมสามารถก าหนดคา Double ใหเทากบ Float ได เพราะ Float มขนาดเลกกวา */ float f = 2.3; float k = 2.3f; // ถกตอง

Page 6: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

14 การเขยนโปรแกรมภาษา Java

การประกาศตวแปรทเปน Float เมอมการใสคาใหกบตวแปรจะตองเขยนตวอกษร F หรอ f ดวยทกครง เพอใหตวแปลภาษาสามารถเปลยนคาจาก Double เปน Float เพราะการค านวณทศนยมโดยปกตเปนแบบ 64 บต หรอ Double ดงทกลาวไปแลว float a = 3; // ไมเกด Error เมอมการผานตวแปลภาษา Java float b = 3.0f; // ถกตอง จากตวอยางขางบน float a = 3; ไมเกด Error เพราะเลข 3 หมายถงตวเลขจ านวนเตมทมขนาด 32 บต การใสคาตวเลข Integer 32 บต ใหกบตวแปรชนด Float สามารถท าไดเพราะมขนาดเทากน แตถาตวเลขมจดทศนยมเมอใด ตวแปรภาษาจะมองตวเลข 3.0 เปนแบบ Double 64 บต ดงนนจ าเปนตองเขยน f หลงตวเลข Character literals การเขยนขอมลชนดตวอกษร ตองเขยนอยในเครองหมาย ‘ (Single Quotation Mark) ตวอยางเชน ‘c’ และ ‘A’ และขอมลชนดทเปนตวอกษรนนสามารถเขยนโดยใช Escape Character (เครองหมาย \) น าหนาไดดงตารางท 2.3

ตารางท 2.3 แสดงความหมายของตวอกษรทใช Escape Character เครองหมาย ค าอธบาย เครองหมาย ค าอธบาย \n ขนบรรทดใหม

(New line) \t ตวอกษรตงระยะ

(Tab) \r เลอน Cursor ไป

จดเรมตนของบรรทด (Carriage return)

\’ พมพเครองหมาย ‘

\b ลบตวอกษรทางซายมอ 1 ตวอกษร (Backslash)

\\ พมพเครองหมาย \

\” พมพเครองหมาย “ \uxxx xxx เปนเลขฐานสบหก ตวอยางเชน ‘\u3f5f

\ooo ooo เปนเลขฐานแปด ตวอยางเชน ‘\12’

\f ตวอกษร Form Feed

ตวอยางของการเขยนคาใหตวแปรแบบ Character char ch = ‘c’; // เทากบตวอกษร c ch = ‘A’; // เทากบตวอกษร A ch = ‘\n’; // เทากบ ตวอกษรขนบรรทดใหม ch = ‘\\’ // เทากบเครองหมาย \ ch = ‘\’’; // เทากบเครองหมาย ‘

Page 7: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 15

String literals การเขยนขอมลตวอกษรทมากกวา 1 ตว หรอประโยค ขอมลนนตองอยภายในเครองหมาย “ (Double Quotation Mark) ดงตวอยาง String str = “สวสดครบ”; str = “สวสดครบ\n”; // ตวอกษรในตาราง 2.3 สามารถน ามาเขยนเปนประโยคได เชน \n str = “”; // ตวแปร str เปน String ทมตวอกษร 0 ตว str = “สบายดไหมครบ \u3f07 \n”; // สามารถใชเลขฐาน 16 ในประโยคของ String ได /*เครองหมาย + จะรวม 2 Strings เปน String เดยวกน เรยกวาการ String Concatenation */ str = “Hello” + “ How are you?”;

Boolean literals มสองคาคอ true และ false คา Boolean ใชบอยครงในภาษา Java เพอควบคมการเขยนโปรแกรมแบบวนซ า (Loop) และแบบเงอนไข (If Statement) ซงจะกลาวถงในชวงทายบท boolean yes = ture; boolean no = false; Operator ภาษา Java ไดแบงรปแบบการค านวณ (Operator) เปน 5 แบบคอ

1. Arithmetic Operators 2. Relational and Conditional Operators 3. Shift and Logical Operators 4. Assignment Operators 5. Miscellaneous Operators

1. Arithmetic Operators เปนเครองหมายทใชในการค านวณแบบ Arithmetic คอ + - * / % การเขยนนพจนของการค านวณแบงเปน 3 แบบคอ แบบ Infix เชน Operand1 + Operand2 แบบ Prefix เชน ++Operand และสดทายแบบ Postfix เชน Operand++ โปรแกรม Arithmetic.java แสดงการใชงาน Arithmetic Operators public class Arithmetic {

public static void main(String[] args) {

int a = 30, b = 20;

double x = 100.99, y = 20.78;

System.out.println("a = " + a);

System.out.println("b = " + b);

System.out.println("a+b = " + (a+b));

System.out.println("a-b = " + (a-b));

System.out.println("a*b = " + (a*b));

System.out.println("a/b = " + (a/b)); // ผลหารทเปนจ านวนเตม

Page 8: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

16 การเขยนโปรแกรมภาษา Java

System.out.println("a%b = " + (a%b)); // เศษทเหลอจากการหาร

System.out.println(""); System.out.println("x = " + x); System.out.println("y= " + y);

System.out.println("x+y = " + (x+y));

System.out.println("x-y = " + (x-y));

System.out.println("x*y = " + (x*y));

System.out.println("x/y = " + (x/y)); // ผลหารทเปนทศนยม

System.out.println("x%y = " + (x%y)); // เศษทเหลอจากการหาร

}

}

---------- Java Output ----------

a = 30

b = 20

a+b = 50

a-b = 10

a*b = 600

a/b = 1

a%b = 10

x = 100.99

y= 20.78

x+y = 121.77

x-y = 80.21

x*y = 2098.5722

x/y = 4.859961501443696

x%y = 17.86999999999999

การเขยนนพจนแบบ Prefix และ Postfix ใชในการเพมคาหรอลดคาใหกบตวแปรซงการเพมคาใชเครองหมาย ++ และการลดคาใหตวแปรใชเครองหมาย – การวางเครองหมายเหลาน สามารถวางไวหนาตวแปร (Prefix) และหลงตวแปร (Postfix) ได ตวอยางเชน i++ และ ++i เมอจบค าสงแลว คา i ทไดจะมคาเทากน ยกเวนในกรณทมการ Assign คาตวแปร (การใหคาในตวแปรดานขวามอเทากบดานซายมอ เชน a = b ท าให a มคาเทากบ b) ผลลพธทเกดจากการ Assign คาตวแปรจะไมเทากน ดตวอยางโปรแกรม ShortcutOperator.java ประกอบความเขาใจ public class ShortcutOperator {

public static void main(String[] args) {

int i = 5;

int j;

System.out.println("i = " + i);

j = i++; // j เทากบ 5 และ i เทากบ 6

System.out.println("j = i++ Value j = " + j );

System.out.println("Value i now= "+ i);

j = ++i; // j เทากบ 7 และ i เทากบ 7

System.out.println("j = ++i Value j = " + j );

System.out.println("Value i now= "+ i);

}

}

---------- Java Output ----------

i = 5

Page 9: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 17

j = i++ Value j = 5

Value i now= 6

j = ++i Value j = 7

Value i now= 7

จากตวอยางโปรแกรม ShortcutOperator.java การ Assign คาใหกบตวแปรโดยใช Postfix j = i++ ท าให j มคาเทากบ i และเมอจบค าสง คา i จะเพมอก 1 สวนการ Assign คาใหกบตวแปรโดยใช Prefix j = ++i ท าใหมการเพมคา i อก 1 กอนทจะ Assign คาใหกบ j 2. Relational and Conditional Operators การค านวณแบบเปรยบเทยบหรอ Relational จะพจารณาความสมพนธระหวาง Operand 2 คา และสงคาผลลพธเปน true หรอ false จากตารางท 2.4 แสดงใหเหนความความสมพนธระหวาง Operand1 และ Operand 2 ถา op1 Operator op2 เปนจรง ผลลพธทไดคอคา true ถาไมจรง ผลลพธทไดจะเปนคา false ดงตวอยางในโปรแกรม Relational.java

ตารางท 2.4 แสดงเครองหมายทใชในการค านวณแบบ Relational Operator การใชงาน สงคา true กลบถา

> op1 > op2 op1 มากกวา op2 >= op1 >= op2 op1 มากกวาหรอเทากบ op2 < op1 < op2 op1 นอยกวา op2 <= op1 <= op2 op1 นอยกวาหรอเทากบ op2 == op1 == op2 op1 เทากบ equal != op1 != op2 op1 ไมเทากบ op2

public class Relational {

public static void main(String[] args) {

int i = 10;

int j = 20;

System.out.println("i = "+ i + " j = " + j);

System.out.println("i>j "+ (i>j));

System.out.println("i<j "+ (i<j));

System.out.println("i>=j "+ (i>=j));

System.out.println("i<=j "+ (i<=j));

System.out.println("i==j "+ (i==j));

System.out.println("i!=j "+ (i!=j));

}

}

---------- Java Output ----------

i = 10 j = 20

i>j false

i<j true

i>=j false

i<=j true

i==j false

i!=j true

Page 10: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

18 การเขยนโปรแกรมภาษา Java

การค านวณโดยใช Relational Operator สามารถเปรยบเทยบความสมพนธระหวาง 2 Operands เทานน ในกรณทมการเปรยบเทยบมากกวา 2 Operands จ าเปนตองใช Conditional Operator มาเชอม จากตารางท 2.5 op1 และ op2 คอนพจนแบบ Relational Operator เชน

(i<3) && (j > 5) จะสงคาจรงกลบ ในกรณท i < 3 และ j > 5 (i<3) || (j>5) จะสงคาจรงกลบ ในกรณท i < 3 หรอ j > 5 !hello จะสงคาจรงกลบ ในกรณทตวแปร hello เปนเทจ เครองหมาย ! สวนใหญใชใน

การทดสอบเงอนไขในค าสง if

ตารางท 2.5 แสดงเครองหมายทใชในการค านวณแบบ Conditional Operator การใชงาน สงคา true กลบถา

&& op1 && op2 op1 และ op2 เปนจรง || op1 || op2 op1 หรอ op2 เปนจรง ! ! op op เปนเทจ

โปรแกรม Conditional.java แสดงตวอยางการใช Conditional Operator

public class Conditional {

public static void main(String[] args) {

int i = 5; int j = 10;

boolean result;

System.out.println("i = " + i);

System.out.println("j = " + j);

result = (i <=5 ) && (j>=10);

System.out.println("(i <=5) && (j>=10) " + result);

result = (i <6 ) || (j>20);

System.out.println("(i <6) || (j>20) " + result);

result = (i <3 ) && (j>2);

System.out.println("(i <3) && (j>2) " + result);

result = (i >6 ) || (j>20);

System.out.println("(i >6) || (j>20) " + result);

boolean hello = true;

System.out.println("Value of hello is " + hello);

System.out.println("Value of !hello is " + !hello);

}

}

---------- Java Output----------

i = 5

j = 10

(i <=5) && (j>=10) true

(i <6) || (j>20) true

(i <3) && (j>2) false

(i >6) || (j>20) false

Value of hello is true

Value of !hello is false

Page 11: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 19

3. Shift and Logical Operators เปน Operator ทใชกบตวแปรชนดตวเลขจ านวนเตมเทานน ซงประกอบดวย char, byte, short, integer และ long ตวแปรชนดอน เชน float หรอ boolean ไมรองรบการท างานของ Operator แบบนได ตารางท 2.6 แสดงค าอธบายเครองหมาย Shift and Logical Operators การ Shift ขวา แบงเปน 2 ชนดคอ Arithmetic Shift (สนใจเครองหมาย Sign) และ Logical Shift (ไมสนใจเครองหมาย Sign) การ Shift ขวาแบบ Arithmetic นน บตดานซายมอสดหรอ Most Significant Bit (MSB) ถกน ามาใชในการ Shift ดวย ตวอยางเชน คา 1111 0000 เมอ Shift ดานขวาหนงบต ไดผลลพธเปน 1111 1000 การทบต 1 หรอ 0 ถก Shift เขามาแทนทบตดานซายมอนน ขนอยกบบต MSB วาเปนคา 1 หรอ 0 ถาเปนคา 1 คา 1 ถก Shift เขามาแทนท ในกรณทบต MSB เปน 0 คา 0 จะถก Shift เขามาแทนท ตรงขามกบการ Shift ขวาแบบ Logical บต MSB ไมถกน ามาใชในการ Shift ดงนน ค าตอบทไดเปน 0111 1000 การ Shift แบบ Logical บตทน าเขามาแทนทจะเปนคา 0 เสมอ การ Shift ซาย เปนแบบ Logical Shift เทานน หมายความวาทกครงเมอมการ Shift คา 0 ถกน าแทนทบตดานขวามอสด ดงตวอยาง 0101 1101 เมอมการ Shift ซาย ผลลพธทไดเปน 1011 1010 Operator แบบ Logical นน ม 4 แบบคอ AND, OR, XOR และ Complement ตารางท 2.8 แสดงการท างานของ Logical Operators เปนแบบบตตอบต 1111 0000 Complement 0000 1111 0100 1011 0100 1100 1110 1010 AND OR XOR 1101 1100 1011 0011 1010 1001 0100 1000 1111 1111 0100 0011

ตารางท 2.6 แสดงเครองหมายทใชในการค านวณแบบ Shift และ Logical Operator การใชงาน ผลลพธ ชนด

>> op1 >> op2 เลอนทกบตไปดานขวาเปนจ านวนเทากบ op2 ครง (Arithmetic Shift )

Shift

<< op1 << op2 เลอนทกบตไปดานซายเปนจ านวนเทากบ op2 ครง

Shift

>>> op1 >>> op2 เลอนทกบตไปดานขวาเปนจ านวนเทากบ op2 ครง โดยไมตองพจารณา Sign บต (Logical Shift) สามารถใชไดกบขอมลทเปน Integer และ Long เทานน

Shift

& op1 & op2 Bitwise AND Logical | op1 | op2 Bitwise OR Logical

Page 12: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

20 การเขยนโปรแกรมภาษา Java

Operator การใชงาน ผลลพธ ชนด ^ op1 ^ op2 Bitwise XOR Logical ~ ~op2 Bitwise Complement Logical

ตารางท 2.7 แสดงผลลพธทเกดจาก Logical Operators ทง 4 แบบ

op1 op2 & op1 op2 | op1 op2 ^ op ~ 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0

โปรแกรม Shift.java แสดงตวอยางการใช Shift Operator ในโปรแกรมนมการใช Method ใหมชอวา Integer.toBinaryString(int i) ในคลาส Integer เปนคลาสทมอยแลวในภาษา Java สงเกตวา ตวอกษร I ในค า Integer จะเปนตวใหญ การท างานของคลาส Integer เหมอนกบ int ทกประการ ยกเวนคลาส Integer เปน Data Type แบบ Reference หรอ Object คลาส Integer จะม Method มากมาย ผอานสามารถเปดดไดใน API Specification ของภาษา Java (Download Java API Specification ไดท http://java.oracle.com)

Method ทชอ toBinaryString() ท าหนาทเปลยนคาตวเลขจ านวนเตมเปน String ของเลขฐานสอง ในกรณทตวเลขมคาตดลบ toBinaryString() จะเปลยนเปน String ของเลขฐานสองจ านวน 32 บต แตถาตวเลขเปนคาบวก Method toBinaryString() เปลยนเปน String ของเลขฐานสอง โดยไมแสดงบตทมคาเปนศนยซายมอ (No extra leading 0s) ดงตวอยาง

127 ฐานสองมคาเปน 0000 0000 0000 0000 0000 0000 0111 1111 ถาใช toBinaryString(127) ผลลพธทไดมคาเปน 111 1111 โดยจะตดบตทมคาเปนศนยทงหมดดานซายมอ

-127 ฐานสองมคาเปน 1111 1111 1111 1111 1111 1111 1000 0001 ถาใช toBinaryString(-127) ผลลพธทไดมคาเหมอนเดม public class Shift {

public static void main(String[] args) {

int value=-1;

System.out.println(“value in base10 = -1”);

System.out.println(“base2 = ” + Integer.toBinaryString(value));

System.out.println(“value after left shift 10 times <<”);

System.out.println(“value = ” + Integer.toBinaryString(value<<10) +\n”);

value = -500000;

System.out.println(“value in base10 = -500000”);

System.out.println(“base2 ” + Integer.toBinaryString(value));

System.out.println(“value after arthmetic right shift 5 times >>”);

System.out.println(“value = "+ Integer.toBinaryString(value>>5) + “\n”);

value = 127;

System.out.println("value in base10 = 127”);

Page 13: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 21

System.out.println(“base2 = ” + Integer.toBinaryString(value));

System.out.println(“value after logical right shift 2 times >>>”);

System.out.println(“value = ” + Integer.toBinaryString(value>>>2) + “\n”);

value = -20000000;

System.out.println(“value in base10 = -20000000”);

System.out.println(“base2 =” + Integer.toBinaryString(value));

System.out.println(“value after logical right shift 8 times >>>”);

System.out.println(“value = ” +Integer.toBinaryString(value>>>8));

} }

---------- Java Output----------

value in base10 = -1

base2 = 11111111111111111111111111111111

value after left shift 10 times <<

value = 11111111111111111111110000000000

value in base10 = -500000

base2 = 11111111111110000101111011100000

value after arthmetic right shift 5 times >>

value = 11111111111111111100001011110111

value in base10 = 127

base2 = 1111111

value after logical right shift 2 times >>>

value = 11111

value in base10 = -20000000

base2 = 11111110110011101101001100000000

value after logical right shift 8 times >>>

value = 111111101100111011010011

ขอควรระวงในการใช Right Shift แบบ Logical ส าหรบตวแปรทเปนชนด Byte และ Short

พจารณาตวอยางโปรแกรมตอไปน

byte b = -1; // มคาเทากบ 1111 1111 b = (byte) (b>>>10);

System.out.println(b);

ผลลพธควรเปน 0 เพราะตวแปร Byte มขนาด 8 บต เมอใชการ Shift ขวาแบบ Logical หมายความวา

บตศนยถกน ามาแทนทบตดายซายมอเปนจ านวน 10 บต ดงนนค าตอบทไดนาจะเปนคาศนย แตผลลพธทไดจรงจากโปรแกรมมคาเปน -1 เหมอนเดม เนองจากการท างานของตวเลขจ านวนเตมใน Java เปน 32 บต ดงนนค าสง (byte) (b>>>10) คาของตวแปร b จะถกเปลยนเปน 32 บตกอน แลวจงเรม Shift ขวาแบบ Logical สดทายเปลยนคากลบเปนตวแปรชนด byte ดงตวอยาง

-1 เลขฐานสองคอ 1111 1111 1111 1111 1111 1111 1111 1111 Shift ขวาแบบ Logical 10 บต ผลลพธทไดเปน 0000 0000 0011 1111 1111 1111 1111 1111 เปลยนคากลบเปน Byte ดงนน b เทากบ 1111 1111 ท าใหผลลพธทไดจากโปรแกรมมคาเปน -1 เหมอนเดม

Page 14: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

22 การเขยนโปรแกรมภาษา Java

ถาตองการ Shift ขวาแบบ Logical ส าหรบขอมลทเปน byte เครองหมาย >>> ไมสามารถใชได ควรเลยงมาใชเครองหมาย >> และ & ดงตวอยาง

byte b = -2; // คาเลขฐานสองคอ 1111 1110

b = (byte) ((b & 0xFF) >> 4); // คาเลขฐานสองคอ 0000 1111

เครองหมาย & คอ Bitwise AND เรมตนตวแปร b ถกเปลยนเปน 32 บต ซงมคาเปน 0xFFFFFFFE และ

AND กบ คา 0x000000FF ผลลพธทไดเปน 0x000000FE แลวจง Shift ขวาเปน Arithmetic 4 บต ไดค าตอบเปน 0x0000000F ซงถกตอง ส าหรบโปรแกรม Bitwise.java แสดงตวอยางการใชงาน Bitwise Operators public class Bitwise {

public static void main(String[] args) {

int op1 = 0xffffffff;

int op2 = 0x000000ff;

System.out.println(“op1 = ” + Integer.toHexString(op1) );

System.out.println(“op2 = ” + Integer.toHexString(op2) );

System.out.println();

System.out.println(“op1 & op2 = ” + Integer.toHexString(op1 & op2) );

System.out.println(“op1 | op2 = ” + Integer.toHexString(op1 | op2) );

System.out.println(“op1 ^ op2 = ” + Integer.toHexString(op1 ^ op2) );

System.out.println(“~op2 = ” + Integer.toHexString(~op2) );

}

}

---------- Java Output----------

op1 = ffffffff

op2 = ff

op1 & op2 = ff

op1 | op2 = ffffffff

op1 ^ op2 = ffffff00

~op2 = ffffff00

4. Assignment Operators (เครองหมาย =) เปนเครองหมายทใชในการ Assign คาใหกบตวแปร ส าหรบในภาษา Java อนญาตใหผเขยนโปรแกรมสามารถใช Shortcut Assignment ได ซงเปนวธการ Assign คาใหกบตวแปรแบบยอ ตารางท 2.8 แสดงวธการใช Shortcut Assignment

ตารางท 2.8 แสดงวธการใช Shortcut Assignment Operator รปแบบ เทากบ += op1 += op2 op1 = op1 + op2 -= op1 -= op2 op1 = op1 - op2 *= op1 *= op2 op1 = op1 * op2 /= op1 /= op2 op1 = op1 / op2 %= op1 %= op2 op1 = op1 % op2 &= op1 &= op2 op1 = op1 & op2

Page 15: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 23

Operator รปแบบ เทากบ |= op1 |= op2 op1 = op1 | op2 ^= op1 ^= op2 op1 = op1 ^ op2 <<= op1 <<= op2 op1 = op1 << op2 >>= op1 >>= op2 op1 = op1 >> op2 >>>= op1 >>>= op2 op1 = op1 >>> op2

5. Miscellaneous Operators แบงเปน 5 แบบ คอ

5.1 เ ค ร อ ง หม า ย ? : ใ ช ใ น ก า ร เ ป ร ย บ เ ท ย บ เ ง อ น ไ ข ร ป แ บบก า ร เ ข ย น เ ป น Condition ? Value when condition true : Value when condition false

System.out.println( 2>3 ? "Yes" : "No"); // ผลลพธเปน No System.out.println( 2<3 ? "Yes" : "No"); // ผลลพธเปน Yes int i = 100>1 ? 200: 300; // ดงนน i = 200

5.2 เครองหมาย [ ] ใชในการประกาศตวแปรทเปน Array เชน int[] a = new int[5]; 5.3 เครองหมาย . ใชในการอางถง Methods หรอ Attributes ในวตถ 5.4 เครองหมาย (type) หรอ Casting โดยท type เปนชนดขอมล ดงตวอยาง

int i = 1000;

short s;

s = (short) i; // การท า Casting 5.5 instanceof เปน Operator ทใชในการทดสอบวาวตถเปนสมาชกของคลาสหรอไม ดงตวอยาง

class Vehicle { }

class Car extends Vehicle{ }

class Convertible extends Car{ }

public class TestInstanceof {

public static void main (String args []){

Convertible Camry = new Convertible();

if (Camry instanceof Vehicle)

System.out.println("Yes, Camry is a vehicle");

if (Camry instanceof Car)

System.out.println("Yes, Camry is a car");

if (Camry instanceof Convertible)

System.out.println("Yes, Camry is a

convertible car");

}

};

---------- Java Output----------

Yes, Camry is a vehicle

Yes, Camry is a car

Yes, Camry is a convertible car

Page 16: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

24 การเขยนโปรแกรมภาษา Java

ล าดบการค านวณ Expression คอการน า Operands และ Operators มาเขยนรวมกนเพอใชในการค านวณ ตวอยางเชน

2 * 3 เลข 2 และ 3 คอ Operand สวนเครองหมาย * คอ Operator ดงนน Expression สามารถเปน Arithmetic,

Relational and Conditional, Shift and Logical, Assignment หรอ Miscellaneous Operators ตวอยางเชน i = 3 a + b (i<3) && (j > 5)

ในบางกรณ Expression มความซบซอน เพราะมจ านวน Operators มากกวา 1 เชน 2 * 3 + 5 ในกรณน ใหเรมค านวณจาก Operator ดานซายไปดานขวา ดงนนค านวณคาของ 2 * 3 ไดผลลพธเปน 6 และน าไปบวก 5 เทากบ 11 แตถาเขยนใหมเปน 2 + 3 * 5 และใชวธการค านวณแบบเดม น า 2 + 3 เปน 5 น าไปคณ 5 เทากบ 25 ซงไมถกตอง ค าตอบทถกควรเปน 17 เนองจากเครองหมาย Operators มล าดบความส าคญไมเทากน เครองหมายคณ มล าดบความส าคญสงกวาเครองหมายบวก การค านวณทถกตองคอ น า 3 * 5 ได 15 น าไปบวกกบ 2 ได 17

ผ เ ข ยนโปรแกรมสามารถใช เ คร องหมายวง เล บ เพ อ ให เ กดความชด เจนได ด งต วอย า ง 2 + (3 * 5) เพราะเครองหมายวงเลบมล าดบความส าคญทสงกวาเครองหมายอนๆ สรปล าดบการค านวณ กอนการค านวณตองพจารณาล าดบความส าคญของเครองหมายทใชในการค านวณดวย ถาล าดบความส าคญของการค านวณเทากน ใหค านวณจากดานซายกอน ดภาพท 2.2 ส าหรบตวอยาง 3 + 2 * (5 – 7) / 2 และตารางท 2.9 แสดงล าดบความส าคญของเครองหมาย Operators

ตารางท 2.9 แสดงล าดบความส าคญของเครองหมาย Operators

ความส าคญ เครองหมาย Operator 1 ( ), exp++, exp-- 2 ++exp, --exp, +exp, -exp, ~ 3 New 4 *, /, % (Remainder) 5 +, - 6 <<, >>, >>> 7 <, <=, >, >=, instanceof 8 ==, != 9 & 10 ^ 11 | 12 && 13 ||

Page 17: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 25

ความส าคญ เครองหมาย Operator 14 ? : 15 =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=,

>>=, >>>=

รปท 2.2 ตวอยางล าดบการค านวณ 3 + 2 * (5 – 7) / 2

Casting

การ Casting จ าเปนเมอผเขยนโปรแกรมภาษา Java ตองการ Assign คาส าหรบตวแปรตางชนดกน เชน ตองการใหตวแปรชนด Integer ไปเปน Long ดงตวอยาง

int i = 100;

long p = 1000L;

p = i; // ถกตอง เรยกวา Implicit Casting

i = p; // Error เนองจากตวแปร i มขนาด 32 บต ซงเลกกวาตวแปร p ทมขนาด 64 บต

i = (int) p; // ถกตอง เรยกวา Explicit Casting

การ Assign คาของตวแปรทมขนาดเลกกวา ไปยงตวแปรทมขนาดใหญกวา สามารถท าไดทนท เรยกวา

Implicit Casting คอไมจ าเปนตองใส (Data Type) ดานขวามอของเครองหมายเทากบ ในทางตรงขามกน ตองใส (Data Type) หรอ Explicit Casting เพอบอกใหตวแปลภาษาเปลยนคาจากตวแปรทมขนาดใหญกวา ใหเปนขนาดตามทก าหนด ขอสงเกต การเปลยนคาของตวแปรทมขนาดใหญกวาเปนขนาดเลกกวา จะท าใหเสยคาความแมนย าดงตวอยาง

3 + 2 * (5 – 7) / 2

-2

-4

-2

1

Page 18: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

26 การเขยนโปรแกรมภาษา Java

int i;

double d = 3.141;

i = (int) d; // การใช Explicit Casting อาจท าใหคาความแมนย านอยลง System.out.println (i); // แสดงคา “3” เทานน

การเปลยนคาจากตวแปรทมขนาดเลกกวาไปยงตวแปรทมขนาดใหญกวาสามารถท าไดโดยไมจ าเปนตอง

ใส Casting ดงตวอยาง byte > short > int > long > float > double การเปลยนจาก byte ไป int หรอ จาก short ไป float ไมจ าเปนตองใส Casting.java ดงตวอยางโปรแกรม Casting

public class Casting {

public static void main(String[] args) {

byte b=10;

short s=100;

int i = 1000;

long l = 10000L;

float f = 200F;

double d=2000;

b = (byte) s;

System.out.println(b +" From short to byte, it may cause loss precision");

b = (byte) l;

System.out.println(b +" From long to byte, it may cause loss precision");

d = i;

System.out.println(d + " From integer to double");

f = s;

System.out.println(f + " From short to float");

}

}

---------- Java Output----------

100 From short to byte,it may cause loss precision

16 From long to byte,it may cause loss precision

1000.0 From integer to double

100.0 From short to float

ค าแนะน า แมวาการเปลยนคาจากตวแปรทมขนาดเลกกวาไปยงตวแปรทมขนาดใหญกวา ท าไดโดยไม

จ าเปนตองใส Casting แตเพอใหงายในการอาน และแกไขโปรแกรม ควรใส Explicit Casting ทกครง เมอมการ Assign คาส าหรบตวแปรตางชนดกน

Control Flow Statement

ถาโปรแกรมทถกเขยนขน ท างานเปนล าดบขนตอน จากบรรทดทหนงของโปรแกรมไปจนบรรทดสดทาย แลวจบโปรแกรมเลย โปรแกรมนนาจะเขยนไดอยางงาย ลองพจารณาดอกครง การทโปรแกรมท างานจากบรรทดแรกไปบรรทดสดทาย โดยไมมการกลบมาท าซ า หรอเลอกทจะท าบางสวนในโปรแกรม ผเขยนโปรแกรมตองเผชญกบการเขยนโปรแกรมทยากทสด ตวอยางเชน การบวกตวเลข 100 ตว ส าหรบโปรแกรมทไมมการท าซ า ผเขยนโปรแกรมตองสรางชดค าสง (Statements) ถง 100 ค าสงการบวก แตถาโปรแกรมสามารถท าชดค าสงซ าได การเขยนโปรแกรมนอาจเหลอเพยงไมกบรรทด หรอโปรแกรมส าหรบค านวณภาษรายไดบคคล ซงแตละคนเสยภาษไมเทากน ขนอยกบรายได 1 ปของคนนน การเกบภาษใชหลกการเกบภาษกาวหนา ยงมรายไดมาก ยอมตองจาย

Page 19: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 27

ภาษมากตามไปดวย ส าหรบคนทมรายไดนอย ถาไมถงเกณฑขนต าไมตองเสยภาษ ดงนนตองใชโปรแกรมค านวณภาษส าหรบคนทมรายไดนอยหนงโปรแกรม และใชโปรแกรมค านวณภาษส าหรบคนทมรายไดสงอกหนงโปรแกรมแยกกน คงสรางความยงยากกบผใชโปรแกรมอยางมาก แตถาใชโปรแกรมเพยงโปรแกรมเดยว และ สามารถเลอกท างานชดค าสงทเหมาะสมกบขอมลทรบมาโดยอตโนมต ท าใหโปรแกรมมความยดหยนและใชงานไดสะดวกขน

โชคดทภาษา Java และภาษาอนๆ เปดโอกาสใหผเขยนโปรแกรมสามารถเขยนโปรแกรมโดยใหโปรแกรมท าซ า หรอเลอกท าชดค าสงทเหมาะสมกบขอมลทรบมาได

Branch ท างานโดยเลอกชดค าสงได ซงประกอบดวย ชดค าสง if-else และ switch Loop ท างานวนซ า ประกอบดวย ชดค าสง for, while และ do-while

If-else Statement if-else เปน Control Statement ประเภท Branch คอมการเลอกท าชดค าสง A ถาเงอนไขททดสอบเปน

จรง หรอ (else) ท าชดค าสง B ถาเงอนไขไมจรง รปท 2.3 แสดง Flowchart ของ if-else รปแบบ (Syntax) ของการเขยนชดค าสง if-else คอ

if (Condition)

Statement A;

else

Statement B;

รปแบบอนๆ if (Condition)

Statement;

if (Condition1)

Statement A;

else if (Condition2)

Statement B;

else if (Condition3)

Statement C;

else

Statement D;

ในกรณทชดค าสงภายใต if มมากกวาหนงค าสง ตองใชเครองหมาย { } ควบคดวย ดงตวอยาง

if (Condition) {

Statement M;

Statement N;

} else {

Statement X;

Statmenet Y;

}

Page 20: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

28 การเขยนโปรแกรมภาษา Java

Condition

Statement

Statement

false

true

ภาพท 2.3 แสดง Flowchart ของ if-else ตวอยางการใช if-else Statement ในการหาเกรดของนกศกษา โดยชวงคะแนนแสดงในตารางท 2.10 และ

น าชวงคะแนนนไปสราง Flowchart ไดดงภาพท 2.4

ตารางท 2.10 แสดงชวงคะแนนการตดเกรดของนกศกษา คะแนน เกรด

80 – 100 A 70 – 79 B 60 – 69 C 50 – 59 D

นอยกวา 50 F

Page 21: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 29

Score >= 80 ? Grade=A

false

true

Score >= 70 true Grade=B

false

Score >= 60 true Grade=C

false

Score >= 50 true Grade=D

false

Grade=F

ภาพท 2.4 แสดง Flowchart การค านวณหาเกรด น า Flowchart ในภาพท 2.4 มาเขยนโปรแกรม Grade.java เพอแสดงการค านวณเกรด ไดดงน

public class Grade {

public static void main(String[] args) {

int score = 72;

char grade;

if (score >= 80) {

grade = 'A';

} else if (score >= 70) {

grade = 'B';

} else if (score >= 60) {

grade = 'C';

} else if (score >= 50) {

grade = 'D';

Page 22: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

30 การเขยนโปรแกรมภาษา Java

} else {

grade = 'F';

}

System.out.println("Grade = " + grade);

}

}

---------- Java Output----------

Grade = B

Switch Statement

การท างานของ Switch Statement คลายคลงกบ If-else Statement รปแบบการเขยน Switch Statement คอ

switch (expression) {

case constant1:

Statement A; break;

case constant2:

Statement B; break;

case constant3:

Statement C; break;

case constant:

Statement; break;

default:

Default Statement; }

ขอสงเกต เมอมการใชค าสง case แลวตองลงทายดวยค าสง break ทกครง ถาไมใสค าสง break

โปรแกรมจะท างานตอเนองไปโดยไมสนใจ case ทตามมา ค าสง switch ถาไมจ าเปนกไมควรใชเพราะ ถาผใชงานลมใสค าสง break อาจท าใหโปรแกรมท างาน

ผดพลาดได หรอเกด “Bug” ขนในโปรแกรมไดงาย

public class If {

public static void main(String[] args){

int i = 0;

if (i == 4)

System.out.println ("Four");

else if (i == 3)

System.out.println ("Three");

else if (i == 2)

System.out.println ("Two");

else if (i == 1)

System.out.println ("One");

else

System.out.println ("Not interesting");

}

}

---------- Java Output----------

Not interesting

Page 23: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 31

จากโปรแกรม If.java ขางบน สามารถเขยนแทนดวยค าสง Switch Statement ดงตวอยางโปรแกรม Switch.java

class Switch {

public static void main(String[] args){

int i = 3;

switch (i) {

case 4:

System.out.println ("Four"); break;

case 3:

System.out.println ("Three"); break;

case 2:

System.out.println ("Two"); break;

case 1:

System.out.println ("One"); break;

default: System.out.println ("Not interesting");

}

} }

---------- Java Output----------

Three

โปรแกรมเดมถาไมใสค าสง break ใน case ท i เทากบ 3 โปรแกรมจะท างานตอไปจนเจอค าสง break จง

หยดท าใหผลลพธทไดแสดงคา Two ดวย ดงตวอยาง class Switch {

public static void main(String[] args){

int i = 3;

switch (i) {

case 4:

System.out.println ("Four"); break;

case 3: // ไมใสค าสง break ท case เทากบ 3

System.out.println ("Three");

case 2:

System.out.println ("Two"); break;

case 1:

System.out.println ("One"); break;

default: System.out.println ("Not interesting");

}

} }

---------- Java Output----------

Three

Two

Page 24: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

32 การเขยนโปรแกรมภาษา Java

For Loop Statement การสงใหโปรแกรมท างานซ าหรอวนรอบ (Loops) สามารถใชค าสง For Loop Statement รปแบบการ

เขยนคอ

for(Initialization; Condition Expression; Step Expression) {

Statement;

}

Initialization หมายถงการก าหนดคาตวแปรกอนเรมการท างาน เชน int i=0 ขนตอนนท างาน

เพยงครงเดยวเทานน ในตอนเรมท างานค าสง For Loop การประกาศคาตวแปรสามารถท าไดในขนตอนน และตวแปรทประกาศขนมาเปน Local Variable ซงใชไดภายในค าสง For Loop เทานน เมอจบค าสง For Loop ตวแปรนจะถกยกเลกไป

Condition Expression เปนการทดสอบเงอนไข ถาเงอนไขเปนจรง ชดค าสงในเครองหมาย { } จะถกท างาน

Step Expression หลงจากท างานชดค าสงเสรจแลว ในขนตอนสดทาย เปนการเขยนค าสงเพมคาใหกบตวแปรทใชในการทดสอบเงอนไข

พจารณาชดค าสงตอไปน และภาพท 2.5 ซงแสดง Flowchart ของชดค าสง For Loop ของชดค าสงน

for(int i=0; i<100; i++) {

System.out.println(i);

}

ในสวน Initialization สามารถประกาศคาตวแปรไดมากกวาหนงคาแตตองเปนตวแปรชนดเดยวกนเทานน โดยใชเครองหมายจลภาคในการแบง และในสวน Step Expression สามารถม Expression มากกวาหนงคาเชนกน เชน for(int i=1, j=2, k=5; i<10; i++, j++);

โปรแกรม ForLoop.java แสดงการบวกเลขของตวแปร i และ j เปนจ านวน 10 ครงโดยใชค าสง For Loop โดยทคา i มการเพมคาครงละ 1 และลดคาตวแปร j ครงละ 2 ในแตละ Loop

Page 25: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 33

Start for Loop

Initialize variable

i=0

Check

Condition

i<100?

println(i)

true

Step

i++

false End Loop

รปท 2.5 แสดง Flowchart ของ for Loop

public class ForLoop {

public static void main(String[] args){ int sum = 0;

for(int i=1, j=100; i<10; i++, j-=2 ){

System.out.println("i = " + i + " ,j = " + j);

sum = i + j;

System.out.println("i + j = " + sum);

}

}

}

---------- Java Output----------

i = 1 ,j = 100

i + j = 101

i = 2 ,j = 98

i + j = 100

i = 3 ,j = 96

i + j = 99

i = 4 ,j = 94

i + j = 98

i = 5 ,j = 92

i + j = 97

i = 6 ,j = 90

i + j = 96

i = 7 ,j = 88

i + j = 95

i = 8 ,j = 86

i + j = 94

Page 26: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

34 การเขยนโปรแกรมภาษา Java

i = 9 ,j = 84

i + j = 93

While Loop Statement

ค าสง While Loop เหมอนค าสง For Loop ทกประการ ยกเวนรปแบบการเขยนแตกตางกน ในค าสง while ไมมสวน Initialization และ Step Expression ส าหรบสวน Condition Expression ยงคงไวเหมอนเดม รปแบบ while Loop มลกษณะดงน

while (Condition Expression) {

Statement;

}

Condition Expression ตองมคาเปน true เทานน Statement ใน while Loop จงท างาน และหยดท างาน

ในกรณท Condition Expression มคาเปน false ดงตวอยาง Flowchart ในภาพท 2.6

Start while Loop

Check

Condition

true

Do Statements

End while Loop

รปท 2.6 แสดง Flowchart ของค าสง while Loop

โปรแกรม WhileLoop.java แสดงการหา Factorial ของคา 5 โดยใชค าสง For Loop

// หาคา factorial ของ i public class WhileLoop {

public static void main(String[] args){

int fac=1;

int i=5;

System.out.println("i = " + i);

while (i != 0) {

fac *= i--; //ค าสงนมคาเทากบ fac = fac * i; i = i - 1; }

System.out.println("Factorial = " + fac);

}

}

Page 27: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 35

---------- Java Output----------

i = 5

Factorial = 120

Do-while Loop Statement

ค าสง Do-while Loop มการท างานเหมอนกบ for และ while ยกเวนการทดสอบเงอนไขอยเปนล าดบสดทาย ดงนน Statements จะถกเรยกใหท างาน 1 ครงกอนทจะไปทดสอบเงอนไขวาเปนจรงหรอเทจ ดงภาพ Flowchart ท 2.7

Start do-while

Loop

Check

Condition

Do Statements

false End do-while Loop

true

ภาพท 2.7 แสดง Flowchart ของ Do-while Loop Statement

รปแบบการเขยน Do-while Loop คอ

do {

Statement;

} while (Condition Expression);

โปรแกรม DoWhileLoop.java แสดงการใช Do-while Loop แทนการใช While Loop ซงใหผลลพธ

เหมอนกบโปรแกรม WhileLoop.java ทกประการ

// หาคา Factorial ของ 5 public class DoWhileLoop {

public static void main(String[] args){

int fac=1;

int i=5;

System.out.println("i = " + i);

do {

fac *= i--;

} while (i > 1 );

System.out.println("Factorial = " + fac);

}

}

---------- Java Output----------

i = 5

Factorial = 120

Page 28: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

36 การเขยนโปรแกรมภาษา Java

Break และ Continue Statements ค าสง break นอกจากใชกบค าสง switch แลว สามารถน ามาใชกบค าสง for, while และ do-while Loop

ไดดวย ค าสง break ใชเพอยกเลกการท าซ า (Exit Loop) สวนค าสง continue ใชเพอใหกลบไปท างานในสวนทท างานทดสอบเงอนไขทนท โปรดด Flowchart ในรปท 2.8

โปรแกรม BreakContinue.java แสดงการใชค าสง break และ continue พมพคาเลขคยกเวนคา 10 จนไปถงคา 20 โดยทมการบวกคา i ทกๆ รอบของ While Loop เมอคา i เปน 10 มการใชค าสง continue ท าใหโปรแกรมขามการท างานในค าสงทตามมาทงหมด และกลบไปท างานในค าสง while ทนท ในกรณทคา i เปน 20 มการใชค าสง break ท าใหจบการท างานของค าสง While Loop ทนทเชนกน

Start Loop

Check

Condition

Do Statements

true

Want to break? break

End Loop

End Loop

false

yes

no

Start Loop

Check

Condition

Do Statements

true

Want to

continue?continue

End Loopfalse

yes

no

ภาพท 2.8 แสดง Flowchart ของค าสง break และ continue

Page 29: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 37

// แสดงคาเลขคจาก 2 ถง 20 ยกเวนเลข 10 public class BreakContinue {

public static void main(String[] args) {

int i=1;

while (true){

i++;

if (i == 10) { // ไมพมพคา 10 continue;

}

else if (i > 20) { //ถา i มคามากกวา 20 ใหหยดการท างานของ while

break;

}

if (i%2 == 0) { // พมพคา i เมอเศษทหารเทากบ 0

System.out.println(i);

} // end if

} // end while

} // end main

} // end class

---------- Java Output---------- 2 4 6 8 12 14 16 18 20

โปรแกรม Prime1.java แสดงการหาคาตวเลขจ านวนเฉพาะโดยใชใชค าสง break ชวยในการเขยน

โปรแกรม

public class Prime1 {

public static void main(String[] args)

{

int number = 30; // จ านวนตวเลขสดทายทตองการหาคา Prime

boolean isPrime = true; // เปนตวแปรทใชตรวจสอบเงอนไข

System.out.println("Prime number from 2 to 30");

for(int i=2; i<=number; i++){

for(int j=2; j<i; j++) {

if(i%j == 0) {

// ถา i%j เปนศนย แสดงวาคา i ใน loop นไมใช prime isPrime = false; // แสดงวา i ไมเปนคา prime break;

}

}

if(isPrime)

System.out.println(i);

isPrime = true;

}

}

Page 30: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

38 การเขยนโปรแกรมภาษา Java

}

---------- Java Output----------

Prime number from 2 to 30

2

3

5

7

11

13

17

19

23

29

Page 31: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 39

สรป เนอหาในบทน กลาวถงพนฐานในการเรมตนเขยนโปรแกรมโดยใชภาษา Java รปแบบของ Operators

ชนดของขอมลซงประกอบไปดวย int, boolean, char, float และ double รปแบบการเขยนค าสง if, switch, for, while และ do-while

Page 32: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

40 การเขยนโปรแกรมภาษา Java

แบบฝกหดทายบทท 2

1. อธบายวธการเขยน Javadoc Comments 2. อธบายกฎการตงชอ Identifiers 3. อธบายความแตกตางระหวาง Data Type แบบ Primitive และ Reference 4. อธบาย Literals ทกชนด 5. อธบาย Scope ของตวแปร 6. อธบาย Operators ทกแบบ 7. อธบายความแตกตางระหวาง Arithmetic และ Logical Shift 8. Casting ท าเพออะไร 9. อธบายการท างานของ Branch และ Loop Statements 10. อธบายการสงคาใหกบ Method แบบ Pass-by-Value และ Pass-by_Reference 11. ตวแปร (Variable) ท าหนาทอะไร 12. วตถ System.out ท าหนาทอะไร 13. อธบายความแตกตางระหวางตวแปรชนด int และ double 14. จงยกตวอยางทผดของการ Assign คาใหตวแปรชนด int 15. ถาตวแปร x มคาเทากบ 5 และ y มคาเทากบ 10 จงหาคาผลลพธ

a. x + y * 5

b. x – y + 3

c. (x – y) * 5

d. y % x

16. อธบาย Data Type ตอไปนวาเปนชนดใด a. +123 b. -324 c. 23.45f d. 234.532 e. 0xBBFF f. 044 g. “Hello” h. ‘j’ i. 0.34E+01f

17. จงหาผลลพธของโปรแกรมตอไปน public class Test {

public static void main(String args[]) {

System.out.println(6 ^ 3);

}

} 18. จงหาผลลพธของโปรแกรมตอไปน

public class Test {

public static void main(String args[]) {

int i = 0xFFFFFFF1;

int j = ~i;

}

}

Page 33: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

การเขยนโปรแกรมภาษา Java 41

19. จงหาผลลพธของชดค าสงตอไปน int x = 20, y = 15, z;

if(x<y)

z = 10;

else

z = 5;

System.out.println(z);

20. ชดค าสงตอไปนมทผด จงแกไขใหถกตอง //โปรแกรมพมพเลขค 1 ถง คา limit for(int i=1; i<limit; i++)

if(i%2==1)

System.out.println(i);

21. ขอใดถกตอง a. float f=1.3;

b. char c="a";

c. byte b=257;

d. boolean b=null;

e. int i=10;

f. float f=1/3;

g. int i=1/3;

h. float f=1.01;

i. double d=999d;

j. int w = (int) 888.8;

k. byte x = (byte) 1000L;

l. long y = (byte) 100;

m. byte z = (byte) 100L;

22. ขอใดเปนการประกาศ Identifier ทถกตอง a. 2variable

b. variable2

c. _whatavariable

d. _3_

e. $anothervar

f. #myvar

23. จงหาผลลพธจากค าสงตอไปน int x, a = 6, b = 7;

x = a++ + b++;

24. จงหาผลลพธจากค าสงตอไปน int x = 11 & 9;

System.out.println(x);

25. จงหาผลลพธจากค าสงตอไปน int x = 0, y = 4, z = 5;

if (x > 2) {

if (y < 5) {

System.out.println( “message one” );

}

else {

System.out.println( “message two” );

}

}

else if (z > 5) {

System.out.println( “message three” );

}

Page 34: บทที่ 2 ภาษา Java พื้นฐาน Java Language Fundamentalstulip.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter2.pdf · บทที่ 2 ภาษา Java

42 การเขยนโปรแกรมภาษา Java

else {

System.out.println( “message four” );

}

26. จงหาผลลพธจากค าสงตอไปน int i=1;

switch (i) {

case 0:

System.out.println("zero");

break;

case 1:

System.out.println("one");

case 2:

System.out.println("two");

default:

System.out.println("default");

}

27. จงหาผลลพธจากค าสงตอไปน class Exp{

public static void main(String[] args) {

int i = 10; int j = 12;

if( (i<j) || (i++ == 3) )

System.out.println(“OK”);

System.out.println(i);

}

Programming Problems 1. จงเขยนโปรแกรมเพอค านวณหาเสนรอบวง ปรมาณพนผว และความจของทรงกลม โดยก าหนดใหทรงกลมม

รศมเปน r 2. แสงเดนทางโดยมความเรวเทากบ 3 x 108 เมตร/วนาท จงเขยนโปรแกรมค านวณหาระยะทางเวลา 1 ปวาแสง

เดนทาง (ปแสง) ไดระยะทางเทาไหร 3. จงเขยนโปรแกรม Loop โดยสรางตวแปรชนด byte และใหมคาเปน 1 และใหคณดวย 2 เปนจ านวน 10 ครง 4. จงเขยนโปรแกรมเพอค านวณหาคา x ในสมการ ax2+bx+c = 0 โดยใชสตร

[-b + sqt(b2-4ac)] / (2a) และ [-b - sqt(b2-4ac)] / (2a) 5. จงเขยนโปรแกรมเปลยนเวลาวนาทใหเปน วน ชวโมง นาท และวนาท ดงตวอยาง

345632434 วนาท = xx วน yy ชวโมง zz นาท aa วนาท 6. จงเขยนโปรแกรมเพอบวกตวเลข 1 + 2 + 3 + … + 500