কম্পিউটার টিউটোরিয়াল

সি ভাষায় লুপ, রিকার্সন, ম্যাক্রো ছাড়া ১০০ বার সংখ্যা প্রিন্ট করা

সি-এ লুপ (for, while), রিকার্সন, বা ম্যাক্রো এক্সপ্যানশন ছাড়া একটি কাজ বারবার করার একটি ট্রিক হলো setjmp এবং longjmp ব্যবহার করা। এটি <setjmp.h> হেডারে থাকে এবং এক্সসেপশন হ্যান্ডলিং-র পরোক্ষ বাস্তবায়ন।

ফাংশন সিগনেচার

int setjmp(jmp_buf env);        // বর্তমান কনটেক্সট সেভ করে, ০ রিটার্ন
void longjmp(jmp_buf env, int val); // সেভ করা পয়েন্টে জাম্প করে, val রিটার্ন করায়

উদাহরণ: ৫ সংখ্যা ১০০ বার প্রিন্ট

#include <stdio.h>
#include <setjmp.h>

jmp_buf buf;

int main() {
    int x = 1;
    setjmp(buf);                 // জাম্প পয়েন্ট সেট (প্রথমবারে ০ রিটার্ন)
    printf("5");                 // সংখ্যা প্রিন্ট
    x++;
    if (x <= 100)
        longjmp(buf, 1);         // buf-এ ফিরে যাও, setjmp ১ রিটার্ন করবে
    return 0;
}

আউটপুট

5555555555555555555555555555555555555555555555555555555555555555555555555555
555555555555555555555555

(১০০ বার '৫' প্রিন্ট হয়েছে)

ব্যাখ্যা

  1. setjmp(buf) প্রথমবারে কল হলে 0 রিটার্ন করে এবং প্রোগ্রাম normale চলে
  2. printf("5") এক্সিকিউট হয়
  3. x++ হয়ে ২ হয়
  4. longjmp(buf, 1) কল হলে কন্ট্রোল আবার setjmp-এ ফিরে যায়, কিন্তু এইবার setjmp 1 রিটার্ন করে
  5. লুপ কন্ডিশন চেক হয়ে আবার জাম্প হয় — এটি ১০০ বার চলে
  6. সতর্কতা ⚠️

    এটি শুধু শিক্ষামূলক/ট্রিক উদ্দেশ্যে। বাস্তব প্রোগ্রামে setjmp/longjmp ব্যবহার করা দুৰ্ভিপ্রায়:
    • স্ট্যাক আনওয়াইন্ডিং হয় না (ডেস্ট্রাক্টর/ক্লিনআপ কল হয় না — C++-এ ভয়ঙ্কর)
    • রিসোর্স লিক হয় (ফাইল, লক, মেমরি)
    • কোড পড়া ও ডিবাগ করা কঠিন হয়
    • আধুনিক সি++-এ এক্সসেপশন (try/catch) বা লুপ ব্যবহার করুন

    বিকল্প (শুধু ফান/পাজল용)

    • লুপ আনরোলিং (ম্যানুয়ালি ১০০ লাইন লিখে)
    • printf("%0*s", 100, ""); ট্রিক (প্রিন্ট ফরম্যাট এক্সপ্লয়িট)
    • রিকার্সন (যদি অনুমতিত থাকে)
  1. সি++ প্রোগ্রাম: রিকারশন ছাড়া রুট-টু-লিফ (Root-to-Leaf) সব পাথ প্রিন্ট করা

  2. C++ প্রোগ্রামিং-এ রিকার্শন ছাড়া রুট-টু-লিফ পথ প্রিন্ট করা

  3. পাইথনে লুপ ছাড়া নাম্বার সিরিজ প্রিন্ট করা (রিকার্শন)

  4. পাইথন প্রোগ্রাম: লুপ ছাড়া নাম্বার সিরিজ প্রিন্ট করা