কোডজিম ইউনিভার্সিটি কোর্সের অংশ হিসাবে একজন পরামর্শদাতার সাথে একটি বক্তৃতা স্নিপেট। সম্পূর্ণ কোর্সের জন্য সাইন আপ করুন।


"শুভেচ্ছা, আমিগো!"

"হ্যালো, ঋষি!"

"আপনি ইতিমধ্যে অ্যারে সম্পর্কে একটি বা দুটি জিনিস জানেন, এবং আপনি এমনকি কিছু কাজ সমাধান করতে সক্ষম হয়েছেন, আমি আশা করি। কিন্তু আপনি সবকিছু জানেন না। উদাহরণস্বরূপ, এখানে অ্যারে সম্পর্কে আরেকটি আকর্ষণীয় তথ্য রয়েছে। অ্যারেগুলি শুধুমাত্র এক-মাত্রিক নয় (লিনিয়ার) ) তারা দ্বিমাত্রিকও হতে পারে।"

"উম... তার মানে কি?"

"এর মানে হল যে অ্যারের কোষগুলি শুধুমাত্র একটি কলাম (বা সারি) নয়, একটি আয়তক্ষেত্রাকার টেবিলও উপস্থাপন করতে পারে।

int[][]name = new int[width][height];

"যেখানে নাম হল অ্যারের ভেরিয়েবলের নাম, প্রস্থ হল টেবিলের প্রস্থ (কোষে) এবং উচ্চতা হল টেবিলের উচ্চতা৷ একটি উদাহরণ দেখুন:

int[][] data = new int[2][5];
data[1][1] = 5;
আমরা একটি দ্বি-মাত্রিক অ্যারে তৈরি করি: 2টি কলাম এবং 5টি সারি।
আমরা ঘরে 5 লিখি (1,1)।

"মেমরিতে এটি এভাবে দেখাবে:

দ্বি-মাত্রিক অ্যারে

"যাইহোক, দ্বি-মাত্রিক অ্যারেগুলির জন্য, আপনি দ্রুত সূচনাও ব্যবহার করতে পারেন:

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

"হুম... এখন এটি আকর্ষণীয়। আমরা যদি কল্পনা করি যে প্রথম অভ্যন্তরীণ বন্ধনীতে একটি উপাদান উপস্থাপন করে, পরেরটি একটি সেকেন্ড... তাহলে একটি দ্বি-মাত্রিক অ্যারে অ্যারের অ্যারের মতো?"

"আপনি কত স্মার্ট ছাত্র! ঠিকই। প্রথম উপাদানটি এক-মাত্রিক অ্যারে {31, 28, 31}, দ্বিতীয়টি {30, 31, 30}, এবং আরও অনেক কিছু। কিন্তু আমরা এই পাঠে একটু পরে ফিরে আসব। ততক্ষণ পর্যন্ত, চিন্তা করার চেষ্টা করুন সারি এবং কলাম সহ একটি সারণী হিসাবে একটি দ্বি-মাত্রিক বিন্যাস, প্রতিটি সংযোগস্থলে কোষ গঠন করে।

"আমি এটির একটি মানসিক ছবি পেয়েছি। উপায় দ্বারা, তারা কি জন্য ব্যবহার করা হয়, এই দ্বিমাত্রিক অ্যারে?"

"প্রোগ্রামারের প্রায়শই দ্বি-মাত্রিক অ্যারেগুলির প্রয়োজন হয়৷ আপনি যদি ঘনিষ্ঠভাবে দেখেন, প্রায় কোনও বোর্ড গেম একটি অফ-দ্য-শেল্ফ দ্বি-মাত্রিক অ্যারে ব্যবহার করে প্রয়োগ করা হয়: দাবা, চেকার, টিক-ট্যাক-টো, সমুদ্র যুদ্ধ, ইত্যাদি:"

সমুদ্র যুদ্ধ

"আমি বুঝতে পেরেছি! দাবা বা সমুদ্র যুদ্ধের খেলার ক্ষেত্রটি দ্বি-মাত্রিক অ্যারেতে পুরোপুরি ফিট করে!"

"হ্যাঁ, কিন্তু আপনাকে সেল স্থানাঙ্ক হিসাবে সংখ্যাগুলি ব্যবহার করতে হবে৷ 'pawn e2-e4' নয়, 'pawn (5,2) -> (5,4)'৷ এটি একজন প্রোগ্রামার হিসাবে আপনার জন্য আরও সহজ হবে৷ "

অ্যারেগুলিতে উপাদানগুলি সাজানো: (x, y) বা (y, x)

"দ্বি-মাত্রিক অ্যারে তৈরি করা একটি আকর্ষণীয় দ্বিধা তৈরি করে। যখন আমরা ব্যবহার করে একটি অ্যারে তৈরি করি new int [2][5];, তখন আমাদের কি 'দুটি সারি এবং 5টি কলাম ' এর একটি টেবিল আছে নাকি এটি 'দুটি কলাম এবং 5টি সারি' আছে?"

"অন্য কথায়, এটি সম্পূর্ণরূপে পরিষ্কার নয় যে আমরা প্রথমে প্রস্থ এবং তারপর 'উচ্চতা... বা বিপরীতভাবে, প্রথমে উচ্চতা এবং তারপর প্রস্থ নির্দিষ্ট করছি?"

"হ্যাঁ, এই দ্বিধা। এবং কোন নির্দিষ্ট উত্তর নেই।"

"কি করো?"

"প্রথমে, আমাদের দ্বি-মাত্রিক অ্যারে আসলে কীভাবে মেমরিতে সংরক্ষিত হয় তা বোঝা গুরুত্বপূর্ণ ৷ স্বাভাবিকভাবেই, কম্পিউটার মেমরিতে আসলে কোনও টেবিল থাকে না: মেমরির প্রতিটি অবস্থানের একটি ক্রমিক সংখ্যাসূচক ঠিকানা থাকে: 0, 1, 2, ... আমাদের জন্য, এটি একটি 2 × 5 টেবিল, কিন্তু মেমরিতে এটি মাত্র 10 কোষ, এর বেশি কিছু নয়। সারি এবং কলামে বিভাজন নেই।"

"আমি এটা বুঝতে পেরেছি। তাহলে আমরা কীভাবে নির্ধারণ করব কোন মাত্রা প্রথমে আসে - প্রস্থ বা উচ্চতা?"

"আসুন প্রথম বিকল্পটি বিবেচনা করা যাক। প্রথমে প্রস্থ, তারপর উচ্চতা। " এই পদ্ধতির পক্ষে যুক্তি হল: প্রত্যেকে স্কুলে গণিত শেখে, এবং তারা শিখে যে স্থানাঙ্ক জোড়া 'x' (অর্থাৎ, অনুভূমিক অক্ষ) হিসাবে লেখা হয় এবং তারপর 'y' (উল্লম্ব মাত্রা)। এবং এটি শুধুমাত্র একটি স্কুলের মান নয় - এটি গণিতে একটি সাধারণভাবে স্বীকৃত মান। যেমন তারা বলে, আপনি গণিতের সাথে তর্ক করতে পারবেন না।"

"তাই নাকি? আচ্ছা, আমরা যদি লড়াই করতে না পারি, তাহলে প্রথমে প্রস্থ তারপর উচ্চতা?"

" 'প্রথমে উচ্চতা, তারপর প্রস্থ'-এর পক্ষে একটি আকর্ষণীয় যুক্তি রয়েছে । এই যুক্তিটি দ্বি-মাত্রিক অ্যারেগুলির দ্রুত প্রাথমিককরণ থেকে আসে। সর্বোপরি, আমরা যদি আমাদের অ্যারে শুরু করতে চাই, তাহলে আমরা এইরকম কোড লিখি:"

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

"তাহলে এটা আমাদের জন্য কি করে?"

"আপনি কি কিছু লক্ষ্য করেছেন? যদি আমাদের এটি থাকে?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

"যদি আমরা কোড লাইনে লাইন দ্বারা আমাদের ডেটা লিখি, তাহলে আমরা 2টি সারি এবং 5টি কলাম সহ একটি টেবিল পাই।"

"এখন আমি দেখছি। 2 হল উচ্চতা, এবং 5 হল প্রস্থ... তাহলে আমরা কোন বিকল্পটি ব্যবহার করব?"

"কোনটি বেশি সুবিধাজনক তা সিদ্ধান্ত নেওয়া আপনার উপর নির্ভর করে। সবচেয়ে গুরুত্বপূর্ণ বিষয় হল একই প্রকল্পে কাজ করা সমস্ত প্রোগ্রামার একই পদ্ধতিতে লেগে থাকে।"

"আপনি যদি এমন একটি প্রকল্পে কাজ করেন যার কোডে প্রচুর প্রাথমিক দ্বি-মাত্রিক অ্যারে রয়েছে, তাহলে সম্ভবত সেখানে সবকিছুই দ্রুত ডেটা প্রারম্ভিকতার উপর ভিত্তি করে হবে, অর্থাৎ আপনার মান 'উচ্চতা x প্রস্থ' থাকবে৷

