[ সি প্রোগ্রামিং :- অধ্যায় পাঁচ] একটুখানি গণিত।

8 191

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

 

এই অধ্যায়ে আমরা প্রোগ্রামিংয়ের নতুন কিছু শিখব না। এখন পর্যন্ত আমরা যতটুকু প্রোগ্রামিং শিখেছি, তা দিয়েই কিছু সহজ-সরল গাণিতিক সমস্যার সমাধান করব।

১) x + y = 15, x – y = 5 হলে x ও y-এর মান কত?

সমীকরণদুটি যোগ করলে পাই 2x = 20, বা x = 10। আবার বিয়োগ করলে পাই, 2y = 10, বা y = 5। এখন একটি প্রোগ্রাম লিখতে হবে যেখানে x + y ও x – y-এর মান দেওয়া থাকবে, x ও y-এর মান বের করতে হবে। আমি প্রোগ্রামটি একটু পরে লিখে দেব। এর মধ্যে আপনি নিজে লিখার চেষ্টা করুন। সহজ প্রোগ্রাম।

২) 4x + 5y = 14, 5x + 6y = 17 হলে x ও y-এর মান কত?

সমীকরণ দুটিকে আমরা এভাবে লিখতে পারি:

a1x + b1y = c1, a2x + b2y = c2। আপনারা বিভিন্নভাবে এর সমাধান করতে পার। এর মধ্যে দুটি জনপ্রিয় উপায় হচ্ছে প্রতিস্থাপন (substitution) ও নির্ণায়কের (determinant) সাহায্যে সমাধান। পদ্ধতিগুলো জানা না থাকলে ক্লাস এইট বা নাইনের গণিত বই দেখুন। সমাধান করলে দেখবেন,

x = (b2c1 – b1c2) / (a1b2 – a2b1) এবং y = (a1c2 – a2c1) / (a1b2 – a2b1)। এখন a1, a2, b1, b2, c1, c2-এর জায়গায় নির্দিষ্ট মান বসিয়ে দিলেই x ও y-এর মান পাওয়া যাবে।

এই ধরনের সমীকরণ সমাধানের জন্যও আমরা একটি প্রোগ্রাম লিখব, যার ইনপুট হবে a1, a2, b1, b2, c1, c2 এবং আউটপুট হবে x ও y-এর মান। এটিও সহজ প্রোগ্রাম। নিজে চেষ্টা করুন।

আশা করি, আপনারা দুটি সমস্যারই সমাধান নিজে করে ফেলতে পারবেন। এখন আমি প্রথম সমস্যার কোড দিচ্ছি:

 #include <stdio.h>

int main()

{

double x, y, x_plus_y, x_minus_y;

printf(“Enter the value of x + y: “);

scanf(“%lf”, &x_plus_y);

printf(“Enter the value of x – y: “);

scanf(“%lf”, &x_minus_y);

x = (x_plus_y + x_minus_y) / 2;

y = (x_plus_y – x_minus_y) / 2;

printf(“x = %0.2lf, y = %0.2lf\n”, x, y);

return 0;

}

প্রোগ্রাম: ৫.১

সমাধান খুবই সহজ। তবে লক্ষ করুন যে আমি ভেরিয়েবলের ডাটা টাইপ int ব্যবহার না করে double ব্যবহার করেছি।

এবারে দ্বিতীয় সমস্যার কোড:

 #include <stdio.h>

int main()

{

double a1, a2, b1, b2, c1, c2, x, y;

printf(“a1 = “);

scanf(“%lf”, &a1);

printf(“a2 = “);

scanf(“%lf”, &a2);

printf(“b1 = “);

scanf(“%lf”, &b1);

printf(“b2 = “);

scanf(“%lf”, &b2);

printf(“c1 = “);

scanf(“%lf”, &c1);

printf(“c2 = “);

scanf(“%lf”, &c2);

x = (b2 * c1 – b1 * c2) / (a1 * b2 – a2 * b1);

y = (a1 * c2 – a2 * c1) / (a1 * b2 – a2 * b1);

printf(“x = %0.2lf, y = %0.2lf\n”, x, y);

return 0;

}

প্রোগ্রাম: ৫.২

এটিও সহজ প্রোগ্রাম! তবে আপনারা দেখুন (a1 * b2 – a2 * b1)-এর মান আমি দুবার বের করেছি (x-এর মান বের করার সময়, আবার y-এর মান বের করার সময়)। কাজটি একবারেই করা যেত এবং একবারে করলেই ভালো, তাহলে আমাদের প্রোগ্রাম দুটি গুণ ও একটি বিয়োগের কাজ কম করবে। আবার (a1 * b2 – a2 * b1)-এর মান যদি শূন্য হয়, তাহলে একটি ঝামেলা হয়ে যাচ্ছে, কারণ কোনো কিছুকে তো শূন্য দিয়ে ভাগ করা যায় না। তাই ওই মানটি শূন্য হলে আসলে সমীকরণের কোনো সমাধান নেই। এবার প্রোগ্রামটি আরও ভালোভাবে লিখে ফেলি।

 #include <stdio.h>

