.

.

রবিবার, ৬ ডিসেম্বর, ২০১৫

সি প্রোগ্রামিং শিখি (পর্ব ৬)

সি প্রোগ্রামিং: পর্ব-৫ এর পর থেকে] :: ডাটা ইনপুট এবং আউটপুট এবং ডিক্লেয়ারেশন

[বিশেষ কথা: আমি এই টিউটোরিয়ালে যত গুলো প্রোগ্রাম বা কোড লিখব সবগুলা নিজে লিখে Run(চালিয়ে) করে দেখবে। তা না
হলে আমি শত শত কোড লিখলাম, আর তোমরা চেয়ে চেয়ে দেখলে অথবা কপি পেষ্ট করে কোড গুলা Run(চালিয়ে) না করলে কিন্তু শিখতে পারবা না। তাই প্রোগ্রামিং শিখতে হলে প্র্যাকটিস আর ধৈর্য্যের কোন বিকল্প নেই। আশা করি বুঝতে পারছো আমি কি বলেছি ]
আজকে একটা উদাহরন দিয়ে শুরু করি:
ধর তোমাকে আমি দুইটা ছোট দুইটা বাটি দিলাম(মুলত বিড়াল দের দুধ দেয়া হয়ে থাকে অথবা ঘরের সাধারন কাজে ব্যবহার করা হয় এমন আকৃতির)। এগুলো সাইজে খুভ বড় নয়।
নিচের চিত্রে দেখে নিতে পারো:(চিত্র ১)
চিত্র ১
এখন তোমাকে আরো দুটি বাটি দিলাম, যাদের মধ্যে একটি বড় এবং একটি ছোট।
নিচের চিত্রে দেখে নিতে পারো:(চিত্র ২)
চিত্র ২
এখন বললাম ১ নং চিত্রের বাটি গুলোকে ২ নং চিত্রে বাটির মধ্যে রাখতে হবে। তুমি ১ নং চিত্রের বাটি গুলোকে ২ নং চিত্রের কোন বাটিটির মধ্যে রাখতে পারবে যেন ১ নং চিত্রের বাটি গুলো ২ নং চিত্রে বাটির মধ্যে সম্পুর্নরুপে হারিয়ে যাবে বা বসে যাবে?
সবার উত্তর একটাই হওয়া উচিত এবং সেটি ২নং চিত্রের বড় বাটিটির মধ্যে। মানে ২নং চিত্রে বাম পাশে যে বড় বাটি টি আছে নিশ্চই সেটির মধ্যে। তার মানে একটি জিনিস অন্য একটি জিনিসকে সম্পুর্নরুপে নিজের মধ্যে বহন করতে হলে বাহক বা ধারক কে অবশ্যই "ধারন করতে হবে" এমন জিনিস হতে বড় বার সমান হতে হবে।
উপরের উদাহরন টি কেন দিলাম সেটি একটু পরে বলছি
এখন আবার একটু চোখ বুলিয়ে নেই কোন ধরনের ডাটা টাইপের জন্য কম্পিউটার কত মেমোরি নিয়ে থাকে:
  • integer ভেরিয়েবল এর জন্য মেমোরি প্রয়োজন: ২ বাইটস
  • character ভেরিয়েবল এর জন্য মেমোরি প্রয়োজন: ১ বাইট
  • float ভেরিয়েবল এর জন্য মেমোরি প্রয়োজন: ৪ বাইটস
  • double ভেরিয়েবল এর জন্য মেমোরি প্রয়োজন: ৮ বাইটস
ডাটা টাইপ এর মেমোরি এবং ইনপুট লিমিট: 
Integer Data Type এর লিমিট:
নিচের চিত্রে দেখো:
তারমানে আমাদের (Plus,Minus)2147483648 এর চেয়ে বড় কোন সংখ্যা প্রিন্ট করতে চাইলে অবশ্যই সেটি float বা double Type এর ভেরিয়েবল নিতে হবে। কারন float বা double এর Memory, Integer এবং Character Type এর ভেরিয়েবল এর মেমোরির চেয়ে অনেক বেশী। আশা করি ব্যাপারটি মাথার ভেতর নিয়ে নিয়েছো।
নিচের প্রোগ্রামটি লিখে রান করিয়ে দেখতে পারো:(কোড ৬.১)
#include <stdio.h>

