Oop lab/java1
- หน้านี้เป็นส่วนหนึ่งของ oop lab
หน้านี้รวมแบบฝึกหัดการเขียนโปรแกรมภาษา Java เบื้องต้น เพื่อทบทวนการเขียนโปรแกรม นอกจากนี้จะได้ลองใช้ JUnit ด้วย
ในการทดลองเขียน (ยกเว้นข้อแรก) สามารถใส่ทุกอย่างไว้ใน project เดียวกันได้ (เช่นอาจจะใช้ชื่อว่า lab1practice) เพื่อไม่ให้ IDE เละไปด้วย project ที่หัดเขียน แต่ให้แยก class กัน โดยสั่ง new class และ new JUnit test case ประกบกันไป โดยให้ใช้ชื่อ class ตามที่ระบุในโจทย์
เนื้อหา
เกมทายเลข
- จากในคลิป ให้แก้โปรแกรมให้โปรแกรมพิมพ์หมายเลขรอบที่ทายด้วย เช่นในรูปนี้
Round 1 10 Too low Round 2 55 Too high
หมายเหตุ: ในภาษา Java เราสามารถ "บวก" ตัวเลขเข้ากับสตริงได้ ตัวเลขจะถูกแปลงเป็นสตริงและนำไปต่อกับสตริงเดิม ดังนั้นเราสามารถพิมพ์แบบนี้ได้
System.out.println("Round " + 1);
- ถ้าทายน้อยกว่า 5 ครั้ง ให้พิมพ์ตอนท้ายด้วยว่าเก่งมาก
ทดลองฟังก์ชัน abs
จากในคลิป ทดลองเขียนฟังก์ชัน abs ในคลาส MyMath และลองรัน JUnit test ด้านล่าง โดยโค้ดด้านล่างเป็นไฟล์เกือบทั้งหมด ให้ตัดไปเฉพาะส่วนที่เป็นโค้ดที่จะใช้
public class MyMath {
public static int abs(int x) {
// put your code here
}
}
import static org.junit.Assert.*;
import org.junit.Test;
public class MyMathTest {
@Test
public void testAbsZero() {
assertEquals(0, MyMath.abs(0));
}
@Test
public void testAbsPositive() {
assertEquals(100, MyMath.abs(100));
}
@Test
public void testAbsNegative() {
assertEquals(50, MyMath.abs(-50));
}
}
ลดราคาสมาชิก
ร้านค้าแห่งหนึ่งเพิ่มระบบสมาชิกและคะแนนสะสมเพื่อกระตุ้นยอดขาย โดยมีเกณฑ์ในการลดแลกแจกแถมดังนี้
- ไม่ใช่สมาชิก ขายราคาเต็ม
- เป็นสมาชิก ลดราคา 10% ยกเว้นสินค้าราคามากกว่า 1000 จะลดราคา 5%
- ถ้าสมาชิกมีแต้มสะสมเกิน 500 แต้ม จะลดเพิ่มอีก 2.5% (จากราคาที่เหลือ)
ให้เขียนเมท็อด Membership.getDiscount ที่คำนวณราคาใหม่ภายใต้วิธีการลดราคาดังกล่าว
public class Membership {
public static double getDiscount(double price, boolean isMember, int memberPoints) {
}
}
สำหรับชุดทดสอบด้านล่าง เนื่องจากเราทดสอบโดยการเปรียบเทียบ double เราจะต้องใส่ delta เป็น argument ที่สามด้วย (ในตัวอย่างใส่เป็น 0.001) เพื่อป้องกันปัญหา error ของการคำนวณทศนิยม
public class MembershipTest {
@Test
public void testNonMember() {
assertEquals(1000, Membership.getDiscount(1000, false, 0), 0.001);
assertEquals(400, Membership.getDiscount(400, false, 0), 0.001);
}
@Test
public void testMemberWithSmallPoints() {
assertEquals(450, Membership.getDiscount(500, true, 0), 0.001);
assertEquals(450, Membership.getDiscount(500, true, 500), 0.001);
assertEquals(900, Membership.getDiscount(1000, true, 100), 0.001);
assertEquals(950.94999, Membership.getDiscount(1001, true, 100), 0.001);
assertEquals(1900, Membership.getDiscount(2000, true, 500), 0.001);
}
@Test
public void testMemberWithHighPoints() {
assertEquals(438.75, Membership.getDiscount(500, true, 501), 0.001);
assertEquals(877.5, Membership.getDiscount(1000, true, 600), 0.001);
assertEquals(927.1762, Membership.getDiscount(1001, true, 600), 0.001);
assertEquals(1852.5, Membership.getDiscount(2000, true, 501), 0.001);
}
}
มัธยฐานของเลข 3 ตัว
เขียนเมท็อด Median3.median ที่รับจำนวนเต็มสามจำนวนแล้วคืนค่ามัธยฐานของเลขสามตัวนั้น
public class Median3 {
public static int median(int a, int b, int c) {
return 0;
}
}
public class Median3Test {
@Test
public void testDistinctIntegers() {
assertEquals(2, Median3.median(1, 2, 3));
assertEquals(2, Median3.median(3, 2, 1));
assertEquals(2, Median3.median(1, 3, 2));
assertEquals(2, Median3.median(3, 1, 2));
}
@Test
public void testWithNegativeIntegers() {
assertEquals(2, Median3.median(-1, 2, 3));
assertEquals(1, Median3.median(3, -2, 1));
assertEquals(-2, Median3.median(1, -3, -2));
assertEquals(-1, Median3.median(3, -1, -2));
}
@Test
public void testDuplicates() {
assertEquals(2, Median3.median(2, 2, 1));
assertEquals(1, Median3.median(1, 3, 1));
assertEquals(-1, Median3.median(3, -1, -1));
}
@Test
public void testAllEqual() {
assertEquals(2, Median3.median(2, 2, 2));
assertEquals(-1, Median3.median(-1, -1, -1));
assertEquals(0, Median3.median(0, 0, 0));
}
}
ทดสอบจำนวนเฉพาะ
เขียนเมท็อด Prime.isPrime ในคลาส Prime ที่คืนค่า true เมื่อข้อมูลที่ป้อนมาเป็นจำนวนเฉพาะ
public class Prime {
public static boolean isPrime(int n) {
return false;
}
}
สังเกตว่าเราต้องการทดสอบ boolean เพื่อความชัดเจนเราจะสั่ง assertTrue กับ assertFalse แทน
public class PrimeTest {
@Test
public void testPrime() {
assertTrue(Prime.isPrime(2));
assertTrue(Prime.isPrime(3));
assertTrue(Prime.isPrime(5));
assertTrue(Prime.isPrime(157));
assertTrue(Prime.isPrime(56687));
assertTrue(Prime.isPrime(102551));
}
@Test
public void testComposite() {
assertFalse(Prime.isPrime(4));
assertFalse(Prime.isPrime(200));
assertFalse(Prime.isPrime(75));
assertFalse(Prime.isPrime(396809));
assertFalse(Prime.isPrime(96172057));
}
@Test
public void testOne() {
assertFalse(Prime.isPrime(1));
}
}
ค่าสูงสุด
ในข้อนี้เราจะหัดเขียนเกี่ยวกับอาร์เรย์ (array) ซึ่งจะมีหลักการเขียนทั่วไปไม่ต่างจากที่เราเคยเขียนใน C#
ให้เขียนเมท็อด ArrayMax.max ที่รับอาร์เรย์ของจำนวนเต็ม และคืนค่าจำนวนเต็มที่มากที่สุด ไม่ต้องสนใจกรณีที่อาร์เรย์เป็นอาร์เรย์ว่าง
public class ArrayMax {
public static int max(int[] ar) {
return ar[0];
}
}
public class ArrayMaxTest {
@Test
public void testOneElement() {
assertEquals(0, ArrayMax.max(new int[] { 0 }));
assertEquals(100, ArrayMax.max(new int[] { 100 }));
assertEquals(-10, ArrayMax.max(new int[] { -10 }));
}
@Test
public void testWithNoDuplicate() {
assertEquals(5, ArrayMax.max(new int[] { 1, 2, 3, 4, 5 }));
assertEquals(5, ArrayMax.max(new int[] { 5, 4, 3 }));
assertEquals(200, ArrayMax.max(new int[] { 100, 200, 50, 40 }));
assertEquals(-5, ArrayMax.max(new int[] { -10, -20, -60, -5 }));
}
@Test
public void testWithDuplicate() {
assertEquals(5, ArrayMax.max(new int[] { 1, 2, 3, 5, 3, 4, 5 }));
assertEquals(5, ArrayMax.max(new int[] { 5, 4, 3, 3, 4 }));
assertEquals(130, ArrayMax.max(new int[] { 100, 130, 100, 50, 50, 40 }));
assertEquals(-7, ArrayMax.max(new int[] { -10, -20, -7, -10, -60, -7 }));
}
}