অনেক সময়ই আমাদেরকে একটি লাইনে যে কয়টি ইন্টিজার আছে, সে কয়টি ইন্টিজার ইনপুট নিয়ে পরবর্তী কাজগুলো করতে হয়, যেখানে আমরা জানিনা যে কয়টি ইন্টিজার আছে সেই লাইনে।
যেমন ধরুন,
2 3 34 21 4
5 4 3 2 34 23
এখানে প্রথম লাইনে 5 টি এবং দ্বিতীয় লাইনে 6 টি ইন্টিজার ভেলু আছে। আমাদের প্রতি লাইনে যে কয়টি ভেলু আছে সেগুলো ইনপুট নিয়ে কাজ করে তারপর পরের লাইনের ভেলু নিয়ে কাজ করতে হবে, অর্থাৎ আমরা কাজ করছি লাইন বাই লাইন। কিভাবে আমরা সহজেই লাইন বাই লাইন ইনপুট নিতে পারি?
কাজটি সহজে করার জন্য আমরা প্রথমে পুরো লাইনটিকে একটি স্ট্রিং হিসেবে ইনপুট নিবো, এ কাজের জন্য আমরা ব্যবহার করব getline() ফাংশন।
string line;
getline(cin, line);
এখন পুরো লাইনটি line নামের স্ট্রিং এ ইনপুট নিলাম আমরা। এখন এই স্ট্রিং কে আমরা ইনপুট স্ত্রিমে পরিণত করব istringstream ব্যবহার করে।
istringstream is(line);
এখানে is হচ্ছে একটি ইনপুট স্ত্রিম যেখানে পুরো লাইনটি আমরা সংরক্ষণ করলাম। এখন, আমরা is কে cin এর মতো করে ব্যবহার করতে পারব। is এর মধ্যে শুধু সে লাইনের যে কয়টি ইন্টিজার ছিল সেগুলোই পাওয়া যাবে।
int n;
while(is >> n){
//do something with n
}
তাহলে সম্পূর্ণ কোডটি হবে,
string line;
getline(cin, line);
istringstream is(line);
int n;
while(is >> n){
//do something with n
}
প্রব্লেম শলভ
এটি ব্যবহার করে আমরা ছোট একটা প্রব্লেম শলভ করতে পারি, ধরা যাক, প্রথমে k একটি সংখ্যা দেওয়া থাকবে, পরবর্তী k সংখ্যক লাইনের প্রতিটিতে কিছু সংখ্যা দেওয়া থাকবে, কতটি করে সংখ্যা দেওয়া থাকবে সেটা নির্দিষ্ট নয়, এক এক লাইনে ভিন্ন ভিন্ন সংখ্যক সংখ্যা থাকতে পারে। অউটপুট দিতে হবে k সংখ্যক সংখ্যা যেখানে i তম সংখ্যা হবে k টি লাইনের মধ্যে i তম লাইনের সকল সংখ্যার যোগফল।
input:
3
2 3 4
34 5 2 6 7
3 45
Output:
9
54
48
নিচে প্রব্লেমটির সলেউশন দেওয়া হল,
include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
getchar();
while(t--){
string line;
getline(cin, line);
istringstream is(line);
int n;
int sum=0;
while(is >> n){
sum+=n;
}
cout<<sum<<endl;
}
return 0;
}
Thanks a lot.