Tuesday, October 10, 2017

C# For Beginners, Part-19 ( Class )

                   আজকে ,  আমরা ক্লাস নিয়ে বেসিক কিছু ধারণা নেবার চেষ্টা করবো ,চলো ।

 ক্লাস সাধারণত , Data  ও  Behaviour  নিয়ে গঠিত । । এখন আমরা শিখবো , কিভাবে একটা ক্লাসে , কন্সট্রাক্টর , ডিস্ট্রাকটর ক্রিয়েট করতে হয়  ????  চলো আমরা একটা সিম্পল কোড দেখে আসি ,

using System;

class Customer
{
    string _firstname="Joy";
    string _lastname="Mollick";
  
    public void Print()
    {
        Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
        Console.ReadKey();
    }
}

class Program
{
    public static void Main()
    {
        Customer j = new Customer();
        j.Print();
    }

}

আমরা , এখানে  Customer নামক একটা ক্লাসের ভেতরে , একটা ইন্সট্যান্স মেথড ক্রিয়েট করেছি । ।
তারপর , মেইন মেথড এর ভেতরে এই Customer ক্লাসের একটা ইন্সট্যান্স ক্রিয়েট করেছি , তারপর  Print মেথডকে কল করেছি ।।  এখন ঘটনা হলো , এখানে আমাদের Customer ক্লাসের ভেতরে Default ভাবে একটা কন্সট্রাক্টর ক্রিয়েট হয়ে গেছে , তাই কম্পাইল হতে কোনো প্রবলেম হলো না  । ।  কন্সট্রাক্ট্র আর ক্লাস নেইম কিন্তু সেইম হতে হয় , এটা মাথায় রাখতে হবে । চলো , এবার আমরা নিজেরা একটা কন্সট্রাকটর ক্রিয়েট করে ফেলি ---

using System;

class Customer
{
    string _firstname="Joy";
    string _lastname="Mollick";
// Constructor
   public Customer(string FIRSTNAME, string LASTNAME)
    {
        this._firstname = FIRSTNAME;
        this._lastname = LASTNAME;
    }
    public void Print()
    {
        Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
        Console.ReadKey();
    }
// DeConstructor
    ~Customer()
    {

    }
}

class Program
{
    public static void Main()
    {
        Customer j = new Customer("Naim","Shahriar");
        j.Print();
    }

}

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

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

                 আমাদের এখানে , মূলত দুইটা ক্লাস ফিল্ড  _firstname ও _lastname ।
এখানে কন্সট্রাকটর 'টি মূলত দুইটা ক্লাস ফিল্ড  কে ইনিশিয়ালাইজ করার জন্য ব্যবহার করেছি । । এবার , আমরা   this.  ইউজ করে এক এক করে অব্জেক্ট ক্রিয়েট করবো , দুইটা ক্লাস ফিল্ড এর  জন্য দুইটা অবজেক্ট ।। এই জন্য , আমরা মেইন মেথোড-এ  Customer এর একটা ইন্সট্যান্স/অব্জেক্ট  ক্রিয়েট করলেই, এর কন্সট্রাক্টর অটোমেটিক কল হবে । । তাহলে , এই ক্লাস Field কিন্তু  ক্লাস এর ডেটা , আর আমরা যে  Print মেথড ক্রিয়েট করলাম এটা ক্লাস এর  Behaviour । ।

এখন আমরা , যখন মেইন মেথোড -এ Customer j = new Customer("Naim","Shahriar") ; Customer ক্লাসের অব্জেক্ট/ ইন্সট্যান্স ক্রিয়েট এর মাধ্যমে , Customer ক্লাসের কন্সট্রাক্টরকে কল করবো । । তখন , আমরা দুইটি প্যারামিটার পাস করেছি একটা  "Naim" ও আরেকটা  "Shahriar" ।। এর ফলে , Customer ক্লাস এর কন্সট্রাক্টর সেই প্যারামিটারকে নিয়ে  _firstname ও _lastname এর  অবজেক্ট এর  মাধ্যমে _firstname ও ._lastname তে অ্যাসাইন করে দেয় । যে কারণে , যদিও আমরা আগেই  string _firstname="Joy" ও string _lastname="Mollick" অ্যাসাইন করেছি , তারপরো । নতুন করে অ্যাসাইন করার কারণে - আমাকে শেষের'টা দেখাবে ।।

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

using System;
class Customer
{
    string _firstname="Joy";
    string _lastname="Mollick";
    public Customer()
        :this("Naim","Shahriar")
         {

         }
   public Customer(string FIRSTNAME, string LASTNAME)
    {
        this._firstname = FIRSTNAME;
        this._lastname = LASTNAME;
    }
    public void Print()
    {
        Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
        Console.ReadKey();
    }
    ~Customer()
    {

    }
}

class Program
{
    public static void Main()
    {
        Customer j = new Customer();
        j.Print();
    }

}


 চলো , আমরা একটা কোড দেখে আসি -----------------------------------------

using System;

class Customer
{
    string _firstname="Joy";
    string _lastname="Mollick";
    public Customer()
        :this("Naim","Shahriar")
         {

         }
   public Customer(string FIRSTNAME, string LASTNAME)
    {
        this._firstname = FIRSTNAME;
        this._lastname = LASTNAME;
    }
    public void Print()
    {
        Console.WriteLine("First Name :{0}, LastName : {1}", _firstname, _lastname);
       
    }
    ~Customer()
    {

    }
}

class Program
{
    public static void Main()
    {
        Customer j = new Customer();
        j.Print();
        Customer h = new Customer("Bill","Gates");
        h.Print();
        Console.ReadKey();
    }

}

এখানে , আমরা একটা  Customer ক্লাসের দুইটা কন্সট্রাক্টর ক্রিয়েট করলাম , তারপর মেইন মেথোড থেকে সেই দুইটা কন্সট্রাক্টর কল করলাম ,একটা কল করার পর -আরেকটা কল করলাম ,  এই ঘটনাকে  Overloading বলে ।। আশা করি বিষয়'টি নিয়ে কিছুটা হলেও ধারণা হয়েছে ।। তো , আজ তাহলে এইটুকুই -----------------












C# For Beginners , Part-18 (Namespace)

আজকে , আমরা -  namespace নিয়ে আলোচনা করবো , মোটামুটি একটু ডিটেইলস। ধরো , তুমি একটা প্রোজেক্ট হাতে নিয়েছো - সেই প্রোজেক্ট এর আন্ডারে মোট দুইটা টিম কাজ করছে । একটা টিম-A  &  আরেকটা  টিম- B। namespace এর সাহায্যে যদি , বিষয়গুলি একটু ইমপ্লিমেন্ট করার ট্রাই করি , তাহলে কি হয় ??? চলো , একটূ দেখে আসি -------

using System;

class Program
{
    public static void Main()
    {
        ProjectA.TeamA .classA.Print();
        ProjectA.TeamB .classA.Print();
    }
 
}

namespace ProjectA
{
    namespace TeamA
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamA project");
              
            }
        }
    }
}

namespace ProjectA
{
    namespace TeamB
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamB project");
                Console.ReadKey();
            }
        }
    }
}

 এখানে , আমরা  using ব্যবহার করে namespace ProjectA ডিক্লেয়ার না করেই , ডট অপারেটর দ্বারা , মেইন মেথোড -এ কাজ করেছি । কিন্তু , আমরা যখন অনেকগুলো namespace নিয়ে কাজ করবো --তখন এইভাবে  ProjectA.TeamA .classA.Print(); namespace এর নাম class এর নাম লিখে , কাজ করতে বেশ অসুবিধা হয় । । তাই , আমরা - using ব্যবহার করে namespace গুলো ডিক্লেয়ার করে কাজ করতে সুবিধা হবে । । চলো , নীচে এরকম একটা কোড দেখে আসি ------------------------


 using System;
using ProjectA.TeamA;

