Sunday, May 5, 2013

[ সি প্রোগ্রামিং :- অধ্যায় দুই ] ডাটা টাইপ, ইনপুট ও আউটপুট ।



এ অধ্যায়ে আমরা কিছু ছোট ছোট প্রোগ্রাম লিখব । সবগুলো প্রোগ্রাম অবশ্যই কম্পিউটারে চালিয়ে দেখবেন এবং একটু পরিবর্তন করে কম্পাইল এ Build করার পর Run করার চেষ্টা করবেন ।

আমাদের প্রথম প্রোগ্রামটি হবে দুটি সংখ্যার যোগ করার প্রোগ্রাম । এখন কথা হচ্ছে, সংখ্যা গুলো তো কম্পিউটারের মেমোরিতে রাখতে হবে, সেই জটিল কাজটি কিভাবে করব ? চিন্তা নেই! সব প্রোগ্রামিং ল্যাঙ্গুয়েজে ভেরিয়েবল বলে একটি
জিনিস আছে যেটি কোন নির্দিষ্ট মান ধারণ করার জন্য ব্যবহার করা হয় । ভেরিয়েবলের একটি নাম দিতে হয়, তারপর ভেরিয়েবল = কোনো মান লিখে দিলে ভেরিয়েবলের ভিতর সেটি ঢুকে যায় । এটির সাথে কিন্তু গাণিতিক সমীকরণের কোনো সম্পর্ক নেই । চলুন প্রোগ্রামটি লিখে Build তারপর Run করাই, পরে ব্যাখ্যা করা যাবে ।

 #include <stdio.h>  
 int main()  
 {  
     int a;  
     int b;  
     int sum;  
     a = 50;  
     b = 60;  
     sum = a + b;  
     printf("Sum is %d", sum);  
     return 0;  
 }  
 প্রোগ্রাম: ২.১  




প্রোগ্রামটি Build এবং Run করান । আপনি স্ক্রিনে দেখবেন The sum is 110  ।

এখানে a, b, sum তিনটি ভেরিয়েবল (variable) আলাদা সংখ্যা ধারণ করে । প্রথমে আমাদের বলে দিতে হবে যে a, b, sum তিনটি ভেরিয়েবল আছে । এবং এগুলোতে কী ধরনের ডাটা থাকবে সেটিও বলে দিতে হবে । int a; দ্বারা আমরা কম্পাইলারকে বলছি a নামে একটি ভেরিয়েবল এই প্রোগ্রামে আছে যেটি একটি পূর্ণসংখ্যা (integer)-এর মান ধারণ করার জন্য ব্যবহার করা হবে । এই কাজটিকে বলে ভেরিয়েবল ডিক্লারেশন । আর int হচ্ছে ডাটা টাইপ, যেটি দেখে সি-এর কম্পাইলার বুঝবে যে এতে ইন্টিজার টাইপ ডাটা থাকবে । আরও বেশ কিছু ডাটা টাইপ আছে, সেগুলো আমরা আস্তে আস্তে দেখব । আমরা চাইলে একই টা্ইপের ভেরিয়েবলগুলো ডিক্লেয়ার করার সময় আলাদা লাইনে না লিখে একসঙ্গে কমা দিয়ে লিখতে পারতাম, যেমন: int a, b, sum; । আরো লক্ষ করবেন যে ভেরিয়েবল ডিক্লারেশনের শেষে সেমিকোলন ব্যবহার করতে হয় ।

এরপর আমি দুটি স্টেটমেন্ট লিখেছি:
a = 50;
b = 60;
এখানে a-এর মান 50 আর b-এর মান 60 বলে দিলাম (assign করলাম), যতক্ষণ না এটি আমরা পরিবর্তন করছি, কম্পাইলার a-এর মান 50 আর b-এর মান 60 ধরবে।

পরের স্টেটমেন্ট হচ্ছে: sum = a + b; । এতে বোঝায়, sum-এর মান হবে a + b-এর সমান, অর্থাৎ a ও b-এর যোগফল যে সংখ্যাটি হবে সেটি আমরা sum নামের ভেরিয়েবলে রেখে দিলাম (বা assign করলাম)।

এবারে যোগফলটি মনিটরে দেখাতে হবে, তাই আমরা printf ফাংশন ব্যবহার করব ।
Printf("The sum is %d", sum);

