রিকার্সিভ কল

আমরা অনেক প্রোগ্রামের প্রয়োজনে বিভিন্ন সময় রিকার্শন ব্যবহার করে থাকি যেমন – কোন নাম্বারের ফ্যাক্টোরিয়াল বের করা, ফিবোনাচ্চি/ফিবোনাক্কি নাম্বার বের করা, GCD নাম্বার বের করা, ইত্যাদি। কিন্তু রিকার্শনের মাধ্যমে একটা নাম্বারের জন্য কোন রেজাল্ট পাওয়ার জন্য আমাদের লেখা ফাংশনটা মোট কয়বার কল হচ্ছে সেটা বের করি না, কিংবা বের করার দরকার হয় না। কিন্তু মাঝে মাঝে কিছু প্রোগ্রামিং কনটেস্ট অথবা অনলাইন জাজগুলোতে এইরকম প্রবলেম দেখা যায়। কিছুদিন আগে URI Online Judge এ একটা প্রবলেম সলভ করার সময় আমি এই সমস্যায় পড়েছিলাম। ঐই প্রবলেমে দুইটা কাজ ছিলঃ ১। একটা ইনপুট নাম্বারের ফিবোনাচ্চি নাম্বার বের করা এবং ২। ঐই নাম্বারের ফিবোনাচ্চি বের করার জন্য মোট কতবার ফাংশনটা কল হয়েছে সেটা বের করা । এই পোষ্টটা লেখার প্রধান উদ্দেশ্য হল ফিবোনাচ্চি নাম্বার বের করার সময় একটা ফাংশন মোট কতবার কল হয় সেটা দেখা এবং C/C++ এবং Java তে কিভাবে ইম্পিমেন্ট করতে হত সেটা শিখা।
ফিবোনাচ্চি নাম্বার বের করার সূত্র হলঃ

formula of fibonacci number

উপরের ছবি থেকে আমরা দেখছি যখন নাম্বারটা 0 (শূন্য) এবং 1 তখন আমরা সরাসরি রেজাল্ট পাচ্ছি এবং ফাংশনটা একবারও রিকার্সিভ কল হচ্ছে না। তাই আমরা আমাদের ফাংশনে (যেটা দিয়ে আমরা রিকার্সিভ কলের সংখ্যাটা গুনব) 0 এবং 1 এর জন্য 0 রিটার্ন করতে পারি।

fibonacci call tree

ছবিটি URI Online Judge থেকে নেওয়া হয়েছে

যখন নাম্বারটা 1 থেকে বড় তখন আমাদেরকে গুনতে হবে মোট কয়বার ফাংশনটা কল হচ্ছে। উপরের ছবিতে আমরা দেখতে পারছি মোট ৮ বার কল হয়েছে। কিভাবে?

১। ইনপুট ৪ কল দিয়েছে F(৩) এবং F(২) কেঃ এই ধাপে কল হল ২টা
২। এরপর F(৩) কল দিয়েছে F(২) এবং F(২) কে, আবার F(২) [যেটা ৪ এর কলে পেয়েছি] কল করছে F(১) এবং F(০) কে, এই ধাপে কল হল ৪ টা।
৩। F(২) [যেটা F(৩) এর কলে পেয়েছি] সেটা কল করছে F(১) এবং F(০) কে, এই ধাপে কল হল ২ টা।
সর্বমোট কলঃ ২ + ৪ + ২ = ৮।

উপরের ছবি থেকে আমরা দেখতে পাই একটা নাম্বার সমসময় এর পূর্বের দুইটা নাম্বারকে কল করছে। এই থেকে আমরা বলতে পারি একটা নাম্বারের জন্য একটা ফাংশনকে কল করার সংখ্যা এর পূর্বের দুইটা নাম্বারের কলের সংখ্যা + ২।
উদাহরনঃ

call(0) = 0
call(1) = 0
call(2) = call(0) + call(1) + 2 = 0 + 0 + 2 = 2
call(3) = call(2) + call(1) + 2 = 0 + 2 + 2 = 4
call(4) = call(3) + call(2) + 2 = 4 + 2 + 2 = 8
call(5) = call(4) + call(3) + 2 = 8 + 4 + 2 = 14

তাহলে আমরা লিখতে পারিঃ

call(n) = call(n-1) + call(n-2) + 2

সম্পূর্ন ফাংশনঃ

int call(int n)
{
    if(n == 0 || n == 1)
    {
        return 0;
    }
    else
    {
        return call(n-1)+call(n-2)+2;
    }
}

C/C++:

#include <bits/stdc++.h>
using namespace std;

int call(int n)
{
    if(n == 0 || n == 1)
    {
        return 0;
    }
    else
    {
        return call(n-1)+call(n-2)+2;
    }
}

int main()
{
    int n;
    while(scanf("%d", &n) == 1)
    {
        printf("Total calls = %d\n", call(n));
    }
    return 0;
}

Java:


import java.util.Scanner;

public class Main
{
	static int call(int n)
	{
		if(n == 0 || n == 1)
		{
			return 0;
		}
		else
		{
			return call(n-1) + call(n-2) + 2;
		}
	}

	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);
		int n;
		while(sc.hasNext())
		{
			n = sc.nextInt();
			System.out.println(&quot;Total calls: &quot; + call(n));
		}
	}
}

এই সম্পর্কিত প্রোগ্রামিং সমস্যাঃ
1. Fibonacci, How Many Calls? [URI – 1029]

আশাকরি আজকের পোষ্টটা বুঝতে আপনাদের কোন সমস্যা হয়নি।

সি শার্প টিউটোরিয়াল – ৭ঃ সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজের সিলেক্ট অপারেশনের ব্যবহার

সি শার্প টিউটোরিয়ালের আজকের পর্বে আপনাদের সবাইকে স্বাগতম জানাচ্ছি। আমরা সর্বশেষ পোষ্টে সি শার্প প্রজেক্টের ডাটা মাইএসকিউএল ডাটাবেইজে ইনসার্ট করার একটা পদ্ধতি দেখেছিলাম (পোষ্টটা এখানে পাবেন) এবং তার আগের পোষ্টে সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজের কানেকশন দেওয়ার একটা পদ্ধতি দেখেছিলাম (পোষ্টটা এখানে পাবেন)। আজকের পোষ্টে আমরা সি শার্প প্রজেক্টে মাইএসকিউএল (MySQL) ডাটাবেইজের ডাটা সিলেক্ট করার একটা পদ্ধতি দেখব। সি শার্প প্রজেক্টের অনেকগুলো কাজে মাইএসকিউএল ডাটাবেইজের ডাটা ব্যবহার করতে হয়, যেমনঃ লগইন এর ক্ষেত্রে ইউজার আইডি আর পাসওয়ার্ড চেক করার জন্য, রেজিষ্ট্রেশন এর ক্ষেত্রে ইউজার আইডি চেক করার জন্য, … …
আজকের পোষ্টে আমরা দেখব কিভাবে মাইএসকিউএল ডাটাবেইজের ডাটা সি শার্পের স্ট্রিং ভ্যারিয়েবলে রাখতে হয়। পরবর্তী কোন পোষ্টে আমরা ডাটাগুলো কিভাবে .নেট ফ্রেমওয়ার্কের কম্বোবক্সে রাখতে হয় তা দেখব।
আমরা উদাহরনস্বরুপ একটা সি শার্প প্রজেক্ট নিয়ে কাজ করছি যেটা শুধুমাত্র ইউজারের নাম ডাটাবেইজে স্টোর/সেইভ করে রাখে। মনেকরুন আমাদের ডাটাবেইজের নাম “user” এবং আমরা “info” নামের টেবল/টেবিল এ ডাটা ইনসার্ট করব, যার দুইটা কলাম আছে যেগুলোঃ fname, lname।
simple mysql db structure
আপনার যারা আগের দুইটা পোষ্ট দেখেছেন তার জানেন যে সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজ ব্যবহার করার জন্য আমাদেরকে নিচের লাইব্রেরী/নেইমস্পেইসটা লিখতে হবেঃ

	using MySql.Data.MySqlClient;

ডাটাবেইজের ডাটা সিলেক্ট করার জন্য আমাদেরকে নিচের কয়েকটা পদ্ধতি অনুসরন করতে হবে।
১। ডাটাবেইজের কানেকশন দেওয়ার জন্য প্রথমে আমাদেরকে MySqlConnection ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

MySqlConnection instance_name = new MySqlConnection(string connection_string);

instance_name এর জন্য আমরা যেকোন নাম ব্যবহার করতে পারি [এগুলো ভ্যালিড নাম, যেমনঃ conn, _conn, conn_, conn1, etc. এগুলো ইনভ্যালিড নামঃ 1conn, @conn, etc]। MySqlConnection ক্লাসের ইন্সট্যান্স ডিক্লায়ার করার সময় প্যারামিটারে আমাদেরকে যে ডাটাবেইজটা ব্যবহার করব তার কানেকশন স্ট্রিং ডিক্লায়ার করতে হবে। মাইএসকিউএল ডাটাবেইজের জন্য আমরা নিচের কানেকশন স্ট্রিংটা ব্যবহার করতে পারিঃ

“server = server_link; port = port_number; database = database_name; username= username; password=password”

উপরের কানেকশন স্ট্রিংটা ছাড়া আমরা চাইলে নিচের কানেকশন স্ট্রিংটাও ব্যবহার করতে পারিঃ

“datasource = datasource_link; port = port_number; database = database_name; username= username; password=password”

যদি কোন কারনে আপনার নেটওয়ার্কের পোর্ট নাম্বার জানা না থাকে তাহলে আপনি চাইলে কানেকশন স্ট্রিং থেকে পোর্ট নাম্বারটা বাদ দিতে পারেন। সেক্ষেত্রে আমাদের কানেকশন স্ট্রিংটা এইভাবে লিখতে হবেঃ

“server = server_link; database = database_name; username= username; password=password”

