Friday, September 20, 2019

C Programming Level beginner 05

আমরা যদি Hello, World!! লেখাটি দেখাতে চাই তাহলে যা করতে হবে ঃ
প্রথমত, এটা খুবই ছোট একটা প্রোগ্রাম। এখানে #include <stdio.h> দ্বারা প্রোগ্রামের head বুঝানো হয়েছে। stdio দ্বারা বুঝায় standard input output. একটি ছোট প্রোগ্রাম লিখতে হলেও কিছু ফাংশন লাগে যা standard input output এর মধ্যে থাকে, এগুলো দিয়ে আমরা আগেই বলে দিলাম যে আমরা এর মধ্যে অবস্থিত ফাংশান গুলো ব্যবহার করব। আমরা যখন ঐ ধরনের কোন ফাংশনকে ডাকি তখন তা ব্যবহৃত হয়। আর.h দ্বারা header বুঝানো হয়।

main() হছে একটি ফাংশান। এটি দ্বারা বুঝানো হয় যে প্রোগ্রামটি এখান থেকে শুরু হয়েছে। একটি প্রোগ্রাম লিখলে তা কম্পাইলার কে বলে দিতে হয় কোথায় থেকে শুরু হচ্ছে প্রোগ্রামটা। প্রোগ্রাম রান করলে কোন এক যায়গা থেকে শুরু করতে হয়, main() দিয়ে তাই বলা হয় যে প্রোগ্রামটি এখান থেকে শুরু।
printf দ্বারা একটি command দেওয়া হয়েছে “Hello World” print করার জন্য। এটি একটি ফাংশান। যা standard input output  এর অংশ।

#include <stdio.h>
int main()
{
    printf("Hello World");
    return 0;
}

এখন যদি প্রোগরামটি run করাই তাহলে পর্দায় (Hello World) দেখাবে ।


#include <stdio.h> 

                                 এটি একটি প্রিপ্রসেসর command যা standard input output header file(stdio.h) অন্তর্ভুক্ত করে C library থেকে  C program কম্পাইল করবা পূর্বে ।

int main()

                                 int main()  function এটি হল যেখান থেকে C program এক্সিকিউশন শুরু হয় । ফাংশনটি যখন এক্সিকিউশন শেষ হবে তখন সে একটি ইন্টিজার রিটার্ন করবে। অর্থাৎ, ফাংশনের শেষে আমাদের কোনো একটা ইন্টিজার রিটার্ন করতে হবে। প্রচলিত নিয়মে 0 রিটার্ন করা হয়, প্রোগ্রামটি ঠিকভাবে কোনো সমস্যা ছাড়াই চলেছে সেটা বোঝানোর জন্য। তবে 0 ই যে রিটার্ন করতে হবে এমন কোনো কথা নেই। চাইলে যেকোন ইন্টিজার-ই রিটার্ন করা যায়।

