#include #include #include #include #include "chemlib.h" using namespace std; elreader::elreader(string s) { line = s + "_"; pos = 0; } char elreader::getnext() { if (pos >= line.length()) return '_'; char c = line[pos]; pos = pos + 1; return c; } char elreader::peeknext() { if (pos >= line.length()) return '_'; return line[pos]; } string elreader::readsym() { string ans = ""; char c1 = getnext(); if (isupper(c1)) { char c2 = peeknext(); if (islower(c2)) { getnext(); return ans + c1 + c2; } return ans + c1; } cout << "readsym doesn't understand \"" << c1 << "\"\n"; return "_"; } int elreader::readnum() { int value = 0; while (isdigit(peeknext())) { int dig = getnext(); value = value * 10 + dig - '0'; } // could use digittoint() return value; } item elreader::readpart() { item result; char c = peeknext(); if (isdigit(c)) { result.type = 'N'; result.i = readnum(); } else if (isalpha(c)) { result.type = 'S'; result.s = readsym(); } else if (c == '_') result.type = c; else if (c == '(' || c == ')') { result.type = getnext(); } else { cout << "Unexpected in formula: " << c << "\n"; result.type = 'X'; } return result; } element::element() { } element::element(int an, string sy, string nm, double aw) { atno = an; atwt = aw; symbol = sy; name = nm; } ostream & operator<<(ostream & os, const element & e) { os << e.atno << " " << e.name << " " << e.atwt << " " << e.symbol << "\n"; } void element::print() { cout << *this; } ptable::ptable() { max = 150; num = 0; T[0] = element(0, "Q", "Nosuchthingium", 0.0); } void ptable::read_table() { ifstream elfile("elements.txt"); if (elfile.fail()) { cerr << "could not open elements.txt\n"; return; } while (true) { string n, s; double a; elfile >> s >> n >> a; if (elfile.fail()) break; num = num + 1; if (num >= max) { cerr << "too many elements\n"; exit(1); } T[num] = element(num, s, n, a); } elfile.close(); cout << num << " elements read\n"; } element ptable::find_sym(const string & sy) { int i = 1; while (i <= num) { if (T[i].symbol == sy) return T[i]; i = i + 1; } return T[0]; }