"যদি আপনি নিজেকে অনেক গণিত জড়িত একটি প্রকল্পে খুঁজে পান এবং স্থানাঙ্কের সাথে কাজ করেন (উদাহরণস্বরূপ, গেম ইঞ্জিন), তাহলে কোডটি সম্ভবত 'প্রস্থ x উচ্চতা' পদ্ধতি অবলম্বন করবে।

কিভাবে দ্বি-মাত্রিক অ্যারে সাজানো হয়

"এখন, আপনি কি পাঠের শুরুতে লক্ষ্য করেছেন এমন দ্বি-মাত্রিক অ্যারেগুলির বিশেষ বৈশিষ্ট্যটি মনে রাখবেন?"

"হ্যাঁ! এটা ছিল যে দ্বি-মাত্রিক অ্যারে আসলে অ্যারের অ্যারে!"

"একদম ঠিক।" অন্য কথায়, যদি একটি সাধারণ অ্যারের ক্ষেত্রে একটি অ্যারে ভেরিয়েবল অ্যারের উপাদানগুলিকে সঞ্চয় করে এমন একটি ধারকটির একটি রেফারেন্স সঞ্চয় করে, তাহলে দ্বি-মাত্রিক অ্যারের ক্ষেত্রে পরিস্থিতি কিছুটা বিস্ফোরিত হয়: একটি দ্বি-মাত্রিক -অ্যারে ভেরিয়েবল একটি কন্টেইনারের একটি রেফারেন্স সঞ্চয় করে যা এক-মাত্রিক অ্যারের রেফারেন্স সংরক্ষণ করে। একশোবার ব্যাখ্যা করার চেষ্টা করার চেয়ে এটিকে একবার কর্মে দেখা ভাল:"

কিভাবে দ্বি-মাত্রিক অ্যারে সাজানো হয়

"বাম দিকে , আমাদের একটি দ্বি-মাত্রিক-অ্যারে ভেরিয়েবল রয়েছে, যা একটি দ্বি-মাত্রিক-অ্যারে বস্তুর একটি রেফারেন্স সংরক্ষণ করে। মাঝখানে একটি দ্বি-মাত্রিক অ্যারে বস্তু রয়েছে যার কোষগুলি এক-মাত্রিক অ্যারে সংরক্ষণ করে, যা একটি দ্বি-মাত্রিক অ্যারের সারি। এবং ডানদিকে , আপনি চারটি এক-মাত্রিক অ্যারে দেখতে পাচ্ছেন — আমাদের দ্বি-মাত্রিক অ্যারের সারি। এভাবেই দ্বি-মাত্রিক অ্যারে কাজ করে।"

"ফ্যান্টাস্টিক! কিন্তু এটা আমাদের কি দেয়?"

"যেহেতু একটি 'পাত্রের ধারক' 'সারিগুলির অ্যারে'-এর উল্লেখ করে, আমরা খুব দ্রুত এবং সহজে সারিগুলি অদলবদল করতে পারি৷ একটি 'পাত্রের ধারক' পেতে, আপনাকে দুটির পরিবর্তে একটি সূচক নির্দিষ্ট করতে হবে৷ উদাহরণ:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

"নীচের কোডটি দেখুন। আমরা সারি অদলবদল করতে এটি ব্যবহার করতে পারি:"

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
দ্বি-মাত্রিক অ্যারে





matrix[0]প্রথম সারির একটি রেফারেন্স সঞ্চয় করে।
আমরা রেফারেন্স অদলবদল.

ফলস্বরূপ, matrixঅ্যারে এই মত দেখায়:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

"বুঝলাম। এটা যেকোন দুটি সাধারণ আইটেমের অদলবদল করার মত কাজ করে।"

"তাই হয়। ঠিক আছে, আপনি যদি দ্বি-মাত্রিক অ্যারের একটি ঘরকে উল্লেখ করেন, কিন্তু আপনি অ্যারের নামের পরে শুধুমাত্র একটি সূচক উল্লেখ করেন, তাহলে আপনি এমন একটি পাত্রের ধারক উল্লেখ করছেন যার কোষগুলি সাধারণ একটির রেফারেন্স সংরক্ষণ করে- মাত্রিক অ্যারে।"

"সবকিছু যৌক্তিক এবং পরিষ্কার বলে মনে হচ্ছে। বক্তৃতার জন্য ধন্যবাদ, ঋষি!"

"আপনাকে স্বাগত জানাই। এটিকে বুদ্ধিমানের সাথে অনুশীলন করুন।"