[0]zero-index clytie0x/zero-index

2.5 แบบฝึกหัด

เขียนแต่ละข้อเป็นไฟล์ใหม่ใน Code::Blocks รันแล้วเทียบกับผลลัพธ์ที่ต้องได้ให้ตรงทุกตัวอักษร รวมถึงช่องว่างและการขึ้นบรรทัด ติดจริงๆ ค่อยเปิดคำใบ้ และเปิดเฉลยหลังทำเสร็จแล้วเท่านั้น

ข้อ 1 เปอร์เซ็นต์คะแนน

ระดับง่าย เวลาไม่เกิน 1 วินาที

ข้อสอบย่อยวิชาวิทยาศาสตร์มีคะแนนเต็ม T คะแนน น้องได้ S คะแนน ระบบรายงานผลต้องแสดงคะแนนคู่กับเปอร์เซ็นต์ เช่น ได้ 45 จาก 60 แสดงเป็น 45/60 = 75.00% ให้เขียนโปรแกรมพิมพ์บรรทัดนี้

ข้อมูลเข้า

บรรทัดเดียว มีจำนวนเต็ม S และ T คั่นด้วยช่องว่าง โดยที่ 1 ≤ T ≤ 1000 และ 0 ≤ S ≤ T

ข้อมูลออก

บรรทัดเดียว ประกอบด้วย S เครื่องหมาย / T ช่องว่าง เครื่องหมาย = ช่องว่าง แล้วตามด้วยเปอร์เซ็นต์ที่เป็นทศนิยม 2 ตำแหน่งและเครื่องหมาย % ชุดทดสอบเลือกไว้ไม่ให้เปอร์เซ็นต์ตกตรงครึ่งของการปัดเศษ

45 60
45/60 = 75.00%
7 9
7/9 = 77.78%
ดูคำใบ้

ถ้าเขียน score * 100 / total ทั้งหมดเป็น int ทศนิยมจะหายไปก่อนถึง printf ให้คูณด้วย 100.0 แทน แล้วพิมพ์ด้วย %.2f ส่วนเครื่องหมาย % ท้ายตัวเลขต้องเขียนเป็น %%

ดูเฉลย
#include <stdio.h>

int main()
{
    int score, total;
    scanf("%d %d", &score, &total);
    printf("%d/%d = %.2f%%\n", score, total, score * 100.0 / total);
    return 0;
}

ข้อ 2 วันที่แบบไทย

ระดับง่าย เวลาไม่เกิน 1 วินาที

ระบบลงทะเบียนของโรงเรียนเก็บวันเกิดแบบสากล คือปี ค.ศ. เดือน วัน คั่นด้วยขีด เช่น 2010-03-05 แต่ใบรับรองต้องพิมพ์แบบไทย คือวัน เดือน ปี พ.ศ. คั่นด้วยทับ เช่น 05/03/2553 ปี พ.ศ. มากกว่าปี ค.ศ. อยู่ 543 ปี ให้แปลงวันที่จากแบบสากลเป็นแบบไทย

ข้อมูลเข้า

บรรทัดเดียว เป็นวันที่ในรูปแบบ YYYY-MM-DD เมื่อ YYYY คือปี ค.ศ. (1957 ≤ YYYY ≤ 2100) MM คือเดือนและ DD คือวัน เป็นเลขสองหลักเสมอ รับประกันว่าเป็นวันที่ที่มีอยู่จริง

ข้อมูลออก

บรรทัดเดียว เป็นวันที่ในรูปแบบ DD/MM/YYYY เมื่อ YYYY คือปี พ.ศ. วันและเดือนเป็นเลขสองหลักเสมอ

2010-03-05
05/03/2553
2026-10-21
21/10/2569
ดูคำใบ้

ใส่เครื่องหมาย - ไว้ในข้อความแม่แบบของ scanf ให้ตรงกับข้อมูลเข้า แบบเดียวกับ "%d/%d/%d" ในหน้า 2.3 ถ้าเขียน "%d %d %d" เดือนกับวันจะติดลบ เพราะ %d อ่าน -10 เป็นเลขลบได้ ส่วนผลลัพธ์ใช้ %02d กับวันและเดือน