{
                                 { এটি main function এর শুরু বুঝায় ।

/*_some_comments_*/

                                  যাই /*   */ এর মধ্যে  দেয়া হবে যেকোনো C program এ , এটি কম্পাইল এবং এক্সিকিউশন এর জন্য বিবেচ্য হবে না ।

printf(“Hello_World! “);      

                                 printf (); command আউটপুট স্ক্রিনে প্রদর্শন করে ।

getch();

                                 getch(); এই command অপেক্ষা করে কিবোর্ড থেকে ইনপুট নেয়ার জন্য

return 0; 

                                 return 0; এই command টি C program (main function) বন্ধ করে এবং returns ০ ।

}



সি ল্যাঙ্গুয়েজ

ISO/IEC 9899:1989 (C90) আদর্শ নীতিমালা অনুযায়ী নিচে উল্লেখিত তিনটি উপায়ে main() ফাংশন ডিক্লেয়ার করা যাবে।
int main(void)
int main(int argc, char **argv)
int main(int argc, char *argv[])
যেখানে দ্বিতীয় ও তৃতীয় লাইন টি সমতূল্য। কমান্ড লাইন থেকে ইনপুট নেওয়ার ক্ষেত্রে দ্বিতীয় অথবা তৃতীয়টি ব্যবহার করা হয়।
রিটার্নের ব্যপারে আদর্শ নীতিমালা হচ্ছে একটি প্রোগ্রাম তিন ধরনের মান রিটার্ন করতে পারবে,
0
EXIT_SUCCESS
EXIT_FAILURE
যেখানে দ্বিতীয় ও তৃতীয় মানটি stdlib.h ফাইলে #define করা আছে।
ISO/IEC 9899:1999 (C99) আদর্শ নীতিমালায় আরো যে শর্ত আরোপ করা হয়েছে তা হলো,
  • main() ফাংশনের ডিক্লেয়ারেশনে int শব্দটা অবশ্যই উল্লেখ করতে হবে। অর্থাৎ, main() না লিখে অবশ্যই int main() লিখতে হবে।
  • return 0 কথাটি চাইলে বাদ দেওয়া যাবে। যদি এই লাইনটা না লেখা হয় ডিফল্ট হিসেবে main() ফাংশন এক্সিকিউশনের শেষে 0 রিটার্ন করা হবে।
আমরা যদি চাই যে কিছুই রিটার্ন করবো না, সেক্ষেত্রে আমরা int main() এর পরিবর্তে void main() ব্যবহার করতে পারি। তবে int main() ব্যবহার করাটাই বেশি সমর্থিত ও উৎসাহিত।

সি++ ল্যাঙ্গুয়েজ

সি++ ল্যাঙ্গুয়েজেও C99 এর মতো তিনভাবে main() ফাংশন ডিক্লেয়ার করা যায়।
int main(void)
int main(int argc, char **argv)
int main(int argc, char *argv[])
সি++ এর আদর্শ নিয়মে void main() ব্যবহার করা একেবারেই নিষিদ্ধ, অর্থাৎ main() ফাংশনকে অবশ্যই ইন্টিজার রিটার্ন করতে হবে, তা না হলে কোড কম্পাইল হবে না।

এখন প্রশ্ন হচ্ছে main() ফাংশনের কিছু রিটার্ন করার প্রয়োজন কি?

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

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

C Programming Level beginner 04

প্রোগ্রামিং এর হাতেখড়ি (পর্ব-৪)


ভেরিয়েবলের জন্য নির্ধারিত ডাটা নিয়ে কাজ:

ভেরিয়েবল কিভাবে ডিক্লেয়ার করা যায় আগের পর্বে আমরা জানলাম। কিন্তু একটি প্রোগ্রামের ভেতর ভেরিয়েবলে ডাটা রেখে লাভ কি? আর ডাটা কিভাবে ব্যবহার করব?
প্রশ্নের উত্তর জানার আগে চলো একটা প্রোগ্রাম রান করে ফেলি। 😀
আচ্ছা, কি প্রোগ্রাম রান করা যায়? চলো একটি প্রোগ্রাম বানাই যাতে তুমি ইচ্ছে মত যে কোন সংখ্যা যোগ করতে পারবে।
একদম শুরুর পর্বে কিন্তু বলেছিলাম ল্যাংগুয়েজ শিখার চেয়ে গুরুত্বপূর্ণ হচ্ছে লজিক ডেভেলপ করা।
তাহলে আমরা আমাদের একটা সমস্যা পেলাম।
সমস্যা হলোঃ  দুইটি সংখ্যার যোগফল বের করতে হবে।
সমস্যা সমাধানের প্রসেস এরকম হতে পারেঃ
১। প্রথমে তিনটি চলক Variable নিতে হবে। দুইটি ইনপুটের জন্য যেহেতু আমরা দুইটা সংখ্যা যোগ করব। আর আরেকটি চলক লাগবে আউটপুটের জন্য।
২। ইউজার থেকে দুটি ইনপুট দেয়া।
৩। যোগ করা।
৪। আউটপুট।
চলো এখন সি প্রোগ্রামিং ল্যাংগুয়েজের মাধ্যমে প্রসেসগুলো সম্পন্ন করে ফেলি।
#include<stdio.h>
int main()
{
    int a, b, c;
    printf(“\n Enter first value:”);
    scanf(“%d”, &a);
    printf(“\n Enter second value:”);
    scanf(“%d”, &b);
    c=a+b; 
    printf(“\n %d+%d is %d”, a,b,c);
}
এখন আমরা এই প্রোগ্রাম বিশ্লেষণ করব।
int a, b, c;
এই লাইনের মাধ্যমে প্রোগ্রামে int টাইপের তিনটি ভেরিয়েবল ডিক্লেয়ার করা হয়েছে যার নাম a, b এবং c
এই টাইপের ভেরিয়েবলে অবশ্যই তোমাকে ইন্টিজার নাম্বার মানে পূর্ণ সংখ্যা রাখতে হবে।
printf(“\n Enter first value:”);
এই লাইনের মাধ্যমে Enter first value: লেখাটা স্ক্রিণে দেখানো হচ্ছে।
scanf(“%d”, &a);
এই লাইনের মাধ্যমে ইউজার থেকে একটা পূর্ণ সংখ্যা ইনপুট চাওয়া হচ্ছে যা ইউজার কি-বোর্ডের বাটনের মাধ্যমে প্রেস করবে। যে সংখ্যা ইউজার টাইপ করবে তা a ভেরিয়েবলে থাকবে।
&a এর অর্থ হল address of a. অর্থাৎ, এই স্টেটমেন্টের মাধ্যমে কম্পাইলারকে জানানো হয় যে প্রাপ্ত সংখ্যা a এর জন্য নির্ধারিত এড্রেসে রাখতে হবে।
 printf(“\n Enter second value:”);
এই লাইনের মাধ্যমে Enter second value: লেখাটা স্ক্রীণে দেখানো হচ্ছে।
scanf(“%d”, &b);
এই লাইনের মাধ্যমে ইউজার থেকে আরেকটা পূর্ণ সংখ্যা ইনপুট চাওয়া হচ্ছে যা ইউজার কি-বোর্ডের বাটনের মাধ্যমে প্রেস করবে। যে সংখ্যা ইউজার টাইপ করবে তা b ভেরিয়েবলে থাকবে।
c=a+b;
এই লাইনের মাধ্যমে a আর b এড্রেসে রাখা ডাটা যোগ করা হবে। যোগ করে প্রাপ্ত যোগফল c ভেরিয়েবলের জন্য নির্ধারিত হচ্ছে।
printf(“\n %d+%d is %d”, a,b,c);
এই লাইনের মাধ্যমে a,b,c তে রাখা ডাটাগুলো আউটপুটে দেখানো হচ্ছে।

scanf() ফাংশানের ব্যবহার:

দুটি সংখ্যা যোগ কিন্তু  scanf() ফাংশান দিয়ে ইনপুট না নিয়েও করা যায়।
নিচের প্রোগ্রামটি রান করে দেখি।
#include<stdio.h>
int main()
{
   int a, b, c;
   a=3;
   b=2;
   c=a+b;
   printf(“\n %d+%d is %d”, a,b,c);
}
এই প্রোগ্রামটি লিখেও কিন্তু আমরা দুটি সংখ্যা যোগ করতে পারছি। কিন্তু সমস্যা হল এখানে শুধু মাত্র নির্দিষ্ট দুটি সংখ্যা যোগ করতে পারব।
পরবর্তীতে কোন সংখ্যা যোগ করতে হলে আমাদের সোর্স প্রোগ্রাম আবার পরিবর্তন করে নিতে হবে যা মোটামুটি কষ্টসাধ্য একটা কাজ।
তাই প্রোগ্রামের কর্মদক্ষতা বাড়ানোর জন্য ইউজার থেকে ইনপুট নিলে আমরা নির্দিষ্ট দুটি সংখ্যা যোগ না করে বরং যে কোন দুটি সংখ্যা যোগ করে ফেলতে পারি।

আবার একই নামে একাধিক ভেরিয়েবল ঘোষণা করতে পারবে না
এবার তুমি যে কোন তিনটি সংখ্যা যোগ করতে চাইলে কি করবে? চারটি ভেরিয়েবল নিবে নাকি তিনটি? নিজে ভেবে বের কর। 😛
আর যে কোন দুটি সংখ্যার গুণ বা বিয়োগ কি করতে পারবে? আশা করি পেরে যাবে।

কি-ওয়ার্ড:

কি-ওয়ার্ড হলো প্রোগ্রামে ব্যবহৃত কিছু বিশেষ শব্দ। প্রত্যেকটি কি-ওয়ার্ডের কিছু নির্দিষ্ট অর্থ আছে এবং প্রোগ্রামে একটি নির্দিষ্ট কাজ সম্পন্ন করে।
যেমনঃ auto, for, double, break, int, void, float ইত্যাদি কি-ওয়ার্ড। প্রোগ্রামিং করতে করতেই কি-ওয়ার্ড সম্পর্কে তোমাদের আইডিয়া চলে আসবে। তবে একটা জিনিস অবশ্যই মনে রাখতে হবে যে, কি-ওয়ার্ডের নাম একটি শব্দে লিখতে হবে। অর্থাৎ, এর মাঝে কোন গ্যাপ থাকতে পারবে না। তবে কোন প্রোগ্রামে যদি দুটি কি-ওয়ার্ড ব্যবহার করা হয় তাহলে মাঝখানে গ্যাপ থাকবে।

কিছু সাধারণ ভুল:

সি তে প্রোগ্রাম লিখার সময় কিছু সাধারণ ভুল হতেই পারে। যেমন যখন কোন ইন্সট্রাকশন দেওয়া হচ্ছে তখন সেমিকোলন না দিলে প্রোগ্রাম এরর দিবে।
আবার এক টাইপের ভেরিয়েবলের জন্য অন্য টাইপের মান দিলেও প্রোগ্রামে ভুল ফল আসবে। কিন্তু এক্ষেত্রে কম্পাইলার কোন ভুল ধরবে না, অথচ তোমার ফল উলটাপালটা আসবে। আবার একই নামে একাধিক ভেরিয়েবল ঘোষণা করতে পারবে না।
int Value1=Value1=9;
এরকম লিখলেও কম্পাইলার এরর ম্যাসেজ দিবে।
পরের পর্বগুলোতে আমরা অপারেটর, স্টেটমেন্ট বা লুপ সম্পর্কে বেসিক তথ্যগুলো জানব।
Happy Programming… 

প্রশ্ন : ভেরিয়েবল বা চলক কী? ভেরিয়েবল ডিক্লারেশনের নিয়মগুলো কি কি?

--প্রোগ্রামে কোন একটি নাম দিয়ে যদি তার অধীনে ডেটা রাখা যায় তবে তাকেই ভেরিয়েবল বলা হয়।
ভেরিয়েবল ডিক্লারেশনের নিয়ম :--
১) ভেরিয়েবল ডিক্লারেশনের সময় নামের মধ্যে বর্ন(A-Z, a-z), সংখ্যা(০-৯), ডলার সাইন($), আন্ডারস্কোর (_) ইত্যাদি ব্যবহার করা যায়।
যেমন : roll_number (valid)
#karim (invalid)
5$ dollar (invalid)
2) ভেরিয়েবলের নাম ডিজিট বা অংক দিয়ে শুরু হতে পারবে না।
যেমন :- 1number (inavalid)
number1 (valid)
_number1 (valid)
3) কোন কীওয়ার্ড বা ফাংশন ভেরিয়েবল এর নাম হিসেবে ব্যবহার করা যাবে না।
যেমন : float, int, main ইত্যাদি নামে কোন ভেরিয়েবল ইউজ করা যাবে না। কিন্তু Float, MAIN ইত্যাদি নামে ভেরিয়েবল ব্যবহার করা যাবে। কারন, ফাংশন বা কীওয়ার্ড এ বড় হাতের অক্ষর ব্যবহার করা যায় না।
৪) ভেরিয়েবলের নামের মধ্যে কখনোই ফাকা স্থান রাখা যাবে না।
যেমন :-int my first name; এটা লেখা যাবে না।
লিখতে হবে int my_first_name;
৫) ভেরিয়েবলের নামকরনে সর্বাধিক ৩১ টি বর্ন ব্যবহার করা যায় , তবে ৮ টি বর্ন ব্যবহার করাই শ্রেয়।

