Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

โปรแกรม C หาผลรวม ค่าสูงสุด และค่าต่ำสุดด้วย Variadic Functions


คำอธิบายปัญหา

สมมติว่าเราต้องการสร้างฟังก์ชันที่รับจำนวนอาร์กิวเมนต์ไม่คงที่ เราต้องการสร้าง 3 ฟังก์ชันคือ sum(), max() และ min() ที่คำนวณผลรวม ค่าสูงสุด และค่าต่ำสุดของตัวเลขที่ส่งเข้ามา ฟังก์ชันแต่ละตัวจะรับจำนวนอาร์กิวเมนต์ (count) เป็นพารามิเตอร์ตัวแรก ในการนิยามฟังก์ชันแบบนี้ เราต้องใช้ ellipsis (...) สามจุด ในพารามิเตอร์ของฟังก์ชัน และต้อง include ไฟล์หัวข้อ stdarg.h ฟังก์ชันประเภทนี้เรียกว่า Variadic Functions

องค์ประกอบสำคัญของ stdarg.h

  • va_list: เก็บอาร์กิวเมนต์ทั้งหมดที่ส่งมา
  • va_start: เริ่มต้นการเข้าถึงอาร์กิวเมนต์ผ่านตัวแปร ap
  • va_arg: ดึงอาร์กิวเมนต์ถัดไปตามชนิดข้อมูลที่กำหนด
  • va_end: จบการเข้าถึงรายการอาร์กิวเมนต์

ตัวอย่างการใช้งาน

  • sum(5, 5, 2, 8, 9, 3) → 27 (ผลรวมของ 5 ตัวเลข)
  • max(3, 5, 9, 2) → 9 (ค่าสูงสุดของ 3 ตัวเลข)
  • min(6, 8, 5, 2, 6, 7, 9) → 2 (ค่าต่ำสุดของ 6 ตัวเลข)

โค้ดตัวอย่าง

#include <stdio.h>
#include <stdarg.h>

int sum(int cnt, ...) {
    va_list ap;
    int i, n = 0;
    va_start(ap, cnt);
    for (i = 0; i < cnt; i++) {
        n += va_arg(ap, int);
    }
    va_end(ap);
    return n;
}

int min(int cnt, ...) {
    va_list ap;
    int i, current, minimum = 99999;
    va_start(ap, cnt);
    for (i = 0; i < cnt; i++) {
        current = va_arg(ap, int);
        if (current < minimum) minimum = current;
    }
    va_end(ap);
    return minimum;
}

int max(int cnt, ...) {
    va_list ap;
    int i, current, maximum = 0;
    va_start(ap, cnt);
    for (i = 0; i < cnt; i++) {
        current = va_arg(ap, int);
        if (current > maximum) maximum = current;
    }
    va_end(ap);
    return maximum;
}

int main() {
    printf("%d\n", sum(5, 5, 2, 8, 9, 3));
    printf("%d\n", max(3, 5, 9, 2));
    printf("%d\n", min(6, 8, 5, 2, 6, 7, 9));
    return 0;
}

อินพุต

sum(5, 5, 2, 8, 9, 3) max(3, 5, 9, 2) min(6, 8, 5, 2, 6, 7, 9)

เอาต์พุต

27 9 2