ดูเฉลย
#include <stdio.h>

int main()
{
    int year, month, day;
    scanf("%d-%d-%d", &year, &month, &day);
    printf("%02d/%02d/%d\n", day, month, year + 543);
    return 0;
}

ข้อ 3 ป้ายชื่อ

ระดับง่าย เวลาไม่เกิน 1 วินาที

ค่ายคอมพิวเตอร์พิมพ์ป้ายชื่อให้นักเรียนทุกคน ป้ายทุกใบต้องกว้างเท่ากัน ชื่ออยู่บรรทัดบน นามสกุลอยู่บรรทัดล่าง และมีกรอบล้อมรอบตามตัวอย่าง

ข้อมูลเข้า

บรรทัดเดียว มีชื่อและนามสกุลคั่นด้วยช่องว่างหนึ่งช่อง แต่ละคำเป็นตัวอักษรภาษาอังกฤษล้วน ยาว 1 ถึง 20 ตัว

ข้อมูลออก

สี่บรรทัด แต่ละบรรทัดยาว 24 ตัวอักษรพอดี

  • บรรทัดแรกและบรรทัดสุดท้ายเป็น + ตามด้วย - 22 ตัว แล้วปิดด้วย +
  • บรรทัดที่สองเป็น | ช่องว่าง ชื่อที่ชิดซ้ายในช่องกว้าง 20 ตัว ช่องว่าง แล้วปิดด้วย |
  • บรรทัดที่สามเหมือนบรรทัดที่สอง แต่เป็นนามสกุล
Somchai Jaidee
+----------------------+
| Somchai              |
| Jaidee               |
+----------------------+
ดูคำใบ้

รับชื่อกับนามสกุลด้วย %s สองตัว กล่องต้องมีอย่างน้อย 21 ช่อง แล้วใช้ %-20s ให้ชื่อชิดซ้ายในช่องกว้าง 20 ตัว ขอบบนและขอบล่างพิมพ์เป็นข้อความตรงๆ นับขีดให้ครบ 22 ตัว

ดูเฉลย
#include <stdio.h>

int main()
{
    char first[21], last[21];
    scanf("%s %s", first, last);
    printf("+----------------------+\n");
    printf("| %-20s |\n", first);
    printf("| %-20s |\n", last);
    printf("+----------------------+\n");
    return 0;
}

ข้อ 4 รหัสที่นั่งสอบ

ระดับง่าย เวลาไม่เกิน 1 วินาที

สนามสอบติดรหัสที่นั่งไว้บนโต๊ะ รหัสประกอบด้วยเลขห้อง ขีด ตัวอักษรของแถว และเลขที่นั่งสองหลัก เช่น ห้อง 402 แถว B ที่นั่ง 7 ได้รหัส 402-B07 ให้สร้างรหัสที่นั่งจากข้อมูลที่ได้

ข้อมูลเข้า

สามบรรทัด

  • บรรทัดแรกเป็นเลขห้อง R (100 ≤ R ≤ 999)
  • บรรทัดที่สองเป็นตัวอักษรภาษาอังกฤษพิมพ์ใหญ่หนึ่งตัว บอกแถว
  • บรรทัดที่สามเป็นเลขที่นั่ง S (1 ≤ S ≤ 99)

ข้อมูลออก

รหัสที่นั่งหนึ่งบรรทัด เลขที่นั่งเป็นเลขสองหลักเสมอ

402
B
7
402-B07
ดูคำใบ้

ถ้ารับแถวด้วย "%c" จะได้การขึ้นบรรทัดที่ค้างอยู่หลังเลขห้อง ไม่ใช่ตัวอักษร ให้ใส่ช่องว่างหน้า %c เป็น " %c" แบบในหน้า 2.3 ส่วนเลขที่นั่งใช้ %02d

ดูเฉลย
#include <stdio.h>

