[প্রোগ্রামিং বইঃ অধ্যায় সাত] ফাংশন (Function)।

তোমরা কি একটি মজার ব্যাপার জানো? একজন লেখক সারা জীবনে যতটা সময় লেখেন তার চেয়ে বেশি সময় তিনি অন্যের লেখা পড়েন? ব্যাপারটি প্রোগ্রামারদের বেলাতেও সত্য। একজন প্রোগ্রামার তার প্রোগ্রামিং জীবনে যতটা সময় নিজে কোড লেখে তার চেয়ে বেশি সময় অন্যের লেখা কোড পড়ে! তাই কোড লিখার সময় খেয়াল রাখতে হবে, যেন সেটি পড়াও সুবিধাজনক হয়।

যারা বইটি শুরু থেকে পড়ে এসেছ তারা ইতিমধ্যে অনেকবার ফাংশন শব্দটি দেখেছ। যারা আরও বেশি মনোযোগ দিয়ে পড়েছ তারা এটিও খেয়াল করেছ যে printf, scanf ইত্যাদি, যেগুলো তোমরা ব্যবহার করছ সেগুলো একেকটি ফাংশন। আবার mainও একটি ফাংশন। আমরা এবার দেখব ফাংশন ব্যাপারটি আসলে কী, এর দরকারটাই বা কী। আর তারপর আমরা নিজেদের ফাংশন তৈরি করা শিখব।

