সূচিপত্র

ধর, তোমাকে একটি স্কুলের ফলাফল তৈরির দায়িত্ব দেওয়া হল। এখন ক্লাস ওয়ানে ছাত্র আছে ৭ জন। তাহলে তুমি তাদের মোট নাম্বারের একটি অ্যারে বানাতে পার। কাজটা বেশ সহজ।

#include <stdio.h> 
int main() {
    int numbers[5] = {81, 82, 83, 84, 85, 86, 87};
    return 0;
}

কিন্তু সমস্যা হল স্কুলে তো শুধু ক্লাস ওয়ান না, আরও শ্রেণী আছে। ধরা যাক স্কুলটিতে ক্লাস ওয়ান থেকে ফাইভ পর্যন্ত পড়ানো হয়। এখন সব ক্লাসের নাম্বার একসাথে রাখতে চাইলে তুমি কী করবে? কাজটা দুইভাবে করা যেতে পারে। প্রথমত তুমি আলাদা পাঁচটি অ্যারে ব্যবহার করতে পার – numbers1[], numbers2[] ইত্যাদি। কিন্তু আমরা আগেই বলেছি অ্যারে মানেই হল এক ধরণের কিছু ভ্যারিয়েবলের কালেকশন। তাহলে এক ধরণের কিছু অ্যারের কালেকশন কি আরেকটি অ্যারে হতে পারে না? হ্যা, পারে! আমরা এতদিন কাজ করেছি 1D অ্যারে নিয়ে। অনেকগুলো 1D অ্যারে নিয়ে হয় একটি 2D অ্যারে। তাহলে আমরা দেখে নি একটা 2D অ্যারে কীভাবে ডিক্লেয়ার এবং ইনিশিয়ালাইজ করা যায়। 1D অ্যারের ক্ষেত্রে শুধু একটি সারি বরাবর কিছু কলাম ছিল। 2D অ্যারের ক্ষেত্রে অনেকগুলো সারি থাকবে, এবং প্রতিটি সারিতেই থাকবে সমান সংখ্যক কলাম!

যেমন একটা 2D অ্যারে হতে পারে নিচের মতঃ (আমরা ধরে নিয়েছি প্রতি ক্লাসেই সাত জন আছে!)

Snap 2015-09-06 at 14.25.29

আগে শুধু একটি ভ্যারিয়েবলের মান ০ থেকে শুরু করে (n-1)-এ গিয়ে শেষ হত, যেটা নির্দেশ করতো কলাম। খেয়াল কর, এখন দু’টি ভ্যারিয়েবল থাকছে। একটা নির্দেশ করছে কলাম, আরেকটা নির্দেশ করছে সারি। তাহলে আমরা একটি 2D অ্যারে ডিক্লেয়ার করার সময় দু’টি জিনিস বলে দিতে হবে – সারি এবং কলাম। তাহলে আমরা একটা অ্যারে ডিক্লেয়ার করে ফেলি।

#include <stdio.h> 
int main() {
    int numbers[5][7];
    return 0;
}

খেয়াল কর এখানে 5 হল সারি সংখ্যা, আর 7 হল কলাম সংখ্যা। অর্থাৎ, 2D অ্যারে ডিক্লেয়ার করার ফরম্যাটটা হলঃ

type_name arrray_name[number_of_rows][number_of_column];

এখন আমরা আমাদের টেবিলের মানগুলো অ্যারেতে বসিয়ে দি।

#include <stdio.h>
int main() {
    int numbers[5][7] = { {81, 87, 93, 97, 92, 87, 82},
                        {83, 88, 94, 96, 91, 86, 81},
                        {84, 89, 95, 95, 90, 85, 80},
                        {85, 90, 96, 94, 89, 84, 81},
                        {86, 91, 97, 93, 88, 83, 82} };
    return 0;
}

খেয়াল কর, এখন সারি এবং কলামের সংখ্যা না বললে সমস্যা হবে! আর সেকেন্ড ব্র্যাকেটগুলোর অবস্থান আর ছবির টেবিলটা মিলিয়ে দেখ, আশা করি বুঝতে পারবে। না বুঝলে কমেন্টে জানাও!

এখন আমরা এই সংখ্যাগুলো প্রিন্ট করে দেখি! প্রিন্ট করার জন্য আমাদের প্রথমেই দু’টি লুপ লাগবে। একটি লাগবে সারি বরাবর নাড়াচাড়া করার জন্য, আরেকটা কলাম বরাবর! তাহলে আমরা কোড লেখা শুরু করে দি।

#include <stdio.h>
int main() {
    int numbers[5][7] = { {81, 87, 93, 97, 92, 87, 82},
                        {83, 88, 94, 96, 91, 86, 81},
                        {84, 89, 95, 95, 90, 85, 80},
                        {85, 90, 96, 94, 89, 84, 81},
                        {86, 91, 97, 93, 88, 83, 82} };
    int i, j;
    for (i=0; i<5; i++) {
        
    }
    return 0;
}

বল তো এই লুপটা আমরা ৫ বার কেন ঘুরাচ্ছি? কারণ এই লুপ দিয়ে আমরা সারি বরাবর নাড়াচাড়া করছি এবং আমাদের সারি আছে পাঁচটা। তাহলে ভেতরের লুপটা কতবার ঘুরবে? সাতবার!