int main()

{

double a1, a2, b1, b2, c1, c2, d, x, y;

printf(“a1 = “);

scanf(“%lf”, &a1);

printf(“a2 = “);

scanf(“%lf”, &a2);

printf(“b1 = “);

scanf(“%lf”, &b1);

printf(“b2 = “);

scanf(“%lf”, &b2);

printf(“c1 = “);

scanf(“%lf”, &c1);

printf(“c2 = “);

scanf(“%lf”, &c2);

d = a1 * b2 – a2 * b1;

if ((int) d == 0) {

printf(“Value of x and y can not be determined.\n”);

}

else {

x = (b2 * c1 – b1 * c2) / d;

y = (a1 * c2 – a2 * c1) / d;

printf(“x = %0.2lf, y = %0.2lf\n”, x, y);

}

return 0;

}

প্রোগ্রাম: ৫.৩

এখানে একটি ব্যাপার খেয়াল করুন। আমি if-এর ভেতর লিখেছি (int) d == 0। এখানে আমি প্রথমে d (যা একটি double টাইপের ভেরিয়েবল)-কে ইন্টিজারে টাইপ কাস্ট করে তারপর তার মানটি 0-এর সমান কি না তা পরীক্ষা করেছি। পরীক্ষাটা এভাবেও করা যেত: if (d == 0.0) তবে এতে মাঝে মাঝে ঝামেলা হয়, ফ্লোটিং পয়েন্ট-সংক্রান্ত হিসাব-নিকাশের জন্য। আপনারা কম্পিউটার আর্কিটেকচার নিয়ে লেখাপড়া করলে বিষয়টা বুঝতে পারবেন।

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

৩) আমি যদি আপনাকে দশ হাজার টাকা ঋণ দিই 35% সুদে এবং টাকাটা পাঁচ বছর সময়ের মধ্যে আপনাকে সুদে-আসলে পরিশোধ করতে বলি, তাহলে পাঁচ বছরে মোট কত টাকা আপনার দিতে হবে এবং প্রতি মাসে কত টাকা দিতে হবে? ঋণটা যদি জটিল কিছু না হয়, তাহলে আপনার মোট পরিশোধ করতে হবে 10000 + 10000 * 35 / 100 টাকা। এই সহজ-সরল ঋণের জন্য একটি প্রোগ্রাম লিখে ফেলা যাক:

 #include <stdio.h>

int main()

{

double loan_amount, interest_rate, number_of_years, total_amount, monthly_amount;

printf(“Enter the loan amount: “);

scanf(“%lf”, &loan_amount);

printf(“Enter the interest rate: “);

scanf(“%lf”, &interest_rate);

printf(“Number of years: “);

scanf(“%lf”, &number_of_years);

total_amount = loan_amount + loan_amount * interest_rate / 100.00;

monthly_amount = total_amount / (number_of_years * 12);

printf(“Total amount: %0.2lf\n”, total_amount);

printf(“Monthly amount: %0.2lf\n”, monthly_amount);

return 0;

}

প্রোগ্রাম: ৫.৪

আমাদের ফর্মুলাতে একটু সমস্যা আছে। আসলে 35% সুদ দিতে হলে সেটা বাৎসরিক সুদ হবে। অর্থাৎ প্রতি বছর মোট ঋণের উপর 35% সুদ দেওয়া লাগবে। তাহলে দেখা যাচ্ছে পাঁচ বছরে আপনার মোট পরিশোধ করতে হবে 10000 + 10000 * 35 * 5 / 100 টাকা। এখন এই ফর্মুলা অনুযায়ী প্রোগ্রাম লিখে ফেলুন।

তবে বাস্তবে ঋণের হিসাব-নিকাশ কিন্তু এত সরল নয়। আপনি ব্যাংক থেকে ঋণ নিতে গেলেই সেটি টের পাবে।

৪) পদার্থবিজ্ঞানের একটি সমস্যার সমাধান করা যাক।

কোনো বস্তু u আদিবেগে (initial velocity) এবং a ত্বরণে (acceleration) যাত্রা শুরু করল (ত্বরণের মান সব সময় a থাকবে, বাড়বে বা কমবে না)। t সময় পরে এর বেগ যদি v হয় তাহলে 2t সময়ে বস্তুটি কত দূরত্ব অতিক্রম করবে? (সমস্যাটি দিয়েছেন শাহরিয়ার মঞ্জুর, এটি ভ্যালাডলিড অনলাইন জাজের 10071 নম্বর সমস্যা)।

