Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C/C++ में लूप या कंडीशनल के बिना 1 से 1000 प्रिंट करना

समस्या

यहां हम देखेंगे कि लूप या किसी कंडीशनल स्टेटमेंट के बिना 1 से 1000 कैसे प्रिंट करें। चूंकि लूप्स का उपयोग नहीं किया जा सकता, इसलिए हम रिकर्सन आज़मा सकते हैं, लेकिन यहां एक और बाधा है कि हम कंडीशन्स का भी उपयोग नहीं कर सकते। इसलिए रिकर्सन का बेस केस उपयोग नहीं किया जा सकता।

समाधान: स्टेटिक मेंबर और कंस्ट्रक्टर

यहां हम इस समस्या को स्टेटिक मेंबर्स का उपयोग करके हल कर रहे हैं। सबसे पहले हम स्टेटिक मेंबर को 1 से इनिशियलाइज़ करते हैं, फिर कंस्ट्रक्टर में हम मान प्रिंट करते हैं और इसका मान बढ़ाते हैं। अब उस क्लास के 1000 ऑब्जेक्ट्स का ऐरे बनाएं, इसलिए 1000 अलग-अलग ऑब्जेक्ट्स बनते हैं, इसलिए कंस्ट्रक्टर 1000 बार कॉल होता है। इस प्रकार हम 1 से 1000 प्रिंट कर सकते हैं।

उदाहरण

#include <iostream>
using namespace std;

class PrintN {
public:
    static int value;
    
    PrintN() {
        cout << value++ << ", ";
    }
};

int PrintN::value = 1;  // 1 से इनिशियलाइज़ करें

int main() {
    int N = 1000;
    PrintN obj[N];  // 1000 ऑब्जेक्ट्स बनाने के लिए साइज़ 1000 का ऐरे बनाएं
    return 0;
}

आउटपुट

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, .... 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000,

वैकल्पिक समाधान

1. टेम्पलेट मेटाप्रोग्रामिंग (कंपाइल-टाइम)

template <int N>
struct Print {
    static void print() {
        Print<N-1>::print();
        std::cout << N << ", ";
    }
};

template <>
struct Print<1> {
    static void print() {
        std::cout << "1, ";
    }
};

int main() {
    Print<1000>::print();
    return 0;
}

2. std::iota और एल्गोरिदम (C++11) - लूप लेकिन कोई एक्सप्लिसिट लूप नहीं

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <iterator>

int main() {
    std::vector v(1000);
    std::iota(v.begin(), v.end(), 1);  // 1 से भरें
    std::copy(v.begin(), v.end(), 
              std::ostream_iterator(std::cout, ", "));
    return 0;
}

3. रिकर्सन (यदि कंडीशनल्स अनुमत थे)

void printRec(int n) {
    if (n > 1000) return;  // बेस केस - कंडीशनल!
    std::cout << n << ", ";
    printRec(n + 1);
}

4. शॉर्ट-सर्किट ऑपरेटर्स (तकनीकी रूप से कंडीशनल)

void printSC(int n) {
    (n <= 1000) && (std::cout << n << ", ", printSC(n + 1), true);
}

तुलना

विधिलूप?कंडीशनल?नोट्स
स्टेटिक मेंबर + ऐरेनहींनहींओरिजिनल समाधान, स्टैक ओवरफ्लो जोखिम
टेम्पलेट मेटाप्रोग्रामिंगनहीं (कंपाइल-टाइम)नहीं (स्पेशलाइज़ेशन)कंपाइल-टाइम, बड़ी N के लिए कंपाइल टाइम/मेमोरी समस्या
std::iota + copyनहीं (लाइब्रेरी आंतरिक)नहींसबसे व्यावहारिक मॉडर्न C++
रिकर्सननहींहांस्टैक ओवरफ्लो जोखिम

नोट

स्टेटिक मेंबर समाधान स्टैक पर 1000 ऑब्जेक्ट्स बनाता है - बड़े N के लिए स्टैक ओवरफ्लो का कारण बन सकता है। उत्पादन कोड के लिए, std::iota या लूप का उपयोग करें।

  1. - C++ में For बनाम While लूप

    प्रोग्रामिंग में लूप कोड के एक ब्लॉक को कई बार गणना करने के लिए उपयोग किए जाते हैं। यहां हम प्रोग्राम में दो प्रकार के लूप के बीच अंतर देखेंगे, For लूप और While लूप। For लूप For लूप एक प्रकार का पुनरावृत्ति नियंत्रण लूप है जो उपयोगकर्ता को कोड के दिए गए ब्लॉक को एक विशिष्ट संख्या में बार लूप करने की

  1. - C++ में रेंज-आधारित फॉर लूप

    रेंज-आधारित फॉर लूप C++ 11 मानक में जोड़ा गया है और इसका पारंपरिक समकक्ष का अधिक कॉम्पैक्ट रूप है। रेंज-आधारित फॉर लूप का उपयोग किसी कंटेनर के तत्वों पर शुरुआत से अंत तक पुनरावृति करने के लिए किया जाता है। रेंज-आधारित फॉर लूप का सिंटैक्स इस प्रकार है - सिंटैक्स for( range-declaration : range-expres

  1. C/C++ में बर्कले का एल्गोरिथ्म C/C++ में बर्कले का एल्गोरिथ्म

    बर्कले का एल्गोरिथ्म वितरित प्रणालियों में क्लॉक सिंक्रोनाइज़ेशन के लिए उपयोग किया जाने वाला एक एल्गोरिथ्म है। यह एल्गोरिथ्म उन मामलों में उपयोग किया जाता है जब वितरित नेटवर्क के कुछ या सभी सिस्टम में निम्नलिखित समस्याएं होती हैं: A. मशीन के पास सटीक समय स्रोत नहीं है। B. नेटवर्क या मशीन के पास UTC