একটি C প্রোগ্রাম হল কম্পিউটার এর প্রতি একজন প্রোগ্রামারের লেখা কিছু নির্দেশনা, যা একটি কম্পাইলারের সহায়তায় কম্পিউটার এর বোধগম্য ভাষায় রূপান্তরিত করা হলে কম্পিউটার সেই নির্দেশনা অনুযায়ী প্রোগ্রামারের কাংক্ষিত কাজটি সম্পন্ন করবে।
C একটি স্ট্রাকচার্ড প্রসিডিউরাল ল্যাংগুয়েজ। আর এই ধরণের ভাষায় একটি প্রোগ্রাম হল এক বা একাধিক ফাংশন কলের একটি সিরিজ। নিচে একটি C প্রোগ্রামের সাধারণ গঠন দেখানো হল। এর পরেই উদাহরনের মাধ্যমে এই গঠনটি ব্যাখ্যা করা হবে।
/*এটি একটি সাধারণ C প্রোগ্রাম। */
#include<stdio.h> /*প্রিপ্রসেসর ১ঃ লিংক সেকশন বা হেডার ফাইল*/
#define x y /*প্রিপ্রসেসর ২ঃ গ্লোবালল ডেফিনিশন সেকশন বা ম্যাক্রো ডিক্লেয়ারেশন (অপশনাল)*/
......; /*গ্লোবাল ভ্যারিয়েবল ডিক্লারেশন (অপশনাল)*/
int main() /*প্রোগ্রামের মূল ফাংশন যার ভেতরে প্রোগ্রামের মূল কাজ গুলো সম্পন্ন হবে*/
{
....; /* লোকাল ভ্যারিয়েবল ডিক্লারেশন*/
....; /* ইনপুট ফাংশন*/
....; /* হিসাব নিকাশ*/
....; /* আউটপুট ফাংশন*/
return 0;
}
যদিও মোটামুটি জটিল একটি প্রোগ্রাম দেখতে খানিকটা ভিন্ন হতে পারে, যে কোন C প্রোগ্রামেই এই মৌলিক গঠন দেখা যায়। এইবার আমরা উপরের গঠনটির কিছু ব্যাখ্যা দিই।
একেবারে শুরুতে আছে,
/*এটি একটি সাধারণ C প্রোগ্রাম। */
অংশটি। এটি একটি কমেন্ট বা ডকুমেন্টেশন। যে কোন স্ট্রাকচার্ড ল্যাংগুয়েজ এর বৈশিষ্ট্যই হচ্ছে প্রোগ্রামে কোন কোড কেন লিখা হচ্ছে তার ছোট একটি বর্ণনা দিয়ে দেওয়া। এতে করে এই কোড ভবিষ্যতে কেউ পড়লে (বা প্রোগ্রামার নিজেই ভবিষ্যতে পড়লে) যেন বুঝতে পারে যে প্রোগ্রামের কোথায় কি হচ্ছে। কমেন্ট বা ডকুমেন্টেশন মূল প্রোগ্রামের কাজে তো প্রভাব ফেলে না। কম্পাইলেশন এর সময় এই অংশটি বাদ পড়ে। এটি কেবল বোঝার সুবিধার জন্য লিখা হয়। C স্পেসিফিকেশন অনুযায়ী /* দিয়ে একটি কমেন্ট বা ডকুমেন্টেশন শুরু হয় এবং */ দিয়ে শেষ হয়। আমাদের সকল পোস্টেই এভাবে কমেন্ট লিখা হবে। // দিয়ে অনেকে কমেন্ট লিখে থাকেন। সেটা C++ এর নিয়ম। C তে সেটি গ্রহণযোগ্য নয়। কমেন্ট সম্পর্কে পরে অন্য একটি পোস্টে বিস্তারিত আলোচনা আছে।
এর পরেই আছে,
#include<stdio.h> /*প্রিপ্রসেসর ১ঃ লিংক সেকশন বা হেডার ফাইল*/
অংশটি। # দিয়ে শুরু হওয়া যে কোন কিছুকেই বলে প্রিপ্রসেসর ডিরেক্টিভ বা নির্দেশ। কমেন্ট অংশটি খেয়াল করলে দেখবেন সেখানে লিখা আছে যে, প্রিপ্রসেসর ১। এর কারণ হচ্ছে #include হচ্ছে আমাদের শেখা প্রথম প্রিপ্রসেসর ডিরেক্টিভ। প্রিপ্রসেসর কি সেটা নিয়ে পরে বিস্তারিত আলোচনা করা হবে, তবে এখন এটুকুই যেনে রাখা দরকার যে প্রিপ্রসেসর অংশগুলো প্রোগ্রাম কম্পাইল হবার আগেই ব্যবহৃত হয়। মূল কম্পাইলেশনে এটি ব্যবহৃত হয় না। #include ডিরেক্টিভ এর মাধ্যমে হেডার ফাইল এর সাথে আমার প্রোগ্রাম ফাইলের একটি লিংক বা যোগাযোগ স্থাপন করা হয়। হেডার ফাইল গুলোতে প্রোগ্রামে সচরাচর ব্যবহৃত হয় এমন অনেক উপকরণ আগে থেকেই কোড করা থাকে। আমরা সরাসরি ঐসব উপকরণ ব্যবহার করতে পারি যদি হেডার ফাইল সমূহের সাথে আমাদের প্রোগ্রামের লিংক স্থাপন করা থাকে। যেমন, এখানে <stdio.h> হেডার ফাইলের সাথে লিংক স্থাপন করা হয়েছে, যার ফলে এই প্রোগ্রামে আমরা ঐ হেডার ফাইলে বর্ণিত সকল ইনপুট ও আউটপুট ফাংশন ব্যবহার করতে পারবো সরাসরি।
এর পরের লাইনে আছে,
#define x y /*প্রিপ্রসেসর ২ঃ গ্লোবালল ডেফিনিশন সেকশন বা ম্যাক্রো ডিক্লেয়ারেশন (অপশনাল)*/
অংশটি। এখানে আরেকটি প্রিপ্রসেসর ডিরেক্টিভ দেখানো হয়েছে define। এটি সিম্বলিক কনস্ট্যান্ট বা ম্যাক্রো ডিফাইন করার জন্য ব্যবহৃত হয়। #define এর পরে একটি স্পেস দিয়ে ম্যাক্রো বা কনস্ট্যান্ট টি সেট করা হয় এবং এর পরে আরেকটি স্পেস দিয়ে ঐ ম্যাক্রো বা কনস্ট্যান্ট এর মান সেট করা হয়। আমাদের মূল প্রোগ্রামে যদি কোটেশন মার্ক (" ") এর মধ্যে ছাড়া অন্য কোথাও ঐ কনস্ট্যান্ট বা ম্যাক্রোটি থাকে তাহলে তা কম্পাইলেশন এর আগেই তার মান দ্বারা প্রতিস্থাপিত হয়ে যাবে। যেমনঃ এই কোডের ডিরেক্টিভ অনুযায়ী প্রোগ্রামে যদি কোন x থাকে তাহলে কম্পাইলেশনের আগেই তা y দ্বারা প্রতিস্থাপিত হবে। কমেন্ট খেয়াল করেন যে এটি অপশনাল। তাই এটি কেবল দরকারে ব্যবহৃত হবে। সব সময় নয়।
এরপরের অংশে আছে,
......; /*গ্লোবাল ভ্যারিয়েবল ডিক্লারেশন (অপশনাল)*/
লাইনটি। মূলত এখান থেকেই আমাদের সরাসরি কম্পাইল যোগ্য কোড লিখা শুরু হবে। এইখানে আমরা গ্লোবাল স্কোপে (এইটা কি সেটা এখানে দেখুন) অর্থাৎ সমগ্র প্রোগ্রাম জুড়ে ব্যবহৃত হতে পারে এমন ভ্যারিয়েবল ও ফাংশনের প্রোটোটাইপ ডিক্লেয়ার করবো। এটিও অপশনাল। অর্থাৎ কোন প্রোগ্রামের যদি গ্লোবাল ভ্যারিয়েবল দরকার না হয় তাহলে এই অংশে আমরা কিছুই করবো না।
এর পরের লাইনে হচ্ছে আমাদের প্রোগ্রামের main() ফাংশন ডিফাইন করার ধাপ যা
int main() /*প্রোগ্রামের মূল ফাংশন যার ভেতরে প্রোগ্রামের মূল কাজ গুলো সম্পন্ন হবে*/
{
দ্বারা শুরু হয়েছে। প্রত্যকটা প্রোগ্রামে ১ টি মাত্র main() ফাংশন থাকতেই হবে, কারণ এখান থেকেই প্রোগ্রামের এক্সেকিউশন শুরু হবে। ওপেনিং ব্রেস '{' টি খেয়াল করেন। এই ওপেনিং ব্রেস এর পরের কোড থেকেই একটি প্রোগ্রাম কাজ করা শুরু করে। main() ফাংশন সম্পর্কেও পরে বিস্তারিত আলোচনা আছে।
এর পরের লাইন সমূহ,
....; /* লোকাল ভ্যারিয়েবল ডিক্লারেশন*/
....; /* ইনপুট ফাংশন*/
....; /* হিসাব নিকাশ*/
....; /* আউটপুট ফাংশন*/
কমেন্টে উল্লিখিত কাজগুলোই সম্পন্ন করে। এটি নির্দিষ্ট কিছু নয়। প্রোগ্রামার তার নিজের প্রয়োজনমত কোড এখানে লিখবেন। তবে মোটামুটি ভাবে, main() এর ভেতরে ব্যবহারের জন্য ভ্যারিয়েবল ডিক্লেয়ারেশন, বিভিন্ন তথ্য ইনপুট নেওয়ার জন্য ইনপুট ফাংশন ব্যবহার, বিভিন্ন কাজ সম্পাদনের জন্য হিসাব নিকাশ এবং চুড়ান্ত ফলাফল ব্যবহারকারীতে প্রদর্শন এর জন্য আউটপুট ফাংশন ব্যবহার করা - এসব প্রায় সব মান সম্মত C প্রোগ্রামেই করা হয়ে থাকে। তাই এই কয়টি ধাপ এখানে দেওয়া হয়েছে।
সব শেষে আছে
return 0;
}
অংশটি। main() ফাংশনের রিটার্ন টাইপ অনুযায়ী return ব্যবহার করা হয়। যেহেতু আমাদের ব্যবহৃত ফাংশনটি int main() সেহেতু এখানে শূন্য (0) কে রিটার্ন দেওয়া হয়েছে। return সম্পর্কে এখানে বিস্তারিত পড়ুন।
return থাকার কারণে 0 এর পরের সেমিকোলন ই হবে প্রোগ্রামের সমাপ্তি। তবে কোন কারণে যদি return অনুপস্থিত থাকে তাহলে ক্লোজিং ব্রেস '}' টি প্রোগ্রামের সমাপ্তি নির্দেশ করবে।
অনেক আলোচনা হল, এবার কিছু উদাহরণ দেখা যাক।
/* উদাহরণ ১) এই প্রোগ্রামটি "C Program" লেখাটি আউটপুট দিবে।*/
#include<stdio.h>
int main()
{
printf("C Program");
return 0;
}
লক্ষ্য কর যে এইখানে কোন ভ্যারিয়েবল ডিক্লেয়ার করা হয় নাই, কোন ইনপুট নেওয়া হয় নাই, কোন হিসাব করা হয় নাই। শুধু আউটপুট ফাংশন printf() ব্যবহার করা হয়েছে। আবার,
/* উদাহরণ ২) এই প্রোগ্রামটি একটি সংখ্যা ইনপুট নিয়ে তাকে আউটপুট দিবে।*/
#include<stdio.h>
int main()
{
int number; /*ইন্টিজার টাইপের লোকাল ভ্যারিয়েবল number কে ডিক্লেয়ার করা হল*/
scanf("%d", &number); /* ইনপুট ফাংশন */
printf("%d", number); /* আউটপুট ফাংশন */
return 0;
}
আশা করি এইবার একটি C প্রোগ্রামের সাধারণ গঠন সম্পর্কে মোটামুটি ধারণা আমাদের হয়েছে। আস্তে আস্তে আমাদের এই ধারণা আরো পরিষ্কার হবে এবং আমরা আরো একটু জটিল প্রোগ্রাম লিখতে সমর্থ হবো।
C একটি স্ট্রাকচার্ড প্রসিডিউরাল ল্যাংগুয়েজ। আর এই ধরণের ভাষায় একটি প্রোগ্রাম হল এক বা একাধিক ফাংশন কলের একটি সিরিজ। নিচে একটি C প্রোগ্রামের সাধারণ গঠন দেখানো হল। এর পরেই উদাহরনের মাধ্যমে এই গঠনটি ব্যাখ্যা করা হবে।
/*এটি একটি সাধারণ C প্রোগ্রাম। */
#include<stdio.h> /*প্রিপ্রসেসর ১ঃ লিংক সেকশন বা হেডার ফাইল*/
#define x y /*প্রিপ্রসেসর ২ঃ গ্লোবালল ডেফিনিশন সেকশন বা ম্যাক্রো ডিক্লেয়ারেশন (অপশনাল)*/
......; /*গ্লোবাল ভ্যারিয়েবল ডিক্লারেশন (অপশনাল)*/
int main() /*প্রোগ্রামের মূল ফাংশন যার ভেতরে প্রোগ্রামের মূল কাজ গুলো সম্পন্ন হবে*/
{
....; /* লোকাল ভ্যারিয়েবল ডিক্লারেশন*/
....; /* ইনপুট ফাংশন*/
....; /* হিসাব নিকাশ*/
....; /* আউটপুট ফাংশন*/
return 0;
}
যদিও মোটামুটি জটিল একটি প্রোগ্রাম দেখতে খানিকটা ভিন্ন হতে পারে, যে কোন C প্রোগ্রামেই এই মৌলিক গঠন দেখা যায়। এইবার আমরা উপরের গঠনটির কিছু ব্যাখ্যা দিই।
একেবারে শুরুতে আছে,
/*এটি একটি সাধারণ C প্রোগ্রাম। */
অংশটি। এটি একটি কমেন্ট বা ডকুমেন্টেশন। যে কোন স্ট্রাকচার্ড ল্যাংগুয়েজ এর বৈশিষ্ট্যই হচ্ছে প্রোগ্রামে কোন কোড কেন লিখা হচ্ছে তার ছোট একটি বর্ণনা দিয়ে দেওয়া। এতে করে এই কোড ভবিষ্যতে কেউ পড়লে (বা প্রোগ্রামার নিজেই ভবিষ্যতে পড়লে) যেন বুঝতে পারে যে প্রোগ্রামের কোথায় কি হচ্ছে। কমেন্ট বা ডকুমেন্টেশন মূল প্রোগ্রামের কাজে তো প্রভাব ফেলে না। কম্পাইলেশন এর সময় এই অংশটি বাদ পড়ে। এটি কেবল বোঝার সুবিধার জন্য লিখা হয়। C স্পেসিফিকেশন অনুযায়ী /* দিয়ে একটি কমেন্ট বা ডকুমেন্টেশন শুরু হয় এবং */ দিয়ে শেষ হয়। আমাদের সকল পোস্টেই এভাবে কমেন্ট লিখা হবে। // দিয়ে অনেকে কমেন্ট লিখে থাকেন। সেটা C++ এর নিয়ম। C তে সেটি গ্রহণযোগ্য নয়। কমেন্ট সম্পর্কে পরে অন্য একটি পোস্টে বিস্তারিত আলোচনা আছে।
এর পরেই আছে,
#include<stdio.h> /*প্রিপ্রসেসর ১ঃ লিংক সেকশন বা হেডার ফাইল*/
অংশটি। # দিয়ে শুরু হওয়া যে কোন কিছুকেই বলে প্রিপ্রসেসর ডিরেক্টিভ বা নির্দেশ। কমেন্ট অংশটি খেয়াল করলে দেখবেন সেখানে লিখা আছে যে, প্রিপ্রসেসর ১। এর কারণ হচ্ছে #include হচ্ছে আমাদের শেখা প্রথম প্রিপ্রসেসর ডিরেক্টিভ। প্রিপ্রসেসর কি সেটা নিয়ে পরে বিস্তারিত আলোচনা করা হবে, তবে এখন এটুকুই যেনে রাখা দরকার যে প্রিপ্রসেসর অংশগুলো প্রোগ্রাম কম্পাইল হবার আগেই ব্যবহৃত হয়। মূল কম্পাইলেশনে এটি ব্যবহৃত হয় না। #include ডিরেক্টিভ এর মাধ্যমে হেডার ফাইল এর সাথে আমার প্রোগ্রাম ফাইলের একটি লিংক বা যোগাযোগ স্থাপন করা হয়। হেডার ফাইল গুলোতে প্রোগ্রামে সচরাচর ব্যবহৃত হয় এমন অনেক উপকরণ আগে থেকেই কোড করা থাকে। আমরা সরাসরি ঐসব উপকরণ ব্যবহার করতে পারি যদি হেডার ফাইল সমূহের সাথে আমাদের প্রোগ্রামের লিংক স্থাপন করা থাকে। যেমন, এখানে <stdio.h> হেডার ফাইলের সাথে লিংক স্থাপন করা হয়েছে, যার ফলে এই প্রোগ্রামে আমরা ঐ হেডার ফাইলে বর্ণিত সকল ইনপুট ও আউটপুট ফাংশন ব্যবহার করতে পারবো সরাসরি।
এর পরের লাইনে আছে,
#define x y /*প্রিপ্রসেসর ২ঃ গ্লোবালল ডেফিনিশন সেকশন বা ম্যাক্রো ডিক্লেয়ারেশন (অপশনাল)*/
অংশটি। এখানে আরেকটি প্রিপ্রসেসর ডিরেক্টিভ দেখানো হয়েছে define। এটি সিম্বলিক কনস্ট্যান্ট বা ম্যাক্রো ডিফাইন করার জন্য ব্যবহৃত হয়। #define এর পরে একটি স্পেস দিয়ে ম্যাক্রো বা কনস্ট্যান্ট টি সেট করা হয় এবং এর পরে আরেকটি স্পেস দিয়ে ঐ ম্যাক্রো বা কনস্ট্যান্ট এর মান সেট করা হয়। আমাদের মূল প্রোগ্রামে যদি কোটেশন মার্ক (" ") এর মধ্যে ছাড়া অন্য কোথাও ঐ কনস্ট্যান্ট বা ম্যাক্রোটি থাকে তাহলে তা কম্পাইলেশন এর আগেই তার মান দ্বারা প্রতিস্থাপিত হয়ে যাবে। যেমনঃ এই কোডের ডিরেক্টিভ অনুযায়ী প্রোগ্রামে যদি কোন x থাকে তাহলে কম্পাইলেশনের আগেই তা y দ্বারা প্রতিস্থাপিত হবে। কমেন্ট খেয়াল করেন যে এটি অপশনাল। তাই এটি কেবল দরকারে ব্যবহৃত হবে। সব সময় নয়।
এরপরের অংশে আছে,
......; /*গ্লোবাল ভ্যারিয়েবল ডিক্লারেশন (অপশনাল)*/
লাইনটি। মূলত এখান থেকেই আমাদের সরাসরি কম্পাইল যোগ্য কোড লিখা শুরু হবে। এইখানে আমরা গ্লোবাল স্কোপে (এইটা কি সেটা এখানে দেখুন) অর্থাৎ সমগ্র প্রোগ্রাম জুড়ে ব্যবহৃত হতে পারে এমন ভ্যারিয়েবল ও ফাংশনের প্রোটোটাইপ ডিক্লেয়ার করবো। এটিও অপশনাল। অর্থাৎ কোন প্রোগ্রামের যদি গ্লোবাল ভ্যারিয়েবল দরকার না হয় তাহলে এই অংশে আমরা কিছুই করবো না।
এর পরের লাইনে হচ্ছে আমাদের প্রোগ্রামের main() ফাংশন ডিফাইন করার ধাপ যা
int main() /*প্রোগ্রামের মূল ফাংশন যার ভেতরে প্রোগ্রামের মূল কাজ গুলো সম্পন্ন হবে*/
{
দ্বারা শুরু হয়েছে। প্রত্যকটা প্রোগ্রামে ১ টি মাত্র main() ফাংশন থাকতেই হবে, কারণ এখান থেকেই প্রোগ্রামের এক্সেকিউশন শুরু হবে। ওপেনিং ব্রেস '{' টি খেয়াল করেন। এই ওপেনিং ব্রেস এর পরের কোড থেকেই একটি প্রোগ্রাম কাজ করা শুরু করে। main() ফাংশন সম্পর্কেও পরে বিস্তারিত আলোচনা আছে।
এর পরের লাইন সমূহ,
....; /* লোকাল ভ্যারিয়েবল ডিক্লারেশন*/
....; /* ইনপুট ফাংশন*/
....; /* হিসাব নিকাশ*/
....; /* আউটপুট ফাংশন*/
কমেন্টে উল্লিখিত কাজগুলোই সম্পন্ন করে। এটি নির্দিষ্ট কিছু নয়। প্রোগ্রামার তার নিজের প্রয়োজনমত কোড এখানে লিখবেন। তবে মোটামুটি ভাবে, main() এর ভেতরে ব্যবহারের জন্য ভ্যারিয়েবল ডিক্লেয়ারেশন, বিভিন্ন তথ্য ইনপুট নেওয়ার জন্য ইনপুট ফাংশন ব্যবহার, বিভিন্ন কাজ সম্পাদনের জন্য হিসাব নিকাশ এবং চুড়ান্ত ফলাফল ব্যবহারকারীতে প্রদর্শন এর জন্য আউটপুট ফাংশন ব্যবহার করা - এসব প্রায় সব মান সম্মত C প্রোগ্রামেই করা হয়ে থাকে। তাই এই কয়টি ধাপ এখানে দেওয়া হয়েছে।
সব শেষে আছে
return 0;
}
অংশটি। main() ফাংশনের রিটার্ন টাইপ অনুযায়ী return ব্যবহার করা হয়। যেহেতু আমাদের ব্যবহৃত ফাংশনটি int main() সেহেতু এখানে শূন্য (0) কে রিটার্ন দেওয়া হয়েছে। return সম্পর্কে এখানে বিস্তারিত পড়ুন।
return থাকার কারণে 0 এর পরের সেমিকোলন ই হবে প্রোগ্রামের সমাপ্তি। তবে কোন কারণে যদি return অনুপস্থিত থাকে তাহলে ক্লোজিং ব্রেস '}' টি প্রোগ্রামের সমাপ্তি নির্দেশ করবে।
অনেক আলোচনা হল, এবার কিছু উদাহরণ দেখা যাক।
/* উদাহরণ ১) এই প্রোগ্রামটি "C Program" লেখাটি আউটপুট দিবে।*/
#include<stdio.h>
int main()
{
printf("C Program");
return 0;
}
লক্ষ্য কর যে এইখানে কোন ভ্যারিয়েবল ডিক্লেয়ার করা হয় নাই, কোন ইনপুট নেওয়া হয় নাই, কোন হিসাব করা হয় নাই। শুধু আউটপুট ফাংশন printf() ব্যবহার করা হয়েছে। আবার,
/* উদাহরণ ২) এই প্রোগ্রামটি একটি সংখ্যা ইনপুট নিয়ে তাকে আউটপুট দিবে।*/
#include<stdio.h>
int main()
{
int number; /*ইন্টিজার টাইপের লোকাল ভ্যারিয়েবল number কে ডিক্লেয়ার করা হল*/
scanf("%d", &number); /* ইনপুট ফাংশন */
printf("%d", number); /* আউটপুট ফাংশন */
return 0;
}
আশা করি এইবার একটি C প্রোগ্রামের সাধারণ গঠন সম্পর্কে মোটামুটি ধারণা আমাদের হয়েছে। আস্তে আস্তে আমাদের এই ধারণা আরো পরিষ্কার হবে এবং আমরা আরো একটু জটিল প্রোগ্রাম লিখতে সমর্থ হবো।
0 comments:
Post a Comment