UIU: C and C++ for Contest Programming


প্রোগ্রামিং কনটেস্টে C++ সবচাইতে জনপ্রিয় Programming Language, কারনটাও খুব সহজ।
আমরা জানি, C++ হল C-এর সুপারসেট।
মানে হল, C++ দিয়ে C-এর সবকিছু করা যায় এবং C++-এর নিজস্ব কিছু সুবিধাও আছে।

তাছাড়া, C / C++ দিয়ে করা প্রোগ্রাম সবচেয়ে দ্রুত রান করে। সেই তুলনায় Java দিয়ে করা প্রোগ্রাম অনেক আস্তে রান করে।

এবার আমরা কিছু উদাহরনের সাহায্যে C এবং C++-এ কিভাবে প্রোগ্রাম করতে হবে সেটা দেখি
C-তে করা একটা প্রোগ্রাম কোনরকম পরিবর্তন না করে C++ Compiler দিয়ে রান করা যায়।

 
// @BEGIN_OF_SOURCE_CODE

#include <stdio.h>

int main(int argc, char *argv[]) 
{
	printf("This is a C program. It can be executed with C++ Compiler");
}

// @END_OF_SOURCE_CODE

Header File stdio.h এইভাবে লিখাটা C-এর স্টাইল।
মানে হল, উপরের কোডটা C-এর কোড কিন্তু C++ Compiler দিয়ে রান করা যাবে।

কিন্তু একই কোড যদি C++ দিয়ে লিখতে চাই তাহলে কেমন হবে?

 
// @BEGIN_OF_SOURCE_CODE

#include <cstdio>

int main(int argc, char *argv[]) 
{
	printf("This is a C++ program.");
}

// @END_OF_SOURCE_CODE

সবকিছুই আগের মত, শুধুমাত্র Header File-টা একটু পরিবর্তন হয়েছে।
stdio.h না লিখে আমরা লিখলাম cstdio, এটা হল C++-এর স্টাইল।

C-এর সবগুলো Header File C++-এ ব্যবহার করা যাবে, শুধু .h টা বাদ দিয়ে দিতে হবে এবং আগে একটা c লাগাতে হবে।
খুবই সহজ ব্যপার, তাই না?

যেমন:
math.h হবে cmath
string.h হবে cstring
এইভাবে ..

এবার আমরা দেখব কিভাবে মাত্র ১ লাইন কোড করে একটা Array sort করা যায়। প্রথমে আমরা কোডটা দেখি

 
// @BEGIN_OF_SOURCE_CODE

#include <cstdio>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[]) 
{
	int a [] = {5, 1, 4, 2, 3, 4, 6};

	sort (a, a + 7);

	for ( int i = 0; i < 7; i++ ) {
		printf ("%d\n", a [i]);
	}
}

// @END_OF_SOURCE_CODE

#4: sort fucntion-টা কল করার জন্য algorithm Header File টা লাগবে।
এটা একটা C++ Header File

#6: using namespace std এই লাইনটা আপাতত যেভাবে আছে সেভাবেই লিখে দিতে হবে।
যখনই আমরা C++ STL (Standard Template Library) ব্যবহার করব, তখনই এই লাইনটা দিতে হবে।

STL (Standard Template Library) নিয়ে আমরা অন্য একটা পোস্টে বিস্তারিত আলাপ করব।
আপাতত শুধু জানতে হবে, STL (Standard Template Library)-র একটা অংশ হল algorithm

using namespace std মানে হল, আমরা standard namespace ব্যবহার করছি।
ব্যপারটা হয়ত কিছুটা জটিল, কিন্তু আমি যতটা পারি সহজভাবে বলার চেষ্টা করি।
এই ব্যপারটা না বুঝলেও আপাতত বিশেষ ক্ষতি নাই।

Header file কিন্তু নিজেই বানানো যায়
যেমন: stdio.h ফাইলটার printf function আমরা ব্যবহার করি, তাই না?
একইভাবে মনে করেন, আমরা একটা Header file বানালাম, নাম দিলাম uiu.h
এবং এই Header file-এর ভিতরে কিছু function লিখলাম
আমরা একটা কোড দেখি তাহলে পুরা ব্যপারটা ক্লিয়ার হবে

নিচের কোডটা uiu.h ফাইলের কোড

 
int addition(int a, int b)
{
    return a + b;
}

int product(int a, int b)
{
    return a * b;
}

এইবার আমরা main.cpp ফাইলের কোড দেখব

 
// @BEGIN_OF_SOURCE_CODE

#include <cstdio>
#include "uiu.h"

// uiu.h is our custom header file, means we wrote this 
// so we can't include it like, #include <uiu.h>, this is wrong 

int main(int argc, char *argv[])
{
    printf("addition result: %d\n", addition(5, 6));

    printf("product result: %d\n", product(5, 6));

    return 0;
}

// @END_OF_SOURCE_CODE

নিজের বানানো Header File include করতে চাইলে #include "uiu.h" – এইভাবে করতে হবে, ওকে?

দেখেন, আমরা যে function গুলা আমাদের Header ফাইলে দিলাম, সেগুলা আমরা আমাদের main function-এ ব্যবহার করতে পারি, মজার ব্যপার না?

এখন মনে করেন, আপনার দোস্ত মি: আবুল একটা Header File লিখল
এবং আপনি সেটা ব্যবহার করতে চান

abul.h

 
int addition(int a, int b)
{
    return a + b + 10;
} 

main.cpp

 
// @BEGIN_OF_SOURCE_CODE

#include <cstdio>
#include "uiu.h"
#include "abul.h"

int main(int argc, char *argv[])
{
    printf("addition result: %d\n", addition(5, 6));

    printf("product result: %d\n", product(5, 6));

    return 0;
}

