Arrays এবং Strings (অ্যারে এবং স্ট্রিংস)
অ্যারে এবং স্ট্রিংস ডি প্রোগ্রামিং ভাষায় খুবই গুরুত্বপূর্ণ ডেটা স্ট্রাকচার, যা একাধিক মান সংরক্ষণ এবং পরিচালনা করতে ব্যবহৃত হয়। অ্যারে একটি একক ডেটা টাইপের অনেকগুলো মান সংরক্ষণ করার জন্য ব্যবহৃত হয়, আর স্ট্রিংস হল অক্ষরের সিকোয়েন্স, যা টেক্সট ডেটা স্টোর করতে ব্যবহৃত হয়।
1. অ্যারে (Arrays)
অ্যারে হলো এক ধরনের ডেটা স্ট্রাকচার যা একই ধরনের একাধিক উপাদানকে একটি নির্দিষ্ট আকারে সংরক্ষণ করতে ব্যবহৃত হয়। ডি প্রোগ্রামিং ভাষায় অ্যারে ডিক্লেয়ার, ইনিশিয়ালাইজ এবং ব্যবহৃত করা হয় খুবই সহজভাবে।
অ্যারে ডিক্লেয়ারেশন (Array Declaration)
ডি ভাষায় অ্যারে ডিক্লেয়ার করার জন্য একটি নির্দিষ্ট ডেটা টাইপ এবং সাইজ দেওয়া হয়।
// একটি অ্যারে ডিক্লেয়ার করা
int[] arr = [1, 2, 3, 4, 5]; // এক বা একাধিক মানের অ্যারেএখানে int[] অ্যারের ডেটা টাইপ, এবং arr অ্যারের নাম। অ্যারে ইনিশিয়ালাইজ করা হয়েছে {1, 2, 3, 4, 5} দিয়ে।
অ্যারের উপাদান অ্যাক্সেস (Array Element Access)
অ্যারের উপাদান এক্সেস করতে অ্যারের ইনডেক্স ব্যবহার করা হয়। ডি ভাষায় ইনডেক্স 0 থেকে শুরু হয়।
int x = arr[0]; // অ্যারের প্রথম উপাদান (1)
int y = arr[3]; // অ্যারের চতুর্থ উপাদান (4)অ্যারে আকার (Array Length)
অ্যারের আকার বা সাইজ জানার জন্য length প্রপার্টি ব্যবহার করা হয়।
int length = arr.length; // অ্যারের আকার
writeln(length); // আউটপুট হবে: 5অ্যারে লুপিং (Array Looping)
অ্যারে লুপিং করতে foreach লুপ ব্যবহার করা যায়।
foreach (num; arr) {
writeln(num); // প্রতিটি উপাদান প্রদর্শন করবে
}2. স্ট্রিংস (Strings)
স্ট্রিং হল অক্ষরের একটি সিকোয়েন্স, যা সাধারণত টেক্সট ডেটা সংরক্ষণ করতে ব্যবহৃত হয়। ডি ভাষায় স্ট্রিং একটি বিল্ট-ইন টাইপ, যা string নামে পরিচিত।
স্ট্রিং ডিক্লেয়ারেশন (String Declaration)
স্ট্রিং ডিক্লেয়ার এবং ইনিশিয়ালাইজ করা হয় সাধারণত ডাবল কোট (") দিয়ে।
string str = "Hello, D Language!";স্ট্রিং অ্যাক্সেস (String Access)
স্ট্রিংয়ের প্রতিটি অক্ষর অ্যাক্সেস করতে [] অপারেটর ব্যবহার করা হয়।
char ch = str[0]; // স্ট্রিংয়ের প্রথম অক্ষর 'H'
writeln(ch); // আউটপুট হবে: Hস্ট্রিং এর দৈর্ঘ্য (String Length)
স্ট্রিংয়ের দৈর্ঘ্য জানতে length প্রপার্টি ব্যবহার করা হয়।
int len = str.length; // স্ট্রিংয়ের দৈর্ঘ্য
writeln(len); // আউটপুট হবে: 20স্ট্রিং এর অংশ (Substring)
স্ট্রিংয়ের একটি অংশ বের করার জন্য [startIndex .. endIndex] ব্যবহার করা হয়।
string subStr = str[7 .. 12]; // "D Lan"
writeln(subStr); // আউটপুট হবে: D Lanস্ট্রিং সংযোজন (String Concatenation)
স্ট্রিংয়ের দুটি অংশ একত্রিত করতে ~ অপারেটর ব্যবহার করা হয়।
string str2 = "Welcome to ";
string str3 = "D programming!";
string fullStr = str2 ~ str3; // "Welcome to D programming!"
writeln(fullStr); // আউটপুট হবে: Welcome to D programming!স্ট্রিং তুলনা (String Comparison)
স্ট্রিং তুলনা করতে == বা != অপারেটর ব্যবহার করা হয়।
string str1 = "Hello";
string str2 = "hello";
bool isEqual = (str1 == str2); // false
writeln(isEqual); // আউটপুট হবে: false3. স্ট্রিং এবং অ্যারে মধ্যে পার্থক্য
- অ্যারে: একাধিক উপাদান ধারণ করার জন্য ব্যবহৃত হয়, এবং এর সব উপাদান একই ধরনের হয়। যেমন: একটি ইন্টিজার অ্যারে, যেখানে সমস্ত উপাদান ইন্টিজার টাইপের।
- স্ট্রিং: এটি একটি বিশেষ অ্যারে যার উপাদানগুলো অক্ষর (char)। স্ট্রিং শুধুমাত্র অক্ষরের একটি সিকোয়েন্স এবং এটি একটি বিশেষ ডেটা টাইপ হিসেবে ব্যবহৃত হয়।
4. মাল্টি-ডাইমেনশনাল অ্যারে (Multidimensional Arrays)
ডি ভাষায় মাল্টি-ডাইমেনশনাল অ্যারে (যেমন, 2D বা 3D অ্যারে) ব্যবহার করা যেতে পারে, যেখানে অ্যারের প্রতিটি উপাদান নিজেও একটি অ্যারে হতে পারে।
উদাহরণ:
int[][] matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
writeln(matrix[0][1]); // আউটপুট হবে: 2 (প্রথম সারির দ্বিতীয় উপাদান)5. স্ট্রিং এবং অ্যারে সম্পর্কিত কিছু গুরুত্বপূর্ণ ফাংশন
to!string(): অন্য ডেটা টাইপকে স্ট্রিংয়ে রূপান্তর করতে ব্যবহৃত হয়।int x = 5; string str = to!string(x); // "5"startsWith()এবংendsWith(): স্ট্রিংয়ের শুরু বা শেষের অংশ পরীক্ষা করতে ব্যবহৃত হয়।bool starts = str.startsWith("Hello"); // true bool ends = str.endsWith("D!"); // true
সারসংক্ষেপ
ডি প্রোগ্রামিং ভাষায় অ্যারে এবং স্ট্রিংস গুরুত্বপূর্ণ ডেটা স্ট্রাকচার। অ্যারে একাধিক একই ধরনের ডেটা সংরক্ষণ করতে ব্যবহৃত হয়, এবং স্ট্রিং টেক্সট ডেটা স্টোর করতে ব্যবহৃত হয়। ডি ভাষায় স্ট্রিং এবং অ্যারে ব্যবহার করে ডেটা ম্যানিপুলেশন খুবই সহজ। আপনি অ্যারে এবং স্ট্রিংয়ের আকার, উপাদান অ্যাক্সেস, এবং সংযোজন করতে পারবেন খুব সহজে।
Static এবং Dynamic Arrays এর মধ্যে পার্থক্য
ডি প্রোগ্রামিং ভাষায় স্ট্যাটিক (Static) এবং ডাইনামিক (Dynamic) অ্যারে দুটি মৌলিক অ্যারে ধারণা। এই দুটি অ্যারের মধ্যে বেশ কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে, যা কোডের কার্যকারিতা এবং মেমরি ব্যবস্থাপনায় প্রভাব ফেলে। এখানে স্ট্যাটিক অ্যারে এবং ডাইনামিক অ্যারে এর মধ্যে পার্থক্য আলোচনা করা হলো।
1. স্ট্যাটিক অ্যারে (Static Arrays)
স্ট্যাটিক অ্যারে হলো এমন অ্যারে, যার আকার নির্ধারণ করা হয় প্রোগ্রাম শুরু হওয়ার সময় এবং এটি পরিবর্তনযোগ্য নয়। একবার আকার নির্ধারণ করা হলে, এটি আর পরিবর্তন করা সম্ভব নয়। স্ট্যাটিক অ্যারে সাধারণত মেমরির একটি স্থির জায়গায় সংরক্ষিত হয়।
বৈশিষ্ট্য:
- স্ট্যাটিক সাইজ: অ্যারের আকার কম্পাইল টাইমে নির্ধারিত হয় এবং রানটাইমে এটি পরিবর্তন করা যায় না।
- ফিক্সড আকার: একবার অ্যারে তৈরি হলে, এর সাইজ পরিবর্তন করা সম্ভব নয়।
- মেমরি ব্যবস্থাপনা: মেমরি রানটাইমের আগে নির্ধারিত হয়, যা সাধারণত স্ট্যাক মেমরিতে রাখা হয়।
উদাহরণ:
int[5] arr; // ৫ আউটপুট এর একটি স্ট্যাটিক অ্যারে
arr[0] = 10; // অ্যারের প্রথম উপাদান
arr[1] = 20; // অ্যারের দ্বিতীয় উপাদানএখানে arr অ্যারের আকার ৫, যা স্ট্যাটিক এবং পরিবর্তনযোগ্য নয়।
2. ডাইনামিক অ্যারে (Dynamic Arrays)
ডাইনামিক অ্যারে হলো এমন অ্যারে, যার আকার রানটাইমে নির্ধারণ করা হয় এবং প্রয়োজনে এটি পরিবর্তন করা যায়। ডাইনামিক অ্যারেগুলি মেমরি heap থেকে সংরক্ষিত হয়, যার ফলে এগুলি ফ্লেক্সিবল এবং আকারে পরিবর্তনশীল।
বৈশিষ্ট্য:
- ডাইনামিক সাইজ: অ্যারের আকার রানটাইমে নির্ধারণ করা হয় এবং প্রয়োজনে এটি পরিবর্তন করা যায়।
- ফ্লেক্সিবল আকার: এটি প্রয়োজনে আকার পরিবর্তন করতে পারে (অর্থাৎ, নতুন উপাদান যোগ করা বা অ্যারের আকার কমানো সম্ভব)।
- মেমরি ব্যবস্থাপনা: ডাইনামিক অ্যারেগুলি heap মেমরিতে সংরক্ষিত হয়, এবং এটি যখন ব্যবহার শেষে আর দরকার হয় না তখন ম্যানুয়ালি মুছে ফেলতে হয় (garbage collection নেই)।
উদাহরণ:
int[] arr; // ডাইনামিক অ্যারে
arr = new int[5]; // রানটাইমে ৫ আকারের অ্যারে তৈরি
arr[0] = 10; // অ্যারের প্রথম উপাদান
arr[1] = 20; // অ্যারের দ্বিতীয় উপাদানএখানে arr অ্যারের আকার রানটাইমে নির্ধারণ করা হয়েছে এবং প্রয়োজনে এটি পরিবর্তন করা যেতে পারে।
3. স্ট্যাটিক এবং ডাইনামিক অ্যারের মধ্যে পার্থক্য
| বৈশিষ্ট্য | স্ট্যাটিক অ্যারে | ডাইনামিক অ্যারে |
|---|---|---|
| সাইজ নির্ধারণ | কম্পাইল টাইমে নির্ধারণ করা হয় | রানটাইমে নির্ধারণ করা হয় |
| আকার পরিবর্তন | একবার নির্ধারিত হলে আকার পরিবর্তন সম্ভব নয় | আকার পরিবর্তন করা যায়, যেমন নতুন উপাদান যোগ করা যায় |
| মেমরি স্থিতি | স্ট্যাক মেমরিতে সংরক্ষিত | হিপ মেমরিতে সংরক্ষিত |
| পারফরম্যান্স | দ্রুত, কারণ মেমরি প্রিপ্ল্যান করা থাকে | কিছুটা ধীর, কারণ আকার পরিবর্তন করার জন্য মেমরি পুনঃপ্রবাহিত করতে হয় |
| ফ্লেক্সিবিলিটি | সীমিত, আকার পরিবর্তন করা যায় না | অধিক ফ্লেক্সিবল, আকার পরিবর্তন করা যায় |
| ব্যবহার | ছোট এবং পূর্বনির্ধারিত আকারের অ্যারে | বড় এবং পরিবর্তনযোগ্য আকারের অ্যারে |
4. স্ট্যাটিক এবং ডাইনামিক অ্যারের সুবিধা এবং সীমাবদ্ধতা
- স্ট্যাটিক অ্যারে:
- সুবিধা: দ্রুত অ্যাক্সেস, মেমরি ব্যবস্থাপনা সহজ।
- সীমাবদ্ধতা: আকার পরিবর্তন করা সম্ভব নয়, প্রোগ্রাম শুরুতেই সাইজ নির্ধারণ করতে হয়।
- ডাইনামিক অ্যারে:
- সুবিধা: ফ্লেক্সিবল, প্রয়োজনে আকার পরিবর্তন করা যায়।
- সীমাবদ্ধতা: ধীর কার্যকারিতা, মেমরি ব্যবস্থাপনা কমপ্লেক্স, কারণ মেমরি ফ্রী করতে হয়।
সারসংক্ষেপ
স্ট্যাটিক অ্যারে এবং ডাইনামিক অ্যারের মধ্যে মূল পার্থক্য হল সাইজ এবং মেমরি ব্যবস্থাপনায়। স্ট্যাটিক অ্যারে ফিক্সড আকারের হয় এবং দ্রুত হয়, কিন্তু ডাইনামিক অ্যারে আকার পরিবর্তনযোগ্য এবং আরও ফ্লেক্সিবল, তবে এর কিছু মেমরি ব্যবস্থাপনা সম্পর্কিত চ্যালেঞ্জ রয়েছে। আপনি যখন জানেন যে আপনার অ্যারের আকার নির্দিষ্ট এবং অপরিবর্তনীয় হবে, তখন স্ট্যাটিক অ্যারে ব্যবহার করুন, এবং যখন আকার পরিবর্তনযোগ্য হতে হবে, তখন ডাইনামিক অ্যারে ব্যবহার করুন।
Slicing এবং Range ব্যবহার
Slicing এবং Range হল ডি প্রোগ্রামিং ভাষায় ডেটা কাঠামো, বিশেষত অ্যারে এবং সিকোয়েন্স (sequence) এর সাথে কাজ করার জন্য শক্তিশালী বৈশিষ্ট্য। এগুলি ব্যবহার করে আপনি অ্যারে বা স্ট্রিংয়ের অংশ চয়ন করতে পারেন, এমনকি নির্দিষ্ট একটি রেঞ্জের মধ্যে কাজ করতে পারেন। এই বৈশিষ্ট্যগুলো কোড লেখাকে সহজ এবং নমনীয় করে তোলে।
1. Slicing (অংশ ভাগ করা)
Slicing হল একটি পদ্ধতি যার মাধ্যমে অ্যারে বা স্ট্রিংয়ের একটি নির্দিষ্ট অংশকে চয়ন করা হয়। এটি নির্দিষ্ট সূচক (index) এর মধ্যে একটি সাবসেট তৈরি করে, যা কেবলমাত্র নির্দিষ্ট আউটপুট প্রদান করে।
Slicing সঠিকভাবে কাজ করার জন্য সি প্রোগ্রামিং ভাষার মধ্যে কোনও নির্দিষ্ট ফিচার নেই, কিন্তু ডি প্রোগ্রামিং ভাষায় slice ফিচারটি ব্যবহার করা হয়। এই ফিচারটি অ্যারে, স্ট্রিং, অথবা সিকোয়েন্সের অংশ চয়ন করতে ব্যবহৃত হয়।
উদাহরণ:
import std.stdio;
void main() {
string text = "Hello, D!";
// Slicing দিয়ে প্রথম 5 অক্ষর নেয়া
string slicedText = text[0..5];
writeln(slicedText); // আউটপুট: Hello
}এখানে text[0..5] মানে প্রথম থেকে পঞ্চম ইনডেক্স পর্যন্ত আউটপুট দেয়া। 0..5 নির্দেশ করে প্রথম থেকে শুরু করে, 5 তম অক্ষর পর্যন্ত (5 তম ইনডেক্স ছাড়া) কেটে নেবে।
স্লাইসিংয়ের সেম্যান্টিক:
start..end: এই রেঞ্জেstartইনডেক্স থেকেendইনডেক্স পর্যন্ত স্লাইস হবে, তবেendইনডেক্সটি অন্তর্ভুক্ত হবে না।start..$: যদি$ব্যবহার করেন, তাহলে এটি শেষ ইনডেক্স পর্যন্ত স্লাইস করবে।
উদাহরণ:
import std.stdio;
void main() {
string text = "Hello, D!";
// Slicing দিয়ে শেষ থেকে 3 অক্ষর নেয়া
string slicedText = text[$-3..$];
writeln(slicedText); // আউটপুট: D!
}এখানে $-3..$ নির্দেশ করে শেষ থেকে তিনটি অক্ষর নেয়া।
2. Range (রেঞ্জ) ব্যবহার
Range একটি উপকারী বৈশিষ্ট্য, যা ডি প্রোগ্রামিং ভাষায় একটি নির্দিষ্ট রেঞ্জে ডেটা অ্যাক্সেস বা প্রক্রিয়াকরণ করতে ব্যবহৃত হয়। এটি সাধারণত ইটারেবল (iterable) অ্যারে বা সিকোয়েন্সের সাথে কাজ করতে ব্যবহৃত হয়। range ব্যবহার করে আপনি একটি নির্দিষ্ট স্টার্ট পয়েন্ট থেকে একটি স্টপ পয়েন্ট পর্যন্ত ইটারেট করতে পারেন।
উদাহরণ:
import std.stdio;
void main() {
// 0 থেকে 4 পর্যন্ত একটি রেঞ্জ
foreach (i; 0..5) {
writeln(i); // আউটপুট: 0 1 2 3 4
}
}এখানে 0..5 একটি রেঞ্জ, যার মাধ্যমে 0 থেকে 4 পর্যন্ত মানগুলি আউটপুট হবে।
Range এর কিছু বৈশিষ্ট্য:
0..n: এটি 0 থেকেn-1পর্যন্ত একটি রেঞ্জ তৈরি করে।start..end: এটি একটি নির্দিষ্ট রেঞ্জ তৈরি করে, যেখানেstartহল রেঞ্জের শুরুর পয়েন্ট এবংendহল রেঞ্জের শেষ পয়েন্ট।$এর ব্যবহার: যদি$ব্যবহার করেন, তাহলে এটি শেষ ইনডেক্স পর্যন্ত রেঞ্জ তৈরি করবে।
উদাহরণ (Range with step):
import std.stdio;
void main() {
// রেঞ্জের মধ্যে একটি স্টেপ সহ মান নেয়া
foreach (i; 0..10 by 2) {
writeln(i); // আউটপুট: 0 2 4 6 8
}
}এখানে 0..10 by 2 নির্দেশ করছে যে, এটি 0 থেকে 10 পর্যন্ত ইটারেট করবে এবং প্রতি দুইটি স্টেপে একটি মান নিবে।
3. Slicing এবং Range একসাথে ব্যবহার
আপনি Slicing এবং Range একসাথে ব্যবহার করতে পারেন, বিশেষ করে যখন আপনার নির্দিষ্ট রেঞ্জের মধ্যে কোন ডেটা অংশ বের করতে হয়।
উদাহরণ:
import std.stdio;
void main() {
string text = "Hello, D!";
// Range এর মাধ্যমে স্লাইসিং করা
foreach (i; 0..5) {
writeln(text[i]); // আউটপুট: H e l l o
}
}এখানে text[i] ব্যবহার করে স্লাইসিং এবং রেঞ্জ একসাথে ব্যবহার করা হয়েছে।
সারসংক্ষেপ
- Slicing: এটি একটি উপকারী বৈশিষ্ট্য, যা একটি স্ট্রিং বা অ্যারের নির্দিষ্ট অংশ বের করার জন্য ব্যবহৃত হয়।
start..endরেঞ্জ ব্যবহার করে আপনি অ্যারে বা স্ট্রিংয়ের একটি নির্দিষ্ট অংশ নিয়ে আসতে পারেন। - Range: এটি ডি প্রোগ্রামিং ভাষায় একটি ইটারেবল রেঞ্জ তৈরি করে, যার মাধ্যমে একটি নির্দিষ্ট রেঞ্জের মধ্যে ইটারেট করতে পারেন। আপনি
byব্যবহার করে ইটারেশন স্টেপও নির্ধারণ করতে পারেন।
এই দুটি বৈশিষ্ট্য কোড লেখার সময় আপনাকে আরো নমনীয়তা এবং সহজে ডেটা পরিচালনা করার সুযোগ দেয়।
Multidimensional Arrays এর ব্যবহার
Multidimensional Arrays হল এমন অ্যারে যা একাধিক ডাইমেনশন বা মাত্রা ধারণ করে। সাধারণত একটি অ্যারে এক মাত্রার (1D) হয়, তবে যখন অ্যারেকে একাধিক মাত্রায় প্রসারিত করা হয়, তখন সেটি multidimensional array হিসেবে পরিচিত। ডি প্রোগ্রামিং ভাষায় multidimensional arrays ব্যবহৃত হয় জটিল ডেটা স্ট্রাকচার তৈরির জন্য, যেমন ম্যাট্রিক্স (matrices), টেবিল (tables), এবং গ্রিড (grids) এর মতো ডেটা সংরক্ষণে।
ডি ভাষায় multidimensional arrays খুবই সহজ এবং সোজা ভাবে ব্যবহৃত হতে পারে। এখানে ২ বা তার অধিক মাত্রার অ্যারে ব্যবহার করে কিভাবে ডেটা সংরক্ষণ এবং অ্যাক্সেস করা যায়, তা আলোচনা করা হলো।
1. ডি ভাষায় 2D অ্যারে
2D অ্যারে হলো এমন একটি অ্যারে, যার মধ্যে দুটি মাত্রা রয়েছে—সারি (row) এবং কলাম (column)। এটি একটি ম্যাট্রিক্সের মতো দেখতে হয়, যেখানে প্রতিটি উপাদান একটি নির্দিষ্ট সারি এবং কলামে সংরক্ষিত থাকে।
উদাহরণ:
import std.stdio;
void main() {
int[3][3] matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; // 2D অ্যারে
// অ্যারের উপাদান প্রিন্ট করা
foreach (i; 0 .. 3) {
foreach (j; 0 .. 3) {
write(matrix[i][j], " ");
}
writeln();
}
}এখানে:
int[3][3] matrixএকটি ৩x৩ আকারের 2D অ্যারে।- প্রথম
foreachলুপটি সারি অনুযায়ী অ্যারে লুপ করবে, আর দ্বিতীয়foreachকলাম অনুযায়ী উপাদানগুলো প্রিন্ট করবে।
আউটপুট:
1 2 3
4 5 6
7 8 9 2. ডি ভাষায় 3D অ্যারে
3D অ্যারে একটি অ্যারে, যার তিনটি মাত্রা থাকে: সারি (row), কলাম (column), এবং স্তম্ভ (depth)। এটি সাধারণত ত্রি-মাত্রিক গ্রিড বা ভলিউম ডেটা রেপ্রেজেন্টেশনের জন্য ব্যবহৃত হয়।
উদাহরণ:
import std.stdio;
void main() {
int[2][3][2] grid = [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]; // 3D অ্যারে
// 3D অ্যারে উপাদান প্রিন্ট করা
foreach (i; 0 .. 2) {
foreach (j; 0 .. 3) {
foreach (k; 0 .. 2) {
write(grid[i][j][k], " ");
}
writeln();
}
}
}এখানে:
int[2][3][2] gridএকটি ২x৩x২ আকারের 3D অ্যারে।- তিনটি
foreachলুপ ব্যবহার করে ৩টি মাত্রা দিয়ে অ্যারে প্রিন্ট করা হয়েছে।
আউটপুট:
1 2 3 4 5 6
7 8 9 10 11 12 3. ডি ভাষায় অ্যারে ইনডেক্সিং এবং অ্যাক্সেস
ডি ভাষায়, আপনি সাধারণ অ্যারের মতো multidimensional arrays-এর উপাদানগুলোতে সরাসরি ইনডেক্সিং করে অ্যাক্সেস করতে পারেন। তবে মনে রাখতে হবে যে, ইনডেক্সিং শূন্য থেকে শুরু হয়।
উদাহরণ:
import std.stdio;
void main() {
int[2][2] arr = [[1, 2], [3, 4]];
writeln("Element at arr[0][1]: ", arr[0][1]); // আউটপুট: 2
writeln("Element at arr[1][0]: ", arr[1][0]); // আউটপুট: 3
}এখানে:
arr[0][1]হলো প্রথম সারির দ্বিতীয় কলামের মান, অর্থাৎ2।arr[1][0]হলো দ্বিতীয় সারির প্রথম কলামের মান, অর্থাৎ3।
4. অ্যারে মেমরি আলোকন
ডি ভাষায় multidimensional arraysকে সরাসরি দুটি বা তার অধিক মাত্রায় তৈরি করা যায়, কিন্তু আপনি যদি dynamic array ব্যবহার করতে চান, তাহলে এর আকার runtime এ পরিবর্তনশীল হতে পারে।
উদাহরণ:
import std.stdio;
void main() {
int[][] dynamicArray = [[1, 2], [3, 4], [5, 6]]; // Dynamic 2D array
foreach (i; 0 .. dynamicArray.length) {
foreach (j; 0 .. dynamicArray[i].length) {
write(dynamicArray[i][j], " ");
}
writeln();
}
}এখানে:
dynamicArrayহলো একটি dynamic 2D অ্যারে, যা runtime এ তৈরি করা হয়।
5. Multidimensional Arrays এর ব্যবহার
Multidimensional arrays সাধারণত ব্যবহার করা হয়:
- ম্যাট্রিক্স এবং গাণিতিক অপারেশন: ২D বা ৩D অ্যারে ম্যাট্রিক্স গাণিতিক অপারেশন (যেমন গুণ, যোগফল) করার জন্য ব্যবহৃত হয়।
- গ্রিড বা টেবিল: ডেটাবেসের টেবিল বা স্প্রেডশীটের মতো ডেটা স্ট্রাকচারগুলো সংরক্ষণ করতে।
- ভলিউম ডেটা: ৩D গ্রিড বা ভলিউম ডেটা সঞ্চয় করতে।
- ছবি বা ইমেজ প্রসেসিং: ২D বা ৩D ইমেজ রেপ্রেজেন্টেশনের জন্য।
সারসংক্ষেপ
ডি প্রোগ্রামিং ভাষায় multidimensional arrays অনেকগুলো আর্গুমেন্ট বা উপাদান ধারন করার জন্য ব্যবহৃত হয়। এই অ্যারে ডেটাকে বিভিন্ন মাত্রায় (যেমন 2D, 3D) সঞ্চয় করে এবং এগুলোকে অ্যাক্সেস করা সহজ হয় ইনডেক্সিংয়ের মাধ্যমে। এই ধরনের অ্যারে ম্যাট্রিক্স, গ্রিড, টেবিল এবং ভলিউম ডেটা রেপ্রেজেন্টেশনে গুরুত্বপূর্ণ ভূমিকা পালন করে।
String ম্যানিপুলেশন এবং Functions
ডি প্রোগ্রামিং ভাষায় string manipulation একটি সাধারণ এবং গুরুত্বপূর্ণ কাজ, যা প্রায় সব প্রোগ্রামে ব্যবহৃত হয়। স্ট্রিং একটি সিকোয়েন্স (sequence) বা সিকোয়েন্সিয়াল ডেটা টাইপ, যেখানে প্রতিটি ক্যারেক্টার বা অক্ষর একটি নির্দিষ্ট ইনডেক্স পজিশনে থাকে। ডি প্রোগ্রামিং ভাষায় স্ট্রিং ম্যানিপুলেশন করার জন্য বেশ কিছু শক্তিশালী ফাংশন এবং মেথড সরবরাহ করা হয়।
এখানে string manipulation এবং বিভিন্ন স্ট্রিং ফাংশন নিয়ে আলোচনা করা হলো।
1. String ডিক্লেয়ারেশন এবং ইনিশিয়ালাইজেশন
ডি প্রোগ্রামিং ভাষায় স্ট্রিং ডিক্লেয়ারেশন এবং ইনিশিয়ালাইজেশন খুবই সহজ। স্ট্রিং মূলত string টাইপ দ্বারা ডিফাইন করা হয়।
উদাহরণ:
string str = "Hello, D Programming!";এখানে:
strএকটি স্ট্রিং ভেরিয়েবল, যা"Hello, D Programming!"মান ধারণ করছে।
2. String Length এবং Size
ডি ভাষায় স্ট্রিং এর দৈর্ঘ্য জানার জন্য length বা to!string ফাংশন ব্যবহার করা যায়। এই ফাংশনটি স্ট্রিংয়ের মধ্যে কয়টি ক্যারেক্টার রয়েছে তা রিটার্ন করে।
উদাহরণ:
string str = "Hello, D!";
writeln(str.length); // আউটপুট: 10এখানে:
str.lengthফাংশনটি স্ট্রিংটির দৈর্ঘ্য (মোট ক্যারেক্টার সংখ্যা) রিটার্ন করে।
3. String Concatenation (যোগফল)
স্ট্রিং যোগ করার জন্য ~ অপারেটর ব্যবহার করা হয়। এটি দুটি স্ট্রিং একত্রিত করতে সহায়তা করে।
উদাহরণ:
string firstName = "John";
string lastName = "Doe";
string fullName = firstName ~ " " ~ lastName; // Concatenate with a space in between
writeln(fullName); // আউটপুট: John Doeএখানে:
~অপারেটর দুটি স্ট্রিংকে একত্রিত করে এবং তাদের মধ্যে একটি স্পেস যোগ করে।
4. String Substring (উপস্ট্রিং)
স্ট্রিংয়ের একটি অংশ (substring) বের করার জন্য substring ফাংশন ব্যবহার করা হয়। এটি একটি নির্দিষ্ট শুরু এবং শেষ পজিশনের মধ্যে স্ট্রিংয়ের অংশ বের করে।
উদাহরণ:
string str = "Hello, D Programming!";
string subStr = str[0..5]; // Extract "Hello"
writeln(subStr); // আউটপুট: Helloএখানে:
str[0..5]স্ট্রিংয়ের প্রথম ৫টি ক্যারেক্টার (ইনডেক্স 0 থেকে 4 পর্যন্ত) বের করে।
5. String Comparison (স্ট্রিং তুলনা)
স্ট্রিং তুলনা করতে == অপারেটর ব্যবহার করা হয়, যা দুটি স্ট্রিংয়ের মান তুলনা করে এবং true বা false রিটার্ন করে।
উদাহরণ:
string str1 = "Hello";
string str2 = "World";
string str3 = "Hello";
writeln(str1 == str2); // আউটপুট: false
writeln(str1 == str3); // আউটপুট: trueএখানে:
- প্রথম তুলনা
str1এবংstr2এর মধ্যে পার্থক্য হওয়ায়falseরিটার্ন করবে। - দ্বিতীয় তুলনা
str1এবংstr3সমান হওয়ায়trueরিটার্ন করবে।
6. String Search (স্ট্রিং অনুসন্ধান)
স্ট্রিংয়ের মধ্যে একটি সাবস্ট্রিং খুঁজতে indexOf ফাংশন ব্যবহার করা হয়। এটি একটি নির্দিষ্ট সাবস্ট্রিং এর প্রথম উপস্থিতির ইনডেক্স রিটার্ন করে।
উদাহরণ:
string str = "Hello, D Programming!";
int index = str.indexOf("D"); // Find index of "D"
writeln(index); // আউটপুট: 7এখানে:
indexOfফাংশনটি"D"এর প্রথম ইনডেক্স ৭ রিটার্ন করবে।
7. String Case Conversion (কেস কনভার্সন)
স্ট্রিংয়ের ক্যারেক্টার কেস পরিবর্তন করতে toUpper এবং toLower ফাংশন ব্যবহার করা হয়।
উদাহরণ:
string str = "Hello, D Programming!";
writeln(str.toUpper); // আউটপুট: HELLO, D PROGRAMMING!
writeln(str.toLower); // আউটপুট: hello, d programming!এখানে:
toUpperফাংশন স্ট্রিংয়ের সকল ক্যারেক্টারকে বড় হাতের অক্ষরে রূপান্তরিত করে।toLowerফাংশন স্ট্রিংয়ের সকল ক্যারেক্টারকে ছোট হাতের অক্ষরে রূপান্তরিত করে।
8. String Trim (স্ট্রিং ট্রিমিং)
স্ট্রিংয়ের শুরু এবং শেষে থাকা অপ্রয়োজনীয় স্পেস বা সাদা জায়গা (whitespace) মুছে ফেলতে strip ফাংশন ব্যবহার করা হয়।
উদাহরণ:
string str = " Hello, D Programming! ";
string trimmed = str.strip; // Remove leading and trailing spaces
writeln(trimmed); // আউটপুট: Hello, D Programming!এখানে:
stripফাংশন স্ট্রিংয়ের শুরু এবং শেষের সাদা জায়গা মুছে দেয়।
9. String Formatting (স্ট্রিং ফরম্যাটিং)
স্ট্রিং ফরম্যাটিং করতে format ফাংশন ব্যবহার করা হয়, যা স্ট্রিংয়ের মধ্যে ভেরিয়েবল বা ডাইনামিক মান ইনজেক্ট করে।
উদাহরণ:
int age = 25;
string name = "John";
writeln("Name: %s, Age: %d".format(name, age)); // আউটপুট: Name: John, Age: 25এখানে:
formatফাংশনটি স্ট্রিংয়ের মধ্যে%sএবং%dপ্লেসহোল্ডার ব্যবহার করেnameএবংageএর মান ইনজেক্ট করে।
সারসংক্ষেপ
ডি প্রোগ্রামিং ভাষায় স্ট্রিং ম্যানিপুলেশন অত্যন্ত সহজ এবং শক্তিশালী। ডি ভাষায় স্ট্রিং ডিক্লেয়ারেশন, কনক্যাটেনেশন, সাবস্ট্রিং, কম্পেয়ার, সার্চ, কেস কনভার্সন, ট্রিমিং এবং ফরম্যাটিং সহ অনেক স্ট্রিং ম্যানিপুলেশন ফাংশন রয়েছে, যা কোডিংকে সহজ এবং দ্রুত করে তোলে। এগুলি ব্যবহার করে আপনি ডেটা প্রক্রিয়া, টেক্সট ম্যানিপুলেশন এবং অন্যান্য অ্যাপ্লিকেশন তৈরি করতে পারেন।
Read more