ইনপুট-আউটপুট ও লাইব্রেরি ফাংশন

সি প্রোগ্রামিং: printf ও scanf এর বিস্তারিত ব্যবহার, আউটপুট ফরম্যাটিং, এস্কেপ সিকোয়েন্স এবং math.h লাইব্রেরি ফাংশন।

শেখা শুরু করুন

ইনপুট-আউটপুট ও লাইব্রেরি ফাংশন

  1. সি প্রোগ্রামিং: ইনপুট-আউটপুট ও লাইব্রেরি ফাংশন
  2. স্মার্ট প্রোগ্রাম বনাম বোবা ক্যালকুলেটর
  3. আউটপুট ফাংশন: printf()
  4. ফরম্যাট স্পেসিফায়ার (Format Specifier)
  5. এস্কেপ সিকোয়েন্স (Escape Sequence)
  6. আউটপুট ফরম্যাটিং (Formatting)
  7. ইনপুট ফাংশন: scanf()
  8. অ্যাম্পারস্যান্ড (&) এর রহস্য
  9. ইন্টারেক্টিভ প্রোগ্রাম তৈরি (Prompting)
  10. লাইব্রেরি ফাংশন কী?
  11. গাণিতিক ফাংশন: math.h
  12. ত্রিকোণমিতিক ফাংশন ও সতর্কতা
  13. অক্ষর ও স্ট্রিং ইনপুট-আউটপুট
  14. প্র্যাকটিক্যাল: ত্রিভুজের ক্ষেত্রফল নির্ণয়
  15. সতর্কতা: যেসব ভুল সচরাচর হয়
  16. সারসংক্ষেপ

সি প্রোগ্রামিং: ইনপুট-আউটপুট ও লাইব্রেরি ফাংশন

এই লেকচার শেষে আমরা-

১। printf() এবং scanf() ফাংশন সঠিকভাবে ব্যবহার করতে পারব।
২। ইউজারের কাছ থেকে ইনপুট নিয়ে প্রসেস করে আউটপুট দেখাতে পারব।
৩। আউটপুট ফরম্যাটিং (যেমন দশমিকের পর ২ ঘর) করতে পারব।
৪। বহুল ব্যবহৃত লাইব্রেরি ফাংশন (math.h) এর কাজ ব্যাখ্যা করতে পারব।

সবাইকে স্বাগতম! আশা করি তোমরা সবাই ভালো আছো। আজ আমরা প্রোগ্রামিংয়ের অত্যন্ত গুরুত্বপূর্ণ একটি অংশ শিখব—কীভাবে প্রোগ্রামের সাথে কথা বলতে হয়! অর্থাৎ ইনপুট দেওয়া এবং আউটপুট দেখা। এই লেকচার শেষে আমরা- ১। printf() এবং scanf() ফাংশন সঠিকভাবে ব্যবহার করতে পারব, ২। ইউজারের কাছ থেকে ইনপুট নিয়ে প্রসেস করে আউটপুট দেখাতে পারব, ৩। আউটপুট সুন্দর করে সাজাতে বা ফরম্যাটিং করতে পারব, এবং ৪। math.h এর মতো লাইব্রেরি ফাংশনগুলোর কাজ ব্যাখ্যা করতে পারব। চলো শুরু করা যাক!

স্মার্ট প্রোগ্রাম বনাম বোবা ক্যালকুলেটর

প্রোগ্রামের কাজ করার ধাপ:

  • ইনপুট (Input): তথ্য গ্রহণ করা (যেমন: এটিএম কার্ড প্রবেশ)।
  • প্রসেসিং (Processing): তথ্য বিশ্লেষণ করা (যেমন: পিন যাচাই)।
  • আউটপুট (Output): ফলাফল প্রদান (যেমন: টাকা বের হওয়া)।

প্রশ্ন: প্রোগ্রাম যদি ইনপুট না নিত, তবে তা কি কোনো কাজে লাগত?

শুরুতেই একটা দৃশ্য কল্পনা করো। তুমি এটিএম বুথে গেছো টাকা তুলতে। কার্ড ঢোকানোর পর মেশিনটি যদি তোমার কাছে পিন কোড না চায়, বা তুমি কত টাকা তুলতে চাও সেটা না জিজ্ঞেস করে, তবে কি তুমি টাকা তুলতে পারবে? একদমই না! এটিএম মেশিনটি 'স্মার্ট' কারণ এটি তোমার ইনপুট নেয় এবং সেই অনুযায়ী আউটপুট দেয়। আমাদের প্রোগ্রামও যদি ইউজারের কথা না শোনে বা ইনপুট না নেয়, তবে তা হবে একটি বোবা ক্যালকুলেটরের মতো। আজকের ক্লাসে আমরা আমাদের প্রোগ্রামকে কথা বলা এবং শোনা শেখাব।

আউটপুট ফাংশন: printf()

কাজ: মনিটরের পর্দায় বা কনসোলে কোনো তথ্য প্রদর্শন করা।

সিনট্যাক্স:
printf("Format String", variable_list);

উদাহরণ:

printf("Hello World");
printf("Sum is %d", sum);
  • এটি stdio.h হেডার ফাইলে থাকে।
  • ডাবল কোটেশনের ভেতরের টেক্সট হুবহু প্রিন্ট হয়।

প্রথমে আসি আউটপুটে। সি ল্যাঙ্গুয়েজে কোনো কিছু স্ক্রিনে দেখানোর জন্য আমরা ব্যবহার করি `printf()` ফাংশন। নামটা থেকেই বোঝা যাচ্ছে—'print formatted'। এর গঠন বা সিনট্যাক্স খুব সহজ। `printf` লিখে প্রথম ব্র্যাকেটের ভেতর ডাবল কোটেশনে যা লিখবে, সেটাই স্ক্রিনে ভেসে উঠবে। যেমন `printf("Hello World");` লিখলে স্ক্রিনে Hello World দেখাবে। কিন্তু যদি আমরা কোনো ভেরিয়েবলের মান দেখাতে চাই, তখন আমাদের ফরম্যাট স্পেসিফায়ার ব্যবহার করতে হয়, যা আমরা পরের স্লাইডে দেখব। মনে রাখবে, এই ফাংশনটি কাজ করার জন্য আমাদের `stdio.h` হেডার ফাইলটি প্রোগ্রামের শুরুতে রাখতে হয়।

ফরম্যাট স্পেসিফায়ার (Format Specifier)

ফরম্যাট স্পেসিফায়ার হলো প্লেস হোল্ডার (Place holder), যেখানে ভেরিয়েবলের মান বসে।

ডেটা টাইপ স্পেসিফায়ার উদাহরণ
integer (পূর্ণসংখ্যা) %d 10, -50
float (ভগ্নাংশ) %f 3.14, 5.0
double (বড় ভগ্নাংশ) %lf 3.14159...
character (অক্ষর) %c 'A', 'z'

এখন প্রশ্ন হলো, আমরা তো টেক্সট প্রিন্ট করলাম, কিন্তু ভেরিয়েবলের মান বা ভ্যালু কীভাবে প্রিন্ট করব? ধরো `sum` নামে একটা ভেরিয়েবল আছে যার মান ১০। আমরা যদি লিখি `printf("Sum is sum");` তবে আউটপুট আসবে 'Sum is sum'। এটা তো আমরা চাই না! আমরা চাই ১০। এজন্য আমাদের দরকার 'ফরম্যাট স্পেসিফায়ার'। এগুলো হলো সিটের মতো, যেখানে ভেরিয়েবল এসে বসে। পূর্ণসংখ্যার জন্য আমরা ব্যবহার করি `%d`, দশমিক বা ভগ্নাংশের জন্য `%f`, আর ক্যারেক্টারের জন্য `%c`। চার্টটি ভালো করে লক্ষ্য করো, এগুলো প্রোগ্রামিংয়ে সবসময় লাগবে।

এস্কেপ সিকোয়েন্স (Escape Sequence)

আউটপুট সাজানোর জন্য বিশেষ ক্যারেক্টার যা ব্যাক স্ল্যাশ (\) দিয়ে শুরু হয়।

জনপ্রিয় এস্কেপ সিকোয়েন্স:
* \n (New Line): কার্সর নতুন লাইনে নিয়ে যায়।
* \t (Tab): এক ট্যাব পরিমাণ ফাঁকা জায়গা তৈরি করে।

উদাহরণ:

printf("Name: Rafiq\nRoll: 101");

আউটপুট:

Name: Rafiq
Roll: 101

অনেক সময় দেখবে আউটপুট সব এক লাইনে গাদাগাদি করে আসছে। দেখতে একদম ভালো লাগে না, তাই না? আউটপুট সুন্দর করে সাজানোর জন্য আমরা 'এস্কেপ সিকোয়েন্স' ব্যবহার করি। এগুলো ব্যাক স্ল্যাশ (`\`) দিয়ে শুরু হয়। সবচেয়ে বেশি ব্যবহার হবে `\n`—এর মানে হলো 'New Line'। এটা দিলে কার্সর পরের লাইনে চলে যায়। আর যদি একটু ফাঁকা জায়গা বা ট্যাব দিতে চাও, তবে ব্যবহার করবে `\t`। কোড এক্সাম্পলটা দেখো, `Name: Rafiq` এর পর `\n` থাকায় `Roll: 101` পরের লাইনে প্রিন্ট হয়েছে।

আউটপুট ফরম্যাটিং (Formatting)

দশমিকের পর কত ঘর দেখাব তা নিয়ন্ত্রণ করা।

সিনট্যাক্স: %.nf (এখানে n হলো ঘর সংখ্যা)

উদাহরণ:

float pi = 3.14159;
printf("Value: %.2f", pi);

আউটপুট: Value: 3.14

  • টাকা বা জিপিএ এর ক্ষেত্রে আমরা সাধারণত ২ ঘর ব্যবহার করি।

ধরো তুমি টাকার হিসাব করছ। রেজাল্ট আসল ১০.৫৫৫৫৫৫ টাকা। এটা দেখতে কি ভালো লাগে? আমরা সাধারণত পয়সার হিসাব দুই ঘরে করি, তাই না? ১০.৫৬ টাকা। সিতে এটা করা খুব সহজ। `%f` এর মাঝখানে একটা দশমিক আর সংখ্যা বসিয়ে দিলেই হয়। যেমন `%.2f` মানে দশমিকের পর দুই ঘর দেখাবে। `%.0f` দিলে কোনো দশমিকই দেখাবে না। এটা তোমাদের প্র্যাকটিক্যাল কাজের জন্য খুব দরকারি, বিশেষ করে যখন টাকার অংক বা জিপিএ প্রিন্ট করবে।

ইনপুট ফাংশন: scanf()

কাজ: কিবোর্ড বা ইউজার থেকে ডেটা গ্রহণ করা।

সিনট্যাক্স:
scanf("Format String", &variable);

উদাহরণ:

int age;
scanf("%d", &age);
  • printf এর মতোই ফরম্যাট স্পেসিফায়ার লাগে।
  • সতর্কতা: ভেরিয়েবলের আগে অবশ্যই & চিহ্ন দিতে হবে।

এতক্ষণ আমরা শুধু কথা বললাম (Output), এবার শুনব (Input)। ইনপুট নেওয়ার জন্য ফাংশন হলো `scanf()`—মানে 'scan formatted'। এর গঠন `printf` এর মতোই, প্রথমে ফরম্যাট স্পেসিফায়ার দিতে হয়। কিন্তু একটা বিশাল পার্থক্য আছে! খেয়াল করো, ভেরিয়েবলের নামের আগে একটা `&` চিহ্ন আছে। উদাহরণে দেখো: `scanf("%d", &age);`। এই `&` চিহ্নটা কেন দিতে হয়, কেউ কি বলতে পারবে? পরের স্লাইডে আমরা এই রহস্য জানব।

অ্যাম্পারস্যান্ড (&) এর রহস্য

& = Address of Operator

  • কাজ: এটি মেমোরিতে ভেরিয়েবলটির ঠিকানা (Address) নির্দেশ করে।
  • কেন প্রয়োজন? scanf কে বলে দিতে হয় ডেটাটি মেমোরির ঠিক কোন জায়গায় (Address) গিয়ে জমা হবে।

ঠিকানা না জানলে যেমন চিঠি পৌঁছায় না, তেমনি & না দিলে ইনপুট সঠিক ভেরিয়েবলে পৌঁছায় না।

এই `&` বা অ্যাম্পারস্যান্ড চিহ্নটিকে বলা হয় 'Address of Operator'। সহজ করে ভাবো—তোমকে যদি কেউ চিঠি পাঠাতে চায়, তবে তাকে তোমার বাসার ঠিকানা জানতে হবে, তাই না? ঠিক তেমনি, `scanf` যখন কিবোর্ড থেকে ডেটা নেয়, তাকে জানতে হয় কম্পিউটারের মেমোরির কোন বক্সে বা কোন ঠিকানায় সেই ডেটা রাখবে। `&age` মানে হলো মেমোরিতে `age` ভেরিয়েবলের ঠিকানা। তাই `scanf` এ `&` দিতে ভুললে প্রোগ্রাম জানবে না ইনপুটটা কোথায় রাখতে হবে, আর প্রোগ্রাম ঠিকমতো কাজ করবে না। এটা কিন্তু ছাত্ররা সবচেয়ে বেশি ভুল করে!

ইন্টারেক্টিভ প্রোগ্রাম তৈরি (Prompting)

সরাসরি ইনপুট নেওয়ার আগে ইউজারকে বলে দেওয়া উচিত কী করতে হবে।

ভুল পদ্ধতি:

scanf("%d", &age); // ইউজার বুঝবে না কী চাইছেন

সঠিক পদ্ধতি (Prompt সহ):

printf("Enter your age: "); // প্রম্পট
scanf("%d", &age);         // ইনপুট

এতে ইউজারের অভিজ্ঞতা (User Experience) ভালো হয়।

একটা ভালো প্রোগ্রাম সবসময় ইউজারের সাথে কথা বলে। তুমি যদি সরাসরি `scanf` লেখো, দেখবে রান করার পর কালো স্ক্রিনটা চুপ করে আছে, কার্সর ব্লিঙ্ক করছে। ইউজার বুঝবে না কী করতে হবে। তাই ইনপুট নেওয়ার আগে সবসময় একটা `printf` বা প্রম্পট দিতে হয়। যেমন: `printf("Enter your age: ");`। এটা দেখলে ইউজার বুঝবে, 'ও আচ্ছা, এখন আমার বয়স টাইপ করতে হবে'। এরপর `scanf` দিয়ে ইনপুট নেবে। এভাবে প্রোগ্রাম লিখলে তা ব্যবহার করা সহজ হয়।

লাইব্রেরি ফাংশন কী?

লাইব্রেরি ফাংশন: আগে থেকে তৈরি করা কিছু ফাংশন (Ready-made tools) যা সি ল্যাঙ্গুয়েজের লাইব্রেরিতে থাকে।

সুবিধা:
১. নতুন করে কোড লিখতে হয় না, তাই সময় বাঁচে।
২. এগুলো নির্ভুল এবং পরীক্ষিত।

উদাহরণ: printf(), scanf() হলো stdio.h লাইব্রেরির অংশ। গাণিতিক কাজের জন্য আছে math.h

এবার আসি লাইব্রেরি ফাংশনে। ধরো তোমার বাসায় একটা তাক বা বুকশেলফ বানাতে হবে। তুমি কি হাতুড়ি, করাত—এগুলো নিজের হাতে লোহা গলিয়ে বানাবে? নাকি দোকান থেকে কিনে আনবে? নিশ্চয়ই কিনে আনবে! সি ল্যাঙ্গুয়েজেও এমন অনেক রেডিমেড টুলস আছে যা আমরা সরাসরি ব্যবহার করতে পারি। এগুলোকে বলে লাইব্রেরি ফাংশন। যেমন `printf` আর `scanf`—এগুলো কিন্তু আমরা বানাইনি, সি লাইব্রেরি থেকে এনে ব্যবহার করছি। এই টুলসগুলো বিভিন্ন হেডার ফাইলে সাজানো থাকে।

গাণিতিক ফাংশন: math.h

জটিল গাণিতিক কাজের জন্য প্রোগ্রামের শুরুতে #include <math.h> ব্যবহার করতে হয়।

ফাংশন কাজ উদাহরণ
pow(base, exp) পাওয়ার বা শক্তি নির্ণয় pow(5, 2) → 25.0
sqrt(n) বর্গমূল (Square Root) sqrt(16) → 4.0
abs(n) পরম মান (Absolute Value) abs(-5) → 5
  • pow এবং sqrt সাধারণত double ডেটা টাইপ রিটার্ন করে।

গণিতের বিভিন্ন জটিল কাজ করার জন্য আমাদের একটি বিশেষ টুলবক্স আছে, যার নাম `math.h`। এই হেডার ফাইলটি প্রোগ্রামের শুরুতে যোগ করলে আমরা অনেক পাওয়ারফুল ফাংশন ব্যবহার করতে পারি। যেমন, কোনো সংখ্যার পাওয়ার বের করতে `pow(base, power)` ব্যবহার করি। ৫ এর স্কয়ার বের করতে লিখব `pow(5, 2)`। আবার বর্গমূল বা রুটওভার করতে `sqrt()` ফাংশন আছে। ১৬ এর বর্গমূল বের করতে লিখব `sqrt(16)`। মনে রাখবে, এই ফাংশনগুলো ব্যবহার করতে হলে প্রোগ্রামের শুরুতে `#include <math.h>` লিখতে ভুলবে না!

ত্রিকোণমিতিক ফাংশন ও সতর্কতা

সাইন, কস, ট্যান এর মান বের করার ফাংশন: sin(x), cos(x), tan(x)

সতর্কতা:
* সি ল্যাঙ্গুয়েজে এই ফাংশনগুলো Degree গ্রহণ করে না।
* ইনপুট হিসেবে Radian দিতে হয়।

কনভার্সন সূত্র:
$$ Radian = Degree \times \frac{\pi}{180} $$

`math.h` দিয়ে আমরা ত্রিকোণমিতির কাজও করতে পারি, যেমন `sin`, `cos`, `tan`। কিন্তু এখানে একটা খুব গুরুত্বপূর্ণ বিষয় আছে যা অনেকেই ভুল করে। এই ফাংশনগুলো ইনপুট হিসেবে ডিগ্রিতে কোণ নেয় না, নেয় রেডিয়ানে। তাই তোমাকে যদি বলা হয় `sin(90)` এর মান বের করতে, তুমি সরাসরি ৯০ বসালে ভুল উত্তর আসবে। তোমাকে ৯০ ডিগ্রিকে আগে রেডিয়ানে কনভার্ট করে নিতে হবে। তোমরা নিশ্চয়ই জানো, ডিগ্রিকে পাই বাই ১৮০ দিয়ে গুণ করলে রেডিয়ান পাওয়া যায়।

অক্ষর ও স্ট্রিং ইনপুট-আউটপুট

একক অক্ষর (Character):
* ইনপুট: getchar()
* আউটপুট: putchar()

স্ট্রিং বা বাক্য (String):
* ইনপুট: gets() (Space সহ পুরো লাইন নেয়)
* আউটপুট: puts()

নোট: scanf স্পেসের পর আর ইনপুট নেয় না, তাই পুরো নাম বা বাক্য নিতে gets সুবিধাজনক।

সংখ্যা তো অনেক হলো, এবার অক্ষরের পালা। শুধু একটি ক্যারেক্টার নেওয়ার জন্য `getchar()` এবং দেখানোর জন্য `putchar()` ব্যবহার করা যায়। আর যদি পুরো একটা লাইন বা কারো পুরো নাম ইনপুট নিতে চাও, তবে `gets()` ফাংশনটি খুব কাজের। `scanf` দিয়ে নাম নিতে গেলে দেখা যায় স্পেসের পরের অংশ বাদ পড়ে যায়, কিন্তু `gets()` পুরো লাইনটাই ইনপুট হিসেবে নেয়। যদিও আধুনিক প্রোগ্রামে `gets` এর ব্যবহার কিছুটা নিরুৎসাহিত করা হয় নিরাপত্তার কারণে, কিন্তু এইচএসসি লেভেলে এটা জেনে রাখা ভালো।

প্র্যাকটিক্যাল: ত্রিভুজের ক্ষেত্রফল নির্ণয়

সমস্যা: ভূমি ও উচ্চতা ইনপুট নিয়ে ত্রিভুজের ক্ষেত্রফল বের কর।
সূত্র: $Area = 0.5 \times base \times height$

#include <stdio.h>
int main() {
    float base, height, area;
    printf("Enter base: ");
    scanf("%f", &base);
    printf("Enter height: ");
    scanf("%f", &height);

    area = 0.5 * base * height;
    printf("Area is: %.2f", area);
    return 0;
}

চলো এতক্ষণ যা শিখলাম, তা দিয়ে একটা প্র্যাকটিক্যাল প্রবলেম সলভ করি। আমরা ত্রিভুজের ভূমি আর উচ্চতা ইনপুট নিয়ে ক্ষেত্রফল বের করব। প্রথমে আমরা `base`, `height` আর `area` নামে তিনটি ফ্লোট বা ভগ্নাংশ ভেরিয়েবল নেব—কারণ উচ্চতা বা ভূমি দশমিকে হতেই পারে। এরপর `printf` দিয়ে প্রম্পট দেব এবং `scanf` দিয়ে ভ্যালু নেব। মনে আছে তো `&` দিতে হবে? সবশেষে সূত্র `0.5 * base * height` বসিয়ে রেজাল্ট প্রিন্ট করব। ভিডিওটা পজ করে তোমরা এই কোডটা একবার খাতায় বা কম্পিউটারে লিখে ফেলার চেষ্টা করো।

সতর্কতা: যেসব ভুল সচরাচর হয়

প্রোগ্রামিং করার সময় নিচের ভুলগুলো এড়িয়ে চলবে:

  1. scanf এ ভেরিয়েবলের আগে & চিহ্ন দিতে ভুলে যাওয়া।
  2. int ভেরিয়েবলের জন্য %f বা float এর জন্য %d ব্যবহার করা।
  3. math.h ফাংশন ব্যবহার করে হেডার ফাইল অ্যাড না করা।
  4. স্টেটমেন্টের শেষে সেমিকোলন (;) মিস করা।

প্রোগ্রামিং শেখার সময় ভুল হওয়াটাই স্বাভাবিক। তবে কিছু ভুল আমরা খুব বেশি করি। ১ নম্বর হলো `scanf` এর ভেতরে `&` দিতে ভুলে যাওয়া। এটা হলে প্রোগ্রাম ক্র্যাশ করতে পারে। ২ নম্বর হলো ভেরিয়েবল ডিক্লেয়ার করলাম `int` কিন্তু ফরম্যাট স্পেসিফায়ার দিলাম `%f`—এটা করা যাবে না। আর ৩ নম্বর, `sqrt` বা `pow` ব্যবহার করলে অবশ্যই ওপরে `#include <math.h>` লিখতে হবে। এই ছোটখাটো বিষয়গুলো খেয়াল রাখলে তোমাদের প্রোগ্রাম হবে নিখুঁত।

সারসংক্ষেপ

আজকের লেকচারে আমরা-

১। printf() দিয়ে আউটপুট দেখানো এবং %.2f দিয়ে ফরম্যাটিং শিখেছি।
২। scanf() এবং & ব্যবহার করে ইনপুট নেওয়া শিখেছি।
৩। বিভিন্ন ফরম্যাট স্পেসিফায়ার (%d, %f) এর ব্যবহার দেখেছি।
৪। math.h এর মাধ্যমে গাণিতিক কাজ (pow, sqrt) করতে শিখেছি।

আজকে আমরা প্রোগ্রামের ইনপুট এবং আউটপুট নিয়ে বিস্তারিত জানলাম। আমরা দেখলাম কীভাবে `printf` দিয়ে স্ক্রিনে কিছু দেখাতে হয়, `scanf` দিয়ে ইউজারের কাছ থেকে তথ্য নিতে হয় এবং `math.h` লাইব্রেরি ব্যবহার করে জটিল অংক সহজে করা যায়। এই বিষয়গুলো সি প্রোগ্রামিংয়ের ভিত্তি। এগুলো ভালো করে আয়ত্ত করতে পারলে সামনের বড় প্রোগ্রামগুলো করা তোমাদের জন্য অনেক সহজ হয়ে যাবে। বাসায় অবশ্যই প্র্যাকটিস করবে। দেখা হবে পরের লেকচারে, ধন্যবাদ!

ইনপুট-আউটপুট ও লাইব্রেরি ফাংশন

পড়তে প্রায় 14 মিনিট

লেকচার ১০-এর ধারাবাহিকতায় আজ আমরা সি প্রোগ্রামিংয়ের অত্যন্ত গুরুত্বপূর্ণ অংশ—ইনপুট-আউটপুট স্টেটমেন্ট এবং লাইব্রেরি ফাংশন নিয়ে বিস্তারিত আলোচনা করব।

একটি ক্যালকুলেটর এবং একটি স্মার্ট সফটওয়্যারের মধ্যে মূল পার্থক্য কী? ক্যালকুলেটরে আপনি যা টাইপ করেন, সে শুধু তাই গণনা করে। কিন্তু একটি স্মার্ট প্রোগ্রাম ব্যবহারকারীর কাছ থেকে ডেটা নেয় (Input), সেই ডেটা প্রসেস করে এবং অর্থবহ ফলাফল প্রদর্শন করে (Output)। এই Input-Process-Output (IPO) সাইকেলই হলো যেকোনো সফটওয়্যারের প্রাণ। সি ল্যাঙ্গুয়েজে এই কাজগুলো করার জন্য printf() এবং scanf() এর মতো ফাংশনগুলো কীভাবে মেমোরি লেভেলে কাজ করে, তা আমরা আজ গভীরে গিয়ে শিখব।

১. আউটপুট ফাংশন: printf()

printf() হলো সি ল্যাঙ্গুয়েজের প্রধান আউটপুট ফাংশন যা stdio.h (Standard Input Output) হেডার ফাইলের অধীনে থাকে। এটি মনিটরের স্ক্রিনে টেক্সট বা ভেরিয়েবলের মান প্রদর্শন করে।

গঠন (Syntax):
printf("Control String", Argument List);

এখানে Control String ডাবল কোটেশনের মধ্যে থাকে এবং এতে সাধারণ টেক্সট বা ফরম্যাট স্পেসিফায়ার থাকতে পারে। Argument List-এ কমা দিয়ে ভেরিয়েবলগুলোর নাম লেখা হয়।

ফরম্যাট স্পেসিফায়ার (Format Specifier)

ফরম্যাট স্পেসিফায়ার কম্পাইলারকে বলে দেয় মেমোরি থেকে ডেটাটি কী ফরম্যাটে স্ক্রিনে দেখাতে হবে। এটি সবসময় % চিহ্ন দিয়ে শুরু হয়।

সংজ্ঞা (Definition): ফরম্যাট স্পেসিফায়ার (Format Specifier) হলো % চিহ্নযুক্ত বিশেষ ক্যারেক্টার যা ইনপুট বা আউটপুট ফাংশনে ভেরিয়েবলের ডেটা টাইপ নির্দেশ করে এবং কম্পাইলারকে জানায় কীভাবে ডেটা প্রসেস বা প্রদর্শন করতে হবে।

নিচে বহুল ব্যবহৃত ফরম্যাট স্পেসিফায়ারের তালিকা দেওয়া হলো যা পরীক্ষার জন্য অত্যন্ত গুরুত্বপূর্ণ:

ফরম্যাট স্পেসিফায়ার ডেটা টাইপ বর্ণনা
%d বা %i int পূর্ণসংখ্যা (Integer) প্রিন্ট করতে
%f float দশমিক সংখ্যা (Floating point) প্রিন্ট করতে
%lf double বড় দশমিক সংখ্যা (Double precision) প্রিন্ট করতে
%c char একটি মাত্র অক্ষর (Character) প্রিন্ট করতে
%s char[] শব্দ বা বাক্য (String) প্রিন্ট করতে
%o int অক্টাল (Octal) সংখ্যা প্রিন্ট করতে
%x বা %X int হেক্সাডেসিমেল (Hexadecimal) সংখ্যা প্রিন্ট করতে

পরীক্ষার টিপস (Exam Tip): প্রায়ই MCQ-তে প্রশ্ন আসে double ডেটা টাইপের জন্য কোন স্পেসিফায়ার ব্যবহৃত হয়। সঠিক উত্তর %lf (long float)। তবে float এর জন্য শুধুই %f

আউটপুট ফিল্ড ফরম্যাটিং (Output Field Formatting)

শুধু মান প্রিন্ট করাই যথেষ্ট নয়, অনেক সময় আউটপুটকে সুন্দরভাবে সাজাতে হয়। একে বলা হয় ফিল্ড ফরম্যাটিং। এর মাধ্যমে আমরা বলে দিতে পারি একটি সংখ্যা প্রিন্ট করতে স্ক্রিনে কয়টি ঘর (space) বরাদ্দ হবে।

আউটপুট ফিল্ড ফরম্যাটিং এর চিত্র

গুরুত্বপূর্ণ ফরম্যাটিং নিয়ম:

  • %wd (যেমন %5d): এখানে w হলো মোট জায়গা বা Width। যদি সংখ্যাটি ছোট হয়, তবে বামপাশে খালি জায়গা বা স্পেস রেখে ডানদিক (Right Align) থেকে প্রিন্ট হবে।
  • %-wd (যেমন %-5d): মাইনাস চিহ্ন থাকলে সংখ্যাটি বামদিক (Left Align) থেকে প্রিন্ট হবে এবং ডানপাশে খালি জায়গা থাকবে।
  • %.pf (যেমন %.2f): দশমিকের পর কত ঘর পর্যন্ত দেখাবে তা নির্ধারণ করে। %.2f মানে দশমিকের পর ২ ঘর।

উদাহরণ (Example):
ধরি, int a = 50; এবং float b = 3.14159;

  • printf("%5d", a);_ _ _ 5 0 (মোট ৫ ঘর, বামে ৩টি স্পেস)
  • printf("%-5d", a);5 0 _ _ _ (মোট ৫ ঘর, ডানে ৩টি স্পেস)
  • printf("%.2f", b);3.14 (দশমিকের পর ২ ঘর)
  • printf("%.0f", b);3 (দশমিক অংশ বাদ দিয়ে রাউন্ড ফিগার)

২. এস্কেপ সিকোয়েন্স (Escape Sequence)

প্রোগ্রামের আউটপুট সাজানোর জন্য ব্যাকস্ল্যাশ (\) দিয়ে শুরু হওয়া কিছু বিশেষ ক্যারেক্টার ব্যবহার করা হয়, যাদের এস্কেপ সিকোয়েন্স বলে। এগুলো স্ক্রিনে দেখা যায় না কিন্তু নির্দিষ্ট কাজ করে।

সংজ্ঞা (Definition): এস্কেপ সিকোয়েন্স (Escape Sequence) হলো ব্যাকস্ল্যাশ () দিয়ে শুরু হওয়া বিশেষ ক্যারেক্টার যা কম্পাইলারকে সাধারণ ক্যারেক্টারের পরিবর্তে বিশেষ নির্দেশ (যেমন নতুন লাইন বা ট্যাব) প্রদান করে।

এস্কেপ সিকোয়েন্স নাম কাজ
\n New Line কার্সরকে নতুন লাইনের শুরুতে নিয়ে যায়
\t Horizontal Tab কার্সরকে এক ট্যাব (সাধারণত ৪ বা ৮ স্পেস) ডানে সরায়
\b Backspace কার্সরকে এক ঘর বামে সরায় (আগের অক্ষর মুছে ফেলার মতো)
\" Double Quote আউটপুটে ডাবল কোটেশন (") প্রদর্শন করতে
\\ Backslash আউটপুটে ব্যাকস্ল্যাশ () প্রদর্শন করতে
\0 Null Character স্ট্রিং-এর সমাপ্তি নির্দেশ করতে (মেমোরিতে ব্যবহৃত হয়)

