Oop lab/java1

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
หน้านี้เป็นส่วนหนึ่งของ 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 }));
	}
}

เรียงกันหรือเปล่า?

นับคู่เรียงผิด