বেসিক সি প্রোগ্রামিং – শুরুর কথা

বর্তমান সময়ের জনপ্রিয় এবং বহুল ব্যবহৃত প্রোগ্রামিং ল্যাঙ্গুয়েজের মধ্যে সি অন্যতম। আধুনিক প্রোগ্রামিং ল্যাঙ্গুয়েজের যাত্রা শুরু হয় সি দিয়ে। বর্তমানে যেসব প্রোগ্রামিং ল্যাঙ্গুয়েজ জনপ্রিয়তার শীর্ষে আছে সেসব গুলোর কোন না কোন অংশ সি থেকে নেওয়া হয়েছে। যেমনঃ সি++, পিএইচপি, জাভা, সি#…
ড্যানিস রিচি (১৯৬৯ – ১৯৭২ সালের মধ্যে)AT&T ল্যাবরেটরীতে সি ডেভেলপ করেন। সি প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করার প্রধান উদ্দেশ্য ছিল ইউনিক্স অপারেটিং সিস্টেম। সি প্রোগ্রামিং এর সম্পর্কে আরো বিস্তারিত জানতে চাইলে এখানে দেখতে পারেন

এই পোষ্ট থেকে আমি নিয়মিত সি প্রোগ্রামিং ল্যাঙ্গুয়েজ সম্পর্কে আপনাদের ধারনা দেওয়ার চেষ্টা করব। আশাকরি সবগুলো পোষ্ট শেষ হলে আপনারা সি প্রোগ্রামিং সম্পর্কে ভাল একটা ধারনা পাবেন এবং সি প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করে নিজ থেকে প্রোগ্রাম লিখতে পারবেন।
সি প্রোগ্রামিং শুরু করার আগে আপনাদেরকে কে একটা কম্পাইলার ডাউনলোড করতে হবে। সি প্রোগ্রামিং এর জন্য কয়েকটা ভাল কম্পাইলার আছে, নিচে আমি দুইটা কম্পাইলারের ডাউনলোড লিংক দিলাম, আপনাদের পছন্দ অনুযায়ী যে কোন একটা কম্পাইলার ডাউনলোড করতে পারেনঃ আমি দুইটা কম্পাইলারে কিভাবে সোর্সকোড কম্পাইল করতে হয় বলে দিব।
১। Code::Blocks
২। Orwell Dev C++

কম্পাইলার কি এবং কেন লাগে?
কম্পাইলার হল একটা সফটওয়্যার যেটা প্রোগ্রামিং ল্যাঙ্গুয়েজের সোর্সকোডকে মেশিন লেভেল কোডে কনভার্ট করে।
প্রোগ্রাম কম্পাইল না করলে কি হয়?
আপনি যখন একটা প্রোগ্রাম লিখবেন তখন মেশিনকে অবশ্যই বুঝতে হবে আপনার কোডটা কি কাজ করবে। মেশিন যদি আপনার কোড না বুঝে তাহলে কোড লিখে লাভটাই কি!!
মেশিন 0 এবং 1 ছাড়া আর কিছু বুঝে না। এখন আপনার কোডটা মেশিনকে বুঝাতে হলে মেশিন যেভাবে বুঝে ঠিক ঐইভাবে আপনার কোড কনভার্ট করতে হবে। আপনার হয়ে সে কাজটা করার জন্য কম্পাইলার ব্যবহার করতে হবে।

সিনট্যাক্সঃ প্রতিটি প্রোগ্রামিং ল্যাঙ্গুয়েজের একটা নির্দিষ্ট সিনট্যাক্স থাকে। সি প্রোগ্রামিং এর জন্য একেবারে সহজ সিনট্যাক্স হলঃ

<header files>
int main()
{
	//your task goes here
	return 0;
}

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

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

সি প্রোগ্রামিং এ তোমার আপনার প্রথম প্রোগ্রামঃ
আশাকরি আপনারা কম্পাইলার ডাউনলোড করেছেন। যারা Dev C++ ডাউনলোড করেছেন তারা File > New > Source File এ ক্লিক করুন অথবা শর্টকাট ctrl + N প্রেস করুন। তাহলে আপনার নিচের ছবির মত একটা ট্যাব পাবেন।

Dev C++

Dev C++


যারা Code::Blocks ডাউনলোড করেছেন তারা File > New > Empty File এ ক্লিক কর অথবা শর্টকাট ctrl + shift + N প্রেস করুন। তাহলে আপনার নিচের ছবির মত একটা ট্যাব পাবেন।
Codeblocks

Codeblocks


এরপর নিচের কোডটা লিখুন এবং ফাইলের ফরম্যাট .c দিয়ে সেইভ করুন।
*.c [উদাহরনঃ mycode.c program.c abcdef.c, … …]
কোডঃ

#include <stdio.h>
int main()
{
	printf("Hello World!! This is my first C Program\n");
return 0;
}

উপরের কোডটা লেখা হলে তোমার কোড এবার কম্পাইল করতে হবেঃ
যারা Dev C++ ব্যবহার করছেন তারা কম্পাইল করার জন্য Execute > Compile & Run এ ক্লিক করুন অথবা শর্টকাট F11 প্রেস করুন।
যারা Code::Blocks ব্যবহার করছেন তারা কম্পাইল করার জন্য Build > Build & Run এ ক্লিক করুন অথবা শর্টকাট F9 প্রেস করুন।
এরপর আপনার নিচের ছবির মত আউটপুট স্ক্রীন এবং আউটপুট দেখতে পাবেন।
Output Screen
উপরের কোডটা বুঝতে পারলে এবার আপনি নিজের নাম প্রিন্ট করার জন্য একটা কোড লেখার চেষ্টা করুন।
আশাকরি আপনারা এই পোষ্টটি বুঝতে পেরেছেন।

সর্টিং

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

#include <algorithm>

সর্ট করার জন্য হেডার ফাইলের যে ফাংশন ব্যবহার করা হয় সেটা হলঃ

sort();
 

ধরুন আপনার কাছে st নামে একটা অ্যারে আছে এবং ঐ অ্যারের মোট অ্যালিমেন্ট হল n, তাহলে ঐ অ্যারের অ্যালিমেন্টগুলোকে সর্ট করার জন্য ফাংশনটা হবেঃ

sort(st, st + n);

নিচের কোডটা দেখলে এই ফাংশনের কাজটা বুঝতে আরো সহজ হবেঃ

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

int main()
{
	int st[100], n, i;
	cout<<"How many elements?: ";
	cin>>n;
	cout<<"Enter the elements of the array:"<<endl;
	for(i = 0; i < n; i++)
	{
		cin>>st[i];
	}
	cout<<"Before sorting:"<<endl;
	for(i = 0; i < n; i++)
	{
		cout<<st[i]<<"\t";
	}
	cout<<endl;
	
	sort(st, st + n);
	
	cout<<"After sorting:"<<endl;
	for(i = 0; i < n; i++)
	{
		cout<<st[i]<<"\t";
	}
	cout<<endl;
	return 0;
}

আউটপুটঃ

C++ Sorting

C++ Sorting

আশাকরি আপনারা আজকের পোষ্টটা বুঝতে পেরেছেন।

বাবল সর্ট অ্যালগরিদম

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

অ্যালগরিদমঃ বাবল সর্ট
কম্পেলেক্সিটিঃ O(n2)
বাবল সর্ট অ্যালগরিদমের ক্ষেত্রে বেষ্ট কেইস এবং ওর্স্ট কেইসের জন্য কম্পেলেক্সিটি একই। কিছু কিছু অ্যালগরিদমের জন্য বেষ্ট কেইস এবং ওর্স্ট কেইসের জন্য কম্পেলেক্সিটি ভিন্ন হয়। অ্যালগরিদমের কম্পেলেক্সিটি সম্পর্কে আরও জানতে চাইলে শাফায়েত ভাইয়ের এই পোষ্টটা পড়তে পারেন।

যেভাবে সর্ট করেঃ
ধরুন,আপনার কাছে arr নামে একটা অ্যারে আছে, যাতে n সংখ্যক এলিমেন্ট আছে। তাহলে সর্ট করার পর এলিমেন্টগুলো এমনভাবে তাদের পজিশন ইন্টারচেইঞ্জ করবে যাতে করে তাদের অর্ডারটা ঠিক এই রকম হয়ঃ
arr[0] < arr[1] < arr[2] < … … … … … … < arr [n – 2] < arr[n – 1]
অথবা এই রকমঃ
arr[1] > arr[2] > … … … … … … > arr [n – 2] > arr[n – 1].
বাবল সর্ট অ্যালগরিদম যেভাবে কাজ করেঃ
ধর arr অ্যারের n সংখ্যক এলিমেন্টগুলো হলঃ 32, 28, 27, 85, 13, 57

১ম পাসঃ
— শুরুতে অ্যারের arr[0] এলিমেন্ট এবং arr[1] এলিমেন্টের সাথে তুলনা করবে।
(i). যদি arr[0] এলিমেন্ট arr[1] এলিমেন্টের চেয়ে বড় হয় তাহলে arr[0] এলিমেন্টের পজিশনে arr[1] এলিমেন্ট আসবে এবং arr[1] এলিমেন্টের পজিশনে arr[0] এলিমেন্ট আসবে এবং arr[1] এলিমেন্টের arr[2] এলিমেন্টের তুলনা করবে। এটাকে সোয়াপ (swap) বলে।
(ii). যদি arr[0] এলিমেন্ট arr[1] এলিমেন্টের চেয়ে ছোট হয় তাহলে কোন সোয়াপ হবে না এবং arr[1] এলিমেন্টের arr[2] এলিমেন্টের তুলনা করবে।