এখানে দেখুন printf ফাংশনের ভেতরে দুটি অংশ । প্রথম অংশে "The sum is %d" দিয়ে বোঝানো হয়েছে স্ক্রিনে প্রিন্ট করতে হবে The sum is এবং তার পরে একটি ইন্টিজার ভেরিয়েবলের মান যেটি %d-এর জাযগায় বসবে । তারপর কমা দিয়ে আমরা sum লিখে বুঝিয়ে দিয়েছি যে %d তে sum-এর মান প্রিন্ট করতে হবে । ইন্টিজারের জন্য যেমন %d ব্যবহার করলাম, অন্য ধরনের ভেরিয়েবলের জন্য অন্য কিছু লিখতে হবে, যেটি আমরা ব্যবহার করতে করতে শিখব । খুব ভালো হতো যদি আমি এখন একটি চার্ট লিখে দিতাম যে সি ল্যাঙ্গুয়েজে কী কী ডাটা টাইপ আছে, সেগুলো কী দিয়ে লেখে এবং প্রিন্ট করার জন্য কী করতে হবে আর আপনারা সেই চার্ট মুখস্থ করে ফেলতে । কিন্তু  শুধু শুধু মুখস্থ করার কোনো দরকার নেই, মুখস্থ করার প্রবণতা চিন্তাশক্তি কমায় আর প্রোগ্রামারদের জন্য চিন্তা করার ক্ষমতা খুবই গুরুত্বপূর্ণ ।

আমরা উপরের প্রোগ্রামটি চাইলে এভাবে লিখতে পারতাম:
 #include <stdio.h>  
 int main()  
 {  
     int a, b, sum;  
     a = 50;  
     b = 60;  
     sum = a + b;  
     printf("Sum is %d", sum);  
     return 0;  
 }  
 প্রোগ্রাম: ২.২  

আবার ভেরিয়েবল ডিক্লেয়ার করার সময় একই সঙ্গে অ্যাসাইনও করা যায়:
 #include <stdio.h>  
 int main()  
 {  
     int a = 50, b = 60, sum;  
     sum = a + b;  
     printf("Sum is %d", sum);  
     return 0;  
 }  
 প্রোগ্রাম: ২.৩ 

এখন আপনাদের জন্য একটি প্রশ্ন । নিচের প্রোগ্রামটির আউটপুট কী হবে ? 
 #include <stdio.h>  
 int main()   
 {  
     int x, y;  
     x = 1;  
     y = x;  
     x = 2;  
     printf("%d", y);  
     return 0;  
 }  
 প্রোগ্রাম: ২.৪  

কী মনে হয় ? আউটপুট 1 নাকি 2 ? আউটপুট হবে 1 কারণ প্রথমে কম্পাইলার দেখবে, x-এর মান 1 অ্যাসাইন করা হয়েছে (x = 1;) । তারপর x-এর মানটি আবার y-এ অ্যাসাইন করা হয়েছে (y = x;) । এখন y-এর মান 1 । তারপর আবার x-এর মান 2 অ্যাসাইন করা হয়েছে ।কিন্তু তাতে y-এর মানের কোন পরিবর্তন হবে না । প্রোগ্রামিংয়ে y = x; আসলে কোন সমীকরণ না যে এটি সবসময় সত্য হবে । '=' চিহ্ন দিয়ে একটি ভেরিয়েবলে নির্দিষ্ট কোনো মান রাখা হয় ।

এবার নিচের প্রোগ্রামটি দেখুন :

#include <stdio.h>  
 int main()  
 {  
     int a = 50, b = 60, sum;  
     sum = a + b;  
     printf("%d + %d = %d", a, b, sum);  
     return 0;  
 }  
 প্রোগ্রাম: ২.৫  

প্রোগ্রামটি মনিটরে কী প্রিন্ট করে ? চালিয়ে দেখুন । এখন আরেকবার printf("%d + %d = %d", a, b, sum); না লিখে, printf("%d + %d = %d", b, a, sum); লিখে প্রোগ্রামটি চালিয়ে দেখুন । এখন জিনিসটি চিন্তা করে বুঝে নিন ।
লেখা-পড়া করার সময় আমাদের মনে নানা বিষয়ে প্রশ্ন আসে, যার উত্তর আমরা বইতে খুঁজি, শিক্ষককে জিজ্ঞাসা করি, ইন্টারনেটে খুঁজি বা চিন্তা করে যুক্তি দাঁড় করিয়ে উত্তর বের করি । আমাদের দুর্ভাগ্য যে বেশিরভাগ ছেলেমেয়েই শেষ কাজটি করে না, কারণ নিজে নিজে চিন্তা করতে একটু সময় লাগে ও পরিশ্রম হয়, সেই সময় আর শ্রম তারা দিতে চায় না । আর আমাদের অভিভাবক, শিক্ষক ও ‍শিক্ষাব্যবস্থা চিন্তা করার জন্য কোনো পুরষ্কার দেয় না, বরং মুখস্থ করার জন্যই পুরষ্কার প্রদান করে ।