int main()
{
    int room, seat;
    char row;
    scanf("%d", &room);
    scanf(" %c", &row);
    scanf("%d", &seat);
    printf("%d-%c%02d\n", room, row, seat);
    return 0;
}

ข้อ 5 ตั้งปลุก

ระดับกลาง เวลาไม่เกิน 1 วินาที

นาฬิกาข้อมือของน้องแสดงเวลาแบบ 24 ชั่วโมง น้องอยากตั้งปลุกในอีก K นาทีข้างหน้า ให้หาว่านาฬิกาจะปลุกตอนกี่โมง ถ้าเลยเที่ยงคืนไปแล้วก็ให้นับต่อในวันถัดไป จะเลยไปกี่วันก็ได้ ตอบแค่เวลาบนหน้าปัด

ข้อมูลเข้า

  • บรรทัดแรกเป็นเวลาปัจจุบันในรูปแบบ HH:MM ชั่วโมงและนาทีเป็นเลขสองหลักเสมอ (00 ≤ HH ≤ 23, 00 ≤ MM ≤ 59)
  • บรรทัดที่สองเป็นจำนวนเต็ม K (0 ≤ K ≤ 1000000)

ข้อมูลออก

เวลาที่นาฬิกาปลุก ในรูปแบบ HH:MM ชั่วโมงและนาทีเป็นเลขสองหลักเสมอ

07:45
30
08:15
23:30
45
00:15
ดูคำใบ้

รับเวลาด้วย "%d:%d" แล้วแปลงเป็นนาทีนับจากเที่ยงคืน บวก K เข้าไป หนึ่งวันมี 1440 นาที เศษจากการหารด้วย 1440 คือนาทีนับจากเที่ยงคืนของวันที่นาฬิกาปลุก ไม่ต้องใช้ if สุดท้ายแปลงกลับเป็นชั่วโมงกับนาที แล้วพิมพ์ด้วย %02d

ดูเฉลย
#include <stdio.h>

int main()
{
    int hour, minute, wait;
    scanf("%d:%d", &hour, &minute);
    scanf("%d", &wait);
    int alarm = (hour * 60 + minute + wait) % 1440;
    printf("%02d:%02d\n", alarm / 60, alarm % 60);
    return 0;
}

ข้อ 6 ใบเสร็จ

ระดับกลาง เวลาไม่เกิน 1 วินาที

ร้านเครื่องเขียนหน้าโรงเรียนอยากพิมพ์ใบเสร็จที่ตัวเลขเรียงตรงกัน ลูกค้าคนหนึ่งซื้อสินค้า 3 รายการ แต่ละรายการมีชื่อสินค้า จำนวนชิ้น และราคาต่อชิ้น ให้พิมพ์ใบเสร็จตามรูปแบบ

ข้อมูลเข้า

สามบรรทัด บรรทัดละหนึ่งรายการ แต่ละบรรทัดมีข้อมูลสามตัวคั่นด้วยช่องว่าง

  • ชื่อสินค้า เป็นตัวอักษรภาษาอังกฤษล้วน ยาว 1 ถึง 10 ตัว
  • จำนวนชิ้น Q เป็นจำนวนเต็ม (1 ≤ Q ≤ 999)
  • ราคาต่อชิ้น P บาท มีทศนิยม 2 ตำแหน่งเสมอ (0.01 ≤ P ≤ 1000.00)

ข้อมูลออก

ห้าบรรทัด ทุกบรรทัดแบ่งเป็นคอลัมน์ คอลัมน์แรกกว้าง 10 ตัวชิดซ้าย คอลัมน์ที่สองกว้าง 5 ตัวชิดขวา คอลัมน์ที่สามกว้าง 12 ตัวชิดขวา ไม่มีช่องว่างอื่นคั่นระหว่างคอลัมน์

  • บรรทัดแรกเป็นหัวตาราง มีคำว่า Item Qty และ Amount ในสามคอลัมน์
  • สามบรรทัดถัดมาเป็นสินค้าตามลำดับในข้อมูลเข้า มีชื่อสินค้า จำนวนชิ้น และราคารวมของรายการนั้น (จำนวนชิ้นคูณราคาต่อชิ้น) เป็นทศนิยม 2 ตำแหน่ง
  • บรรทัดสุดท้ายมีคำว่า Total ชิดซ้ายในช่องกว้าง 15 ตัว ตามด้วยราคารวมทั้งใบเสร็จ เป็นทศนิยม 2 ตำแหน่งในช่องกว้าง 12 ตัวชิดขวา
