Computer >> Máy Tính >  >> Lập trình >> lập trình C

Chương trình C để tìm tổng, tối đa và tối thiểu với các hàm Variadic

Giả sử chúng ta muốn thực hiện một số hàm có thể nhận nhiều đối số, không có số lượng đối số cố định. Chúng ta muốn thực hiện ba hàm sum (), max () và min (), chúng có thể tính tổng của các số, cực đại của các số và cực tiểu của các số đã cho tương ứng. Mỗi hàm này sẽ lấy số lượng đối số đếm làm đối số đầu tiên của chúng. Để xác định loại hàm này, chúng ta cần sử dụng dấu ba chấm (...) vào đối số hàm. Để sử dụng nó, chúng ta phải bao gồm tệp tiêu đề stdarg.h. Loại hàm này được gọi là hàm variadict. Để truy cập các đối số biến, có bốn điều khác nhau mà chúng tôi có thể nhận thấy -

  • va_list:Cái này lưu trữ tất cả các đối số đã cho

  • va_start:Thao tác này sẽ bắt đầu truy cập biến ap đối số biến

  • va_arg:Điều này được sử dụng để truy xuất đối số tiếp theo của loại đã cho

  • va_end:Thao tác này kết thúc việc truy cập danh sách đối số biến

Vì vậy, nếu chúng ta gọi các hàm như -;

  • sum (5, 5, 2, 8, 9, 3)
  • tối đa (3, 5, 9, 2)
  • tối thiểu (6, 8, 5, 2, 6, 7, 9)

thì kết quả đầu ra sẽ là 27 (tổng của tất cả năm số), 9 (tối đa của ba số đã cho), 2 (tối thiểu của sáu số đã cho).

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

Xác định một hàm sum (), điều này sẽ lấy cnt và số lượng đối số thay đổi

  • xác định ap va_list
  • khởi tạo ap bằng va_start (ap, cnt)
  • n:=0
  • để khởi tạo i:=0, khi i
  • n:=n + đối số tiếp theo của va_arg (ap, int)
  • kết thúc truy cập ap bằng va_end (ap)
  • return n
  • Xác định một hàm min (), hàm này sẽ lấy cnt và số lượng đối số thay đổi
  • xác định ap va_list
  • khởi tạo ap bằng va_start (ap, cnt)
  • tối thiểu:=99999
  • để khởi tạo i:=0, khi i
  • đối số current:=next của va_arg (ap, int)
  • nếu hiện tại
  • tối thiểu:=hiện tại
  • kết thúc truy cập ap bằng va_end (ap)
  • lợi nhuận tối thiểu
  • Xác định một hàm max (), hàm này sẽ lấy cnt và số lượng đối số thay đổi
  • xác định ap va_list
  • khởi tạo ap bằng va_start (ap, cnt)
  • tối đa:=0
  • để khởi tạo i:=0, khi i
  • đối số current:=next của va_arg (ap, int)
  • nếu hiện tại> tối đa, thì:
    • tối đa:=hiện tại
  • kết thúc truy cập ap bằng va_end (ap)
  • trả lại tối đa
  • Ví dụ

    Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    #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));
    }
    

    Đầu vào

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

    Đầu ra

    27
    9
    2