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

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


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

  • va_list :เก็บอาร์กิวเมนต์ที่กำหนดทั้งหมด

  • va_start :สิ่งนี้จะเริ่มเข้าถึงตัวแปร ap อาร์กิวเมนต์ของตัวแปร

  • va_arg :ใช้เพื่อดึงอาร์กิวเมนต์ถัดไปของประเภทที่กำหนด

  • va_end :สิ้นสุดการเข้าถึงรายการอาร์กิวเมนต์ตัวแปร

ดังนั้น หากเราเรียกฟังก์ชันเช่น −;

  • ผลรวม(5, 5, 2, 8, 9, 3)
  • สูงสุด(3, 5, 9, 2)
  • นาที(6, 8, 5, 2, 6, 7, 9)

จากนั้นผลลัพธ์จะเป็น 27 (ผลรวมของตัวเลขทั้ง 5 ตัว), 9 (ค่าสูงสุดของตัวเลข 3 ตัว), 2 (ค่าต่ำสุดของตัวเลข 6 ตัว)

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

กำหนดผลรวมของฟังก์ชัน () ซึ่งจะใช้ cnt และจำนวนตัวแปรของอาร์กิวเมนต์

  • กำหนด va_list ap
  • เริ่มต้น ap โดย va_start(ap, cnt)
  • n :=0
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • n :=n + อาร์กิวเมนต์ถัดไปโดย va_arg(ap, int)
  • สิ้นสุดการเข้าถึง ap โดย va_end(ap)
  • ส่งคืน n
  • กำหนดฟังก์ชัน min() ซึ่งจะใช้ cnt และจำนวนตัวแปรของอาร์กิวเมนต์
  • กำหนด va_list ap
  • เริ่มต้น ap โดย va_start(ap, cnt)
  • ขั้นต่ำ :=99999
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • current :=อาร์กิวเมนต์ถัดไปโดย va_arg(ap, int)
  • ถ้าปัจจุบัน <ขั้นต่ำ แล้ว:
    • ขั้นต่ำ :=ปัจจุบัน
  • สิ้นสุดการเข้าถึง ap โดย va_end(ap)
  • ผลตอบแทนขั้นต่ำ
  • กำหนดฟังก์ชัน max() ซึ่งจะใช้ cnt และจำนวนตัวแปรของอาร์กิวเมนต์
  • กำหนด va_list ap
  • เริ่มต้น ap โดย va_start(ap, cnt)
  • สูงสุด :=0
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • current :=อาร์กิวเมนต์ถัดไปโดย va_arg(ap, int)
  • ถ้าปัจจุบัน> สูงสุด แล้ว:
    • สูงสุด :=ปัจจุบัน
  • สิ้นสุดการเข้าถึง ap โดย va_end(ap)
  • ผลตอบแทนสูงสุด
  • ตัวอย่าง

    ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    #include <stdio.h>
    #include <stdarg.h>
    int sum (int cnt,...) {
        va_list ap;
        int i, n;
        va_start(ap, cnt);
        n = 0;
        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;
        va_start(ap, cnt);
        minimum = 99999;
        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;
        va_start(ap, cnt);
        maximum = 0;
        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));
    }
    

    อินพุต

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

    ผลลัพธ์

    27
    9
    2