2110101 com prog

From Ta Wiki
Jump to navigation Jump to search

ยินดีต้อนรับสู่ wiki เพื่อติว 2110101 Com Prog หรือเรียกง่ายๆว่า JAVA นั่นแหละ

ปล. Page นี้ไม่มีเนื้อหานะ มีตัวอย่าง code / โจทย์ / เฉลย แค่นั้นนะ
ปล. ขอบคุณพื้นที่ ของ ชมรมคอมพิวเตอร์โอลิมปิก โรงเรียนอัสสัมชัญ

โดย TATA201201 Gr.J 96 CP 39


รวมตัวอย่างข้อสอบ

Intro

แนวที่สามารถออกข้อสอบได้

เท่าที่นึกออก และเคยเจอมา ก็มีตามนี้

  1. ถามทฤษฎี ว่า ทำไมเป็นแบบนี้?
  2. มี output ให้ ถามว่าควรเขียนโปรแกรมยังไง?
  3. มีโปรแกรมมาให้ ถามว่า output คืออะไร
  4. เขียนโปรแกรม จาก flowchart
  5. เขียน flowchart จากโปรแกรมที่กำหนด
  6. หาจุดผิดพลาดในโปรแกรม

Midterm

Hello World

public class Test {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}

Flowchart

  • ข้อที่ 1 - จงเขียน flowchart ของโปรแกรม รับค่าจำนวน 1 จำนวน และหาค่าสัมบูรณ์ของจำนวนนั้น
  • ข้อที่ 2 - จงเขียน flowchart ของโปรแกรม รับค่าจำนวนไปเรื่อยๆจนกว่าจำนวนนั้นจะเป็นจำนวนลบ และหาค่าสูงสุด ต่ำสุด โดยขอบเขตของเลขมีค่าไม่ต่ำกว่า 0 และไม่มากกว่า 100,000
  • ข้อที่ 3 - จงเขียนโปรแกรมภาษา java จาก flowchart ที่กำหนดให้ รูปอยู่ที่นี่

System.out.println

  • จุดสำคัญ
  1. 0123 จะแสดงค่าเลข 123 ฐาน 8
  2. 0x123 จะแสดงค่าเลข 123 ฐาน 16
  3. การต่อข้อความ ใช้เครื่องหมาย +
  4. ข้อความต่อตัวเลข จะได้ผลเป็นข้อความ
  5. การทำงาน จะไล่ตามลำดับจากซ้ายไปขวา นะ
  6. ใส่ comment จากจุดใดๆจนจบบรรทัด ใช้เครื่องหมาย //COMMENT
  7. ใส่ comment เป็นช่วง อาจในบรรทัดเดียวหรือหลายบรรทัด ใช้เครื่องหมาย /*COMMENT*/


  • ข้อที่ 1 - จงหา output จากการรันโปรแกรมต่อไปนี้
public class Test {
  public static void main(String[] args) {
    System.out.println("Hello World");
    System.out.println(0101);
    System.out.println(0xFF);
    System.out.println(6 + 5 + "ABC");
    System.out.println("ABC" + 6 + 5);
    System.out.println("HELLO" + "JAVA");
  }
}
  • ข้อที่ 2 - บรรทัดใด รันแล้วผิด บ้าง???
public class Test2 {
  public static void main(String[] helloworld) {
    System.out.println /*COMMENT*/ ("HELLO");
    System /*COMMENT*/.out.println("HELLO");
    System.out.println( /*"HELLO"*/ );
    System.out.println("/*HELLO*/");
    System.out.println("HELLO")//;
  }
}

ตัวแปร

  • ข้อที่ 1 - ข้างล่างนี้ ชื่อตัวแปรไหนที่ตั้งไม่ได้บ้าง???
    Int   Main   Double   string   public   args   argv   Math   abc   $_MAIN   $$$555   123A   A1
    parseInt   nextline   nextDouble   new   Class   static   VOID   Comment   year   DOB   sum
    ^-^   java   jlab   Jlab   scanner   scanf   system   printLN   print   dynamic   statistics
  • ข้อที่ 2 - ข้อใดใช้ตัวแปรไม่เหมาะสมบ้าง ??
    1. ใช้ตัวแปรประเภท int เก็บข้อมูลรหัสนิสิต
    2. ใช้ตัวแปรประเภท int เก็บข้อมูลรหัสประจำตัวประชาชน
    3. ใช้ตัวแปรประเภท String เก็บข้อมูลชื่อ นามสกุล
    4. ใช้ตัวแปรประเภท double เก็บข้อมูลเกรดเฉลี่ย
    5. ใช้ตัวแปรประเภท double เก็บคะแนนที่ได้
    6. ใช้ตัวแปรประเภท int เก็บจำนวนคนที่มาเข้าร่วมงาน
    7. ใช้ตัวแปรประเภท double เก็บความเร็วที่รถวิ่ง
    8. ใช้ตัวแปรประเภท String เก็บข้อมูลรหัสนิสิต
    9. ใช้ตัวแปรประเภท int เก็บความเร็วของแสง
    10. ใช้ตัวแปรประเภท int เพื่อเป็นตัวแปรนับรอบในการวน loop

