/* C++ style program use vector, sort(), iostreams read or generate N numbers optionally sort them - Bjarne Stroustrup - http://www.research.att/~bs */ #include #include #include #include using namespace std; /* command line argument handling: prog 1 - read from cin and sort prog 0 - read from cin (don't sort) prog 1 file - read from file and sort prog 0 file - read from file (don't sort) prog 1 5000000 - generate 500,000 elements and sort prog 0 5000000 - generate 500,000 elements (don't sort) an optional 3rd argument controls preallocation. */ int main(int argc, char* argv[]) { int max = 0; // by default: read from cin int res = 1000; // by default: grow incrementally bool s = true; // by default: sort char* file = 0; switch (argc) { // s { max | file } res case 4: res = atoi(argv[3]); case 3: max = atoi(argv[2]); if (max == 0) file = argv[2]; case 2: s = atoi(argv[1]); break; default: cerr << "wrong number of arguments\n"; exit(1); } vector buf; buf.reserve(res); // logically redundant; for efficiency only double d; double median = 0; double mean = 0; if (max) { cout << argv[0] << ": C++ style generate " << max << endl; for (int i = 0; i>d) { buf.push_back(d); mean = (buf.size()==1) ? d : mean+(d-mean)/buf.size(); // prone to rounding errors } } else { cout << "read cin\n"; while(cin>>d) { buf.push_back(d); mean = (buf.size()==1) ? d : mean+(d-mean)/buf.size(); // prone to rounding errors } } if (s) { cout << "sort\n"; sort(buf.begin(),buf.end()); } if (buf.size()) { int mid = buf.size()/2; median = (buf.size()%2) ? buf[mid] : (buf[mid-1]+buf[mid])/2; } cout << "number of elements = " << buf.size() << ", median = " << median << ", mean = " << mean << endl; }