যা-হোক, প্রোগ্রামিংয়ের ব্যাপারে যখনই মনে কোনো প্রশ্ন আসবে, সঙ্গে সঙ্গে একটি প্রোগ্রাম লিখে ফেলবেন । দেখুন আপনার কম্পাইলার কী বলে । ধরা যাক, আমরা যদি int টাইপের ভেরিয়েবলে দশমিক যুক্ত সংখ্যা (বাস্তব সংখ্যা বা real number) ব্যবহার করতাম, তাহলে কী হতো ?

#include <stdio.h>  
 int main()  
 {  
     int a = 50.45, b = 60, sum;  
     sum = a + b;  
     printf("%d + %d = %d", a, b, sum);  
     return 0;  
 }  
 প্রোগ্রাম: ২.৬  

এখানে a-এর মান 50.45 ব্যবহার করলাম । এবারে প্রোগ্রাম চালান, দেখুন কী হয় । আবার মনে প্রশ্ন আসে যে, main ফাংশনের শেষ লাইনে return 0; ছাড়া প্রোগ্রাম চালিয়ে দেখুন কী হয় ।

আউটপুট হবে: 50 + 60 = 110 

সি কম্পাইলার a-এর মান 50 ধরেছে, যদিও আমরা 50.45 অ্যাসাইন করেছি । এই ব্যাপারটিকে বলে টাইপ কাস্ট (type cast) । বাস্তব সংখ্যা রাখার জন্য সি ভাষায় double নামের ডাটা টাইপ রয়েছে । টাইপ কাস্ট করে double সংখ্যাটিকে int-এ নেওয়া হয়েছে, এটি অটোমেটিক হয় । আবার কম্পাইলারকে বলেও দেওয়া যায়: int a = (int) 50.45 ।

int a = 50.99; এখানে a-এর মান হবে 50 । int a = -50.9; লিখলে a-এ এর মান হবে -50 । এক কথায় বললে double থেকে int-এ টাইপ কাস্ট করলে দশমিকের পরের অংশটি বাদ পড়ে যাবে ।

আরেকটি কথা । যেই ভেরিয়েবলকে টাইপ কাস্ট করা হচ্ছে, তার মান কিন্তু পরিবর্তন হয় না । টাইপ কাস্ট করা মানটি একটি ভেরিয়েবলে রাখা যায় । নিচের প্রোগ্রামটি কম্পিউটারে চালালেই বুঝতে পারবেন ।

#include <stdio.h>  
 int main()  
 {  
     int n;  
     double x;  
     x = 10.5;  
     n = (int)x;  
     printf("Value of n is %d\n", n);  
     printf("Value of x is %lf\n", x);  
     return 0;  
 }  
 প্রোগ্রাম: ২.৭  

প্রোগ্রামের আউটপুট দেখুন। x এর মান কিন্তু পরিবর্তন হয়নি। আর বুঝতেই পারছেন যে বাস্তব সংখ্যা রাখার জন্য সি-তে যে double টাইপের ভেরিয়েবল ব্যবহার করা হয়, তা প্রিন্ট করার সময় %lf ব্যবহার করতে হয়(এখানে ইংরেজী বড় হাতের L ব্যাবহার না করে, ছোট হাতের l ব্যাবহার করতে হয়) ।

int ডাটা টাইপে তো কেবল পূর্ণ সংখ্যা রাখা যায় । কিন্তু সেটি কী যেকোনো পূর্ণসংখ্যা ? উত্তরের জন্য একটি প্রোগ্রাম লিখি:

#include <stdio.h>  
 int main()  
 {  
     int a;  
     a = 1000;  
     printf("Value of a is %d", a);  
     a = -21000;  
     printf("Value of a is %d", a);  
     a = 10000000;  
     printf("Value of a is %d", a);  
     a = -10000000;  
     printf("Value of a is %d", a);  
     a = 100020004000503;  
     printf("Value of a is %d", a);  
     a = -4325987632;  
     printf("Value of a is %d", a);  
     return 0;  
 }  
 প্রোগ্রাম: ২.৮  

 এখানে আমরা a তে বিভিন্ন সংখ্যা অ্যাসাইন করলাম । সব মান কি ঠিকঠাক আসছে ? আসেনি । কেন আসেনি সেটি ব্যাখ্যা করার আগে একটি কথা বলে নিই । পরপর এতগুলো printf-এর কারণে তোমার কম্পিউটারের স্ক্রিনে নিশ্চয়ই দেখতে একটু অস্বস্তিকর লাগছে । প্রতিটি printf আপনারা এভাবে লিখতে পারেন: printf("Value of a is %d\n", a); । এখন printf ফাংশনে "" –এর ভিতরে \n লিখলে কী হয় সেটি আমি বলব না । আপনারা প্রোগ্রামটি চালালেই বুঝতে পারবে ।

a-এর সবগুলো মান কিন্তু ঠিকভাবে দেখা যায়নি, যেসব মান -214673648 থেকে 2147483647 পর্যন্ত কেবল সেগুলোই ঠিকঠাক প্রিন্ট হবে, কারণ এই রেজ্ঞের বাইরের সংখ্যা int টাইপের ভেরিয়েবলে রাখা যায় না । এটি হলো int টাইপের সংখ্যার সীমা । সি-তে int টাইপের ডাটার জন্য মেমোরিতে চার বাইট (byte) জায়গা ব্যবহৃত হয় চার বাইট মানে বত্রিশ বিট (1 byte = 8 bit) । প্রতি বিটে দুটি জিনিস রাখা যায়, 0 আর 1 । দুই বিটে রাখা যায় চারটি সংখ্যা (00, 01, 10, 11) তাহলে 32 বিটে রাখা যাবে: 2^32 টা সংখ্যা অর্থাৎ 4294967296 টি সংখ্যা । এখন অর্ধেক ধণাত্বক আর অর্ধেক ঋণাত্বক যদি রাখি, তাহলে -2146473648 থেকে -1 পর্যন্ত মোট 2146473648 টি সংখ্যা আবার 0 থেকে 2146473647 পর্যন্ত মোট 2146473648 টি সংখ্যা, সর্বমোট 4294967296 টি সংখ্যা । আশা করি, হিসাবটা বুঝতে পেরেছেন ।

এখন আমরা যোগ করার প্রোগ্রামটি লিখব যেটি সব বাস্তব সংখ্যা (real number) যোগ করতে পারবে । আপনাদের মনে করিয়ে দিই, পূর্ণসংখ্যা হচ্ছে, … -3, -2, -1, 0, 1, 2, 3 … ইত্যাদি । আর বাস্তব সংখ্যা হচ্ছে -5, -3, -2.43, 0, 0.49, 2.92 ইত্যাদি (সরলরেখার ওপর সব সংখ্যাই কিন্তু বাস্তব সংখ্যা) । 

 #include <stdio.h>  
 int main()  
 {  
     double a, b, sum;  
     a = 9.5;  
     b = 8.743;  
     sum = a + b;  
     printf("Sum is: %lf\n", sum);  
     printf("Sum is: %0.2lf\n", sum);  
     return 0;  
 }  
 প্রোগ্রাম: ২.৯ 
প্রোগ্রামটি কম্পাইল এবং রান করুন । আউটপুট হবে নিচের দুই লাইন:

Sum is: 18.243000
Sum is 18.24

%lf ব্যবহার করায় প্রথম লাইনে দশমিকের পরে ছয় পর্যন্ত প্রিন্ট হয়েছে । আবার দ্বিতীয় লাইনে দশমিকের পরে দুই ঘর পর্যন্ত প্রিন্ট হয়েছে, কারণ %0.2lf লিখেছি (তিন ঘর পর্যন্ত প্রিন্ট করতে চাইলে %0.3lf লিখতাম, আবার দশমিক অংশের প্রিন্ট করতে না চাইলে %0.0lf লিখতাম ) । double টাইপের ডাটার জন্য 64 বিট ব্যবহৃত হয় এবং 1.7E-308 (1.7 x 10-308) থেকে 1.7E+308 (1.7 x 10308) পর্যন্ত ডাটা রাখা যায় । বিস্তারিত হিসাব বুঝতে হলে কম্পিউটার বিজ্ঞানসংক্রান্ত আরও কিছু জ্ঞানবুদ্ধির দরকার, তাই আমি আর এখন সেদিকে যাচ্ছি না ।

এখন আমরা আমাদের প্রোগ্রামে এমন ব্যবস্থা রাখতে চাই, যাতে কোন দুটি সংখ্যা যোগ করতে হবে সেটি আমরা কোডের ভিতর লিখব না, ব্যবহারকারীর কাছ থেকে ইনপুট আকারে জেনে নিব । ব্যবহারকারীর (মানে যে প্রোগ্রামটি ব্যবহার করছে) কাছ থেকে ইনপুট নেওয়ার জন্য আমরা scanf ফাংশন ব্যবহার করর (সি-তে আরও ফাংশন আছে এই কাজের জন্য) । তাহলে দেরি না করে প্রোগ্রাম লিখে ফেলি:

#include <stdio.h>  
 int main()  
 {  
     int a, b, sum;  
     scanf("%d", &a);  
     scanf("%d", &b);  
     sum = a + b;  
     printf("Sum is: %d\n", sum);  
     return 0;  
 }  
 প্রোগ্রাম: ২.১০  

প্রোগ্রামটি রান করালে দেখবেন ফাঁকা স্ক্রিন(blank screen) আসে । তখন আপনি একটি সংখ্যা লিখবেন, তারপর স্পেস (space) বা এন্টার (enter)দিয়ে আরেকটি সংখ্যা লিখবে । তারপর আবার এন্টার চাপলে যোগফল দেখতে পাবেন ।

আপনারা নিশ্চই scanf ফাংশনের ব্যবহার শিখে ফেলেছেন । scanf("%d", &a); এখানে ডবল কোটেশনের ভেতরে %d দিয়ে scanf –কে বলে দেওয়া হচ্ছে যে একটি ইন্টিজার বা int টাইপের ভেরিয়েবলের মান পড়তে হবে (ব্যবহারকারী কী র্বোড থেকে ইনপুট দেবে) । আর দেখুন a -এর আগে এমপারসেন্ড (&) চিন্হ ব্যবহার করা হয়েছে, &a দিয়ে বোঝানো হয়েছে যে সংখ্যাটি ইনপুট দেওয়া হবে সেটি a ভেরিয়েবলের মাঝে অ্যাসাইন হবে । আপনারা যখন সি আরেকটু ভালোভাবে শিখবেন, তখন &a –এর  প্রকৃত অর্থ বুঝতে পারবেন, আপাতত আমরা ব্যবহারের দিকেই মনোযোগ দিই । a এবং b –এর মান একটি scanf ফাংশন দিয়েও নেওয়া যেত এভাবে: scanf("%d %d", &a, &b); ভেরিয়েবলের আগে & চিন্হ না দিলে কী সমস্যা ? নিচের প্রোগ্রামটি রান করার চেষ্টা করেন, কিছু একটি এরর পাবেন । এই মুহূর্তে এররটা ব্যাখ্যা করছি না, কারণ ব্যাখ্যাটা একটু জটিল আর এখন বোঝাতে গেলে আপনারা ভুল করবেন ।

 #include <stdio.h>  
 int main()  
 {  
     int a, b, sum;  
     scanf("%d", &a);  
     scanf("%d", b);  
     sum = a + b;  
     printf("Sum is: %d\n", sum);  
     return 0;  
 }  
 প্রোগ্রাম: ২.১১  

এখন আমরা ‍যদি ইনপুট হিসাবে ইন্টিজার না নিয়ে ডবল টাইপের ডাটা নিতে চাইতাম তাহলে কী করতে হতো ? scanf –এ %d-এর বদলে %lf ব্যবহার করলেই চলত । আপনারা প্রোগ্রামটি লিখে ফেলুন এবং দেখুন ঠিকঠাক রান হয় কি না । তারপর বাকি অংশ পড়া শুরু করুন ।

আসলে ঠিকঠাক রান হবে না, কারণ ডাটা টাইপও পরিবর্তন করতে হবে । মানে int না লিখে double লিখতে হবে । প্রোগ্রামটি ঠিক করে আবার চালান ।

