Responsive Ads Here

Sunday, December 8, 2013

C প্রোগ্রামিং দ্বিতীয় অধ্যায় - Data Type এর লিমিট: - PART 6

কোন ধরনের ডাটা টাইপের জন্য কম্পিউটার কত মেমোরি নিয়ে থাকে একটু চোখ বুলিয়ে নেই:
  • integer ভেরিয়েবল এর জন্য মেমোরি প্রয়োজন: ৪ বাইটস
  • character ভেরিয়েবল এর জন্য মেমোরি প্রয়োজন: ১ বাইট
  • float ভেরিয়েবল এর জন্য মেমোরি প্রয়োজন: ৪ বাইটস
  • double ভেরিয়েবল এর জন্য মেমোরি প্রয়োজন: ৮ বাইটস
ডাটা টাইপ এর মেমোরি এবং ইনপুট লিমিট: 
Integer Data Type এর লিমিট:
নিচের চিত্রে দেখো:
তারমানে আমাদের (Plus,Minus)2147483648 এর চেয়ে বড় কোন সংখ্যা প্রিন্ট করতে চাইলে অবশ্যই সেটি  double Type এর ভেরিয়েবল নিতে হবে। কারন double এর Memory, Integer এবং Character Type এর ভেরিয়েবল এর মেমোরির চেয়ে অনেক বেশী। আশা করি ব্যাপারটি মাথার ভেতর নিয়ে নিয়েছো।
নিচের প্রোগ্রামটি লিখে রান করিয়ে দেখতে পারো:(কোড ৬.১)


#include 
int main()
{
      int a;
      a = 2015454455454;
      printf("%d\n", a);
      return 0;
}



আউটপুট কি আসে?
1114793630
তাইনা? কিন্তু আমরা কি দিয়েছি ইনপুট?
2015454455454
এর কারন কি?
কারন:
2015454455454 > 2147483648
আশা করি ব্যাপারটা বুঝে গেছো।
তাহলে উপরের কোড টিকে Double ডাটা টাইপ এ নিয়ে রান করে দেখ।
যদি পারো তাহলে নিজেকে একটা বাহবা দিয়ে নিতে পারো। না পারলে নিচের কোড টা দেখতে পারো:
Double Data Type:(এই কোড টা double ডাটা টাইপ দিয়ে করা-(কোড ৬.১.১))
আশা করি উপরের ব্যাখ্যাটা বুঝে গেছো।
এবার নিচের প্রোগ্রামটি লেখ এবং রান করাও:(কোড ৬.২)


#include 
int main()
{
    double a,b;
    int c;
    a = 1021212255;
    b = 2015454455;
    c = a + b;
    printf("%d\n", c);
    return 0;
}



কি আসে আউটপুট?
-2147483648
কিন্তু আউটপুট তো আসার কথা:
3036666710.000000
তাইনা?
দেখো, এই পর্বের শুরুতে আমি একটা উদাহরন দিয়েছি। সেটা যদি মনে থাকে তাহলে দেখো উপরের কোড এ আমি কি করেছি।
প্রথমে a,b দুটো ভেরিয়েবল নিলাম double Type এর যার মেমোরি ৮ bytes । আবার আরেকটা ভেরিয়েবল c নিলাম Integer Type এর যার মেমোরি 4 Bytes। তারপর a, b এর জন্য দুটো আলাদা আলাদা মান নিলাম।


a = 1021212255;
b = 2015454455;



এখানে দেখো আমি a,b এর মান double Type(৮ Bytes এর মেমোরি, তাই এত বড় সংখ্যাও ফাকা মেমোরিতে রাখতে পারবে) এর ভেরিয়েবল নিলাম। এখন এই দুটো ভেরিয়েবল এর মান যোগ করলাম। কত হল?
3036666710.000000
এই মানটা আমি কোথায় রাখতে বলেছি?
c নামের একটা ভেরিয়েবল এ। কিন্তু c এর মেমোরি মাত্র 4 বাইটস। তাই না? আর double এর মেমোরি ৮ বাইটস। তাহলে ৮ বাইটস এর মেমোরির সংখ্যা কিভাবে  4 বাইটস এর মেমোরিতে সংরক্ষন করতে পারবে???
পারবে না যদি না সংখ্যা গুলো double হয়েও 2147483648 এর ছোট না হয়। তাই যখন ই a,b এর মান যোগ করার পর c ভেরিয়েবল এ রাখতে গেলো, তখন ই সমস্যা হয়ে গেলো। দেখা গেলো 3036666710.000000 সংখ্যা টি Integer এর মেমোরির চেয়ে অনেক বড়। আর তাই এই গারবেজ সংখ্যা প্রিন্ট করেছে।
তার মানে, এখন আমি যদি উপরের কোড টিকে ঠিক করে রান করাতে চাই তাহলে কি করতে হবে?
c ভেরিয়েবল টা integer না নিয়ে double এ নিতে হবে।
অর্থাৎ দুটি বা একাধিক বড় জিনিসকে আমরা ছোট কোন জায়গায় রাখতে পারব না, কিন্তু ছোট জিনিস গুলোকে কিন্তু বড় জায়গায় রাখতে পারি। তাই না??
তাহলে কোড ৬.২ ঠিক করে রান করা তো। যদি না পারো তাহলে নিচের কোড টা দেখো:
এখন নিচের কোড টা লিখে রান করে দেখো:(কোড ৬.৩)

