मान लीजिए हम कुछ ऐसे फंक्शन बनाना चाहते हैं जो कई आर्गुमेंट ले सकें, आर्गुमेंट की कोई निश्चित संख्या नहीं है। हम तीन फंक्शन sum(), max() और min() बनाना चाहते हैं, जो क्रमशः संख्याओं का योग, अधिकतम संख्या और दी गई संख्याओं का न्यूनतम ज्ञात कर सकें। इनमें से प्रत्येक फंक्शन अपने पहले आर्गुमेंट के रूप में आर्गुमेंट की संख्या count लेगा। इस प्रकार के फंक्शन को परिभाषित करने के लिए हमें फंक्शन आर्गुमेंट में ellipsis (...) यानी तीन डॉट्स का उपयोग करना होगा। इसका उपयोग करने के लिए हमें stdarg.h हेडर फाइल शामिल करनी होगी। इस प्रकार के फंक्शन को वेरिएडिक फंक्शन कहा जाता है। वेरिएबल आर्गुमेंट तक पहुंचने के लिए चार अलग-अलग चीजें हैं जिन पर हम ध्यान दे सकते हैं:
va_list: यह दिए गए सभी आर्गुमेंट को स्टोर करता है
va_start: यह वेरिएबल आर्गुमेंट ap वेरिएबल को एक्सेस करना शुरू करता है
va_arg: इसका उपयोग दिए गए प्रकार के अगले आर्गुमेंट को प्राप्त करने के लिए किया जाता है
va_end: यह वेरिएबल आर्गुमेंट लिस्ट को एक्सेस करना समाप्त करता है
इसलिए, यदि हम फंक्शन को इस तरह कॉल करते हैं:
- sum(5, 5, 2, 8, 9, 3)
- max(3, 5, 9, 2)
- min(6, 8, 5, 2, 6, 7, 9)
तो आउटपुट होगा 27 (सभी पांच संख्याओं का योग), 9 (दी गई तीन संख्याओं का अधिकतम), 2 (दी गई छह संख्याओं का न्यूनतम)।
हल करने के चरण
sum() फंक्शन परिभाषित करें, जो cnt और वेरिएबल संख्या में आर्गुमेंट लेगा
- va_list ap परिभाषित करें
- va_start(ap, cnt) द्वारा ap को इनिशियलाइज़ करें
- n := 0
- i := 0 से शुरू करें, जब i < cnt, i को 1 से बढ़ाते हुए करें:
- n := n + va_arg(ap, int) द्वारा अगला आर्गुमेंट
- va_end(ap) द्वारा ap को एक्सेस करना समाप्त करें
- n वापस करें
- min() फंक्शन परिभाषित करें, जो cnt और वेरिएबल संख्या में आर्गुमेंट लेगा
- va_list ap परिभाषित करें
- va_start(ap, cnt) द्वारा ap को इनिशियलाइज़ करें
- minimum := 99999
- i := 0 से शुरू करें, जब i < cnt, i को 1 से बढ़ाते हुए करें:
- current := va_arg(ap, int) द्वारा अगला आर्गुमेंट
- यदि current < minimum, तो minimum := current
- va_end(ap) द्वारा ap को एक्सेस करना समाप्त करें
- minimum वापस करें
- max() फंक्शन परिभाषित करें, जो cnt और वेरिएबल संख्या में आर्गुमेंट लेगा
- va_list ap परिभाषित करें
- va_start(ap, cnt) द्वारा ap को इनिशियलाइज़ करें
- maximum := 0
- i := 0 से शुरू करें, जब i < cnt, i को 1 से बढ़ाते हुए करें:
- current := va_arg(ap, int) द्वारा अगला आर्गुमेंट
- यदि current > maximum, तो maximum := current
- va_end(ap) द्वारा ap को एक्सेस करना समाप्त करें
- maximum वापस करें
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
#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