মডিউল ৭ঃ ইন্ট্রোডাকশন টু এরে
মডিউল ৭-০: সূচনা
এই মডিউলে আমরা কি কি শিখবোঃ
- এরে সম্পর্কে জানবো
- এরে কেন দরকার তা বুঝবো
- এরে কিভাবে ইনপুট এবং আউটপুট দেখাতে হয় তা দেখবো
- এরেতে কিছু অপারেশন দেখব
মডিউল ৭-১, ৭-২: এরে কি, কেন আমাদের এরে প্রয়োজন
আমাদের যদি একই টাইপের ভেরিয়েবল অনেকগুলো প্রয়োজন হয়, তখন অনেকগুলো ভেরিয়েবল ডিক্লেয়ার করা আমাদের জন্য কষ্টসাধ্য হয়ে যাবে। যেমন আমাদের একটি স্কুলের ১০০০ জন ছাত্রের মারক্স স্টোর করার জন্য ১০০০ টি int ভেরিয়েবল ডিক্লেয়ার করতে হয়, তখন আমরা এই সিচুয়েশনে আমরা এরে ব্যাবহার করতে পারি।
একটি এরে ডিক্লেয়ার করে অনেকগুলো ভেরিয়েবল তৈরি করে ফেলতে পারি আমরা। এরে তৈরি করার নিয়মঃ
data_type array_name [size]
শুরুতে আমরা কোন ডাটা টাইপের ভেরিয়েবল চাচ্ছি তা বলে দিতে হবে। এরেতে যতগুলো ভেরিয়েবল তৈরি হয় সবগুলো সেইম ডাটা টাইপের হয়। তারপর এরের একটি নাম দিতে হবে। তারপর সাইজটা বলে দিতে হবে যে আমরা কয়টি ভেরিয়েবল চাচ্ছি।
আমরা যদি লিখি int arr[10] তাহলে ১০ সাইজের একটি এরে তৈরি হবে যার প্রতিটি হবে int টাইপের।
আমরা যদি লিখি float arr[20] তাহলে ২০ সাইজের একটি এরে তৈরি হবে যার প্রতিটি হবে float টাইপের।
মডিউল ৭-৩, ৭-৪: এরে এক্সেস করা
এরে ডিক্লেয়ার করা আমরা দেখে নিলাম। আমরা এবার দেখব এরে কিভাবে এক্সেস করা যায়।
আমরা যদি লিখি int ar[5] তাহলে ৫ সাইজের একটি এরে ক্রিয়েট হবে। এরের ইন্ডেক্স গুলো হবে 0 থেকে 4 পর্যন্ত। এবার আমরা দেখে নিই মেমরিতে এরে কিভাবে সেইভ হয়।
মনে করি এরের প্রথম ইন্ডেক্স এর মেমরি এড্রেস হচ্ছে ৫৩০ (এটি জাস্ট একটি কাল্পনিক এড্রেস)। যেহেতু এটি একটি int টাইপের এরে এবং একটি int ভেরিয়েবল মেমরিতে ৪ বাইট জায়গা নেয়, তাই আমাদের এরের দ্বিতীয় ইন্ডেক্স এর এড্রেস হবে ৫৩০+৪ = ৫৩৪। কারন প্রথম ইন্ডেক্স ৫৩০,৫৩১,৫৩২,৫৩৩ এই ৪টি বাইট জায়গা নিয়ে নিয়েছে।
তৃতীয় ইন্ডেক্স হবে ৫৩৪+৪ = ৫৩৮।
এরে এক্সেস করার একমাত্র উপায় হচ্ছে ইন্ডেক্স। এরেতে ইন্ডেক্স শুরু হয় ০ থেকে। আমরা যদি ৫ সাইজের একটি এরে ডিক্লেয়ার করি তাহলে তার ইন্ডেক্স হবে ০ থেকে ৪ পর্যন্ত। আমরা যদি ১০ সাইজের একটি এরে ডিক্লেয়ার করি তাহলে তার ইন্ডেক্স হবে ০ থেকে ৯ পর্যন্ত।
আমাদের যদি এরেতে কোন স্পেসিফিক ইন্ডেক্স এর ভেলু প্রয়োজন হয় তাহলে এভাবে এক্সেস করতে পারিঃ array_name[index]
আমাদের যদি arr নামক এরেতে ৩ নম্বর ইন্ডেক্সটি প্রয়োজন হয় তাহলে arr[3] এভাবে লিখতে পারি।
মডিউল ৭-৫: এরে এর মেমোরী ম্যানেজমেন্ট
এরে এর ক্ষেত্রে মেমরী গুলো সিকুয়েন্সিয়ালি এসাইন হয়ে থাকে।
ধরি, আমরা ৫ সাইজের একটি integer টাইপের এরে ডিক্লেয়ার করেছি। এক্ষেত্রে যদি এরে এর প্রথম ইলিমেন্ট টি মেমোরী এর X তম ঘরে জায়গা নেয়, তবে যেহেতু আমরা integer ডাটা টাইপ নিচ্ছি, তাই X থেকে নিয়ে 4 byte জায়গা দখল করবে। অর্থাৎ এর পরের ইলিমেন্ট টি জায়গা নেয়া শুরু করবে X+4 তম ঘর থেকে। এরপরের ইলিমেন্ট থাকবে X+8 তম ঘর থেকে।
মডিউল ৭-৬, ৭-৭: এরে ইনপুট আউটপুট
এবার আমরা শিখব কিভাবে এরেতে ইনপুট নেওয়া যায় এবং আউটপুট দেখানো যায়।
আমরা যদি একটি ৫ সাইজের ইন্টিজার এরে ডিক্লেয়ার করিঃ int ar[5];
এখন আমরা যদি এই এরেতে ইনপুট নিতে চাই তাহলে আমাদের ইনপুট নিতে হবে এই সিরিয়ালেঃ
scanf("%d", &ar[0]);scanf("%d", &ar[1]);scanf("%d", &ar[2]);scanf("%d", &ar[3]);scanf("%d", &ar[4]);
এখানে ভালো করে লক্ষ্য করলে দেখা যায় সবকিছু সেইম শুধু ইন্ডেক্স এর ভেলু বাদে। এই ভেলু গুলো আমরা খুব সিম্পলি একটি লুপ চালিয়ে দিতে পারি 0 থেকে 4 পর্যন্ত। তারপর লুপের মধ্যে যদি আমরা ইনপুট নেওয়ার কোড লিখে দেই তাহলে আমাদের ইনপুট নেওয়ার কোড একবার লিখলেই হয়ে যাবে।
Code (Array Input):
#include <stdio.h>
int main()
{
int ar[5]; // ৫ সাইজের এরে ডিক্লেয়ার করছি
for(int i=0; i<5; i++) // ০ থেকে ৪ পর্যন্ত লুপ চালানো হচ্ছে। কারন ৫ সাইজের এরেতে ইন্ডেক্স থাকে ০ থেকে ৪ পর্যন্ত।
{
scanf("%d", &ar[i]); // প্রতিবার এরের ইন্ডেক্সে ইনপুট নেওয়া হচ্ছে। i এর মান যখন 0 তখন ইনপুট হবে ar[0] তে, i এর মান যখন 1 তখন ইনপুট হবে ar[1] এ। এরকম ভাবে চলবে।
}
return 0;
}সেইমভাবে এরেতে আউটপুট দেখানো যাবে। আউটপুটের ক্ষেত্রে আমাদের প্রতিটি ইন্ডেক্স এ যেয়ে প্রিন্ট করতে হবে। এটিও আমরা একটি লুপ চালিয়ে করে ফেলতে পারি। পুরো কাজ ইনপুট এর মতোই জাস্ট scanf এর জায়গায় printf হবে।
Code (Array Input and Output):
#include <stdio.h>
int main()
{
int ar[5];
for(int i=0; i<5; i++) // এরে ইনপুট
{
scanf("%d", &ar[i]);
}
for(int i=0; i<5; i++) // এরে আউটপুট
{
printf("%d\n", ar[i]);
}
return 0;
}মডিউল ৭-৮, ৭-৯: এরে এর রিভার্স প্রিন্ট করা
এখন থেকে এরে ইনপুট নেওয়ার আগে আমরা এরের সাইজটাও ইনপুট নিয়ে নিব। তাহলে আমরা বুঝতে পারব আমাদের কত সাইজের এরে ডিক্লেয়ার করতে হবে।
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n); // এরে সাইজ ইনপুট নেওয়া হচ্ছে।
int ar[n]; // ভেরিয়েবল সাইজ এরে ডিক্লেয়ার করা হচ্ছে।
return 0;
}এক্ষেত্রে একটি ব্যাপার হচ্ছে ভেরিয়েবল সাইজ এরে ইনিশিয়ালাইজ করা যায় না। শুধুমাত্র ফিক্সড সাইজ এরে ( int ar[5] )ইনিশিয়ালাইজ করা যায়।
এরে রিভার্স প্রিন্ট করার আগে আমরা একবার সোজা প্রিন্ট করে দেখি।
Code (Normal Array Printing):
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n); // এরে সাইজ ইনপুট নেওয়া হচ্ছে।
int ar[n]; // ওই সাইজের এরে ডিক্লেয়ার করা হচ্ছে।
for(int i=0; i<n; i++) // ৫ সাইজের এরে হলে আমরা লুপ চালাতাম i<5 পর্যন্ত। এখন আমাদের সাইজ হচ্ছে n তাই আমরা লুপ চালাচ্ছি i<n পর্যন্ত।
{
scanf("%d", &ar[i]); // ইনপুট নিচ্ছি।
}
for(int i=0; i<n; i++) // প্রথম ইন্ডেক্স থেকে লাস্ট ইন্ডেক্স পর্যন্ত লুপ চালিয়ে প্রিন্ট করা হচ্ছে।
{
printf("%d ", ar[i]);
}
return 0;
}এবার আমরা যদি প্রিন্ট করার লুপটিকে উল্টিয়ে দেই। অর্থাৎ লাস্ট ইন্ডেক্স থেকে প্রথম ইন্ডেক্স পর্যন্ত চালাই, তাহলেই আমাদের এরে রিভার্স প্রিন্ট হয়ে যাবে। এখন আমরা লুপ চালাবো n-1 থেকে 0 পর্যন্ত。
কেন আমরা n-1 থেকে চালাবো?
কারন যদি এরের সাইজ ৫ হয় তাহলে এরের লাস্ট ইন্ডেক্স হয় ৫-১ = ৪
যদি এরের সাইজ ১০ হয় তাহলে এরের লাস্ট ইন্ডেক্স হয় ১০-১ = ৯
তাই যদি এরের সাইজ n হয় তাহলে এরের লাস্ট ইন্ডেক্স হবে n-1।
Code (Reverse Array Printing):
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int ar[n];
for(int i=0; i<n; i++)
{
scanf("%d", &ar[i]);
}
for(int i=n-1; i>=0; i--) // এরের লাস্ট ইন্ডেক্স n-1 থেকে প্রথম ইন্ডেক্স 0 পর্যন্ত লুপ চালানো হয়েছে। যেহেতু প্রতিবার ইন্ডেক্স এর মান ১ করে কমছে তাই i-- করে প্রতিবার i এর মান ১ করে কমানো হচ্ছে।
{
printf("%d ", ar[i]); // প্রিন্ট করা হচ্ছে।
}
return 0;
}মডিউল ৭-১০: এরে ইনিশিয়ালাইজ করা
এবার আমরা দেখব কিভাবে আমরা একটি এরেকে ইনিশিয়ালাইজ করতে পারি। অর্থাৎ ইনপুট না নিয়ে শুরুতেই ভেলু সেট করে দিতে পারি।
এরে ইনিশিয়ালাইজ করা খুবই ইজি। এরে ডিক্লেয়ার করে = দিয়ে { } ব্রাকেটের মধ্যে কমা দিয়ে দিয়ে ভেলু দিয়ে দিলেই হয়ে যাবে।
Code (Array Initialization):
#include <stdio.h>
int main()
{
int ar[5]={10,20,30,40,50}; // ৫ সাইজের এরে ডিক্লেয়ার করে = দিয়ে {} ব্রাকেটের মধ্যে কমা দিয়ে ভেলু দিয়ে দেওয়া হচ্ছে।
for(int i=0; i<5; i++) // তারপর আমরা এরে প্রিন্ট করে দেখছি ভেলুগুলো ঠিকভাবে প্রিন্ট হচ্ছে কিনা
{
printf("%d\n", ar[i]);
}
return 0;
}এটি রান করলে আমরা দেখতে পাব ভেলু গুলো ঠিক ভাবে প্রিন্ট হচ্ছে। এভাবে আমরা এরেতে ভেলু ইনপুট না নিয়েও ভেলু ইনিশিয়ালাইজ করে দিতে পারি।
আমরা যদি এরকম লিখতে চাইঃ
#include <stdio.h>
int main()
{
int ar[5]={10}; // এরের সাইজ বলা হয়েছে ৫ কিন্তু ভেলু দেওয়া হয়েছে মাত্র ১টি।
for(int i=0; i<5; i++)
{
printf("%d\n", ar[i]);
}
return 0;
}এটি রান করলে আমরা দেখতে পারব প্রথমে ১০ প্রিন্ট হচ্ছে কিন্তু তারপর সব ০ প্রিন্ট হচ্ছে।
এরেতে যদি সাইজের থেকে কম ভেলু দেওয়া হয় তাহলে বাকি ভেলুগুলো মেমরিতে ০ হিসেবে সেইভ হয়।
আমাদের যদি কখনো এরেতে সবগুলো ভেলু শুরুতে ০ থাকবে এরকম প্রয়োজন হয়। তাহলে আমরা এভাবে লিখতে পারিঃ
#include <stdio.h>
int main()
{
int ar[5]={0}; // ৫ সাইজের এরে নিয়ে একটি ভেলু হিসেবে ০ রেখে দিচ্ছি। বাকি ভেলুগুলো মেমরিতে অটো ০ হিসেবে সেইভ হয়ে যাবে।
for(int i=0; i<5; i++)
{
printf("%d\n", ar[i]);
}
return 0;
}এটি রান করলে দেখতে পারব সবগুলো ভেলুই ০ প্রিন্ট হয়েছে।
মডিউল ৭-১১, ৭-১২: এরেতে সবগুলো ভেলু যোগ করা
আমরা লুপ চালিয়ে এরের ভেলুগুলো প্রিন্ট করা দেখেছি। সেইমভাবে আমাদের যদি এরেতে সবগুলো ভেলু যোগ করতে হয় তখন আমরা লুপ চালিয়ে প্রতিটি ভেলুতে যেয়ে সেটি প্রিন্ট না করে আমরা যোগ করে ফেলতে পারি।
Code (Sum of Array Elements):
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n); // এরে সাইজ ইনপুট নেওয়া হচ্ছে।
int ar[n];
for(int i=0; i<n; i++) // এরে ইনপুট নেওয়া হচ্ছে।
{
scanf("%d", &ar[i]);
}
int sum=0; // যোগফল রাখার জন্য একটি ভেরিয়েবল নিয়ে শুরুতে ০ রেখে দেওয়া হচ্ছে।
for(int i=0; i<n; i++) // লুপ চালিয়ে এরের প্রতিটি ইন্ডেক্সে যাচ্ছি।
{
sum=sum+ar[i]; // প্রতিটি ইন্ডেক্সে যেয়ে ভেলুগুলো সাম ভেরিয়েবলের সাথে যোগ করে দিচ্ছি।
}
printf("%d", sum); // ভেরিয়েবলটি প্রিন্ট করে যোগফল প্রিন্ট করা হচ্ছে।
return 0;
}