#include 
int main()
{
       double a,b;
       int c;
       a = 50;
       b = 50;
       c = a * b;
       printf("%d\n", c);
       return 0;
}



আউটপুট কি আসে?
2500
তাইনা? কিন্তু আগের কোড(৬.২) আর এই কোড(৬.৩) এর মধ্যে পার্থক্য কোথায়। এই কোড এ গারবেজ মান আসল না কেন?
কারন:
দেখো, আগের কোড এ a,b এর যে মান নেয়া হয়েছে, তাদের যোগফল কিন্ত Integer Type ভেরিয়েবল এর মানের চেয়ে অনেক বড় কিন্তু কোড ৬.৩ এ a,b এর যে মান নেয়া হয়েছে, তাদের যোগফল কিন্ত Integer Type ভেরিয়েবল এর মানের চেয়ে অনেক ছোট, তাই a,b double Type এর ভেরিয়েবল হলেও এদের মান এবং এদের যোগফলের মান ছোট হওয়ায় ইন্টিজার টাইপ ভেরিয়েবল c এর মধ্যে রাখা সম্ভব হয়েছে। আশা করি বুঝেছো কি বলেছি। তুমি a,b এর বিভিন্ন মান নিয়ে পরীক্ষা করে দেখতে পারো। তাহলে ব্যাপার টা আরো পরিস্কার হবে।
নিচের কোড টি লিখে রান করাও:

#include 
int main()
{
      int a,b,c;
      a = 50;
      b = 100;
      c = a / b;
      printf("%d\n", c);
      return 0;
}



আউটপুট কি এসেছে?
0
কিন্ত আউটপুট কি আসার কথা?
0.5
এর কারন কি? নিচের ছবিতে দেখো:
Integer Type ভেরিয়েবল "." দশমিক এর পরে কি আছে সেটা আর মেমোরিতে নিবে না। তাই আউটপুট হিসেবে 0 এসেছে।
নিচের কোড টা লিখে রান করাও:

#include 
 
int main()
{
      int a,b,c;
      a = 10;
      b = 4;
      c = a / b;
      printf("%d\n", c);
      return 0;
}



আউটপুট: 2
কারন: 10/4 = 2.5
যেহেতু এই সংখ্যাটি একটি ভগ্নাংশ এবং আমরা ভেরিয়েবল নিয়েছি Integer Type তাই "." দশমিক এর পরের অংশ আর মেমোরিতে রাখবে না।
তাই 2.5 এর জায়গায় মেমোরিতে 2 রেখে পরে তা প্রিণ্ট করে দিয়েছে।

বাসায় প্র্যাকটিস করার জন্য কিছু কোড:
প্র্যাকটিস কোড: ১

#include 
 
int main()
{
      int a,b,c;
      a = 100;
      b = 4.5;
      c = a / b;
      printf("%d\n", c);
     return 0;
}



প্র্যাকটিস কোড: ২*

#include 
int main()
{
      double a,b;
      int c;
      a = 154555;
      b = 454544;
      c = a * b;
      printf("%d\n", c);
      return 0;
}



* ২নং কোড এর আউটপুট গারবেজ সংখ্যা আসে। ঠিক কিরে কমেন্ট এ তোমার করা কোড টি লিখো।
আগামী পর্বে Character Type Variable নিয়ে আলোচনা করা হবে।

No comments:

Post a Comment

php4

<?php    // Start the session  session_start();  ?>  <!DOCTYPE html>  <html>  <head>       <link rel=&q...