আমরা চাইলে কানেকশন স্ট্রিং থেকে আমাদের ডাটাবেইজের নামটা বাদ দিতে পারি। এতে যে সমস্যাটা হয় তা হয় হলঃ ডাটাবেইজের কুয়েরীতে আমাদেরকে প্রতিবার টেবলের নামের আগে ডাটাবেইজের নামটা উল্লেখ করে দিতে হয়। যেমনঃ

select * from user.info;

উপরের কুয়েরীর user.info তে user হল ডাটাবেইজ আর info হল টেবল।
যদি আপনি WAMP/XAMPP অথবা অন্যকোন লোকাল সার্ভার (localhost) ব্যবহার করেন এবং localhost এর কোন তথ্য পরিবর্তন না করেন তাহলে আপনার কানেকশন স্ট্রিংটা অনেকটা নিচের কানেকশন স্ট্রিংটার মত হবেঃ
server/ datasource = localhost
port = 3306;
database_name = depends on you.
username = root;
password =
তাহলে সি শার্পের প্রজেক্টের জন্য আমাদের কানেকশন স্ট্রিংটা হবে অনেকটা নিচের মতঃ

MySqlConnection instance_name = new MySqlConnection("server = localhost;database = database_name; username=root; password=;";
);

আপনারা চাইলে কানেকশন স্ট্রিংটা একটা স্ট্রিং ভ্যারিয়েবলে রাখতে পারেন। যেক্ষেত্রে আমাদের কানেকশন স্ট্রিংটা অনেকটা নিচের মত হবেঃ

string connstr = "server = localhost;database = user; username=root; password=;";
MySqlConnection instance_name = new MySqlConnection(connstr);

২। এরপর ডাটা ইনসার্ট/ডিলিট/আপডেট/সিলেক্ট করার জন্য আমাদেরকে MySqlDataAdapter ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

MySqlDataAdapter instance_name = new MySqlDataAdapter();

৩। এরপর MySqlDataAdapter এর ইন্সট্যান্সটা দিয়ে আমাদেরকে মাইএসকিউএল এর SelectCommand টা সেট করতে হবে। এটা একটা MySqlCommand। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

Instance_of_MySqlDataAdapter. SelectCommand = new MySqlCommand(string query, instance_of_ MySqlConnection);

এ কমেন্ডটা দুইটা প্যারামিটার ইনপুট নে। যার প্রথমটা হল কুয়েরী এবং দ্বিতীয়টা হল MySqlConnection এর ইনট্যান্স।
আমরা চাইলে কুয়েরীটা একটা স্ট্রিং ভ্যারিয়েবলে ডিক্লায়ার করতে পারি। যদি আমাদের MySqlConnection এর ইন্সট্যান্সটা conn এবং MySqlDataAdapter এর adapter ইন্সট্যান্সটা হয় সেক্ষেত্রে আমরা নিচের সিনট্যাক্স অনুসরন করতে পারিঃ

string query = “select from table_name ….“;
adapter.SelectCommand = new MySqlCommand(query, conn);

৪। ডাটাবেইজ থেকে ডাটা সিলেক্ট করার জন্য MySqlDataReader ক্লাসের ইন্সট্যান্স ডিক্লায়ার করতে হবে। এটা ইনসার্ট, ডিলিট, এবং আপডেট এর জন্য লাগবে না। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

	MySqlDataReader instance_name;

৫। এরপর আমাদের একটা স্ট্রিং ভ্যারিয়েবল এবং একটা ইন্টিজার ভ্যারিয়েবল লাগবে। স্ট্রিং ভ্যারিয়েবলটাতে আমরা ডাটাবেইজের ডাটা রাখব আর ইন্টিজার ভ্যারিয়াবল দিয়ে যতক্ষন ডাটাবেইজ থেকে ডাটা পাবে ততক্ষন স্ট্রিং ভ্যারিয়েবলের ইনডেক্স ১ করে বাড়াতে থাকব। সেজন্য ইন্টিজার ভ্যারিয়েবলটা ডিক্লায়ার করার সময় এর ভ্যালু ০ (শূন্য) ডিক্লায়ার করে দিতে হবে।
৬। এরপর আমরা বাকী কাজগুলো try-catch ব্লকের মধ্যে করব।
try ব্লকে আমরা ডাটা সিলেক্টের সবগুলো কাজ করব এবং catch ব্লকে শুধুমাত্র ডাটাবেইজ কানেকশনের কোন এরর থাকলে শুধুমাত্র সেটা ম্যাসেজ হিসেবে প্রিন্ট করব।
try ব্লকের শুরুতে আমাদেরকে ডাটাবেইজ কানেকশনটা অন করতে হবে। এজন্য আমাদেরকে MySqlConnection এর ইন্সট্যান্সটা দিয়ে আমরা MySqlConnection ক্লাসের Open() ফাংশনটা কল দিতে হবে।
এরপর আমাদেরকে কুয়েরীটা এক্সিকিউট করতে হবে। এজন্য আমাদেরকে MySqlDataAdapter এর ইন্সট্যান্সটা দিয়ে ExecuteReader() ফাংশনটা কল করতে হবে, এবং এই ফাংশনটা আমদেরকে MySqlDataReader এর যে ইন্সট্যান্স ডিক্লায়ার করেছি সেটাতে কল করতে হবে। এতে করে ডাটাবেইজ থেকে যে ভ্যালুগুলো পাবে সবগুলো MySqlDataReader এর ইন্সট্যান্সে স্টোর হবে। এই কল করার কোডটা অনেকটা নিচের মতঃ
মনেকরুন আমাদের MySqlDataReader ক্লাসের ইন্সট্যান্স reader এবং MySqlDataAdapter ক্লাসের ইন্সট্যান্স adapter, সেক্ষেত্রেঃ

	reader = adapter.SelectCommand.ExecuteReader();

নোটঃ ExecuteReader() ফাংশনটা শুধুমাত্র সিলেক্ট অপারেশনের কুয়েরীগুলোর ক্ষেত্রে কাজ করবে। ইনসার্ট, ডিলিট এবং আপডেট এর জন্য ExecuteNonQuery() ফাংশনটা ব্যবহার করতে হবে।

এখন আমাদের MySqlDataReader ক্লাসের ইন্সট্যান্সটা থেকে ডাটাবেইজের ডাটাগুলো আমাদেরকে আমাদের স্ট্রিং ভ্যারিয়েবলে রাখতে হবে। যেহেতু ইন্সট্যান্সটা ডাটাবেইজ থেকে একের অধিক ডাটা পেতে পারে (কুয়েরীর উপর নির্ভর করে) সেহেতু আমাদেরকে একটা লুপের মাধ্যমে ডাটাগুলো স্ট্রিং ভ্যারিয়েবলে রাখতে হবে। এজন্য আমরা while লুপ ব্যবহার করতে পারি এবং কন্ডিশন হিসেবে দিতে পারি MySqlDataReader_instance.Read(), এটার একটা কোড নিচের মত হতে পারে (মনেকরুন আমাদের MySqlDataReader ক্লাসের ইন্সট্যান্স reader) –

while(reader.Read())
{
     	…
     	//do your task
	     …
}

Read() ফাংশনটার কাজ হল এটা যতক্ষন পর্যন্ত reader ইন্সট্যান্স এ ডাটাবেইজের ভ্যালু পাবে ততক্ষন পর্যন্ত while লুপের কন্ডিশন true দিবে।

মনে রাখবেনঃ

আপনার ডাটাবেইজের টেবলে যদি n সংখ্যক কলাম থাকে তাহলে reader[0] তে আপনি ১ম কলামের ডাটা পাবেন, reader[1] এ আপনি ২য় কলামের ডাটা পাবেন,reader[2] তে আপনি ৩য় কলামের ডাটা পাবেন, … …, reader[n-1] এ আপনি n কলামের ডাটা পাবেন। সেক্ষত্রে ডাটাগুলোকে ToString() ফাংশন ব্যবহার করে সহজে স্ট্রিং ডাটা হিসেবে কনভার্ট করতে পারবেন। [কনভার্ট করার নিয়মঃ reader[0].ToString()]

৭। catch ব্লকে আমরা শুধুমাত্র ডাটাবেইজের কোন এরর থাকলে সেটা ম্যাসেজ হিসেবে দেখাব, সেটা যেকোন ম্যাসেজ হতে পারে।
আজকের পোষ্টের জন্য সম্পূর্ন একটা কোডের উদাহরনঃ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;

namespace Selecting_Data
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] res = new string[100];
            int jj = 0;
            string connstr = "server=localhost; port=3306; database=user; username=root; password=;";
            MySqlConnection conn = new MySqlConnection(connstr);
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            MySqlDataReader reader;
            string qry = "select * from info";
            adapter.SelectCommand = new MySqlCommand(qry, conn);
            try
            {
                conn.Open();
                reader = adapter.SelectCommand.ExecuteReader();
                while(reader.Read())
                {
                    res[jj++] = reader[0].ToString() + " " + reader[1].ToString();
                }
                res[jj] = "\0";
                conn.Close();
                for (int i = 0; i &lt; jj; i++)
                {
                    Console.WriteLine(res[i]);
                    Console.WriteLine();
                }
                Console.ReadKey();
            }
            catch(MySqlException Ex)
            {
                Console.WriteLine("Error:\n" + Ex.Message);
                Console.ReadKey();
            }
        }
    }
}

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

সি শার্প টিউটোরিয়াল – ৬ঃ সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজের ইনসার্ট অপারেশন

