Friday, February 23, 2018

ডাটা স্ট্রাকচার - ১ঃ ভেরিয়েবল, মেমরি অ্যাড্রেসিং এবং অ্যম্পারসেন্ড সমাচার

ছবিঃ সংগৃহীত


প্রোগ্রামিং করার করতে হলে ডাটা নিয়ে কাজ করতে হবেই। ডাটা বলার সাথে ডাটা ম্যানেজ করা বা সংরক্ষন করার একটা বিষয় চলে আসে। আর এই ডাটা ম্যানেজমেন্ট বা ডাটা রাখার ভিবিন্ন পদ্ধতির উপর ভিত্তি করে নানান ধরনের ডাটা স্ট্রাকচার আবিষ্কার হয়েছে। এগুলোর মধ্যে বেশ কিছু হল অ্যারে, লিঙ্ক লিস্ট, স্ট্যাক, কিউ, ট্রি, গ্রাফ! একেকটা ডাটা স্ট্রাকচারের একেক ধরনের সুবিধা। কোনটা কখন ব্যবহার করতে হবে তা সম্পূর্ন পরিস্থির উপর নির্ভর করে। ভিবিন্ন ডাটা স্ট্রাকচারের পাশাপাশি ডাটা স্ট্রাকচারের আর্কিটেকচার এবং মেমরি অ্যাড্রেস সম্পর্কে ধারনা থাকা চাই। কারন ডাটা স্ট্রাকচার, ডাটা এবং মেমরি পরস্পর পরস্পরের সাথে জড়িত। ডাটা স্ট্রাকচার; ডাটা এবং মেমরির সাথে যোগসূত্র স্থাপন করে। এই পর্বে এসব নিয়েই আলোচনা হবে।

প্রোগ্রামিং করার সময় আমাদের ভেরিয়েবল ডিক্লেয়ার করার দরকার হয়। এটার সাথে আমরা সবাই পরিচিত।  এটা ভেরিয়েবল হল ডাটা স্টোর করার সবচেয়ে সহজ এবং মৌলিক একটি পদ্ধতি। যা অন্য সব ডাটা স্ট্রাকচারের "মা"! অন্য সব ডাটা স্ট্রাকচারের মুল ভিত্তি হল ভেরিয়েবল।  কিন্তু ভেরিয়েবল এতটা গুরুত্বপুর্ন কেন? কেন এত ঝামেলার করার দরকার? আবার ইনপুট নেওয়ার সময় Scanf এর ভিতর অ্যাম্পারসেন্ড কেন ইউজ করতে হয়? এসব নিয়েই আজ ত্যানা পেছানো হবে-

ভেরিয়েবল হল ডাটা স্টোর করার সবচেয়ে সহজ এবং মৌলিক একটি পদ্ধতি। যা অন্য সব ডাটা স্ট্রাকচারের "মা"! অন্য সব ডাটা স্ট্রাকচারের মুল ভিত্তি হল ভেরিয়েবল। ভেরিয়েবল ছড়া কি প্রোগ্রামিং করা যাবেনা? উত্তর হল হ্যাঁ!  কিন্তু বেশ কিছু সমস্যা তোমাকে ফেস করতে হবে যার ফলে তুমি বেশীদুর এগোতে পারবানা। নীচের দুইটা প্রোগ্রাম খেয়াল করো। যেখানে আমি দুইটা সংখ্যার যোগ করেছি। একটাতে ভেরিয়েবল সহ আরেকটাতে ভেরিয়েবল ছাড়া।

Program - 1: Adding two numbers with variables

  #include <stdio.h>      
  int main()   
  {   
   int a, b, total; //declaring three variable to keep the data   
   a = 20;   
   b = 30;   
   total = a+b;   
   printf("Total: %d", total);  
   return 0;   
  }   

 OUTPUT  
 Total: 50  

Program - 2: Adding two numbers without variables 

 #include <stdio.h>   
 int main()  
 {  
   printf("%d\n", 20+30);  
   return 0;  
 }  

 OUTPUT  
 50  

দুইটা প্রোগ্রামই একই কাজ করতেছে। খুব সুন্দর। এবার আমরা সমস্যাটার একটু পরিবর্তন আনি। ধরা যাক তোমাকে বলা হল ইউজারের কাছ থেকে দুইটা নাম্বার ইনপুট নিয়ে তা যোগ করো। এবার এই কাজটাও ভেরিয়েবল ছাড়া এবং ভেরিয়েবল সহ করার চেষ্টা করো-

Program - 3: Input two numbers from the user and Add it(With Variable)

  #include <stdio.h>     
  int main()    
  {    
   int a, b, total; //declaring three variable to keep the data    
   scanf("%d%d", &a, &b);  
   total = a+b;  
   printf("Total: %d", total);   
   return 0;    
  }   

 INPUT   
  10   
  20   
 OUTPUT   
  30   

Program - 3: Input two numbers from the user and Add it(Without Variable)

এই কাজটা কি আদো সম্ভব? ইউজারের কাছ থেকে ইনপুট নেওয়ার পর সেই নাম্বারটা আগে কোথাও সংরক্ষন করে রাখতে হবে। না রাখতে পারলে তো সেটা নিয়ে কাজ করা যাবেনা। আর ডাটাটা রাখার জন্যই ভেরিয়েবল বা কোন না কোন ডাটা স্ট্রাকচারের প্রয়োজন পড়ে। যে সিস্টেমের সাথে ইউজার ইন্টারেক্ট করতে পারবেনা সেই সিস্টেমের কোন দাম নাই। আর সেজন্যই ভেরিয়েবল ছাড়া প্রোগ্রামিং করার দৌড় এখানেই শেষ।

ভেরিয়েবল কিভাবে কাজ করেঃ

