UIU: Learn C by Examples : String


Program 1


#include <cstdio>

using namespace std;

int findLength (char *s)
{
    int ret = 0;

    while (*s != '\0') {
        ret++;
        s++;
    }

    return ret;
}

int main (int argc, char *argv [])
{
    char str [] = {"Program"};

    int length = findLength(str);

    printf ("%d\n", length);

    return 0;
}

Program 2


#include <cstdio>
#include <cstring>

using namespace std;

int main (int argc, char *argv [])
{
    char str1 [20] = "Hello";
    char str2 [20] = " World";

    printf ("%s\n", strcpy(str2, strcat(str1, str2)));

    return 0;
}

Program 3


#include <cstdio>

using namespace std;

int main (int argc, char *argv [])
{
    char p [] = "%d\n";

    printf (p, 65);

    p [1] = 'c';

    printf (p, 65);

    return 0;
}

Program 4


#include <cstdio>
#include <cstring>

using namespace std;

int main (int argc, char *argv [])
{
    char str [] = "Hello\0World\0";

    printf ("%s\n", str);

    printf ("%d\n", strlen(str));

    return 0;
}

Program 5


#include <cstdio>

using namespace std;

int main (int argc, char *argv [])
{
    char ch;

    while ( (ch = getchar()) != '\n' ) {
        printf ("%c", ch);
    }

    printf ("\n");

    return 0;
}

Program 6


#include <cstdio>
#include <cstring>

using namespace std;

int main (int argc, char *argv [])
{
    int num;

    scanf ("%d", &num);

    char str [100];

    gets(str);

    printf("%d %s\n", num, str);

    scanf ("%d", &num);

    getchar();

    gets(str);

    printf("%d %s\n", num, str);
    
    scanf ("%d", &num);

    scanf ("%s", str);

    printf("%d %s\n", num, str);

    return 0;
}

Program 7


#include <cstdio>
#include <cstring>

using namespace std;

int main (int argc, char *argv [])
{
    char str [] = "This";

    char str1 [] = "That";

    char str2 [] = "this";

    printf ("%d\n", strcmp(str, str1));

    printf ("%d\n", strcmp(str1, str2));

    printf ("%d\n", strcmp(str, str2));

    printf ("%d\n", strcmp(str, str));

    return 0;
}

Program 8


#include <cstdio>
#include <string>

using namespace std;

int main (int argc, char *argv [])
{
    // important string functions, you should know 
    strcat();
    strchr();
    strcmp();
    strcpy();
    strstr();
    strtok();

    return 0;
}

UIU: Learn C++ STL by Examples : Stack and Queue



// @BEGIN_OF_SOURCE_CODE

#include <cstdio>
#include <stack>
#include <queue>

using namespace std;

int main (int argc, char *argv [])
{
    stack <int> stk;

    stk.push(5);
    stk.push(10);
    stk.push(15);

    if (stk.top() == 15) {
        printf ("stk top 15");
    }

    printf ("%lu\n", stk.size());

    stk.push(200);

    while (!stk.empty()) {
        printf ("%d\n", stk.top());
        stk.pop();
    }

    /*
    Queue
     */

    queue <int> q;

    q.push(10);
    q.push(15);
    q.push(20);
    q.push(25);

    if (q.front() == 10) {
        printf ("q front is 10");
    }

    printf ("%lu\n", q.size());

    printf ("%d\n", q.back());

    while (!q.empty()) {
        printf("%d", q.front());
        q.pop();
    }

    return 0;
}

// @END_OF_SOURCE_CODE

UIU: Learn C++ STL by Examples : Vector


ভেক্টর হল Dynamic array; যেমন, আমরা যখন array declare করি তখন আমাদের সাইজ বলে দিতে হয়।


int array [10];

কিন্তু যদি এমন হয়, আমি আগের থেকেই জানি না সাইজ কত হতে পারে; তখন আমরা ভেক্টর ব্যবহার করতে পারি। ভেক্টর ব্যবহার করলে আগের থেকেই সাইজ বলে দেয়ার দরকার হয় না। প্রথমে আমাদের

১. ভেক্টর declare করতে হয়।
২. তারপর একটা একটা করে element যোগ করতে হয়। খুবই সহজ


vector <int> numbers;

numbers.push_back(5);
numbers.push_back(10);
numbers.push_back(15);

যেমন: এইখানে আমি একটা ভেক্টর ডিক্লেয়ার করলাম। এবং সেই ভেক্টরে প্রথমে ৫, তারপর ১০, তারপর ১৫ রাখলাম। অর্থ্যাৎ

ভেক্টরের ১ম এলিমেন্ট ৫
২য় এলিমেন্ট ১০
৩য় এলিমেন্ট ১৫

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

অবশ্যই ভেক্টর ডিক্লেয়ার করার সময় আমাদের বলে দিতে হবে যে, আমরা কি টাইপের ডেটা রাখতে চাই। এইখানে আমরা int টাইপের ভেক্টর ডিক্লেয়ার করলাম। ভেক্টর ব্যবহার করতে হলে একটা হেডার ফাইল লাগবে এবং সাথে একটা অতি গুরুত্বপূর্ণ লাইন লিখতে হবে।


#include <vector>

using namespace std;

অতি গুরুত্বপূর্ণ লাইনটা অতীব গুরুত্বপূর্ণ বিধায় আলোচনা করলাম না ( আমি নিজেও জানি না এইটার মানে কি 😦 ); আপাতত যেভাবে আছে সেভাবেই ব্যবহার করেন।

এবার দেখি আমাদের ভেক্টরের সাইজ কত? .. হুম, আমরা জানি ভেক্টরের সাইজ ৩ হবে। কারন, ৩ টা এলিমেন্ট আছে।


printf ("%lu\n", numbers.size());   // %lu = unsigned long

একটা মজার বিষয়। আপনারা কি জানেন, function এবং method-এর পার্থক্য কি?

উপস! প্রশ্নটা করে তো বিপদে পড়ে গেলাম। এখন কি আমাকে বুঝাইতে হবে function এবং method-এর পার্থক্য কি? ওহ খোদা!

function হইল function আর কি। আমরা function ব্যবহার করি না? সেটাই।
আর Object Oriented Programming-এ এই function গুলাকেই method বলে।

এইটা কিছু হইলো? Object Oriented Programming আবার কি জিনিস? এবং একই জিনিসকে কেউ function আবার কেউ method বলবে কেন? সমস্যা কি?

সমস্যা গুরুতর কিছু না। আসলে পার্থক্য হল, function-কে এমনি এমনি কল করা যায়। কিন্তু method-কে কল করতে হলে একটা অবজেক্ট লাগে। মানে, প্রথমে একটা অবজেক্ট, তারপরে একটা ডট, তারপরে method-এর নাম। যেমন,

numbers.size()

এইখানে numbers হল অবজেক্ট এবং size() হল মেথড।

size() যদি function হত তাহলে আমরা

size();

বললেই কাজ হত। কিন্তু size() আসলে মেথড। কার মেথড? numbers এর মেথড। তাই numbers এর সাথে size() কে কল করলে numbers এর সাইজ পাওয়া যায়। :/

যাউক, function এবং method এমন কোন গুরুত্ববহ বিষয় না যে এখনই বুঝতে হবে। তাই আপাতত এর আলোচনা বাদ। যেখানে ছিলাম সেখানে ফিরে যাই। 🙂

ঘটনা হইলো, numbers.size() কেন unsigned long return করে?

size তো আর int হতে পারে না। কারন, int তে negative and positive দুইধরনের সংখ্যাই রাখা যায়। size কখোনো negative হওয়া সম্ভব না। তাই size সবসময় unsigned; আর একটু আগেই বলছিলাম, ভেক্টরের সাইজ আগের থেকে বলে দিতে হয় না, দরকার মত বড় বা ছোট হয়। এখন বড় হতে হতে কিন্তু সাইজ অনেক অনেক বড় হতে পারে। তো অনেক বড় একটা সাইজ রাখার জন্য আমাদের জানামতে long ডেটাটাইপ আছে, তাই না?

যদিও এখন পর্যন্ত বেস্ট প্র্যাকটিস হল একটা অ্যারে / ভেক্টরের সাইজ 10^7 এর বেশি না হওয়া।


// @BEGIN_OF_SOURCE_CODE

#include <cstdio>
#include <vector>
#include <iostream>

using namespace std;

void print (vector <int> &v)
{
    for ( int i = 0; i < v.size(); i++ ) {
        printf ("%d ", v [i]);
    }

    printf ("\n");
}

void generate(vector <int> &v, int element)
{
    for ( int i = 0; i < element; i++ ) v.push_back(i * 10);
}

int main (int argc, char *argv [])
{
    vector <int> numbers;

    numbers.push_back(5);
    numbers.push_back(10);
    numbers.push_back(15);

    printf ("%lu\n", numbers.size());   // %lu = unsigned long

    printf ("%d\n", numbers [1]);

    printf("%d\n", numbers.back());

    printf("%d\n", numbers.front());

    numbers.clear();

    if (numbers.empty()) {
        printf ("numbers is an empty vector");
    }

    generate(numbers, 5);

    numbers.pop_back();

    numbers [0] = 1000;

    printf ("%d\n", *numbers.begin());

    printf ("%d\n", *numbers.end());

    numbers.insert(numbers.begin() + 1, 5);

    numbers.erase(numbers.begin() + 2);

    vector <int>::iterator it;

    for ( it = numbers.begin(); it != numbers.end(); it++ ) {
        printf ("%d\n", *it);
    }

    printf("%d\n", numbers.at(0));

    vector <int> numbers2 {10, 50, 20, 30, 70};

    vector <int> numbers3(5, 10);

    vector <int> numbers4 (10);

    return 0;
}

// @END_OF_SOURCE_CODE

Android: Input Field Validation


Checking volition in android form is really simple. Mostly errors can be occurred in editText fields. So in this example I am trying to show how to check editText input validation.