সি শার্প টিউটোরিয়ালের আজকের পর্বে আপনাদের সবাইকে স্বাগতম জানাচ্ছি। আজকের পোষ্টে আমরা সি শার্প প্রজেক্টের ডাটা মাইএসকিউএল (MySQL) ডাটাবেইজে ইনসার্ট করার একটা পদ্ধতি দেখব। আমরা সর্বশেষ পোষ্টে সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজ ব্যবহার করার একটা পদ্ধতি দেখেছিলাম। আজকের পোষ্টে ডাটা ইনসার্ট করার জন্য আমরা একই পদ্ধতি ব্যবহার করব। তাই আপনারা যারা আগের পোষ্টটি দেখতে পারেন নি তারা এখানে পোষ্টটি পাবেন
আমরা ডাটা ইনসার্ট করার জন্য যে পদ্ধতিটি ব্যবহার করব আমার জানা মতে সেটা একেবারে সহজ পদ্ধতি। আপনারা নিজের পছন্দ মত যেকোন একটা প্রজেক্টের জিইউআই/গুই (GUI) ডিজাইন করতে পারেন অথবা নিচের প্রজেক্টের মত একটা স্যাম্পল তৈরি করতে পারেন।
GUI of a simple C# project
উপরের ছবিতে আমরা উদাহরনস্বরুপ একটা সি শার্প প্রজেক্ট নিয়ে কাজ করছি যেটা শুধুমাত্র ইউজারের নাম ডাটাবেইজে স্টোর/সেইভ করে রাখে। মনেকরুন আমাদের ডাটাবেইজের নাম “user” এবং আমরা “info” নামের টেবল/টেবিল এ ডাটা ইনসার্ট করব।
simple mysql db structure
সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজ ব্যবহার করার জন্য আমাদেরকে নিচের লাইব্রেরী/নেইমস্পেইসটা লিখতে হবেঃ

	using MySql.Data.MySqlClient;

ডাটাবেইজে ডাটা ইনসার্ট করার জন্য আমাদেরকে নিচের কয়েকটা পদ্ধতি অনুসরন করতে হবে।
১। ডাটাবেইজের কানেকশন দেওয়ার জন্য প্রথমে আমাদেরকে MySqlConnection ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

MySqlConnection instance_name = new MySqlConnection(string connection_string);

instance_name এর জন্য আমরা যেকোন নাম ব্যবহার করতে পারি [এগুলো ভ্যালিড নাম, যেমনঃ conn, _conn, conn_, conn1, etc. এগুলো ইনভ্যালিড নামঃ 1conn, @conn, etc]। MySqlConnection ক্লাসের ইন্সট্যান্স ডিক্লায়ার করার সময় প্যারামিটারে আমাদেরকে যে ডাটাবেইজটা ব্যবহার করব তার কানেকশন স্ট্রিং ডিক্লায়ার করতে হবে। মাইএসকিউএল ডাটাবেইজের জন্য আমরা নিচের কানেকশন স্ট্রিংটা ব্যবহার করতে পারিঃ

“server = server_link; port = port_number; database = database_name; username= username; password=password”

উপরের কানেকশন স্ট্রিংটা ছাড়া আমরা চাইলে নিচের কানেকশন স্ট্রিংটাও ব্যবহার করতে পারিঃ

“datasource = datasource_link; port = port_number; database = database_name; username= username; password=password”

যদি কোন কারনে আপনার নেটওয়ার্কের পোর্ট নাম্বার জানা না থাকে তাহলে আপনি চাইলে কানেকশন স্ট্রিং থেকে পোর্ট নাম্বারটা বাদ দিতে পারেন। সেক্ষেত্রে আমাদের কানেকশন স্ট্রিংটা এইভাবে লিখতে হবেঃ

“server = server_link; database = database_name; username= username; password=password”

আমরা চাইলে কানেকশন স্ট্রিং থেকে আমাদের ডাটাবেইজের নামটা বাদ দিতে পারি। এতে যে সমস্যাটা হয় তা হয় হলঃ ডাটাবেইজের কুয়েরীতে আমাদেরকে প্রতিবার টেবলের নামের আগে ডাটাবেইজের নামটা উল্লেখ করে দিতে হয়। যেমনঃ

select * from user.info;

উপরের কুয়েরীর user.info তে user হল ডাটাবেইজ আর info হল টেবল।
যদি আপনি WAMP/XAMPP অথবা অন্যকোন লোকাল সার্ভার (localhost) ব্যবহার করেন এবং localhost এর কোন তথ্য পরিবর্তন না করেন তাহলে আপনার কানেকশন স্ট্রিংটা অনেকটা নিচের কানেকশন স্ট্রিংটার মত হবেঃ
server/ datasource = localhost
port = 3306;
database_name = depends on you.
username = root;
password =
তাহলে সি শার্পের প্রজেক্টের জন্য আমাদের কানেকশন স্ট্রিংটা হবে অনেকটা নিচের মতঃ

MySqlConnection instance_name = new MySqlConnection("server = localhost;database = database_name; username=root; password=;";
);

আপনারা চাইলে কানেকশন স্ট্রিংটা একটা স্ট্রিং ভ্যারিয়েবলে রাখতে পারেন। যেক্ষেত্রে আমাদের কানেকশন স্ট্রিংটা অনেকটা নিচের মত হবেঃ

string connstr = "server = localhost;database = user; username=root; password=;";
MySqlConnection instance_name = new MySqlConnection(connstr);

২। এরপর ডাটা ইনসার্ট/ডিলিট/আপডেট/সিলেক্ট করার জন্য আমাদেরকে MySqlDataAdapter ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

MySqlDataAdapter instance_name = new MySqlDataAdapter();

৩। এরপর MySqlDataAdapter এর ইন্সট্যান্সটা দিয়ে আমাদেরকে মাইএসকিউএল এর InsertCommand টা সেট করতে হবে। এটা একটা MySqlCommand। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

Instance_of_MySqlDataAdapter.InsertCommand = new MySqlCommand(string query, instance_of_ MySqlConnection);

এ কমেন্ডটা দুইটা প্যারামিটার ইনপুট নে। যার প্রথমটা হল কুয়েরী এবং দ্বিতীয়টা হল MySqlConnection এর ইনট্যান্স।
আমরা চাইলে কুয়েরীটা একটা স্ট্রিং ভ্যারিয়েবলে ডিক্লায়ার করতে পারি। যদি আমাদের MySqlConnection এর ইন্সট্যান্সটা conn এবং MySqlDataAdapter এর adapter ইন্সট্যান্সটা হয় সেক্ষেত্রে আমরা নিচের সিনট্যাক্স অনুসরন করতে পারিঃ

string query = “insert into table_name values ……“;
adapter.InsertCommand = new MySqlCommand(query, conn);

৪। এরপর আমরা বাকী কাজগুলো try-catch ব্লকের মধ্যে করব।
try ব্লকে আমরা ডাটা ইনসার্টের সবগুলো কাজ করব এবং catch ব্লকে শুধুমাত্র ডাটাবেইজ কানেকশনের কোন এরর থাকলে শুধুমাত্র সেটা ম্যাসেজ হিসেবে প্রিন্ট করব।
try ব্লকের শুরুতে আমাদেরকে ডাটাবেইজ কানেকশনটা অন করতে হবে। এজন্য আমাদেরকে MySqlConnection এর ইন্সট্যান্সটা দিয়ে আমরা MySqlConnection ক্লাসের Open() ফাংশনটা কল দিতে হবে।
এরপর আমাদেরকে কুয়েরীটা এক্সিকিউট করতে হবে। এজন্য আমাদেরকে MySqlDataAdapter এর ইন্সট্যান্সটা দিয়ে ExecuteNonQuery() ফাংশনটা কল করতে হবে।
নোটঃ ExecuteNonQuery() ফাংশনটা দিয়ে ইনসার্ট, ডিলিট, আপডেট এর কুয়েরীগুলো এক্সিকিউট করতে পারি। সিলেক্ট অপারেশনের কুয়েরীগুলোর ক্ষেত্রে ExecuteNonQuery()
ফাংশনটা দিয়ে কুয়েরীগুলো এক্সিকিউট হলেও যে ডাটাগুলো আম্মাদের কুয়েরীটা সিলেক্ট করবে সেগুলো দিয়ে কাজ করাটা মোটামুটি কঠিন কাজ/কাজ করা যায় না বললেও চলে। এই টপিক্সটা নিয়ে আমরা পরবর্তী কোন পোষ্টে আলোচনা করব।
আজকের পোষ্টের জন্য সম্পূর্ন একটা কোডের উদাহরনঃ

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace C_Sharp_Tutorial
{
    public partial class Login : Form
    {
        public Login()
        {
            InitializeComponent();
        }

        private void button_save_Click(object sender, EventArgs e)
        {
            string constr = "server = localhost;database = user; username=root; password=;";
            MySqlConnection conn = new MySqlConnection(constr);
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            string query = "insert into info values('" + textBox_firstname.Text + "','" + textBox_lastname.Text + "')";
            adapter.InsertCommand = new MySqlCommand(query, conn);
            try
            {
                conn.Open();
                adapter.InsertCommand.ExecuteNonQuery();
                MessageBox.Show("Informtation is added!", "Success");
                conn.Close();
            }
            catch(MySqlException Ex)
            {
                MessageBox.Show(Ex.Message, "Error");
            }
        }
    }
}

আশাকরি আজকের পোষ্টটা বুঝতে আপনাদের কোন সমস্যা হয় নি। পরবর্তী পোষ্টে আমরা সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজের সিলেক্ট অপারশনের কাজ কিভাবে করতে হয় তা দেখব।

সি শার্প টিউটোরিয়াল – ৫ঃ সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজের ব্যবহার