C Programming Level beginner 03

প্রোগ্রামিং এর হাতেখড়ি (পর্ব-৩)


কমেন্টস লিখা

টাইটেল দেখে অনেকে ভাবতে পার কমেন্টস তো ফেসবুকে লিখি। সি প্রোগ্রামিং এ আবার এটা কি জিনিস?
ঘটনা হল অনেক সময় বড় বড় প্রোগ্রামে লিখে রাখতে হয় তুমি কি করছ। যাতে পরে তুমি মনে রাখতে পার আসলে কি ঘটনা ঘটেছে। এটা প্রোগ্রামের কোন অংশ না। শুধুমাত্র তোমার মনে রাখার জন্য অথবা পরে সহজে বুঝবার জন্য। কিন্তু এটা তো একটা কম্পাইলার! এখানে আলাদা করে লিখার কি কোন যায়গা আছে?
আসলে আলাদা করে লিখার দরকার নেই। 😛 যেমন  /* দেওয়ার পর তুমি যাই লিখ না কেন ওটা আর কম্পাইল হবে না */ দেওয়ার আগ পর্যন্ত। এটাকেই প্রোগ্রামিং এর ভাষায় কমেন্টস বলে।
#include<stdio.h>
main()
{
/*we will print now */
printf(“I am a C programmer”);
}
লাইন কম্পাইল করে দেখলে দেখবে we will print now লাইনটি আউটপুটে আসবে না।

কনভার্সন ক্যারেক্টার

কনভার্সন ক্যারেক্টার বুঝতে হলে স্ট্রিং বুঝতে হবে। এক কথায় বলতে স্ট্রিং হল ক্যারেক্টার বা শব্দের সমস্টি।
কনভার্সন ক্যারেক্টার হল এমন একটা প্লেসঅর্ডার যাতে আমরা কোন স্ট্রিং রাখব সেটা বোঝা যায়। কনভার্সন ক্যারেক্টার ব্যবহার করে একটা প্রোগ্রাম আমরা এখন দেখব।
main()
{
printf(“%s is a good boy \n”);
}
এই লাইন থেকে যেটা বোঝা যায় সেটা হল কোন শব্দ বা কোন টেক্সট একজন ভাল ছেলে। এখন আমরা যদি নতুন একটা স্ট্রিং নিয়ে আসি এরকম,
main()
{
printf(“%s is a good boy\n”, “Rahim”);
}
এখন আউটপুটটা এরকম আসবে Rahim is a good boy.
অর্থাৎ দেখা যাচ্ছে %s এ রিপ্লেস হচ্ছে Rahim। এখন আরেকটা %s থাকলে কি হবে এই লাইনে?
main()
{
printf(“%s is a good boy %s \n”, “Rahim”, “I have ever seen”);
}
দ্বিতীয় %s এর যায়গায় আউটপুটে বসে যাবে I have ever seen
বলে রাখা ভাল এই %s টা শুধুমাত্র স্ট্রিং এর জন্য। টেক্সট, ওয়ার্ড ইত্যাদির জন্য। কিন্তু এমনও তো হতে পারে আমরা নাম্বার ব্যবহার করছি?
main()
{
Printf(“Bangladesh won by %d runs”, “67”);
}
আউটপুটটা এরকম আসবে তখন, Bangladesh won by 67 runs
%d এটা শুধু মাত্র ইন্টিজার নাম্বারের জন্যই প্রযোজ্যো। এখানে দশমিক আনলে কিন্তু রেসাল্ট ভুল দেখাবে।
যদি আমরা দশমিক নাম্বার রাখতে চাই তাহলে  %f লিখতে হবে।
main()
{
Printf(“Bangladesh won by %f runs”, “67.5”);
}