First off I have made a simple layout file, with 3 text fields
• First one is for normal text and it is a required field
• Second one is a emailAddress field and it is also required
• Third one is a phoneNumber field and not required

chances of errors can be reduced dramatically if you use android:inputType=”X” attribute

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >

    <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/et_normal_text"
            android:hint="Enter Normal Text"
            android:inputType="text"
            android:textStyle="bold"/>

    <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/et_email_address"
            android:textStyle="bold"
            android:inputType="textEmailAddress"
            android:hint="Enter Email Address"/>

    <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/et_phone_number"
            android:hint="Enter Phone Number"
            android:inputType="phone"
            android:textStyle="bold"/>

    <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Submit"
            android:id="@+id/btn_submit" />

</LinearLayout>

Now let’s take a look at the Validation.java class. It’s really simple and should be self-explanatory. I have added necessary comments on relevant places

I have listed the error messages at the top as constants. These texts should go into res -> string.xml file. Getting error messages from a common place would increase your application consistency

Validation.java


import android.widget.EditText;
import java.util.regex.Pattern;

public class Validation {

    // Regular Expression
    // you can change the expression based on your need
    private static final String EMAIL_REGEX = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    private static final String PHONE_REGEX = "\\d{3}-\\d{7}";

    // Error Messages
    private static final String REQUIRED_MSG = "required";
    private static final String EMAIL_MSG = "invalid email";
    private static final String PHONE_MSG = "###-#######";

    // call this method when you need to check email validation
    public static boolean isEmailAddress(EditText editText, boolean required) {
        return isValid(editText, EMAIL_REGEX, EMAIL_MSG, required);
    }

    // call this method when you need to check phone number validation
    public static boolean isPhoneNumber(EditText editText, boolean required) {
        return isValid(editText, PHONE_REGEX, PHONE_MSG, required);
    }

    // return true if the input field is valid, based on the parameter passed
    public static boolean isValid(EditText editText, String regex, String errMsg, boolean required) {

        String text = editText.getText().toString().trim();
        // clearing the error, if it was previously set by some other values
        editText.setError(null);

        // text required and editText is blank, so return false
        if ( required && !hasText(editText) ) return false;

        // pattern doesn't match so returning false
        if (required && !Pattern.matches(regex, text)) {
            editText.setError(errMsg);
            return false;
        };

        return true;
    }

    // check the input field has any text or not
    // return true if it contains text otherwise false
    public static boolean hasText(EditText editText) {

        String text = editText.getText().toString().trim();
        editText.setError(null);

        // length 0 means there is no text
        if (text.length() == 0) {
            editText.setError(REQUIRED_MSG);
            return false;
        }

        return true;
    }
}

MyActiviy.java file. I have used TextWatcher for instant input validation. After each changes made by the user, it will help us to show whether the inserted value is valid or not

MyActivity.java


import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MyActivity extends Activity {

    private EditText etNormalText;
    private EditText etEmailAddrss;
    private EditText etPhoneNumber;
    private Button btnSubmit;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        registerViews();
    }

    private void registerViews() {
        etNormalText = (EditText) findViewById(R.id.et_normal_text);
        // TextWatcher would let us check validation error on the fly
        etNormalText.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {
                Validation.hasText(etNormalText);
            }
            public void beforeTextChanged(CharSequence s, int start, int count, int after){}
            public void onTextChanged(CharSequence s, int start, int before, int count){}
        });

        etEmailAddrss = (EditText) findViewById(R.id.et_email_address);
        etEmailAddrss.addTextChangedListener(new TextWatcher() {
            // after every change has been made to this editText, we would like to check validity
            public void afterTextChanged(Editable s) {
                Validation.isEmailAddress(etEmailAddrss, true);
            }
            public void beforeTextChanged(CharSequence s, int start, int count, int after){}
            public void onTextChanged(CharSequence s, int start, int before, int count){}
        });

        etPhoneNumber = (EditText) findViewById(R.id.et_phone_number);
        etPhoneNumber.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {
                Validation.isPhoneNumber(etPhoneNumber, false);
            }
            public void beforeTextChanged(CharSequence s, int start, int count, int after){}
            public void onTextChanged(CharSequence s, int start, int before, int count){}
        });

        btnSubmit = (Button) findViewById(R.id.btn_submit);
        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*
                Validation class will check the error and display the error on respective fields
                but it won't resist the form submission, so we need to check again before submit
                 */
                if ( checkValidation () )
                    submitForm();
                else
                    Toast.makeText(MyActivity.this, "Form contains error", Toast.LENGTH_LONG).show();
            }
        });
    }

    private void submitForm() {
        // Submit your form here. your form is valid
        Toast.makeText(this, "Submitting form...", Toast.LENGTH_LONG).show();
    }

    private boolean checkValidation() {
        boolean ret = true;

        if (!Validation.hasText(etNormalText)) ret = false;
        if (!Validation.isEmailAddress(etEmailAddrss, true)) ret = false;
        if (!Validation.isPhoneNumber(etPhoneNumber, false)) ret = false;

        return ret;
    }
}
android form validation

android form validation