সি শার্প টিউটোরিয়ালের আজকের পোষ্টে আমরা দেখব কিভাবে সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজ ব্যবহার করা হয়। সি শার্পে মাইএসকিউএল ডাটাবেইজ ব্যবহার করার জন্য আমাদেরকে মাইএসকিউএল এর একটা কানেকটর/ড্রাইভার ব্যবহার করতে হবে। যেটা .নেট কানেকটর নামে পরিচিত। আপনাদের যদি মাইএসকিউএল এর .net কানেকটর/ড্রাইভার না থাকে তাহলে পাশের লিংক থেকে কানেকটরটা ডাউনলোড করে নিতে পারেনঃ মাইএসকিউএল কানেকটরের লিংক। যদি কোন কারনে এই লিংকটা কাজ না করে তাহলে গুগলে সার্চ করে ডাউনলোড করতে পারেন।
ডাউনলোড করার পর আমাদেরকে মাইএসকিউএল এর কানেকটরটা ইন্সটল করতে হবে। আশাকরি আপনারা ইন্সটল করার কাজটা করতে পারবেন, তাই সে সম্পর্কে আর কিছু লিখলাম না।

সি শার্পের একটা প্রজেক্টে মাইএসকিউএল ডাটাবেইজ ব্যবহার করার জন্য আমাদেরকে মোটামুটিভাবে নিচের ধাপগুলো অনুসরন করতে হবেঃ
ধাপঃ ১ – প্রজেক্টের ডানপাশের “Solution Explorer” থেকে “References” এর উপর মাউসের রাইট ক্লিক করে “Add Reference” এ সিলেক্ট করতে হবে। কোন কারনে প্রজেক্টের ডানপাশে “Solution Explorer” বার না থাকলে আপনার উপরের মেনুতে “View” তে “Solution Explorer” পাবেন। কিছু না বুঝলে নিচের ছবিগুলো দেখুনঃ

Solution Explorer

Solution Explorer

mysql - 2

ধাপঃ ২ – আপনারা যারা ভিজুয়াল স্টুডিও ২০১০ অথবা আগের ভার্সন ব্যবহার করেন তারা ধাপ ১ শেষে আপনারা নিচের ছবির ডায়লগবক্সটা দেখতে পাবেনঃ

Add Reference Dialog box

Add Reference Dialog box

ধাপঃ ৩ – ডায়লগবক্সটিতে অনেকগুলো ট্যাব আছে। আমাদেরকে “.NET” ট্যাবটা সিলেক্ট করতে হবে। না বুঝলে নিচের ছবিটা দেখুন। ছবিতে যে ট্যাবে কালার করা হয়েছে আমাদেরকে ঐই ট্যাবটা সিলেক্ট করতে হবে।

Add Reference Dialog box

Add Reference Dialog box

ধাপঃ ৪ – উপরের ছবিতে “.NET” ট্যাবটা সিলেক্ট করার পর অনেকগুলো রেফারেন্স দেখা যাচ্ছে। এরপর আমাদেরকে ঐই রেফারেন্স লিস্টের নিচের থেকে মাইএসকিউএল এর “MySql.Data” রেফারেন্সটা সিলেক্ট করতে হবে। রেফারন্স লিস্টের কিছুটা নিচের দিকে গেলে “MySql.Data” রেফারেন্সটা পাওয়া যাবে।
mysql - 4

আপনারা যারা ভিজুয়াল স্টুডিও ২০১৩ ব্যবহার করেন তারা ধাপ ১ শেষে নিচের ডায়ালগ বক্সটা দেখতে পাবেন।
mysql - 5

এরপর ডায়ালগবক্স থেকে “Extensions” এ ট্যাবে যান। “Extensions” ট্যাবে কিছুটা নিচের দিকে গেলে MySql এর অনেকগুলো রেফারেন্স দেখতে পাবেন। এরপর “MySql.Data” রেফারেন্সটা সিলেক্ট করুন।
mysql - 6

ধাপঃ ৫ – এরপর যেসব ফর্ম/ওয়েবপেইজ এ মাইএসকিউএল ডাটাবেইজ ব্যবহার করার প্রয়োজন হবে সেসব ফর্ম/ওয়েবপেইজ এর সোর্সকোড ফাইলে (সোর্সকোড ফাইল না পেলে ফর্ম এর উপর মাউস দুইবার ক্লিক করুন অথবা মাউসের রাইট ক্লিক করে “View Code” সিলেক্ট করুন) নিচের কোডটা লিখতে হবেঃ

 using MySql.Data.MySqlClient;

এই ধাপগুলো অনুসরন করলে আমাদের প্রজেক্ট মাইএসকিউএল ডাটাবেইজ ব্যবহার করার জন্য তৈরি হয়ে যাবে।

আজকে আমরা শুধুমাত্র ডাটাবেইজের কানেকশনটা টেস্ট করে দেখব। এজন্য আমাদের যা যা লাগবেঃ
১। কানেকশন স্ট্রিং – কানেকশন স্ট্রিং এ আমাদেরকে মাইএসকিউএল ডাটাবেইজের সোর্স/হোস্টের অ্যাড্রেস, সোর্স/হোস্টের পোর্ট নাম্বার, ইউজারের নাম, পাসওয়ার্ড ডিক্লায়ার করতে হবে। কানেকশন স্ট্রিংটা আমরা একটা স্ট্রিং ভ্যারিয়েবলে রাখব। যেমনঃ

string connStr = “datasource = datasoure_address; port= port_number;  username = username; password = ****”;

আপনার ডাটাসোর্স যদি localhost হয় এবং আপনি যদি ডাটাসোর্সের কোন কিছু পরিবর্তন না করেন তাহলে port হবে 3306, username হবে root এবং password এ কিছু থাকবে না [যদি আপনি কোন পাসওয়ার্ড সেট না করেন]। সেক্ষেত্রে আমরা উপরের কানেকশন স্ট্রিংটাকে একটু পরিবর্তন করে localhost এর জন্য এইভাবে লিখতে পারিঃ

string connStr = “datasource = localhost; port= 3306;  username = root; password = ;”;

২। মাইএসকিউএল কানেকশনঃ এরপর আমাদেরকে MySqlConnection ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। যেমনঃ

MySqlConnection conn = new MySqlConnection(string parameter);

এই ইন্সট্যান্স ডিক্লায়ার করার সময় আমাদেরকে একটা স্ট্রিং প্যারামিটার দিতে হবে। এই প্যারামিটারটা হবে কানেকশন স্ট্রিং। আমরা তাহলে উপরের ইন্সট্যান্সটা এইভাবে লিখতে পারিঃ

MySqlConnection conn = new MySqlConnection(connStr);

connStr ব্যবহার করার কারন হল আমরা আমাদের কানেকশন স্ট্রিংটাকে connStr ভ্যারিয়েবলে রেখেছি।
৩। মাইএসকিউএল ডাটাবেইজের কানেকশন টেষ্ট করার জন্য আমাদেরকে আপাতত আর কোন কিছু ডিক্লায়ার করতে হবে না। টেষ্টটা আমরা সবসময় সি শার্পের try-catch ব্লকের মধ্যে করব। সেক্ষেত্রে try ব্লকে আমাদের ডাটাবেইজের কানেকশন টেষ্টের সাথে সম্পর্কিত সবগুলো কোড লিখতে হবে আর catch ব্লকে শুধুমাত্র কোন এরর থাকলে কি ম্যাসেজ দিবে তার কোড লিখব। ডাটাবেইজের কানেকশন টেষ্ট করার জন্য অথবা ডাটাবেইজের সাথে সম্পর্কিত কোন কাজ করার জন্য শুরুতে আমাদেরকে ডাটাবেইজের কানেকশন অন করতে হবে যেটার জন্য আমাদেরকে ক্লাসের Open() ফাংশনটা কল করতে হবে।
এরপর আমরা আমাদের ডাটাবেইজের কাজগুলো করব (যেমনঃ ডাটা ইনসার্ট করা, সিলেক্ট করা, ডিলিট করা অথবা আপডেট করা), যেহেতু এই পোষ্টে আমরা শুধু কানেকশনটা টেষ্ট করব সেহেতু একটা ম্যাসেজ প্রিন্ট করাটাই হল আজকের পোষ্টে ডাটাবেইজের কাজ।
এরপর ডাটাবেইজের কাজ শেষ হলে আমাদেরকে ডাটাবেইজের কানেকশন অফ করে দিতে হবে যেটার জন্য আমাদেরকে ক্লাসের Close() ফাংশনটা কল করতে হবে।
সেক্ষেত্রে একটা কোড হতে পারে এই রকমঃ

try
{
      conn.Open();
      MessageBox.Show("Connection OK", "Success");
      conn.Close();
}
catch (MySqlException Ex)
{
      MessageBox.Show(Ex.Message, "Error");
}

সম্পূর্ন কোডঃ এক্ষেত্রে আমরা একটা বাটনের জন্য কোডটা লিখছি।

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button_mysql_connection_Click(object sender, EventArgs e)
        {
            string connStr = "datasource = localhost; port=3306; username=root; password=;";
            MySqlConnection conn = new MySqlConnection(connStr);
            try
            {
                conn.Open();
                MessageBox.Show("Connection OK", "Success");
                conn.Close();
            }
            catch (MySqlException Ex)
            {
                MessageBox.Show(Ex.Message, "Error");
            }
        }
    }
}

আশাকরি আজকের পোষ্টটা আপনারা সবাই বুঝতে পারছেন। পরবর্তি পোষ্টে আমরা সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজের অন্য অপারেশনগুলোর কাজ কিভাবে করতে হয় তা দেখব।

সি শার্প টিউটোরিয়ালঃ ৪ – সি শার্প প্রজেক্টে সাউন্ডের ব্যবহার

সি শার্প টিউটোরিয়াল সিরিজের আজকের পর্বে আপনাদের সবাইকে স্বাগতম জানাচ্ছি। আজকের পোষ্টে আমরা শিখব সি শার্প প্রজেক্টে কিভাবে সাউন্ড ব্যবহার করতে হয়। সি শার্প টিউটোরিয়ালের ২য় পর্বে আমরা সাউন্ড ব্যবহারের একটা পদ্ধতি শিখেছিলাম। যেখানে সাউন্ড ব্যবহারের জন্য সাউন্ডফাইলের প্রয়োজন হত। মাঝে মাঝে এমন হতে পারে যে একটা প্রজেক্টে আমাদের সাউন্ড ব্যবহারের প্রয়োজন/ইচ্ছা হল কিন্তু যে সাউন্ডটা ব্যবহার করতে চাই তার কোন রেকর্ড করা ফাইল আমাদের কাছে নেই। সেক্ষেত্রে আমাদেরকে অন্যকোন উপায় ব্যবহার করতে হবে। আজকের পোষ্টে আমরা সাউন্ডফাইল ছাড়া একটা প্রজেক্টে সাউন্ড ব্যবহার করার পদ্ধতি শিখব।
এজন্য আমাদেরকে .নেট ফ্রেমওর্য়াকের দুইটা লাইব্রেরী ব্যবহার করতে হবে। এগুলো হলঃ

     using System.Speech;
     using System.Speech.Synthesis;

এরপর আমাদেরকে SpeechSynthesizer ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। ইন্সট্যান্স ডিক্লায়ার করার সিনট্যাক্স হলঃ

     SpeechSynthesizer instance_name = new SpeechSynthesizer();

এক্ষেত্রে যে কম্পোনেন্টের জন্য আমাদের সাউন্ডটা কাজ করবে ঐই কম্পোনেন্টের কোডের বাইরে ইন্সট্যান্সটা ডিক্লায়ার করা ভাল [উদাহরনঃ মনেকরুন একটা ফর্মের বাটন কম্পোনেন্ট ক্লিক করলে আমাদের সাউন্ড কাজ করবে, যেক্ষেত্রে ঐই বাটনের ক্লিক ইভেন্টের কোডের বাইরে ইন্সট্যান্ট ডিক্লায়ার করব]। এতে যে উপকার হয় তা হলঃ একই ফাইল/ফর্মের অন্যকোন কম্পোনেন্টের জন্য সাউন্ড ব্যবহার করতে চাইলে আমরা সরাসরি পূর্বের ডিক্লায়ার করা ইন্সট্যান্সটা ব্যবহার করতে পারব। আমাদেরকে শুধুমাত্র Dispose() ফাংশনটা কল করে ঐই ইন্সট্যান্সের সব রিসোর্স ক্লিয়ার করে দিলে হবে। সেক্ষত্রে আমাদের কোডের একটা অংশ এই রকম হবেঃ

	SpeechSynthesizer spch = new SpeechSynthesizer();
	private void button_Login_Click(object sender, EventArgs e)
        {
		spch.Dispose();
         	spch = new SpeechSynthesizer();
		... ...
		... ...
	}

উপরের কোডে আমরা button_login নামের বাটনের জন্য সাউন্ড ব্যবহার করছি…
সাউন্ড ব্যবহারের জন্য SpeechSynthesizer ক্লাসের দুইটা ফাংশন আছেঃ

       Speak(string); - synchronous
       SpeakAsync(string); - asynchronous

এই দুইটা ফাংশনের প্যারামিটার হিসাবে স্ট্রিং ভ্যারিয়েবল ইনপুট দিতে হয়। স্ট্রিং ভ্যারিয়াবলে আমরা যাই ইনপুট দিব তাই সাউন্ড হিসাবে শুনাবে। তবে এই দুইটার মধ্যে ২য় টা ব্যবহার করা ভাল।

আমরা সাউন্ডের জন্য নিচের কোডটা লিখতে পারিঃ

     SpeechSynthesizer spch = new SpeechSynthesizer();
     private void button_Login_Click(object sender, EventArgs e)
     {
          spch.Dispose();
          spch = new SpeechSynthesizer();
	  spch.SpeakAsync(“Thank You”);
     }

আরো জানতে চাইলে এখানে ভিজিট করতে পারেনঃ
১। .NET System.Speech.Synthesis Namespaces
২। .NET System.Speech Namespaces

আশাকরি আজকের পোষ্টটা আমরা সবাই বুঝতে পারছি। আগামী পোষ্টে আমরা শিখব কিভাবে সি শার্প প্রজেক্টে মাইএসকিউএল (MySQL) ডাটাবেইজ ব্যবহার করতে হয়।

বাইনারী সার্চ

একটা অ্যারের এলিমেন্টগুলোর মধ্য থেকে কোন একটা নির্দিষ্ট এলিমেন্ট খোঁজার সহজ এবং দ্রুততম পদ্ধতি হল বাইনারী সার্চ। লিনিয়ার সার্চ অ্যালগরিদম থেকে বাইনারী সার্চ অ্যালগরিদম দ্রুত হবার প্রধান কারন হল এটা অ্যারের শুধুমাত্র অর্ধেক এলিমেন্ট চেক করে। আজকে আমরা বাইনারী সার্চ অ্যালগরিদম কিভাবে কাজ করে তা শিখব এবং সেই সাথে বাইনারী সার্চ অ্যালগরিদমের সি, সি++, এবং জাভা ইম্লিমেন্টেশন দেখব।
বাইনারী সার্চ অ্যালগরিদমের সুবিধাঃ
১। বাইনারী সার্চ অ্যালগরিদম অ্যারের অর্ধেক অংশ নিয়ে কাজ করে।
২। অ্যারের এলিমেন্ট সংখ্যা বেশী হলেও এটি ব্যবহার করা যায়।
৩। লিনিয়ার সার্চ থেকে এটি অনেক দ্রুত।
বাইনারী সার্চ অ্যালগরিদমের অসুবিধাঃ
১। অ্যারের এলিমেন্টগুলো সর্ট করতে হয়।
অ্যালগরিদম কমপ্লেক্সিটিঃ
Worst Case: O(log n)
Average Case: O(log n)
বাইনারী সার্চ অ্যালগরিদম কিভাবে কাজ করে?
বাইনারী সার্চ অ্যালগরিদম শুরুতে অ্যারের এলিমেন্টগুলোর মধ্যম পজিশনের ভ্যালু বের করে। যেম্ন, অ্যারেতে n সংখ্যক এলিমেন্ট থাকলে মধ্যম মান হবে (n-1/2) তম এলিমেন্ট হবে ঐই অ্যারের মধ্যম মান। ধরুন, অ্যারের মধ্যম মানে k ভ্যালুর এলিমেন্টটা আছে। এখন ১ম ধাপে k এর সাথে আমরা যে এলিমেন্ট সার্চ করছি তা মিলে কিনা দেখবে। যদি মিলে যায় তাহলে মধ্যম মানটার পজিশন হবে আমাদের সার্চিং এলিমেন্টের পজিশন, মানে (n-1/2)। যেহেতু আমরা সার্চ এলিমেন্টের পজিশন পেয়ে গেছি তাই আমাদেরকে অ্যারের আর কোন অংশ নিয়ে কাজ করতে হবে না। যদি k এর সাথে আমাদের সার্চ এলিমেন্ট না মিলে তখন আমাদের সামনে দুইটা অপশন আসবেঃ
১। সার্চিং এলিমেন্টটা কি k থেকে বড় ?
২। নাকি k থেকে ছোট? [এখানে k = অ্যারের মধ্যম পজিশনে যে এলিমেন্ট আছে]
যদি ছোট হয় তাহলে আমাদেরকে অ্যারের মধ্যম পজিশনের এক ঘর আগে থেকে শুরু করে ১ম পর্যন্ত চেক করতে হবে এবং প্রতিবার চেক করার পর আমাদের সার্চিং এলিমেন্টটা না পেলে মধ্যম পজিশনের মান 1 করে কমাতে হবে।
আর যদি বড় হয় তাহলে আমাদেরকে মধ্যম পজিশনের এক ঘর পরে থেকে শুরু করে অ্যারের শেষ এলিমেন্ট পর্যন্ত চেক করতে হবে এবং প্রতিবার চেক করার পর আমাদের সার্চিং এলিমেন্টটা না পেলে মধ্যম পজিশনের মান 1 করে বাড়াতে হবে।
একটা উদাহরন দিয়ে ব্যাখ্যা করলে ব্যাপারটা আপনাদের বুঝতে আরো সুবিধা হবে। ধরুন, arr নামে আমাদের একটা অ্যারে আছে এবং অ্যারের এলিমেন্টগুলো হলঃ 12, 5, 67, 35, 62, 10, 44, 55, 3, 4, 1 এবং আমাদেরকে সার্চ করতে হবে 55। তাহলে অ্যারে সর্ট করলে হবেঃ 1, 3, 4, 5, 10, 12, 35, 44, 55, 62, 67 এবং মধ্যম মানের পজিশন হবে 5 [যেহেতু অ্যারের ইনডেক্স ০ থেকে শুরু হয়].
১ম ধাপঃ এক্ষেত্রে অ্যারের মধ্যম পজিশনে (arr[5]) আছে 12 এবং আমাদের সার্চিং এলিমেন্ট 55. তাহলে আমাদের সার্চিং এলিমেন্ট অ্যারের মধ্যম পজিশনে নেই।
২য় ধাপঃ এখন আমাদের দেখতে হবে সার্চিং এলিমেন্টটা অ্যারের মধ্যম মান থেকে বড় নাকি ছোট। আমাদের অ্যারের ক্ষেত্রে সার্চিং এলিমেন্ট মধ্যম মান থেকে বড় তাই আমাদেরকে অ্যারের মধ্যোম পজিশনের এক ঘর পর থেকে শুরু করে অ্যারের শেষ পর্যন্ত চেক করতে হবে। প্রতিবার চেক করার পর যদি সার্চিং এলিমেন্টটা না মিলে তাহলে মধ্যম পজিশন 1 করে বাড়াতে হবে।
২য় ধাপঃ ১ – অ্যারের মধ্যম পজিশন 5, তাহলে আমাদেরকে মধ্যম পজিশন 6 থেকে শুরু করতে হবে। arr[6] এ আছে 35 কিন্তু আমাদের সার্চিং এলিমেন্ট 55, সার্চিং এলিমেন্ট অ্যারের arr[6] পজিশনের এলিমেন্টের সাথে মিলে নাই তাই আমাদেরকে মধ্যম পজিশনের মান 1 বাড়াতে হবে। তাহলে এখন মধ্যম পজিশন হবে 7.
২য় ধাপঃ ২ – এক্ষেত্রে arr[7] এ আছে 44 কিন্তু আমাদের সার্চিং এলিমেন্ট 55, সার্চিং এলিমেন্ট অ্যারের arr[7] পজিশনের এলিমেন্টের সাথে মিলে নাই তাই আমাদেরকে মধ্যম পজিশনের মান 1 বাড়াতে হবে। তাহলে এখন মধ্যম পজিশন হবে 8.
৩য় ধাপঃ ৩ – এক্ষেত্রে arr[8] এ আছে 55 এবং আমাদের সার্চিং এলিমেন্ট 55, সার্চিং এলিমেন্টের সাথে মধ্যম মান মিলে গেছে, তাহলে আমাদের সার্চিং এলিমেন্টের পজিশন হবে 8.

