Bjarne Stroustrup “Programming Principles and Practice Using C++”
Chapter 11 Exercise 16
Using std_lib_facilities.h by Bjarne Stroustrup.
[code language=”cpp”]
// Philipp Siedler
// Bjarne Stroustrup’s PPP
// Chapter 11 Exercise 16
#include "std_lib_facilities.h"
int main()
try
{
cout << "enter name for input file" << endl;
string iname = "input/";
string itemp;
cin >> itemp;
iname += itemp;
ifstream ifs{ iname };
if (!ifs) { cout << "could not open input file." << endl; }
cout << "enter name for output file" << endl;
string oname = "output/";
string otemp;
cin >> otemp;
oname += otemp;
ofstream ofs{ oname };
if (!ofs) { cout << "could not open output file." << endl; }
vector<double> nums;
for (double d; ifs >> d;) {
nums.push_back(d);
}
sort(nums);
for (int i = 0; i < nums.size(); i++) {
cout << i << " " << nums[i] << endl;
}
int count = 1;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] == nums[i – 1]) {
count++;
}
else {
ofs << nums[i – 1];
if (count > 1) {
ofs << " " << count << endl;
count = 1;
}
else {
ofs << endl;
}
}
if (i == nums.size() – 1 && nums[i] == nums[i – 1]) {
if (count == 1) {
count++;
}
ofs << nums[i];
ofs << " " << count << endl;
ofs << endl;
}
}
keep_window_open();
}
catch (runtime_error e) {
cout << e.what() << endl;
keep_window_open();
}
catch (…) {
cout << "Exiting" << endl;
keep_window_open();
}
[/code]
Output: enter name for input file p409_16_random_num.txt enter name for output file p409_16_random_num_out.txt Please enter a character to exit
Input-File: p409_16_random_num.txt 58 32 50 80 54 13 24 82 52 17 17 8 87 12 35 42 88 72 46 91 69 60 84 55 99 21 6 25 53 13 75 83 94 2 71 35 85 50 71 99 60 47 68 29 100 54 45 66 4 98 57 13 23 3 8 9 47 67 17 52 5 60 73 28 18 45 5 7 99 78 78 17 3 87 37 33 83 92 83 99 45 75 28 73 66 44 11 73 9 24 29 39 52 99 24 95 8 91 90 99 100
Input-File: p409_16_random_num_out.txt 2 3 2 4 5 2 6 7 8 3 9 2 11 12 13 3 17 4 18 21 23 24 3 25 28 2 29 2 32 33 35 2 37 39 42 44 45 3 46 47 2 50 2 52 3 53 54 2 55 57 58 60 3 66 2 67 68 69 71 2 72 73 3 75 2 78 2 80 82 83 3 84 85 87 2 88 90 91 2 92 94 95 98 99 6 100 2