class Program
{
    public static void Main()
    {
        classA.Print();
        ProjectA.TeamB .classA.Print();
    }
 
}
namespace ProjectA
{
    namespace TeamA
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamA project");
              
            }
        }
    }
}
namespace ProjectA
{
    namespace TeamB
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamB project");
                Console.ReadKey();
            }
        }
    }
}

এখানে , আমরা - using ProjectA.TeamA; দিয়ে   ProjectA ও TeamA এর   namespace গুলো ডিক্লেয়ার করেছি বলেই , মেইন মেথোড এর ভেতরে শুধু  ক্লাস ও মেথড এর নাম ডট অপারেটর দিয়ে যুক্ত করলেই   classA.Print();   কাজ হয়ে যাচ্ছে , কিন্তু TeamB  এর জন্য এখনো  বানায়নি । । চলো , এবার আমরা  TeamB এর জন্যও ডিক্লেয়ার করে দেখি , কি হয় ???


using System;
using ProjectA.TeamA;
using ProjectA.TeamB;

class Program
{
    public static void Main()
    {
        classA.Print();
        classA.Print();
    }
 
}
namespace ProjectA
{
    namespace TeamA
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamA project");
               
            }
        }
    }
}




namespace ProjectA
{
    namespace TeamB
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamB project");
                Console.ReadKey();
            }
        }
    }
}

 এটা কিন্তু , রান করাতে পারবে না , কম্পাইল এরর । এটাকে , কম্পাইল করাতেই পারবে না কিন্তু । কারণ কি ?? ভাবো তো । । হুম , আমরা দুই টিম এর ক্ষেত্রেই একই নামের ক্লাস ব্যবহার করেছি , খেয়াল করে দেখো , classA ।।চলো , এইবার - আমরা তাহলে ক্লাস এর নাম পরিবর্তন করে দেখি , কাজ হয় নাকি ??? নিচে , কোড দেখে আসি চলো --------------


using System;
using ProjectA.TeamA;
using ProjectA.TeamB;

class Program
{
    public static void Main()
    {
        classA.Print();
        classB.Print();
    }
 
}
namespace ProjectA
{
    namespace TeamA
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamA project");
               
            }
        }
    }
}
namespace ProjectA
{
    namespace TeamB
    {
        class classB
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamB project");
                Console.ReadKey();
            }
        }
    }
}







হুম , এইবার কিন্তু - ঠিকই কাজ করবে । । কারণ , আমরা - ক্লাস এর নামগুলো চেইঞ্জ করে দিয়েছি । ।। আচ্ছা , আমরা যদি - একই ক্লাস ব্যবহার করেই এই কাজ করতে চাই , তাহলে কিন্তু -- আমাদের
নতুন একটা পদ্ধতি আছে , elias  ব্যবহার করে কাজ করা ।। elias এর আভিধানিক অর্থ হলো , উপনাম । । চলো , দেখি কিভাবে ?? ইউজ করা যায় ????

using System;
using JOY=ProjectA.TeamA;
using JONY=ProjectA.TeamB;

class Program
{
    public static void Main()
    {
        JOY.classA.Print();
        JONY.classA.Print();
    }

}
namespace ProjectA
{
    namespace TeamA
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamA project");

            }
        }
    }
}


namespace ProjectA
{
    namespace TeamB
    {
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamB project");
                Console.ReadKey();
            }
        }
    }
}


ProjectA.TeamA এর জন্য , আমরা eilas হিসেবে JOY ব্যবহার করেছি । । এবং ,  ProjectA.TeamB এর জন্য আমরা eilas হিসেবে JONY ব্যবহার করেছি।তারপর , এই উপনামগুলো ডট অপারেটর এর সাহায্য এ মেইন মেথড-এ ইউজ করেছি । । এখন কিন্তু , একই ক্লাস থাকা সত্তেও ঠিকঠাক ভাবে কাজ করছে ।  আসলে , আমি কি করলাম , ভেবেছো কি ???? আমি কিন্তু , কিছুটা তোমায় বোকা বানালাম ।

 কিভাবে ???? আসলে , আমরা একেবারে প্রথমে যে - ProjectA.TeamA .classA.Print();ও ProjectA.TeamB .classA.Print(); ইউজ করেছিলাম , এখানেও কিন্তু - সেই কাজই করলাম । শুধু , ProjectA.TeamA এর জায়গায় এর eilas হিসেবে JOY  ব্যবহার করে ও ProjectA.TeamB  এর জায়গায়
 এর eilas হিসেবে JONY  ব্যবহার করে  । ঘুরেফিরে , সেই প্রথমটার মতোই কাজ করে ।।   

এখন , আমরা এতক্ষণ কিন্তু -  namespace গুলোকে নেস্টেড ( Nested )  করে ব্যবহার করেছি যেমন ,
ProjectA , namespace এর ভেতরে আরেকটি namespace,  TeamB ব্যবহার করে । । কিন্তু , আমরা চাইলেও ডট অপারেটর এর মাধ্যমে ইউজ করতে পারতাম .। । যেমন ,

using System;
using JOY=ProjectA.TeamA;
using JONY=ProjectA.TeamB;

class Program
{
    public static void Main()
    {
        JOY.classA.Print();
        JONY.classA.Print();
    }

}
namespace ProjectA.TeamA
{
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamA project");

            }
        }
}


namespace ProjectA.TeamB
{
   
        class classA
        {
            public static void Print()
            {
                Console.WriteLine("This is TeamB project");
                Console.ReadKey();
            }
        }
}

যাই হোক , আশা করি -- namespace এর ব্যবহার নিয়ে আমাদের ধারণা আরো অনেক ক্লিয়ার হলো । ।
আজকে এইটুকুই , নিজে নিজে নতুন নতুন করে কোড করে রান করার ট্রাই করো । । আশা করি , আরো ভালো বুঝতে পারবে .।।











Monday, October 9, 2017

C# For Beginners , Part -17 ( Method Parameters )

আজকে আমরা , মেথডের বিভিন্ন ধরনের প্যারামিটার নিয়ে আলোচনা করবো । ।
একটা , মেথডের মোট ৪ ধরনের প্যারামিটার থাকতে পারে ------------

1)  Value Parameters
2)  Reference Parameters
3)  Out Parameters
4)  Parameters Arrays



                                                
                                                                Value Parameters

এটা আমাদের সবারই পরিচিত , আমরা নরমালি যে প্যারামিটার ইউজ করি , সেটাই ভ্যালু প্যারামিটার । যেমন , দেখে নেই ------------------------------------

using System;
    class Program
    {
        public static void Main()
        {
            int r=10;
            int t = twice(r);
            Console.WriteLine(r);
            Console.ReadKey();
        }
        public static int twice(int a)
        {
            a=20;
            return a;
        }
           
        }
   
   এখানে ,  আমরা নতুন মেথড ক্রিয়েট করে , তার ভেতরে গিয়ে   প্যারামিটার হিসেবে int a কে ডিক্লেয়ার করি । ফলে , মেমোরিতে  a  নামে আলাদা জায়গা স্টোর হয় , এবং অ্যাসাইন হয় 10 [  r=10] । যার ফলে , আমি a এর মান চেঞ্জ করে 20 করলেও - এতে r এর কিছু যায় আসে না । r এর মান যা আছে , তাই থাকে । কারণ , r এবং a  এর মেমোরি লোকেশন'টা পুরাটাই আলাদা ।


আচ্ছা , এখন যদি আমরা চাই - এই মেথডে  r এর মান  চেঞ্জ হবার সাথে সাথেই - যেনো ,মেইন মেথোডের  a  এর মান চেইঞ্জ হয়ে যায় । তাহলে , কি করতে হবে - আমাদের ?? এই জন্যই আমাদের  Reference Parameters ইউজ করতে হয় । চলো , দেখে আসি -------------



                                                          Reference Parameters

 চলো আগে কোড দেখে আসি ----------------------------------------------------------------------


 using System;
class Program
{
    public static void Main()
    {
        int r = 10;
        int t = twice(ref r);
        Console.WriteLine(r);
        Console.ReadKey();
    }
    public static int twice(ref int a)
    {

        a = 20;
        return a;
    }

}

এখানে , আমরা যদি প্যারা মিটার এর আগে --- শুধু  ref যোগ করে দেই , তাহলে যে ঘটনা টি ঘটে , তা হলো , int a ও int r আলাদা আলাদা কোনো মেমোরি locate  করে না , দুইটা ভ্যারিয়েবলই একই মেমোরি লোকেশন'কে পয়েন্ট করে | বলতে গেলেই , একই মেমোরি অ্যাড্রেস এর দুইটা নাম a ও r । যেকোনো , একটা ভ্যারিয়েবল এর মাধ্যমে ওই লোকেশন এর ভ্যালু চেইঞ্জ করতে পারি । এই ধরনের প্যারামিটার কে বলা হয় , Reference Parameters। কোড'টি এবার রান করে দেখো , তাহলে আগেরটি'র থেকে তফাত বুঝতে পারবে ।





                                                      Out Parameters


 আমরা , যদি কখনো - একই মেথড থেকে , একটার বেশি টার্ম রিটার্ন হিসেবে পেতে চাই , তাহলে কি করবো ???? কোড দেখে আসি -------------------------------------

using System;
class Program
{
    public static void Main()
    {
        int a = 10,b=20;
        int sum = 0;
        int product = 0;
        twice(a,b,out sum,out product);
        Console.WriteLine("SUM {0} , PRODUCT {1}", sum, product);
        Console.ReadKey();
    }
    public static  void twice( int a,int b,out int total,out int multiplication)
    {
        total = a + b;
        multiplication = a * b;
      
    }
}

এই ক্ষেত্রে , আমাদের  twice মেথডের ভেতরে কোনো , রিটার্ন ইউজ করি নি ও Out Parameters  ইউজ করেছি , সেই জন্য - আমাদের রিটার্ন টাইপ-এ আমরা void ইউজ করেছি  ।। প্রথমে , আমরা
int sum = 0; int product = 0; দুইটি ভ্যারিয়েবলকেই শূন্য তে ইনিশিয়ালাইজ করা সত্তেও , পরে আমরা
twice(a,b,out sum,out product); এর মাধ্যমে twice মেথডের অপারেশনের দ্বারা ,total &multiplication এর ভ্যালু  ক্যালকুলেশন করে  এর মান sum ও product এর সাথে অ্যাসাইন করে নেই । যা , আমাদের কনসল স্ক্রিনে আউটপুট দেখাচ্ছে  ।।



                                                           Parameters Arrays


                            চলো , আমরা আগে সিম্পল একটা কোড দেখে আসি

using System;
class Program
{
    public static void Main()
    {
        int[] numbers = new int[3];
        numbers[0] = 1;
        numbers[1] = 3;
        numbers[2] = 4;

        twice(numbers);

    }
    public static  void twice( params int[] numbers)

    {
        Console.WriteLine("There are {0} elements", numbers.Length);
         for(int i=0;i<numbers.Length ;i++)
         {
             Console.WriteLine(numbers[i]);
         }
         Console.ReadKey();
    }

}

অ্যারে'র ভ্যালু পাস করে অন্য মেথডে পাঠানোর সবচেয়ে ভালো , উপায় । খুব সহজেই ,  Parameters Arrays এর মাধ্যমে কাজটি করা যায় । । কোড'টি রান করে দেখো ---------------------------

এখানে , কিছু বিষয় আমাদের খেয়াল রাখতে হবে । আমরা কিন্তু , শুধু twice(numbers); দিয়ে শুধু numbers অ্যারের ভ্যালু'ই পাঠাতে পারবো তা নয় ,তুমি numbers অ্যারের সাইজের চেয়েও  বেশি সংখ্যক প্যারামিটার পাস করাতে পারবে  twice(1,2,3,4,5);  একবার ট্রাই করে দেখো ।।

আরেকটি বিষয় লক্ষ রাখতে হবে ,একাধিক প্যারামিটার ব্যবহার করার সময়    Parameters Arrays ইউজ করলে প্যারামিটার হিসেবে -সবসময় এটাকে শেষ প্যারামিটার হিসেবে রাখতে হবে , যেমন নিম্নরূপ লিখা যাবে না -------------

                        public static  void twice( params int[] numbers,int a);

                                                        এভাবে লিখতে হবে  ,
                         public static  void twice(int a, params int[] numbers);

 আরেকটি , বিষয় লক্ষ রাখতে হবে - একটি মেথডে , সরবোচ্চ একবার Parameters Arrays ইউজ করতে পারবে । ।  যাই হোক , এই নতুন নতুন সিন্ট্যাক্স গুলো রপ্ত করার জন্য - বার বার প্র্যাকটিসের
কোনো , বিকল্প নেই । তাই , শুধু পড়ে পড়ে নয় , নিজে নিজে লিখে ট্রাই করার টাই সমীচিন হবে বলে মনে করি । আজ এইটুকুই ------------------------------












      






















C# For Beginners , Part-16 ( Method )

           আমরা , আজকে মেথড নিয়ে টুকটাক কিছু বেসিক বিষয় জেনে নিবো ।।
চলো , মেথড বডি'র স্ট্রাকচার  নিয়ে কিছু কথা বলি ,

         [attributes]
      access_modifiers   return_type  valid_name(parameters)
        {
          body;
         }

আমরা , যেমন - সি তে একটা করে ফাংশন লিখতাম , ঠিক তেমনি - এখানেও , ঐভাবেই মেথডগুলো লিখতে হয় । প্রথমে , attributes নিয়ে এখনই কথা বলবো না , পরে এটা নিয়ে ডিটেইলস আলোচনা করা যাবে । । তারপর , আছে -  access_modifiers , মানে , এই মেথড'টা public  নাকি private , তারপর
return_type মানে , মেথড'টির রিটার্ন টাইপ  int নাকি string নাকি  double ।|  valid_name ,মানে মেথড'টির অবশ্যই একটা নাম থাকবে । (parameters) , মানে হলো , অন্য কোনো মেথড থেকে কি কি ভ্যালু নিয়ে কাজ করবে , সেটা । । চলো , এবার আগে নরমাল একটা কোড লিখ যাক -----------

using System;
    class Program
    {
        public static void Main()
        {
            int sum = Program.add(10, 20);
            Console.WriteLine(sum);
            Console.ReadKey();
        }
        public static int add(int a, int b)
        {
            return a + b;
        }
    }

এখানে , আমরা দুইটা মেথড নিয়ে কাজ করতেছি , একটি হলো , মেইন মেথড আরেকটি হলো  add নামে একটা মেথড ।। আমরা , দুই মেথডের ক্ষেত্রেই access_modifiers কে Public হিসেবে সেট করেছি , যেনো একে অপরকে access করতে পারে ।

এখন , ঘটনা হলো - মেথড দুই প্রকার , static - আরেকটা হলো , instance মেথড ।।এখানে , আমরা  static ব্যবহার করেছি । তো , তারপর --  return_type হিসেবে , দ্বিতীয়'টার ক্ষেত্রে int ইউজ করেছি ।
আর মেইন মেথড তো বরাবরই ভয়েড ।। যাই হোক , প্যারামিটারস হিসেবে (int a, int b) ইউজ করেছি । ।

এখন আমরা , যখন মেইন মেথড থেকে -  add মেথড কে কল করবো , তখন আমাদের - যেহেতু , add মেথড  Program নামক ক্লাসে অবস্থিত , তাই সেটা int sum = Program.add(10, 20); এর মাধ্যমে ক্লাস এর নাম'টা (Program ) ইমপ্লিমেন্ট করে দিতে হবে । । তাহলে , মেইন মেথড'টি add মেথড কে অ্যাকসেস করা  ,কল করা  ও প্যারামিটার পাঠাতে পারবে । ।  নিজে নিজে , অনুরুপ দুই একটা প্রোগ্রাম লিখে রান করাও , অনেক ক্লিয়ার হয়ে যাবে । তুমি কিন্তু শুধু , int sum = add(10, 20); লিখেও প্রোগ্রামটি রান করাতে পারতে - কিন্তু , যদি মেথড দুইটি একই ক্লাসের না হয় - তখন কিন্তু , তোমায় উপরের নিয়মেই ক্লাস নেম ইনক্লুড করে করতে হবে । । চলো , ভিন্ন ক্লাসের একটা উদাহরণ দেখে আসি ---