int main()
{
      int a;
      a = 2015454455454;
      printf("%d\n", a);
      return 0;
}
আউটপুট কি আসে?
1114793630
তাইনা? কিন্তু আমরা কি দিয়েছি ইনপুট?
2015454455454
এর কারন কি?
কারন:
2015454455454 > 2147483648
আশা করি ব্যাপারটা বুঝে গেছো।
তাহলে উপরের কোড টিকে Double ডাটা টাইপ এ নিয়ে রান করে দেখ।
যদি পারো তাহলে নিজেকে একটা বাহবা দিয়ে নিতে পারো। না পারলে নিচের কোড টা দেখতে পারো:
Double Data Type:(এই কোড টা double ডাটা টাইপ দিয়ে করা-(কোড ৬.১.১))
আশা করি উপরের ব্যাখ্যাটা বুঝে গেছো।
এবার নিচের প্রোগ্রামটি লেখ এবং রান করাও:(কোড ৬.২)
#include <stdio.h>

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 এর যার মেমোরি 8 bytes । আবার আরেকটা ভেরিয়েবল c নিলাম Integer Type এর যার মেমোরি 2 Bytes। তারপর a, b এর জন্য দুটো আলাদা আলাদা মান নিলাম।
    a = 1021212255;
    b = 2015454455;
এখানে দেখো আমি a,b এর মান double Type(8 Bytes এর মেমোরি, তাই এত বড় সংখ্যাও ফাকা মেমোরিতে রাখতে পারবে) এর ভেরিয়েবল নিলাম। এখন এই দুটো ভেরিয়েবল এর মান যোগ করলাম। কত হল?
3036666710.000000
এই মানটা আমি কোথায় রাখতে বলেছি?
c নামের একটা ভেরিয়েবল এ। কিন্তু c এর মেমোরি মাত্র ২ বাইটস। তাই না? আর double এর মেমোরি 8 বাইটস। তাহলে 8 বাইটস এর মেমোরির সংখ্যা কিভাবে ২ বাইটস এর মেমোরিতে সংরক্ষন করতে পারবে???
পারবে না যদি না সংখ্যা গুলো double হয়েও 2147483648 এর ছোট না হয়। তাই যখন ই a,b এর মান যোগ করার পর c ভেরিয়েবল এ রাখতে গেলো, তখন ই সমস্যা হয়ে গেলো। দেখা গেলো 3036666710.000000 সংখ্যা টি Integer এর মেমোরির চেয়ে অনেক বড়। আর তাই এই গারবেজ সংখ্যা প্রিন্ট করেছে।
তার মানে, এখন আমি যদি উপরের কোড টিকে ঠিক করে রান করাতে চাই তাহলে কি করতে হবে?
c ভেরিয়েবল টা integer না নিয়ে double এ নিতে হবে।
অর্থাৎ দুটি বা একাধিক বড় জিনিসকে আমরা ছোট কোন জায়গায় রাখতে পারব না, কিন্তু ছোট জিনিস গুলোকে কিন্তু বড় জায়গায় রাখতে পারি। তাই না??
এখন কি উপরের "বাটি"র উদাহরন টা বুঝেছো?? আশা করি তাই।
তাহলে কোড ৬.২ ঠিক করে রান করা তো। যদি না পারো তাহলে নিচের কোড টা দেখো:
এখন নিচের কোড টা লিখে রান করে দেখো:(কোড ৬.৩)
#include <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

int main()
{
      int a,b,c;
      a = 100;
      b = 4.5;
      c = a / b;
      printf("%d\n", c);
     return 0;
}
প্র্যাকটিস কোড: ২*
#include <stdio.h>

int main()
{
      double a,b;
      int c;
      a = 154555;
      b = 454544;
      c = a * b;
      printf("%d\n", c);
      return 0;
} 
* ২নং কোড এর আউটপুট গারবেজ সংখ্যা আসে। ঠিক কিরে কমেন্ট এ তোমার করা কোড টি লিখো।সংগৃহীত। 
সৌজন্যেঃ Computer programming LIVE
ধারাবাহিক ভাবে চলতে থাকবে....

পোস্ট- মোঃ মোস্তফা কামাল

M05T4F4

About M05T4F4

Author Description here.. Nulla sagittis convallis. Curabitur consequat. Quisque metus enim, venenatis fermentum, mollis in, porta et, nibh. Duis vulputate elit in elit. Mauris dictum libero id justo.

Subscribe to this Blog via Email :