৩. ইনপুট ফাংশন: scanf()

ব্যবহারকারীর কাছ থেকে ডেটা ইনপুট নেওয়ার জন্য scanf() ফাংশন ব্যবহার করা হয়।

গঠন (Syntax):
scanf("Control String", &Variable_Name);

এখানে সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো ভেরিয়েবলের নামের আগে & (Ampersand) চিহ্ন ব্যবহার করা।

& বা Address of Operator কেন ব্যবহার করা হয়?

যখন আমরা একটি ভেরিয়েবল ডিক্লেয়ার করি (যেমন int a;), তখন র‍্যামের (RAM) মধ্যে একটি নির্দিষ্ট ঠিকানায় বা অ্যাড্রেসে মেমোরি বরাদ্দ হয়। scanf ফাংশনকে বলে দিতে হয় যে, কি-বোর্ড থেকে নেওয়া মানটি মেমোরির ঠিক কোন ঠিকানায় গিয়ে জমা হবে।

মেমোরি অ্যাড্রেস এবং & অপারেটরের চিত্র

উপরের চিত্রে লক্ষ্য করুন, ভেরিয়েবল a-এর মান ১০ এবং এর মেমোরি অ্যাড্রেস ১০০৪&a মূলত এই ১০০৪ ঠিকানাটিকে নির্দেশ করে। তাই scanf& না দিলে প্রোগ্রাম জানবে না মানটি কোথায় রাখতে হবে, ফলে প্রোগ্রাম ভুল কাজ করবে বা ক্র্যাশ করবে।

