Friday, August 16, 2019

বিপাকীয় স্ট্রিং!

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

String:

আপনি যদি স্ট্রিং কি তা জানেন তবে পরের টপিকে চলে যান, আর যদি না জানা থাকে তবে ধরুন আপনি যদি একটি বর্ণ লিখেন তবে সেটি একটি ক্যারেক্টর(char) আবার স্ট্রিং(string), আবার যখন একটি শব্দ(word) বা একটি বাক্য(sentence) লিখেন তখন আর সেটি ক্যারেক্টার থাকে না, হয়ে যায় স্ট্রিং। যেটিকে আপনি চাইলে char array বলতে পারেন! এই সম্বন্ধে আরও জানতে এখানে(Bangla-C) অথবা এখানে(English-C++) ক্লিক করুন!

Undefined Size String:

যদি নিউ লাইন না দেয়া পর্যন্ত কোন স্ট্রিং ইনপুট নিতে চাই অর্থাৎ undefined সাইজের, সেক্ষেত্রে নিচের syntax টি বেশ কার্যকর -


#include<bits/stdc++.h>

using namespace std;

int main ()

{

    char str[100];

    scanf("%[^\n]",str); 

    printf("%s",str);

    return 0;

}



আমরা চাইলে এটা গেটস এবং পুটস দিয়েও করতে পারি-


#include<bits/stdc++.h>
using namespace std;
int main ()
{
    char str[100];
    gets(str);
    puts(str);
    return 0;
}


But আমরা যদি str[ ] এর সাইজের থেকে বেশি  input দিয়ে ফেলি সেক্ষেত্রে হয়ত output দেখাবে এবং garbage রিটার্ন করবে। সুতরাং সাইজের ক্ষেত্রে আমাদের সতর্ক থাকতে হবে!


getline() function:


Without ‘char’ we can’t take a string type input and execute them along with spaces because it only shows the string before the first white space. To solve this problem, we can use getline() function which makes the way super easy.


#include <bits/stdc++.h>
using namespace std;
int main()
{
    string str;
    getline(cin, str);

    int len;
    len=str.size();

    cout<<len<<endl;
    cout<<str;

    return 0;
}

Reverse String:


যদি কোন স্ট্রিংকে রিভার্স করতে চাই তবে তার length কে iteration করে print করলে হয়ে যায়-

#include<bits/stdc++.h>
using namespace std;
int main ()
{
    int i, l=0;
    char str[100];
    gets(str);
    for(int i=0; str[i]!='\0'; i++){
        l++;
    }
    for(i=l-1; i>=0; i--){
        cout<<str[i];
    }
    return 0;
}

নতুন কোন স্ট্রিঙে রেখে প্রিন্ট করতে চাইলে-

#include<bits/stdc++.h>
using namespace std;
int main ()
{
    int i, j, l=0;
    char str[100], newstr[100];
    gets(str);
    for(int i=0; str[i]!='\0'; i++){
        l++;
    }
    for(i=l-1, j=0; i>=0; i--, j++){
        newstr[j]=str[i];
        cout<<newstr[j];
    }
    return 0;
}

String Concatenation:


আমরা যদি দুটি স্ট্রিং ইন্টিগ্রেট করে প্রিন্ট করতে চাই তবে প্রথমটির দৈর্ঘ্য জেনে সেখান থেকে লুপ চালাইলেই পেয়ে যাব। তবে লুপ শেষে অবশ্যই প্রথম স্ট্রিঙের একটি নাল \0’ value assign করতে হবে কারণ স্ট্রিং কোথায় শেষ হবে বলা জরুরী!


#include<bits/stdc++.h>
using namespace std;
int main ()
{
    int i, j, l=0;
    char str[100]="Bangla", str1[100]="desh";
    for(i=0; str[i]!='\0'; i++){
        l++;
    }
    for(i=l, j=0; str1[j]!='\0'; i++, j++){
        str[i]=str1[j];
    }
    str[i]='\0';
    cout<<str;
    return 0;
}

String Comparison Fact:

দুইটি স্ট্রিং এর তুলনা বা বড়/ছোট compare করতে ‘( )’ এর মাঝে রাখা জরুরী! যেমন- 

#include <bits/stdc++.h>
using namespace std;
int main()
{
string s0="Hello! ";
string s1="I am Alice";
string s2="Are You Bob? ";
string s3="No, I am EVE!";

string s4=s0+" "+s1;
cout<<( s4.length()==s0.length() );
}


আজকে এপর্যন্তই, Happy Coding! 😀

Wednesday, February 13, 2019

Why does the Dijkstra algorithm fail to detect negative cycles?

Dijkstra’s algorithm fails to detect and correctly handle negative weight cycles due to the way it processes nodes and updates the shortest ...