মনে করো আমি একটি প্রোগ্রাম লিখতে চাচ্ছি যেটি একটি ত্রিভুজের ক্ষেত্রফল নির্ণয় করবে । ত্রিভুজের ক্ষেত্রফল নির্ণয়ের সূত্রটি কী?
তো, একটি ত্রিভুজের ক্ষেত্রফল বের করতে আমাদের অবশ্যই ভূমি এবং উচ্চতার মান জানা থাকতে হবে তাই না? এজন্য আমাদের প্রোগ্রামে এমন ব্যবস্থা রাখতে হবে যাতে প্রোগ্রামটি যে ব্যক্তি ব্যবহার করবে সে যেন প্রোগ্রামটিকে ভূমি এবং উচ্চতার মান জানাতে পারে । একেই আমরা বলছি ব্যবহারকারীর ইনপুট গ্রহণ !
আমরা আমাদের ত্রিভুজের ক্ষেত্রফল বের করার প্রোগ্রামে ফেরত যাই । এজন্য আমাদের কী কী ভ্যারিয়েবল লাগবে? প্রথমত আমাদের ভূমি এবং উচ্চতার জন্য দুটি ভ্যারিয়েবল লাগবে । আবার, হিসাব করার পরে ক্ষেত্রফলটিকেও আরেকটি ভ্যারিয়েবলে রাখতে হবে । তো আমাদের মোট ভ্যারিয়েবল লাগবে তিনটি ।
আচ্ছা এই ভ্যারিয়েবল গুলোর ডাটা টাইপ কী হবে? ত্রিভুজের ভূমি ও বাহু যেকোনো বাস্তব সংখ্যা হতে পারে, ক্ষেত্রফলের ক্ষেত্রেও একই কথা প্রযোজ্য । তাই আমরা এক্ষেত্রে ডাটাটাইপ ব্যবহার করবো । চলো ভ্যারিয়েবল গুলো ডিক্লেয়ার করে ফেলি !
1#include <stdio.h>
2
3int main()
4{
5 float Area, base, height;
6 return 0;
7}
এই মুহূর্তে এই প্রোগ্রামটি কোনো কাজই করছে না । শুধুমাত্র ভ্যারিয়েবল গুলো ডিক্লেয়ার করে প্রোগ্রাম থেকে বের হয়ে যাচ্ছে ।
চলো এখন আমরা এর মান গুলো ইনপুট নেয়ার ব্যবস্থা করি ।
আগেই বলেছি এজন্য ফাংশনটি ব্যবহার করা হবে । নিচের প্রোগ্রামটি লক্ষ্য করোঃ
1#include <stdio.h>
2
3int main()
4{
5 float Area, base, height;
6 printf("Enter Value of base: ");
7 scanf("%f", &base);
8 return 0;
9}
এবার দেখবে তুমি এর ভ্যালু ইনপুট দিতে পারছো । প্রিন্ট হওয়ার পরে কার্সরটি সেখানে আটকে থাকবে, তুমি যেকোনো একটি নাম্বার লিখে Enter প্রেস করলে সেটি ইনপুট হিসেবে গৃহীত হবে এবং প্রোগ্রামটি চলবে । এবার ব্যাপারটি বুঝিয়ে বলি,
প্রথমত, এ প্রথমে তোমাকে একটি ফরমেট স্পেসিফায়ার পাঠাতে হবে, যাতে ফাংশনটি বুঝতে পারে তুমি কোন ডাটাটাইপের ভ্যারিয়েবলের মান ইনপুট নিতে চাচ্ছ । যেহেতু আমরা এই উদাহরনে টাইপের মান গ্রহণ করতে চাচ্ছি তাই আমরা এর জন্য ফরমেট স্পেসিফায়ার ব্যবহার করেছি ।
এরপরে তুমি ইনপুটের মানটিকে যেই ভ্যারিয়েবলে রাখতে চাও সেই ভ্যারিয়েবলের অ্যাড্রেসটি পাঠাতে হবে । লক্ষ্য করো, আমরা ভ্যারিয়েবলটিকেই না পাঠিয়ে তার অ্যাড্রেসটিকে পাঠানোর কথা বলেছি, আর একারণে আমরা ভ্যারিয়েবলের নামের আগে একটি চিহ্ন ব্যবহার করেছি । দ্বারা ঐ ভ্যারিয়েবলের অ্যাড্রেসকে নির্দেশ করা হয় ।
ভ্যারিয়েবলের অ্যাড্রেস সম্পর্কে পয়েন্টার অধ্যায়ে বিস্তারিত আলোচনা করা হবে ।
উপরের উদাহরণে আমরা নামের ভ্যারিয়েবলে ইনপুট গ্রহণ করেছি । তো চলো আমরা ইনপুট গ্রহনের পরে ভ্যারিয়েবলটির মান প্রিন্ট করে দেখি ! তাহলেই তো বোঝা যাবে যে আমাদের ভ্যারিয়েবলে ইনপুটের মানটিই রাখা হয়েছে কি না !
1#include <stdio.h>
2
3int main()
4{
5 float Area, base, height;
6 printf("Enter Value of base: ");
7 scanf("%f", &base);
8 printf("Value of base is %f", base);
9 return 0;
10}
এ প্রোগ্রামটি রান করলে নিচের মতো আউটপুট আসবে ।
Enter Value of base: 10
Value of base is 10.000000
দেখো, আমরা উপরের লাইনে ইনপুট দিয়েছি যা আবারো ফেরত পেয়েছি এর ভ্যালু হিসেবে ।
তো চলো এখন আমরা এর মানটিকেও ইনপুট নিয়ে ফেলি !
1#include <stdio.h>
2
3int main()
4{
5 float Area, base, height;
6 printf("Enter Value of base: ");
7 scanf("%f", &base);
8 printf("Enter Value of height: ");
9 scanf("%f", &height);
10 printf("Value of base is %f", base);
11 printf("Value of height is %f", height);
12 return 0;
13}
এবারের আউটপুট আসবে এরকমঃ
Enter Value of base: 5
Enter Value of height: 19
Value of base is 5.000909Value of height is 10.000000
এবার তো একটু সমস্যা হয়ে গেলো । কারণ এবং লাইন দুটির আউটপুট একই লাইনে চলে এসেছে । তাই আমাদের আউটপুট বুঝতে সমস্যা হচ্ছে । কেমন হতো যদি আমরা এখানে একটি লাইন ব্রেক দিতে পারতাম যাতে দুটি এর আউটপুট আলাদা আলাদা লাইনে আসে?
লাইন ব্রেক দিতে হলে আমাদের কে ব্যবহার করতে হবে । নিচের কোডটি দেখোঃ
1#include <stdio.h>
2
3int main()
4{
5 float Area, base, height;
6 printf("Enter Value of base: ");
7 scanf("%f", &base);
8 printf("Enter Value of height: ");
9 scanf("%f", &height);
10 printf("Value of base is %f \n", base);
11 printf("Value of height is %f", height);
12 return 0;
13}
এখানে দেখো এর যেখানে আছে সেখান থেকে পরের অংশ গুলো নিচের লাইনে প্রিন্ট হয়েছে । এবার আমাদের আউটপুট ঠিকঠাক আসবে ।
আচ্ছা তো এখন আমাদের কাছে এবং দুটি ভ্যারিয়েবলের মানই আছে । শুধু ব্যবহার করাটা বাকি । একটু আগে যে সূত্রটা দেখেছো মনে আছে তো?
তো বের করতে হলে আমাদেরকে গুণ করতে হবে । সিতে কীভাবে গুণ করে তা আমি তোমাদের এখনো দেখাইনি । এ বিষয়ে operators অধ্যায়ে বিস্তারিত আলোচনা করা হয়েছে । কিন্তু আপাতত এটুকু বলতেই পারি যে দুটি ভ্যারিয়েবল বা দুটি সংখ্যা কে দ্বারা গুন করা হয় । যেমন, ২ ও ৩ এর গুনফল a নামক ভ্যারিয়েবলে রাখতে আমি লিখবো । আবার, দুটি ভ্যারিয়েবল a ও b এর ভ্যারিয়েবল গুণ করে c তে রাখতে আমরা লেখবো । আমরা একাধিক মান ব্যবহার করলেও সমস্যা নেই । যেমনঃ
তো এখানে আমাদের কী করতে হবে নিশ্চয়ই বুঝে গেছো? হবে । এরপরে আমরা এর মানকে প্রিন্ট করে দেবো । চলো পুরো প্রোগ্রামটিকে লিখে ফেলিঃ
1#include <stdio.h>
2
3int main()
4{
5 float Area, base, height;
6 printf("Enter Value of base: ");
7 scanf("%f", &base);
8 printf("Enter Value of height: ");
9 scanf("%f", &height);
10 Area = 0.5 * base * height;
11 printf("\n\nThe area of the triangle is: %f", Area);
12 return 0;
13}
এবার আউটপুটটি দেখোঃ
Enter Value of base: 5
Enter Value of height: 10
The area of the triangIe is: 25.000000
এখানে আমরা দুটি প্রিন্ট করেছি যাতে ক্ষেত্রফলের মানটি দুই লাইন নিচে প্রিন্ট হয় । এতে আমাদের বুঝতে সুবিধা হবে আর কি !
উপরের উদাহরণে আমরা প্রতিবার ব্যবহারকারীরকে একটি ভ্যারিয়েবলের মান ইনপুট দেবার জন্য বলেছি বা Prompt করেছি । কিন্তু যদি এমন হয় যে আমরা একটি Prompt এই একাধিক ভ্যারিয়েবলের মান ইনপুট দিতে চাই? এজন্য আমরা নিচের সিনট্যাক্স ব্যবহার করতে পারিঃ
1#include <stdio.h>
2
3int main()
4{
5 float Area, base, height;
6 printf("Enter Value of base and height: ");
7 scanf("%f%f", &base, &height);
8 Area = 0.5 * base * height;
9 printf("\n\nThe area of the triangle is: %f", Area);
10 return 0;
11}
এবার আমরা একবারেই দুটি ভ্যারিয়েবলের মান ইনপুট নিয়ে নিতে পারছিঃ
Enter Value of base and height: 5 10
The area of the triangle is: 25.000000
চাইলে আমরা একই সাথে অনেক ভ্যারিয়েবলের মান ইনপুট নিতে পারিঃ
1#include <stdio.h>
2
3int main()
4{
5 int a, b, c;
6 printf("Enter a b c: ");
7 scanf("%d%d%d", &a, &b, &c);
8 printf("Value of a b and c is: %d %d %d", a, b, c);
9 return 0;
10}
Enter a b c: 5 4 9
Value of a b and c is: 5 4 9
এবার তোমরা নিচের কোডটি রান করে দেখোঃ
1#include <stdio.h>
2
3int main()
4{
5 int a, b;
6 float c;
7 printf("Enter a b c: ");
8 scanf("%d%d%f", &a, &b, &c);
9 printf("Value of a b and c is: %d %d %f", a, b, c);
10 return 0;
11}
এর মানে একই লাইনে আমরা Integer এবং Float উভয় ধরনের ইনপুট নিতে পারলাম
এবার নিচের প্রোগ্রামটি দেখোঃ
1#include <stdio.h>
2
3int main()
4{
5 int a;
6 float b;
7 char c;
8 printf("Enter a b c: ");
9 scanf("%d%f%c", &a, &b, &c);
10 printf("Value of a b and c is: %d %f %c", a, b, c);
11 return 0;
12}
Enter a b c: 4 5.9 A
Value of a b and c is: 4 5.900000
এখানে এর মান প্রিন্ট হলো না কেন? কারণ আমরা ইনপুট দেয়ার সময়ে 4, 5.9 এবং A এর মধ্যে যে স্পেস দিয়েছি সেই স্পেস নিজেই কিন্তু একটা ক্যারেক্টার ! তাই A তে পৌছার আগেই একটি স্পেস পাওয়ায় c ভ্যারিয়েবলটিতে স্পেস রাখা হয়ে গিয়েছে !
এটি সমাধানের উপায় কী? সবচেয়ে সহজ উপায় হলো scanf এর স্ট্রিং টি তে একটু পরিবর্তন আনাঃ
1#include <stdio.h>
2
3int main()
4{
5 int a;
6 float b;
7 char c;
8 printf("Enter a b c: ");
9 scanf("%d %f %c", &a, &b, &c);
10 printf("Value of a b and c is: %d %f %c", a, b, c);
11 return 0;
12}
এবার দেখবে ঠিকঠিক মতো কাজ করবে ।