2t সময়ে অতিক্রান্ত দূরত্ব হবে v x 2t। এটি প্রমাণ করে ফেলুন। তারপর আবার পড়া শুরু করুন। নবম-দশম শ্রেণীর পদার্থবিজ্ঞান বইতে আপনারা দুটি সূত্র পাবে:

v = u + at

s = ut + 0.5 at^2 (এখানে s হচ্ছে t সময়ে অতিক্রান্ত দূরত্ব)।

তাহলে 2t সময় পরে অতিক্রান্ত দূরত্ব হবে

u x 2t + 0.5 x a x (2t)^2 = u x 2t + 0.5 x a x 4t^2 = u x 2t + a x 2t^2 = 2t (u + at) = 2tv

এখন, আপনাদেরকে একটি প্রোগ্রাম লিখতে হবে, যেখানে v ও t-এর মান ইনপুট হিসেবে দেওয়া হবে, 2t সময়ে অতিক্রান্ত দূরত্ব নির্ণয় করতে হবে। প্রোগ্রামটি নিজে নিজে লিখে ফেলুন।

৫) 1 + 2 + 3 + … + 998 + 999 + 1000 এই ধারার সমষ্টি কত?

আপনারা যারা ধারার যোগফলের সূত্র জানেন, তারা চট করে বলে দিতে পারবেন, এই ধারাটির যোগফল হচ্ছে 1000 x 1001 / 2। তাহলে এর জন্য একটি প্রোগ্রাম লিখে ফেলা যাক, যেখানে শেষ পদের মান হবে ইনপুট আর আউটপুট হবে যোগফল।

 #include <stdio.h>

int main()

{

int n, sum;

scanf(“%d”, &n);

sum = (n * (n + 1)) / 2;

printf(“Summation is %d\n”, sum);

return 0;

}

প্রোগ্রাম: ৫.৫

ধারার যোগফল নির্ণয়ের সূত্র জানা না থাকলে আমরা লুপ ব্যবহার করে প্রোগ্রামটি লিখতে পারি।

 #include <stdio.h>

int main()

{

int i, n, sum;

scanf(“%d”, &n);

for(i = 1, sum = 0; i <= n; i++) {

sum = sum + i;

}

printf(“Summation is %d\n”, sum);

return 0;

}

প্রোগ্রাম: ৫.৬

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

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

৬) আমাদের এবারকার প্রোগ্রামটি হবে তাপমাত্রাকে সেলসিয়াস (Celsius) থেকে ফারেনহাইটে (Farenheit) রূপান্তর করার প্রোগ্রাম।

সেলসিয়াসকে ফারেনহাইটে রূপান্তরের সূত্র হচ্ছে: °F = (°C × 1.8) + 32।

 #include <stdio.h>

int main()

{

double celsius, farenheit;

printf(“Enter the temperature in celsius: “);

scanf(“%lf”, &celsius);

farenheit = 1.8 * celsius + 32;

printf(“Temperature in farenheit is: %lf\n”, farenheit);

return 0;

}

প্রোগ্রাম: ৫.৭

এখন আপনাদের কাজ হচ্ছে ফারেনহাইট থেকে সেলসিয়াসে রূপান্তরের প্রোগ্রাম লেখা।

৭) এখন আমরা দুটি সংখ্যার গসাগু (GCD → Greatest Common Divisor বা HCF → Highest Common Factor) ও লসাগু (LCM → Least Common Multiple) নির্ণয় করার জন্য প্রোগ্রাম লিখব।

দুটি সংখ্যার গসাগু হচ্ছে যেসব সংখ্যা দিয়ে ওই দুটি সংখ্যা নিঃশেষে বিভাজ্য হয়, তাদের মধ্যে সবচেয়ে বড় সংখ্যা। তাহলে আমরা যেটি করব, দুটি সংখ্যা a ও b নেব। তারপর এদের মধ্যে যেটি ছোট, সেই মানটি আবার x ভেরিয়েবলে রাখব। গসাগু এর মান x-এর চেয়ে বড় হওয়া সম্ভব নয় (5 ও 10-এর গসাগু-এর মান নিশ্চয়ই 5-এর চেয়ে বড় হবে না)। এখন a ও b, x দিয়ে নিঃশেষে বিভাজ্য হয় কি না (a % x == 0 এবং b % x == 0) সেটি পরীক্ষা করব। যদি হয় তবে আমরা গসাগু পেয়ে গেছি। যদি a ও b উভয়েই নিঃশেষে বিভাজ্য না হয়, তখন x-এর মান এক কমিয়ে পরীক্ষা করব। যতক্ষণ না আমরা গসাগু পাচ্ছি x-এর মান কমাতেই থাকব। একসময় আমরা গসাগু পাবই, কারণ x-এর মান যখন 1 হবে, তখন তো x দিয়ে a ও b দুটি সংখ্যাই নিঃশেষে বিভাজ্য। আপনারা কি প্রোগ্রামটি নিজে লিখার চেষ্টা করবেন? না পারলে আমার কোড দেখুন:

 #include <stdio.h>

