Accelerated C++ 6 split & find

xiaoxiao2021-02-28  52

split

split.h

#ifndef GUARD_split_h #define GUARD_split_h #include <vector> #include <string> bool space(char); bool not_space(char); std::vector<std::string> split(const std::string&); #endif

split.cpp

//source file split-related #include <cctype> #include <algorithm> #include "split.h" using std::string; using std::vector; bool space(char c) { return isspace(c); } bool not_space(char c) { return !isspace(c); } vector<string> split(const string& s) { vector<string> ret; typedef string::const_iterator c_iter; c_iter i_it = s.begin(); while (i_it != s.end()) { i_it = find_if(i_it, s.end(), not_space); c_iter j_it = i_it; j_it = find_if(j_it, s.end(), space); ret.push_back(string(i_it, j_it)); i_it = j_it; } return ret; }

main.cpp

#include <iostream> #include "split.h" using std::string; using std::vector; using std::endl; using std::cout; using std::cin; int main(void) { string s; cout << endl; cout << "Please input a string: "; while(getline(cin, s)) { vector<string> vec = split(s); for (vector<string>::const_iterator it = vec.begin(); it != vec.end(); ++it) { cout << *it << endl; } cout << "Please input a string to continue or input ctrl + d to end of file!" << endl; } return 0; }

find url

find_url.h

#ifndef GUARD_find_urls_h #define GUARD_find_urls_h #include <vector> #include <string> bool not_url_ch(char); std::string::const_iterator url_beg(std::string::const_iterator, std::string::const_iterator); std::string::const_iterator url_end(std::string::const_iterator, std::string::const_iterator); std::vector<std::string> find_urls(std::string&); #endif

find_url.cpp

// source file find_urls-related #include <algorithm> #include "find_urls.h" using std::string; using std::vector; bool not_url_ch(char c) { static const string url_ch = "~;/?:@=&$-_.+!*'(),"; return !isalnum(c) && find(url_ch.begin(), url_ch.end(), c) == url_ch.end(); } string::const_iterator url_beg(string::const_iterator b, string::const_iterator e) { static const string sep = "://"; const string::size_type sep_sz = sep.size(); typedef string::const_iterator citer; citer i = b; while ((i = search(i, e, sep.begin(), sep.end())) != e) { if (i != b && i + sep_sz != e) { citer beg = i; while(beg != b && isalpha(beg[-1])) --beg; if (beg != i && !not_url_ch(i[sep_sz])) return beg; } i += sep_sz; } return e; } string::const_iterator url_end(string::const_iterator b, string::const_iterator e) { return find_if(b, e, not_url_ch); } vector<string> find_urls(string& s) { typedef string::const_iterator citer; vector<string> ret; citer str_end = s.end(); citer b = s.begin(); citer e = str_end; while (b != s.end()) { b = url_beg(b, str_end); e = url_end(b, str_end); ret.push_back(string(b, e)); b = e; } return ret; }

main.cpp

#include <iostream> #include <string> #include <vector> #include "find_urls.h" using std::cout; using std::cin; using std::endl; using std::string; using std::vector; int main() { cout << "Please input a string: "; string s; while(getline(cin, s)) { vector<string> urls = find_urls(s); for (vector<string>::size_type i = 0; i != urls.size(); ++i) { cout << endl; cout << urls[i] << endl; } cout << "Please input a string to continue or input end-of-file to stop: "; } return 0; }

grade analysis

Student_info.h Student_info.cpp grade.h grade.cpp see Note4

average.h

#ifndef GUARD_average_h #define GUARD_average_h // average.h #include <vector> double average(const std::vector<double>&); #endif

average.cpp

// souce file average-related #include <numeric> #include "average.h" using std::vector; using std::accumulate; double average(const vector<double>& v) { return accumulate(v.begin(), v.end(), 0.0) / v.size(); }

analysis.h

#ifndef GUARD_analysis_h #define GUARD_analysis_h // analysis.h #include <iostream> #include <vector> #include "Student_info.h" bool did_all_hw(const Student_info&); double median_grade(const Student_info&); double average_grade(const Student_info&); double optimistic_median(const Student_info&); double median_analysis(const std::vector<Student_info>&); double average_analysis(const std::vector<Student_info>&); double optimistic_median_analysis(const std::vector<Student_info>&); typedef double (*analysis_fp)(const std::vector<Student_info>&); void write_analysis(std::ostream&, const std::string&, analysis_fp, const std::vector<Student_info>&, const std::vector<Student_info>&); #endif

analysis.cpp

// source file analysis-related #include <vector> #include <stdexcept> #include <algorithm> #include "analysis.h" #include "grade.h" #include "median.h" #include "average.h" using std::ostream; using std::string; using std::domain_error; using std::endl; using std::vector; bool did_all_hw(const Student_info& s) { return (find(s.homework.begin(), s.homework.end(), 0) == s.homework.end()); } double average_grade(const Student_info& s) { return grade(s.midterm, s.final, average(s.homework)); } double median_grade(const Student_info& s) { try { return grade(s); } catch (domain_error) { return grade(s.midterm, s.final, 0); } } double optimistic_median(const Student_info& s) { vector<double> nonzero; remove_copy(s.homework.begin(), s.homework.end(), back_inserter(nonzero), 0); if (nonzero.empty()) return grade(s.midterm, s.final, 0); else return grade(s.midterm, s.final, median(nonzero)); } double median_analysis(const vector<Student_info>& s) { vector<double> grades; transform(s.begin(), s.end(), back_inserter(grades), median_grade); return median(grades); } double average_analysis(const vector<Student_info>& s) { vector<double> grades; transform(s.begin(), s.end(), back_inserter(grades), average_grade); return median(grades); } double optimistic_median_analysis(const vector<Student_info>& s) { vector<double> grades; transform(s.begin(), s.end(), back_inserter(grades), optimistic_median); return median(grades); } void write_analysis(ostream& out, const string& name, analysis_fp analysis, const vector<Student_info>& did, const vector<Student_info>& didnt) { out << name << ": median(did) = " << analysis(did) << ", median(didnt) = " << analysis(didnt) << endl; }

main.cpp

#include <iostream> #include <string> #include <vector> #include "Student_info.h" #include "analysis.h" using std::string; using std::cin; using std::cout; using std::endl; using std::vector; int main() { vector<Student_info> did, didnt; Student_info record; while(read(cin, record)) { if(did_all_hw(record)) did.push_back(record); else didnt.push_back(record); } // verify that the analysis will show us something if (did.empty()) { cout << "No student did all the homwork!" << endl; return 1; } if (didnt.empty()) { cout << "Every student did all the homwork!" << endl; return 1; } // do the analysis write_analysis(cout, "median", median_analysis, did, didnt); write_analysis(cout, "average", average_analysis, did, didnt); write_analysis(cout, "median of homework turned in", optimistic_median_analysis, did, didnt); return 0; }
转载请注明原文地址: https://www.6miu.com/read-71565.html

最新回复(0)