Pencil 3 6.50
Notebook 12 25.00
Glue 1 45.75
Item        Qty      Amount
Pencil        3       19.50
Notebook     12      300.00
Glue          1       45.75
Total                365.25
ดูคำใบ้

ราคามีทศนิยม จึงรับด้วย %lf ใส่ double ใบเสร็จทุกบรรทัดใช้ความกว้างชุดเดียวกัน หัวตารางใช้ "%-10s%5s%12s\n" แถวสินค้าใช้ %-10s %5d %12.2f ส่วนบรรทัด Total คือ %-15s เพราะต้องกินที่ของสองคอลัมน์แรกรวมกัน 10 + 5 ตัว

ดูเฉลย
#include <stdio.h>

int main()
{
    char name1[11], name2[11], name3[11];
    int qty1, qty2, qty3;
    double price1, price2, price3;
    scanf("%s %d %lf", name1, &qty1, &price1);
    scanf("%s %d %lf", name2, &qty2, &price2);
    scanf("%s %d %lf", name3, &qty3, &price3);
    double amount1 = qty1 * price1;
    double amount2 = qty2 * price2;
    double amount3 = qty3 * price3;
    printf("%-10s%5s%12s\n", "Item", "Qty", "Amount");
    printf("%-10s%5d%12.2f\n", name1, qty1, amount1);
    printf("%-10s%5d%12.2f\n", name2, qty2, amount2);
    printf("%-10s%5d%12.2f\n", name3, qty3, amount3);
    printf("%-15s%12.2f\n", "Total", amount1 + amount2 + amount3);
    return 0;
}

ข้อ 7 ความเร็วเฉลี่ย

ระดับยาก เวลาไม่เกิน 1 วินาที

ทีมจักรยานของโรงเรียนจดเวลาออกตัวกับเวลาถึงเส้นชัยเป็นนาฬิกาแบบ 24 ชั่วโมง และวัดระยะทางเป็นกิโลเมตร ให้หาว่าใช้เวลากี่ชั่วโมงกี่นาที และความเร็วเฉลี่ยกี่กิโลเมตรต่อชั่วโมง ความเร็วเฉลี่ยคือระยะทางหารด้วยเวลาที่ใช้เป็นชั่วโมง

ข้อมูลเข้า

  • บรรทัดแรกเป็นเวลาออกตัว ในรูปแบบ HH:MM
  • บรรทัดที่สองเป็นเวลาถึงเส้นชัย ในรูปแบบ HH:MM
  • บรรทัดที่สามเป็นระยะทาง D กิโลเมตร เป็นจำนวนจริงที่มีทศนิยมไม่เกิน 1 ตำแหน่ง (0.1 ≤ D ≤ 1000.0)

ชั่วโมงและนาทีเป็นเลขสองหลักเสมอ (00 ≤ HH ≤ 23, 00 ≤ MM ≤ 59) ทั้งสองเวลาอยู่ในวันเดียวกัน และเวลาถึงเส้นชัยช้ากว่าเวลาออกตัวอย่างน้อย 1 นาที

ข้อมูลออก

  • บรรทัดแรกเป็นเวลาที่ใช้ในรูปแบบ H:MM คือจำนวนชั่วโมงแบบไม่เติม 0 ข้างหน้า เครื่องหมาย : และจำนวนนาทีเป็นเลขสองหลักเสมอ
  • บรรทัดที่สองเป็นความเร็วเฉลี่ย ทศนิยม 2 ตำแหน่ง ชุดทดสอบเลือกไว้ไม่ให้ความเร็วตกตรงครึ่งของการปัดเศษ