ভেরিয়েবলঃ

ভেরিয়েবল বলতে বোঝায় মেমরির লোকেশনের নাম বা ঠিকানা, যা দিয়ে কম্পিউটারের মেমরিতে কোন ডেটা রাখা হয়। প্রোগ্রামে ডাটা নিয়ে কাজ করার সময় প্রতিটি ডাটার জন্য একটি ভেরিয়েবল ব্যবহার করতে হয়। এগুলোর অবস্থান পরিবর্তন হতে পারে বলেই এদের ভেরিয়েবল বা চলক বলা হয়। এ ডেটা হতে পারে নিউম্যারিক (যে কোন সংখ্যা) অথবা একটি character (a,b,c..Z)। এ ভ্যারিয়েবল এর মধ্যে কি ধরনের ডেটা রাখব আমরা তাই হচ্ছে ডেটা টাইপ।
অর্থাৎ, কোন ভেরিয়েবলে যে কোন সময় কেবলমাত্র একটি ডাটা রাখা সম্ভব। মোটামোটি পাঁচ ধরণের ভেরিয়েবল ব্যবহৃত হয় সি ল্যাংগুয়েজে।
  1. Numeric variable
  2. Array variable
  3. Pointer variable
  4. String variable
  5. Custom Variable.

Variable Declare:

প্রোগ্রামে কোন ডাটা নিয়ে কাজ করার জন্য প্রথমে ডাটা টাইপ সহযোগে ভেরিয়েবল Declare করতে হয় সি প্রোগ্রামের ক্ষেত্রে main() বা অন্যান্য ফাংশানের শুরুতেই সব ভেরিয়েবল; ডাটা টাইপ সহ ডিক্লেয়ার করতে হয়।
তবে মনে রাখতে হবে একই ফাংশানে দুই বা ততোধিক ভেরিয়েবল ডিক্লেয়ার করা যায় না।
ভেরিয়েবল ডিক্লেয়ারের উদাহরণঃ
main()
{
int age;
float marks;
}
এখন age এর জন্য একটি পূর্ণ সংখ্যা এবং marks এর জন্য একটি দশমিক ভগ্নাংশ ব্যবহার করা যাবে।
age=25;
marks=23.8;
নিচের প্রোগ্রামটি দেখি;
#include<stdio.h>
int main()
{
int age;
age=27;
printf(“I am %d years old”, age);
}
আউটপুট কি আসে? ভুল আসলে এরর বের কর। 😉

ডাটা টাইপঃ

ভেরিয়েবল ঘোষণার জন্য ডাটার মান অনুযায়ী ডাটা টাইপ প্রয়োজন হয়। ডাটা টাইপ চার প্রকার মূলত।
  1. char
  2. int
  3. float
  4. double
Char:
সি প্রোগ্রামিং এ ক্যারেক্টার টাইপ বা বর্ণমালা নিয়ে কাজ করার জন্য char টাইপ Variable declare জন্য char ডাটা টাইপ ব্যবহার করা হয়। char টাইপের Variable declare করার জন্য char কীওয়ার্ড ব্যবহার করা হয়।
যেমনঃ char ch;
int:
পূর্ণ সংখ্যা নিয়ে কাজ করার জন্য int টাইপের Variable declare করার জন্য int ডাটা টাইপ ব্যবহার করা হয়। int টাইপের Variable declare করার জন্য int কীওয়ার্ড ব্যবহার করা হয়।
যেমনঃ int x;
float:
দশমিক সংখ্যা নিয়ে কাজ করার জন্য float টাইপের Variable declare করার জন্য float ডাটা টাইপ ব্যবহার করা হয়। float টাইপের Variable declare করার জন্য float কীওয়ার্ড ব্যবহার করা হয়।
যেমনঃ float y;
double:
দশমিক চিহ্নযুক্ত বৃহৎ মানের সংখ্যা নিয়ে কাজ করার জন্য double টাইপের Variable declare করার জন্য double ডাটা টাইপ ব্যবহার করা হয়। double টাইপের Variable declare করার জন্য double কীওয়ার্ড ব্যবহার করা হয়।
যেমনঃ double z;

ডাটা টাইপ ডিক্লেয়ারঃ

ডাটা টাইপ ডিক্লেয়ার করা বলতে নির্দিষ্ট ডাটা টাইপের ভেরিয়েবল ডিক্লেয়ার করাকেই বোঝায়। কোন ডাটা টাইপের ভেরিয়েবল ডিক্লেয়ারের ফরম্যাটঃ
DataTypeName     VariableName;
Example: Char ch;  int x;

ডেটা টাইপ

সি প্রোগ্রামিং এ অনেক প্রকারের ডাটা টাইপ আছে। তার মধ্য প্রধান চারটি হচ্ছেঃ
  • int data type
  • char data type
  • float data type
  • double data type

 আরেকটা ডেটা টাইপ হচ্ছে void, যাকে ভ্যালুলেস ডেটা টাইপ বলে।

int data type

int data type বলতে integer quantity (অবিভাজ্য সংখা যেমনঃ ১, ২, ৩ ইত্যাদি) বুঝায়। এর সাইজ ২ বাইট বা ১৬ বিট (১বাইট=৮বিট) এবং রেঞ্জঃ -৩২৭৬৮ থেকে +৩২৭৬৭ পর্যন্ত।  কিছু কিছু কম্পাইলারে int ডেটার জন্য ৪ বাইট মেমরি দেয়। অর্থাৎ একটা int ডেটা টাইপের জন্য সর্বোচ্চ ৪ বাইট ডেটা রাখা যাবে। যার রেঞ্জ হচ্ছে  -2,147,483,648 থেকে 2,147,483,647।  এ রেঞ্জ এর মানে হচ্ছে এর থেকে বড় মানের সংখ্যা যদি আমরা কোন ইন্টিজার ডেটা টাইপ ভ্যারিয়েবলে সেট করি তাহলে কম্পাইলার সঠিক মান দিবে না। সাইজ এবং রেঞ্জ কম্পাইলার অনুযায়ী ভিন্ন হতে পারে।

int data type এর উদাহরন হিসেবে আমরা একটা প্রোগ্রাম দেখতে পারি। একটি আয়াতাকার  জমির দৈর্ঘ্য এবং প্রস্থ জানলে আমরা তার ক্ষেত্রফল বের করতে পারি। তাই না? মনে করে নিচ্ছি দৈর্ঘ্য ৫ একক এবং প্রস্থ ৮ একক। আমরা এর ক্ষেত্রফল হবে ৫*৮ = ৪০ একক। প্রোগ্রামে আমরা কিভাবে তা বের করতে পারি? নিচের প্রোগ্রামটি দেখি।
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
 int volume;
 int length = 5;
 int width = 8;
 volume = length * width;
 printf("%d", volume);
 return 0;
}
প্রোগ্রামটি রান করলে আমরা আউটপুট দেখতে পাবো 40
এটা আমাদের প্রথম প্রোগ্রাম থেকে দেখতে অনেক জটিল। এবং কিছুটা বড়। তবে অবশ্যই অনেক সহজ। কিছুক্ষণ আগে আমরা ভ্যারিয়বল সম্পর্কে জেনেছি।  এটি কম্পিউটার মেমরিতে কোন কিছু স্টোর বা সেভ করে রাখতে ব্যবহৃত হয়।
কিছুক্ষন আগে int নামে আমরা একটা ডেটা টাইপ সম্পর্কে জেনেছি। যা দিয়ে কম্পিউটারে Integer/ পূর্ণসংখ্যা কম্পিউটারে সংরক্ষন করা যায়। উপরের প্রোগ্রামে আমরা তিনটে ইন্টিজার ভ্যারিয়েবল ব্যবহার করেছি। প্রথম ভ্যারিয়েবল length বা দৈর্ঘ্য এর জন্য,  দ্বিতীয়টা width বা প্রস্থের জন্য। তৃতীয়টা নিয়েছি দৈর্ঘ্য এবং প্রস্থ থেকে আয়তন বের করে রাখার জন্য volume নামে।

আর এর সব টুকু লিখছি একটা লাইনের মধ্যে, যেমন int volume;  যাকে বলা হয় ভ্যারিয়েবল ডিক্লারেশন। অর্থাৎ একটা ভ্যারিয়েবল ব্যবহার করার আগে একে ডিক্লেয়ার করতে হয়। ডিক্লেয়ারেশন শেষ আমরা একটা সেমিকোলন দিয়েছি। একটি ভেরিয়েবল ডিক্লেয়ারেশন শেষে তা শেষ করার জন্য একটা সেমিকোলন ব্যবহার করতে হয়।  অর্থাৎ একটি ভ্যারিয়েবল ডিক্লেয়ার করতে হয় নিচের মত করেঃ
data_type variable_name;
কম্পিউটারকে তো আমাদের জানাতে হবে যে আমাদের জমির দৈর্ঘ্য এবং প্রস্থ কত, তাই না?  এর জন্য আমরা আরো দুটি ভ্যারিয়েবল নিয়েছি  length এবং width নামে। এ দুটি আবার int volume; থেকে একটু ভিন্ন। আমরা এ দুটি ভ্যারিয়েবল ডিক্লেয়ার করার সাথে সাথে একটি মান সেট করে দিয়েছি। যাকে বলে ভ্যালু এসাইন করা। মান সহ ভ্যারিয়েবল ডিক্লেয়ার করার নিয়ম হচ্ছেঃ
data_type variable_name = value;
এর পর বর্তীতে আমরা লিখছি volume = length * width; এর মানে হচ্ছে length ভ্যারিয়েবল এর মান এবং width ভ্যারিয়েবল এর মান গুন করে volume এ রাখা।
এর পরবর্তী লাইন এর সাথে আমরা কিছুটা পরিচিত। printf(“%d”, volume); যা হচ্ছে printf() ফাংশন।
printf ফাংশন
printf() ফাংশন এর কাজ হচ্ছে কোন কিছু প্রিন্ট করা। একটা লেখা প্রিন্ট করার জন্য printf() এর ভেতর ডাবল কোটেশন এর মধ্যে কিছু লিখলেই তা প্রিন্ট করে দেয়, তা আমরা এর আগেই জেনে এসেছি।
কিন্তু এবার আমরা একটা ইন্টিজার ভ্যালু প্রিন্ট করব এবং একট ভ্যারিয়েবল এর থেকে। এর জন্য কিছু নিয়ম আমাদের ফলো করতে হবে। একটি ইন্টিজার প্রিন্ট করার জন্য printf() এর ভেতর ডাবল কোটেশন দিয়ে লিখতে হয় %d, এটিকে বলে placeholder। প্রত্যেকটি ডেটা টাইপের জন্য আলাধা আলাধা placeholders  রয়েছে। %d মানে হচ্ছে display integer। ডাবল কোটেশনের পর আমরা একটি কমা দিয়েছি। এর পর লিখছি আমাদের ইন্টিজার ভ্যারিয়েবলটি। যা আমাদের জমির ক্ষেত্রফল প্রিন্ট করে দিয়েছে।
ভালো হতো যদি প্রোগ্রামটা রান হওয়ার পর দৈর্ঘ্য এবং প্রস্থ নেওয়া যেত। তাহলে আমরা যে কোন জমির ক্ষেত্রফল বের করতে পারতাম। আমরা এমন কিছুই শিখব পরবর্তী অধ্যায় গুলতে।  এ অধ্যায় আমরা আরো কিছু মৌলিক ধারণা সম্পর্কে জানব।

প্লেসহোল্ডার / Placeholder

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

ডেটা টাইপ প্লেসহোল্ডার
 int %d
 char %c
 float %f
 double %lf

character data type

