Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <regex>
- bool has_number(std::string& s){
- return s.find("value") != std::string::npos;
- }
- bool has_operation(std::string& s){
- return s.find("operation") != std::string::npos;
- }
- double doubleFromString(std::string& s){
- double ans = 0;
- int p;
- for(p = 0; !isdigit(s[p]); ++p);
- int ansSign = 1;
- if(p > 0 && s[p - 1] == '-')
- ansSign = -1;
- for(; isdigit(s[p]); ++p)
- ans = ans * 10 + (s[p] - '0');
- if(s[p] != '.')
- return ans * ansSign;
- int k = 1;
- ++p;
- for(; isdigit(s[p]); ++p, ++k)
- ans = ans + pow(0.1, k);
- return ans * ansSign;
- }
- int operation_type(std::string& s){
- unsigned long index = s.find("operation type=\"") + std::string("operation type=\"").size();
- int p = index;
- for(; isalpha(s[p]); ++p);
- return s.substr(index, p - index) != "mean";
- }
- int main() {
- std::string s;
- std::vector<double> nums;
- int operation; // 0 - mean, 1 - variance
- while(std::getline(std::cin, s)){
- if(has_number(s)){
- nums.push_back(doubleFromString(s));
- }
- else if(has_operation(s))
- operation = operation_type(s);
- else
- break;
- }
- int sum = 0;
- for(auto&& i: nums)
- sum += i;
- std::cout << sum << ' ' << nums.size() << ' ' << 1.0 * sum / nums.size() << '\n';
- if(operation == 0){
- std::cout << 1.0 * sum / nums.size();
- return 0;
- }
- double variance = 0;
- for(auto&& i: nums)
- variance += (i - sum / nums.size()) * (i - sum / nums.size());
- std::cout << variance / nums.size();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement