Data
Fields: City, Province, Population, Population Growth in %Toronto,ON,2615060,9.63 Montreal,QC,1649519,6.62 Calgary,AB,1096833,42.8 Ottawa,ON,833391,22.5 Edmonton,AB,812201,31.79 Missasauga,ON,713443,31.06 Winnipeg,MB,663617,7.3 Vancouver,BC,603502,17.41 Brampton,ON,523911,96.31 Hamilton,ON,519949,11.15
The code:
// // main.cpp // Dec5Class // // Created by Mark Brautigam on 12/5/16. // Copyright © 2016 Mark Brautigam. All rights reserved. // #include <iostream> #include <vector> #include <string> #include <fstream> #include <sstream> #include <iomanip> using namespace std; struct City { string name; string province; int population; double delta; }; string baseDir = "/Users/markb/Desktop/"; void split(const string &s, char delim, vector<string> &elems) { //------------------------------------------------------- // This function splits a line into a vector of strings // based on a separating character, such as a comma. // s is the input string // delim is the separating character. // elems is the vector that will hold the output. //------------------------------------------------------- stringstream ss; ss.str(s); string item; elems.clear(); while (getline(ss, item, delim)) { elems.push_back(item); } } void readFileIntoVector (string filepath, vector<City> &vc) { ifstream input; input.open(baseDir + "canada.csv"); string line; vector<string> fields; City city; while (!input.eof()) { // input >> line; getline(input, line); if (line.length() < 2) continue; split (line, ',', fields); city.name = fields[0]; city.province = fields[1]; city.population = atoi(fields[2].c_str()); city.delta = atof (fields[3].c_str()); vc.push_back(city); } return; } void printData(const vector<City> &vc, string fn) { ofstream output; output.open (fn); for (int i=0; i<vc.size(); i++) { output.width(15); output << left << vc[i].name << " "; output.width(5); output << left << vc[i].province << " "; output.width(10); output << right << vc[i].population << " "; output.width(8); output << right << fixed << setprecision(2) << vc[i].delta << " "; output << endl; } output.close(); } bool outOfOrder(const City &a, const City &b, int sortfield) { switch (sortfield) { case 0 : return a.name > b.name; case 1 : return a.province > b.province; case 2 : return a.population > b.population; case 3 : return a.delta > b.delta; default : return a.name > b.name; } } void bubblesort (vector<City> &vc, int sortfield) { for (int i=0; i<vc.size(); i++) { for (int j=0; j<vc.size()-1; j++) { // if (vc[j].delta > vc[j+1].delta) { if (outOfOrder (vc[j], vc[j+1], sortfield)) { City swap = vc[j]; vc[j] = vc[j+1]; vc[j+1] = swap; } } } } int requestSortfield() { cout << "Choose a field to sort on by number:\n"; cout << "0 : City\n"; cout << "1 : Province\n"; cout << "2 : Population\n"; cout << "3 : Population Change\n"; cout << "Your choice: "; int user; cin >> user; return user; } int main(int argc, const char * argv[]) { vector<City> cities; readFileIntoVector (baseDir + "canada.csv", cities); int sortfield = requestSortfield(); bubblesort (cities, sortfield); string outputFileName = baseDir + "canada-sorted-" + to_string(sortfield) + ".txt"; printData(cities, outputFileName); return 0; }
No comments:
Post a Comment