Friday, December 6, 2019

Flow Control in C++

Introduction to C++ Flow Control

Normally जब भी कोई C++ program execute होता है तो पहला दूसरा तीसरा ऐसे ही sequence में सारे statements execute होते है। Program execution की यह sequence program का execution flow कहलाती है।

इस execution flow को आप control कर सकते है। आप चाहे तो किसी statement के execution को skip कर सकते है, किसी statement को एक से ज्यादा बार execute करवा सकते है या फिर program में एक statement से दूसरे statement पर jump कर सकते है।



Program के execution flow को control करने के लिए C++ आपको कुछ built in flow control statements provide करती है। C++ आपको 3 प्रकार के flow control statements provide करती है।

1. Selection Statements
2. Looping Statements
3. Jump Statements
इन statements के बारे में निचे detail से दिया जा रहा है।

Selection Statements
   
ये वो statements होते है जो किसी statement को condition के base पर execute करते है। जब condition match होती है तो statement execute हो जाता है नहीं तो उसे skip कर दिया जाता है। Selection statements 4 प्रकार के होते है। निचे इनके बारे में detail से बताया जा रहा है।

If Statement

If statement एक condition block होता है। Condition true होने पर इस block में दिए गए सभी statements execute हो जाते है। यदि condition true नहीं है तो इस block का कोई भी statement execute नहीं होता है। If statement का general syntax निचे दिया जा रहा है।

if(condition)
{
    // Statements to be executed when condition is true.
}
If statement को निचे उदाहरण के माध्यम से समझाया जा रहा है।

if(5>3)
{
     cout<<“5 is greater than 3”;
}

If-else Statement

If else statement में if statement के साथ else block भी जोड़ दिया जाता है। Else block में वे statements होते है जो condition के false होने पर execute होंगे। इसका general syntax निचे दिया जा रहा है।

if(condition)
{
     // Statements to be executed when condition is true.
}
else
{
     // Statements to be executed when condition is false.
}

If else statement को निचे उदाहरण के माध्यम से समझाया जा रहा है।

if(5>3)
{
     cout<<“5 is greater than 3”;
}
else
{
     cout<<“5 is less than 3”;
}

Nested If
जब आप एक if block में दूसरा if block define करते है तो वह nested if कहलाता है। ऐसे आप कितने भी if block define कर सकते है। इसका general syntax निचे दिया जा रहा है।

if(condition)
{
      if(condition)
      {


      }

}

इसका उदाहरण निचे दिया जा रहा है।