ফাংশন ব্যবহার করা হয় কোনো একটি নির্দিষ্ট কাজ করার জন্য। যেমন printf ফাংশনটি দিয়ে আমরা মনিটরে আউটপুট দিই। আবার scanf, getchar এসব ফাংশন দিয়ে আমরা কিবোর্ড থেকে ইনপুট নিই। এখন printf ফাংশনটি যে আমরা লিখলাম, কম্পিউটারের তো আর এটি বোঝার কথা নয়। printf ফাংশনটি কী কাজ করবে, কীভাবে করবে সেটি আসলে বলে দেওয়া আছে stdio.h নামের একটি হেডার (header) ফাইলের মধ্যে। এজন্যই আমরা আমাদের প্রোগ্রামগুলোতে (যেখানে printf, scanf ইত্যাদি ব্যবহার করেছি) ওই হেডার ফাইলটির কথা বলে দিই (#include )। আবার স্ট্রিং-সংক্রান্ত ফাংশনগুলো ব্যবহার করলে string.h – এই হেডার ফাইলটির কথাও বলে দিই। এখন চিন্তা করো, printf ফাংশনের এই কোডটি যদি আমাদের নিজেদের লিখতে হতো, তাহলে ব্যাপারটি কী বিরক্তিকরই না হতো! এরকম অনেক ফাংশন আছে যেগুলোর ব্যবহার তোমরা আস্তে আস্তে জেনে যাবে।

আচ্ছা, main কে ও তো আমি একটি ফাংশন বলেছি, কিন্তু এটি দিয়ে আমরা আবার কী করি? সি ল্যাঙ্গুয়েজে এই ফাংশনটি দিয়েই আসলে আমরা একটি প্রোগ্রাম চালাই। কম্পাইলার জানে যে main ফাংশন যেখানে আছে, সেখান থেকেই কাজ শুরু করতে হবে। তাই একটি প্রোগ্রামে কেবল একটিই main ফাংশন থাকে।

এবারে দেখি, আমরা নিজেরা কীভাবে ফাংশন তৈরি করতে পারি। একটি ফাংশন যখন আমরা তৈরি করব সেটির গঠন হবে মোটামুটি এই রকম:

return_type function_name (parameters) {
function_body
return value
}

return_type: এখানে বলে দিতে হবে ফাংশনটি কাজ শেষ করে বের হবার সময় কী ধরনের ডাটা রিটার্ন করবে। সেটি, int, double এসব হতে পারে। আবার কিছু রিটার্ন করতে না চাইলে সেটি void হতে পারে। অর্থাৎ সে কিছুই রিটার্ন করবে না। এর মানে দাঁড়াচ্ছে, তুমি আসলে ফাংশনকে দিয়ে কোনো একটি কাজ করাবে, সেজন্য কাজ শেষে সে তোমাকে কী ধরনের ডাটা ফেরত দেবে সেটি বলে দিতে হবে। ফাংশনের কোনো জায়গাতে তুমি যখনই return ব্যবহার করবে, ফাংশনটি সেই জায়গা থেকেই রিটার্ন করবে বা বের হয়ে যাবে। অনেক ফাংশনের ভেতর দেখবে একাধিক রিটার্ন আছে এবং সঙ্গে বিভিন্ন শর্ত দেওয়া আছে। শর্তের উপর নির্ভর করে যখনই প্রোগ্রামটি কোনো রিটার্ন পাবে তখনই ফাংশন থেকে বের হয়ে যাবে।

function_name: এখানে আমাদের ফাংশনের নাম লিখতে হবে। ফাংশনের নাম হতে হবে অর্থপূর্ণ যাতে নাম দেখেই ধারনা করা যায় যে ফাংশনটি কী কাজ করবে। যেমন কোন সংখ্যার বর্গমূল নির্ণয়ের জন্য যদি আমরা একটি ফাংশন লিখি তবে সেটির নাম আমরা দিতে পারি square_root বা sqrt। আমরা নিশ্চয়ই সেটির নাম beautiful দিব না, যদিও কম্পাইলার তাতে কোন আপত্তি করবে না।

parameters: এখানে ফাংশনটি কাজ করার জন্য প্রয়োজনীয় ডাটা আমরা দেব। যেমন স্ট্রিং-এর দৈর্ঘ্য নির্ণয়ের জন্য আমরা যখন strlen ফাংশনটি ব্যবহার করি সেখানে কোন স্ট্রিং-এর দৈর্ঘ্য নির্ণয় করতে হবে সেটি বলে দিতে হয় (নইলে সেটি কার দৈর্ঘ্য নির্ণয় করবে?)। আবার বর্গমূল নির্ণয়ের জন্য ফাংশন লিখলে কোন সংখ্যার বর্গমূল বের করতে হবে সেটি বলে দিতে হবে। প্যারামিটারের মাধ্যমে আমরা সেসব ডাটা ওই ফাংশনের কাছ পাঠাতে পারি। আবার কোনো কিছু পাঠাতে না চাইলে সেটি খালিও রাখতে পারি। যেমন, getchar() বা main() ফাংশন। একাধিক প্যারামিটার পাঠানোর সময় প্রতিটি প্যারামিটার কমা (,) দিয়ে আলাদা করতে হবে।

function_body: ফাংশনটি কীভাবে কী কাজ করবে সেটি বডিতে বলে দিতে হবে। মানে কোড লিখতে হবে আর কি।

return value: ফাংশনটি কাজ শেষ করে, তাকে যে জায়গা থেকে কল করা হয়েছে সে জায়গায় ফিরে যায়। ফেরার সময় আমরা কোনো মান পাঠাতে পারি। যেমন sqrt() ফাংশনে আমরা চাই সে বর্গমূল বের করবে। তো বর্গমূলটি বের করে তো সেটি ফেরত পাঠাবার ব্যবস্থা রাখতে হবে? বর্গমূলটির মান যদি x হয়, তবে আমরা return x; স্টেটমেন্ট দিয়ে সেটির মান ফেরত পাঠাব।

int root = sqrt(25);

এখানে sqrt ফাংশন 25-এর বর্গমূল নির্ণয় করার পর বর্গমূলটি ফেরত পাঠাবে এবং সেটি root নামের একটি ইন্টিজার ভেরিয়েবলে জমা হবে।

একটি উদাহরণ দিই। তোমরা যারা ত্রিকোণমিতি পড়েছ তারা নিশ্চয়ই sin, cos, tan ইত্যাদির সঙ্গে পরিচিত। sin 300-এর মান হচ্ছে 0.5। এখানে sin কিন্তু আসলে একটি ফাংশন, যার প্যারামিটার হিসেবে আমরা কোণের মান দিচ্ছি। আর ফাংশনটি ওই কোণের sine (সংক্ষেপে sin)-এর মান রিটার্ন করছে।

এবারে চলো, আর বকবক না করে প্রোগ্রামিং শুরু করে দিই। তারপর দেখি কী করলে কী হয়।

 #include <stdio.h>  
 int main()   
 {  
     double a, b, c;  
     a = 2.5;  
     b = 2.5;  
     c = a + b;  
     printf("%lf\n" c);  
     return 0;  
 }  
 প্রোগ্রাম: ৭.১  

প্রোগ্রামটি চালাও। আউটপুট কী? 5.000000।

এবার আমরা দুটি সংখ্যা যোগ করার জন্য একটি ফাংশন লিখে ফেলি। যোগের কাজটি আর main ফাংশনের ভেতরে করব না।

 #include <stdio.h>  
 int add(int num1, int num2)   
 {  
     double sum = num1 + num2;  
     return sum;  
 }  
 int main()   
 {  
     double a, b, c;  
     a = b = 2.5;  
     c = add(a, b);  
     printf("%lf\n", c);  
     return 0;  
 }  
 প্রোগ্রাম: ৭.২  

প্রোগ্রামটি চালাও। আউটপুট কী? 4.000000! ওহ‍্‍ আমরা তো গাধার মতো একটি ভুল করেছি। num1 ও num2 তো আসলে int টাইপের হবে না, double টাইপের হবে। ওই দুটি ভেরিয়েবল ইন্টিজার হিসেবে ডিক্লেয়ার করার কারণে 2.5 হয়ে গিয়েছে 2 (টাইপ কাস্টিংয়ের কথা মনে আছে তো?)। আমরা ভুল ঠিক করে ফেলি:

 int add(double num1, double num2)   
 {  
     double sum = num1 + num2;  
     return sum;  
 }  

এবারে প্রোগ্রামটি রান করলে আউটপুট কী? 5.000000। যাক, সমস্যার সমাধান হয়ে গেল! আচ্ছা, এবারে আমরা a, b-এর মান একটু বদলাই। a = 2.8; b = 2.7; করে দিই। আউটপুট কত হবে? 5.500000? এটিই হওয়া উচিত (2.8 + 2.7 = 5.5) কিন্তু প্রোগ্রামটি রান করে দেখো তো কত হয়? তুমি আউটপুট পাবে 5.000000। কারণ কী?

কারণ, আমাদের ফাংশনের রিটার্ন টাইপ int, যা কিনা একটি ইন্টিজার রিটার্ন করতে সক্ষম। num1 ও num2 যোগ করার পর sum-এর মধ্যে 5.5 ঠিকই থাকবে কিন্তু রিটার্ন করার সময় সেটি ইন্টিজারে বদলে যাবে। সুতরাং রিটার্ন টাইপ আমরা double করে দেব। এবার আমাদের প্রোগ্রাম ঠিকঠাক কাজ করবে:

 #include <stdio.h>   
 double add(double n1, double n2)   
 {   
     double sum = n1 + n2;   
     return sum;   
 }   
 int main()   
 {   
     double a, b, c;   
     a = 2.8;   
     b = 2.7;   
     c = add(a, b);   
     printf("%lf\n", c);   
     return 0;   
 }   
 প্রোগ্রাম: ৭.৩  

এখন আমরা একটি এক্সপেরিমেন্ট করব। add ফাংশনটি main ফাংশনের পরে লিখব:

 #include <stdio.h>   
 int main()   
 {   
     double a = 2.8, b = 2.7, c;   
     c = add(a, b);   
     printf("%lf\n", c);   
     return 0;   
 }   
 double add(double n1, double n2)   
 {   
     double sum = n1 + n2;   
     return sum;   
 }  
 প্রোগ্রাম: ৭.৪  

এবারে প্রোগ্রামটি রান করতে গেলে দেখবে, কম্পাইলার এরর দিচ্ছে: "error: ‘add’ was not declared in this scope", অর্থাৎ সে আর add ফাংশনটিকে চিনতে পারছে না। তবে চিন্তা নেই, এটিকে চিনিয়ে দেওয়ার ব্যবস্থাও আছে। সেটি হচ্ছে main ফাংশনের আগে add ফাংশনের প্রোটোটাইপ (prototype) বলে দেওয়া:

double add(double n1, double n2);

প্রোটোটাইপে পুরা ফাংশনটি লিখতে হয় না। এর অংশগুলো হচ্ছে:

return_type function_name (parameters) ;

সেমিকোলন দিতে ভুল করবে না কিন্তু। আর প্রোটোটাইপের প্যারামিটারে যে ভেরিয়েবল ব্যবহার করবে তার সঙ্গে মূল ফাংশনের ভেরিয়েবলের নাম একরকম না হলে কোনো অসুবিধা নেই, তবে ডাটা টাইপ একই হতে হবে। এখন নিচের প্রোগ্রামটি ঠিকঠাক কাজ করবে:

 #include <stdio.h>   
 double add(double x, double y);   
 int main()   
 {   
     double a = 2.8, b = 2.7, c;   
     c = add(a, b);   
     printf("%lf\n", c);   
     return 0;   
 }   
 double add(double n1, double n2)   
 {   
     double sum = n1 + n2;   
     return sum;   
 }  
 প্রোগ্রাম: ৭.৫  

এবার আমরা আরও কিছু পরীক্ষা-নিরীক্ষা করব।

 #include <stdio.h>  
 int test_function(int x)   
 {  
     int y = x;  
     x = 2 * y;  
     return (x * y);  
 }  
 int main()   
 {  
     int x = 10, y = 20, z = 30;  
     z = test_function(x);  
     printf("%d %d %d\n", x, y, z);  
     return 0;  
 }  
 প্রোগ্রাম: ৭.৬  

প্রোগ্রামটি না চালিয়ে শুধু কোড দেখে বলো তো আউটপুট কী হবে? আমাদের কোনো তাড়া নেই, তাই ধীরেসুস্থে চিন্তা করে বলো।

এবার কে কে আমার সঙ্গে একমত যে আউটপুট হবে:
20 10 200 (অর্থাৎ x = 20, y = 10, z = 200)?

কারণ x, y-এর মান তো test_function-এর ভেতরে আমরা বদলে দিয়েছি। প্রথমে x-এর মান 10 যাচ্ছে প্যারামিটার হিসেবে, তারপরে সেই মানটি আমরা y-তে বসাচ্ছি। মানে y-এর মান এখন 10। তারপর x-এর মান বসাচ্ছি 2 * y মানে 20। তারপর রিটার্ন করছি x * y (যার মান, 20 * 10 বা 200)। সুতরাং z-এর মান হবে 200।

এবারে প্রোগ্রামটি চালাও, আউটপুট দেখবে: 10 20 200 (অর্থাৎ x = 10, y = 20, z = 200)। এমন হওয়ার কারণ কী? z-এর মান নিয়ে কোনো আপত্তি নেই, ফাংশনটি 200 রিটার্ন করে আর সেটি আমরা z-এ বসিয়ে দিয়েছি। কথা হচ্ছে, x আর y-এর মান নিয়ে। আসলে test_function-এর ভেতরে আমরা x, y-এর মান পরিবর্তন করায় main ফাংশনের x, y-এর কিছু আসে-যায় না। প্রত্যেক ফাংশনের ভেরিয়েবলগুলো আলাদা। একে বলে লোকাল ভেরিয়েবল (local variable)। আমরা main ফাংশনের x, y-এর মান প্রিন্ট করেছি test_function ফাংশনের x, y-এর মান প্রিন্ট করিনি। এক ফাংশনের লোকাল ভেরিয়েবলের অস্তিত্ব অন্য ফাংশনে থাকে না। তুমি এখন কিছু প্রোগ্রাম লিখে আরও পরীক্ষা-নিরীক্ষা করে দেখতে পারো। কী প্রোগ্রাম লিখবে সেটি তোমার ওপর ছেড়ে দিলাম।

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

 #include <stdio.h>  
 double pi = 3.14;  
 void my_fnc() {  
     pi = 3.1416; /* এখানে আমরা pi-এর মান একটু পরিবর্তন করে দিলাম */  
     return; /* ফাংশনের রিটার্ন টাইপ void হলে এই return; না দিলেও কিন্তু চলে */  
 }  
 int main() {  
     printf("%lf\n", pi); /* এখানে pi-এর মান হবে 3.14 */  
     my_fnc();  
     printf("%lf\n", pi); /* এখানে pi-এর মান হবে 3.1416 কারণ আমরা সেটি my_fnc ফাংশনে গিয়ে বদলে দিয়েছি। */  
     return 0;  
 }  

আবার আমরা যদি my_fnc ফাংশনের ভেতরে গিয়ে pi নামে একটি ভেরিয়েবল ডিক্লেয়ার করতাম (double pi;), তবে সেটি একটি লোকাল ভেরিয়েবল হতো এবং গ্লোবাল pi-এর মানের কোন পরিবর্তন হতো না।

এতক্ষণ আমরা ফাংশনের প্যারামিটার হিসেবে কেবল ভেরিয়েবল ব্যবহার করেছি। এবারে আসো আমরা ফাংশনের প্যারামিটার হিসেবে অ্যারে পাঠাই। আমরা একটি প্রোগ্রাম লিখব যেটি কোনো একটি ইন্টিজার অ্যারে থেকে সবচেয়ে বড় সংখ্যাটি খুঁজে বের করবে। অ্যারে থেকে সর্বোচ্চ সংখ্যা খুঁজে বের করার কাজটি করার জন্য একটি ফাংশন লিখে ফেলি, কী বলো?

int find_max(int ara[], int n) { /* এখানে আমরা দুটি প্যারামিটার দিচ্ছি। প্রথমটা হচ্ছে একটি অ্যারে, আর তারপর একটি সংখ্যা যেটি নির্দেশ করবে অ্যারেতে কয়টি সংখ্যা আছে। লক্ষ করো, প্যারামিটারে যখন অ্যারের কথাটি বলে দিচ্ছি তখন সেখানে কয়টি উপাদান আছে সেটি না দিলেও চলে, যেমন আমরা int ara[11] ও লিখতে পারতাম। */

int max = ara[0]; /* এখানে একটি ভেরিয়েবলে ধরে নিচ্ছি যে সবচেয়ে বড় সংখ্যাটি হচ্ছে অ্যারের প্রথম সংখ্যা। তারপরে আমরা অ্যারের বাকি উপাদানগুলোর সঙ্গে maxকে তুলনা করব আর যদি অ্যারের কোনো উপাদানের মান max-এর চেয়ে বড় হয় তখন সেই মানটি max-এ রেখে দেব। অর্থাৎ তখন আবার max হয়ে যাবে ওই অ্যারের সর্বোচ্চ সংখ্যা। */

int i;
for(i = 1; i < n; i++) { if (ara[i] > max) {
max = ara[i]; /* ara[i] যদি max-এর চেয়ে বড় হয় তবে max-এ ara[i]-এর মানটি অ্যাসাইন করে দিচ্ছি। */
}
}
return max; /* ফাংশন থেকে সর্বোচ্চ মানটি ফেরত পাঠাচ্ছি */
}

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

 #include <stdio.h>  
 int find_max(int ara[], int n);  
 int main()   
 {  
     int ara[] = {-100, 0, 53, 22, 83, 23, 89, -132, 201, 3, 85};  
     int n = 11;  
     int max = find_max(ara, n);  
     printf("%d\n", max);  
     return 0;  
 }  
 int find_max(int ara[], int n)   
 {  
     int max = ara[0];  
     int i;  
     for(i = 1; i < n; i++) {  
         if (ara[i] > max) {  
             max = ara[i];  
         }  
     }  
     return max;  
 }  
 প্রোগ্রাম: ৭.৭  

এখন তোমরা find_min নামে আরেকটি ফাংশন লেখো যার কাজ হবে সবচেয়ে ছোট সংখ্যাটি খুঁজে বের করা। find_sum, find_average এসব ফাংশনও লিখে ফেলতে পারো। আর তোমাদের নিশ্চয়ই বলে দিতে হবে না এইসব ফাংশন কী কাজ করবে।

ফাংশনে ভেরিয়েবল পাস করা (pass, পাঠানো অর্থে) আর অ্যারে পাস করার মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। আমরা ইতিমধ্যে দেখেছি যে ফাংশনের ভেতর ভেরিয়েবল পাস করলে ওই ফাংশনের ভেতরে সেটির আরেকটি কপি তৈরি হয়, সুতরাং সেখানে ওই ভেরিয়েবলের মান পরিবর্তন করলে মূল ফাংশন (যেখান থেকে ফাংশন কল করা হয়েছে) ভেরিয়েবলের মানের কোনো পরিবর্তন হয় না। তবে অ্যারের বেলায় ব্যাপারটি আলাদা। আগে আমরা একটি প্রোগ্রাম লিখে দেখি:

 #include <stdio.h>  
 void test_function(int ara[])   
 {  
     ara[0] = 100;  
     return;  
 }  
 int main()   
 {  
     int ara [] = {1, 2, 3, 4, 5};  
     printf("%d\n", ara[0]);  
     test_function(ara);  
     printf("%d\n", ara[0]);  
     return 0;  
 }  
 প্রোগ্রাম: ৭.৮  

এই প্রোগ্রামের আউটপুট কী হবে? প্রথম printf ফাংশনটি 1 প্রিন্ট করবে সেটি নিয়ে তো কোনো সন্দেহ নেই, কিন্তু দ্বিতীয় printf কী প্রিন্ট করবে? test_function-এর ভেতর আমরা অ্যারের প্রথম উপাদানের মান 100 অ্যাসাইন করেছি। এখন যদি সেটি মূল অ্যারেকে পরিবর্তন করে, তবে ara[0]-এর মান হবে 100, আর পরিবর্তন না হলে মান হবে আগে যা ছিল তা-ই, মানে 1।

আমরা আউটপুট দেখব 100, কারণ অ্যারেটির প্রথম উপাদানের মান পরিবর্তিত হয়েছে। অর্থাৎ আমরা বুঝতে পারলাম ফাংশনের ভেতরে অ্যারে পাস করলে ওই অ্যারের আলাদা কোনো কপি তৈরি হয় না। কারণ হচ্ছে আমরা ফাংশনের ভেতর অ্যারের নামটি কেবল পাঠাই, যেটি কিনা ওই অ্যারেটি মেমোরির কোন জায়গায় আছে তার অ্যাড্রেস। এখন তোমরা বৃত্তের ক্ষেত্রফল নির্ণয়ের জন্য একটি ফাংশন লিখে ফেলো। ক্ষেত্রফল বের করার সূত্রটি মনে আছে তো? মনে না থাকলে জ্যামিতি বই থেকে দেখে নাও।

৩৭টি মন্তব্য:

  1. ভাইয়া আপনার এ বই পড়ে কত উপকার পাইছি সেটা এখানে লিখে শেষ করা যাবে না।আপনি সারা জীবন আমার কাছে সম্মানের আসনে থাকবেনন।
    যাহোক প্রগ্রাম ৭.৩ এ মাইন ফাংশন এ a এবং b তে যথাক্রমে ২.৮ & ২.৭ অ্যাসাইন করছি।কিন্তু সেটা কিভাবে add ফাংশন এ n1 & n2 তে
    অ্যাসাইন হচ্ছে।একটু বুঝিয়ে বললে অনেক খুসি হতাম।

    উত্তরমুছুন
  2. add() ফাংশনের দুটি প্যারামিটার রয়েছে, n1 ও n2, যেটা ফাংশনের ডেফিনেশনে বলা আছে add (double n1, double n2)। এখন সেই ফাংশনকে যদি add(3, 4) এভাবে কল করা হয়, তবে n1-এর মান হবে 3 আর n2-এর মান হবে 4.

    উত্তরমুছুন
  3. Dear brother,
    I really get a lot help from this web site. please add a chapter for Pointer which is very important. I hope this website will be a great website for people who are learning C.

    উত্তরমুছুন
    উত্তরগুলি
    1. I have plan to write another book which is 'Computer Programming - Volume II' and Pointer will be there!

      মুছুন
  4. উত্তরগুলি
    1. I have plan to write another book which is 'Computer Programming - Volume II' and Pointer will be there!

      মুছুন
  5. সুবীন ভাইয়া
    আমি ২০১৩ সালে এস এস সি দিলাম এবং আপনার বই পড়ে সি প্রোগ্রামিং অনেকটা আয়ত্তে আনতে পেরেছি কিন্তু তবুও নিযে নিযে প্রোগ্রাম লিখতে সমস্যা হয় ।
    আর আপনার বই এর ২ নং পর্ব কবে প্রকাশ করবেন ???
    আশা করি উত্তর দিবেন

    উত্তরমুছুন
    উত্তরগুলি
    1. দ্বিতীয় পর্ব এই বছর প্রকাশ করার চেষ্টা করব, দেখা যাক।

      মুছুন
  6. ভাইয়া বই কি এইখানেই শেষ :O ???

    উত্তরমুছুন
    উত্তরগুলি
    1. না, আরো চ্যাপ্টার আছে। সূচীপত্রে দেখো।

      মুছুন
  7. ভাইয়া প্রোগ্রাম নাম্বার ৭.৫ এ '' double add(double x, double y); '' <<< এটা দিয়ে কি বোঝানো হয়েছে ? :(

    উত্তরমুছুন
    উত্তরগুলি
    1. চ্যাপ্টারটা আবার পড়ো। বিশেষভাবে এই অংশটা:


      এবারে প্রোগ্রামটি রান করতে গেলে দেখবে, কম্পাইলার এরর দিচ্ছে: "error: ‘add’ was not declared in this scope", অর্থাৎ সে আর add ফাংশনটিকে চিনতে পারছে না। তবে চিন্তা নেই, এটিকে চিনিয়ে দেওয়ার ব্যবস্থাও আছে। সেটি হচ্ছে main ফাংশনের আগে add ফাংশনের প্রোটোটাইপ (prototype) বলে দেওয়া:

      double add(double n1, double n2);

      প্রোটোটাইপে পুরা ফাংশনটি লিখতে হয় না। এর অংশগুলো হচ্ছে:

      return_type function_name (parameters) ;

      মুছুন
  8. ভায়া প্রোগ্রাম নাম্বার তে test_function এর return এ (x*y) এর মান main function এ z এ কেনো যায়??? আমরা তো দিয়েছি '' z = test_function(x); '' :( প্লিজ ভাইয়া বিষোয়টা ক্লিয়ার করে একটু বলবেন

    উত্তরমুছুন
  9. Z=test_function(x) লিখে এখানে Test_function এর মান z এ এসাইন করে দিয়েছে। return(x*y) বলতে বুঝায় function টি (x*y) এর মান return করবে যেটি test_function এ জমা হবে। সুতরাং ,test_function এর মধ্যে (x*y) এর মান রয়েছে যেটিকে main function এ z দ্বারা প্রকাশ করা হয়েছে। ধন্যবাদ। ভুল হলে মাফ করবেন।

    উত্তরমুছুন
  10. অদ্য (১৯-০৭-২০১৩) প্রথম আলো প্রত্রিকায় প্রকাশিত ‘আড্ডায় শিশুরা জানল প্রোগ্রামিং’ শিরোনামে লেখা পড়ে অত্যন্ত ভাল লেগেছে। লেখাতে দেয়া ওয়েব সাইটের ঠিকানায় গিয়ে তো হতবাগ। প্রোগ্রামিং শেখার জন্য এমন একটি চমকপ্রদ ব্যবস্থা- যা আমার জানা ছিল না। আপনাকে অনেক অনেক ধন্যবাদ।

    ২০১৩-২০১৪ শিক্ষাবষ হতে উচ্চ মাধ্যমিক পযায়ে তথ্য ও যোগাযোগ প্রযুক্তি বইটিতে সি প্রোগ্রামিং অন্তভূক্ত করা হয়েছে কিন্ত লেখার মান আশাপ্রদ হয়নি।
    আশা করি, নবীন শিক্ষাথীরা সি প্রোগ্রামিং শেখার ক্ষেত্রে আপনার ওয়েব সাইটি বেশ উপকারে আসবে। আমি ব্যক্তিগতভাবে এখন থেকে আপনার ওয়েব সাইটির ভক্ত হয়ে গেলাম। পরিচিত সবাইকে শেয়ার করব।
    আপনার প্রতি রইলো শুভ কামনা ।

    উত্তরমুছুন
  11. [program 7.5] Subeen vaia, I have changed data types of your code from double to int. My compiler successfully ran it. Would you please tell me why "prototype" became unnecessary this time?


    #include
    int main()
    {
    int a = 3, b = 4, c;
    c = add(a, b);
    printf("%d\n", c);
    return 0;
    }
    int add(int n1, int n2)
    {
    int sum = n1 + n2;
    return sum;
    }

    উত্তরমুছুন
    উত্তরগুলি
    1. It seems that modern compilers don't mind if you don't declare function prototype in the beginning. :)

      Good finding!

      মুছুন
  12. Vai, thanks a lot for the book. I have written a program for determination of the area of a circle which is given below:

    #include
    double pi=3.1416;
    double fun();
    int main()
    {
    double i;
    i=fun();
    printf("%lf\n",i);
    return 0;
    }
    double fun()
    {
    double a,s;
    scanf("%lf\n",&a);
    s=pi*a*a;
    return s;
    }

    Here is only one scanf function,but it requires 2 values to enter..(the 2nd value is useless). Why does it happen????Thank you...

    উত্তরমুছুন
  13. ভাইয়া একটা জিনিস ক্লিয়ার করবেন প্লিস ঃ
    প্রোগ্রাম ৭.৬ এ z = test_function(x); এই যায়গায় আপনি বলেছেন ""// কারণ x, y-এর মান তো test_function-এর ভেতরে আমরা বদলে দিয়েছি।। // """"" কিন্তু কই এখানে তো শুধু x লিখা আছে ! ব্যাপার টা কি z = test_function(x,y); এরকম হত না??

    আর আরেকটা প্রশ্ন । test_function এ return (x*y); । এটা কি x*y এর মান শুধু 200 ই রির্টান করবে নাকি আলাদা ভাবে x ও y এর মানও রির্টান করবে ??

    উত্তরমুছুন
    উত্তরগুলি
    1. ১) y প্যারামিটার আকারে পাঠানো হয় নাই, কিন্তু ফাংশনের ভিতরে ডিক্লেয়ার করা হয়েছে।

      ২) কেবল x*y এর মান রিটার্ণ করা হচ্ছে।

      মুছুন
  14. মিনিমাম এরে ।।ভাইয়া ঠিক আছে কিনা দেখবেন ...

    #include

    int find_min(int ara[],int n);

    int main(){
    int ara[]={1,3,5,7,9,11,13,15,17,21,-23};
    int n =12;
    int min = find_min(ara,n);
    printf("min array: %d\n",min);
    return 0;
    }

    int find_min(int ara[],int n){
    int min = ara[0];
    int i;
    for(i=0;i<n;i++){
    if(ara[i] < min){
    min = ara[i];
    }
    }
    return min;
    }

    উত্তরমুছুন
  15. ভাইয়া, 7.7 এর int max = find_max(ara, n); এই লাইনটা একটু ব্যাখ্যা করবেন প্লিজ.....

    উত্তরমুছুন
  16. Sir, can you please tell me how I can return an array in a function?

    উত্তরমুছুন
  17. আমার এই প্রোগ্রাম এ সমস্যাটা কি?
    কেন z এর আউটপুট ঠিক মত আসে না ? @ সুবিন ভাই

    #include

    int test_function(int x)
    {
    int y;
    x = y;
    y = 2*y;
    return (x*y);
    }

    int main()

    {
    int x = 12, y = 25, z = 30;
    z = test_function(x);

    printf("%d %d %d", x, y, z);

    return 0 ;
    }

    উত্তরমুছুন
    উত্তরগুলি
    1. x = y; এই লাইনে সমস্যা আছে। কারণ y-এর তো কোনো মান নাই। এটা কি y = x; হবে নাকি?

      মুছুন
    2. ধন্যবাদ বুঝতে পেরেছি
      y কোন মান নেই কিন্তু আমি y এর মান x এর মধ্যে এসাইন করেছি.
      আবার আমি যদি প্যারামিটার হিসেবে y মান ও ফাংশান এ লিখতাম তাইলে মনে হয় সমস্যা হত না।

      মুছুন
  18. বাইনারি সার্চ এর ফাংশান লিখলাম , আশা করি ঠিক আছে।
    ভুল হলে কেউ দয়া করে বলেন

    #include
    int binary_search(int ara[], int num, int low_index, int high_index)
    {
    int mid_index;
    while(low_index <= high_index)
    {
    mid_index = (low_index + high_index)/2;
    if(num == ara[mid_index])
    {
    break;
    }
    if(num < ara[mid_index])
    {
    high_index = mid_index -1;
    }
    else
    {
    low_index = mid_index + 1;
    }
    }

    return mid_index;
    }

    int main()
    {
    int ara[] = {1, 2, 5, 10, 20, 30, 35, 40, 45, 52, 62, 73, 84, 94, 97, 98};
    int low_index = 0;
    int high_index = 15;
    int num = 30;

    int mid_index = binary_search(ara, num, low_index, high_index);

    if(ara[mid_index] == num )
    {
    printf("%d is in array and positon is %d", ara[mid_index], mid_index + 1);
    }
    else
    {
    printf("%d is not in the array", num);
    }

    return 0;
    }

    উত্তরমুছুন
  19. Can you return an array from a function?I can't seem to do it.The compiler shows error.

    উত্তরমুছুন
    উত্তরগুলি
    1. You can't return array from a function. But there is a way to do it using pointer, which is beyond the scope of my book.

      মুছুন
  20. It will be helpful if you discuss about the topic "RECURSION".

    উত্তরমুছুন
  21. This book is very very very..................... nice. Thinks vaia.

    উত্তরমুছুন

এখানে বিষয়সংশ্লিষ্ট মন্তব্য কিংবা প্রশ্ন করা যাবে। বাংলায় মন্তব্য করার সময় বাংলা হরফে লিখতে হবে। আর রোমান হরফে লিখলে ইংরেজিতে লিখতে হবে। নতুবা মন্তব্য প্রকাশ করা হবে না। ধন্যবাদ।