Lines 137
PointSort (4)
##### Permissions
Owner: jsimones
Group Owner: SnortSnort
Viewable by Everyone
Editable by All Siafoo Users
Stay up to dateembedded code automagically updates, each snippet and article has a feed

# Stou's I/O and sorting assignment 0

 Language C++
# '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;101102  while (fstream.good()) {103    getline(fstream, line);104105    // Skip empty lines or lines that start with #106    if (line == "" || line[0] == '#') {107      continue;108    }109110    // Get floats from the line string, make the point, add to vector111    istringstream sstream (line);112    sstream >> p.x;113    sstream >> p.y;114    sstream >> p.z;115    116    p_list.push_back(p);117  }118119  return 0;120}121122int 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  }129130  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  }135136  return 0;137}138139int dist_sort(vector<Point>& p_list)140{141  sort(p_list.begin(), p_list.end(), dist_compare());142143  return 0;144}145146int 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}153154int main (int argc, char* argv[])155{156  string filename = argv[1];157158  Point p0;159  set_options(argc, argv, p0);160161  // Build the point list162  vector<Point> p_list;163  ifstream fstream (filename.c_str());164  get_coords(fstream, p_list);165  fstream.close();166167  // Calculate distances168  calc_dist(p_list, p0);169  170  // Sort the points based on distances171  dist_sort(p_list);172173  // Print the point coords and distances174  pretty_print(p_list);175176  return 0;177}`