if(num>0)
{
     if(num<2 b="">
     {
              cout<<“Num is 1”;
     }
}

Switch Case

Switch case एक ऐसा block होता है जिसमें आप अपनी choice pass करते है। Switch block में define किये गए जिस case से आपकी choice match हो जाती है उसी case के statements execute हो जाते है। इसका general syntax निचे दिया जा रहा है।

switch(choice)
{
   case 1:
                // Statements to be executed;
                break;
  case 2:
                // Statements to be executed;
                break;
  case 3:
               // Statements to be executed;
               break;
  default:
               // Statements to be executed;
               break;

}

जब आपकी choice से कोई भी case match नहीं करता है तो default case execute हो जाता है। सभी cases के statements के बाद break statement लगाना अनिवार्य है। इसे निचे उदाहरण के माध्यम से समझाया जा रहा है।

#include
using namespace std;


int main()
{
    int choice=4;

    // Passing case in switch
    switch(choice)
    {
        case 1:
                        cout<<“This is case 1”;
                        break;
       case 2:
                        cout<<“This is case 2”;
                        break;
       case 3:
                        cout<<“This is case 3”;
                        break;
       default:
                       cout<<“Please enter number between 1 to 3”;
                       break;
    }

     return 0;
}

output :-

Please enter number between 1 to 3 

Looping Statements

एक loop statement ऐसा block होता है जिसमें define किये गए blocks एक से अधिक बार execute किये जाते है। यदि आप किसी statement को एक से अधिक बार execute करवाना चाहते है तो इसके लिए आप एक loop use कर सकते है। C++ में looping statements 3 प्रकार के है। इनके बारे में निचे दिया जा रहा है।

While loop 

While loop एक ऐसा block होता है जिसमें दिए गए statements तब तक बार बार execute होते है जब तक की दी गयी condition true होती है। जैसे ही condition false होती है loop terminate हो जाता है। यदि condition false ना हो तो loop infinitely चलता रहेगा, इसलिए आप loop control variable को increase करते है।

Loop control variable condition में define किया जाता है। हर loop iteration में इसे increase किया जाता है ताकि condition false हो सके और loop terminate हो जाए। While loop का general syntax निचे दिया जा रहा है।

while(condition)
{
      // Statements to be executed;
      // X++, where X is loop control variable;
}

While loop को निचे उदाहरण के माध्यम से समझाया जा रहा है।
           
#include
using namespace std;


int main()
{
       int num=0;
     
       // While loop iterating until num is less than 5
       while(num<5 b="">
       {
           cout<<“Best Hindi Tutorials”<<“n”;

           // Incrementing num to reach the loop termination condition
           num++;
       }

       return 0;
}

 output :-

Best Hindi Tutorials
Best Hindi Tutorials
Best Hindi Tutorials
Best Hindi Tutorials
Best Hindi Tutorials

Do While Loop

एक do while loop भी while loop की तरह ही होता है। Do while loop में ख़ास बात ये है की ये कम से कम एक बार जरूर execute होता है फिर चाहे condition true हो या फिर flase हो। साथ ही do while loop में condition loop के आख़िर में check की जाती है। Do while loop का general syntax निचे दिया जा रहा है।

do
{
    statements to be executed;
    X++;  // Where X is loop control variable
}while(condition)

जैसा की आप ऊपर दिए गए syntax में देख सकते है condition के check होने से पहले do block में दिए गए statements execute होंगे और इसके बाद condition check होगी।

यदि condition false होती है तो loop terminate हो जायेगा नहीं तो do block वापस execute होगा। Loop control variable को do block में ही increase किया जायेगा। आइये अब इसे एक उदाहरण के माध्यम से समझने का प्रयास करते है।

#include
using namespace std;


int main()
{

    int num=0;

    // Checking condition after executing statements
    do
    {
       cout<<“Best Hindi Tutorials”;
       num++;
    }while(num>10);

    return 0;

}

output :-
Best Hindi Tutorials

For Loop

सभी loops में for loop सबसे simple loop माना जाता है। For loop में loop control variable का initialization, condition और increment तीनों एक ही statement में लिखे जाते है। इसके बाद block में वे statements लिखे जाते है

जिन्हें आप condition true होने पर execute करना चाहते है। For loop का general syntax निचे दिया जा रहा है।

for(initialization;condition;increment)
{
     // Statements to be executed when condition is true.
}
आइये अब for loop के use को एक उदाहरण के माध्यम से समझने का प्रयास करते है।

#include
using namespace std;


int main()
{
    int num;

    // 3 times iterating for loop
    for(num=0;num<=2;num++)
    {
          cout<<“Best Hindi Tutorials”<<“n”;
    }

    return 0;
}

output :-
                 Best Hindi Tutorials
                 Best Hindi Tutorials
                 Best Hindi Tutorials 

Jump Statements

Jump statements वे statements होते है जो execution control को एक statement से दूसरे statement को pass कर देते है। C++ में jump statements 3 प्रकार के होते है। इनके बारे में निचे दिया जा रहा है।

Break Statement 

Break statement loop को terminate करने के लिए use किया जाता है। जब भी आप किसी block में break statement use करते है तो इसे execute होते है ही program का control उस block से बाहर आ जाता है। इसका general syntax निचे दिया जा रहा है।

break;

Break statement के use को निचे उदाहरण के माध्यम से समझाया गया है।

#include
using namespace std;


int main()
{
    int num;
    for(num=0;num<5 b="" num="">
    {
         if(num==3)
         {
             cout<<“Loop terminated by break statement”;
     
             // Terminating loop on 4th iteration
             break;
         }
         else
         {
              cout<<“Best Hindi Tutorials”<<“n”;  
         }
   }

    return 0;
}

output :-
               Best Hindi Tutorials
               Best Hindi Tutorials
               Best Hindi Tutorials

Continue Statement

Continue statement loop की iteration को skip करने के लिए use किया जाता है। Continue statement के use से loop उस iteration को skip करके next iteration को execute करता है। इसका general syntax निचे दिया जा रहा है।

continue;
Continue statement को निचे उदाहरण के माध्यम से समझाया गया है।

#include
using namespace std;


int main()
{
     for(int num=0;num<5 b="" num="">
     {
          if(num==2)
          {
               cout<<“Third iteration skipped!”<<“n”;

               // Skipping third iteration of loop
               continue;
          }
          else
          {
               cout<<“Best Hindi Tutorials”<<“n”;
          }
     }

      return 0;
}

output :- 
              Best Hindi Tutorials
              Best Hindi Tutorials
              Third iteration skipped!
              Best Hindi Tutorials
              Best Hindi Tutorials 

Go to Statement

Goto statement program में एक point से किसी दूसरे point पर jump करने के लिए use किया जाता है। ये jump किसी label पर किया जाता है, इसलिए जब भी आप program में कँही jump करना चाहते है तो पहले label define करते है। एक label define करने का general syntax निचे दिया जा रहा है।

label-name:

जैसा की आप ऊपर दिए गए syntax में देख सकते है, सबसे पहले आप label का नाम define करते है और उसके बाद colon लगाते है। किसी भी label पर jump करने के लिए आप goto statement define करते है। इसका general syntax निचे दिया जा रहा है।

goto label-name;

Goto statement के use को निचे उदाहरण के माध्यम से समझाया गया है।

#include
using namespace std;


int main()
{

     cout<<“Hello Reader!”;
     goto bhtLabel;

   
     if(5>3)
     {
          cout<<“This will not be executed!”;
     }

     bhtLabel:
      cout<<“Hello Reader Again!”;

     return 0;
}

output :-
              Hello Reader!
              Hello Reader Again! 

Virtual Functions in C++

Introduction to C++ Virtual Functions

C++ आपको polymorphism की capability provide करती है। Polymorphism का मतलब एक interface से कई तरह के अलग अलग codes को execute करना होता है। जैसा की function overloading और constructor overloading में आप करते है।
Function overloading में आप एक ही नाम के function को अलग अलग data types के साथ create करते है। इसके बाद function को call करवाते समय user जिस तरह का data type pass करते है उसके अनुसार function की appropriate definition execute हो जाती है।



इसे run-time polymorphism कहा जाता है। क्योंकि इसमें run time पर decide किया जाता है की function की कौनसी definition execute होगी।

उसी प्रकार pointers के माध्यम से भी आप polymorphism achieve कर सकते है। सिर्फ base class के pointer से ही आप दोनों classes के functions को execute करवा सकते है। ऐसा virtual functions के माध्यम से किया जाता है।

Virtual functions के बारे में और अधिक जानने से पहले आपको ये जानने की जरुरत है की virtual functions की जरुरत क्यों पड़ी। इसे निचे एक उदाहरण के माध्यम से समझाया जा रहा है।

उदाहरण के लिए मान लीजिये आपने एक class create की है जिसका नाम color है। इस class में आपने display() नाम से एक function भी create किया हुआ है।

class Color
{
     public:
            void display()
            {
                 cout<<“Red Green Blue”;
            }  
}; 
Color class को एक दूसरी class inherit करती है जिसका नाम RedColor है। इस class में भी एक display() नाम का function create किया गया है। 

class RedColor : public Color
{
      public:
              void display()
              {
                       cout<<“Red”;               
              }
}; 

मान लीजिये आप main() function में base class का एक pointer create करते है। सबसे पहले आप इस pointer को base class object assign करते है और फिर pointer के माध्यम से base class का display() function call करते है। जब आप ऐसा करते है तो display() function “Red Green Blue” print करता है।

int main()
{
      Color *basepntr;   
      color baseobj;  
      RedColor derivedObj  
      basepntr->display(); 
      basepntr=&derivedObj; 
      basepntr->display(); 
 

      return 0;


इसके बाद आप derived class का object create करते है और इसे base class के pointer को assign करते है। अब आप वापस base class के pointer के द्वारा display() function को call करते है। जब आप ऐसा करते है तो वापस base class का ही display() function execute होता है। और “Red Green Blue” output show होता है। 
लेकिन क्योंकि यँहा पर derived class का object pointer को assign किया गया है तो derived class का display() function execute होना चाहिए, पर ऐसा नहीं होता है। इसका main कारण ये है की pointer उसी type के functions को execute कर रहा है जिस type का वह खुद है। 

यानी की ऊपर दिए गए उदाहरण में base class का pointer create किया गया है, इसलिए वह pointer सिर्फ base class के function को ही execute कर रहा है। ऐसी situation में C++ polymorphism feature work नहीं कर रहा है।

इस situation में polymorphism achieve करने एक लिए C++ आपको एक mechanism provide करती है जिसे virtual function कहते है। Virtual functions को virtual keywords से create किया जाता है। Virtual functions सिर्फ base class में ही create किये जाते है।

Virtual functions compiler को बताते है की same नाम का function derived class में भी create किया गया है। इसलिए यदि object derived class का है तो function भी derived class का ही execute किया जायेगा। 

Rules For Creating C++ Virtual Functions 

Virtual function को create और use करने के कुछ नियम होते है जिन्हें follow करना बहुत जरूरी है। आइये इनके बारे में जानने का प्रयास करते है।

1.Virtual functions static नहीं हो सकते है। 
2. Virtual functions को object pointers के द्वारा access किया जाता है। 
3. Virtual functions को base class में define किया जाना चाहिए, चाहे फिर उन्हें बाद में यूज़ किया जाये या नहीं। 
4. Virtual functions किसी दूसरी class के friend function भी हो सकते है। 
5. Virtual function का declaration और derived class में same नाम के function का declaration same होना चाहिए। यदि data types भी different है तो virtual function mechanism work नहीं करेगा। 
6. हालाँकि base class के pointer से किसी भी derived class को point किया जा सकता है, लेकिन derived class के pointer से base class को point नहीं किया जा सकता है। 
7. Base class में define किये गए virtual function को derived class में दुबारा define करने की आवश्यकता नहीं होती है। यदि ऐसा किया जाता है तो base class का function ही execute होगा।            

अब तक आप virtual functions create करने के नियम पढ़ चुके है। आइये अब देखते है की आप किस प्रकार virtual functions को create कर सकते है।
Creating & Using C++ Virtual Functions

Virtual functions define करने के लिए आप virtual keyword यूज़ करते है। इसका general syntax नीचे दिया जा रहा है। 

virtual data-type function-name(parameters-list)
{
       // Definition of virtual function 

Example :-


#include
using namespace std;
class Color
{
      public:
             // Virtual function
             virtual void display()
             {
                     cout<<“Base : Red Green Blue”<
             }
}; 
class RedColor : public Color
{
      public:
             void display() 
             {
                    cout<<“Derived : Red”;
             }    
}
int main()
{
    // Base class object
    Color baseobj;
 

    // Derived class object

    RedColor derivedobj;
    // Base class pointer

    Color *basepntr; 
    // Assigning base class obj to base class pointer 

    basepntr = &baseobj;
 

    // Base class display() function will be executed

    basepntr->display();
 

    // Assigning derived class obj to base class pointer 

    basepntr = &derivedobj;
 

    // Derived class display() function will be executed;

    basepntr->display();  
    return 0;
}

जैसा की आप देख सकते है base class में display() function को virtual keyword के साथ define किया गया है। इस program को जब आप execute करेंगे तो ये base class और derived class दोनों के ही display() function का result show करेगा।

Base : Red Green Blue
Derived : Red 

Pure Virtual Function 

जब आप base class में virtual function create करते है और derived class में भी same ही function create करते है तो आप base class के function को बहुत कम यूज़ करते है या फिर करते ही नहीं है। ऐसी situation में आपको base class के virtual function की definition provide करने की कोई आवश्यकता नहीं होती है। 

इस situation में आप एक ऐसा virtual function create करते है जो कुछ भी नहीं करता है। इस तरह के function को pure virtual function कहा जाता है। Pure virtual function create करने के लिए आप normal virtual के declaration के बाद definition की बजाय assignment operator (=) लगाकर कर उसे 0 assign कर देते है। 

virtual data-type function-name(parameter-list) = 0;  

उदाहरण के लिए ऊपर दिए program के लिए pure virtual function इस प्रकार create किया जायेगा। 

virtual void display() = 0; 

Inline Functions in C++

Introduction to C++ Inline Functions

जब program किसी normal function को execute करता है तो सबसे पहले CPU function call statement के बाद वाले statement का memory address store करता है। ऐसा इसलिए किया जाता है ताकि function के execute होने के बाद इस statement से execution शुरू किया जा सके।
j

इसके बाद compiler arguments को stack में copy करता है। इसके बाद control function को transfer हो जाता है। इसके बाद CPU function code को execute करता है और return value को register में store करता है। इसके बाद control वापस function calling statement को चला जाता है।

जब किसी function का calling time उसके execution time से अधिक होता है तो उसे overhead माना जाता है। Calling time वह time होता है जो CPU को function call और function execution के बीच लगता है।

क्योंकि CPU एक memory location से दूसरी memory location पर switch करता है और उसके बाद function को execute करता है और फिर उसके बाद वापस actual location पर return करता है। इस process में काफी अधिक समय लग जाता है।

बड़े functions जिनको execute होने में अधिक समय लगता है उनके लिए इस time को appropriate माना जा सकता है। लेकिन छोटे functions जो बहुत कम समय में execute हो जाते है उनके लिए एक memory location से दूसरी memory location में switch होने का time waste करना appropriate नहीं होता है।

हालाँकि हो सकता है की अभी ये time आपको महत्वपूर्ण ना लगे लेकिन जब बात बड़े projects की आती है तो execution time reduce करना एक priority होती है।

इस situation में छोटे functions द्वारा waste किये जा रहे function calling time को save करने के लिए C++ आपको एक mechanism provide करती है जिसे inline function कहते है।

Inline function C++ में एक important feature है। जब आप किसी function को inline define करते है तो उस function को execute करने के लिए compiler memory location switch नहीं करता है। इसके बजाय compiler calling statement को function definition से replace कर देता है। ये काम compiler के द्वारा compile time पर किया जाता है।

एक बात ध्यान रखने योग्य है की जब आप किसी function को inline define करते है तो ये compiler के लिए सिर्फ एक request होती है। जरुरी नहीं की compiler इस function को inline करे। Compiler इसे ignore भी कर सकता है।
यदि किसी function में loop होता है, static variables होते है, switch और goto statement होते है या फिर यदि function recursive होता है तो ऐसी situation में compiler function को inline नहीं करता है।

जब आपको program की efficiency बढ़ाने की आवश्यकता हो तो आप inline function को use कर सकते है। Macros के साथ आने वाली problems को eliminate करने के लिए भी inline functions को use किया जाता है।

Advantages of Inline Functions
 
1. क्योंकि function call को function definition से replace कर दिया जाता है इसलिए function call का overhead नहीं होता है। 
2. Argument variables को stack में store करने का overhead भी inline function को use करने से remove हो जाता है।
3. Inline function के use से function के वापस return होने का overhead भी नहीं होता है।

Disadvantages of Inline Functions 

1. Inline function use करने से program बड़ा हो जाता है और executable file की size बढ़ जाती है।
2. क्योंकि function को compile time पर inline किया जाता है, इसलिए यदि आप किसी inline function के code को change करते है तो आपको उन सभी programs को भी recompile करना होगा जो की इस function को use कर रहे है।
3. जब आप inline function को header में use करते है तो इससे आपकी header file बड़ी हो जाती है।
4. जैसा की पहले बताया गया inline function use करने से executable file की size बढ़ जाती है। ऐसा होने से इस executable file के लिए अधिक memory की आवश्यकता पड़ती है। आवश्यकता से कम memory होने पर program की efficiency पर फर्क पड़ता है।

Syntax & Example of Inline Functions

inline return_type function_name(parameter list)
{
     // Function body
}

जैसा की आप ऊपर दिए गए syntax में देख सकते है function को inline बनाने के लिए उसकी normal definition से पूर्व inline keyword का प्रयोग किया गया है।

आइये अब inline function के use को एक उदाहरण के माध्यम से समझने का प्रयास करते है।

#include
using namespace std;


// Inline function add
inline int add(int x, int y)
{
      return x+y;
}

int main()
{
    int a,b;

    cout<<“Please enter first number : “;
    cin>>a;

    cout<<“Please enter second number : “;
    cin>>b;

    cout<
    cout<<“Sum of a & b is :”<

    return 0;  
}

Output :-
                 Please enter first number 
                  9
                 Please enter second number 
                  8
                 Sum of a & b is : 17