#include <stdio.h>
int main() {
    int numbers[5][7] = { {81, 87, 93, 97, 92, 87, 82},
                        {83, 88, 94, 96, 91, 86, 81},
                        {84, 89, 95, 95, 90, 85, 80},
                        {85, 90, 96, 94, 89, 84, 81},
                        {86, 91, 97, 93, 88, 83, 82} };
    int i, j;
    for (i=0; i<5; i++) {
        for (j=0; j<7; j++) {
            printf("%d ", numbers[i][j]);
        }
        printf("\n"); // ekekta row print hoye jawar por porer line e jacchi
    }
    return 0;
}

আউটপুটঃ

Snap 2015-09-06 at 14.37.39

এবার আমরা যা করবো তা হল সংখ্যাগুলো প্রিন্ট না করে প্রথমে সারি বরাবর সংখ্যাগুলোর যোগফল প্রিণ্ট করবো। এরপর কলাম বরাবর সংখ্যাগুলোর যোগফল প্রিন্ট করবো! কাজটা খুবই সহজ। আমাদের নতুন একটা ভ্যারিয়েবল লাগবে যোগফল হিসেব করার জন্য। এটার মান ০ ইনিশিয়ালাইজ করতে ভুলো না যেন! 😉

#include <stdio.h>
int main() {
    int numbers[5][7] = { {81, 87, 93, 97, 92, 87, 82},
                        {83, 88, 94, 96, 91, 86, 81},
                        {84, 89, 95, 95, 90, 85, 80},
                        {85, 90, 96, 94, 89, 84, 81},
                        {86, 91, 97, 93, 88, 83, 82} };
    int i, j, sum;
    for (i=0; i<5; i++) {
        sum = 0;
        for (j=0; j<7; j++) {
            sum = sum+numbers[i][j];
        }
        printf("Summation of row %d = %d\n", i+1, sum);
    }
    return 0;
}

আমি সারির কাজটা করে দেখালাম। তোমাকে কলামের কাজটা নিজে করতে হবে। হিন্টসঃ এক্ষেত্রে তোমাকে i=0 থেকে i=6 পর্যন্ত ইন্ডেক্সের প্রতিটি কলামের জন্য j=0 থেকে j=4 পর্যন্ত numbers[j][i]-এর মান যোগ করে যোগফল বের করতে হবে। কিছুক্ষণ চেষ্টা কর, আশা করি পারবে। যদি পনের মিনিট চেষ্টার পরও না পার, তাহলে এই লিংকে সল্যুশন আছে, দেখে আস! হতাশ হওয়ার কিছুই নেই! 🙂

এখন যদি বলা হয়, ইউজার নাম্বারগুলা নিজে থেকে ইনপুট দিবে। আমরা আগে থেকে ইনিশিয়ালাইজ করতে পারবো না, তাহলে কী করবো? আমাদের কাজ আরও সোজা হয়ে গেল। কষ্ট করে আর টেবিল দেখে মান বসাতে হবে না! (যদিও আমি কপি পেস্ট করেছিলাম 😛 )

#include <stdio.h>
int main() {
    int numbers[10][100]; /* amra dhore nilam highest 10 ta class
                            ar proti class e 100 ta student thakte pare */

    int row, column;
    printf("Number of classes: ");
    scanf("%d", &row);
    printf("Number of students in each class: ");
    scanf("%d", &column);
    int i, j;
    for (i=0; i<row; i++) {
        for (j=0; j<column; j++) {
            printf("Marks obtained by Roll #%d Class #%d: ", j+1, i+1);
            scanf("%d", &numbers[i][j]);
        }
    }

    for (i=0; i<row; i++) {
        for (j=0; j<column; j++) {
            printf("%d ", numbers[i][j]);
        }
        printf("\n");
    }
    return 0;
}

আউটপুটঃ

Snap 2015-09-06 at 14.49.41

এখন যদি আমাকে বলা হয়, চট্টগ্রাম অঞ্চলের দশটি স্কুলের জন্য কাজটা করতে হবে, তাহলে কি আমি দশটি 2D অ্যারে ডিক্লেয়ার করবো? অবশ্যই না! আমি একটি 3D অ্যারে ডিক্লেয়ার করবো! আমাদের 2D অ্যারের জন্য ব্যাপারটা ছিল numbers[class][roll]। তাহলে 3D অ্যারেতে ব্যাপারটা হবে numbers[school][class][roll]! কথা না বাড়িয়ে কোড লিখেই দেখা যাক!

#include <stdio.h>
int main() {
    int numbers[10][10][100];

    int school, clss, roll;
    printf("Number of schools: ");
    scanf("%d", &school);
    printf("Number of classes in each school: ");
    scanf("%d", &clss);
    printf("Number of students in each class: ");
    scanf("%d", &roll);
    int i, j,k;
    for (i=0; i<school; i++) {
        for (j=0; j<clss ; j++) {
            for (k=0; k<roll; k++) {
                printf("Marks obtained by Roll #%d Class #%d School #%d: ", k+1, j+1, i+1);
                scanf("%d", &numbers[i][j][k]);
            }
        }
    }

    return 0;
}

এবার প্রিন্ট করে সব ঠিক আছে কি না সেটা দেখার দায়িত্ব তোমার!

এখন যদি বলে বাংলাদেশের ৬৪ টি জেলার জন্য কাজটি করতে হবে, তখন কী করবো? তখন লাগবে একটি 4D অ্যারে! সেটার কাজ হবে এমনঃ numbers[jela][school][clss][roll];

এভাবে আরও অনেক ডাইমেনশন পর্যন্তই যাওয়া যায়, কিন্তু আমাদের সাধারণত 3D-এর বেশি দরকার হয় না। তাই সেগুলো নিয়ে আর বিস্তারিত দেখাচ্ছি না। কোনো কিছু বুঝতে সমস্যা হলে কমেন্ট সেকশনে জানাবে! 🙂

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed