License Public Domain
Lines 137
Keywords
PointSort (4)
Permissions
Owner: jsimones
Group Owner: SnortSnort
Viewable by Everyone
Editable by All Siafoo Users

Stou's I/O and sorting assignment Atom Feed 0

# 's
  1/*
2Simple I/O "Assignment"
3
4The "assignment":
5
61. Load a file of arbitrary length that is composed of 3 tab-separated columns
7 with floating point numbers representing x, y, z coordinates of points. Lines
8 starting with the pound character (i.e. #) are comments and your program
9 should ignore them.
10
112. Accept file on the command lines:
12 $ ./a.out some_data.dat
13
143. Use STL sort to sort all data points beyond the first by their distance from
15 the first data point (shortest to longest).
16
174. Output sorted list as x y z distance use only 4 significant figures (output
18 only once we can compare speed and correctness with a script later).
19
205. (bonus) Implement your own sorting method and compare to STL method.
21
226. (bonus) Try some of the Boost libraries
23
247. (bonus) Accept command line arguments to pick algorithm, sort order, data
25 points. Try Boost Program Options
26
27C++ suggestions:
28
291. Write a C++ class (or struct) that represents a vector (you can templatize it
30 on a constant to make it N dimensional yet relatively efficient)
31
322. Overload >> input operator to read things from the file in a more idiomatic
33 way
34
353. Overload << output operator to print things from the file in a more idiomatic
36 way
37
384. Use an STL container to store loaded vectors. You can probably pull it off by
39 dynamically growing your own arrays, or maybe reading the file twice but the
40 STL stuff will work better and it's easier.
41
42Warning
43 C++ has a datatype called vector, this is a dynamic list not a mathematical
44 vector.
45
465. Look at the pow<N>(x) routine in the boost math library (under
47 special_functions).
48
49Oh and I suggest sticking to the standard libraries (STL and Python)... if you
50decide to use stuff from Boost and numpy it would probably be good to implement
51your own too and compare them.
52
53*/
54#include <iostream>
55#include <fstream>
56#include <sstream>
57#include <vector>
58#include <cmath>
59using namespace std;
60
61struct Point
62{
63 float x, y, z, r;
64 int use_default;
65};
66
67struct dist_compare
68{
69 bool operator() (Point const& a, Point const& b) {
70 return a.r < b.r;
71 }
72};
73
74int set_options(int argc, char* argv[], Point& p0)
75{
76 vector<string> args (argv + 2, argv + argc);
77
78 p0.use_default = 1;
79 for (int i = 0; i < args.size(); i++) {
80 if (args[i] == "-xyz") {
81 istringstream sstream (args[i+1] + " " + args[i+2] + " " + args[i+3]);
82 sstream >> p0.x;
83 sstream >> p0.y;
84 sstream >> p0.z;
85 p0.use_default = 0;
86 }
87 }
88
89 return 0;
90}
91
92int get_coords(ifstream &fstream, vector<Point>& p_list)
93{/*
94 Build up a vector (of point objects) from x,y,z values in the given file.
95 Empty lines and lines starting with # are ignored.
96
97 */
98 float val;
99 string line;
100 Point p;
101
102 while (fstream.good()) {
103 getline(fstream, line);
104
105 // Skip empty lines or lines that start with #
106 if (line == "" || line[0] == '#') {
107 continue;
108 }
109
110 // Get floats from the line string, make the point, add to vector
111 istringstream sstream (line);
112 sstream >> p.x;
113 sstream >> p.y;
114 sstream >> p.z;
115
116 p_list.push_back(p);
117 }
118
119 return 0;
120}
121
122int calc_dist(vector<Point>& p_list, Point& p0)
123{
124 if (p0.use_default == 1) {
125 p0.x = p_list[0].x;
126 p0.y = p_list[0].y;
127 p0.z = p_list[0].z;
128 }
129
130 for (int i = 0; i < p_list.size(); i++) {
131 p_list[i].r = sqrt(pow(p_list[i].x - p0.x, 2) +
132 pow(p_list[i].y - p0.y, 2) +
133 pow(p_list[i].z - p0.z, 2));
134 }
135
136 return 0;
137}
138
139int dist_sort(vector<Point>& p_list)
140{
141 sort(p_list.begin(), p_list.end(), dist_compare());
142
143 return 0;
144}
145
146int pretty_print(vector<Point>& p_list)
147{
148 for (int i = 0; i < p_list.size(); i++) {
149 printf("%.4f\t%.4f\t%.4f\t%.4f\n",
150 p_list[i].x, p_list[i].y, p_list[i].z, p_list[i].r);
151 }
152}
153
154int main (int argc, char* argv[])
155{
156 string filename = argv[1];
157
158 Point p0;
159 set_options(argc, argv, p0);
160
161 // Build the point list
162 vector<Point> p_list;
163 ifstream fstream (filename.c_str());
164 get_coords(fstream, p_list);
165 fstream.close();
166
167 // Calculate distances
168 calc_dist(p_list, p0);
169
170 // Sort the points based on distances
171 dist_sort(p_list);
172
173 // Print the point coords and distances
174 pretty_print(p_list);
175
176 return 0;
177}

Comments

over 3 years ago (27 Feb 2013 at 06:08 PM) by msgordon
One thing about C++ that I think we should discuss this week is the usage of 'struct' vs 'class' data structures. Since my first programming language was Java, I gravitate towards classes overs structs, but I don't really understand the difference.
over 3 years ago (28 Feb 2013 at 07:42 PM) by Stou S.
They are the same thing except by default all things inside a struct are public while in a class by default they are private.
over 3 years ago (28 Feb 2013 at 07:35 PM) by jsimones
I don't get the difference either. I still feel like I'm kludging things together until it works rather than writing legit c++ code.