গুরুত্বপূর্ণ (Important):
- সাধারণ ভেরিয়েবল (int, float, char) ইনপুট নেওয়ার সময় & দিতেই হবে।
- কিন্তু String (char array) ইনপুট নেওয়ার সময় & দেওয়ার প্রয়োজন নেই। কারণ অ্যারে-এর নাম নিজেই তার প্রথম উপাদানের ঠিকানা নির্দেশ করে।
- scanf("%d", &age); (সঠিক)
- scanf("%s", name); (সঠিক, এখানে & নেই)

৪. অক্ষর ও স্ট্রিং ইনপুট-আউটপুট (Advanced I/O)

printf এবং scanf ছাড়াও সি ল্যাঙ্গুয়েজে অক্ষর (character) এবং স্ট্রিং (string) নিয়ে কাজ করার জন্য কিছু বিশেষ ফাংশন আছে।

ক্যারেক্টার I/O: getchar()putchar()
  • getchar(): কি-বোর্ড থেকে একটি মাত্র অক্ষর ইনপুট নেয়। এন্টার (Enter) চাপার পর এটি কাজ করে।
  • putchar(): স্ক্রিনে একটি মাত্র অক্ষর প্রদর্শন করে।
স্ট্রিং I/O: gets()puts()

এটি পরীক্ষার জন্য খুবই গুরুত্বপূর্ণ। অনেক সময় scanf দিয়ে স্ট্রিং ইনপুট নিতে গেলে সমস্যা হয়।

scanf() বনাম gets() এর পার্থক্য:

বৈশিষ্ট্য scanf("%s", str) gets(str)
স্পেস গ্রহণ স্পেস (Space) পেলে ইনপুট নেওয়া বন্ধ করে দেয়। স্পেস সহ পুরো লাইন ইনপুট নিতে পারে।
ব্যবহার শুধু একটি শব্দ নেওয়ার জন্য উপযুক্ত। পুরো বাক্য (Sentence) নেওয়ার জন্য উপযুক্ত।
উদাহরণ ইনপুট: "Abdul Karim"
মেমোরিতে জমা হবে: "Abdul"
ইনপুট: "Abdul Karim"
মেমোরিতে জমা হবে: "Abdul Karim"

পরীক্ষার টিপস (Exam Tip): যদি উদ্দীপকে কারো "পুরো নাম" বা "ঠিকানা" ইনপুট নেওয়ার কথা বলা থাকে, তবে অবশ্যই gets() ফাংশন ব্যবহার করবে। কারণ নামে বা ঠিকানায় স্পেস থাকে যা scanf পড়তে পারে না।

৫. লাইব্রেরি ফাংশন ও হেডার ফাইল

সি ল্যাঙ্গুয়েজে কিছু কাজ (যেমন ইনপুট-আউটপুট, গাণিতিক হিসাব) করার জন্য আগে থেকেই তৈরি করা কিছু ফাংশন থাকে, এদের লাইব্রেরি ফাংশন বলে। এই ফাংশনগুলোর সংজ্ঞা বা প্রোটোটাইপ বিভিন্ন ফাইলে জমা থাকে, যাকে হেডার ফাইল (Header File) বলে।

সংজ্ঞা (Definition): লাইব্রেরি ফাংশন হলো কম্পাইলারের সাথে সরবরাহকৃত পূর্বনির্ধারিত ফাংশন যা প্রোগ্রামে সরাসরি ব্যবহার করা যায়। আর হেডার ফাইল হলো এমন একটি ফাইল (এক্সটেনশন .h) যেখানে এই লাইব্রেরি ফাংশনগুলোর ঘোষণা থাকে।

গাণিতিক ফাংশন: math.h

গাণিতিক জটিল হিসাবের জন্য আমাদের প্রোগ্রামের শুরুতে #include <math.h> লিখতে হয়। নিচে গুরুত্বপূর্ণ কিছু গাণিতিক ফাংশন দেওয়া হলো:

ফাংশন কাজ উদাহরণ ফলাফল
pow(x, y) x এর পাওয়ার y নির্ণয় করে ($x^y$) pow(2, 3) 8.0
sqrt(x) x এর বর্গমূল নির্ণয় করে ($\sqrt{x}$) sqrt(25) 5.0
abs(x) পূর্ণসংখ্যার পরম মান (Absolute value) abs(-10) 10
ceil(x) উপরের নিকটতম পূর্ণসংখ্যায় রূপান্তর (Ceiling) ceil(3.2) 4.0
floor(x) নিচের নিকটতম পূর্ণসংখ্যায় রূপান্তর (Floor) floor(3.9) 3.0
sin(x) সাইন এর মান নির্ণয় (x অবশ্যই রেডিয়ানে হবে) sin(1.57) 1.0 (approx)

$$ Radian = Degree \times \frac{\pi}{180} $$
ত্রিকোণমিতিক ফাংশনে (যেমন sin, cos, tan) কোণের মান ডিগ্রিতে দিলে কাজ হবে না, রেডিয়ানে কনভার্ট করে দিতে হবে।
যেমন: sin(30 * 3.1416 / 180)

৬. ব্যবহারিক উদাহরণ (Worked Examples)

উদাহরণ ১: ত্রিভুজের ক্ষেত্রফল নির্ণয় (তিন বাহু দেওয়া থাকলে)

এখানে আমরা sqrt() ফাংশনের ব্যবহার দেখব। সূত্র: $\text{Area} = \sqrt{s(s-a)(s-b)(s-c)}$ যেখানে $s = \frac{a+b+c}{2}$।

#include <stdio.h>
#include <math.h> // sqrt ব্যবহারের জন্য জরুরি

int main() {
    double a, b, c, s, area;

    printf("Enter 3 sides: ");
    scanf("%lf %lf %lf", &a, &b, &c);

    s = (a + b + c) / 2;
    area = sqrt(s * (s - a) * (s - b) * (s - c));

    printf("Area of Triangle = %.2lf\n", area);

    return 0;
}
উদাহরণ ২: ফারেনহাইট থেকে সেলসিয়াস রূপান্তর

সূত্র: $C = \frac{F - 32}{1.8}$ বা $C = (F - 32) \times \frac{5}{9}$

#include <stdio.h>

int main() {
    float F, C;

    printf("Enter Fahrenheit Temperature: ");
    scanf("%f", &F);

    // মনে রাখবে: C ল্যাঙ্গুয়েজে 5/9 এর মান 0 হয় (পূর্ণসংখ্যা ভাগ)।
    // তাই 5.0/9.0 অথবা ভগ্নাংশ ব্যবহার করতে হবে।
    C = (F - 32) * (5.0 / 9.0); 

    printf("Celsius Temperature = %.2f\n", C);

    return 0;
}

সংক্ষিপ্ত সারাংশ (Quick Revision):
- ইনপুট ও আউটপুটের জন্য যথাক্রমে scanf() এবং printf() ব্যবহৃত হয়।
- scanf()-এ ভেরিয়েবলের আগে & দিতে হয়, তবে স্ট্রিং-এর ক্ষেত্রে নয়।
- স্পেসসহ স্ট্রিং ইনপুট নিতে gets() ব্যবহার করা ভালো।
- math.h হেডার ফাইলে গাণিতিক ফাংশন (pow, sqrt, sin, cos) থাকে।
- আউটপুট সুন্দর করতে %-5d বা %.2f এর মতো ফরম্যাটিং ব্যবহৃত হয়।

পরিভাষা (Glossary)

পরিভাষা অর্থ ও ব্যাখ্যা
লাইব্রেরি ফাংশন সি কম্পাইলারের সাথে দেওয়া পূর্বনির্ধারিত ফাংশন (যেমন printf, sqrt)।
হেডার ফাইল যে ফাইলে লাইব্রেরি ফাংশনগুলোর প্রোটোটাইপ ঘোষণা করা থাকে (যেমন stdio.h)।
ফরম্যাট স্পেসিফায়ার % যুক্ত ক্যারেক্টার যা ডেটার টাইপ ও ফরম্যাট নির্দেশ করে (যেমন %d, %f)।
বাফার (Buffer) ইনপুট বা আউটপুটের সময় ডেটা যেখানে সাময়িকভাবে জমা থাকে।
লিঙ্কার (Linker) কম্পাইলিং-এর একটি ধাপ যা লাইব্রেরি ফাইলকে অবজেক্ট কোডের সাথে যুক্ত করে।

অনুশীলনের প্রশ্ন

সৃজনশীল প্রশ্ন

সৃজনশীল প্রশ্ন ১

নিপা সি প্রোগ্রামিং ল্যাব ক্লাসে একটি ক্যালকুলেটর প্রোগ্রাম তৈরি করছিল। প্রোগ্রামটি রান করার পর সে দেখল, দশমিক যুক্ত সংখ্যার গুণফলের ফলাফলে দশমিকের পর অপ্রয়োজনীয় অনেকগুলো শূন্য আসছে (যেমন: ২৫.৫০০০০)। সে চাচ্ছে আউটপুটে দশমিকের পর মাত্র দুই ঘর (যেমন: ২৫.৫০) প্রদর্শিত হোক। বিষয়টি নিয়ে সে তার শিক্ষকের সহায়তা চাইল।

ক) scanf() ফাংশনের মূল কাজ কী?
খ) scanf() ফাংশনে ভেরিয়েবলের আগে & (Ampersand) চিহ্নটি কেন ব্যবহার করা হয়? ব্যাখ্যা কর।
গ) উদ্দীপকে উল্লিখিত নিপার সমস্যাটি সমাধানের উপায় ব্যাখ্যা কর।
ঘ) getchar()putchar() ফাংশনের সাথে scanf()printf() ফাংশনের ব্যবহারের তুলনামূলক বিশ্লেষণ কর।

উত্তর

(ক) scanf() হলো C ভাষার একটি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন যা ব্যবহারকারীর কাছ থেকে বা কিবোর্ড থেকে ফরম্যাটেড ইনপুট গ্রহণ করার জন্য ব্যবহৃত হয়।

(খ) scanf() ফাংশনে & (Ampersand) চিহ্নটি ভেরিয়েবলের মেমরি অ্যাড্রেস বা ঠিকানা নির্দেশ করার জন্য ব্যবহার করা হয়। যখন আমরা কোনো ইনপুট নিই, তখন সেই মানটি মেমোরির নির্দিষ্ট ঠিকানায় জমা করতে হয়। & চিহ্নটি কম্পাইলারকে বলে দেয় যে, ইনপুটকৃত মানটি ওই ভেরিয়েবলের জন্য বরাদ্দকৃত মেমরি লোকেশনে সংরক্ষণ করতে হবে। এটি ছাড়া ইনপুট সঠিকভাবে ভেরিয়েবলে জমা হবে না।

(গ) উদ্দীপকে নিপা আউটপুট ফরম্যাটিং সংক্রান্ত সমস্যায় পড়েছে। ডিফল্টভাবে ফ্লোটিং পয়েন্ট বা দশমিক যুক্ত সংখ্যা প্রিন্ট করলে সি ল্যাঙ্গুয়েজে দশমিকের পর ৬ ঘর পর্যন্ত প্রদর্শিত হয়। নিপা চাচ্ছে দশমিকের পর মাত্র ২ ঘর দেখতে।

এই সমস্যা সমাধানের জন্য printf() ফাংশনে ফরম্যাট স্পেসিফায়ার পরিবর্তন করতে হবে। সাধারণ %f এর পরিবর্তে %.2f ব্যবহার করতে হবে। এখানে .2 নির্দেশ করে যে দশমিকের পর ঠিক দুই ঘর মান প্রদর্শিত হবে এবং প্রয়োজনে সংখ্যাটি রাউন্ড (round) করা হবে।

উদাহরণস্বরূপ, নিপার কোডে যদি printf("Result: %f", result); থাকে, তবে সেটি পরিবর্তন করে printf("Result: %.2f", result); লিখলে আউটপুট ২৫.৫০০০০ এর বদলে ২৫.৫০ দেখাবে।

(ঘ) getchar()putchar() এবং scanf()printf() উভয় জোড়াই সি ল্যাঙ্গুয়েজে ইনপুট-আউটপুট ফাংশন হিসেবে ব্যবহৃত হয়, তবে তাদের কার্যপরিধি ও ব্যবহারে পার্থক্য রয়েছে।

তুলনামূলক বিশ্লেষণ:

  1. ডেটা টাইপ: getchar()putchar() ফাংশন শুধুমাত্র একটি একক ক্যারেক্টার (Single Character) ইনপুট নেওয়া ও আউটপুট দেখানোর জন্য ব্যবহৃত হয়। অন্যদিকে, scanf()printf() বহুমুখী ফাংশন যা ক্যারেক্টার, ইন্টিজার, ফ্লোট, স্ট্রিং ইত্যাদি বিভিন্ন ধরনের ডেটা ফরম্যাট করে ইনপুট ও আউটপুট দিতে পারে।

  2. ফরম্যাটিং: scanf()printf() এ ফরম্যাট স্পেসিফায়ার (যেমন %d, %f) ব্যবহার করে ডেটাকে ইচ্ছামতো সাজানো যায়, যা getchar()putchar() এ সম্ভব নয়।

  3. মেমরি ব্যবহার: getchar() সাধারণত দ্রুত কাজ করে কারণ এটি কেবল একটি বাইট রিড করে, কিন্তু scanf() কে ফরম্যাট স্ট্রিং প্রসেস করতে হয় বলে এটি তুলনামূলকভাবে ভারী।

  4. ব্যবহারের ক্ষেত্র: যখন কেবল একটি বর্ণ বা কি-স্ট্রোক নেওয়ার প্রয়োজন হয়, তখন getchar() উত্তম। কিন্তু জটিল গাণিতিক হিসাব বা বিস্তারিত তথ্য প্রদর্শনের জন্য printf()scanf() অপরিহার্য।

সুতরাং, সাধারণ ও বহুমুখী কাজের জন্য scanf()printf() বেশি উপযোগী, আর নির্দিষ্ট ও ক্ষুদ্র পরিসরে একক ক্যারেক্টার নিয়ে কাজের জন্য getchar()putchar() ব্যবহৃত হয়।


সৃজনশীল প্রশ্ন ২

একাদশ শ্রেণির ছাত্ররা বৃত্তের ক্ষেত্রফল নির্ণয়ের জন্য একটি সি প্রোগ্রাম লিখল। তারা ব্যাসার্ধ r ইনপুট নিল এবং 3.1416 * r * r সূত্র ব্যবহার করে ক্ষেত্রফল বের করল। শিক্ষক প্রোগ্রামটি দেখে বললেন, "তোমরা পাই ($\pi$) এর মান সরাসরি ৩.১৪১৬ না লিখে এবং ব্যাসার্ধের বর্গ নির্ণয়ে সাধারণ গুণন না করে লাইব্রেরি ফাংশন ব্যবহার করলে প্রোগ্রামটি আরও মানসম্মত ও নিখুঁত হতো।"

ক) স্ট্যান্ডার্ড লাইব্রেরি ফাংশন কী?
খ) গাণিতিক কাজের জন্য math.h হেডার ফাইলটি কেন প্রয়োজন?
গ) শিক্ষকের পরামর্শ অনুযায়ী লাইব্রেরি ফাংশন ব্যবহার করে উদ্দীপকের প্রোগ্রামটি লেখ।
ঘ) "যদি ব্যাসার্ধের মান ঋণাত্মক ইনপুট দেওয়া হয় তবে ক্ষেত্রফল নির্ণয় অযৌক্তিক"—এই সমস্যা এড়াতে ইনপুট ভ্যালিডেশনের গুরুত্ব ও প্রয়োগ বিশ্লেষণ কর।

উত্তর

(ক) স্ট্যান্ডার্ড লাইব্রেরি ফাংশন হলো সি ল্যাঙ্গুয়েজের বিল্ট-ইন ফাংশন যা নির্দিষ্ট কিছু কাজ (যেমন ইনপুট-আউটপুট, গাণিতিক হিসাব) করার জন্য আগে থেকেই তৈরি করে রাখা হয়েছে এবং হেডার ফাইলের মাধ্যমে প্রোগ্রামে ব্যবহার করা যায়।

(খ) সি প্রোগ্রামে জটিল গাণিতিক হিসাব-নিকাশ করার জন্য math.h হেডার ফাইলটি প্রয়োজন। এতে বিভিন্ন গাণিতিক ফাংশন যেমন—বর্গমূল নির্ণয়ের জন্য sqrt(), ঘাত বা পাওয়ার নির্ণয়ের জন্য pow(), সাইন-কস মান বের করার জন্য sin(), cos() ইত্যাদি ডিফাইন করা থাকে। এই হেডার ফাইল যুক্ত না করলে কম্পাইলার এসব গাণিতিক ফাংশন চিনতে পারে না এবং এরর প্রদর্শন করে।

(গ) শিক্ষকের পরামর্শ অনুযায়ী math.h লাইব্রেরি ব্যবহার করে বৃত্তের ক্ষেত্রফল নির্ণয়ের প্রোগ্রামটি নিচে দেওয়া হলো। এখানে পাই ($\pi$) এর মানের জন্য M_PI ধ্রুবক (যা math.h এ থাকে) এবং বর্গের জন্য pow() ফাংশন ব্যবহার করা হয়েছে।

#include <stdio.h>
#include <math.h>

int main() {
    double r, area;

    printf("বৃত্তের ব্যাসার্ধ ইনপুট দিন: ");
    scanf("%lf", &r);

    // শিক্ষকের পরামর্শ অনুযায়ী pow() ফাংশন ব্যবহার
    // M_PI হলো math.h এ ডিফাইন করা পাই এর মান
    area = M_PI * pow(r, 2);

    printf("বৃত্তের ক্ষেত্রফল: %.2lf\n", area);

    return 0;
}

(বি:দ্র: কিছু কম্পাইলারে M_PI সরাসরি কাজ না করলে 3.141592653589793 ব্যবহার করা যেতে পারে, তবে pow(r, 2) ব্যবহারই এখানে মুখ্য।)

(ঘ) উদ্দীপকের প্রোগ্রামে ব্যাসার্ধের মান ঋণাত্মক হলে গাণিতিকভাবে সেটি বৃত্ত হতে পারে না, কারণ দূরত্ব বা দৈর্ঘ্য ঋণাত্মক হয় না। কিন্তু কম্পিউটার প্রোগ্রামে ঋণাত্মক মান ইনপুট দিলে সূত্র অনুযায়ী (-r) * (-r) পজিটিভ হয়ে ক্ষেত্রফল বের করে দেবে, যা বাস্তবত ভুল। একে লজিক্যাল এরর বলা যায়।

ইনপুট ভ্যালিডেশনের গুরুত্ব:
একটি ভালো সফটওয়্যারের প্রধান গুণ হলো এটি ভুল ইনপুট শনাক্ত করতে পারে। ব্যবহারকারী ভুলবশত বা ইচ্ছাকৃতভাবে নেগেটিভ মান দিলে প্রোগ্রামটি যেন ভুল ফলাফল না দেখিয়ে সতর্কবার্তা দেয়, সেটাই ইনপুট ভ্যালিডেশন।

প্রয়োগ বিশ্লেষণ:
প্রোগ্রামটিতে if-else কন্ডিশন ব্যবহার করে এই সমস্যা সমাধান করা যায়:

if (r >= 0) {
    area = M_PI * pow(r, 2);
    printf("Area: %lf", area);
} else {
    printf("Error: Radius cannot be negative.");
}

এই ভ্যালিডেশন অংশটুকু যুক্ত করলে প্রোগ্রামটি রোবস্ট (Robust) হবে। অর্থাৎ, এটি ভুল ডেটা প্রসেস করে বিভ্রান্তিকর তথ্য দেবে না বরং ব্যবহারকারীকে সঠিক ইনপুট দিতে বাধ্য করবে। বাস্তব জীবনের সফটওয়্যার ডেভেলপমেন্টে ডেটার নির্ভুলতা ও বিশ্বাসযোগ্যতা বজায় রাখতে ইনপুট ভ্যালিডেশন অপরিহার্য।

এমসিকিউ

১. সি প্রোগ্রামে আউটপুট প্রদর্শনের জন্য কোন লাইব্রেরি ফাংশনটি ব্যবহৃত হয়?

ক) scan()
খ) printf()
গ) print()
ঘ) output()

সঠিক উত্তর: খ) printf()

ব্যাখ্যা: সি ভাষায় printf() হলো একটি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন যা stdio.h হেডার ফাইলের অন্তর্ভুক্ত। এটি কনসোলে বা স্ক্রিনে টেক্সট বা ভেরিয়েবলের মান আউটপুট হিসেবে দেখাতে ব্যবহৃত হয়।


২. scanf() ফাংশনে পূর্ণসংখ্যা (integer) ইনপুট নেওয়ার জন্য কোন ফরম্যাট স্পেসিফায়ার ব্যবহার করা হয়?

ক) %f
খ) %c
গ) %d
ঘ) %s

সঠিক উত্তর: গ) %d

ব্যাখ্যা: %d স্পেসিফায়ারটি ডেসিমাল ইন্টিজার বা পূর্ণসংখ্যার মান ইনপুট নেওয়া বা আউটপুট দেখানোর জন্য ব্যবহৃত হয়। %f ফ্লোট, %c ক্যারেক্টার এবং %s স্ট্রিং এর জন্য ব্যবহৃত হয়।


৩. নিচের কোনটি সঠিক স্টেটমেন্ট?

ক) printf("%d", &a);
খ) scanf("%d", a);
গ) scanf("%d", &a);
ঘ) print("%d", a);

সঠিক উত্তর: গ) scanf("%d", &a);

ব্যাখ্যা: scanf() ফাংশনে ইনপুট নেওয়া মানটি মেমোরির নির্দিষ্ট ঠিকানায় রাখতে হয়, তাই ভেরিয়েবলের নামের আগে & (অ্যাড্রেস অফ অপারেটর) ব্যবহার করতে হয়। printf() এ সাধারণত & লাগে না।


৪. printf("%.2f", 5.6789); কোডটির আউটপুট কী হবে?

ক) 5.6789
খ) 5.67
গ) 5.68
ঘ) 5.7

সঠিক উত্তর: গ) 5.68

ব্যাখ্যা: %.2f ফরম্যাট স্পেসিফায়ারটি দশমিকের পর দুই ঘর পর্যন্ত মান প্রদর্শন করে। যেহেতু তৃতীয় ঘরে ৮ আছে (যা ৫ এর চেয়ে বড়), তাই দ্বিতীয় ঘরের মান (৭) এক বেড়ে ৮ হবে (রাউন্ড আপ)। তাই আউটপুট ৫.৬৮।


৫. সি ভাষায় নতুন লাইন (New Line) তৈরি করতে কোন এস্কেপ সিকোয়েন্স ব্যবহৃত হয়?

ক) \t
খ) \n
গ) \a
ঘ) \\

সঠিক উত্তর: খ) \n

ব্যাখ্যা: \n (New Line) এস্কেপ সিকোয়েন্সটি কার্সরকে পরবর্তী লাইনের শুরুতে নিয়ে যায়। \t ট্যাব বা ফাঁকা জায়গা তৈরি করে।


৬. math.h হেডার ফাইলে নিচের কোন ফাংশনটি থাকে না?

ক) sqrt()
খ) pow()
গ) printf()
ঘ) sin()

সঠিক উত্তর: গ) printf()

ব্যাখ্যা: printf() ফাংশনটি stdio.h (Standard Input Output) হেডার ফাইলের অন্তর্ভুক্ত। বাকি তিনটি (sqrt, pow, sin) গাণিতিক কাজের জন্য math.h এ থাকে।


৭. sqrt(25) ফাংশনটির কাজ কী?

ক) ২৫ এর বর্গ নির্ণয় করা
খ) ২৫ এর বর্গমূল নির্ণয় করা
গ) ২৫ এর পাওয়ার বের করা
ঘ) ২৫ প্রিন্ট করা

সঠিক উত্তর: খ) ২৫ এর বর্গমূল নির্ণয় করা

ব্যাখ্যা: sqrt() ফাংশনটি কোনো ধনাত্মক সংখ্যার বর্গমূল (Square Root) নির্ণয় করে। ২৫ এর বর্গমূল ৫।


৮. নিচের কোন এস্কেপ সিকোয়েন্সটি হরাইজন্টাল ট্যাব (Horizontal Tab) এর জন্য ব্যবহৃত হয়?

ক) \v
খ) \h
গ) \t
ঘ) \b

সঠিক উত্তর: গ) \t

ব্যাখ্যা: \t এস্কেপ সিকোয়েন্সটি হরাইজন্টাল ট্যাব বা নির্দিষ্ট পরিমাণ ফাঁকা জায়গা (Space) তৈরি করতে ব্যবহৃত হয়।


৯. pow(2, 3) এর মান কত?

ক) ৫
খ) ৬
গ) ৮
ঘ) ৯

সঠিক উত্তর: গ) ৮

ব্যাখ্যা: pow(base, exponent) ফাংশনটি ভিত্তির ওপর ঘাত বা পাওয়ার হিসেবে কাজ করে। এখানে ২ এর পাওয়ার ৩ ($2^3$), যার মান ৮।