লক্ষ্য করবেন, যতক্ষন পর্যন্ত আমাদের সার্চিং ভ্যালুর সাথে অ্যারের বর্তমান পজিশনের ভ্যালু মিলে নাই ততক্ষন পর্যত্ন আমি অ্যারের মধ্যম মানের পজিশন এক এক করে বৃদ্ধি করেছি। এটা করেছি নতুন কোন ভ্যারিয়েবল ডিক্লায়ার না করার জন্য। নতুন ভ্যারিয়েবল ডিক্লায়ার করলে শুরুতে তার ভ্যালু ডিক্লায়ার করতে হবে (n-1)/2. [যেখানে n = অ্যারের এলিমেন্ট সংখ্যা]।
নোটঃ এই পোষ্টটা অ্যারের এলিমেন্ট সংখ্যা বিজোড় ধরে লিখা হয়েছে। জোড় নাম্বারের ক্ষেত্রে মধ্যম মান বের করার জন্য অন্য পদ্ধতি আছে।
কোড – সিঃ

#include <stdio.h>

int main()
{
    int i, j, n, mid, srch, Start, End;
    printf("How many Elements?: ");
    scanf("%d", &n);
    int arr[n+2];
    printf("Enter the elements:\n");
    for(i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    printf("Enter the element to search: ");
    scanf("%d", &srch);
    for(i = 0; i < n; i++)
    {
        for(j = i + 1; j  arr[j])
        {
            arr[i] ^= arr[j];
            arr[j] ^= arr[i];
            arr[i] ^= arr[j];
        }
    }
    Start = 0; End = n-1;
    mid = (Start + End)/2;
    while(Start <= End && arr[mid] != srch)
    {
        if(srch < arr[mid])
        {
            End = mid-1;
        }
        else
        {
            Start = mid+1;
        }
        mid = (Start + End)/2;
    }
    if(arr[mid] == srch)
    {
        printf("Element found at the position: %d\n", mid);
    }
    else
    {
        printf("Element is not available on the array.\n");
    }
    return 0;
}

কোড – সি প্লাস প্লাস

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int i, n, mid, srch, Start, End;
    cout<<"How many Elements?: ";
    cin>>n;
    int arr[n+2];
    cout<<"Enter the elements:"<<endl;
    for(i = 0; i < n; i++)
    {
        cin>>arr[i];
    }
    cout<<"Enter the element to search: ";
    cin>>srch;
    sort(arr, arr+n); //Sorting Array Elements
    Start = 0; End = n-1;
    mid = (Start + End)/2;
    while(Start <= End && arr[mid] != srch)
    {
        if(srch < arr[mid])
        {
            End = mid-1;
        }
        else
        {
            Start = mid+1;
        }
        mid = (Start + End)/2;
    }
    if(arr[mid] == srch)
    {
        cout<<"Element found at the position: "<<mid<<endl;
    }
    else
    {
        cout<<"Element is not available on the array."<<endl;
    }
    return 0;
}

কোড – জাভা

import java.util.Scanner;
public class testingpost
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int i, j, n, mid, srch, Start, End;
		System.out.print("How many elements?: ");
		n = sc.nextInt();
		int [] arr = new int[n+3];
		System.out.println("Enter the elements:");
		for(i = 0; i < n; i++)
		{
			arr[i] = sc.nextInt();
		}
		System.out.print("Enter the element to search: ");
		srch = sc.nextInt();
		for(i = 0; i < n; i++)
	        {
	                for(j = i + 1; j < n; j++)
	                {
	                        if(arr[i] > arr[j])
	                        {
	                               arr[i] ^= arr[j];
	                               arr[j] ^= arr[i];
	                               arr[i] ^= arr[j];
	                        }
	               }
	       }
	       Start = 0; End = n-1;
	       mid = (Start + End)/2;
	       while(Start <= End && arr[mid] != srch)
	       {
	              if(srch < arr[mid])
	              {
	                       End = mid-1;
	              }
	              else
	              {
	                       Start = mid+1;
	              }
	              mid = (Start + End)/2;
	      }
	      if(arr[mid] == srch)
	      {
	              System.out.println("Element found at the position: " + mid);
	      }
	      else
	      {
	             System.out.println("Element is not available on the array.");
	      }
	}
}

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

লিনিয়ার সার্চ

কতগুলো এলিমেন্টের একটা অ্যারের মধ্য থেকে একটা নির্দিষ্ট এলিমেন্ট খোঁজার সহজ পদ্ধতি হল লিনিয়ার সার্চ অথবা অনুক্রমিক সার্চ। এটা একটা ব্রুট ফোর্স অ্যালগরিদম। এই অ্যালগরিদমটা যতক্ষন পর্যন্ত ঐই নির্দিষ্ট এলিমেন্টটা খোজেঁ পাবে না ঠিক ততক্ষন পর্যন্ত অ্যারের প্রতিটা এলিমেন্ট চেক করতে থাকবে। আজকে আমরা শিখব কিভাবে লিনিয়ার সার্চ অ্যালগরিদম কাজ করে এবং সে সাথে লিনিয়ার সার্চ অ্যালগরিদমের সি, সি++, ও জাভা কোড দেখব।
লিনিয়ার সার্চ অ্যালগরিদমের সুবিধাঃ
১। অ্যারের এলিমেন্টগুলো সর্ট করা লাগে না।
২। সহজে কোড লেখা যায়।
৩। অ্যারের এলিমেন্ট ১০০ কিংবা তার কম হলে সার্চিং এর অন্য কোন অ্যালগরিদম ব্যবহার করার চিন্তা করতে হয় না।
লিনিয়ার সার্চ অ্যালগরিদমের অসুবিধাঃ
১। যেহেতু লিনিয়ার সার্চ অ্যালগরিদম প্রতিটা এলিমেন্ট চেক করে তাই সার্চে অনেক সময় লাগে।
২। বড় অ্যারের ক্ষেত্রে এই অ্যালগরিদম ব্যবহার করে ভাল ফল পাওয়া যায় না।
অ্যালগরিদম কমপ্লেক্সিটিঃ
Worst Case: O(n+1)
Average Case: O((n+1)/2)

কিভাবে কাজ করে?
ধরুন, n সংখ্যক এলিমেন্টের A নামে আমাদের একটা অ্যারে আছে, যার এলিমেন্টগুলো যথাক্রমেঃ 3, 4, 10, 67, 22, 56, 34, 90, 77, 48, 81, 102 এবং আমাদেরকে বলা হল ঐই অ্যারেতে 90 এলিমেন্টটা কত পজিশনে আছে সেটা সার্চ করতে।
লিনিয়ার সার্চ কিভাবে কাজ করে?
১ম ধাপঃ অ্যারের 0 পজিশনে আছে 3 কিন্তু আমাদের সার্চিং এলিমেন্ট 90, তাহলে A[0] তে আমাদের সার্চ এলিমেন্ট নাই। তাই আমাদেরকে পরের ধাপে যেতে হবে।
২য় ধাপঃ অ্যারের 1 নাম্বার পজিশনে আছে 4 কিন্তু আমাদের সার্চিং এলিমেন্ট 90, তাহলে A[1] এ আমাদের সার্চ এলিমেন্ট নাই। তাই আমাদেরকে পরের ধাপে যেতে হবে।
৩য় ধাপঃ অ্যারের 2 নাম্বার পজিশনে আছে 10 কিন্তু আমাদের সার্চিং এলিমেন্ট 90, তাহলে A[2] এ আমাদের সার্চ এলিমেন্ট নাই। তাই আমাদেরকে পরের ধাপে যেতে হবে।
৪র্থ ধাপঃ অ্যারের 3 নাম্বার পজিশনে আছে 67 কিন্তু আমাদের সার্চিং এলিমেন্ট 90, তাহলে A[3] এ আমাদের সার্চ এলিমেন্ট নাই। তাই আমাদেরকে পরের ধাপে যেতে হবে।
৫ম ধাপঃ অ্যারের 4 নাম্বার পজিশনে আছে 22 কিন্তু আমাদের সার্চিং এলিমেন্ট 90, তাহলে A[4] এ আমাদের সার্চ এলিমেন্ট নাই। তাই আমাদেরকে পরের ধাপে যেতে হবে।
৬ষ্ঠ ধাপঃ অ্যারের 5 নাম্বার পজিশনে আছে 56 কিন্তু আমাদের সার্চিং এলিমেন্ট 90, তাহলে A[5] এ আমাদের সার্চ এলিমেন্ট নাই। তাই আমাদেরকে পরের ধাপে যেতে হবে।
৭ম ধাপঃ অ্যারের 6 নাম্বার পজিশনে আছে 34 কিন্তু আমাদের সার্চিং এলিমেন্ট 90, তাহলে A[6] এ আমাদের সার্চ এলিমেন্ট নাই। তাই আমাদেরকে পরের ধাপে যেতে হবে।
৮ম ধাপঃ অ্যারের 7 নাম্বার পজিশনে আছে 90 এবং আমাদের সার্চিং এলিমেন্ট 90, তাহলে A[7] এ আমাদের সার্চ এলিমেন্ট আছে। তাই ঐই অ্যারেতে আমাদের সার্চিং এলিমেন্টের পজিশন হল ৭।
কোড সিঃ