08:15
10:05
45.5
1:50
24.82
13:40
14:25
12.0
0:45
16.00
ดูคำใบ้

แปลงเวลาทั้งสองเป็นนาทีนับจากเที่ยงคืน ผลต่างคือเวลาที่ใช้เป็นนาที บรรทัดแรกพิมพ์ด้วย "%d:%02d" ส่วนความเร็ว ระวังกับดักหารจำนวนเต็ม ถ้าคิดชั่วโมงด้วย minutes / 60 การเดินทาง 45 นาทีจะกลายเป็น 0 ชั่วโมง ให้ใช้ distance * 60 / minutes ซึ่ง distance เป็น double อยู่แล้ว

ดูเฉลย
#include <stdio.h>

int main()
{
    int start_hour, start_minute, end_hour, end_minute;
    double distance;
    scanf("%d:%d", &start_hour, &start_minute);
    scanf("%d:%d", &end_hour, &end_minute);
    scanf("%lf", &distance);
    int minutes = (end_hour * 60 + end_minute) - (start_hour * 60 + start_minute);
    printf("%d:%02d\n", minutes / 60, minutes % 60);
    printf("%.2f\n", distance * 60 / minutes);
    return 0;
}

ข้อ 8 เวลารวมสามรอบ

ระดับยาก เวลาไม่เกิน 1 วินาที

การแข่งวิ่งผลัดในวันกีฬาสีวิ่งสามรอบ นาฬิกาจับเวลาบอกเวลาแต่ละรอบในรูปแบบ M:SS.mmm คือนาที วินาทีสองหลัก และมิลลิวินาทีสามหลัก เช่น 1:05.070 คือ 1 นาที 5 วินาที กับอีก 70 มิลลิวินาที (1 วินาทีมี 1000 มิลลิวินาที) ให้หาเวลารวมของทั้งสามรอบในรูปแบบเดียวกัน

ข้อมูลเข้า

สามบรรทัด บรรทัดละหนึ่งรอบ ในรูปแบบ M:SS.mmm M คือนาที (0 ≤ M ≤ 59) SS เป็นเลขสองหลักตั้งแต่ 00 ถึง 59 และ mmm เป็นเลขสามหลักตั้งแต่ 000 ถึง 999

ข้อมูลออก

เวลารวมในรูปแบบ M:SS.mmm จำนวนนาทีไม่เติม 0 ข้างหน้าและเกิน 59 ได้ วินาทีเป็นเลขสองหลักเสมอ มิลลิวินาทีเป็นเลขสามหลักเสมอ

1:05.070
1:02.930
1:10.500
3:18.500
0:59.999
0:00.001
0:00.000
1:00.000
ดูคำใบ้

รับแต่ละรอบด้วย "%d:%d.%d" %d อ่าน 070 เป็น 70 ได้ถูกต้อง แปลงทุกรอบเป็นมิลลิวินาที (1 นาทีมี 60000 มิลลิวินาที) แล้วรวมกัน จากนั้นแยกกลับด้วย / กับ % แบบแปลงวินาทีในบทที่ 1 ตอนพิมพ์ วินาทีใช้ %02d มิลลิวินาทีใช้ %03d ไม่อย่างนั้น 70 มิลลิวินาทีจะออกมาเป็น .70

ดูเฉลย
#include <stdio.h>

int main()
{
    int minutes1, seconds1, millis1;
    int minutes2, seconds2, millis2;
    int minutes3, seconds3, millis3;
    scanf("%d:%d.%d", &minutes1, &seconds1, &millis1);
    scanf("%d:%d.%d", &minutes2, &seconds2, &millis2);
    scanf("%d:%d.%d", &minutes3, &seconds3, &millis3);
    int total = (minutes1 + minutes2 + minutes3) * 60000
              + (seconds1 + seconds2 + seconds3) * 1000
              + millis1 + millis2 + millis3;
    printf("%d:%02d.%03d\n", total / 60000, total / 1000 % 60, total % 1000);
    return 0;
}