Scanner

  • ข้อที่ 1 - จงเขียนโปรแกรมเพื่อรับค่าข้อความ ชื่อ และนามสกุล และแสดงผล ว่า สวัสดี ชื่อ นามสกุล เช่น "สวัสดี เอ จาวา" เป็นต้น
  • ข้อที่ 2 - จงแก้ไขโปรแกรมต่อไปนี้ให้ถูกต้องเท่าที่จำเป็นเพียง 6 จุดเท่านั้น (บรรทัดเดียวกันแต่ไม่อยู่ติดกันถือว่าคนละจุด)
public class Test4 {
  public static void main() {
    Scanner x = new Scanner(system.in());
    int a = kb.nextInt();
    int b = kb.nextInt();
    System.out.println(a + b);
    int c = a + b++
    double x = x.nextDouble();
    System.out.println(x + a + b + c);
  }
}
  • ข้อที่ 3 - จงรับค่าจำนวนเต็ม 2 ค่าเก็บในตัวแปร a และ b และให้สลับค่าในตัวแปร a และ b จะเขียนอย่างไร
    เช่น a=5, b=2 สลับแล้ว a=2, b=5

Operators

  • ข้อที่ 1 - จงหาผลจากการรันโปรแกรมต่อไปนี้
public class Test2 {
  public static void main(String[] args) {
    int a = 5, b = 1, c;
    System.out.println(a + b);
    System.out.println("a+b");
    System.out.println("" + a + b);
    System.out.println(a + b + "");
    System.out.println(c = a + b);
    System.out.println(c);
    System.out.println(a++);
    System.out.println(++b);
    System.out.println(a+++b++);
    System.out.println(a + " " + b);
    System.out.println(a+++(++b));
    c = a+++b+++a+++b+++a+++b+++a+++b++;
    c %= 100;
    System.out.println(a + " " + b + " " + c);
    System.out.println((int) 1.234 + (int) 1.987);
    System.out.println(a / b);
    System.out.println((double) a / b);
    double x = 1, y = 2e100, z = 050;
    System.out.println(y + x);
    System.out.println(x + z);
    System.out.println(a / b + x / b + z * 2 + 5 * 3 / 2);
  }
}
  • ข้อที่ 2 - บรรทัดใดที่ไม่สามารถรันได้
public class Test3 {
  public static void main(String[] args) {
    int a = 5, b, c;
    System.out.println(a + b);
    System.out.println(c = a);
    System.out.println(b = c - a);
    System.out.println(c = a + b; );
    System.out.println(a++++b++++c++++a);
    System.out.println(a+++b+++c++);
    System.out.println(c = a++);
    System.out.println(a + b * c / d + a * b * c);
  }
}
  • ข้อที่ 3 - จงเขียนโปรแกรมเพื่อรับค่าจำนวนเงินที่ต้องการกด ATM และแสดงว่า เครื่อง ATM จะต้องจ่ายแบงค์ 1000, 500, 100 อย่าละกี่ใบ เศษที่เครื่อง ATM ไม่สามารถจ่ายได้จะไม่จ่ายทั้งสิ้น โดยกำหนดให้ เครื่อง ATM มีแบงค์แต่ละประเภทมากเพียงพอที่จะจ่ายให้
========== เฉลย ==========
import java.util.Scanner;
public class ATM {
  public static void main(String[] args) {
    Scanner kb = new Scanner(System.in);
    System.out.print("Enter Money : ");
    int money = kb.nextInt();
    System.out.println("1000 x " + money / 1000);
    System.out.println(" 500 x " + money % 1000 / 500);
    System.out.println(" 100 x " + money % 500 / 100);
  }
}
==========================

