Input & output system in online judge

Bismillahir Rahmanir Rahim
সি প্রোগ্রামিং শেখার পরে যখন কেউ প্রবলেম সল্ভিং শুরু করতে যায়, তখন অনেকেই প্রথম যে সমস্যার সম্মুখীন হয় সেটা হল ইনপুট নেয়া, বিভিন্ন প্রবলেমে বিভিন্ন ভাবে ইনপুট নিতে বলা হয়, কখনও বলা হয় EOF(End Of File) পর্যন্ত ইনপুট নিতে হবে, কখনও বলা হয় N সংখ্যক ইনপুট দেওয়া হবে, এই রকম আরও অনেকরকম ভাবে ইনপুট দেওয়া হয়ে থাকে।
ছোট ভাই বোন যারা এই সমস্যা গুলোর মুখোমুখি হয়েছো তাদের জন্য এই পোষ্টটা ।
কথা না বাড়িয়ে আমরা কাজ শুরু করি। :)

প্রথমে আমরা এই প্রবলেমটা সমাধানের চেষ্টা করব।
Problem link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47352
প্রবলেমের প্রথমে Description অংশে বলা হয়েছে আমাদের A+B বের করতে হবে।
এরপর Input অংশে বলা হয়েছে প্রতি লাইনে আমাদের দুইটা করে Integer ইনপুট দেওয়া হবে এইটাও আমরা সহজেই বুঝতে পারলাম, কারন আমরা অনেক স্মার্ট ।
এর ঠিক পরেই বলা হয়েছে Process to end of file। এইটা আবার কী ?? :-?
End Of File মানে হল ফাইলের শেষ পর্যন্ত আমাকে ইনপুট নিতে হবে। মনে করি টেক্সট ফাইলে এই রকমের একটা ইনপুট আছে,
এখন এই ফাইলের শেষ কোথায় সেটা আমরা সহজেই বলতে পারি। শেষের লাইনে যে 3 আছে সেটার পরেই আমদের ফাইলের শেষ, কিন্তু এই ফাইলটা যদি আমরা দেখতে না পারতাম ??
তাহলে বলতে পারতাম না আসলে ফাইলটা কোথায় শেষ হচ্ছে।
এইখানেও বিষয়টা সেই রকমের আমাকে আসলে বলা হয়েছে একটা ফাইল আছে যাতে কিছু ইনপুট আছে কিন্তু আমি জানি না সেটা কোথায় শেষ, কিন্তু আমাকে সেই ফাইলের শেষ পর্যন্তই ইনপুট নিতে হবে।

সি তে EOF নামে একটা জিনিস আছে, এখন আমরা যদি এভাবে লিখি
while (scanf("%d %d",&A, &B) != EOF) {
        
    }
তাহলে End of File (until  not press Ctrl+z , input will be going on) পর্যন্ত আমার প্রোগ্রাম ইনপুটকে প্রসেস করবে। আমাদের ইনপুট যখন শেষ হয়ে যাবে তখন এই লুপ ব্রেক করবে।

Output অংশে বলা হচ্ছে প্রতিবার A আর B ইনপুটের জন্য আমাদের A+B অউটপুট দিতে হবে।
তাহলে উপরের প্রবলেম এর কোডটা আমারা করতে পারি সহজেই।
#include <stdio.h>

int main()
{
    int A, B;

    while (scanf("%d %d",&A, &B) != EOF) {
        printf("%d\n",A+B);
    }

    return 0;
}


in c++:

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


এখন এই প্রবলেমটা পড়ে দেখি কিছু বোঝা যায় কী না !
এইখানে আমাদের কাজটা ঠিক আগের মতই আমাদের A+B বের করতে হবে।
Input অংশে বলা হয়েছে প্রতি লাইনে আমাদের দুইটা করে Integer ইনপুট দেওয়া হবে এবং এইভাবে অনেক গুলো ইনপুট দেওয়া হবে আমরা জানি নাহ কতক্ষণ ইনপু্ট দেওয়া হবে।
প্রতিবার ইনপুটের জন্য আমাকে অউটপুট দিতে হবে।

একটু চিন্তা করে কোডটা নিজে করার চেষ্টা করুন, আগের প্রবলেমটা যদি বুঝে থাকেন তাহলে এইটা করতে পারবেন খুব সহজেই।

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

    scanf("%d",&N);

    for (i=1 ; i<=N ; i++) {
        scanf("%d %d",&A, &B) ;
        printf("%d\n",A+B) ;
    }

আমি অবশ্য for লুপ ব্যবহার না করে while লুপ ব্যাবহার করি :p

scanf("%d",&N);

    while (N--){
        scanf("%d %d",&a, &b) ;
        printf("%d\n",a+b);
    }


এখন এইটা দেখি
প্রতিলাইনে দুইটা ইনপুট দেওয়া হবে A আর B, যখন A আর B দুইটার মান 0 তখন লুপ ব্রেক করতে হবে।
একটু চিন্তা করলে এইটা করতে পারবেন। চেষ্টা করতে থাকুন।

শেষ প্রবলেম দেখবো আমরা

এইটা অনেক সহজ, বলা হয়েছে অনেক গুলো টেস্ট কেস থাকবে, প্রতি কেসের শুরুতে N ইনপুট দেওয়া হবে, এর পরে একই লাইনে সংখ্যক ইনপুট দেওয়া হবে, সংখ্যা গুলোর যোগফল দেখাতে হবে আমাদের।
যখন N এর মান 0 ইনপুট দেওয়া হবে তখন আমাদের প্রোগ্রাম শেষ করতে হবে।
কোডটা এইভাবে করা যেতে পারে
#include <stdio.h>

int main(){

    int N, i, tmp, sum;

    while(scanf("%d",&N) == 1 && N){

        sum = 0;
        for(i=1 ; i<=N ; i++){
            scanf("%d",&tmp);
            sum = sum + tmp;
        }
        printf("%d\n",sum);
    }

return 0;
}
07. লাইনটা খেয়াল করলে দেখতে পাবেন এখনও পর্যন্ত আমরা এইটার সাথে পরিচিত নাহ। এখানে আসলে কী হচ্ছে ??
আসলে scanf() ফাংশানটা return করে কতগুলো variable সে scan করেছে সেটা।
এভাবে যদি লেখা হয়
scanf("%d %d %d",&a, &b, &c) //এখানে আমি a,b,c তিনটা variable scan করছি তাই এখানে scanf() function retun করবে 3, এভাবে 10 টা scan return করবে 10


আমি যে ৫টা প্রবলেম নিয়ে আলোচনা করলাম সেগুলো ছাড়া আরও ৩টা প্রবলেম আছে, আগের গুলো যদি আপনি বুঝতে পেরে থাকেন তাহলে এই টেকনিক গুলো ব্যাবহার করে আপনি বাকি গুলো করতে পারবেন বলে আমি আশা করছি।

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

কন্টেস্ট এর লিংক

:::::::::::::Collected::::::::::::::::::
সবাইকে ধন্যবাদ। ;)

Socializer Widget By Blogger Yard
SOCIALIZE IT →
FOLLOW US →
SHARE IT →