#include #include #include using namespace std; struct element { int atno; string symbol, name; double atwt; }; void print(element e) { cout << "symbol = " << e.symbol << ", name = " << e.name << ", atno = " << e.atno << ", atwt = " << e.atwt << "\n"; } int read_file(element A[], int maxsize) { A[0].symbol = "*"; A[0].name = "Error"; ifstream in; in.open("elements.txt"); if (in.fail()) { cout << "Could not open the file\n"; exit(1); } int maxatno; for (int i = 1; i < maxsize; i += 1) { element E; in >> E.symbol >> E.name >> E.atwt; if (in.fail()) break; E.atno = i; A[i] = E; maxatno = i; } in.close(); return maxatno; } element find_element(string wanted, element A[], int max) { for (int i = 1; i <= max; i += 1) if (A[i].symbol == wanted) return A[i]; return A[0]; } bool looks_like_a_number(string s) { for (int i = 0; i < s.length(); i += 1) { char c = s[i]; if (c < '0' || c > '9') return false; } return true; } int string_to_int(string s) { int value = 0; for (int i = 0; i < s.length(); i += 1) value = value * 10 + s[i] - '0'; return value; } struct in_sys { string line; int pos; }; void reset(in_sys & i, string s) { i.line = s; i.pos = 0; } char get_ch(in_sys & i) { if (i.pos >= i.line.length()) { i.pos += 1; return '.'; } char result = i.line[i.pos]; i.pos += 1; return result; } void unget_ch(in_sys & i) { i.pos -= 1; } char sneak_ch(in_sys & i) { if (i.pos > i.line.length()) return '.'; char result = i.line[i.pos]; return result; } string get_from(in_sys & i) { string s = ""; char c = get_ch(i); if (c >= 'A' && c <= 'Z') { char c2 = sneak_ch(i); if (c2 < 'a' || c2 > 'z') return s + c; c2 = get_ch(i); return s + c + c2; } else if (c >= '0' && c <= '9') { while (c >= '0' && c <= '9') { s = s + c; c = get_ch(i); } unget_ch(i); return s; } else if (c == '.') return "."; else { cout << "Error in input\n"; return "."; } } int main() { element PT[150]; const int maxatno = read_file(PT, 150); string s; cin >> s; in_sys input; reset(input, s); double total = 0.0, last_atwt = 0.0; bool ok = true; while (true) { string wanted = get_from(input); if (wanted == ".") break; if (looks_like_a_number(wanted)) { int N = string_to_int(wanted); total += last_atwt * (N - 1); cout << " multiplied by " << N << " gives " << last_atwt * N << "\n"; } else { element el = find_element(wanted, PT, maxatno); if (el.symbol == "*") { cout << wanted << " not found\n"; ok = false; } else { print(el); total += el.atwt; last_atwt = el.atwt; } } } if (ok) cout << "\nMolecular weight = " << total << "\n"; }