har data type বলতে single character ( একটি বর্ন যেমন a, b, z, A, N ইত্যাদি) বুঝায়। এর সাইজ ১ বাইট বা ৮ বিট। বিট (১বাইট=৮বিট) এবং রেঞ্জঃ -১২৮ থেকে +১২৭ পর্যন্ত। আমাদের কীবোর্ডের প্রত্যেকটি চিহ্নই এক একটা  character। ক্যারেকটার ভ্যারিয়েবল ডিক্লেয়ার করার নিয়ম হচ্ছেঃ
char variable_name;
character ভ্যারিয়েবলে মাত্র একটি কারেকটার / লেটার / বর্ণ সংরক্ষন করা যায়। নিচের প্রোগ্রাম দেখিঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
char ch = 'A';
printf("%c", ch);
return 0;
}
এখানে ch নামে একটা কারেকটার ভ্যারিয়েবল নিয়েছি। এরপর তা প্রিন্ট করেছি। ভ্যারিয়েবলের মধ্যে কোন কারেকটার এসাইন করার জন্য তা সিঙ্গেল কোটেশনের মধ্যে রাখতে হয়। এভাবে ‘A’।
ক্যারেক্টার ডেটা প্রিন্ট করার জন্য আমাদে %c প্লেসহোল্ডার ব্যবহার করতে হয়।
float data type;
integer ডেটা টাইপ শুধু মাত্র পূর্ণ সংখ্যা গুলো সংরক্ষন করা যায়। একটা integer ভ্যারিয়েবলে একটি দশমিক মান যেমনঃ ৮.৯ বা ইচ্ছে মত কিছু এসাইন করুন। এর পর ঐ ভ্যারিয়েবলটি প্রিন্ট করে দেখুন। কি দেখলেন? দশমিকের পরের অংশ নেই তাই না? নিচের প্রোগ্রামটা  আপনি  রান করিয়ে দেখতে পারেনঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
 int n = 8.9;
 printf("%f", n);
 return 0;
}
এটা শুধু আমাদের 8 দেখাবে। যদিও আমরা ভ্যারিয়েবলটির মধ্যে রেখেছি 8.9 । এর কারণ হচ্ছে int শুধু মাত্র পূর্ণ সংখ্যা গুলোকে কম্পিউটার মেমরিতে সংরক্ষিত করতে পারে। দশমিক মান কম্পিউটারে রাখার জন্য আমাদের দরকার আরেকটি ডেটা টাইপ, যার নাম float ।
float data type বলতে floating point number (দশমিক সংখা যেমনঃ ১০.৫, ১.৮, ৫.৬ ইত্যাদি) বুঝায়। floating point ডেটা টাইপ দশমিকের পর ৬ ঘর পর্যন্ত নির্ভুল ভাবে কোন নাম্বার সংরক্ষণ করতে পারে। উপরের প্রোগ্রামটার ভ্যারিয়েবল n এর Data Type পরিবর্তন করে float দিয়ে রান করিয়ে দেখোঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
 float n = 8.9;
 printf("%f", n);
 return 0;
}
এটি এবার সঠিক মান দিবে। প্রিন্ট করার সময় আমাদের ফ্লোটিং পয়েন্ট ডেটা টাইপের প্লেসহোল্ডার %f ব্যবহার করতে হবে।
এবার আরেকটা উদাহরণ দেখি। আমরা জানি বৃত্তের ক্ষেত্রফলের জন্য দরকার এর ব্যাসার্ধের মান। কোন বৃত্তের ব্যাসার্ধ r হলে এর ক্ষেত্রফল  ধরে নিচ্ছি  বৃত্তের ব্যাসার্ধ 7.6 একক। আমরা এর ক্ষেত্রফল বের করার একটা প্রোগ্রাম লিখে ফেলিঃ
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
 float radius = 7.6;
 float area = (radius*radius * 3.1416);
 printf("%f", area);
 return 0;
}
আমরা radius নামে একটা floating point ভ্যারিয়েবল নিয়েছি। এর মধ্যে বৃত্তের ব্যাসার্ধ রেখেছি। area নামে আরেকটি ভ্যারিয়েবল নিয়েছি যার মধ্যে ক্ষেত্রফল বের করে রেখেছি।
আমরা যানি বৃত্তের ক্ষেত্রফল হচ্ছে ব্যাসার্ধ*ব্যাসার্ধ্য * পাই এর মান। তাই লিখছি এবং মানটি প্রিন্ট করেছি।
এর আগে integer এর উদাহরণে printf  ফাংশনে placeholder হিসেবে ব্যবহার করেছি %d, floating point এর জন্য placeholder হচ্ছে %f । বাকিটা তো সহজ তাই না?
আমরা জেনেছি যে floating point দশমিকের পর  ৬ ঘর পর্যন্ত নির্ভুল মান দিতে পারে। এর থেকে বেশি ঘর পর্যন্ত নির্ভুল মান পেতে হলে আমাদের আরেকটি ডেটা টাইপ ব্যবহার করতে হবে যার নাম হচ্ছে double ।

double data type

double data type বলতে Double precision floating point number বুঝায়।এটা float data type এর মতোই তবে সাইজ বিশাল। এর সাইজ ৮ বাইট বা ৬৪ বিট। এবং এটি দশমিকের পর ১৫ ঘর পর্যন্ত নির্ভুল মান সংরক্ষণ করতে পারে।
আমরা জানি বৃত্তের পরিধি ও ব্যাসের অনুপাতকে পাই/ Pi [Π]  দিয়ে প্রকাশ করা হয়। এটি একটি অমূলদ সংখ্যা। এটিকে দশমিক আকারে সম্পূর্ণ প্রকাশ করা সম্ভব নয়। দশমিকের পর অসীম সংখ্যা রয়েছে, এ জন্য। আমরা যদি float দিয়ে এর মান বের করার চেষ্টা করি, আমরা পাব দশমিকের পর ৬ ঘর পর্যন্ত। কিন্তু double দিয়ে যদি এর মান বের করি, তাহলে পাব দশমিকের পর ১৫ ঘর পর্যন্ত নির্ভুল মান। double এর মান প্রিন্ট বা আউটপুট পাবার জন্য প্লেসহোল্ডার হিসেবে আমাদের lf ব্যবহার করতে হয়।  নিচের প্রোগ্রামটি দেখিঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
double pi = 3.14159265358979323846;
printf("%lf", pi);
return 0;
}
এখন যদিও কম্পাইল করে রান করার পর দশমিকের পর ৬ ঘরই দেখাবে। কিন্তু আমরা বলছি ১৫ ঘর পর্যন্ত নির্ভুল মান দিবে। ঠিকই বলেছি। এখন কম্পাইলারকে বলে দিতে হবে কত দশমিকের পর কত ঘর প্রিন্ট করবে। নিচের প্রোগ্রামটি দেখিঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
double pi = 3.14159265358979323846;
printf("%.9lf", pi);
return 0;
}
এখানে আমরা প্লেসহোল্ডারে লিখেছি .9lf । প্লেসহোল্ডারে দশমিক দিয়ে কত ঘর পর্যন্ত প্রিন্ট করবে, তা বলে দিলে তত ঘর পর্যন্তই প্রিন্ট করবে। উপরের প্রোগ্রামটি এখন পাই এর মান দশমিকের পর ৯ ঘর পর্যন্ত প্রিন্ট করবে।
মাথায় দুষ্টু বুদ্ধি খেলা করে তাই না?  .9lf এর জায়গায় .50lf দিলে দশমিকের পর ৫০ ঘর প্রিন্ট করবে, তাই তো? হ্যা, ঠিকই  .50lf লিখলে ঠিকই দশমিকের পর ৫০ ঘর পর্যন্ত প্রিন্ট করবে। তবে তা আমরা যে রেজাল্ট চাচ্ছি তা পাবো না। ভুল কিছু পাবো। নিচের প্রোগ্রামটি দেখিঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
double pi = 3.14159265358979323846;
printf("%.20f", pi);
return 0;
}
এখানে আমরা পাই এর মান দশমিকের পর ২০ঘর পর্যন্ত দিয়েছি। এরপর আমরা চাচ্ছি ২০ ঘর পর্যন্তই মান পেতে। তাই প্লেসহোল্ডারে .20f দিয়ে বলে দিয়েছি যেন দশমিকের পর ২০ ঘর পর্যন্ত প্রিন্ট করে। কিন্তু দশমিকের পর ১৫ ঘর পর্যন্ত ঠিক মানই প্রিন্ট করেছে। এরপর কত গুলো শূন্য দিয়ে পূরণ করে দিয়েছে। কারণ dobule ডেটা টাইপ দশমিকের পর ১৫ ঘর পর্যন্ত মান ঠিক মত মনে রাখতে পারে।