আমাদের অ্যারের arr[0] পজিশনে আছে 32, এবং arr[1] পজিশনে আছে 28. যেহেতু 28 থেকে 32 বড় সেহেতু তারা নিজেদের পজিশন পরিবর্তন করবে। পজিশন পরিবর্তন হওয়ার পর arr[0] পজিশনে থাকবে 28 এবং arr[1] পজিশনে হবে 32.
— এরপর arr[1] এলিমেন্ট এবং arr[2] এলিমেন্ট তুলনা করবে।
(i). যদি arr[1] এলিমেন্ট arr[2] এলিমেন্টের চেয়ে বড় হয় তাহলে arr[1] এলিমেন্টের পজিশনে arr[2] এলিমেন্ট আসবে এবং arr[2] এলিমেন্টের পজিশনে arr[1] এলিমেন্ট আসবে এবং arr[2] এলিমেন্টের arr[3] এলিমেন্টের তুলনা করবে।
(ii). যদি arr[1] এলিমেন্ট arr[2] এলিমেন্টের চেয়ে ছোট হয় তাহলে কোন সোয়াপ হবে না এবং arr[2] এলিমেন্টের arr[3] এলিমেন্টের তুলনা করবে।
আমাদের অ্যারের arr[1] পজিশনে আছে 32, এবং arr[2] পজিশনে আছে 27. যেহেতু 27 থেকে 32 বড় সেহেতু তারা নিজেদের পজিশন পরিবর্তন করবে। পজিশন পরিবর্তন হওয়ার পর arr[1] পজিশনে থাকবে 27 এবং arr[2] পজিশনে হবে 32.
— এরপর arr[2] এলিমেন্ট এবং arr[3] এলিমেন্ট তুলনা করবে।
(i). যদি arr[2] এলিমেন্ট arr[3] এলিমেন্টের চেয়ে বড় হয় তাহলে arr[2] এলিমেন্টের পজিশনে arr[3] এলিমেন্ট আসবে এবং arr[3] এলিমেন্টের পজিশনে arr[2] এলিমেন্ট আসবে এবং arr[3] এলিমেন্টের arr[4] এলিমেন্টের তুলনা করবে।
(ii). যদি arr[2] এলিমেন্ট arr[3] এলিমেন্টের চেয়ে ছোট হয় তাহলে কোন সোয়াপ হবে না এবং arr[3] এলিমেন্টের arr[4] এলিমেন্টের তুলনা করবে।
আমাদের অ্যারের arr[2] পজিশনে আছে 32, এবং arr[3] পজিশনে আছে 85. যেহেতু 32 থেকে 85 বড় সেহেতু তারা নিজেদের পজিশন পরিবর্তন করবে না।
— এরপর arr[3] এলিমেন্ট এবং arr[4] এলিমেন্ট তুলনা করবে।
(i). যদি arr[3] এলিমেন্ট arr[4] এলিমেন্টের চেয়ে বড় হয় তাহলে arr[3] এলিমেন্টের পজিশনে arr[4] এলিমেন্ট আসবে এবং arr[4] এলিমেন্টের পজিশনে arr[3] এলিমেন্ট আসবে এবং arr[4] এলিমেন্টের arr[5] এলিমেন্টের তুলনা করবে।
(ii). যদি arr[3] এলিমেন্ট arr[4] এলিমেন্টের চেয়ে ছোট হয় তাহলে কোন সোয়াপ হবে না এবং arr[4] এলিমেন্টের arr[5] এলিমেন্টের তুলনা করবে।
আমাদের অ্যারের arr[3] পজিশনে আছে 85, এবং arr[4] পজিশনে আছে 13. যেহেতু 13 থেকে 85 বড় সেহেতু তারা নিজেদের পজিশন পরিবর্তন করবে। পজিশন পরিবর্তন হওয়ার পর arr[3] পজিশনে থাকবে 13 এবং arr[4] পজিশনে হবে 85.
— এরপর arr[4] এলিমেন্ট এবং arr[5] এলিমেন্ট তুলনা করবে।
(i). যদি arr[4] এলিমেন্ট arr[5] এলিমেন্টের চেয়ে বড় হয় তাহলে arr[4] এলিমেন্টের পজিশনে arr[5] এলিমেন্ট আসবে এবং arr[5] এলিমেন্টের পজিশনে arr[4] এলিমেন্ট আসবে এবং ২য় পাসে চলে যাবে।
(ii). যদি arr[1] এলিমেন্ট arr[2] এলিমেন্টের চেয়ে ছোট হয় তাহলে কোন সোয়াপ হবে না এবং ২য় পাসে চলে যাবে।
আমাদের অ্যারের arr[4] পজিশনে আছে 85, এবং arr[5] পজিশনে আছে 57. যেহেতু 85 থেকে 57 ছোট সেহেতু তারা নিজেদের পজিশন পরিবর্তন করবে। পজিশন পরিবর্তন হওয়ার পর arr[4] পজিশনে থাকবে 57 এবং arr[1] পজিশনে হবে 85.