আমরা সবাই জানি ভেরিয়েবলে ডাটা রাখতে হলে প্রথমে ভেরিয়েবল ডিক্লেয়ার করতে হয়। তারপর ডাটা রাখতে হয়। কিন্তু জিনিসটা আসলে কিভাবে কাজ করে? আর ডাটা আসলে কোথায় যায়?

আমরা জানি কোন ডাটা রাখতে হলে মেমরির দরকার হয়। কিন্তু ভেরিয়েবলের কি কোন মেমরি আছে? সে কিভাবে ডাটা রাখে?  

আমরা যখন ভেরিয়েবল ডিক্লেয়ার করি তখন সে মেমরিতে যায়গা করে নেয়। আমরা আসলে ডাটা টা ভেরিয়েবলের মাধ্যমে মেমরিতে পাস করি। আমরা জানি যেকোন যায়গারই একটা অ্যাড্রেস থাকে। ভেরিয়েবল মেমরির কোন যায়গায়টা নিলো তারও একটা অ্যাড্রেস থাকে। ভেরিয়েবলের মেমরি অ্যাড্রেস দেখতে হলে তার আগে & দিয়ে প্রিন্ট করলেই দেখতে পাওয়া যাবে। এই অ্যাড্রেস হল একটা নাম্বার। নীচের প্রোগ্রামটিতে তিনটা ভেরিয়েবলের মেমরি অ্যাড্রেস দেখানো হয়েছে।

Program - 4: Check the memory address of two variables 

 #include<stdio.h>  
 int main()  
 {  
   int a, b, total;  
   printf("Memory Address of a: %d\n", &a);  
   printf("Memory Address of b: %d\n", &b);  
   printf("Memory Address of total: %d\n", &total);  
   return 0;  
 }  

 OUTPUT  
 Memory Address of a: 6356748  
 Memory Address of b: 6356744  
 Memory Address of total: 6356740  

এখানে & দিয়ে দুটো ভেরিয়েবলের মেমরি অ্যাড্রেস প্রিন্ট করেছি। মেমরি অ্যাড্রেসটা পিসি-পিসি ভেরি করতে পারে। তবে আউটপুট যাই আসুক সেটাই হল তোমার পিসির জন্য ঐ ভেরিয়েবলের মেমরি অ্যাড্রেস! উপরের আউটপুটটা আমার পিসির জন্য।

ইউজারের কাছ থেকে ভেলু গুলো ইনপুট নেওয়ার সময় আমরা আসলে মেমরি অ্যাড্রেসটাই দেখিয়ে দিচ্ছি। সেই অ্যাড্রেসে গিয়েই সিস্টেম ডাটা টা রাখে। সেজন্যই ইনপুট নেওয়ার সময় আমরা & ইউজ করি। ৩ নাম্বার প্রোগ্রামে খেয়াল করো ইনপুট নেওয়ার সময় আমরা ভেরিয়েবলের সামনে & ইউজ করেছি। scanf এর ভিতরে & ইউজ করার রহস্য আসলে এটাই।

যেহেতু & মেমরি অ্যাড্রেস রিটার্ন করে সেহেতু আমরা &a, &b না ব্যবহার করে তাদের যে মেমরি অ্যাড্রেস পেলাম তা ব্যবহার করি! তাহলে কি কাজ করবে? নীচের প্রোগ্রামটি খেয়াল করো-

Program - 5: Input two numbers directly to the memory address 

 #include<stdio.h>  
 int main()  
 {  
   int a, b, total;  
   scanf("%d%d", 6356748,6356744);  
   total = a+b;  
   printf("%d", total);  
   return 0;  
 }  

 INPUT  
 10  
 20  
 OUTPUT  
 30  

অবাক হচ্ছো? তুমিও তোমার ভেরিয়েবলগুলোর মেমরি অ্যাড্রেস দিয়ে ট্রাই করতে পারো। কাজ করবে। খেয়াল করো আমি কিন্তু এখানে কোন & ইউজ করিনাই। কারন আমিতো অলরেডি অ্যাড্রেসটা পেয়েই গেছি।

যাইহোক, আমরা চাইলে এই মেমরি অ্যাড্রেসটা অন্য একটা ভেরিয়েবলে রেখেই কাজটা করতে পারি। মেমরি অ্যাড্রেস রাখার জন্য এক ধরনের বিশেষ ভেরিয়েবল আছে সি তে। এটাকে পয়েন্টার বলে। পয়েন্টার ডিক্লেয়ার করতে হয় * দিয়ে! নীচের প্রোগ্রামটি খেয়াল করো-

Program - 6: Input two numbers using pointers  

 #include<stdio.h>  
 int main()  
 {  
   int a, b, total;  //declaring variable   
   int *p1, *p2;   //declaring pointer variable   
   p1 = &a;      //keep the address of a to p1   
   p2 = &b;      //keep the address of b to p2    
   scanf("%d%d", p1,p2); //input the value to the memory location   
   total = a+b;  
   printf("%d", total);  
   return 0;  
 }  

 OUTPUT  
 Total: 50  

 INPUT  
 10  
 20  
 OUTPUT  
 30  

খেয়াল করো। ইনপুট নেওয়ার সময় আমরা এখানেও আর & ব্যবহার করছিনা। কারন p1 এবং p2 এর মধ্যেই মেমরি অ্যাড্রেস আছে।

আজ এই পর্যন্তই। আশাকরি ভেরিয়েবলের মেমরি অ্যাড্রেসিং এবং অ্যাম্পারসেন্ড এর কিচ্ছাকাহিনী থেকে কিছু একটা বুঝাতে সক্ষম হয়েছি। ধইন্যাপাতা

No comments:

Post a Comment