মডিফাইড ডেটা টাইপ

উপরের এ চারটি ডেটা টাইপকে মডিফাই করে আরো অনেক গুলো ডেটা টাইপ তৈরি করা যায়। মডিফাই করার জন্য নিচের মডিফায়ার গুলো ব্যবহার করা হয়ঃ
  • signed
  • unsigned
  • long
  • short
যেমন int ডেটা টাইপের অন্যান্য ভার্শন হচ্ছেঃ
  • signed int
  • unsigned int
  • long int
  • short int
  • long long int etc

ডেটা টাইপ এবং তাদের রেঞ্জ

শুরুতে আমরা রেঞ্জ নিয়ে কিছু পড়েছি, হয়তো ঠিক মত বুঝতে পারি নি। কিন্তু এবার আমরা বিস্তারিত জানব। আমরা বলেছি int data type এর সাইজ হচ্ছে ২ বাইট। আমরা জানি এক বাইট সমান ৮ বিট। তাহলে দুই বাইট সমান ১৬ বিট। আর এই ১৬ বিটের মানে হচ্ছে কম্পিউটার (216 -1) =  (65536 -1) = 65535 পর্যন্ত নির্ভুল ভাবে সেভ করতে পারবে। মানে আমরা সুন্দর ভাবেই 0-65535 পর্যন্ত যে কোন নাম্বার একটি ইন্টিজারে সেভ করতে পারব। এখন যদি আমরা এর থেকে বড় কোন মান যেমন 65538 ইন্টিজার ডেটা টাইপে সেভ করি, কম্পাইলার ঠিক মত মান আমাদের আউটপুট দিতে পারবে না। উলটা প্লাটা একটা ভ্যালু দিবে।
আমরা বলেছি যে কিছু কিছু কম্পাইলার ইন্টিজারের জন্য ৪ বাইট মেমরি বরাদ্ধ করে। ৪ বাইট মানে হচ্ছে ৪*৮ বিট। = ৩২ বিট। আর ৩২ বিট মানে আমরা (232 -1) = (4294967296 -১) = 4294967295 পর্যন্ত নির্ভুল মান সেভ করতে পারব ইন্টিজার ডেটা টাইপ হিসেবে। এর থেকে বড় কোন মান যদি ইন্টিজার হিসেবে সেভ করতে চাই, তাহলে ঠিক মত আউটপুট পাবো না। যেটা পাবো সেটা দারুণ। দারুণ কেন বলছি। আগে 4294967295 এর থেকে বড় যে কোন একটা সংখ্যা ইন্টিজার ভ্যারিয়েবল হিসেবে প্রিন্ট করে দেখি। যেমন 6294967295
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
 int n = 6294967295;
 printf("%d", n);
 return 0;
}
কি আউটপুট পাচ্ছি? আমি পাচ্ছি 1999999999…  যেটা পাওয়ার কথা সেটা পাই নি। কারণ ইন্টিজার ডেটাটাইপে যতটুকু ক্ষমতা তার থেকে বড় মান আমরা সেভ করার চেষ্টা করেছি, তাই।
4294967295 এর পরবর্তি সংখ্যা 4294967296, এটা প্রিন্ট করে দেখিঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
 int n = 4294967296;
 printf("%d", n);
 return 0;
}
আউটপুট পাচ্ছি শূন্য। ০ ।
4294967297 প্রিন্ট করে দেখলে পাবো 1।
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
int n = 4294967297;
printf("%d", n);
return 0;
}
এভাবে যদি 4294967298 প্রিন্ট করি, তাহলে পাবো ২। মানে কি দাড়ালো? মানে 4294967295 এর পরের সংখ্যা গুলো প্রিন্ট করার চেষ্টা করলে আবার ০ থেকে প্রিন্ট করা শুরু করে। সুন্দর একটা কারণ আছে। কারণটা কি? চিন্তা করে বের করতে পার।
এতক্ষণ আমরা Unsigned ইন্টিজার সম্পর্কে আলোচনা করেছি। Unsigned মানে হচ্ছে সংখ্যাটা কি ধণাত্ত্বক নাকি ঋণাত্ত্বক, তা বলে দেই নি। কিন্তু মাঝে মাঝে আমাদের Singed Integer নিয়ে কাজ করতে হবে। মানে আমরা ভ্যারিয়েবল ডিক্লারেশনের সময় বলে দিব সংখ্যাটা কি ধনাত্ত্বক নাকি ঋণাত্ত্বক, তখন আবার রেঞ্জ ছোট হয়ে যাবে। তখন একটি ইন্টিজারের রেঞ্জ হয়ে যাবে -2,147,483,648 থেকে +2,147,483,647 পর্যন্ত। মানে আমরা  -2,147,483,648 পর্যন্ত এবং 2,147,483,647 পর্যন্ত ইন্টিজার মান একটা ইন্টিজার ভ্যারিয়েবলে সেভ করতে পারব।
ধণাত্ত্বক হলে কম্পাইলার আউটপুটে + চিহ্ন প্রিন্ট করবে না। কিন্তু ঋণাত্ত্বক হলে তা দেখাবেঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
int n = -899;
printf("%d", n);
return 0;
}
উপরে একটি ধণাত্ত্বক সংখ্যা আমরা বলতে পারি  Singed Integer ভ্যারিয়েবল তৈরি করা হয়েছে। এবং পরে তা প্রিন্ট করা হয়েছে।
নিচে ভিন্ন ভিন্ন ডেটা টাইপ এবং তাদের সাইজ দেওয়া হলোঃ
 ডেটা টাইপ সাইজ
 int 2 bytes
 char 1 byte
 float 4 bytes
 double 8 bytes