#include <stdio.h>

int main()
{
    int i, n, x, loc = -1;
    printf("How many elements?: ");
    scanf("%d", &n);
    int arr[n+3];
    printf("Enter the elements of the array:\n");
    for(i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    printf("Enter the element to search: ");
    scanf("%d", &x);
    for(i = 0; i < n; i++)
    {
        if(x == arr[i])
        {
            loc = i;
            break;
        }
    }
    if(loc == -1)
    {
        printf("Searching element is not available.\n");
    }
    else
    {
        printf("Searching element found at the location: %d\n", loc);
    }
    return 0;
}

কোড সি প্লাস প্লাসঃ

#include <iostream>
using namespace std;

int main()
{
    int i, n, x, loc = -1;
    cout<<"How many elements?: ";
    cin>>n;
    int arr[n+3];
    cout<<"Enter the elements of the array:"<<endl;
    for(i = 0; i < n; i++)
    {
        cin>>arr[i];
    }
    cout<<"Enter the element to search: ";
    cin>>x;
    for(i = 0; i < n; i++)
    {
        if(x == arr[i])
        {
            loc = i;
            break;
        }
    }
    if(loc == -1)
    {
        cout<<"Searching element is not available."<<endl;
    }
    else
    {
        cout<<"Searching element found at the location: "<<loc<<endl;
    }
    return 0;
}

কোড জাভাঃ

import java.util.Scanner;
public class testingpost
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int i, x, loc = -1, n;
		System.out.print("How many elements?: ");
		n = sc.nextInt();
		int [] arr = new int[n+3];
		System.out.println("Enter the elements:");
		for(i = 0; i < n; i++)
		{
			arr[i] = sc.nextInt();
		}
		System.out.print("Enter the element to search: ");
		x = sc.nextInt();
		for(i = 0; i < n; i++)
		{
			if(x == arr[i])
			{
				loc = i;
				break;
			}
		}
		if(loc == -1)
		{
			System.out.println("Searching element is not available");
		}
		else
		{
			System.out.println("Searching element fond at location: " + loc);
		}
	}
}

এই সম্পর্কিত অন্য পোষ্টঃ
রিকার্সিভ বাইনারী সার্চ
এই পোষ্ট সম্পর্কিত প্রোগ্রামিং প্রবলেমঃ
1. 10474 – Where is the Marble?

আশাকরি আপনারা লিনিয়ার সার্চ অ্যালগরিদম কিভাবে কাজ করে তা বুঝতে পেরেছেন।

বেসিক সি প্রোগ্রামিং ৩ – ডাটা টাইপ এবং ভ্যারিয়েবল

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

ডাটা টাইপঃ প্রোগ্রামিং ল্যাঙ্গুয়েজে ডাটা টাইপ হল অনেকগুলো ডাটার এমন একটা সেট যেখানে ডাটাগুলোর কিছু নির্দিষ্ট মান, সাইজ এবং বৈশিষ্ট্য থাকে।
মনেকরুন, কোন একটা প্রোগ্রামে আমাদেরকে পূর্ণসংখ্যা ব্যবহার করতে বলা হল তখন আমাদেরকে অবশ্যই এমন একটা ডাটা টাইপ দিয়ে কাজ করতে হবে যেটা পূর্ণসংখ্যা ব্যবহার করার জন্য তৈরি করা হয়েছে, ঠিক একইভাবে দশমিক সংখ্যা ব্যবহার করতে বলা হলে দশমিক সংখ্যা ব্যবহার করার জন্য যে ডাটা টাইপ আছে আমাদেরকে সেটা ব্যবহার করতে হবে।
সি প্রোগ্রামিং এ ৫ রকম ডাটা টাইপ আছে। সেগুলো হলঃ Integer, Character, Floating Point, Double, এবং, Void. নিচের ছবিতে ডাটা টাইপগুলোর নাম এবং সেগুলো প্রোগ্রামে ব্যবহার করার জন্য কোন কিওয়ার্ডটা ব্যবহার করতে হবে এবং ডাটা টাইপ গুলোর সাইজ দেখানো হয়েছে।
Data type in C Programming Language
সি প্রোগ্রামিং এর ডাটা টাইপগুলো ভাল করে শিখে রাখতে পারলে পরবর্তিতে নতুন প্রোগ্রামিং ল্যাঙ্গুয়েজ শিখার সময় ভাল কাজ দে।
উপরে আমরা যে ডাটা টাইপগুলো দেখলাম সেগুলো ছিল মৌলিক ডাটা টাইপ। এই ডাটা টাইপগুলো ছাড়া আরো কিছু ডাটা টাইপ আছে যেগুলো মৌলিক ডাটা টাইপগুলো ব্যবহার করার সুবিধার্তে তৈরি করা হয়েছে। সেগুলো হলঃ long, short, signed, unsigned।
মৌলিক ডাটা টাইপগুলো থাকতে নতুন ডাটা টাইপগুলো কেন তৈরি করা হল?
– কারন সবগুলো ডাটাটাইপের একটা নির্দিষ্ট সীমা (range) আছে। মনেকরুন, আমরা কিছু নাম্বার নিয়ে কাজ করছি এবং ডাটা টাইপ হিসেবে Integer ব্যবহার করছি। Integer ডাটাটাইপের সীমা হলঃ -৩২৭৬৮ থেকে ৩২৭৬৭, এখন আমাদের ডাটাতে যদি কোন নাম্বার এই সীমার বাইরে হয় (-৩২৭৬৮ থেকে ছোট অথবা ৩২৭৬৭ থেকে বড়) তখন ঐই নাম্বারটার জন্য Integer ডাটাটাইপ কাজ করবে না। তখন ঐই নাম্বারটার জন্য এমন কোন ডাটা টাইপ ব্যবহার করতে হবে যেটা পূর্ণসংখ্যা দিয়ে কাজ করার জন্য তৈরি এবং Integer এর সীমা থেকে বড় নাম্বার কে প্রসেস করতে পারে। আমাদের সুবিধার জন্য এগুলো আগে থেকেই তৈরি করা আছে।
সবগুলো ডাটা টাইপের সাইজ এবং সীমা কত?
– নিচের ছবিতে সবগুলো ডাটা টাইপের সাইজ এবং সীমা দেওয়া হলঃ
Data type size and range in c programming language

ভ্যারিয়েবলঃ ভ্যারিয়েবল হল একপ্রকার আইডেন্টিফায়ার যেটি কম্পিউটার প্রোগ্রামের কোন একটা নির্দিষ্ট অংশের কিছু নির্দিষ্ট রকম তথ্য দেখানোর জন্য ব্যবহার করা হয়। সহজভাবে বলা যায়, কম্পিউটার প্রোগ্রামে কোন ডাটা কিংবা তথ্যের মেমোরী লোকেশন দেখানোর জন্য ভ্যারিয়েবল ব্যবহার করা হয়।
মনেকরুন একটা কম্পিউটার প্রোগ্রামের মাধ্যমে আপনি আপনার নাম, বয়স, এবং শখ সংরক্ষন করে রাখলেন। মনেকরুন আপনার নামটা মেমোরীর ৭৮ তম পজিশনে, বয়স ৮৪৮ তম পজিশনে এবং শখ ১২৯৩ তম পজিশনে আছে। এখন আপনার পক্ষে কি মেমোরীর পজিশনগুলো মনে রাখা সম্ভব? মোটেও সম্ভব না। কারন মাত্র তিনটা ডাটা থাকবে অথবা মেমোরী পজিশনগুলো এত সহজ হবে তার কোন নিশ্চয়তা নাই। এখন এই সব পজিশনের ডাটা দেখতে চাইলে আপনাকে অবশ্যই এগুলোর পজিশন মনে রাখতে হবে, যেহেতু এই কাজটা আপনি কিংবা সাধারন মানুষের পক্ষে সম্ভব নয় সেহেতু আপনাকে ঐই তথ্যগুলো এমন কোন কিছুতে রাখতে হবে যাতে সেগুলো যখন ইচ্ছা তখন ব্যবহার করতে পারবেন। এ কাজটা করার জন্য ভ্যারিয়েবল ব্যবহার করা হয়। এখন AA ভ্যারিয়েবলে আপনার নাম, BB ভ্যারিয়েবলে বয়স এবং CC ভ্যারিয়েবলে শখ রাখলেন। এখন আপনার নাম অথবা বয়স অথবা শখ দেখতে চাইলে শুধু ভ্যারিয়েবলটা কল করলে হবে। কত সহজ তাই না?
ভ্যারিয়েবল কিভাবে ডিক্লায়ার করতে হয়?
– ভ্যারিয়েবলের একটা সিনট্যাক্স আছেঃ
datatype variable_name;
datatype এ আমরা সি প্রোগ্রামিং এর যেকোন ডাটা টাইপ ব্যবহার করতে পারব, এবং variable_name এ যা ইচ্ছা তাই লিখতে পারব। তবে ভ্যারিয়েবলের নাম ডিক্লায়ার করার কয়েকটা নিয়ম আছে। যেমনঃ
   – ভ্যারিয়েবলের নাম A-Z অথবা a-z, underscore ( _ ) দিয়ে শুরু করতে হবে।
   – ভ্যারিয়েবলের নাম 1-9 কিংবা অন্য কোন কিছু দিয়ে শুরু করা যাবে না (A-Z, a-z, _ ছাড়া)। ১ম পজিশন ছাড়া বাকী যেকোন পজিশনে 1-9 ব্যবহার করা যাবে।
   – ভ্যারিয়েবলে hypen ( – ) ব্যবহার করা যাবে না।
   – ভ্যারিয়েবলের নামের মাঝে কোন ফাঁকা (blank space) রাখা যাবে না।
   – ভ্যারিয়েবলের নাম হিসেবে কোন কিওয়ার্ড ব্যবহার করা যাবে না।

