VMTEST - Thử máy

Tác giả: hieult

Ngôn ngữ: C++

#include <set>
#include <map>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>

using namespace std;

#define Rep(i,n) for(typeof(n) i = 0; i < (n); ++i)
#define Repd(i,n) for(typeof(n) i = (n)-1; i >= 0; --i)
#define For(i,a,b) for(typeof(b) i = (a); i <= (b); ++i)
#define Ford(i,a,b) for(typeof(a) i = (a); i >= (b); --i)

bool isword(string s) {
    int len = s.length();
    Rep(i, len) if (!isalpha(s[i])) return false;
    return true;
}

bool isnumber(string s) {
    int minus = 0, dot = 0, posminus = -1, posdot = -1;
    
    int len = s.length();
    Rep(i, len) {
        if (s[i] == '-') {
            ++minus;
            posminus = i;
        }
        else if (s[i] == '.') {
            ++dot;
            posdot = i;
        }
        else if (!isdigit(s[i])) return false;
    }
    
    if (minus > 1 || dot > 1) return false;
    if (minus == 1 && posminus != 0) return false;
    
    return true;
}

double convert(string s) {
    stringstream ss;
    ss << s;
    double r;
    ss >> r;
    return r;
}
    
string line, s;
vector<string> a;

void process() {
    int n = a.size();
    
    if (n == 0) {
        puts("Error!");
        return;
    }
    
    double sum = 0;
    string cat = "";
    bool allnumber = true, allword = true;

    Rep(i, n) {
        if (isnumber(a[i])) {
            sum += convert(a[i]);
            allword = false;
        }
        else if (isword(a[i])) {
            cat = cat + a[i];
            allnumber = false;
        }
        else {
            puts("Error!");
            return;
        }
    }
    
    if (allword) cout << cat << endl;
    else if (allnumber) printf("%.6lf\n", sum);
    else puts("Error!");
}

int main() {
    while (getline(cin, line) && line != "?") {
        a.clear();
        istringstream iss(line);
        while (iss >> s) a.push_back(s);
        process();
    }
    return 0;
}

Download