এখানে যখনই আমি কোনো প্রোগ্রাম লেখতে বলব সেটি যত সহজ কিংবা কঠিনই মনে হোক না কেন, সেটি কম্পিউটারে লিখে কম্পাইল ও রান করতে হবে । এ কাজ না করে সামনে আগানো যাবে না । মনে রাখবেন, গাড়ি চালানো শেখার জন্য যেমন গাড়ি চালানোর কোন বিকল্প নেই, সাঁতার শেখার জন্য যেমন সাঁতার কাটার বিকল্প নেই, তেমনই প্রোগ্রামিং শেখার জন্য প্রোগ্রামিং শেখার জন্য প্রোগ্রামিং করার কোনো বিকল্প নেই, শুধু পড়ে প্রোগ্রামার হওয়া যায় না ।

এবারে আমরা আরেক ধরনের ডাটা টাইপ দেখব, সেটি হচ্ছে char (character) টাইপ । তো এই character টাইপের চরিত্র হচ্ছে একে মেমোরিতে রাখার জন্য মাত্র এক বাইট জায়গার দরকার হয় । সাধারণত যেকোনো অক্ষর বা চিন্হ রাখার জন্য এই টাইপের ডাটা ব্যবহার করা হয় । তবে সেই অক্ষরটা ইংরেজী বর্ণমালার অক্ষর হতে হবে, অন্য ভাষার অক্ষর char টাইপের ভেরিয়েবলে রাখা ‍যাবে না । নিচের প্রোগ্রামটি কম্পিউটারে লিখে রান করান:

 #include <stdio.h>  
 int main()  
 {  
     char ch;  
     printf("Enter the first letter of your name: ");  
     scanf("%c", &ch);  
     printf("The first letter of your name is: %c\n", ch);  
     return 0;  
 }  
 প্রোগ্রাম: ২.১২  

কোড দেখে বুঝতেই পারছেন, char টাইপের জন্য printf এবং scanf ফাংশনের ভেতরে %c ব্যবহার করতে হয় । আরেকটি ফাংশন আছে getchar, এটি দিয়েও char টাইপের ডাটা রিড করা যায় । নিচের প্রোগ্রামটি দেখুন:

 #include <stdio.h>  
 int main()  
 {  
     char ch;  
     printf("Enter the first letter of your name: ");  
     ch = getchar();  
     printf("The first letter of your name is: %c\n", ch);  
     return 0;  
 }  
 প্রোগ্রাম: ২.১৩  

এটি রান করুন । আগের প্রোগ্রামটির মতো একই কাজ করবে । getchar ফাংশন একটি অক্ষর পড়ে সেটি ch ভেরিয়েবলের ভেতর অ্যাসাইন করে দিল । আর সরাসরি কোনো কিছু char টাইপ ভেরিয়েবলে রাখতে চাইলে যেই অক্ষর বা চিহ্ন রাখবে তার দুই পাশে সিঙ্গেল কোটেশন চিহ্ন দিবেন । যেমন: char c = 'A';
এখন নিচের প্রোগ্রামটি দেখুন:

 #include <stdio.h>  
 int main()  
 {  
     int num1, num2;  
     printf("Please enter a number: ");  
     scanf("%d", &num1);  
     printf("Please enter another number: ");  
     scanf("%d", &num2);  
     printf("%d + %d = %d\n", num1, num2, num1+num2);  
     printf("%d - %d = %d\n", num1, num2, num1-num2);  
     printf("%d * %d = %d\n", num1, num2, num1*num2);  
     printf("%d / %d = %d\n", num1, num2, num1/num2);  
     return 0;  
 }  
 প্রোগ্রাম: ২.১৪  

এটি কম্পাইল ও রান করান । এটি দেখে নিশ্চয়ই বুঝতে পেরেছেন যোগ, বিয়োগ, গুণ ও ভাগের কাজ কিভাবে করতে হয় । এবারে আপনাদের কাজ হচ্ছে চারটি । এক, num1 ও num2-এর মধ্যেকার যোগ, বিয়োগ, গুণ ও ভাগের কাজটি printf ফাংশনের ভিতরে না করে আগে করা এবং মানটি অন্য একটি ভেরিয়েবলে রেখে দেওয়া । এর জন্য একটি প্রোগ্রাম লিখে ফেলুন । দ্বিতীয় কাজটি হচ্ছে প্রোগ্রামটি ডবল টাইপের ভেরিয়েবল ব্যবহার করুন । তৃতীয় কাজটি হচ্ছে, num2 এর মান 0 দিয়ে দেখুন কী হয় । চতুর্থ কাজটি হচ্ছে printf ফাংশনের ভেতরে ডবল কোটেশনের ভেতরে যেই +,-,*,/ চিহ্ন আছে সেগুলো সরাসরি ব্যবহার না করে একটি char ভেরিয়েবলে রেখে তারপর ব্যবহার করা । চারটি কাজ ঠিকমতো করার পরে নিচের প্রোগ্রামটি দেখুন:

#include <stdio.h>  
 int main()  
 {  
     int num1, num2, value;  
     char sign;  
     printf("Please enter a number: ");  
     scanf("%d", &num1);  
     printf("Please enter another number: ");  
     scanf("%d", &num2);  
     value = num1 + num2;  
     sign = '+';  
     printf("%d %c %d = %d\n", num1, sign, num2, value);  
     value = num1 - num2;  
     sign = '-';  
     printf("%d %c %d = %d\n", num1, sign, num2, value);  
     value = num1 * num2;  
     sign = '*';  
     printf("%d %c %d = %d\n", num1, sign, num2, value);  
     value = num1 / num2;  
     sign = '/';  
     printf("%d %c %d = %d\n", num1, sign, num2, value);  
     return 0;  
 }  
 প্রোগ্রাম: ২.১৫  

প্রোগ্রামটি দেখলেই বুঝতে পারবেন কী কাজ করে । তবে শুধু দেখে বুঝলেই হবে না । কোড করে কম্পাইল ও রান করুন ।

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

এখন একটি মজার এবং দরকারী জিনিস বলে রাখি । প্রোগ্রামের কোডের ভেতরে আপনি নিজের ভাষা ব্যবহার করতে ও পারেন । এটিকে বলে কমেন্ট (comment) করা । কম্পাইলার কমেন্টগুলোকে প্রোগ্রামের অংশ ধরবে না । এক লাইনের কমেন্ট হলে // চিহ্ন দিয়ে কমেন্ট শুরু করতে পারেন । আর একাধিক লাইন থাকলে /* দিয়ে শুরু এবং */ দিয়ে শেষ করতে হবে ।
নিচের প্রোগ্রামটি কিন্তু ঠিকঠাক কম্পাইল ও রান হবে ।

#include <stdio.h>  
 int main()  
 {  
     // test program - comment 1  
     printf("Hello ");  
     /* We have printed Hello,  
     now we shall print World.  
     Note that this is a multi-line comment */  
     printf("World"); // printed world  
     return 0;  
 }  
 প্রোগ্রাম: ২.১৬  
এবারে একটি প্রশ্ন, ভেরিয়েবলগুলোর নামকরণ এর নিয়ম-কানুন কী ? ভেরিয়েবলের নাম এক বা একাধিক হতে পারে, অক্ষর গুলো হতে পারে a থেকে z, A থেকে Z, 0 থেকে 9 এবং _ (আন্ডারস্কোর বা আন্ডারবার)। তবে একাধিক অক্ষরের ক্ষেত্রে প্রথম অক্ষরটা অঙ্ক (ডিজিট) হতে পারবে না । আপনি একটি প্রোগ্রামে int 7d; লিখে দেখুন কম্পাইলার কী বলে । আর ভেরিয়েবলের নামগুলো অর্থপূর্ণ হলে ভালে হয় । যেমন, যোগফল রাখার জন্য ভেরিয়েবলের নাম sum হলেই ভালো, যদিও y নাম দিলেও প্রোগ্রাম চলে । অর্থপূর্ণ নাম দিলে বুঝতে সুবিধা হয়, ভেরিয়েবলটা কী উদ্দেশ্যে ব্যবহার করা হয়েছে ।

2 comments:

  1. [ সি প্রোগ্রামিং :- অধ্যায় দুই ] ডাটা টাইপ, ইনপুট ও আউটপুট পুরোপুরি শেষ করলাম।শেষ করতে পেরে বেশ ভালো লাগছে।ধন্যবাদ সবুজ ভাই কে।আমার প্রোগ্রামিং এর হাতেখড়ি দেওয়ার জন্য।

    ReplyDelete
    Replies
    1. আপনাকে ও স্বাগতম জানাই আশা করি আপনি এর পরের সব গুলো অধ্যায় শেষ করে প্রোগ্রামিং করা শিখতে পারবেন । আপনার জন্য রইল শুভ কামনা । ধন্যবাদ ।

      Delete