class Math

  • ข้อที่ 1 - เขียนโปรแกรมเพื่อสุ่มค่า ตั้งแต่ 1-6 โดยโอกาสที่จะสุ่มเจอ 1-6 ต้องเท่ากัน
  • ข้อที่ 2 - เขียนนิพจน์การคำนวณต่อไปนี้เป็นภาษาจาวา คลิกที่นี่

if..else..

  • ข้อที่ 1 - จงเขียนโปรแกรมเพื่อหาค่าสัมบูรณ์ของตัวเลขจำนวนจริงที่รับเข้ามา โดยห้ามใช้ method abs
  • ข้อที่ 2 - จงเขียนโปรแกรมเพื่อตัดเกรดจากคะแนนที่รับเข้ามาโดย
    80<=x     คะแนนได้เกรด A
    75<=x<80  คะแนนได้เกรด B+
    70<=x<75  คะแนนได้เกรด B
    65<=x<70  คะแนนได้เกรด C+
    60<=x<65  คะแนนได้เกรด C
    55<=x<60  คะแนนได้เกรด D+
    50<=x<55  คะแนนได้เกรด D
        x<50  คะแนนได้เกรด F
  • ข้อที่ 3 - จงเขียนโปรแกรมเพื่อรับค่า A B C แล้วแก้สมการกำลังสอง Ax^2+Bx+C=0 แล้วแสดงคำตอบ ถ้ามี 1 คำตอบ ให้แสดงคำตอบนั้น ถ้ามี 2 คำตอบ ให้แสดง 2 คำตอบ ถ้าไม่มีคำตอบที่เป็นจำนวนจริง ให้แสดงข้อความว่า "Imaginary Number"
  • ข้อที่ 4 - จงเขียนนิพจน์เพื่อตรวจสอบเงื่อนไขต่อไปนี้ if(นิพจน์) หมายความว่าไม่ต้องเขียนคำว่า if และวงเล็บ นะ
    1. เลขหลักร้อยของ x มีค่ามากกว่าเลขหลักหน่วย
    2. จำนวนเต็มที่รับเข้ามาเป็นจำนวนเต็มบวก
    3. a มีค่าไม่มากไปกว่า b
    4. x มีค่าเป็น 2 เท่าของ y
    5. จำนวนเต็ม x มีค่าเป็นครึ่งหนึ่งของจำนวนเต็ม y
    6. เลขหลักร้อยของ x มีค่าเป็น 7

