/**////////////////////////////////////////////////////// //// baidu Corp. ///// //// 2007.10.22 Paper Test in Nanjing. ////// ///////////////////////////////////////////////////// #include <iostream> #include <fstream> #include <sstream> #include <ctime> #include <vector> usingnamespace std; //we can also definie a class, then overload operator '>' and '<' to solve this problem. //And maybe use this method, have a kind of oo thinking. typedef struct tagip ...{ int a; int b; int c; int d; }_ip; /**//* *func: open file *parameter1: file stream [in] *parameter2: file name *return: file stream [out] */ fstream & open_file( fstream & s, conststring& file ) ...{ s.close(); s.clear(); s.open( file.c_str(), fstream::in ); return s; } /**//* *func: check the first num is less than the second one *parameter1: the first nums a[0].a[1].a[2].a[3] *parameter2: get the value required to check *parameter3: the num of checking *return ... */ int check_num( int a[], int& value, int i ) ...{ if( a[i] > value ) return1; if( a[i] == value ) return0; return-1; } /**//* *func: produce ip.txt *similar as: *10.0.0.0 10.0.0.1 *problem: cannot control the first number is less than the second one */ void produce_ip_file( conststring& filename ) ...{ fstream file; file.open( filename.c_str(), fstream::out ); srand( ( unsigned int )time( NULL ) ); //seed int i, j, value; int a[4]; //a[0].a[1].a[2].a[3] int index; string str_ip; for( i =0; i <40; i++ ) ...{ ostringstream stream_string; //format input value index =0; for( j =0; j <8; j++ ) ...{ if( j <4 ) ...{ a[j] = rand() %255; stream_string << a[j]; } else ...{ if( index ==0 ) ...{ do ...{ value = rand() %255; }while( ( index = check_num( a, value, j-4 ) ) ==1 ); stream_string << value; } elseif( index ==-1 ) ...{ stream_string << rand() %255; } } if( j !=3&& j !=7) ...{ stream_string <<"."; } elseif( j !=7 ) ...{ stream_string <<""; } } stream_string <<""; file << stream_string.str(); } file.close(); file.clear(); } /**//* *func: read ip from file, and decompose these data to structure *parameter1: filename *parameter2: this first ip-address is decomposed into struct *parameter3: this second ip-address is decomposed into struct */ void read_file( conststring& filename, vector< _ip *>& vec_ip1, vector< _ip*>& vec_ip2 ) ...{ fstream file; if( !open_file( file, filename ) ) ...{ cout <<"cannot open "<< filename << endl; return ; } int a1,b1,c1,d1; int a2,b2,c2,d2; string line; char c; while( getline( file, line ) ) ...{ istringstream stream(line); stream >> a1 >> c >> b1 >> c >> c1 >> c >> d1 >> a2 >> c >> b2 >> c >> c2 >> c >> d2; _ip * _p1 =new _ip; _p1 -> a = a1; _p1 -> b = b1; _p1 -> c = c1; _p1 -> d = d1; vec_ip1.push_back( _p1 ); _ip * _p2 =new _ip; _p2 -> a = a2; _p2 -> b = b2; _p2 -> c = c2; _p2 -> d = d2; vec_ip2.push_back( _p2 ); } } /**//* *func: get the minimun of the first ip-address and the maximun of the second ip-address --range *parameter1: this first ip-address is decomposed into struct *parameter2: this second ip-address is decomposed into struct *parameter3: the index of minimun *parameter4: the index of maximun */ void get_range( vector< _ip *>& vec_ip1, vector< _ip*>& vec_ip2, int& min, int& max ) ...{ min =0; max =0; int i =1; vector< _ip*>::const_iterator iter = vec_ip1.begin(); _ip * _min =*iter; ++iter; while( iter != vec_ip1.end() ) ...{ if( _min -> a > (*iter) -> a ) ...{ _min =*iter; min = i; } elseif( _min -> a == (*iter) -> a ) ...{ if( _min -> b > (*iter) -> b ) ...{ _min =*iter; min = i; } elseif( _min -> b == (*iter) -> b ) ...{ if( _min -> c > (*iter) -> c ) ...{ _min =*iter; min = i; } elseif( _min -> c == (*iter) -> c ) ...{ if( _min -> d > (*iter) -> d ) ...{ _min =*iter; min = i; } } } } ++i; ++iter; } iter = vec_ip2.begin(); _ip * _max =*iter; ++iter; i =1; while( iter != vec_ip2.end() ) ...{ if( _max -> a < (*iter) -> a ) ...{ _max =*iter; max = i; } elseif( _max -> a == (*iter) -> a ) ...{ if( _max -> b < (*iter) -> b ) ...{ _max =*iter; max = i; } elseif( _max -> b == (*iter) -> b ) ...{ if( _max -> c < (*iter) -> c ) ...{ _max =*iter; max = i; } elseif( _max -> c == (*iter) -> c ) ...{ if( _max -> d < (*iter) -> d ) ...{ _max =*iter; max = i; } } } } ++i; ++iter; } } int main( int argc, char**argv ) ...{ conststring filename("ip.txt"); produce_ip_file( filename ); vector< _ip *> vec_ip1; vector< _ip *> vec_ip2; read_file( filename, vec_ip1, vec_ip2 ); int min, max; get_range( vec_ip1, vec_ip2, min, max ); cout << vec_ip1[min]->a <<"."<< vec_ip1[min]->b <<"."<< vec_ip1[min]->c <<"."<<vec_ip1[min]->d <<"" << vec_ip2[max]->a <<"."<< vec_ip2[max]->b <<"."<< vec_ip2[max]->c <<"."<<vec_ip2[max]->d << endl; vector< _ip*>::iterator iter = vec_ip1.begin(); while( iter != vec_ip1.end() ) ...{ delete *iter; ++iter; } vec_ip1.clear(); iter = vec_ip2.begin(); while( iter != vec_ip2.end() ) ...{ delete *iter; ++iter; } vec_ip2.clear(); system("Pause"); return0; }