কয়েকটা সঠিক ভ্যারিয়েবলের নামঃ
int abc, float ab_cd, double a1, long int b1, unsigned long int A1, int B1, int _abc;
কয়েকটা ভুল ভ্যারিয়েবলের নামঃ
int 1ab, float as-sdf, float err rtt, double rf-r, double if, long int return;

আশা করি আপনার আজকের পোষ্টটা বুঝতে পেরেছেন। পরবর্তী পোষ্টে আমরা সি প্রোগ্রামিং ল্যাঙ্গুয়েজের ইনপুট-আউটপুট ফাংশন সম্পর্কে শিখব।

মান অদলবদল করা

কম্পিউটার প্রোগ্রামিং এ সোয়াপ (swap) বলতে দুইটা ভ্যারিয়েবল নিজেদের মান অদলবদল করাকে বুঝায়। কিছু কিছু প্রোগ্রাম আছে যেগুলোতে ভ্যারিয়েবলের মান অদলবদল করার প্রয়োজন হয়। এই পোষ্টে আমরা ভ্যারিয়েবলের মান অদলবদল করার কয়েকটা পদ্ধতি শিখবঃ

কখন মান পরিবর্তন করার প্রয়োজন হয়?
ধরুন আমরা নিচের কোডটা লিখলামঃ

int a, b, sum = 0;
cin>>a>>b;
for(int i = a; i <= b; i++)
{
	sum += i;
}
cout<<sum<<endl;

আমাদের কোডের for লুপ কাজ করার জন্য অবশ্যই a এর মান b থেকে ছোট হতে হবে। a এর মান যদি b থেকে বড় হয় তাহলে আমাদের for লুপটা কাজ করবে না। যেহেতু a এবং b এর মান ইনপুটের উপর নির্ভর করে সেহেতু আমাদেরকে এমনভাবে কোড লিখতে হবে যেন আমাদের কোডটা সবসময় কাজ করে। এই কাজটা আমরা a এবং b এর মান অদলবদল করার মাধ্যমে করতে পারি।
আজকে আমরা ভ্যারিয়েবলের মান অদলবদল করার কয়েকটা পদ্ধতি শিখবঃ
১ম পদ্ধতি – ৩টা ভ্যারিয়েবল ব্যবহার করেঃ
এটি হল ভ্যারিয়েবলের মান অদলবদল করার সবচাইতে সহজ বহুল ব্যবহৃত পদ্ধতি। সেক্ষেত্রে আমাদের ৩টা ভ্যারিয়েবল ব্যবহার করতে হবে। ধরুন a,b,c ভ্যারিয়েবল ব্যবহার করছি।a এবং b ভ্যারিয়েবল দিয়ে আমরা ইনপুট নিব। এরপর সোয়াপের ১ম ধাপে আমরা a এর মান c তে রাখব। ২য় ধাপে b এর মান a তে রাখব এবং ৩য় ধাপে c এর মান b তে রাখব।
উদাহরনঃ
ধরুনঃ a = 20 এবং b = 10
তাহলে a এর মান c তে রাখলে c = 20 হবে। এরপর b এর মান a তে রাখলে a = 10 হবে এবং c এর মান b তে রাখলে b = 20 হবে।
কোডঃ

int a, b, c;
cin>>a>>b;
cout<<"Before Swap: ";
cout<<a<<"\t"<<b<<endl;
c = a;
a = b;
b = c;
cout<<"After Swap: ";
cout<<a<<"\t"<<b<<endl;

২য় পদ্ধতি – ২টা ভ্যারিয়েবল ব্যবহার করেঃ
২টা ভ্যারিয়েবল ব্যবহার করে ভ্যারিয়েবলের মান অদলবদল করার দুইটা উপায় আছেঃ
১ সাধারন যোগ-বিয়োগ করেঃ
২ বিটওয়াইজ অপারেশন করেঃ

সাধারন যোগ-বিয়োগ করেঃ
ধরুন a, b আমাদের দুইটা ভ্যারিয়েবল। সোয়াপের ১ম ধাপে আমরা a থেকে b বিয়োগ করব এবং রেজাল্টটা a তে রাখব। ২য় ধাপে b এর সাথে a যোগ করব এবং রেজাল্ট b তে রাখব। ৩য় ধাপে a থেকে b বিয়োগ করব এবং রেজাল্ট a তে রাখব।
উদাহরনঃ
ধরুনঃ a = 20 এবং b = 10
১ম ধাপঃ a = a – b = 20 – 10 = 10
২য় ধাপঃ b = a + b = 10 + 10 = 20
৩য় ধাপঃ a = b – a = 20 – 10 = 10
কোডঃ

int a, b;
cin>>a>>b;
cout<<"Before Swap: ";
cout<<a<<"\t"<<b<<endl;
a = a – b;
b = b + a;
a = b – a;
cout<<"After Swap: ";
cout<<a<<"\t"<<b<<endl;

বিটওয়াইজ অপারেশন করেঃ
ধরুন a, b আমাদের দুইটা ভ্যারিয়েবল। সোয়াপের ১ম ধাপে আমরা a থেকে b XOR করব এবং রেজাল্টটা a তে রাখব। ২য় ধাপে b থেকে a XOR করব এবং রেজাল্ট b তে রাখব। ৩য় ধাপে a থেকে আবার b বিয়োগ করব এবং রেজাল্ট a তে রাখব।
উদাহরনঃ
ধরুনঃ a = 20 এবং b = 10
সেক্ষেত্রে বাইনারী তে a = 10100 এবং b = 1010
১ম ধাপঃ a XOR b = 10100 ^ 1010 = 11110 [11110 = 30]
২য় ধাপঃ b XOR a = 1010 ^ 11110 = 10100 [10100 = 20]
৩য় ধাপঃ a XOR b = 11110 ^ 10100 = 1010 [1010 = 10]
^ দিয়ে XOR operation বুঝায়।

কোডঃ

int a, b;
cin>>a>>b;
cout<<"Before Swap: ";
cout<<a<<"\t"<<b<<endl;
a ^= b;
b ^= a;
a ^= b;
cout<<"After Swap: ";
cout<<a<<"\t"<<b<<endl;

৩য় পদ্ধতি –swap() ফাংশন ব্যবহার করেঃ
আপনারা যারা C++ কোডার তারা চাইলে উপরের পদ্ধতিগুলো ব্যবহার না করে STL Algorithm ব্যবহার করেও ভ্যারিয়েবলের মান অদলবদল করতে পারবেন। সেক্ষেত্রে আপনাদের কোডটা এইরকম লিখতে হবেঃ


#include <algorithm>
int a, b;
cin>>a>>b;
cout<<"Before Swap: ";
cout<<a<<"\t"<<b<<endl;
swap(a,b);
cout<<"After Swap: ";
cout<<a<<"\t"<<b<<endl;

তাহলে আমরা প্রথম প্রোগ্রামটা একটু পরিবর্তন করে এইভাবে লিখতে পারিঃ

int a, b, sum = 0;
cin>>a>>b;
if(a > b)
{
	//Your code for swap
}
for(int i = a; i <= b; i++)
{
	sum += i;
}
cout<<sum<<endl;

আশাকরি আপনারা ভ্যারিয়েবলেন মান অদল-বদল করার পদ্ধতিগুলো বুঝতে পেরেছেন।

বেসিক সি প্রোগ্রামিং ২ – কিওয়ার্ড এবং আইডেন্টিফায়ার

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

Keywords in C

কিওয়ার্ড


কিছু কিওয়ার্ডের কাজঃ
int
if
else
while
এখানে int একটা কিওয়ার্ড, এটি হল একটা ডাটাটাইপ যেটা ইন্টিজার ভ্যারিয়েবল ডিক্লায়ার করতে ব্যবহার করা হয়। if, else, while এগুলো ও কিওয়ার্ড, এগুলো মূলত কন্ডিশন সম্পর্কিত কোড লেখার জন্য ব্যবহার করা হয়। একইভাবে বাকী কিওয়ার্ডগুলো একটা নির্দিষ্ট কাজ করার জন্য ব্যবহার করা হয়।

আবার ভ্যারিয়েবলের নাম, ফাংশনের নাম এবং অ্যারের নাম হিসেবে আমরা যা ব্যবহার করি তা হল আইডেন্টিফায়ার। যেমনঃ
int abc;
double tumi;
int arr[100];
int bee[300];
void Foo();
int func(int a);

উপরে আমরা কিছু ভ্যারিয়েবল, অ্যারে এবং ফাংশন ডিক্লায়ার করেছি।
এখানে abc হল একটা ইন্টিজার টাইপের ভ্যারিয়েবল, এক্ষেত্রে abc একটা আইডেন্টিফায়ার। আবার tumi নামে একটা ডাবল ডাটা টাইপের ভ্যারিয়েবল ডিক্লায়ার করেছি, সেক্ষেত্রে tumi একটা আইডেন্টিফায়ার।
একইভাবে arr, bee নামে দুইটা অ্যারে ডিক্লায়ার করেছি, এবং Foo, func নামে দুইটা ফাংশন ডিক্লায়ার করেছি। এগুলো ও আইডেন্টিফায়ার।

আশাকরি আপনারা কিওয়ার্ড এবং আইডেন্টিফায়ার কি এবং কি কাজে ব্যবহার করা হয় তা বুঝাতে পেরেছেন। পরবর্তী পোষ্টে আমরা ডাটাটাইপ এবং ভ্যারিয়েবল কি, ভ্যারিয়েবল কিভাবে ডিক্লায়ার করা হয় তা শিখব।