while / for loop

  • ข้อที่เป็น loop 2 ชั้นเป็นของไฟนอลนะ คาดการณ์ผิดไปนิดนึง
  • ข้อที่ 1 - จงเขียนโปรแกรมเพื่อแสดงคำว่า "hello java" จำนวน 10 บรรทัด
  • ข้อที่ 2 - จงเขียนโปรแกรมรับค่า n และแสดงเลขตั้งแต่ 1 ถึง n
  • ข้อที่ 3 - จงเขียนโปรแกรมรับค่าเลขจำนวนเต็มบวกไปเรื่อยๆ ถ้าจำนวนที่รับเข้ามาไม่ใช่จำนวนเต็มบวกให้ออกจากโปรแกรม และแสดงค่า สูงสุด ต่ำสุด ของจำนวนที่รับเข้ามา ไม่นับตัวสุดท้ายที่เพิ่งจะรับเข้าไป
  • ข้อที่ 4 - จงเขียนโปรแกรมรับค่าจำนวนเต็ม n และแสดงค่า 1+2+3+...+n และ n! คนละบรรทัด
  • ข้อที่ 5 - จงเขียนโปรแกรมรับค่า จำนวนเต็ม m และ n ให้แสดงค่าผลของ n ยกกำลัง m โดยห้ามใช้ Method pow
  • ข้อที่ 6 - จงเขียนโปรแกรมเพื่อคำนวณค่าต่อไปนี้ โดยรับ input เป็นค่า x และ จำนวนพจน์ที่ต้องการคำนวณ และแสดงค่าที่คำนวณได้ รูปอยู่ที่นี่
  • ข้อที่ 7 - จงเขียนโปรแกรมเพื่อแสดงค่าลำดับฟิโบนักชี โดยรับค่า n แล้วแสดงลำดับฟิโบนักชี่เฉพาะพจน์ที่มีค่า น้อยกว่า n เท่านั้นในบรรทัดเดียว (Quiz section 8)
    เช่น n=50
    OUTPUT : 1 1 2 3 5 8 13 21 34
  • ข้อที่ 8 - รับจำนวนเต็ม n แล้วตรวจสอบว่า จำนวนนั้นเป็นจำนวนเฉพาะหรือเปล่า??
  • ข้อที่ 9 - รับจำนวนเต็ม n แล้วแสดงค่าจำนวนเฉพาะที่น้อยกว่า n ทั้งหมด (ปล. สามารถปรับปรุงให้โปรแกรมมีประสิทธิภาพได้โดยใช้ array มาช่วย)
  • ข้อที่ 10 - รับจำนวนเต็ม n แทนจำนวน * ให้แสดง * เท่าจำนวนนั้น
    เช่น n=4
    OUTPUT : ****
  • ข้อที่ 11 - รับจำนวนเต็ม n แทนจำนวนชั้นของ *
    เช่น n=4
    OUTPUT : ****
             ****
             ****
             ****
  • ข้อที่ 12 - รับจำนวนเต็ม n แทนจำนวนชั้นของ *
    เช่น n=4
    OUTPUT : *
             **
             ***
             ****
  • ข้อที่ 13 - รับจำนวนเต็ม n แทนจำนวนชั้นของ *
    เช่น n=4
    OUTPUT : ****
             ***
             **
             *
  • ข้อที่ 14 - รับจำนวนเต็ม n แทนจำนวนชั้นของ *
    เช่น n=4
    OUTPUT :    *
               **
              ***
             ****
  • ข้อที่ 15 - รับจำนวนเต็ม n แทนจำนวนชั้นของ *
    เช่น n=4
    OUTPUT : ****
              ***
               **
                *
  • ข้อที่ 16 - รับจำนวนเต็ม n แทนจำนวนชั้นของ *
    เช่น n=4
    OUTPUT :    *
               ***
              *****
             *******
  • ข้อที่ 17 - รับจำนวนเต็ม n ความยาวของกังหัน
    เช่น n=4
    OUTPUT : *     *
              *   *
               * *
                *
               * *
              *   *
             *     *
  • ข้อที่ 18 - รับจำนวนเต็ม n ความยาวของกังหัน
    เช่น n=4
    OUTPUT : 4     4
              3   3
               2 2
                1
               2 2
              3   3
             4     4
  • ข้อที่ 19 - รับจำนวนเต็ม n แทนจำนวนชั้นของภูเขา และจงหาผลรวมของแกนกลางภูเขาด้วย
    เช่น n=4
    OUTPUT :    0
               123
              45678
             9012345
             ผลรวมแกนกลาง = 10

string

  • ข้อที่ 1 - เขียนโปรแกรมเพื่อรับคำมา 2 คำ ในบรรทัดเดียวกัน แล้วตรวจสอบว่า คำทั้ง 2 คือคำเดียวกันหรือไม่ โดย อักษรพิมพ์ใหญ่และพิมพ์เล็กคือตัวเดียวกัน
  • ข้อที่ 2 - เขียนโปรแกรมรับค่า string 2 บรรทัด โดย บรรทัดแรกคือต้นแบบ บรรทัดที่ 2 คือคำที่ต้องการค้นหา ถ้าพบคำที่ต้องการค้นหาในสตริงแรก ให้แสดงว่า คำนั้นอยู่ตำแหน่งแรกที่ใด ถ้าไม่พบให้แสดง -99
    ตำแหน่ง     : 012345678901234567890123
    คำ         : CHULALONGKORN UNIVERSITY
    คำที่ต้องการหา :                  VERS
    ต้องแสดงว่าอยู่ตำแหน่งที่ 17
  • ข้อที่ 3 - เขียนโปรแกรมรับค่า string 1 บรรทัด และแสดงค่า สตริงนั้นกลับจากหน้าไปหลัง
    INPUT  : HELLO JAVA
    OUTPUT : AVAJ OLLEH
  • ข้อที่ 4 - เขียนโปรแกรมรับค่า string 1 บรรทัด และแสดงค่า สตริงนั้นกลับจากหน้าไปหลัง เฉพาะในคำคำนั้น
    INPUT  : HELLO JAVA I LOVE YOU
    OUTPUT : OLLEH AVAJ I EVOL UOY
  • ข้อที่ 5 - จงรับเข้าคำ 1 คำ แล้วตรวจสอบว่า คำนั้นเป็น พาลินโดรมหรือไม่ ??? โดยอักษรพิมพ์ใหญ่ และพิมพ์เล็กเป็นตัวเดียวกัน
  • ข้อที่ 6 - จงรับเข้าสตริง 1 สตริง แล้วตรวจสอบว่า สตริงนั้นเป็น พาลินโดรมหรือไม่ ??? โดยไม่สนใจช่องว่าง และอักษรพิมพ์ใหญ่ และพิมพ์เล็กเป็นตัวเดียวกัน
  • ข้อที่ 7 - รับเข้าสตริง 1 สตริงที่ประกอบด้วยอักษรพิมพ์ใหญ่ และช่องว่างเท่านั้น และรับค่าจำนวนเต็มเป็น key จงเข้ารหัสสตริงนั้น โดยขยับอักษรไปจำนวนเท่ากับ key เช่น Z และ key=1 จะขยับไปเป็น A
    String : ABCXYZ
    KEY    : 2
    OUTPUT : CDEZAB