int main()

{

int a, b, x, gcd;

scanf(“%d %d”, &a, &b);

if (a < b) {

x = a;

}

else {

x = b;

}

for(; x >= 1; x–) {

if (a % x == 0 && b % x == 0) {

gcd = x;

break;

}

}

printf(“GCD is %d\n”, gcd);

return 0;

}

প্রোগ্রাম: ৫.৮

প্রোগ্রামে দেখুন gcd পাওয়ার সঙ্গে সঙ্গে লুপ থেকে বের হয়ে যেতে হবে (আমি break ব্যবহার করেছি এই জন্য)। break ব্যবহার না করলে কী হবে সেটি পরীক্ষা করে দেখুন।

তবে গসাগু বের করার জন্য আমি যেই পদ্ধতি ব্যবহার করেছি সেটি খুব সহজ পদ্ধতি হলেও ইফিশিয়েন্ট (efficient) নয়। যেমন, সংখ্যা দুটি খুব বড় হলে এবং সহমৌলিক (co-prime) হলে লুপটি কিন্তু অনেকবার ঘুরবে। কারণ সহমৌলিক হলে গসাগু হবে 1। আপনারা নিশ্চয়ই জানেন যে, দুটি সংখ্যার মধ্যে 1 ছাড়া আর কোনো সাধারণ উৎপাদক না থাকলে সংখ্যা দুটি সহমৌলিক।

গসাগু বের করার জন্য ইউক্লিডের একটি চমৎকার পদ্ধতি আছে। ইউক্লিড ভাগশেষ উপপাদ্যের (division algorithm) সাহায্যে গসাগু বের করার উপায় দেখিয়েছেন। এই পদ্ধতিতে খুব সহজে গসাগু বের করা যায় এবং প্রোগ্রামটিও বেশ ইফিশিয়েন্ট হয়। এর জন্য দুটি জিনিস জানা লাগবে:

a ও 0-এর গসাগু-এর মান a।

a ও b-এর গসাগু = b ও a % b-এর গসাগু।

তাহলে প্রোগ্রামে যেটি করতে হবে, একটি লুপের সাহায্যে a-এর মান b আর b-এর মান a%b বসিয়ে যেতে হবে, যতক্ষণ না b-এর মান শূন্য হয়। b-এর মান শূন্য হলেই বুঝে যাব যে গসাগু হচ্ছে a (এটা কিন্তু প্রোগ্রাম শুরুর সময় a-এর মান না, b-এর মান যখন শূন্য হবে সেই সময় a-এর মান)।

 #include <stdio.h>

int main()

{

int a, b, t, x, gcd;

scanf(“%d %d”, &a, &b);

if (a == 0) gcd = b;

else if (b == 0) gcd = a;

else {

while (b != 0) {

t = b;

b = a % b;

a = t;

}

gcd = a;

}

printf(“GCD is %d\n”, gcd);

return 0;

}

প্রোগ্রাম: ৫.৯

এই প্রোগ্রামটি আরও ইফিশিয়েন্ট করার চেষ্টা করুন।

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

দুটি সংখ্যার লসাগু x দুটি সংখ্যার গসাগু = সংখ্যা দুটির গুণফল।

Series Navigation<< [ সি প্রোগ্রামিং :- অধ্যায় চার ] লুপ [LOOP] ।
8 মন্তব্য
  1. হামিদ খান বলেছেন

    ভাই লেখা দিলেন ঠিক আছে যদি সাথে পিডিএফ ফাইল করে দিতেন তাহলে ভালো হত

    1. sabuj বলেছেন

      সব অধ্যায় লিখা শেষ হলে একটি পিডিএফ ফাইলের বই দিব (মানে এক সাথে সব অধ্যায়)।

  2. হামিদ খান বলেছেন

    সুন্দর, চালিয়ে যান,,,আমরা সাথে আছি……

    1. sabuj বলেছেন

      আপনাদের আগ্রহ দেখে ভাল লাগলো ।

  3. মোঃ আসলাম পারভেজ বলেছেন

    ও চমৎকার বিষয় ভাই ।

    1. sabuj বলেছেন

      আপনাদের আগ্রহ দেখে ভাল লাগলো ।

  4. লিটন হাফিজুর বলেছেন

    চমৎকার পোস্ট। শেয়ার করার জন্য ধন্যবাদ সবুজ ভাই।

    1. sabuj বলেছেন

      @লিটন হাফিজুর: @লিটন হাফিজুর: আপনাকে অনেক অনেক ধন্যবাদ একটি মূল্যবান comment করার জন্য ।

উত্তর দিন