দিনকে দিন তোমার ক্লাস পারফর্মেন্সের গ্রাফের উন্নতির সাথে সাথে তুমি ক্রমাগত স্যারের আরও প্রিয়পাত্র হচ্ছ। এখন স্যার তোমাকে এতটা পছন্দ করে যে, ক্লাসের রেজাল্ট বানানোর কাজেও তোমার সাহায্য নিতে শুরু করেছে। ক'দিন আগে তোমাদের একটা ক্লাসটেস্ট হয়ে গেল মনে আছে নিশ্চয়। তোমার স্যার তোমাকে দায়িত্ব দিল, এর মধ্যে থেকে সর্বোচ্চ নাম্বার, সর্বনিম্ন নাম্বার আর সব নাম্বারের গড় খুঁজে বের করতে হবে। তোমার ক্লাসে মোট শিক্ষার্থী আছে ১২০ জন। তোমার তো এবার মাথায় হাত। ১২০ জনের রেজাল্ট থেকে সর্বোচ্চ, সর্বনিম্ন আর গড় বের করতে হলে সবার আগে তোমাকে ১২০টা ভ্যারিয়েবল নিতে হবে। সেগুলো ১২০ বার স্ক্যান করে ইনপুট নিতে হবে। ১২০টা সংখ্যার মধ্যে তুলনা করে সর্বোচ্চ নাম্বার বের করতে হবে। ১২০টা সংখ্যার মধ্যে তুলনা করে সর্বনিন্ম নাম্বার বের করতে হবে। তারপর ১২০টা সংখ্যা যোগ করে তাকে ১২০ দিয়ে ভাগ করে গড় নাম্বার বের করতে হবে। এ কি মুখের কথা! তুমি মনে মনে চিন্তা করতে থাকলে, যদি এমন কোন পদ্ধতি থাকত, যেখানে একবারেই ১২০টা ভ্যারিয়েবল ডিক্লেয়ার করে দেয়া যায়। একবার ইনপুট নিয়েই সেটাকে ১২০বার কাজে লাগানো যায়। একই ব্যাপার সর্বোচ্চ, সর্বনিম্ন আর গড় নাম্বারের ব্যাপারেও।
আগেই বলেছি, প্রোগ্রামাররাও ঠিক তোমার মতই আলসে হয়। তাই সব কাজই শর্টকাটে করার একটা উপায় থাকেই। একই লাইন বারবার ব্যবহার তো লুপ দিয়ে করতে পারছই। আর তুমি চাইলে একই সাথে যতখুশি তত ভ্যারিয়েবল একই সাথে ডিক্লেয়ার করতে পারো। তখন তোমার সবগুলো ভ্যারিয়েবল একটা গ্রুপে সিরিয়াল করে তৈরি হয়ে যাবে। এই গ্রুপটাকে বলে অ্যারে । আমাদের একটা ইন্টিজার টাইপের ভ্যারিয়েবল ডিক্লেয়ার করার জন্য আমরা কী করতাম? ভ্যারিয়েবলের নাম যদি a হয়, তাহলে আমরা লিখতাম int a । এখন যদি আমরা একটা ভ্যারিয়েবলের গ্রুপ তৈরি করতে চাই যার নাম হচ্ছে a এবং সেই গ্রুপে মোট 120টা ইন্টিজার থাকবে, তাহলে আমাদের লিখতে হবে int a[120]; তাহলেই আমাদের ১২০টা ভ্যারিয়েবলের তৈরি হয়ে যাবে। তোমাদের মনে প্রশ্ন আসতে পারে, যদি এখানে সবগুলো ভ্যারিয়েবলের নামই a হয়, তাহলে আমরা বিভিন্ন ভ্যারিয়েবল নিয়ে কাজ করব কিভাবে? খুবই যৌক্তিক প্রশ্ন। যেহেতু, আমাদের সবগুলো ভ্যারিয়েবল একটা গ্রুপে আছে, তাই সবগুলো ভ্যারিয়েবলেরই একটা করে সিরিয়াল নাম্বার থাকে। অনেকটা তোমাদের ক্লাসের রোলের মত। এই সিরিয়াল নাম্বারটাকে বলে ইনডেক্স। এখানে সিরিয়াল শুরু হয় 0 থেকে। আর যেহেতু মোট ভ্যারিয়েবল আছে আমাদের ১২০টা তাই সিরিয়াল শেষ হয়, ১১৯ এ। এটা খুব গুরুত্বপূর্ণ একটা ব্যাপার। শুরুর দিকে যারা প্রোগ্রামিং করে, তারা অনেকেই এই জিনিসটা নিয়ে সমস্যায় পড়ে। 0 থেকে শুরু না করে 1 থেকে হিসাব শুরু করে আর প্রোগ্রাম চলতে চলতে হঠাৎ করে সুইসাইড করে বসে। আর শূন্য থেকে শুরু হয় বলেই ইনডেক্স শেষ হয়, অ্যারের সাইজের চেয়ে এক কম নাম্বার সিরিয়ালে। যেমন আমাদের ১২০জন স্টুডেন্টের জন্য একটা অ্যারে বানালে তার ইনডেক্সগুলো হবে 0, 1, 2 ... 119 এভাবে। অ্যারের নামের পরে তৃতীয় বন্ধনীর মধ্যে ইনডেক্স নাম্বার লিখলে সেটা তত তম ভ্যারিয়েবল নির্দেশ করে। যেমন আমরা যদি a নামের একটা অ্যারের 22 তম ইনডেক্সের ভ্যারিয়েবল নিয়ে কাজ করতে চাই, তাহলে আমাদের লিখতে হবে a[22]।
প্রাথমিক জ্ঞান অর্জন শেষ। এবার তাহলে আমাদের প্রোগ্রামটা দেখে নেয়া যাক।
যদি ফর লুপ ঠিকভাবে বুঝে থাকো, তাহলে এই প্রোগ্রামটা বুঝতে তোমার খুব একটা অসুবিধে হওয়ার কথা না। আগেই বলেছি, অ্যারের নামের পর তৃতীয় বন্ধনীর ভেতরে যে সংখ্যাটা লেখা হয়, সেটা অ্যারের তত তম ভ্যারিয়েবলকে নির্দেশ করে। এখন আমাদের প্রথম ফর লুপে i ভ্যারিয়েবলটার মান 0 হতে 119 (120 এর আগ পর্যন্ত) পর্যন্ত হয়। তাই scanf() ফাংশনটা দিয়ে আমরা ক্রমান্বয়ে a অ্যারের 120টা ভ্যারিয়েবলেরই মান স্ক্যান করি। এখানে একটা ব্যাপার লক্ষ্য করার মত। আমরা যখন প্রথমে int লিখে অ্যারের নাম লিখে তারপর তৃতীয় বন্ধনীর মধ্যে কোন সংখ্যা লিখেছিলাম, তখন সেটা ছিল অ্যারেতে মোট ভ্যারিয়েবেলের সংখ্যা। তারপরে যখনই আমরা aএর পরে তৃতীয় বন্ধনীতে কোন সংখ্যা লিখেছি, সেটা হচ্ছে অ্যারের কততম ভ্যারিয়েবল নিয়ে কাজ করতে চাই সেটা। এই সংখ্যা 0 থেকে অ্যারের আকারের চেয়ে এক কম পর্যন্ত হতে পারে। আমরা যদি পরে কোথাও অ্যারের আকারের সমান বা বড় কোন সংখ্যা ইনডেক্স হিসেবে ব্যাবহার করি, তাহলে হয় আমাদের প্রোগ্রাম সুইসাইড করবে অথবা মাথা খারাপের মত আচরণ করবে (এই সুইসাইড করা বা মাথা খারাপ করা জিনিসগুলো আসলে কী, সেটা আকারের চেয়ে বড় ইনডেক্স ব্যবহার করে টেস্ট করতে পারো। ভয় নেই, তোমার কম্পিউটারের কোন ক্ষতি হবে না।)
- #include <stdio.h>
- int main()
- {
- int a[120], min, max, sum, i;
- for(i = 0; i<120; i = i + 1)
- scanf("%d", &a[i]);
- min = a[0];
- for(i = 1; i<120; i = i + 1){
- if(a[i]<min){
- min = a[i];
- }
- }
- max = a[0];
- for(i = 1; i<120; i = i + 1){
- if(a[i]>max){
- max = a[i];
- }
- }
- sum = 0;
- for(i = 0; i<120; i = i + 1){
- sum = sum + a[i];
- }
- printf("Minimum number = %d, Maximum number = %d, Average number = %d", min, max, sum/120);
- }
যদি ফর লুপ ঠিকভাবে বুঝে থাকো, তাহলে এই প্রোগ্রামটা বুঝতে তোমার খুব একটা অসুবিধে হওয়ার কথা না। আগেই বলেছি, অ্যারের নামের পর তৃতীয় বন্ধনীর ভেতরে যে সংখ্যাটা লেখা হয়, সেটা অ্যারের তত তম ভ্যারিয়েবলকে নির্দেশ করে। এখন আমাদের প্রথম ফর লুপে i ভ্যারিয়েবলটার মান 0 হতে 119 (120 এর আগ পর্যন্ত) পর্যন্ত হয়। তাই scanf() ফাংশনটা দিয়ে আমরা ক্রমান্বয়ে a অ্যারের 120টা ভ্যারিয়েবলেরই মান স্ক্যান করি। এখানে একটা ব্যাপার লক্ষ্য করার মত। আমরা যখন প্রথমে int লিখে অ্যারের নাম লিখে তারপর তৃতীয় বন্ধনীর মধ্যে কোন সংখ্যা লিখেছিলাম, তখন সেটা ছিল অ্যারেতে মোট ভ্যারিয়েবেলের সংখ্যা। তারপরে যখনই আমরা aএর পরে তৃতীয় বন্ধনীতে কোন সংখ্যা লিখেছি, সেটা হচ্ছে অ্যারের কততম ভ্যারিয়েবল নিয়ে কাজ করতে চাই সেটা। এই সংখ্যা 0 থেকে অ্যারের আকারের চেয়ে এক কম পর্যন্ত হতে পারে। আমরা যদি পরে কোথাও অ্যারের আকারের সমান বা বড় কোন সংখ্যা ইনডেক্স হিসেবে ব্যাবহার করি, তাহলে হয় আমাদের প্রোগ্রাম সুইসাইড করবে অথবা মাথা খারাপের মত আচরণ করবে (এই সুইসাইড করা বা মাথা খারাপ করা জিনিসগুলো আসলে কী, সেটা আকারের চেয়ে বড় ইনডেক্স ব্যবহার করে টেস্ট করতে পারো। ভয় নেই, তোমার কম্পিউটারের কোন ক্ষতি হবে না।)
তারপরে আমরা min নামের ভ্যারিয়েবলটার মান হিসেবে অ্যারের প্রথম ভ্যারিয়েবলের মানটাকে রেখেছি। অর্থাৎ, ধরে নিয়েছি অ্যারেতে সবচেয়ে ছোট সংখ্যাটা হচ্ছে, এর প্রথম সংখ্যাটাই। তারপর দ্বিতীয় সংখ্যা(a[1]) থেকে শেষ সংখ্যা(a[119]) পর্যন্ত একটা লুপ চালিয়েছি। প্রতিটা সংখ্যার জন্য চেক করেছি সংখ্যাটা min এর মানের চেয়ে ছোট কি'না। যদি ছোট হয়, তাহলে min সবচেয়ে ছোট সংখ্যা নয়। তাই min ভ্যারিয়েবলের মধ্যে বর্তমান সংখ্যাটা রেখেছি। তারপর আবার সামনে এগিয়েছি এবং প্রতিবার চেক করেছি বর্তমান সংখ্যা min এর চেয়ে ছোট কি'না। যদি ছোট হয়, তাহলে আবার min এর মান পরিবর্তন করে বর্তমান সংখ্যা রেখেছি। আর যদি এমন কোন সংখ্যা না পাওয়া যায় যেটা min এর চেয়ে ছোট, তাহলে min এর মান পরিবর্তন হবে না এবং min এর সেই মানটাই অ্যারের সবচেয়ে ছোট সংখ্যা।
সর্বনিন্ম সংখ্যা বের করে ফেলতে পারলে সর্বোচ্চ সংখ্যা বের করে ফেলাও কোন ব্যাপার না। একই ব্যাপার শুধু পার্থক্যটা হচ্ছে আমরা এবার চেক করব, বর্তমান সংখ্যাটা max এর চেয়ে বড় কি'না। যদি বড় হয়, তাহলে max এর নাম বদলে বর্তমান সংখ্যা করে ফেলব। আর যদি না হয়, তাহলে max এর মান অপরিবর্তিত থাকবে।
একই ভাবে sum ভ্যারিবলে আমরা প্রথমে রেখেছি শূন্য। তারপর অ্যারের প্রথম (0 তম ইনডেক্স) থেকে শেষ (119 তম ইনডেক্স) পর্যন্ত সবগুলো সংখ্যা sum এর বর্তমান মানের সাথে যোগ করে যোগফলটা sum এর মধ্যে রেখেছি। লুপ শেষ হওয়ার পরে sum এর মধ্যে অ্যারের সবগুলো সংখ্যার যোগফল রয়েছে। সেটাকে 120 দিয়ে ভাগ করলেই আমরা আমাদের গড় নাম্বার পেয়ে যাই।
যদি লুপ এবং অ্যারে দু'টো ব্যাপারই ভালমত বুঝে থাকো, তাহলে এতক্ষণে তোমাদের ধরে ফেলার কথা এই তিনটি কাজের জন্য আমাদের আসলে তিনটা আলাদা আলাদা লুপের দরকার নেই। আমরা একটা লুপ দিয়েই তিনটি কাজই একবারে করে ফেলতে পারি।
আমাদের আগের প্রোগ্রামটার সাথে এই প্রোগ্রামটার কোনই পার্থক্য নেই কেবল sum এর মান প্রথমবার ঠিক করে দেয়া ছাড়া। আগে আমরা প্রথমে sum এর মান দিয়েছিলাম 0 তাই আমরা sum এর সাথে প্রথম সংখ্যা থেকেই যোগ করতে শুরু করেছিলাম। এবার যেহেতু আমরা min, max এর সাথে তাল মিলিয়ে লুপ চালাতে শুরু করেছি, অ্যারের দ্বিতীয় ভ্যারিয়েবল থেকে, তাই sum এর মান প্রথমেই রেখেছি অ্যারের প্রথম ভ্যারিয়েবল। বাকি সবগুলো ভ্যারিয়েবল তার সাথে যোগ হচ্ছে। তাই লুপ শেষে আমরা আসলে অ্যারের সবগুলো নাম্বারেরই যোগফল পাচ্ছি।
- #include <stdio.h>
- int main()
- {
- int a[120], sum, min, max;
- for(i = 0; i<120; i = i+1){
- scanf("%d", &a[i]);
- }
- sum = a[0];
- min = a[0];
- max = a[0];
- for(i = 1; i<120; i++){
- if(min<a[i]){
- min = a[i];
- }
- if(max>a[i]){
- max = a[i];
- }
- sum = sum + a[i];
- }
- printf("Minimum number = %d, Maximum number = %d, Average number = %d", min, max, sum/120);
- }
আমাদের আগের প্রোগ্রামটার সাথে এই প্রোগ্রামটার কোনই পার্থক্য নেই কেবল sum এর মান প্রথমবার ঠিক করে দেয়া ছাড়া। আগে আমরা প্রথমে sum এর মান দিয়েছিলাম 0 তাই আমরা sum এর সাথে প্রথম সংখ্যা থেকেই যোগ করতে শুরু করেছিলাম। এবার যেহেতু আমরা min, max এর সাথে তাল মিলিয়ে লুপ চালাতে শুরু করেছি, অ্যারের দ্বিতীয় ভ্যারিয়েবল থেকে, তাই sum এর মান প্রথমেই রেখেছি অ্যারের প্রথম ভ্যারিয়েবল। বাকি সবগুলো ভ্যারিয়েবল তার সাথে যোগ হচ্ছে। তাই লুপ শেষে আমরা আসলে অ্যারের সবগুলো নাম্বারেরই যোগফল পাচ্ছি।
আচ্ছা, sum এর মান শূন্য রেখেও কি এই প্রোগ্রামটা লেখা সম্ভব? যদি সম্ভব হয়, তাহলে অন্য কোথায় পরিবর্তন করতে হবে?
No comments:
Post a Comment