// @END_OF_SOURCE_CODE 

সমস্যা হলো আপনার দোস্তের Header ফাইলে একটা function আছে addition ()
একই নামে একটা function আছে uiu.h ফাইলের মধ্যে
এবং আপনি abul.h এবং uiu.h দুইটাই ব্যবহার করতে চান

এখন আপনি যখন main.cpp থেকে addition() কল করবেন তখন কোনটা কল হবে?

দিলেন তো প্যাচ লাগাইয়া!! এখন কোন function কল হবে সেটা কে ঠিক করবে?

আগেই বলছি এইসব জটিল জিনিস বুঝার কাম নাই ..
তাও পোলাপানগুলা “এইটা কি?”, “ঐটা কি?” কইরা খালি প্রশ্ন করে! :-/

পুরানো আলোচনায় ফিরে আসি
আমরা একটা বেকায়দা পরিস্থিতির মধ্যে আছি, তাই না?
কোন function কল হবে?

আমরা এই ঝামেলার মধ্যে পড়তে চাই না, তাই using namespace std ব্যবহার করব।

যদি ঝামেলায় যাওয়ার শখ হয় তাহলে কি করবেন?
এই সমস্যার একটা সমাধান করতে হবে।
এবং সমস্যাটার সমাধান হল অন্যকোন namespace ব্যবহার করা।
যেমন: using namespace uiu;

আমি কোড দিয়ে উদাহরণ দেই

uiu.h

 
namespace uiu {
    int addition(int a, int b)
    {
        return a + b;
    }

    int product(int a, int b)
    {
        return a * b;
    }
}

abul.h

 
namespace abul {
    int addition(int a, int b)
    {
        return a + b + 10;
    }
}

main.cpp

 
// @BEGIN_OF_SOURCE_CODE

#include <cstdio>
#include "uiu.h"
#include "abul.h"

using namespace uiu;
using namespace abul;

int main(int argc, char *argv[])
{
    printf("uiu addition result: %d\n", uiu::addition(5, 6));

    printf("abul addition result: %d\n", abul::addition(5, 6));

    printf("product result: %d\n", product(5, 6));

    return 0;
}

// @END_OF_SOURCE_CODE

আমরা এইখানে দুইটা namespace ব্যবহার করলাম, namespace uiu এবং namespace abul
মানে হলো, দুইটা আলাদা জায়গা বানালাম
অর্থাৎ আমাদের দুইটা addition function এখন আর একজায়গাতে নাই
একটা আছে namespace uiu-এর মধ্যে, আরেকটা আছে namespace abul-এর মধ্যে

যখন আমরা addition function কল করব তখন বলে দিতে হবে আমরা কোন namespace-এর addition function কল করতে চাই
uiu::addition() মানে, uiu namespace-এর addition
abul::addition() মানে, abul namespace-এর addition, ঘটনা পরিষ্কার?


{
:: কিছুই তো বুঝলাম না, এইগুলা কি কইলেন? 😦 …
:: আপাতত এইগুলা না বুঝলেও হবে .. এমন কোনো জরুরী বিষয় না 🙂
}

#10: আমরা একটা array নিলাম, এবং ৭টা সংখ্যা insert করলাম।
যদি এইভাবে value assign করে দেন তাহলে array size বলে দিতে হবে না
সংখ্যাগুলা এলোমেলো, আমরা এইগুলাকে sort করব

#12: sort function call করলাম। প্রথম parameter দিতে হবে arrayটা, দ্বিতীয় parameter দিতে হবে array + length of array।
যেমন: আমাদের Arrayতে 7টা element আছে। Length: 7

#14-16: আমরা লুপ চালিয়ে Arrayটা print করব দেখার জন্য যে, Arrayটা আসলেই sort হল কিনা

input output নেবার জন্য C++-এর নিজস্ব ব্যবস্থাও আছে। আমরা প্রথমে নিচের কোডটা দেখি।

// @BEGIN_OF_SOURCE_CODE

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) 
{
	int a;
	int b;
	char c [10];

	cin >> a >> b >> c;

	cout << a << "\n" << b << " " << c << endl;
}

// @END_OF_SOURCE_CODE

#3: C++-এ input output নেবার জন্য লাগবে। iostream হল, input output stream
C++ Header file

#9-11: 3 টা variable নিলাম।

#13: 3 টা variable-এ input নিয়ে ফেল্লাম! সহজ না?
integer হলে %d কিংবা string হলে %s দিতে হবে, এমন কোন কাহিনি নাই।

#15: একইভাবে cout দিয়ে output দিলাম। endl হল end of line, মানে newline আর কি

আমরা যদি C দিয়ে 2 টা নাম্বার input নিই তাহলে কিভাবে নিতে হয়?

while ( scanf ("%d %d", &a, &b) != EOF ) {

}

C++ দিয়ে কত সহজ দেখবেন?

while ( cin >> a >> b ) {

}

তবে ব্যপার হল, C++ দিয়ে input – output নেয়া অনেক সহজ এবং মজার হলেও, এইভাবে না নেয়াই ভাল।
এমনিতে কোন সমস্যা নাই, কিন্তু scanf and printf অনেক faster then cin and cout। বুঝা গেল বিষয়টা?

এইসব ছোটখাট input output বা Header File ছাড়া C / C++-এর মধ্যে আর কোন পার্থক্য আপাতত জানতে হবে না।
C++ ব্যবহার করার অন্যতম প্রধান কারন হল, STL। এই জিনিসটা আমরা অন্য একটা পোস্টে দেখব।

Advertisements

3 thoughts on “UIU: C and C++ for Contest Programming

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s