                                                          ++   193

                                5. 

      ++   . 
   ,     
(;),   .  ++ (, ival + 5)  
,       .   
  ,    .  
    .  , 
     . 
        
       
.  if, if-else  switch   .
    while, do-while  for.

                       5.1.    

       .    :

   ; //  

      ,   ++  
,    . ,    while,
    ,     
  (  ).     ++
 while   .      ( 
 ),     :

   while ( *string++ = inBuf++ )
   ; //  

           .
,  

   ival = dval + sval;; // :   

          
 ival .
       ,      .
:

   //  
   int ival = 1024; //   
   ival; // 
   ival + 5; //   

                                                             ++   194


   ival = ival +5; // 

          
 ,   . ,  ,  .
        ,
   :

   if ( ival0 > ival1 ) {
      //  , 
      //     

      int temp = ivalO;
     ivalO = ival1;
     ival1 = temp;
   }

        ,  ,    
   .
        .   
     :

   while ( *string++ = *inBuf++ )
   {} //  

    ,   ,   .
        , 
  ( temp   ),    . (, 
        8.)

                            5.2.  

    ++  , 

   int ival;

    (      
  ).       , 
  .     
 //#n,  n   .

                                                            ++   195

   #include <fstream>
   #include <string>
   #include <vector>

   int main()
   {
      string fileName; // #1

      cout << "  : ";
      cin >> fileName;

      if ( fileName.empty() ) {
         //  
         cerr << "  .  .\n";
         return -1;
      }

      ifstream inFile( fileName.c_str() ); // #2
      if ( ! inFile ) {
         cerr << "  .\n";
         return -2;
      }

      string inBuf; // #3
      vector< string > text; // #4
      while ( inFile >> inBuf ) {
         for ( int ix = 0; ix < inBuf .size(); ++ix ) // #5
            //    ch,
            //      
            if (( char ch = inBuf[ix] )=='.'){ // #6
               ch = '_';
               inBuf[ix] = ch;
            }
            text.push_back( inBuf );
      }

      if ( text.empty() )
         return 0;
      //   ,
      //    
      vector<string>::iterator iter = text.begin(), // #7
                             iend = text.end();

      while ( iter != -iend ) {
         cout << *iter << '\n';
         ++iter;
      }
      return 0;
   }

           .
  ;     
 .
    70-       , 
        , 
 . ( , ,    
      .)     
       ,
 .   , , FORTRAN.

                                                             ++   196

     ++    ,    
  ,    ,   
  .
     ?       
   .    ,   
    if, if-else, switch, while, for.  ,
   , ,       
.
      ,    
,    .      
   ,    :

         
     .     
         ;
     ,       ,  
          . , 
           :  
             
     .       
    .    inBuf  next     ,
            
        .

           . , 
         :

   //   ,
   //    
   vector<string>::iterator iter = text.begin(),
   lend = text.end();

    ,    ,  :

   vector<string>::iterator lend = text.end();

             
 ,     ,   
,         . , 
    ,     
         
 (      ):

   //     ?
   string *ptrl, ptr2;

                                                                ++   197

          :

   string *ptr1;
   string *ptr2;

             
 . ,   

    int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0;
  int charCnt=0, wordCnt=0;

          
   .      
   .       
,       -  .

                                       5.1

    ,        , 
    .  
     .

                                       5.2

    ,         
.         
  ,      - 
 .   .

                                  5.3.  if

    if        
  .   :

   if (  )
   

    .    ,   
:

   if(a+b>c) { ... }

    :

   if ( int ival = compute_value() ){...}

                                                            ++   198

     ,    , 
  if   . ,    
:

   if ( int ival = compute_value() ) {
      //   ival
      //   
   }
   // : ival 
   if ( ! ival ) ...

        if   min(),
   .     
 ,  .      
 :

  1.      .
  2.   ,       
       1.
  3.     ,    1.
  4.      .
  5.         .

    if:

   if ( minVal > ivec[ i ] )...//   minVal
   if ( minVal == ivec[ i ] )...//  

      ,  
      :

   if ( minVal > ivec[ i ] )
      minVal = ivec[ i ];
   occurs = 1; //    if!

      ,     ,  
minVal=ivec[i],  occurs=1     if.    


   occurs = 1;

   if   ,   occurs  1.  
    if- (  
      ):

                                                              ++   199

   if ( minVal > ivec[ i ] )
   {
      minVal = ivec[ i ];
      occurs = 1;
   }

     if  :

   if ( minVal == ivec [ i ] )
   ++occurs;

   ,         .  
  minVal    ,   
   1:

   if ( minVal > ivec[ i ] ) {
      minVal = ivec[ i ];
      occurs = 1;
   }
   //  minVal     ,
   //  occurs    ,  
      if ( minVal == ivec[ i ] )
      ++occurs;

       :       
      minVal.   
        ,   
if-else,   if-.     :

   if (  )
      1
   else
      2

1 ,   ,    2.
:

   if ( minVal == ivec[ i ] )
      ++occurs;
   else
   if ( minVal > ivec[ i ] ) {
       minVal = ivec[ i ];
       occurs = 1;
   }

                                                              ++   200

    2   if-.  minVal  ivec[i],
   .
          :

   if ( minVal < ivec[ i ] )
      {} //  
   else
   if ( minVal > ivec[ i ] ) {
      minVal = ivec[ i ];
      occurs = 1;
   }
   else // minVal == ivec[ i ]
   ++occurs;

     if-else     ,
  else ,   if.    if    else?
(      else). :

   if ( minVal <= ivec[ i ] )
      if ( minVal == ivec[ i ] )
         ++occurs;
   else {
      minVal= ivec[ i ];
      occurs= 1;
   }

     ,  ,  else    ,
 if.   ++   else   
   if.  ,   
  :

   if ( minVal <= ivec[ i ] ) {
      if ( minVal == ivec[ i ] )
         ++occurs;
      else {
         minVal = ivec[ i ];
         occurs = 1;
         }
   }

            if 
 :
                                                              ++   201

   if ( minVal <= ivec[ i ] ) {
      if ( minVal == ivec[ i ] )
         ++occurs;
   }
   else {
      minVal= ivec[ i ];
      occurs= 1;
   }

          
    if-else,    
  .
    min().     
     .   
   for.       . 
   ?

   #include <vector>

   int min( const vector<int> &ivec, int &occurs )
   {
      int minVal = 0;
      occurs = 0;

      int size = ivec.size();

      for ( int ix = 0; ix < size; ++ix ) {
         if ( minVal == ivec[ ix ] )
            ++occurs;
         else
         if ( minVal > ivec[ ix ] ) {
            minVal = ivec[ ix ];
            occurs = 1;
        }
   }
   return minVal;
   }

        .   
          
,       .     
   . (-    7.3.)
    occurs   , 
  :

                                                               ++   202

   int main()
   {
       int occur_cnt = 0;
       vector< int > ivec;

      // occur_cnt   occurs
      //   min()
      int minval = min( ivec, occur_cnt );
      // ...
   }

     -    
pair,    3.14.  min()     
  :

   //  
   //   

   #include <uti1ity>
   #include <vector>

   typedef pair<int,int> min_va1_pair;

   min_va1_pair
   min( const vector<int> &ivec )
   {
      int minVal = 0;
      int occurs = 0;

      //    ...

      return make_pair( minVal, occurs );
   }

    ,     .   ? : 
 minVal , ,     
,         
 .
     ,  minVal   :

   int minVal = ivec[0];

      .      
,   .

                                                            ++   203

   //   min()
   //     ...

   int minVal = ivec[0];
   occurs = 0;

   int size = ivec.size();

   for ( int ix = 0; ix < size; ++ix )
   {
      if ( minVal == ivec[ ix ] )
         ++occurs;
   // ...

    ix  ,      
    .   ix   
   .      
  (,     !).    
?

   //   min(),
   //  ,  ...

   int minVal = ivec[0];
   occurs = 0;

   int size = ivec.size();

   for ( int ix = 1; ix < size; ++ix )
   {
      if ( minVal == ivec[ ix ] )
         ++occurs;
   // ...

    ivec[0]   ,  occurs  
 1. ,    ,     :

   int minVal = ivec[0];
   occurs = 1;

    ,        : 
    .  ,   ,   
     .
       min()   main(),   :

                                                                ++   204

   #include <iostream>
   #include <vector>

   int min( const vector< int > &ivec, int &occurs )
   {
      int minVal = ivec[ 0 ];
      occurs = 1;

      int size = ivec.size();
      for ( int ix = 1; ix < size; ++ix )
      {
          if ( minVal == ivec[ ix ] )
             ++occurs;
          else
          if ( minVal > ivec[ ix ] ){
             minVal = ivec[ ix ];
             occurs = 1;
         }
      }
      return minVal;
   }

   int main()
   {
      int ia[] = { 9,1,7,1,4,8,1,3,7,2,6,1,5,1 };
      vector<int> ivec( ia, ia+14 );

      int occurs = 0;
      int minVal = min( ivec, occurs );

      cout << " : " << minVal
             << " : " << occurs << " .\n";
      return 0;
   }

     :

    : 1 : 5 .

        if-else     
  . ,    min():

   template <class valueType>
   inline const valueType&
   min( valueType &vall, valueType &va12 )
   {
      if ( vall < va12 )
         return vall;
      return va12;
   }

  :

                                                            ++   205

   template <class valueType>
   inline const valueType&
   min( valueType &vall, valueType &va12 )
   {
      return ( vall < va12 ) ? vall : va12;
   }

      if-else,   ,  
 ,  ,    .

    if ( ch == 'a' ||
       ch == 'A' )
       ++aCnt;
    else
    if ( ch == 'e' ||
        ch == 'E' )
        ++eCnt;
    else
    if ( ch == 'i' ||
       ch == 'I' )
       ++iCnt;
    else
    if ( ch == 'o' ||
       ch == '0' )
       ++oCnt;
    else
    if ( ch == 'u' ||
        ch == 'U' )
       ++uCnt;

        ++   switch. 
  .

                                           5.3

      :


                                                            ++   206

   (a) if ( ivall != iva12 )
           ivall = iva12
        else
           ivall = iva12 = 0;

   (b) if ( ivat < minval )
           minvat = ival;
        occurs = 1;

   (c) if ( int ival = get_value())
          cout << "ival = "
                 << ival << endl;
       if ( ! ival )
          cout << "ival = 0\n";

   (d) if ( ival = 0 )
           ival = get_value();

   (e) if ( iva1 == 0 )
       else ival = 0;

                                       5.4

      occurs  min(),    ,  
.  .    ?

                                  5.4.  switch

      if-else,     
,         .
  ,  , ,  else  if.
       
 switch.
      switch   .  
,           .
(,   e       
.)   :

   1.       ,    .
   2.      .
   3.      ,  1   .
   4.  .

      ,     
    .  ,   e 
 :

   aCnt: 394
   eCnt: 721
   iCnt: 461
   oCnt: 349
   uCnt: 186

                                                          ++   207

    switch    :

     switch,       ,
     :

   char ch;
   while ( cm >> ch )
      switch( ch )

     case,     case  
    ,    .     
         :

      case 'a':
      case 'e':
      case 'i':
      case 'o':
       case 'u':

    ,    case.  
          , 
      ;
     default,     else
     if-else. ,   , ,
            case. ,  
        ,  
     :

      default: //  ,   
        ++non_vowe1_cnt;

       case     , 
  :

      //   
      case 3.14: //  
   case ival: //  

    ,        .
       switch     ,  
   .      
case,         ,    .
  ,        ,
  ,       default (  )  
   switch.

                                                              ++   208

      if-else ,    ,  
 ,     case   default.   
. ,       
,   :

   #include <iostream>

   int main()
   {
      char ch;
      int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0;

      while ( cin >> ch )
         // !  !
        switch ( ch ) {
           case 'a':
              ++aCnt;
           case 'e':
               ++eCnt;
           case 'i':
               ++iCnt;
           case 'o':
               ++oCnt;
           case 'u':
               ++uCnt;
         }

      cout << " a: \t" << aCnt << '\n'
             << " e: \t" << eCnt << '\n'
             << " i: \t" << iCnt << '\n'
             << " o: \t" << oCnt << '\n'
             << " u: \t" << uCnt << '\n';
   }

     ch  i,      case 'i'  iCnt
  1.    , ++oCnt  ++uCnt, 
,     .    ch  a,
   .
          
     switch,  break.  
     case    break.
   break   switch    ,  
  ,      .   
 :

                                                             ++   209

   switch ( ch ) {
      case 'a':
          ++aCnt;
          break;
      case 'e':
          ++eCnt;
          break;
      case 'i':
          ++iCnt;
          break;
      case 'o':
         ++oCnt;
         break;
     case 'u':
        ++uCnt;
        break;
   }

    - ,        break, 
      .   
  ,    ,        
 . ,   ,   ,  
     .
           break  
     case?     
           .  
 ,   case     . , 
  ,       , 
      .  
 :

   int vowelCnt = 0;
   // ...

   switch ( ch )
   {
      //    a,e,1,o,u
      //   vowelCnt
      case 'a':
      case 'e':
      case 'i':
      case 'o':
      case 'u':
         ++vowe1Cnt;
         break;
   }

         , 
        :

                                                              ++   210

   switch ( ch )
   {
      //  
      case 'a': case 'e':
      case 'i': case 'o': case 'u':
        ++vowe1Cnt;
        break;
   }

          :     

   UNIX

        ,   U  I  
  .     :

   switch ( ch ) {
      case 'a': case 'A':
          ++aCnt;
          break;
      case 'e': case 'E':
          ++eCnt;
          break;
      case 'i': case 'I':
          ++iCnt;
          break;
      case 'o': case 'O':
          ++oCnt;
          break;
      case 'u': case 'U':
         ++uCnt;
         break;
   }

    default    else  if-else. ,
 default, ,        
case. ,        :

                                                              ++   211

   #include <iostream>
   #include <ctype.h>

   int main()
   {
      char ch;
      int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0,
         consonantCount=0;

      while ( cin >> ch )
         switch ( ch ) {
            case 'a': case 'A':
                 ++aCnt;
                 break;
            case 'e': case 'E':
                ++eCnt;
                break;
           case 'i': case 'I':
               ++iCnt;
               break;
          case 'o': case 'O':
              ++oCnt;
              break;
         case 'u': case 'U':
             ++uCnt;
             break;
         default:
            if ( isa1pha( ch ) )
               ++consonantCnt;
             break;
         }
         cout << " a: \t" << aCnt << '\n'
                << " e: \t" << eCnt << '\n'
                << " i: \t" << iCnt << '\n'
                << " o: \t" << oCnt << '\n'
                << " u: \t" << uCnt << '\n'
                << " : \t" << consonantCnt
                << '\n';
   }

   isalpha()     ;   true,   
 . isalpha()     ctype.h. ( 
ctype.h      6.)
     break        
switch,   - .  :    
     case,      
 break.
      switch   ,   
:

switch( int ival = get_response() )

ival  ,   get_response(),   
    case.  ival    switch,
   .

                                                             ++   212

          switch  . 
     :

   case illegal_definition:
       // :   
      //    
      string file_name = get_file_name();
      // ...
      break;

        ,       
 switch,       ,  
    case.
          ,  
 file_name   .  
,       ,    
  .     :

   case ok:
   {
      // 
      string file_name = get_file_name();
      // ...
      break;
   }

                                       5.5

        ,     
,    ,     .

                                      5.6

        ,    
    ff, fl  fi.

                                      5.7

         :

(a)
   switch ( ival ) {
      case 'a': aCnt++;
   case 'e': eCnt++;
      default: iouCnt++;
   }
(b)

                                                              ++   213

   switch ( ival ) {
      case 1:
         int ix = get_value();
         ivec[ ix ] = ival;
         break;
     default:
        ix = ivec.sizeQ-1;
        ivec[ ix ] = ival;
   }

(c)
  switch ( ival ) {
      case 1, 3, 5, 7, 9:
          oddcnt++;
          break;
      case 2, 4, 6, 8, 10:
         evencnt++;
         break;
   }

(d)
   int iva1=512 jva1=1024, kva1=4096;
   int bufsize;
   // ...
   switch( swt ) {
      case ival:
         bufsize = ival * sizeof( int );
         break;
       case jval:
           bufsize = jval * sizeof( int );
           break;
      case kval:
         bufsize = kval * sizeof( int );
         break;
   }
(e)
   enum { illustrator = 1, photoshop, photostyler = 2 };
   switch ( ival ) {
      case illustrator:
         --i11us_1icense;
         break;
      case photoshop:
         --pshop_1icense;
         break;
      case photostyler:
         --psty1er_license;
      break;
                                                               ++   214

   }

                                  5.5.   for

     ,       
    ,     . , 
    ,      ,  
,         1,  ..  ++
     ,   for  while,
   .   ,   
         . 
 , do while, ,        :
     . (     
 for;   5.6  while,    5.7  do while.)
    for      , 
 , ,    :

   #include <vector>

   int main() {
      int ia[ 10 ];

      for ( int ix = 0; ix < 10; ++-ix )
         ia[ ix ] = ix;
      vector<int> ivec( ia, ia+10 );
      vector<int>::iterator iter = ivec.begin() ;

      for ( ; iter != ivec.end(); ++iter )
         *iter *= 2;

      return 0;
   }

  for :

   for (-; ;  )
   

-    ,  
.       ,
     .     
  -   ,      (.
    ).    
-:

   // index  iter    
   for ( index =0; ...
   for ( ; /*   */ ...
   for ( iter = ivec.begin(); ...
   for ( int 1o = 0,hi = max; ...

                                                              ++   215

   for ( char *ptr = getStr(); ...

    .      true,
  .       
,   .        false,
    .     :

   (... index < arraySize; ... )
   (... iter != ivec.end(); ... )
   (... *stl++ = *st2++; ... )
   (... char ch = getNextChar(); ... )

           .
     ,  
-.       false,
    .     :

   ( ... ...; ++-index )
   ( ... ...; ptr = ptr->next )
   ( ... ...; ++i, --j, ++cnt )
   ( ... ...; ) //  

       for

   const int sz = 24;
   int ia[ sz ];
   vector<int> ivec( sz );

   for ( int ix = 0; ix < sz; ++ix ) {
      ivec[ ix ] = ix;
      ia[ ix ]= ix;
   }

   :

  1. -      .  
        ix,    0.
  2.  .    true,    
     .   ,  ix  sz,  ix  
     ivec[ix]  ia[ix].     false,  
     .       false, 
        .
  3.  .  ,    
     ,   -   
     .    ix   1.

                                                                ++   216

           for.   2  3 
   ,      false, .. ix  
  sz.
    -    ,   
   ,       :

   for ( int ival = 0, *pi = &ia, &ri = val;
          ival < size;
          ++iva1, ++pi, ++ri )
   // ...

          : 
       false,    
 .  ,    :

   #include <iostream>

   int main()
   {
      for ( int ix = 0;
            bool done = ix == 10;
            ++ix )
                cout << "ix: " << ix << endl;
   }

     ,      for,
  . ,  iter    
8:

   int main()
   {
      string word;
      vector< string > text;
      // ...
      for ( vector< string >::iterator
            iter = text.begin(),
            iter_end = text.end();
            iter != text.end(); ++iter )
      {
         if ( *iter == word )
            break;
            // ...
      }

      // : iter  iter_end 
      if ( iter != iter_end )
      // ...
   }




   8     ++  ,   
      for,      ,   .
     ,    for   
     {
        //    ++
        //    C++ - : ival  
        for (int ival = 0; ival < size; ++iva1 ) // ...
        for (int ival = size-1; ival > 0; ival ) // ...
     }
          : ival  .   ++
        ,     ival 
        .

                                                               ++   217

                                 5.8

         for?  ,  ?

(a)
   for ( int *ptr = &ia, ix = 0;
      ix < size && ptr != ia+size;
      ++ix, ++ptr )
       // ...
(b)
   for ( ; ; ) {
      if ( some_condition )
         break;
      // ...
                                                           ++   218
    // ...
(c)
   for ( int ix = 0; ix < sz; ++ix )
      // ...
     if ( ix != sz )
     // ...
(d)
      int ix;
      for ( ix < sz; ++ix )
         // ...
(e)
   for ( int ix = 0; ix < sz; ++ix, ++ sz )
      // ...

                                5.9

   ,         for 
 .      
    .

                                5.10

  :

   bool is_equa1( const vector<int> &vl,
      const vector<int> &v2 );

     ,    .   
     ,    
. ,  (0,1,1,2)  (0,1,1,2,3,5,8)  .  
     v1.size()  v2.size().

                               5.6.  while

     while :

   while (  )
   

       true,    
:

   1.  .
   2.  ,   .

                                                               ++   219

   3.       false,   .
          :

   bool quit = false;
   // ...
   while ( ! quit ) {
      // ...
      quit = do_something();
   }
   string word;
   while ( cin >> word ){ ... }

   :

   while ( symbol *ptr = search( name )) {
      // - 
  }

      ptr    ,   while, 
     for  switch.
      while,   ,  
:

   int sumit( int *parray_begin, int *parray_end )
   {
      int sum = 0;
      if ( ! parray_begin || ! parray_end )
         return sum;
     while ( parray_begin != parray_end )
        //   sum
        //   
        sum += *parray_begin++;
        return sum;
    }

    int ia[6] = { 0, 1, 2, 3, 4, 5 };

   int main()
   {
      int sum = sumit( &ia[0], &ia[ 6 ] );
      // ...
   }

       sumit()  ,   
       (parray_end   
,   ).    sumit()  
 . , ++  ,      

                                                           ++   220

  .      12,   
   ,       
  .

                                      5.11

         while:

(a)
   string bufString, word;
   while ( cin >> bufString >> word )
      // ...
(b)
   while ( vector<int>::iterator iter != ivec.end() )
      // ...
(c)
   while ( ptr = 0 )
      ptr = find_a_value();
(d)
   while ( bool status = find( word )) {
      word = get_next_word();
      if ( word.empty() )
         break;
      // ...
   }
   if ( ! status )
      // ...
   cout << "  \n";

                                      5.12

   while    , ,   
, ,   ,      .
for     :    
 .      for  while,  
 ,    .       
      ,    ? ?

                                      5.13

    ,        
,                
.     while;    
     break.    ,
 .       ,   
. 

                                                              ++   221

                                5.8.  do while

   ,     ,    .
   :

   int val;
   bool more = true; //  ,  
   //  
   while ( more ) {
      val = getValue();
      val = convertValue(val);
      printValue(val);
      more = doMore();
   }

      ,      . for  while
,     true     , 
    .  ,       
  .     do while,
       .   do while
:

   do
         
   while (  );

     .    
false,  .       
 do while:

   do {
      val = getValue();
      val = convertValue(val);
      printValue(val);
   } while doMore();

        , do while     
  .    :

   // :  
   //    
   do {
      // ...
      mumble( foo );
   } while ( int foo = get_foo() ) // 

                                                               ++   222

      do while     
  .

                                   5.14

         do while:

(a)
   do
      string rsp;
      int vail, va12;
      cout << "  : ";
      c-in >> vail >> va12;
      cout << " " << vail
             << "  " << va12
             << " = " << vail + va12 << "\n\n"
             << "? [][] ";
      cin >> rsp;
   while ( rsp[0] != 'n' );

(b)
   do {
      // ...
   } while ( int iva1 = get_response() );

(c)
   do {
      int ival = get_response();
      if ( iva1 == some_value() )
         break;
   } while ( iva1 );
   if ( !iva1 )
   // ...

                                   5.15

     ,       
      ( 
,       ).    
,      .   string,
    do while.

                               5.8.  break

    break   for, while, do while   switch.
    ,   
    . ,      
  .    ,    ,
     -1.     :

                                                              ++   223

   //     -1
   int search( int *ia, int size, int value )
   {
      //   ia != 0  size > 0 ...

      int loc = -1;
      for ( int ix = 0; ix < size; ++ix ) {
         if ( value == ia[ ix ] ) {
            // !
            //      
            1oc = ix;
            break;
         }
      } //  
      //    break ...
      return 1oc;
   }

      break    for   
,    ,     return. ,  break
  ,    for,   if,   
 ,  if.  break   if, 
     switch,   :

   // :   break
   if ( ptr ) {
      if ( *ptr == "quit" )
         break;
         // ...
    }

            switch,
     ,   .  
switch,     switch,       break,
 . :

   white ( cin >> inBuf )
   {
      switch( inBuf[ 0 ] ) {
         case '-':
            for ( int ix = 1; ix < inBuf.size(); ++ix ) {
               if ( inBuf[ ix ] == ' ' )
                  break; // #1
                  // ...
               // ...
            }
            break; // #2
         case '+':
            // ...
      }
   }

                                                          ++   224

    break,  // #1,    for  
case '-'  switch,    switch.  break // #2 
  switch,    while,    .

                              5.9.  continue

    continue        
 ,     .    
break,    ,  continue 
   . ,   
      .     
,  ,       
.

   while ( cin >> inBuf ) {
      if ( inBuf[0] '= '_' )
         continue; //  
         //   ...
  }

    continue      .

                               5.10.  goto

    goto         
,       
.
    goto :

   goto ;

     .   
,       goto,   
.       
.    ,     :

      end: ; //  
   }

             goto .
,     :

                                                        ++   225

   int oops_in_error() {
      // mumble ...
      goto end;
      // :   
      int ix = 10;
      // ... ,  ix
      end: ;
   }

        ix   
   :

   int oops_in_error() {
      // mumble ...
      goto end;
      {
         // :    
         int ix = 10;
         // ... ,  ix
     }
     end: ;
   }

       ,       switch:
  ,      
   ,       .  
     .
      , ,   . ? 
   ,       
   ,       .
:

                                                            ++   226

   //       .
   void
   mumble ( int max_size )
   {
      begin:
         int sz = get_size();
         if ( sz <= 0 ) {
            //   ...
            goto end;
         }
         else
         if ( sz > max_size )
            //    sz
            goto begin;
      { // :    
         int ia = new int[ sz ];
         doit( ia, sz ) ;
         delete [] ia;
      }
      end:
      ;
   }

     goto      
.     ,    
   , ,    .
   goto     if  .   -
   goto,      , 
        .

                             5.11.   

      3  4        ++. 
    ,   ,  
 . (  6    ,  
 .)        ,   
         13. (   
     ++, ,   .. 
   ,        , 
   2.3  3.15.
       ,    
       (    
   ).       
   (      
,      ). ,  
   ,  .
       ?  (insert),  (remove) 
 (find)  .  ,    
(size),    (display),    . 
 ,   (reverse)   (concatenate) .
      size()   ,  
.        ;  

                                                              ++   227

,      insert()  remove() 
    .
         size()     
 .  ,      
 ,        .
   (        
 ,      ,   
,         
     size()   ,  
,    .)
    insert()      :    
    ,     .
,  

   1 1 2 3 8



   mylist.insert (pointer_to_3, 5);

   :

   1 1 2 3 5 8

      ,     
   .     
  find()      :

   pointer_to_3 = mylist.find( 3 );

   find()       .    
 ,    ,  find()  0.
         :      . 
    :

   insert_front( value );
   1nsert_end( value );

          , 
    :

   remove( value );
   remove_front();
   remove_all();

                                                            ++   228

    display()       .  
   :

   (0)( )

     :

   (7) ( 0 1 1 2 3 5 8 )

reverse()     .  

   mylist.reverse();

    :

   (7) ( 8 5 3 2 1 1 0 )

         . ,  
:

   (4)( 0 1 1 2 ) // listl
   (4)( 2 3 5 8 ) // list2



   listl.concat( list2 );

 list1 

   (8) ( 0 1 1 2 2 3 5 8 )

          ,  
  remove():

   listl.remove( 2 );

       ,     . 
 (list)    (list_item)    
. (  ,     
.      ilist  ilist_item.)
       : _at_front    , _at_end 
    _size   .   
 ilist       0.  
  :

                                                             ++   229

   class ilist_item;

   class ilist {
   public:
      //   
      ilist() : _at_front( 0 ),
                _at_end( 0 ), _size( 0 ) {}
      // ...
   private:
      ilist_item *_at_front;
      ilist_item *_at_end;
      int _size;
   };

         ilist, :

   ilist mylist;

   .     . 
  size()        
:

   inline int ilist::size() { return _size; }

      :

   int size = mylist.size();

             
  (    ,     
  ).    
         
.    ilist   :

   class ilist {
   public:
      //   
      ilist();
      int size();
      // ...
   private:
      //  
      //     
      ilist( const ilist& );
      ilist& operator=( const ilist& );
      // -  
   };

         ,   
main()        ilist:

                                                           ++   230

   int main()
   {
      ilist yourlist( mylist ); // 
      mylist = mylist; // 
   }

       ,      
:

   class ilist_item {
   public:
      // ...
   private:
      int _value;
      ilist_item *_next;
   };

    _value  ,  _next      0.
    ilist_item       
   ilist_item.    ,  
 ilist_item      . ,  

   0 1 1 2 5

 

   ilist_item ( 3, pointer_to_2 );

  :

   0 1 1 2 3 5

     ilist_item. (,     
.         ,
   0.      
,     ;     7.)

                                                               ++   231

   class ilist_item {
   public:
      ilist_item( int value, ilist_-item *item_to_link_to = 0 );
        // ...
   };

   inline
   ilist_item::
   ilist_item( int value, ilist_item *item )
      : _value( value )
   {
      if ( item )
         _next = 0;
      else {
         _next = item->_next;
         item->_next = this;
   }

    insert()          
 ,    .   
   .     ?

   inline void
   ilist::
   insert( ilist_item *ptr, int value )
   {
      new ilist_item( value, ptr );
      ++_size;
   }

        ,       .
      ,     
   .     ? 
  ,    abort(),  
  cstdlib:

   #include <cstdlib>
   // ...
   if ( ! ptr )
   abort();

    ,    assert().     
,     :

   #include <cassert>
   // ...
   assert( ptr != 0 );

       :

                                                              ++   232

   if ( ! ptr )
      throw "Panic: ilist::insert(): ptr == O";

          :  
       ,  
    .
         ,   , 
   :    
  ,      .
        :     
       :

   if ( ! ptr )
      insert_front( value );

          .   size() 
_size   ,    .  
  size()  ,     
 ,  _size   . :

   ++_size;

    insert()     
 .    ,     ,
  insert_front(), insert_end()      .  
        , 
   :

   inline void ilist::bump_up_size() { ++_size; }
   inline void ilist::bump_down_size() { --_size; }

        ,   . 
  insert():

   inline void
   ilist::
   insert( ilist_item *ptr, int value )
     if ( !ptr )
        insert_front( value );
     else {
        bump_up_size();
        new ilist_item( value, ptr );
      }
   }

                                                           ++   233

     insert_front()  insert_end()  .  
     ,   .

   inline void
   ilist::
   insert_front( int value )
   {
      ilist_item *ptr = new ilist_item( value );

      if ( !_at_front )
         _at_front = _at_end = ptr;
      else {
         ptr->next( _at_front );
         _at_front = ptr;
      }
      bump_up_size();
   }

   inl-ine void
   ilist::
   insert_end( int value )
   {
      if ( !_at_end )
         _at_end = _at_front = new ilist_item( value );
      else _at_end = new ilist_item( value, _at_end );
         bump_up_s-ize();
   }

find()    .      ,
  ,  find()  0.  find() :

   ilist_item*
   ilist::
   find( int value )
   {
      ilist_item *ptr = _at_front;
      while ( ptr )
      {
         if ( ptr->value() == value )
            break;
         ptr = ptr->next();
      }
      return ptr;
   }

 find()    :

   ilist_item *ptr = mylist.find( 8 );
   mylist.insert( ptr, some_value );

    :

                                                           ++   234
   mylist.insert( mylist.find( 8 ), some_value );

         ,    
display(),     .  display()  :
  ,    .    ,   
 ?

   //   !

   for ( ilist_item *iter = _at_front; //   
          iter != _at_end; //   
          ++iter ) //  
              cout << iter->value() << ' ';
         //   
   cout << iter->value();

       ,       .
 

   ++iter;

       .      
 ,     ,      
.        _next 
ilist_item:

   iter = iter->_next;

        ilist_item   .
  ilist_item   :

   class ilist_item {
   public:
      ilist_item( int value, ilist_item *item_to_link_to = 0 );
      int value() { return _value; }
      iilst_item* next() { return _next; }
      void next( ilist_item *link ) { _next = link; }
      void value( int new_value ) { _value = new_value; }
   private:
      int _value;
      ilist_item *_next;
   };

      display(),    
ilist_item:

                                                            ++   235

   #include <iostream>

   class ilist {
   public:
      void display( ostream &os = cout );
      // ...
   };

   void ilist::
   display( ostream &os )
   {
      os << "\n( " << _size << " )( ";

      ilist_item *ptr = _at_front;
      while ( ptr ) {
         os << ptr->value() << " ";
         ptr = ptr->next();
      }

      os << ")\n";

   }

        ilist     
  :

                                                             ++   236

   #include <iostream>
   #include "ilist.h"

   int main()
   {
      ilist mylist;
      for ( int ix = 0; ix < 10; ++ix ) {
         mylist.insert_front( ix );
         mylist.insert_end( ix );
      }
      cout <<
             "Ok:  insert_front()  insert_end()\n";
      mylist.display();

      ilist_item *it = mylist.find( 8 );
      cout << "\n"
             << "  8: ?"
             << ( it ? " !\n" : " !\n" );

      mylist.insert( it, 1024 );
      cout << "\n" <<
      "  1024  8\n";

       mylist.display();
       int elem_cnt = mylist.remove( 8 );
       cout << "\n"
              << " " << elem_cnt
              << " ()   8\n";

      mylist.display();
      cout << "\n" << "  \n";

      mylist.remove_front(); mylist.display();

       cout << "\n" << "  \n";
       mylist.remove_all(); mylist.display();

   }

     :

   Ok:  insert_front()  insert_end()

   (20)( 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 )

     8: ? !

     1024  8

   ( 21 )( 9 8 1024 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 )

    2 ()   8

   ( 19 )( 9 1024 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 9 )

     

   ( 18 )( 1024 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 9 )

     

   ( 0 )( )

                                                          ++   237

     ,    .   
 :

   void remove_front();
   void remove_all ();
   int remove( int value );

       remove_front():

   int remove( int value );

   inline void
   i1ist::
   remove_front()
   {
      if ( _at_front ) {
         ilist_item *ptr = _at_front;
         _at_front = _at_front->next();
         bump_down_size() ;
         delete ptr;
      }
   }

remove_all()  remove_front()   ,     
:

   void ilist::
   remove_all()
   {
      while ( _at_front )
         remove_front();
         _size = 0;
         _at_front = _at_end = 0;
   }

     remove()   remove_front()  
 ,    ()    .
      .  , 
,    _next.   :

                                                            ++   238

   int ilist::
   remove( int value )
  {
      ilist_item *plist = _at_front;
      int elem_cnt = 0;

      while ( plist && plist->value() == value )
      {
         plist = plist->next();
         remove_front();
         ++elem_cnt;
      }

      if ( ! plist )
         return elem_cnt;

      ilist_item *prev = plist;
      plist = plist->next();

      while ( plist ) {
         if ( plist->value() == value ) {
            prev->next( plist->next() );
            delete plist;
            ++elem_cnt;
            bump_down_size();
            plist = prev->next();

            if ( ! plist ) {
               _at_end = prev;
               return elem_cnt;
            }
         }
         else {
            prev = plist;
            plist = plist->next();
         }

         return elem_cnt;
   }

          :  
    ,   ,   
     ,    .

                                                             ++   239

   #include <iostream>
   #include "ilist.h"

   int main()
   {
      ilist mylist;
      cout << "\n-----------------------------------------------\n"
           << " #1: -   \n"
           << "-----------------------------------------------\n";

      mylist.insert_front( 1 ); mylist.insert_front( 1 );
      mylist.insert_front( 1 );

      my1ist.insert_front( 2 ); mylist.insert_front( 3 );
      my1ist.insert_front( 4 );

      mylist.display();

      int elem_cnt = mylist.remove( 1 );
      cout << "\n" << " " << elem_cnt
           << " ()   1\n";

      mylist.display();

      mylist.remove_all();

      cout << "\n-----------------------------------------------\n"
           << " #2: -   \n"
           << "-----------------------------------------------\n";

      mylist.insert_front( 1 ); mylist.insert_front( 1 );
      mylist.insert_front( 1 );

      mylist.display();

      elem_cnt = mylist.remove( 1 );

      cout << "\n" << " " << elem_cnt
           << " ()   1\n";
      mylist.display();

      mylist.remove_all () ;

      cout << "\n-----------------------------------------------\n"
           << " #3: -    \n"
           << "-----------------------------------------------\n";

      mylist.insert_front( 0 ); mylist.insert_front( 2 );
      mylist.insert_front( 4 );

      mylist.display();

      elem_cnt = mylist.remove( 1 );

      cout << "\n" << " " << elem_cnt
           << " ()   1\n";
      mylist.display();

      mylist.remove_all () ;

      cout << "\n-----------------------------------------------\n"
           << " #4: -      \n"
           << "-----------------------------------------------\n";

      my1ist.insert_front( 1 ); mylist.insert_front( 1 );
      my1ist.insert_front( 1 );

      my1ist.insert_front( 0 ); mylist.insert_front( 2 );
      my1ist.insert_front( 4 );

      mylist.insert_front( 1 ); my1ist.insert_front( 1 );
      mylist.insert_front( 1 );

      mylist.display() ;

      elem_cnt = mylist.remove( 1 );
      out "\n" " " elem nt

                                                               ++   240

   }

     :

   -----------------------------------------------
    #1: -   
   -----------------------------------------------

   ( 6 )( 4 3 2 1 1 1 )

    3 ()   1

   ( 3 )( 4 3 2 )

   -----------------------------------------------
    #2: -   
   -----------------------------------------------

   ( 3 )( 1 1 1 )
    3 ()   1
   ( 0 )( )

   -----------------------------------------------
    #3: -    
   -----------------------------------------------
   ( 3 )( 4 2 0 )
    0 ()   1
   ( 3 )( 4 2 0 )

   -----------------------------------------------
    #4: -      
   -----------------------------------------------
   (9 )( 1 1 1 4 2 0 1 1 1 )

    6 ()   1

   ( 3 )( 4 2 0 )

     ,    ,    
(     )   (   
).   concat()  .    
?

   void ilist::concat( const ilist &i1 ) {
      if ( ! _at_end )
         _at_front = i1._at_front;
      else _at_end->next( i1._at_front );
         _at_end = i1._at_end;
   }

      ,     ilist  
    .    ,   
insert()  remove(),   ,     .
          .
     insert_end():

   void ilist::concat( const ilist &i1 ) {
      if ( ! _at_end )
         _at_front = i1._at_front;
      else _at_end->next( i1._at_front );
         _at_end = i1._at_end;

                                                                ++   241

   }

      reverse():

   void ilist::
   concat( const ilist &i1 )
   {
      i1ist_item *ptr = i1._at_front;
      while ( ptr ) {
         insert_end( ptr->value() );
         ptr = ptr->next();
      }

   void
   ilist::
   reverse()
   {
      ilist_item *ptr = _at_front;
      ilist_item *prev = 0;

      _at_front = _at_end;
      _at_end = ptr;

      while ( ptr != _at_front )
      {
         ilist_item *tmp = ptr->next();
         ptr->next( prev );
         prev = ptr;
         ptr = tmp;
      }
      _at_front->next( prev );

   }

          :

                                                                ++   242

   #include <iostream>
   #include "ilist.h"

   int main()
   {
      ilist mylist;

      for ( int ix = 0; ix < 10; ++ix )
      { mylist.insert_front( ix ); }

      mylist.display();

      cout << "\n" << " \n";
      mylist.reverse(); mylist.display();

      ilist mylist_too;
      mylist_too.insert_end(0); mylist_too.insert_end(1);
      mylist_too.insert_end(1); mylist_too.insert_end(2);
      mylist_too.insert_end(3); mylist_too.insert_end(5);

      cout << "\n" << "mylist_too:\n";
      mylist_too.display();

      mylist.concat( mylist_too );
      cout << "\n"
           << "mylist  concat  mylist_too:\n";
      mylist.disp1ay();
   }

     :

   ( 10 ) ( 9 8 7 6 5 4 3 2 1 0 )
    
   ( 10 ) ( 0 1 2 3 4 5 6 7 8 9 )
   mylist_too:
   ( 6 )( 0 1 1 2 3 5 )
   mylist  concat  mylist_too:
   ( 16 ) ( 0 1 2 3 4 5 6 7 8 9 0 1 1 2 3 5 )

     ,    :     
 ,     .   , 
   ,     
.
        ,      
        ,    
.       
       .    
    ,      .
          
.   ,   
,      (, ,   
,     ),      

                                                          ++   243

  .      -
,    . (  14.5 , 
        .) 
 ,   insert_end():

   ilist::ilist( const ilist &rhs )
   {
      ilist_item *pt = rhs._at_front;
      while ( pt ) {
         insert_end( pt->value() );
         pt = pt->next();
      }
   }

        remove_all(),    
insert_end()     .   
   ,      insert_all():

   void ilist::insert_all ( const ilist &rhs )
   {
      ilist_item *pt = rhs._at_front;
      while ( pt ) {
         insert_end( pt->value() );
         pt = pt->next();
      }
}

         :

   inline ilist::ilist( const ilist &rhs )
      : _at_front( 0 ), _at_end( 0 )

   { insert_all ( rhs ); }

      inline ilist&
      ilist::operator=( const ilist &rhs ) {
         remove_all();
         insert_all( rhs );
         return *this;
   }

          ,
      _at_front:

   ilist_item *ilist::front() { return _at_front(); }

       ilist_item::next(),     -:

                                                           ++   244

   ilist_item *pt = mylist.front();
   while ( pt ) {
      do_something( pt->value() );
      pt = pt->next();
   }

      ,   :   
   .       
  :

   for ( ilist_item *iter = mylist.init_iter();
      iter;
      iter = mylist.next_iter() )

   do_something( iter->value() );

(  2.8     .   6  12  
         
.)
        ,   .  
   ,    ,  
 .      _at_front,
         .
next_iter()     0,    . 
     :

   class ilist {
   public:
      // ...
      init_iter( ilist_item *it = 0 );
   private:
      //...
      ilist_item *_current;
  };

init_iter()  :
 
   inline ilist_item*
   ilist::init_iter( i1ist_item *it )
   {
      return _current = it ? it : _at_front;
   }

next_iter()   _current      
,    .      0  
_current  0.      :

                                                             ++   245

   inline ilist_item*
   ilist::
   next_iter()
   {
      ilist_item *next = _current
         ? _current = _current->next()
         : _current;

      return next;
   }

    ,    _current, ,   . 
    remove()  remove_front():  
  _current.      , 
  ,         0, 
         . 
remove_front()  :

   inline void
   ilist::remove_front()
   {
      if ( _at_front ) {
         ilist_item *ptr = _at_front;
         _at_front = _at_front->next();

         // _current      
         if ( _current == ptr )
            _current = _at_front;
         bump_down_size();
         delete ptr;
      }
   }

       remove():

   while ( plist ) {
      if ( plist->value() == value )
      {
         prev->next( plist->next() );
         if ( _current == plist )
      _current = prev->next();

    ,      ,    _current?
 _current  .       
  init_iter(),       . 
       _current  , 
  0.
          
  ::

                                                           ++   246

   #include <iostream>
   #include "ilist.h"

   int main()
   {
      ilist mylist;

      for ( int ix = 0; ix < 10; ++ix ) {
         mylist.insert_front( ix );
         mylist.insert_end( ix );
      }

      cout << "\n" << " init_iter()  next_iter() "
             << "    :\n";

      ilist_item *iter;
      for ( iter = mylist.init_iter();
             iter; iter = mylist.next_iter() )
         cout << iter->value() << " ";

      cout << "\n" << "  \n";

      ilist mylist2( mylist );
      mylist.remove_all();

      for ( iter = mylist2.init_iter();
             iter; iter = mylist2.next_iter() )
         cout << iter->value() << " ";

      cout << "\n" << "   \n";
      mylist = mylist2;

      for ( iter = mylist.init_iter();
         iter; iter = mylist.next_iter() )
            cout << iter->value() << " ";

      cout << "\n";

  }

     :

    init_iter()  next_iter()     :
   9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9
     
   9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9
      
   9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9

                                5.11.1.  

     ilist   :      
.           ,  
 ,         .
 ilist       
 (.  16).

                                                              ++   247

           .
:

   list< string > slist;

  ,     string, 

   list< int > ilist;

 ,     ilist.     
       .
  ,     list_item.
         template,  
    .    ,
     class  typename. :

   class list_item;

      list_item     -
.    :

   class list_item;

     class  typename   ,  
  .     typename    ++
       .  
       ,    class.
  list_item  :

                                                                ++   248

   template <class elemType>
   class list_item {
   public:
      list_item( elemType value, list_item *item = 0 )
            : _value( value ) {
        if ( !item )
            _next = 0;
         else {
            _next = item->_next;
            item->_next = this;
         }
      }

      elemType value() { return _value; }
      list_item* next() { return _next; }

      void next( list_item *link ) { _next = link; }
      void value( elemType new_value ) { _value = new_value; }
   private:
      elemType _value;
      list_item *_next;
   };

      int    ilist_item   
elemType.   :

   list_item<doub1e> *ptr = new list_item<doub1e>( 3.14 );

  double  elemType    list_item,
  .
       ilist    list:

                                                            ++   249

   template <class elemType>
   class list {
   public:
      list()
         : _at_front( 0 ), _at_end( 0 ), _current( 0 ),
            _size( 0 ) {}

      1ist( const list& );
      list& operator=( const list& );
      ~list() { remove_all(); }

      void insert ( list_item<elemType> *ptr, elemType value );
      void insert_end( elemType value );
      void insert_front( elemType value );
      void insert_all( const list &rhs );

      int remove( elemType value );
      void remove_front();
      void remove_all();

      list_item<elemType> *find( elemType value );
      list_item<elemType> *next_iter();
      list_item<elemType>* init_iter( list_item<elemType> *it );

      void disp1ay( ostream &os = cout );

      void concat( const list& );
      void reverse ();
      int size() { return _size; }

   private:
      void bump_up_size() { ++_size; }
      void bump_down_size() { --_size; }
      list_item<elemType> *_at_front;
      1ist_item<elemType> *_at_end;
      list_item<elemType> *_current;
      int _size;
   };

      list    ,     ilist.
    ,     
     .
   (        ++. 
 6      , 
  ++. ,     ,
   ,     , 
;      2  3.)
           . 
     list, ,  ,  
   .        
 . ,     ,  
    .
           , 
        
         
 .    ,  

                                                             ++   250

    .   ++   
  std.        :

   namespace Primer_Third_Edition
   {
      template <typename elemType>
      class list_item{ ... };

      template <typename elemType>
      class list{ ... };

      // ...

   }

           
:

   //   
   #include "list.h"

   //      
   using namespace Primer_Third_Edition;

   //      list
   list< int > ilist;
   // ...

   (     8.5  8.6.)

                                   5.16

        ilist_item,     
  .    ,    
  ,   _next, , ,  
   .     
,    ilist_item:

   ilist_item::~ilist_item()
   {
      delete _next;
   }

      remove_all()  remove_front()  ,  
   .

                                    5.17

     ilist    :

   void ilist::remove_end();

                                                                 ++   251

   void ilist::remove( ilist_item* );

     ,     ?  .

                                     5.18

     find() ,      
,     .     , 
   . (    , 
  ,      . ,
   find(),    .)

   class ilist {
   public:
      // ...
      ilist_item* find( int value, ilist_item *start_at = 0 );
      // ...
   };

                                      5.19

      find(),   count(),  
     .  
.

                                      5.20

    insert(int value) ,     
  ilist_item.

                                      5.21

      insert(),  :

   void ilist::
   insert( ilist_item *begin,
      int *array_of_value,
   int elem_cnt );

 array_of_value    ,     ilist,
elem_cnt     ,  begin   ,   
. ,   ilist:

   (3)( 0 1 21 )

 :

   int ia[] = { 1, 2, 3, 5, 8, 13 };

   

                                                                  ++   252

   mylist.insert( it, ia, 6 );

   :

   (9) ( 0 1 1 2 3 5 8 13 21 )

                                 5.22

    concat()  reverse()   .   
.    ,    
ilist:

   ilist ilist::concat_copy( const ilist &rhs );
   ilist_item *it = mylist.find( 1 );
   ilist ilist::reverse_copy();
