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

C-এ ভেরিয়েবল-লেঞ্জ অ্যারে (VLA) ব্যবহারের উদাহরণ

মান লযভাব একটি লাইব্রেরি সিস্টেম তৈরি করা হচ্ছে যা শেলফ-ভিত্তিক বই ব্যবস্থাপনা করে। তিনটি কমান্ড ইমপ্লিমেন্ট করতে হবে:

  • কমান্ড ১: শেলফ x-এ y পৃষ্ঠার বই যোগ করুন।
  • কমান্ড ২: শেলফ x-এর y-তম বইয়ের পৃষ্ঠা সংখ্যা প্রিন্ট করুন।
  • কমান্ড ৩: শেলফ x-এ মোট কতটি বই আছে তা প্রিন্ট করুন।

কমান্ডগুলো ২ডি অ্যারে হিসেবে দেওয়া থাকে: {command_type, x, y}। y না থাকলে ডিফল্ট ০।

উদাহরণ

ইনপুট: শেলফ সংখ্যা = 4, কোয়েরি = 4, input_arr = {{1, 3, 23}, {1, 4, 128}, {2, 3, 0}, {3, 4, 0}}

আউটপুট: 23 1

ব্যাখ্যা:

  1. কমান্ড ১: শেলফ ৩-এ ২৩ পৃষ্ঠার বই যোগ।
  2. কমান্ড ১: শেলফ ৪-এ ১২৮ পৃষ্ঠার বই যোগ।
  3. কমান্ড ২: শেলফ ৩-র ০-তম বইয়ের পৃষ্ঠা (২৩) প্রিন্ট।
  4. কমান্ড ৩: শেলফ ৪-এ মোট বই (১) প্রিন্ট।

অ্যালগরিদম

  1. b অ্যারে (সাইজ s) — প্রতিটি শেলফে বইয়ের সংখ্যা রাখে।
  2. p পয়েন্টার অ্যারে (সাইজ s) — প্রতিটি শেলফের বইয়ের পৃষ্ঠা সংখ্যা রাখে (ডাইনামিক্যালি alokেটেড)।
  3. প্রতিটি কোয়েরি প্রসেস করুন:
    • টাইপ ১: b[x]++, p[x] রি-অ্যালোকেট করে নতুন বই যোগ।
    • টাইপ ২: p[x][y] প্রিন্ট।
    • টাইপ ৩: b[x] প্রিন্ট।
  4. শেষে মেমরি ফ্রি করুন।

C প্রোগ্রাম

#include <stdio.h>
#include <stdlib.h>

void solve(int s, int q, int q_array[][3]) {
    int *b;
    int **p;
    b = (int*)malloc(sizeof(int) * s);
    p = (int**)malloc(sizeof(int*) * s);
    for (int i = 0; i < s; i++) {
        b[i] = 0;
        p[i] = (int*)malloc(sizeof(int));
    }
    for (int loopCount = 0; loopCount < q; loopCount++) {
        int qtype = q_array[loopCount][0];
        if (qtype == 1) {
            int x = q_array[loopCount][1];
            int y = q_array[loopCount][2];
            b[x] += 1;
            p[x] = realloc(p[x], b[x] * sizeof(int));
            p[x][b[x] - 1] = y;
        } else if (qtype == 2) {
            int x = q_array[loopCount][1];
            int y = q_array[loopCount][2];
            printf("%d\n", p[x][y]);
        } else {
            int x = q_array[loopCount][1];
            printf("%d\n", b[x]);
        }
    }
    if (b) free(b);
    for (int i = 0; i < s; i++)
        if (p[i]) free(p[i]);
    if (p) free(p);
}

int main() {
    int input_arr[][3] = {{1, 3, 23}, {1, 4, 128}, {2, 3, 0}, {3, 4, 0}};
    solve(4, 4, input_arr);
    return 0;
}

আউটপুট

23
1

মূল পয়েন্ট

  • VLA বা ডাইনামিক মেমরি (malloc/realloc) ব্যবহার করে রানটাইমে অ্যারে সাইজ বাড়ানো যায়।
  • realloc পুরনো ডেটা রক্ষা করে নতুন সাইজ alokেট করে।
  • প্রোগ্রামের শেষে সব অ্যালোকেটেড মেমরি free() দিয়ে মুক্ত করতে হয় মেমরি লিক রোধে।
  1. C প্রোগ্রাম: ম্যাট্রিক্স বিয়োগ (Subtraction of Matrices)

  2. C প্রোগ্রাম: অ্যারে প্যালিনড্রোম কিনা চেক করা

  3. C প্রোগ্রাম: আর্মস্ট্রং নাম্বার (Armstrong Number) যাচাই

  4. সি/সি++-তে মাল্টিডাইমেনশনাল অ্যারে (Multidimensional Arrays)