using System;
    class Program
    {
        public static void Main()
        {
            int sum = joy.add(10, 20);
            Console.WriteLine(sum);
            Console.ReadKey();
        }
           
        }
    class joy
    {
        public static int add(int a, int b)
        {
            return a + b;
        }
    }
    



এবার চলো , আমরা --- instance মেথড নিয়ে একটু কাজ করে আসি । । আগে একটা কোড দেখে আসি -------------------

using System;
    class Program
    {
        public static void Main()
        {
            joy r=new joy();
            int sum = r.add(10, 20);
            Console.WriteLine(sum);
            Console.ReadKey();
        }
           
        }
    class joy
    {
        public  int add(int a, int b)
        {
            return a + b;
        }
    }
     

এখানে , কি পার্থক্য আছে ??? বলো তো ?? joy ক্লাসের অন্তর্ভুক্ত add মেথড'টা তে static কিওয়ারড নেই  কিন্তু ।। অর্থাৎ , এটা একটা  instance মেথড  ।। এই জন্যই , আমরা joy r=new joy(); এর মাধ্যমে একটা ইন্সট্যান্স/অব্জেক্ট  ক্রিয়েট করে কাজ করেছি । । একটা জিনিস ক্লিয়ার হয়ে নাও ,  joy r এর মাধ্যমে আমরা একটা জাস্ট ( রেফারেন্স ) ভ্যারিয়েবল ক্রিয়েট করলাম ।।  তারপর , new joy() এর মাধ্যমে আমরা -
joy ক্লাস এর একটা অবজেক্ট ক্রিয়েট করলাম , হিপ মেমোরিতে [ হিপ মেমোরি নিয়ে আপাতত কিছু না জানলেও চলবে , শুধু এইটুকু জেনে নাও  ]  তারপর , সেই অব্জেক্ট এর অ্যাড্রেস'টা আমরা r  ভ্যারিয়েবলে রাখলাম  , ব্যাস , পরে এটা নিয়ে ডিটেইলস-এ আলোচনা হবে    ।।


 যাই হোক , ভালো করে কোড রান করে দেখো ,এরকম আরো কোড লিখে রান করাও , তাহলে আরো ক্লিয়ার হবে ।।  তাহলে , আজকে এইটুকুই ----


















     

C# For Beginners , Part -15 (While & do while loop )

আজকে , আমরা  while Loop ও  do while loop  নিয়ে কথা বলবো ।। এটা  ঠিক কিভাবে ,কাজ করে   ??  চলো , নীচে
একটা খুবই সিম্পল কোড দেখে আসি ।।

using System;
    class Program
    {
        static void Main()
        {         
            int a = int.Parse(Console.ReadLine());
            int b = 0;
      // Checking Conditions b is equal or less than a
            while(b<=a)
            {
                Console.WriteLine(b);
                b = b + 2;
            }
            Console.ReadKey();
        }
           
        }
     
চলো , প্রতিটি লাইন ধরে ধরে বুঝার ট্রাই করি । প্রথমে , আমরা - ইউসার থেকে , ইনপুট নিবো , তারপর , একটি ইন্টিজার ভ্যারিয়েবল  b ডিক্লেয়ার করবো , এবং এর মান 0 তে ইনিশিয়ালাইজ করবো ।। তারপর ,  while লুপ ইউস করবো ।। প্রথমেই , আমরা কন্ডিশন চেক করবো , কন্ডিশন'টা  b<=a
মূলত , একটা বুলিয়ান এক্সপ্রেশন , যদি এটা সত্য হয় , তাহলে - লুপ এর ভেতরের কোড এক্সিকিউট করবে , আর না হয় -- করবে না ।। প্রতিবার b = b + 2; এর সাহায্যে , b এর মান ২ করে বাড়ার পর - ,লুপটি কন্ডিশন চেক করবে , যদি সত্য হয় - তাহলে প্রিন্ট করবে , অন্যথায় নয় ।।

 এবার চলো , আমরা - do while loop নিয়ে কথা বলবো ।। তো , আমরা একটা কোড দেখে আসি , চলো ---------------------

using System;
    class Program
    {
        static void Main()
        {
          
            int a = int.Parse(Console.ReadLine());
            int b = 0;
            do
            {
                Console.WriteLine(b);
                b = b + 2;
            } while (b <= a) ;
            Console.ReadKey();
        }
        }
     

একই , প্রোগ্রাম  - আমি  do while loop ইউস করে করলাম । রান করে , দেখো - কি হয় ??? হুম , সেই আগেরটার মতোই আউটপুট পাবা ।। এখানে , তফাত কিছুই নেই - শুধু বলার মতো , একটা তফাতই আছে ।। while Loop এর ক্ষেত্রে , আমাদের আগে কন্ডিশন চেক করা হতো , তারপর - ভেতরের কোড এক্সিকিউট হতো , কিন্তু - এখানে , কিন্তু একটু আলাদা , ব্যাপার'টা । এখানে , কন্ডিশন পরে চেক করা হয় ।।

এই কারনেই , ডু - হোয়াইল লুপ এর ক্ষেত্রে , ভেতরের কোড কমপক্ষে একবার রান হবেই , কারণ - কন্ডিশন পরে চেক করা হয় । কিন্তু , শুধু  হোয়াইল লুপ এর ক্ষেত্রে যদি - কন্ডিশন ভুল হয় , তাহলে - সেটা একবারও রান হবে না । যেমন , একটা কোড দেখে আসি - চলো ,

using System;
    class Program
    {
        static void Main()
        {
          
           
            int b = 0;
            do
            {
                Console.WriteLine(b);
                b = b + 2;
            } while (b < 0) ;
            Console.ReadKey();
        }      
        }
     
এখানে ,  (b < 0) শর্তের মধ্যেই ,দেয়া আছে -- যদি b এর মান শূন্য এর চেয়ে কম হয় , তাহলে শুধু লুপ কন্টিনিউ হবে , তাছাড়া নয় , কিন্তু আমাদের b এর মান  কিন্তু শূন্য  তে ইনিশিয়ালাইজ করা আছে , এর মানে , এই লুপ কন্টিনিউ হবার কথা নয় । কিন্তু , রান করিয়েই দেখো -- একবার হলেও আউটপুট পাবে । কারণ কি ??? কারন - এটাই , do while loop প্রথমে কোড রান করাবে , তারপর কন্ডিশন চেক করাবে , তাই কন্ডিশন মিথ্যা হলেও , অন্তত - একবার রান হবেই , এই লুপ ।

আশা করি , বিষয়টি কিছুটা ক্লিয়ার হয়েছে । যাই হোক , আজ এইটুকুই থাক । আবার , পরের পর্বে অন্যকিছু নিয়ে কথা বলবো । । 












C# For Beginners, Part-14 ( Go To Statement)

আজকে , আমরা সুইচ কেইস এর গো টো স্টেইট্মেন্ট নিয়ে কথা বলবো । খুবই সহজ করে , একটা কোড এর মাধ্যমেই সব বুঝে ফেলবো , চলো -------- নীচের কোড দেখে আসি ,

using System;

    class Program
    {
        static void Main()
        {
            start:
            int a = int.Parse(Console.ReadLine());

           switch(a)
           {
               case 10:
                   Console.WriteLine("Number Is equal to ten");
                   break;
               case 30:
                   Console.WriteLine("Number Is equal to thirteen");
                   break;
               case 40:
                   Console.WriteLine("Number Is equal to fourty");
                   break;
               case 50:
                   Console.WriteLine("The NUmber Is Equal To fifteen");
                   break;
           }
           Console.WriteLine("Would U Like To Start This Process??");
           string s = Console.ReadLine();
           switch(s)
           {
               case "Yes":
                   goto start;
                  
               case "No":
                   break;
           }
            Console.ReadKey();
        }     
        }
     
 চলো , এখানে কি হচ্ছে ?? একটু বোঝার ট্রাই করি । । একটি , ইন্টিজার ইউসার থেকে নিয়ে সেটাকে চেক করাবে , যদি -- সেটা ১০/৩০/৪০/৫০ এর সমান হয় , তাহলে তোমায় জানিয়ে দিবে , তারপর কেইস থেকে বের হয়ে আসবে , তোমায় কনসল স্ক্রিনে , একটা জিনিস দেখাবে -Would U Like To Start This Process?? , তারপর - string s = Console.ReadLine(); এর সাহয্যে কনসল স্ক্রিন থেকে ইউসার ইনপুট নিবে , তুমি যদি লিখো -  No , তাহলে আর কিছু হবে না , break; স্টেইট্মেন্ট এর মাধ্যমে বের হয়ে আসবে ।। কিন্তু , তুমি যদি  Yes লিখো , তাহলে   goto start ;  স্টেইট্মেন্ট এর মাধ্যমে , যেখানে - start  লিখা আছে , সেখান থেকে সম্পূর্ণ প্রোগ্রাম আবার রিপিট হবে ।।

আশা করি ,  goto স্টেইট্মেন্ট নিয়ে ধারণা ক্লিয়ার হলো । এটা আসলে কিভাবে কাজ করে ? সেটা নিয়েও , আস্তে আস্তে বেসিক ক্লিয়ার হয়ে যাবে , আরো কয়েকটি অনুরুপ কোড লিখে রান করালেই , বিষয়টি আরো পরিষ্কার হয়ে যাবে ।

goto স্টেইট্মেন্ট ইউস করে , হয়তো - ভালোই লাগছে , তোমাদের । ইচ্ছেমতো , কোড এর যেকোনো
অংশ থেকে রিপিট করতে পারছো । কিন্তু , একটা কথা সবস্ময় মাথায় রাখা উচিত ,এই goto স্টেইট্মেন্ট ইউস করা কে , খুবই  bad programming style  হিসেবে , ধরা হয় । তাই , এটা ব্যবহার করতে - আমি তোমাকে নিরুতসাহিত করবো , কিন্তু কিভাবে এটা ইউস করতে হয় ? সেটা তোমাদের জেনে রাখা উচিত ।।

যাই হোক , আজ এইটুকুই , নেক্সট পর্বে আমরা  while লুপ নিয়ে আলোচনা করবো ।।



Sunday, October 8, 2017

C# For Beginners ,Part -13 ( Switch Statement)

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

using System;

    class Program
    {
        static void Main()
        {
            int a = int.Parse(Console.ReadLine());

           if(a==10)
           {
               Console.WriteLine("a is equal to ten");
           }
           else if(a==14)
           {
               Console.WriteLine("a is equal to 14");
           }
           else if(a==20)
           {
               Console.WriteLine("a is equal to 20");
           }
           else
           {
               Console.WriteLine("Nothing Mathced");
           }

            Console.ReadKey();
        }
     
    }


 এখন এই কোড'কে যদি সুইচ স্টেইট্মেন্ট এর মাধ্যমে লিখতে চাই , তাহলে কি হতে পারে ???? চলো , দেখে ফেলি ---------

using System;
    class Program
    {
        static void Main()
        {
            int a = int.Parse(Console.ReadLine());
            switch (a) {
                case 10:
               Console.WriteLine("a is equal to ten");
                    break;
          
                case 14:
               Console.WriteLine("a is equal to 14");
               break;
          
                case 20:
               Console.WriteLine("a is equal to 20");
               break;

                default:
               Console.WriteLine("Nothing Mathced");
                    break;
           }
            Console.ReadKey();
        }           
        }


      কোড'টি রান করাও , এবং বুঝার ট্রাই করো - নিজে নিজে ।। নিজে নিজে , বানিয়ে বানিয়ে লিখে স্যিন্ট্যাক্স'টি রপ্ত করার ট্রাই করো ।। উপরের কোড'টি পুরোটা ক্লিয়ার হবার পর আমরা , নীচের অংশটুকু নিয়ে আলোচনা করবো । আগে , পুরোটা ক্লিয়ার করে নিয়ে , নীচের টুকু পড়ার ট্রাই করি --

ধরো , ইফ এর ভেতরে অনেক কন্ডিশন আছে , তাহলে সেটা কিভাবে সুইচ স্টেইট্মেন্ট-এ প্রকাশ করাবো ???? ধরো , ইফ এলস স্টেইটমেন্ট ইউস করে আরো একটা কোড লিখে ফেলি -----



using System;

    class Program
    {
        static void Main()
        {
            int a = int.Parse(Console.ReadLine());

             if(a==10 || a==14 || a==20)
             {
                 Console.WriteLine("The number is equal to 10 or 14 or");
             }
             else
             {
                 Console.WriteLine("Nothing Mathced");
             }
            Console.ReadKey();
        }

           
        }

    
এইবার আমরা , সুইচ স্টেইট্মেন্ট দিয়ে কিভাবে করবো ?? চলো দেখে নেই  নীচে -----------


using System;

    class Program
    {
        static void Main()
        {
            int a = int.Parse(Console.ReadLine());

            switch (a) {

                case 14:
                case 10:
                case 20:
               Console.WriteLine("a is equal to 14 or 10 or 20");
                    break;
                      

                default:
               Console.WriteLine("Nothing Mathced");
                    break;
           }
            Console.ReadKey();
        }

           
        }
    
 
আশা করি , বিষয়টা অনেকটাই ক্লিয়ার হয়ে গেছে । নিজে নিজে , আরো কিছু কোড লিখে রান করবার ট্রাই করো , তাহলে -- আরো পরিষ্কার হবে । আজ এইটুকুই -------------




 





C# For Beginners , Part -12 ( if -else statement )

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

using System;
    class Program
    {
        static void Main()
        {
            int a = int.Parse(Console.ReadLine());

            // Checking The Number Is Greater Than 10 or Not
            if(a>10)
            {
                Console.WriteLine(" The Number Is Greater Than Ten ");
            }
                // If The First Condition is not satisfied
            else
            {
                Console.WriteLine("The number is equal or less than ten");
            }
           

            Console.ReadKey();
        }
     
    }


কমেন্টস লাইন ব্যবহার করেছি , বোঝার সুবিধারথে । আশা করি , সবাই বিষয়টি বুঝতে পারবে ।।


এখন আমরা দুইটা গুরুত্বপূর্ণ জিনিস নিয়ে কথা বলবো , একটা হলো --- "&&" এবং আরেকটা হলো  "।।" 

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

using System;
    class Program
    {
        static void Main()
        {


    // Taking Integer Input From User Input 

            int a = int.Parse(Console.ReadLine());

            // Checking The Number Is Greater 10 & Equal To 12  


            if(a>10 && a==12)
            {
                Console.WriteLine(" The Number Is Greater Than Ten & Equal To 12 ");
            }


                // If The First Condition is not satisfied
            else
            {
                Console.WriteLine("The number is equal or less than ten");
            }
           

            Console.ReadKey();
        }
     
    }



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


using System;
    class Program
    {
        static void Main()
        {


              // Taking Integer Input From User Input 

             int a = int.Parse(Console.ReadLine());

            // Checking The Number Is Greater Than 10 or Equal To 12 
            if(a>10 || a==12)
            {
                Console.WriteLine(" The Number Is Greater Than Ten or Equal To 12 ");
            }
                // If The First Condition is not satisfied
            else
            {
                Console.WriteLine("The number is equal or less than ten");
            }
                       Console.ReadKey();
        }
     
    }



এখন ঘটনা হলো , যে -- তুমি যদি , সবগুলো  &&  এবং  ।।  এর যায়গায় ,  &  এবং  ।     একটা করে ইউস করো , তাহলে কি ঘটে ???? চলো , দেখে আসি ।।

    
using System;
    class Program
    {
        static void Main()
        {


    // Taking Integer Input From User Input 

            int a = int.Parse(Console.ReadLine());

            // Checking The Number Is Greater 10 & Equal To 12  


            if(a>10 & a==12)
            {
                Console.WriteLine(" The Number Is Greater Than Ten & Equal To 12 ");
            }


                // If The First Condition is not satisfied
            else
            {
                Console.WriteLine("The number is equal or less than ten");
            }
           

            Console.ReadKey();
        }
     
    }


                                                              " দ্বিতীয়টা"

using System;
    class Program
    {
        static void Main()
        {


              // Taking Integer Input From User Input 

             int a = int.Parse(Console.ReadLine());

            // Checking The Number Is Greater Than 10 or Equal To 12 
            if(a>10 | a==12)
            {
                Console.WriteLine(" The Number Is Greater Than Ten or Equal To 12 ");
            }
                // If The First Condition is not satisfied
            else
            {
                Console.WriteLine("The number is equal or less than ten");
            }
                       Console.ReadKey();
        }
     
    }



 এই দুই কোড রান করে দেখো , আশা করি কোনো পার্থক্য পাবে না ।। কারণ , && এবং & এর মধ্যে কোনো পার্থক্য নেই , ঠিক তেমনিভাবেই  ।।  এবং  ।  এর মাঝেও কোনো তফাত নেই , কিন্তু - বাহ্যিকগত দিক থেকে তফাত না থাকলেও , কাজ এর দিক থেকে তফাত রয়েছে ।

ধরো ,  & দিয়ে কয়েকটি কন্ডিশন দেয়া আছে , তাহলে স্বাভাবিকভাবেই , যদি একটি কন্ডিশনও ভুল হয় , তাহলেও আর কোনো কন্ডিশন চেক করবার কথা নয় , কিন্তু - এ ক্ষেত্রে তা হয় না , কোনো কন্ডিশন ভুল হোক বা না হোক , এটা সবগুলো কন্ডিশন চেক করবেই ।।

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

তো বুঝাই , যাচ্ছে --  && এবং ।।  এর থেকে , & এবং ।  বেশি কাজ করে থাকে ।। তাই , আমরা প্রথম দুইটি সবসময় ব্যবহার করবার ট্রাই করবো ।।আশা করি , নিজে নিজে আরো চিন্তা করলে , আরো ক্লিয়ার হবে , আজ এইটুকুই --------------









C# For Beginners, Part - 11 ( Comments Line )

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

কমেন্টস লাইন তিন ধরণের -------------------------

                                         1) Single Line Comments

                                          2) MultiLine Comments

                                          3) XML Documentation Comments

                 

                                            1) Single Line Comments

একটি সহজ উদাহরণ লিখলেই বুঝা যাবে যে - আমরা কি করতে চাচ্ছি ?? চলো , সহজ একটা কোড দেখে আসি ---------------------

  using System;
    class Program
    {
        static void Main()
        {
            int a = 9;

            //Doing Power Function
            double b = Math.Pow(a, 0.5);

            Console.WriteLine(b);

            Console.ReadKey();
        }
    }

এখানে ,  //Doing Power Function লিখাটুকু হলো , সিংগেল কমেন্ট লাইন ।। আমাদের শি শার্প  কম্পাইলার  এই কমেন্টস লাইন কখনো , রিড করবে না -- ইগনোর করে যাবে , তাই - এখানে যাই লিখা হোক না কেনো , সেটার সাথে প্রোগ্রামের এক্সিকিউশনের কোনো সম্পর্ক নেই ।।




                                                   2) MultiLine Comments

এখন , তুমি যদি -- কয়েকলাইনের কমেন্টস লাইন লিখতে চাও , তাহলে , তোমায়  * এবং /  এই দুটি চিহ্ন ব্যবহার করে নীচের মতো করে করতে হবে ।।নীচের এই সিম্পল কোড দেখে নাও ---

using System;
class Program
    {
        static void Main()
        {
            int a = 9;

            /*Doing Power Function
              and delivers the value to a double variable
            */
            double b = Math.Pow(a, 0.5);

            Console.WriteLine(b);

            Console.ReadKey();
        }
    }




                                         3) XML Documentation Comments


এই কমেন্টস লাইন'টা খুবই সুন্দর এবং মজার ।। একবার ট্রাই করলেই , বিষয়টা খুবই ক্লিয়ার হয়ে যাবে , তোমাদের কাছে  । চলো , সিম্পল একটা কোড দেখে আসি ----------

using System;
   class Program
    {
        static void Main()
        {
            int a = 9;

            /*Doing Power Function
              and delivers the value to a double variable
            */
            double b = Math.Pow(a, 0.5);

            Console.WriteLine(b);
            joy();

            Console.ReadKey();
        }
        /// <summary>
        /// It's Just Print The Name "Joy" , It has nothing To Do
        /// </summary>
         public void joy()
         {
             Console.WriteLine("Joy");
         }
    }



এখানে , আমরা নতুন একটা ফাংশন এর ক্রিয়েট করেছি ।। যে ফাংশন'টি শুধু মাত্র , একটি শব্দ প্রিন্ট করে , এছাড়া আর কোনো ফিয়েচার আমি যুক্ত করি নি , এখন একটা জিইস তুমি খেয়াল করো যে --
তুমি , তোমার মাউস'টির তীর চিহ্ন মেইন মেথোড এর ভেতরে লিখা  joy(); এর কাছে ধরো , তাহলে তোমার স্ক্রিনে               /// <summary>
                           /// It's Just Print The Name "Joy" , It has nothing To Do
                                                /// </summary>


 <summary> এর ভেতরে থাকা কমেন্টসগুলো প্রিন্ট করছে , এর মানে তুমি যতোগুলো ফাংশন ক্রিয়েট করবে , তার সাথে - এইভাবে কমেন্টস লিখতে পারো , কোন ফাংশনের কি কাজ ?? তাহলে , শুধু ওই ফাংশন যেখানেই কল করা হবে , সেখানেই মাউসের সাহায্যে তুমি দেখতে পারবে , সেই ফাংশনের সামারি'তে কি লিখা আছে ??? তুমি , তোমার ইচ্ছেমতো সামারি লিখতে পারো , সমস্যা নেই । যাই হোক , কমেন্টস লাইন নিয়ে অনেক বিষয় ক্লিয়ার হলো , আজ এইটুকুই -----------








Saturday, October 7, 2017

C# For Beginners, Part - 10 ( Array )

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

using System;
    class Program
    {
        static void Main()
        {
            int[] evennumbers = new int[4];
            evennumbers[0]=2;
            evennumbers[1]=4;
            evennumbers[2]=6;
            evennumbers[3] = 8;
            Console.WriteLine(evennumbers[2]);
            Console.ReadKey();
        }
    }

আমরা , কয়েকটি জোড় সংখ্যার জন্য অ্যারে বানিয়েছি ।। অ্যারে'র একটি বড়ো , অসুবিধা হলো -- এটা একবার ইনিশিয়ালাইজ করা হয়ে গেলে , একে আর বাড়ানো যায় না ।।

 আমরা যেমন , ভেক্টর ইউজ করি, ডেকিউই ,লিস্ট, লিংকড লিস্ট-এ ডিক্লেয়ার করার পরো ডাইনামিক্যালি  মেমোরি অ্যালোকেট করতে পারে , এখানে কিন্তু - তা নয় ।।অ্যারে একটা কনটিগিউওয়াস মেমোরি এলোকেশন এর সমষ্টি ।

যেমন , তুমি যদি লেখো -- int[] evennumbers = new int[4]; তাহলে , এর দ্বারা মেমোরিতে evennumbers নামে , মেমোরিতে মোট চার'টা একক জায়গা ধরে রাখে , যে জায়গাগুলো হয় একদম পাশাপাশি , এই কারণেই  evennumbers[2] লিখলেই , মেমোরি বুঝে নেয় , evennumbers নামে যে জায়গা শুরু হয়েছে , তার থেকে  ঠিক ২ ঘড় পরের অ্যাড্রেস-এর মান কে বুঝানো হচ্ছে ।।
যাই হোক , এ বিষয় সামনে আরো ক্লিয়ার হয়ে যাবে । ।

 আচ্ছা , আমরা যদি -- evennumbersঅ্যারের কোনো মান , অ্যাসাইন না করতাম , তাহলে কি হতো ??? চলো , রান করেই দেখি কি হতো ?????

using System;
    class Program
    {
        static void Main()
        {
            int[] evennumbers = new int[4];  
            Console.WriteLine(evennumbers[2]);
            Console.ReadKey();
        }
    }

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
















C# For Beginners ,Part -9 ( Conversion )

          আজকে , আমরা বিভিন্ন কনভার্সন নিয়ে কথা বলবো ।।

আমাদের কনভার্সন , দুই ধরনের -------------------
                                                    ১)Implicit Conversion
                                                    2)Explicit Conversion
 

আমরা , যখন একটা ইন্টিজার ভ্যালুকে ডাবল/ ফ্লোট -এ কনভার্ট করতে যাবো , তখন কিন্তু , আমাদের টাইপ কাস্টিং করার কোনো প্রয়োজন নেই ।  কারণ , ডাবল / ফ্লোট ইন্টিজারের চেয়ে বড়ো ডেটাটাইপ , তাই ডেটা ও এক্সসেপশন লস হবার কোনো রিস্ক নেই , ( ( ডাবল / ফ্লোট  ইন্টিজার ডেটাটাইপ থেকে বেশী ডেটা হোল্ড করতে পারে )) - তাই আমাদের ইন্টিজার থেকে কখনো
ডাবল / ফ্লোট -এ কনভার্ট করতে গেলে আলাদা করে কাস্টিং করতে হয় না । । নীচে কোড দেখে নেই

using System;
    class Program
    {
        static void Main()
        {

            int a = 19;
            double b = a;
            Console.WriteLine(b);
            Console.ReadKey();
        }
    }

আমরা ,   double b =(int) a;  এইভাবেও লিখতে পারতাম , এবং কোনো প্রকার ভুলও হতো না । কিন্তু , আমাদের ঐভাবে লিখার কোনো দরকারই নেই , কম্পাইলার অটোমেটিক কনভার্সন করে নেয় ।।


                                                    Explicit Conversion


এখন আমরা যখন , ঠিক এরই উলটা কাজটা করে থাকি , মানে ---   ডাবল থেকে ইন্টিজার ডেটাটাইপ  কনভার্ট করতে যাই , তখন কিন্তু , আমাদের - টাইপ কাস্টিং করতে হবে , না হলে হবে না । কারণ , ডাবল , ফ্লোট এর চেয়েও বড়ো ডেটাটাইপ , তাই - এর সব ডেটা ও এক্সসেপশন ইন্টিজার হোল্ড করতে পারবে না , লস হয়ে যাবে - তাই , এখানে , আমাদের কাস্টিং করতে হয় ।। যেমন, একটা দশমিক  নাম্বার 2.65465 , এর দশমিক এর পরের ফ্র্যাকশনাল ভ্যালু'গুলো কখনোই ইন্টিজার হোল্ড করতে পারবে না , সো -- ডেটা লস হয়ে যাবে .। চলো , আমরা একটা উদাহরণ দেখে আসি -------

using System;
    class Program
    {
        static void Main()
        {

            double a = 19.47;
            int b = (int)a;
            Console.WriteLine(b);
            Console.ReadKey();
        }
    }

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

using System;
    class Program
    {
        static void Main()
        {

            double a = 19.47;
            int b = Convert.ToInt16(a);
            Console.WriteLine(b);
            Console.ReadKey();
        }
    }


 এখন আমরা স্ট্রিং থেকে , কনভার্ট করা নিয়ে আলোচনা করবো , ধরো - তোমায় একটা নাম্বার দেয়া আছে , স্ট্রিং আকারে । তাহলে , ইন্টিজার-এ কনভার্ট করবে কিভাবে ???? নীচের কোড দেখো --

using System;
   class Program
    {
        static void Main()
        {

            string a = "123";
            int x = int.Parse(a);
            Console.WriteLine(x);
            Console.ReadKey();
        }
    }

এখানে আমরা ,  Parse Method ইউস করেছি , যার রিটার্ন টাইপ ইন্টিজার ।। এখানে , আমরা
int x = Convert.ToInt16(a); ইউস করতে পারতাম , সমস্যা হতো না - কিন্তু টাইপ কাস্টিং ইউস করতে পারবো না ।। কিন্তু , যদি স্ট্রিং'টি ক্যারেক্টার ও ডিজিটের মিশ্রণে থাকে - তাহলে , কি হবে ??? তখন কিন্তু আমাদের  Parse Method কাজ করবে না ।। আমাদের তখন , ট্রাই পারস ইউজ করতে হবে । চলো দেখে নেই ------------------------

using System;
    class Program
    {
        static void Main()
        {

            string a = "123T";
            int x = 0;

            bool possible = int.TryParse(a,out x);

            if(possible==true)
            {
                Console.WriteLine("Possible & Value is {0}", x);
            }
            else
            {
                Console.WriteLine("Impossible");
            }
          
            Console.ReadKey();
        }
    }

TryParse মেথড এর রিটার্ন টাইপ কিন্তু বুলিয়ান, সেটা আমাদের মনে রাখতে হবে ।।তো , এখানে এই মেথড , প্রথমে -- string a কে ইন্টিজারে কনভার্ট করার ট্রাই করবে , যদি না হয় , তাহলে false  রিটার্ন টাইপ , আর যদি সম্ভব হয় - তাহলে সেটা x এর সাথে অ্যাসাইন করে দিবে ।।  তো , এইরকম নিজে নিজে কোড লিখে রান করো , তাহলে - বিষয়গুলি আরো ক্লিয়ার হবে । আজ এইটুকুই ---------------



















C# For Beginners , Part - 8 ( Nullable Types )

                 আজকে আমরা  Nullable Types নিয়ে কথা বলবো ।।

সাধারণভাবে , নাল বলতে আমরা কি বুঝি ??? অনেকেই বুঝি , নাল বলতে বুঝি - শূন্য বুঝায় , বাট আসলে ব্যপার'টা কিন্তু তা নয় ।। ধরো , তোমায় একটা ফর্ম পুরণ করতে দিলো , সেখানে - একটা অপশন আছে ,  Are U Married ??  , দুইটি অপশন আছে - "Yes" & "No" | এখন , ধরো - তুমি কোনোটাতেই টিক দিলে না , তাহলে -- ব্যপারটা কি ঘটলো ??? এর মানে কিন্তু , দাড়ালো -- "Null"
এর মানে , সেই বিষয়ে - তোমার কোনো মতামত নেই  ।। এই ঘটনাই -- প্রোগ্রামের মাধ্যমে লিখে ফেলি , চলো ------------------

একটা জিনিস মাথায় রাখা উচিত , সেটা হলো - bool কিন্তু , নন নাল-এবল , বাট একটা  ?  চিহ্ন যোগ করেই , আমরা এটাকে নালেবল টাইপ করতে পারি -------

using System;
 class Program
    {
        static void Main()
        {
            bool? joy = null;
            if(joy==true)
            {
                Console.WriteLine("You are Married");
            }
            else if(joy==false)
            {
                Console.WriteLine("You Are Not Married");
            }
            else
            {
                Console.WriteLine("Not Filled By You");
            }

            Console.ReadKey();
           
        }
    }

আশা করি , নালএবল টাইপ নিয়ে ধারণা ভালোই হলো ।। এখন , আমরা  আরেকটি বিষয় নিয়ে জানার
চেষ্টা করবো ----------------সেটা হলো ,  Null Coalescing Operator (?? )

 

চলো , একটা কোড দেখে আসি আগে ---

using System;
    class Program
    {
        static void Main()
        {
            int? ticketsremaining = null;
            int availabletickets;
            if(ticketsremaining==null)
            {
                 availabletickets = 0;
            }
            else
            {
                 availabletickets = (int)ticketsremaining;
            }
            Console.WriteLine("Available Tickets = {0} ", availabletickets);
            Console.ReadKey();
        }
    }

 এখানে , আমরা  int কে নালএবল টাইপ - এ কনভার্ট করতে ,  ?  চিহ্ন ইউস করেছি ।। আরেকটি জিনিস , আমাদের বুঝতে হবে , নন -নালএবল    কে   নালএবল-এ  কনভার্ট করতে কিন্তু ,

availabletickets = (int)ticketsremaining;  কাস্টিং করেছি ।। এখন , কোড'টা দুই একবার রান করে / পড়ে বোঝার চেষ্টা করো , আমি কি বুঝাতে চেয়েছি ??? এখন নীচের কোড'টি দেখো ---------------


using System;
namespace ConsoleApplicationnew1
{
    class Program
    {
        static void Main()
        {
            int? ticketsremaining = null;
            int availabletickets = ticketsremaining??0;
          
            Console.WriteLine("Available Tickets = {0} ", availabletickets);
            Console.ReadKey();
        }
    }
}

এই কোডের আগেরটা রান করলেও , যা আউটপুট আসবে , এটা রান করালেও - একই আউটপুট আসবে ।। কিন্তু , আমাদের if - else স্টেইট্মেন্ট কষ্ট করে ইউস করতে হলো না । শুধুমাত্র -
int availabletickets = ticketsremaining??0; এই লাইনেই  Null Coalescing Operator (?? ) ব্যবহার করে সবকিছু , এক নিমিষেই করে ফেললাম ।। কিছুটা , টারনারি অপারেটর এর মতো ।

এই লাইনে , যা হচ্ছে - তা হলো , ticketsremaining যদি নাল হয়ে থাকে , তাহলে - ?? এর পরের মান'টা
availabletickets এর সাথে , অ্যাসাইন হবে - অন্যথায় , ticketsremaining এর মান যা আছে , তাই -- availabletickets এর সাথে , অ্যাসাইন হবে । এখানে , টাইপকাস্টিং করার কোনো দরকার হবে না ।।

আশা করি ,  Nullable Types ও  Null Coalescing Operator (?? ) নিয়ে বেসিক ধারণা কিছুটা ক্লিয়ার হয়েছে ।। আজ এইটুকুই ----------------------


Friday, October 6, 2017

C# For Beginners , Part-7 ( Operators )

                  আমরা এই পর্বে কিছু নরমাল অপারেটর নিয়ে কথা বলবো ।

                                          Assignment Operator            =

                                          Arithmetic Operator        * ,  /  ,  -  ,  + ,  %

                                          Comparison Operator    == , != , > , < , >= , <=

                                          Conditional Operator     ||  , &&

                                          Ternary Operator           ?:

আমরা , এই পর্বে --  Ternary Operator   নিয়ে হালকা কিছু কথা বলবো , কারণ ধরেই নিলাম যে -- বাকিগুলো নিয়ে মোটামুটি একটা ধারণা আছে , সবার ।। নীচে একটা কোড লিখি , সেটা খেয়াল করো --

                                    using System;
    class Program
    {
        static void Main()
        {

            int a = 10;
            bool joy;
            if(a==12)
            {
                joy = false;
                Console.WriteLine("Number==12 is {0} ",joy);
            }
            else
            {
                joy = true;
                Console.WriteLine("Number!=12 is {0} ", joy);
            }
            Console.ReadKey();

        }
    }

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

   using System;
    class Program
    {
        static void Main()
        {

            int a = 10;
            bool joy =(a==12)?true:false;
            Console.WriteLine(joy);
            Console.ReadKey();
        }
    }

এখানে , bool joy =(a==12)?true:false; তে - প্রথমে a==12 কন্ডিশন সত্যি কি না ?? সেটা চেক হবে , যদি এই কন্ডিশন সত্যি হয় -- তাহলে , joy এর সাথে true অ্যাসাইন হবে । ।  আর না হলে , false অ্যাসাইন হবে ।। আশা করি , বিষয়টা খুবই ক্লিয়ার হয়ে গেছে , নিজে নিজে আরো টুকটাক কোড লিখে রান করালে বিষয়টি আরো ক্লিয়ার হবে । আজ এইটুকুই ------আগামী পর্বে অন্য বিষয় নিয়ে আলোচনা করবো ।





  

C# For Beginners , Part - 6 ( \b \n \t etc. )

আমরা আজ ভিন্ন আরো কিছু , জিনিস নিয়ে আলোচনা করবো - যেমন , একটি   \b  ( Backspace ) ক্যারেক্টার । এটি , আসলে ব্যাকস্পেস ক্যারেক্টার হিসেবে কাজ করে - কিভাবে ??? ধরো , একটা প্রোগ্রাম লিখি ---------------

using System;
    class Program
    {
        static void Main()
        {

            int a = 0;
            Console.WriteLine("Vai\bh ");
            Console.ReadKey();

        }
    }

এখানে , আমাদের আউটপুট কি আসার কথা ?? স্বাভাবিকভাবে , Vaih আসার কথা , কিন্তু রান করলে কিন্তু আসবে - Vah । কারণ, Vai এর পরপরই \b ব্যবহারের কারণে - Vai এর  i  কেটে গিয়ে , Va হয়ে যায়ে এবং তারপরে h প্রিন্ট হয় ।। ব্যাকস্পেস বাটনের মতো , এটা কাজ করে ।।

\t    আমরা যেমন , ট্যাব বাটন চাপলে - স্পেইস ক্রিয়েট হয় , সেইভাবেই আউটপুট-এ এটা লিখলে , সে পরিমাণ স্পেইস কনসোল স্ক্রিনে শো করবে । ট্রাই করে দেখো -----

using System;
    class Program
    {
        static void Main()
        {

            int a = 0;
            Console.WriteLine("Vai\th ");
            Console.ReadKey();

        }
    }


\"  এর ব্যবহার
আমরা যদি কখনো , কনসোল স্ক্রিনে এইরকম আউটপুট দেখাইতে চাই , যেমন--- "Vai" ডাবল কোটেশন সহ শো করাতে যাই , তাহলে কি ???  Console.WriteLine(" "Vai" "); এইভাবে লিখবে ??? তাহলে , কিন্তু কাজ হবে না । তোমাকে নিচের মতো করে করতে হবে ।।


using System;
   class Program
    {
        static void Main()
        {
            Console.WriteLine(" \"Vai\" ");
            Console.ReadKey();

        }
    }


\n এর ব্যবহার তো আমরা সবাই জানি , নিউ লাইন ক্রিয়েট করার জন্য এটা ইউজ করা হয় ।।প্রতিটিকে আলাদা আলাদা লাইনে প্রিন্ট করার জন্য , এটি ব্যবহার করি ।



 তোমার যদি কখনো মনে হয় যে -- তুমি , এই জিনিসটা   \Vai\   প্রিন্ট করতে চাও ।। তাহলে , কিন্তু --
তোমায় নিচের নিয়ম অনুসারে করতে হবে , অন্যথায় হবে না --নীজে ট্রাই করে দেখো

using System;
    class Program
    {
        static void Main()
        {
            Console.WriteLine(" \\Vai\\ ");
            Console.ReadKey();
        }
    }

তুমি যদি , ডাবল ব্ল্যাকল্যাশ প্রিন্ট করতে চাও , তাহলে ---- Console.WriteLine(" \\Vai\\ "); এর   বদলে Console.WriteLine(@" \\Vai\\ "); লিখে রান করে দেখো , তাহলে নিজেই বুঝতে পারবে ।।এটাকে , বলা হয় --  Verbatim Literal  | |

এইরকম আরো অনেক কিছুরই , ব্যবহার রয়েছে ।। আজ এইটুকুই ।।