১ম পাস শেষ হওয়ার পর আমাদের অ্যারে হবেঃ 28, 27, 32, 13, 57, 85.
কিন্তু এটা এখনো সর্ট হয়নি। সেক্ষেত্রে আমাদেরকে ২য় পাসে যেতে হবে।

২য় পাসঃ
এক্ষেত্রে সবকিছু ১ম পাসের মত হবে হবে। শুরুতে arr[0] এলিমেন্টের সাথে arr[1] এর তুলনা হবে। যদি arr[0] থেকে arr[1] ছোট হয় তাহলে পজিশন পরিবর্তন হবে। অন্যত্র arr[1] এর সাথে arr[2] এর তুলনা হবে। একইভাবে arr[2] এর সাথে arr[3], arr[3] এর সাথে arr[4], arr[4] এর সাথে arr[5] এর তুলনা হবে।
২য় পাস শেষে অ্যারেটা হবেঃ 27, 28, 13, 32, 57, 85
২য় পাস শেষে ও আমাদের অ্যারে এখনো সর্ট হয় নি। সেক্ষেত্রে আমাদেরকে ৩য় পাসে যেতে হবে।
৩য় পাসঃ
এক্ষেত্রে সবকিছু ১ম পাসের মত হবে হবে। শুরুতে arr[0] এলিমেন্টের সাথে arr[1] এর তুলনা হবে। যদি arr[0] থেকে arr[1] ছোট হয় তাহলে পজিশন পরিবর্তন হবে। অন্যত্র arr[1] এর সাথে arr[2] এর তুলনা হবে। একইভাবে arr[2] এর সাথে arr[3], arr[3] এর সাথে arr[4], arr[4] এর সাথে arr[5] এর তুলনা হবে।
৩য় পাস শেষে আমাদের অ্যারে হবেঃ 27, 13, 28, 32, 57, 85
৩য় পাস শেষে ও আমাদের অ্যারে সর্ট হয়নি। তাই আমাদেরকে ৪র্থ পাসে যেতে হবে।

৪র্থ পাসঃ
এক্ষেত্রে সবকিছু ১ম পাসের মত হবে হবে। শুরুতে arr[0] এলিমেন্টের সাথে arr[1] এর তুলনা হবে। যদি arr[0] থেকে arr[1] ছোট হয় তাহলে পজিশন পরিবর্তন হবে। অন্যত্র arr[1] এর সাথে arr[2] এর তুলনা হবে। একইভাবে arr[2] এর সাথে arr[3], arr[3] এর সাথে arr[4], arr[4] এর সাথে arr[5] এর তুলনা হবে।
৪র্থ পাস শেষে অ্যারেটা হবেঃ 12, 27, 28, 32, 57, 85

৪র্থ পাস শেষে দেখা যাচ্ছে আমাদের অ্যারে সর্ট হয়ে গেছে। সেক্ষেত্রে বাবল সর্ট অ্যালগরিদমের কাজ শেষ হবে।
এভাবে এক পাসের পর অন্য পাসে যাওয়ার মাধ্যমে বাবল সর্ট কাজ করে।

নিচের ছবিটি দেখলে বাবল সর্টের পাসগুলো বুঝতে আরো সহজ হবেঃ

Bubble Sort Pass. Collected From Wikipedia.

Bubble Sort Pass. [Collected From Wikipedia.]

বাবল সর্ট অ্যালগরিদমঃ

BubbleSort(arr[], n)
{
	for i = 0 to n - 1 do
	{
		for j = 0 to n - 1 do
		{
			if(arr[i] > arr[j])
			{
				swap (arr[i], arr[j]);
			}
		}
	}
	for i = 0 to n - 1 do
	{
		write(arr[i]);
	}
}

সি কোড

#include <stdio.h>