বিদ্রঃ এটি কম্পাইলার ভেদে ভিন্ন হতে পারে।
মডিফাইড ডেটা টাইপ এবং তাদের সাইজ এবং রেঞ্জ।
টাইপবিট সাইজ রেঞ্জ
char8-127 থেকে 127
unsigned chart80 থেকে 255
Signed char8-27 থেকে 127
int16 or 32-32,767 থেকে 32,767
Unsigned int16 or 320 থেকে 65,535
Signed int16 or 32-32,767 থেকে 32,767
Short int16-32,767 থেকে 32,767
Unsigned short int160 থেকে 65,535
Signed short int16-32,767 থেকে 32,767
Long int32-2,147,483,647 থেকে 2,147,483,647
Long long int64-(263 – 1) থেকে (263 – 1)
Signed long int32-2,147,483,647 থেকে 2,147,483,647
Unsigned long int320 থেকে 4,294,967,295
Unsigned long long int640 থেকে (264 – 1)
float321.2E-38 to 3.4E+38
double642.3E-308 to 1.7E+308
Long double803.4E-4932 to 1.1E+4932


Constant বা ধ্রুবক

সি প্রোগ্রামিং এ চার ধরনের কনস্ট্যান্ট বা ধ্রুবক রয়েছে। integer constant, floating-point constant, character constant & string constant.
আমরা ইতিমধ্যে এসব ব্যবহার করেছি। ইন্টিজার কনস্ট্যান্ট হচ্ছে যে কোন ইন্টিজার নাম্বার। যেমন 12, 5, 102 ইত্যাদি যে কোন সংখ্যা।
গণিতে যেমন আমরা একটা বড় সংখ্যাকে পড়ার সুবিধার্থে এর মধ্যে কমা ব্যবহার করি, সি প্রোগ্রামিং এ আমরা তা করতে পারব না। যেমন আমরা দশ হাজারকে এভাবে লিখতে পারব নাঃ 10,000 ।
যে কোন দশমিক সংখ্যাই হচ্ছে ফ্লোটিং পয়েন্ট কনস্ট্যান্ট। যেমন 5.2, 9.666, 0.145 ইত্যাদি।
ক্যারেক্টার কনস্ট্যান্ট হচ্ছে একটি সিঙ্গেল ক্যারেকটার। যেমনঃ ‘A’, ‘X’, ‘g’ ইত্যাদি।
ক্যারেক্টার কন্সট্যান্ট লিখি আমরা সিঙ্গেল কোটেশনের মধ্যে। আর মাত্র একটি ক্যারেক্টার থাকে। ডাবল কোটেশনের মধ্যে এক বা একের অধিক ক্যারেকটার লিখলে তাকে আমরা সি প্রোগ্রামিং এ বলি স্ট্রিং কন্সট্যান্ট। যেমনঃ “Hello”, “Bangladesh is a land of stories”, “5.5698” ইত্যাদি। ডাবল কোটেশনে কোন নাম্বার রাখলে তা আর নাম্বার থাকে না, তা স্ট্রিং হয়ে যায়।

Escape Sequence

আমরা একটা প্যারাগ্রাফ প্রিন্ট করতে চাচ্ছি। প্যারাগ্রাফ গুলোতে কয়েকটা বাক্যের মাঝে মাঝে নতুন লাইন থাকে। এর আগে আমরা printf এর ভেতর একটা লেখা দিয়েছি, তা প্রিন্ট করে দিয়েছে। যেমন আপনি আপনার নাম, বাবার নাম প্রিন্ট করতে চাইলে  কি করবেন? কেমন বিশ্রি দেখাবে না যদি দুইটাই একই লাইনে থাকে? একটা প্রোগ্রাম লিখে ফেলুন যেখানে আপনার নাম আর আপনার বাবার নাম প্রিন্ট করবে। যদি দুই জনের নামের মধ্যে একটা নতুন লাইন দিতে পারতেন, দারুণ হত না?
সি প্রোগ্রামিং এ নতুন লাইন বা Life Feed দেওয়ার জন্য আমাদের \n ব্যবহার করতে হয়। ব্যাকস্ল্যাশ এবং n এক সাথে। এখানে n এর আগে একটা ব্যাকস্ল্যাশ ব্যবহার করার কারণে n এর কাজ পরিবর্তণ হয়েছে। এমন অনেক গুলো কারেক্টার সিকোয়েন্স রয়েছে। এদের বলা হয় Escape Sequence।  নিচে একটি প্রোগ্রাম লেখা হলো নিউ লাইন সহঃ
1
2
3
4
5
6
7
8
#include <stdio.h>
main()
{
printf("The creator of C Programming Language is Danich Ritchie.
\n Danich Ritchie also co developer of Unix");
 return 0;
}
\n এর মত আরো অনেক গুলো এস্কেইপ সিকোয়েন্স রয়েছে। নিচে তাদের একটি তালিকা দেওয়া হলোঃ
এস্কেইপ সিকোয়েন্সকাজ।
\aAlert (Beep, Bell) (added in C89)
\bBackspace
\fFormfeed
\nNewline (Line Feed); see notes below
\rCarriage Return
\tHorizontal Tab
\vVertical Tab
\\Backslash
\’Single quotation mark
\”Double quotation mark

যেমন \a দিয়ে এলার্ট শব্দ দেওয়ার জন্য ব্যবহৃত হয়। নিচের প্রোগ্রামটি রান করে দেখতে পারো। এটি কোন কিছুই আউটপুট দিবে না। কিন্তু কম্পিউটার একটি এলার্ট শব্দ বা বিপ শব্দ করবে।
1
2
3
4
5
6
7
8
#include <stdio.h>
main()
{
 printf("\a");
 return 0;
}