/*

Author : Ravi K Srivastava

Date: 05/22/2001 Tuesday

Purpose: this program is created to use single subscripted array to store 20 different numbers

in the range from 10..100 inclusive. if at any point user enters duplicate value, then 

 a warning will be displayed about the duplicate number.

Note: I have used integer array of 3 elements to do this.

*/

#include 

#include 

#define MINRANGE 10

#define MAXRANGE 100

#define FIRST_SLOT 32

#define SECOND_SLOT 64

int rvCheckNum(unsigned int rvSource, unsigned int rvNum);

unsigned int rvAddNum(unsigned int rvSource, unsigned int rvNum);

void main()

    {

     unsigned int rvArray[3] = {0, 0, 0};

     unsigned int rvNum;

     unsigned int rvRelativeOffset;

     int rvFlag;

     for (int i = 0; i<20; i++)

         {

         cout << "Enter the number (10..100 inclusive) :";

         cin >> rvNum;

        

         if(rvNum < MINRANGE || rvNum > MAXRANGE)

             {

             cout << "Number Out of Bound" << endl;

             continue;

             }

             if(rvNum - MINRANGE < FIRST_SLOT )

                 {

                 rvRelativeOffset = rvNum - MINRANGE;

                 rvFlag = rvCheckNum(rvArray[0], rvRelativeOffset);

                 if(!rvFlag)

                     {

                     cout << rvNum << " already Present"<< endl;

                     }

                     else

                         {

                         rvArray[0] = rvAddNum(rvArray[0], rvRelativeOffset);

                         }

                         }

                         else if(rvNum - 10 < SECOND_SLOT)

                             {

                             rvRelativeOffset = rvNum - FIRST_SLOT - MINRANGE;

                             rvFlag = rvCheckNum(rvArray[1], rvRelativeOffset);

                             if(!rvFlag)

                                 {

                                 cout << rvNum << " already Present"<< endl;

                                 }

                                 else

                                     {

                                     rvArray[1] = rvAddNum(rvArray[1], rvRelativeOffset);

                                     }

                                     }

                                     else

                                         {

                                         rvRelativeOffset = rvNum - SECOND_SLOT - MINRANGE;

                                         rvFlag = rvCheckNum(rvArray[2], rvRelativeOffset);

                                         if(!rvFlag)

                                             {

                                             cout << rvNum << " already Present"<< endl;

                                             }

                                             else

                                                 {

                                                 rvArray[2] = rvAddNum(rvArray[2], rvRelativeOffset);

                                                 }

                                                 }

                                                 }

                                            }

                                            int rvCheckNum(unsigned int rvSource, unsigned int rvNum)

                                                {

                                                 unsigned int rvTemp;

                                                 unsigned int rvComp = (unsigned int)pow(2, sizeof(int)*8 - 1);

                                                 rvTemp = rvSource << rvNum ;

                                                 if(rvTemp >= rvComp)

                                                 return 0;

                                                 return 1;

                                            }

                                            unsigned int rvAddNum(unsigned int rvSource, unsigned int rvNum)

                                                {

                                                 unsigned int rvMask = (unsigned int)pow(2,(sizeof(unsigned int)*8 - rvNum -1));

                                                 rvSource = rvSource | rvMask;

                                                 return rvSource;

                                            }