int main()
{
	int a[20], n, i, j, temp;
	printf("How many Element?: ");
	scanf("%d", &n);
	for(i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	for(i = 0; i < n; i++)
	{
		for(j = i + 1; j < n; j++)
		{
			if(a[i] > a[j])
			{
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}
	for(i = 0; i < n; i++)
	{
		printf("%d", a[i]);
	}
	puts("");
	return 0;
}

সি++ কোডঃ

#include <iostream>
using namespace std;

int main()
{
	int a[20], n, i, j, temp;
	cout<<"How many Element?:";
	cin>>n;
	for(i = 0; i < n; i++)
	{
		cin>>a[i];
	}
	for(i = 0; i < n; i++)
	{
		for(j = i + 1; j < n; j++)
		{
			if(a[i] > a[j])
			{
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}
	for(i = 0; i < n; i++)
	{
		cout<<a[i]<<"\t";
	}
	cout<<endl;
	return 0;
}

আউটপুট

Bubble Sort Algorithm Output Screen

Bubble Sort Algorithm Output Screen

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

সি শার্প টিউটোরিয়ালঃ ২ -সি শার্প প্রজেক্টে সাউন্ডফাইলের ব্যবহার

সি শার্প টিউটোরিয়ালের এই পর্বে আমরা শিখব কিভাবে সি শার্প প্রজেক্টে সাউন্ড ব্যবহার করা হয়। সি শার্প প্রজেক্টে সাউন্ড ব্যবহারের জন্য কয়েকটা পদ্ধতি আছে।। আজকে আমরা শুধুমাত্র সাউন্ডফাইলস ব্যবহার করার পদ্ধতি শিখব।
সি শার্প প্রজেক্টে সাউন্ডফাইল ব্যবহার করার জন্য আমাদেরকে .NET Framework এর বিল্ডইন লাইব্রেরী System.Media ব্যবহার করতে হবে। System.Media ব্যবহার করার জন্য আমাদের সোর্সকোডে নিচের কোডটা লিখতে হবেঃ

using System.Media;

এরপর সাউন্ডফাইল যোগ করার জন্য আমাদেরকে SoundPlayer ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। ইন্সট্যান্স ডিক্লায়ার করার সিনট্যাক্সঃ

SoundPlayer instance_name = new SoundPlayer(@"directory/path of the sound files");

নোটঃ SoundPlayer ক্লাসের প্যারামিটারে আমাদেরকে সাউন্ডফাইলের পাথ/ডিরেক্টরী ডিক্লায়ার করে দিতে হবে।
এরপর আমরা যে ইন্সট্যান্স ডিক্লায়ার করেছি সেটা দিয়ে SoundPlayer ক্লাসের play() ফাংশনটা কল করতে হবে।
উপরের কাজগুলো নিচের কোডে দেওয়া হল। এক্ষেত্রে আমরা কোডগুলো একটা বাটনের জন্য ব্যবহার করেছি। যখন কেউ ঐই বাটনে ক্লিক করবে তখন আমাদের সাউন্ডফাইলের সাউন্ডটা প্লে হবে।
কোডঃ

using System;
using System.Windows.Forms;
using System.Media;

public partial class Home : Form
{
	public Home()
       {
      		InitializeComponent();
       }
	private void button1_Click(object sender, EventArgs e)
	{
		SoundPlayer mySound = new SoundPlayer(@"Sound\Admin.wav");
      		mySound.Play();
	}
}

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

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

সি শার্প টিউটোরিয়াল সিরিজের এই পোষ্টে আমরা শিখব সি শার্প প্রজেক্টে কিভাবে মাইক্রোসফট অ্যাকসেস ডাটাবেইজ ব্যবহার করা হয়। অ্যাকসেস ডাটাবেইজ ব্যবহার করার জন্য আমরা .NET Framework এর বিল্ড ইন লাইব্রেরী System.Data এবং OleDb ডাটা কানেক্টর ব্যবহার করব। লাইব্রেরীটা ব্যবহার করার জন্য আমাদের সোর্স কোডে নিচের কোডটা লিখতে হবেঃ

 
using System.Data.OleDb;

প্রোগ্রামিং ল্যাঙ্গুয়েজের সাথে ডাটাবেইজ ব্যবহার করার জন্য ডাটা কানেক্টর ব্যবহার করতে হয়, সি শার্পে অ্যাকসেস ডাটাবেইজ ব্যবহার করার জন্য আমাদেরকে OleDb ডাটা কানেক্টর ব্যবহার করতে হবে। ডাটা কানেক্টর ব্যবহার করার সুবিধা হল এগুলোতে প্রোগ্রামিং ল্যাঙ্গুয়েজের সাথে একটা ডাটাবেইজ ব্যবহার করার জন্য যা যা লাগে (যেমন – ক্লাস, ফাংশন, …) ডিফাইন করা থাকে।
একটা ডাটাবেইজের সাধারন অপারেশন (যেমন – ইনসার্ট, ডিলিট, সিলেক্ট, …) এর জন্য যেসব ক্লাস, এবং তাদের ইন্সট্যান্স সব সময় ব্যবহার করতে হয় সেগুলো হলঃ
OleDbConnection: ডাটাবেইজের অপারেশনগুলো ব্যবহার করার জন্য আমাদেরকে অবশ্যই ডাটাবেইজের কানেকশন খোলা এবং বন্ধ করতে হবে। এসব কাজের জন্য OleDbConnection ক্লাসের ইন্সট্যান্স ব্যবহার করতে হবে। OleDbConnection ক্লাসের ইন্সট্যান্স ডিক্লায়ার করার সময় আমাদের একটা প্যারামিটার ডিক্লায়ার করতে হবে। এই প্যারামিটারে মূলত ডাটাবেইজের প্রোভাইডার (অ্যাকসেস ডাটাবেইজ হলে), ডাটাবেইজের পাথ/ডিরেক্টরী, ডাটাবেইজের ব্যবহারকারীর নাম, পাসওয়ার্ড ইত্যাদি তথ্য দেওয়া থাকে।
আমরা চাইলে OleDbConnection এর ইন্সট্যান্স দুইভাবে ডিক্লায়ার করতে পারিঃ

OleDbConnection myCon = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=sysDB.accdb;");

অথবা আমরা চাইলে প্যারামিটারের তথ্যগুলো একটা স্ট্রিং ভ্যারিয়েবলে রাখতে পারিঃ

 
string strConn = " Provider=Microsoft.ACE.OleDb.12.0;Data Source=sysDB.accdb;";
OleDbConnection myCon = new OleDbConnection(strConn);

আপনি উপরের যেকোন একটা পদ্ধতি ব্যবহার করতে পারেন।
OleDbDataAdapter: ডাটাবেইজের সাধারন অপারেশন (ইনসার্ট, ডিলিট, …) করার জন্য আমাদেরকে OleDbDataAdapter এর একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। ইন্সট্যান্স ডিক্লায়ার করার সিনট্যাক্স হলঃ


OleDbDataAdapter myAdapter = new OleDbDataAdapter();

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

ডাটাবেইজের প্রাইমারী ৪টা অপারেশনের জন্য ১ম কমান্ডটা ডিক্লায়ার করার সিনট্যাক্সঃ

myAdapter.InsertCommand = new OleDbCommand(string query, OleDbConnection myConn); //For insert operation
myAdapter.DeleteCommand = new OleDbCommand(string query, OleDbConnection myConn); //For delete operation
myAdapter.SelectCommand = new OleDbCommand(string query, OleDbConnection myConn); //For select operation
myAdapter.UpdateCommand = new OleDbCommand(string query, OleDbConnection myConn); // //For update operation

উপরের সিনট্যাক্স থেকে আমরা দেখতেই পারছি যে ১ম কমান্ডটা লিখার সময় আমাদেরকে দুইটা প্যারামিটার ডিক্লায়ার করতে হচ্ছে। যার মধ্যে ১ম প্যারামিটারে আমাদেরকে ডাটাবেইজের কুয়েরীটা লিখতে হবে, এবং ২য় প্যারামিটারে আমরা শুরুতে OleDbConnection এর যে ইন্সট্যান্সটা ডিক্লায়ার করেছি শুধুমাত্র ঐই ইন্সট্যান্সের নামটা লিখতে হবে।

ডাটাবেইজের অপারেশনটা এক্সসেপশন হ্যান্ডলিং (Exception Handling) এর মাধ্যমে করা ভাল, এতে করে আমাদের ডাটাবেইজের কানেকশন থেকে শুরু করে ডাটাবেইজের সাথে যেকোন রকম সমস্যা থাকলে তা ম্যাসেজ হিসাবে দেখাতে পারব।

Exception Handling এর try ব্লকে আমরা OleDbConnection এর ডিক্লাযার করা ইন্সট্যান্স দিয়ে Open() ফাংশনটা কল দিব, এরপর OleDbDataAdapter এর ২য় কমান্ড, যেটা দিয়ে ডাটাবেইজের অপারেশনের সম্পূর্ণ কাজ হবে সেটা লিখব। ইনসার্ট, ডিলিট, এবং আপডেট অপারেশনের জন্য ২য় কমান্ডটা একইঃ

myAdapter.DeleteCommand.ExecuteNonQuery();

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

 
using System;
using System.Windows.Forms;
using System.Data.OleDb;
namespace WindowsApplication
{
	public partial class Form1 : Form
    	{
        	public Form1()
        	{
            	InitializeComponent();
        	}
	}
	private void button_Click(object sender, EventArgs e)
        {
            string strConn = " Provider=Microsoft.ACE.OleDb.12.0;Data Source=”database path/directory”;
            Used ID=Here type user id;Password= Here type password";
            OleDbConnection myCon = new OleDbConnection(strConn);
      	    OleDbDataAdapter myAdapter = new OleDbDataAdapter();
      	    string Qry = "delete * from <table-name>";
      	    myAdapter.DeleteCommand = new OleDbCommand(Qry, myCon);
	    try
      	    {
      		myCon.Open();
            	myAdapter.DeleteCommand.ExecuteNonQuery();
                MessageBox.Show(“Delete!!”);
                myCon.Close();
            }
            catch (OleDbException ex)
      	    {
	        MessageBox.Show(ex.Message);
      	    }
       }
}

আশাকরি আপনারা সি শার্প প্রজেক্টে মাইক্রোসফট অ্যাকসেস ডাটাবেইজ ব্যবহার করার এই পদ্ধতি বুঝতে পেরেছেন।

অনলাইন জাজ এবং প্রোগ্রামিং কনটেস্টে প্রবলেম সলভিং

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

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

যখন আমরা প্রোগ্রামিং ল্যাঙ্গুয়েজ শিখি তখন কোড করার জন্য আমরা একটা নির্দিষ্ট সিনট্যাক্স অনুসরন করি। মনেকরুন আমাদেরকে নিচের প্রবলেমটা কোড করার জন্য দেওয়া হলঃ
“এমন একটা প্রোগ্রাম লিখুন যেটা দুইটা সংখ্যার যোগফল বের করবে”
এই প্রবলেমটার জন্য একটা কোড হতে পারে এই রকমঃ
সি

#include <stdio.h>
main()
{
    int a, b, c;
    printf("Enter the value of 1st number: ");
    scanf("%d", &a);
    printf("Enter the value of 2nd number: ");
    scanf("%d",&b);
    c = a + b;
    printf("The addiiton is: %d\n", c);
}

সি++

#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
    cout<<"Enter the value of 1st number: ";
    cin>>a;
    cout<<"Enter the value of 2nd number: ";
    cin>>b;
    c = a + b;
    cout<<"The addiiton is: "<<c;
    return 0;
}

উপরের কোডে দেখা যাচ্ছেঃ
১। ১ম নাম্বার এবং ২য় নাম্বারটা ইনপুট নেওয়ার জন্য আমরা দুইবার printf() ফাংশন (সি কোডে) এবং দুইবার cout অবজেক্ট (সি++ কোডে) ব্যবহার করেছি। তারপর আউটপুট প্রিন্ট করার জন্য আরো একবার printf() ফাংশন (সি কোডে) এবং একবার cout অবজেক্ট (সি++ কোডে) ব্যবহার করেছি।
২। উপরের কোডটা দিয়ে শুধুমাত্র একবার ইনপুট নেওয়া যাবে। তারমানে দুইটা নাম্বার ইনপুট নেওয়া এবং আউটপুট প্রিন্ট করার পর আমরা আবার দুইটা নাম্বার ইনপুট নিতে পারব না।

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

কেন/কিভাবে?

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

#include <stdio.h>
main()
{
    int a, b, c;
    while(scanf("%d %d", &a, &b) == 2)
    {
        c = a + b;
        printf("%d\n", c);
    }
}

সি++

#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
    while(cin>>a>>b)
    {
        c = a + b;
        cout<<c<<endl;
    }
    return 0;
}

১ম দিকে আমরা যে দুইটা কোড লিখেছি তার সাথে এই দুইটা কোডের পার্থক্য হলঃ

১। আমরা শুধুমাত্র একবার printf() ফাংশন (সি কোডে) এবং একবার cout অবজেক্ট ব্যবহার করেছি। সেটা শুধুমাত্র আউটপুট প্রিন্ট করার জন্য। খুব কম প্রবলেমে আপনাদেরকে Enter 1st number, Enter 2nd number, … … … এই টাইপের কথা লেখে লেখে ইনপুট নিতে বলবে (হয়ত এই রকম প্রবলেম আছে ০-১ টা!!!)। এটাই সত্য, কোন প্রবলেমে এইরকম লেখা লিখতে বলে না। এটা আমরা সাধারনত প্রোগ্রামিং ল্যাঙ্গুয়েজ শিখার সময় করি শুধুমাত্র নিজের এবং শিক্ষকের বুঝার সুবিধার্থে।
২। উপরের দুইটা কোডে আমরা চাইলে একের অধিক ইনপুট নিতে পারি, মানে একবারের চেয়ে বেশী দুইটা নাম্বার ইনপুট নিয়ে আউটপুট প্রিন্ট করতে পারি। উপরের কোডে যেহেতু কোন কন্ডিশন নেই তাই আমরা যতক্ষন আউটপুট স্ক্রীন বন্ধ করব না ততক্ষন ইনপুট নিতে পারব।

একের অধিক ইনপুট নেওয়া যায় এইরকম কোড কেন লিখবেন?
আপনারা যারা প্রোগ্রামিং কনটেস্ট করেছেন অথবা কোন অনলাইন জাজের প্রবলেম দেখেছেন তারা হয়ত লক্ষ্য করবেন “Sample Input” এ দুই-তিনটা ইনপুট এবং “Sample Output” এ ঐই ইনপুটগুলোর আউটপুট কি আসবে তা দিয়ে দিয়েছে। কিন্তু একটা প্রবলেমে ১০০ থেকে ১০০০ কিংবা আরো বেশী সংখ্যক ইনপুট থাকতে পারে। তাই আমাদেরকে প্রবলেমের এমন একটা কোড লিখতে হবে যেটা দিয়ে একটার বেশী ইনপুট নেওয়া যাবে।

তাহলে অনলাইন জাজ কিংবা প্রোগ্রামিং কনটেস্টের প্রবলেমগুলো সলভ করার জন্য আমরা একটা সহজ সিনট্যাক্স লিখতে পারিঃ

<header files> // একটা প্রবলেম সলভ করার জন্য যতগুলো header files লাগবে আমরা তা এখানে লিখব
int main()
{
	<Required Input> //একটা প্রবলেম সলভ করার জন্য যতগুলো Input নিতে হবে তা এখানে ডিক্লায়ার করব।
	while(<1st line of Input goes here>)  // প্রবলেমের Input Specification এ ১ম লাইনে যে Input নিতে বলবে সেটা এখানে ডিক্লায়ার করবে।
	{
		<other Input goes here> // প্রবলেমের Input Specification এ যদি একটার বেশী Input নিতে হয় তাহলে সেগুলো Input Specification অনুসারে একটার পর একটা এখানে লিখবে।
		<calculate output> //সবগুলো ইনপুট নেওয়া হলে আউটপুটে যা লাগবে তা ক্যালকুলেট করবে। 
                <print output>
                <print new line> //এরপর আউটপুট প্রিন্ট করবে। প্রতিবার আউটপুট প্রিন্ট করার পর লাইন ব্রেক করতে হবে, না হয় সম্পূর্ন কোড ঠিক থাকার পর ও Wrong Answer হবে।
}
return 0;
}

কয়েকটা জনপ্রিয় অনলাইন জাজঃ
১। UVa
২। TopCoder
৩। LightOJ, CodeChef
৪। CodeForces
৫। SPOJ
এরমধ্যে Lightoj হল বাংলাদেশী অনলাইন জাজ। এটি তৈরি করেছেন জানে আলম জান ভাই। বাংলাদেশীদের জন্য সবচেয়ে জনপ্রিয় অনলাইন জাজ হল UVa.
আপনারা যারা অনলাইন জাজ এবং প্রবলেম সলভ নিয়ে আরো জানতে চান তারা শাফায়েত ভাইয়ের এই পোষ্টটা পড়তে পারেন। প্রবলেম সলভ এ শুভকামনা রইল।

ডেসিমেল থেকে টারনারী

ডেসিমেল নাম্বারকে টারনারী নাম্বারে পরিবর্তন করার কোড।
কোডঃ (সি++)

#include <iostream>
using namespace std;
int main()
{
    long rem, base = 1, ternary = 0;
    long num;
    cout<<"Enter a Decimal Number: ";
    cin>>num;
    while(num > 0)
    {
        rem = num % 3;
        ternary = ternary + rem * base;
        num /= 3;
        base = base * 10;
    }
    cout<<"The Ternary number is: "<<ternary<<endl;
return 0;
}

কোডঃ (সি)

#include <stdio.h>
int main()
{
    long rem, base = 1, ternary = 0;
    long num;
    printf("Enter a Decimal Number: ");
    scanf("%ld", &num);
    while(num > 0)
    {
        rem = num % 3;
        ternary = ternary + rem * base;
        num /= 3;
        base = base * 10;
    }
    printf("The Ternary number is: %ld\n\n", ternary);
return 0;
}

ডেসিমেল থেকে বাইনারী

ডেসিমেল নাম্বারকে বাইনারী নাম্বারে পরিবর্তন করার কোড।
কোডঃ (সি প্লাস প্লাস)

#include <iostream>
using namespace std;
int main()
{
   long long decimal, rem, base = 1, binary = 0;
   cout<<"Enter a Decimal number: ";
   cin>>decimal;
   while(decimal > 0)
   {
       rem = decimal % 2;
       binary = binary + rem * base;
       decimal /= 2;
       base = base * 10;
   }
   cout<<"The Binary Number is "<<binary<<endl;
return 0;
}

কোডঃ (সি)

#include <stdio.h>
main()
{
   long long decimal, rem, base = 1, binary = 0;
   printf("Enter a Decimal number: ");
   scanf("%lld", &decimal);
   while(decimal > 0)
   {
       rem = decimal % 2;
       binary = binary + rem * base;
       decimal /= 2;
       base = base * 10;
   }
   printf("The Binary Number is %lld\n", binary);
}

আউটপুটঃ
decimal to binary

বাইনারী থেকে ডেসিমেল

নাম্বার সিস্টেমে প্রায় সময় এক বেইসের নাম্বারকে অন্য বেইসে পরিবর্তন করতে হয়। বাইনারী নাম্বারকে ডেসিমেল নাম্বারে পরিবর্তন কোড।
কোডঃ (সি প্লাস প্লাস)

#include <iostream>
using namespace std;
int main()
{
    int binary, decimal = 0, base = 1, rem;
    cout<<"Enter a Binary Number: ";
    cin>>binary;
    while(binary > 0)
    {
        rem = binary % 10;
        decimal += rem * base;
        binary /= 10;
        base *= 2;
    }
    cout<<"The Decimal number is: "<<decimal<<endl;
return 0;
}

কোডঃ (সি)

#include <stdio.h>
main()
{
    int binary, decimal = 0, base = 1, rem;
    printf("Enter a Binary Number: ");
    scanf("%d", &binary);
    while(binary > 0)
    {
        rem = binary % 10;
        decimal += rem * base;
        binary /= 10;
        base *= 2;
    }
    printf("The Decimal number is: %d\n", decimal);
}

আউটপুটঃ
binary to decimal