file

  • ข้อที่ 1 - จงเขียนโปรแกรมเพื่อรับเข้าคำศัพท์ 1 คำ แล้วแสดงความหมายของมัน โดยคำศัพท์สามารถหาได้จาก ที่นี่ ถ้าหากไม่พบคำศัพท์ให้แสดงว่า "Word Not Found" โดยรูปแบบของไฟล์นำเข้า ดูได้จากไฟล์จริง นะ

array 1 มิติ

  • ข้อที่ 1 - เขียนโปรแกรมรับจำนวนเต็ม n และ p โดย n แทนจำนวนตัวเลขที่ต้องการ และ p เป็นเลขที่ต้องการค้นหา จากนั้นรับจำนวนเต็มอีก n จำนวน โดย n จำนวนนั้นเรียงลำดับจากน้อยไปหามาก จงค้นหาว่า จำนวนเต็ม p อยู่เป็นลำดับที่เท่าไรในจำนวนเต็ม n จำนวนนั้น โดยกำหนดให้ ลำดับเริ่มต้นจาก 1, 2, 3, ..., n
  • ข้อที่ 2 - เขียนโปรแกรมเพื่อรับจำนวนเต็ม n และจากนั้นรับจำนวนเต็มอีก n จำนวน ให้แสดงผลจำนวนเต็มที่ n จำนวนที่เรียงลำดับแล้ว (ห้ามใช้ method sort())
  • ข้อที่ 3 - เขียนโปรแกรมเพื่อรับจำนวนเต็ม n แทนจำนวนนักเรียนทั้งหมด จากนั้นอีก n บรรทัด แต่ละบรรทัดรับค่า ชื่อ และคะแนนที่ได้เป็นจำนวนเต็ม จากนั้นรับจำนวนเต็ม k และแสดงผลชื่อของคนที่ได้คะแนน k คะแนน และบรรทัดสุดท้าย ให้แสดงด้วยว่า มีคนได้ k คะแนนกี่คน โดยถ้าไม่มี ให้แสดงว่ามี 0 คน
  • ข้อที่ 4 - เขียนโปรแกรมรับค่าจำนวนเต็มในฐานสิบ และแสดงว่า จำนวนเต็มนั้นมีค่าเท่าใดในฐานสอง

โจทย์ CHALLENGE (Midterm)

  • ข้อที่ 1 OLYMPICS - จงรับค่าตัวเลขเข้าไป 1 ตัว และถ้าหากแปลงเป็นเลขฐานสองแล้ว ตัดตัวเลข 1 ในฐานสองหลักสุดท้ายที่ปรากฎออก จะมีค่าเท่าใดในฐานสิบ

เช่น ตัวเลข 6 มีค่าในฐานสองคือ 110 ถ้าตัดเลข 1 หลักสุดท้าย ซึ่งอยู่ตำแหน่งที่ 2 ออก จะได้ 100 มีค่าเท่ากับ 4 ในฐานสิบ
คำท้า : สามารถเขียนได้ในบรรทัดเดียว (; เดียว หรือหมายความว่าคำสั่งเดียวนั่นแหละ) ไม่รวมการรับเข้าข้อมูล

    Hint : ........ ยังไม่บอก
  • ข้อที่ 2 - รับจำนวนเต็ม n แทนจำนวนชั้นของต้นคริสมาส โดยต้นคริสมาสจะประกอบด้วยอักษร A-Z เท่านั้น โดยถ้าวนถึง Z แล้วจะกลับมา A ใหม่
    เช่น n=5
    OUTPUT :     A
                 BC
               FED
                 GHIJ
             ONMLK 


Final

if..else.. ภาค2

for ภาค2

method

array 2 มิติ

Dwindow

recursive function

class

โจทย์ CHALLENGE (Final)