赞
踩
9.50
- #include <iostream>
- #include <string>
- #include <vector>
-
- using namespace std;
-
- int main()
- {
- vector<string> int_val = {"123", "456", "-789"};
-
- int sum1 = 0;
-
- for (auto v : int_val) {
- sum1 += stoi(v);
- }
-
- cout << "sum1 = " << sum1 << endl;
-
- vector<string> double_val = {"12.3", "-4.56", "+7.8e-2"};
-
- double sum2 = 0;
-
- for (auto v : double_val) {
- sum2 += stod(v);
- }
-
- cout << "sum2 = " << sum2 << endl;
-
- return 0;
- }
9.51
-
- #include <iostream>
- #include <string>
- #include <stdexcept>
- #include <vector>
-
- using namespace std;
-
- const vector<string> month_name1 = {"January", "February", "March",
- "April", "May", "June", "July", "August",
- "September", "October", "November", "December"};
-
- const vector<string> month_name2 = {"Jan", "Feb", "Mar",
- "Apr", "May", "Jun", "Jul", "Aug",
- "Sept", "Oct", "Nov", "Dec"};
-
- class date {
- friend ostream& operator<<(ostream&, const date&);
- public:
- typedef string::size_type size_type;
- date() = default;
- date(const string &s);
- private:
- unsigned year, month, day;
- };
-
- inline void format1(const string &ds, const string::size_type &index, unsigned &y, unsigned &m, unsigned &d)
- {
- string::size_type day_p = index; //day position
- string::size_type spa_p = ds.find_first_of(" "); //first space position
- string::size_type sep_p; //seperator(between day and year) position
- string::size_type year_p; //year position
- const vector<string> *p = &month_name1;
-
- if (index == 4) {
- sep_p = ds.find(" ", day_p);
- year_p = sep_p + 1;
- p = &month_name2;
- } else if (index > 4) {
- sep_p = ds.find(", ", day_p);
- year_p = sep_p + 2;
- } else {
- throw invalid_argument("month error");
- }
-
- //check the format
- if (spa_p == string::npos || sep_p == string::npos || day_p - spa_p != 1 || (sep_p - day_p != 1 && sep_p - index != 2))
- throw invalid_argument("fromat error");
- auto year_size = ds.size() - year_p;
- string::size_type pos;
- if (year_size <= 0 || (pos = ds.find_first_not_of("0123456789", year_p)) != string::npos)
- throw invalid_argument("year error");
-
- //get month value
- auto month = ds.substr(0, spa_p);
- unsigned i = 0, j = 0, month_len = 0;
- for (; i < 12; i++) {
- month_len = (*p)[i].size();
- for (j = 0; j < month_len; j++) {
- if (month[j] != (*p)[i][j])
- break;
- }
- if (j == month_len) {
- m = ++i;
- break;
- }
- }
- if (i == 12)
- throw invalid_argument("month error");
-
- d = stoi(ds.substr(day_p, sep_p - day_p));
- y = stoi(ds.substr(year_p, ds.size() - year_p));
- }
-
- inline void format2(const string &ds, unsigned &y, unsigned &m, unsigned &d)
- {
- string::size_type sep1 = ds.find_first_not_of("0123456789");
- string::size_type sep2 = ds.find_first_not_of("0123456789", sep1 + 1);
-
- // check the seperator
- if (sep1 == string::npos || sep2 == string::npos || ds[sep1] != '/' || ds[sep2] != '/')
- throw invalid_argument("format error");
-
- // check the year
- string::size_type pos = ds.find_first_not_of("0123456789", sep2 + 1);
- if (pos != string::npos)
- throw invalid_argument("year error");
-
- string day = ds.substr(0, sep1);
- string month = ds.substr(sep1 + 1, sep2 - sep1 - 1);
- string year = ds.substr(sep2 + 1, ds.size() - sep2 - 1);
-
- d = stoi(day);
- m = stoi(month);
- y = stoi(year);
- }
-
- date::date(const string &ds)
- {
- string::size_type index;
-
- if ((index = ds.find_first_of("0123456789")) == string::npos)
- throw invalid_argument("illegal date");
-
- if (index > 0) { // use month name
- format1(ds, index, year, month, day);
- } else { //use month number
- format2(ds, year, month, day);
- }
- }
-
- ostream& operator<<(ostream& out, const date &d)
- {
- out << d.year << " " << d.month << " " << d.day << endl;
- return out;
- }
-
- int main()
- {
- string ds1 = {"February 1, 2014"};
- string ds2 = {"Jan 15 1900"};
- string ds3 = {"28/8/1985"};
-
- try {
- date d1(ds1);
- date d2(ds2);
- date d3(ds3);
- cout << d1;
- cout << d2;
- cout << d3;
- } catch (invalid_argument e) {
- cout << e.what() << endl;
- }
-
- return 0;
- }
-
9.52
- #include <iostream>
- #include <string>
- #include <stack>
- #include <stdexcept>
-
- using namespace std;
-
- void handle(stack<char> &s)
- {
- string exp;
-
- if (s.empty())
- throw invalid_argument("format error");
-
- while (!s.empty() && s.top() != '(') {
- auto c = s.top();
- exp.insert(exp.begin(), c);
- s.pop();
- }
-
- if (!s.empty()) {
- if (s.top() == '(')
- s.pop();
- else
- throw invalid_argument("format error");
- }
-
- if (exp[0] != '-')
- exp.insert(0, 1, '+');
-
- double val = 0, result = 0;
- string::size_type pos = 0, prev = 0;
- while ((pos = exp.find_first_of("+-", prev + 1)) != string::npos) {
- val = stod(exp.substr(prev, pos));
- result += val;
- prev = pos;
- }
-
- val = stod(exp.substr(prev, exp.size()-prev));
- result += val;
-
- if (!s.empty()) {
- if (s.top() == '+' && (result < 0))
- s.pop();
- else if (s.top() == '-' && (result < 0)) {
- s.pop();
- s.push('+');
- result = 0 - result;
- }
- }
-
- string ret = to_string(result);
- for (auto p = 0; p < ret.size(); p++)
- s.push(ret[p]);
- }
-
- double calculate(stack<char> &s)
- {
- string exp;
-
- if (s.empty())
- throw invalid_argument("format error");
-
- //生成表达式
- while (!s.empty()) {
- auto c = s.top();
- exp.insert(exp.begin(), c);
- s.pop();
- }
-
- //计算结果
- double val = 0, result = 0;
- string::size_type pos = 0, prev = 0;
- while ((pos = exp.find_first_of("+-", prev + 1)) != string::npos) {
- val = stod(exp.substr(prev, pos));
- result += val;
- prev = pos;
- }
- val = stod(exp.substr(prev, exp.size()-prev));
- result += val;
-
- return result;
- }
-
- int main()
- {
- string exp;
- stack<char> s;
- string::size_type i = 0;
-
- cout << "input expression: " << endl;
- getline(cin, exp);
-
- while (i < exp.size()) {
-
- if (exp[i] == ')') {
- handle(s);
- } else {
- s.push(exp[i]);
- }
- i++;
- }
-
- auto ret = calculate(s);
-
- cout << "result = " << ret << endl;
-
- return 0;
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。