১০. getch() ফাংশনটি কোন হেডার ফাইলের অন্তর্ভুক্ত?

ক) stdio.h
খ) conio.h
গ) math.h
ঘ) stdlib.h

সঠিক উত্তর: খ) conio.h

ব্যাখ্যা: getch() (Get Character) ফাংশনটি কনসোল ইনপুট-আউটপুট হেডার ফাইল conio.h এর অন্তর্ভুক্ত। এটি সাধারণত আউটপুট স্ক্রিন ধরে রাখতে ব্যবহৃত হয়।


১১. নিচের কোনটি ইনপুট ফাংশন?

ক) printf()
খ) puts()
গ) gets()
ঘ) main()

সঠিক উত্তর: গ) gets()

ব্যাখ্যা: gets() একটি ইনপুট ফাংশন যা স্ট্রিং ইনপুট নিতে ব্যবহৃত হয়। printfputs আউটপুট ফাংশন। main হলো প্রোগ্রামের প্রধান ফাংশন।


১২. %c ফরম্যাট স্পেসিফায়ারটি কী ধরনের ডেটার জন্য ব্যবহৃত হয়?

ক) পূর্ণসংখ্যা (Integer)
খ) ভগ্নাংশ (Float)
গ) বর্ণ বা ক্যারেক্টার (Character)
ঘ) দ্বিগুণ প্রিসিশন (Double)

সঠিক উত্তর: গ) বর্ণ বা ক্যারেক্টার (Character)

ব্যাখ্যা: সি ভাষায় একক বর্ণ বা char টাইপ ডেটা ইনপুট বা আউটপুট করতে %c ব্যবহার করা হয়।


১৩. abs(-10) এর আউটপুট কত?

ক) -10
খ) 10
গ) 0
ঘ) Error

সঠিক উত্তর: খ) 10

ব্যাখ্যা: abs() ফাংশনটি কোনো পূর্ণসংখ্যার পরম মান (Absolute Value) নির্ণয় করে, অর্থাৎ নেগেটিভ মানকে পজিটিভ করে দেয়।


১৪. printf("//Hello"); কোডটির আউটপুট কী হবে?

ক) Hello
খ) /Hello
গ) //Hello
ঘ) Error

সঠিক উত্তর: গ) //Hello

ব্যাখ্যা: ডাবল কোটেশনের মধ্যে যা লেখা হয়, printf তাই প্রিন্ট করে। এখানে // কমেন্ট নয় বরং টেক্সট হিসেবে গণ্য হবে। তবে \ প্রিন্ট করতে \\ লাগে, কিন্তু / সাধারণ ক্যারেক্টার।


১৫. সি প্রোগ্রামে stdio.h ব্যবহার না করলে কোন ফাংশনটি কাজ করবে না?

ক) clrscr()
খ) sqrt()
গ) scanf()
ঘ) strcpy()

সঠিক উত্তর: গ) scanf()

ব্যাখ্যা: scanf() হলো স্ট্যান্ডার্ড ইনপুট ফাংশন যা stdio.h এ ডিফাইন করা থাকে। তাই এই হেডার ফাইল ছাড়া এটি কাজ করবে না।


১৬. ceil(3.2) ফাংশনটির আউটপুট কত হবে?

ক) 3.0
খ) 3.2
গ) 4.0
ঘ) 3.5

সঠিক উত্তর: গ) 4.0

ব্যাখ্যা: ceil() ফাংশনটি কোনো ভগ্নাংশ সংখ্যাকে তার পরবর্তী বা উপরের পূর্ণসংখ্যায় উন্নীত করে (Ceiling)। তাই ৩.২ এর সিলিং মান ৪.০।


১৭. floor(3.9) ফাংশনটির আউটপুট কত হবে?

ক) 3.0
খ) 4.0
গ) 3.9
ঘ) 3.5

সঠিক উত্তর: ক) 3.0

ব্যাখ্যা: floor() ফাংশনটি কোনো ভগ্নাংশ সংখ্যাকে তার নিচের পূর্ণসংখ্যায় নামিয়ে দেয় (Floor)। তাই ৩.৯ হলেও এটি ৩.০ হবে।


১৮. নিচের কোনটি সঠিক ফরম্যাট স্পেসিফায়ার নয়?

ক) %d
খ) %f
গ) %x
ঘ) %z

সঠিক উত্তর: ঘ) %z

ব্যাখ্যা: %d (int), %f (float), %x (hexadecimal) সঠিক স্পেসিফায়ার। কিন্তু %z সাধারণ সি স্ট্যান্ডার্ডে প্রচলিত স্পেসিফায়ার নয় (তবে size_t এর জন্য %zu আছে, কিন্তু শুধু %z নয়)।


১৯. printf("5" + "5"); এর ফলাফল কী? (ভুল কোড শনাক্তকরণ)

ক) 10
খ) 55
গ) Compile Error
ঘ) Garbage Value/Error

সঠিক উত্তর: গ) Compile Error

ব্যাখ্যা: সি ভাষায় স্ট্রিং বা ক্যারেক্টার অ্যারে এভাবে + চিহ্ন দিয়ে যোগ করা যায় না। এটি সিনট্যাক্স এরর বা পয়েন্টার এরর দেখাবে। স্ট্রিং কনক্যাটিনেট করার জন্য strcat() ব্যবহার করতে হয়।


২০. printf ফাংশনে ডাবল কোটেশন (") প্রিন্ট করার জন্য কোনটি লিখতে হয়?

ক) "
খ) \"
গ) \'
ঘ) \\"

সঠিক উত্তর: খ) \"

ব্যাখ্যা: printf এর সিনট্যাক্সে ডাবল কোটেশন বিশেষ অর্থ বহন করে। তাই স্ট্রিংয়ের ভেতরে ডাবল কোটেশন প্রিন্ট করতে চাইলে এস্কেপ ক্যারেক্টার \ সহ \" লিখতে হয়।


২১. নিচের উদ্দীপকটি পড় এবং প্রশ্নের উত্তর দাও:

int a = 10;
printf("Val=%d", a);

আউটপুট কী হবে?

ক) Val=10
খ) Val=a
গ) 10
ঘ) Val%d

সঠিক উত্তর: ক) Val=10

ব্যাখ্যা: ডাবল কোটেশনের ভেতরের টেক্সট হুবহু প্রিন্ট হবে এবং %d এর জায়গায় a এর মান ১০ বসবে।


২২. নিচের কোনটি ইনপুট বাফার পরিষ্কার করতে ব্যবহৃত হয়?

ক) clrbfr()
খ) fflush(stdin)
গ) clean()
ঘ) input()

সঠিক উত্তর: খ) fflush(stdin)

ব্যাখ্যা: fflush(stdin) ফাংশনটি স্ট্যান্ডার্ড ইনপুট বাফারের মেমরি পরিষ্কার বা ফ্লাশ করার জন্য ব্যবহৃত হয়, যাতে পরবর্তী ইনপুটে আগের কোনো গার্বেজ ভ্যালু বা এন্টার কি সমস্যা না করে।


২৩. সি ভাষায় char টাইপ ভেরিয়েবলের মেমরি সাইজ কত?

ক) ২ বাইট
খ) ৪ বাইট
গ) ১ বাইট
ঘ) ৮ বাইট

সঠিক উত্তর: গ) ১ বাইট

ব্যাখ্যা: সি স্ট্যান্ডার্ড অনুযায়ী char টাইপ ডেটা মেমোরিতে ১ বাইট (৮ বিট) জায়গা দখল করে।


২৪. নিচের কোডটির আউটপুট কী?

printf("%d", 10/3);

ক) 3.33
খ) 3
গ) 3.0
ঘ) 10

সঠিক উত্তর: খ) 3

ব্যাখ্যা: ১০ এবং ৩ উভয়ই পূর্ণসংখ্যা (integer)। সি ভাষায় দুটি পূর্ণসংখ্যার ভাগফল একটি পূর্ণসংখ্যা হয়, দশমিক অংশ বাদ যায়। তাই ৩.৩৩ না হয়ে শুধু ৩ হবে।


২৫. হেডার ফাইল stdio.h এর পূর্ণরূপ কী?

ক) Standard Input Output
খ) Studio Input Output
গ) Standard Integer Output
ঘ) Student Input Output

সঠিক উত্তর: ক) Standard Input Output

ব্যাখ্যা: stdio শব্দটি Standard Input Output থেকে এসেছে। এটি সি ভাষার প্রধান ইনপুট-আউটপুট লাইব্রেরি।