“如何简化计算化学熔融摩尔质量的程序

问题描述 投票:-2回答:1

以下程序通过给定分子式质量计算不含除碳,氢,氮和氧之外的其他元素的化合物的摩尔数。

启动时,程序应在控制台Please enter the formula in the form CcHhNnOo (c, h, n, o - integers)上显示消息

然后,用户必须根据上述模板输入公式。如果任何原子的化学指数为0或1,则它们必须由数字给出。

例如,对于较低的化合物,请输入蓝色文本:

C0H2N0O1 (water, H2O) MW = 18.015
C17H4N0O0 (methane, CH4) MW = 16.043
C7H5N3O6 (trinitrotoluene, C7H5N3O6) MW = 227.132
C9H13N103 (adrenaline, C9H13NO3) MW = 183.207
C12H22N0O11 (sucrose, C12H22O11) MW = 342.297

可以根据下式计算:MW = nC.AC + nH.AH + nN.AN + nO.AO,其中MW是所需的摩尔质量。 nC, nH, nN and nO分别是化合物分子中碳,氢,氮和氧原子的数量,而AC, AH, AN and AO是相应的原子质量:

AC = 12.011
AH = 1.008
AN = 14.007
AO = 15.999

在输入公式后,程序必须计算并写入控制台所寻求的摩尔质量。如果公式不包含排列在订单行中的原子,而不是磨牙表,程序应显示以下消息:Wrong formula! Please use the form CcHhNnOo!

到目前为止,我们所做的是完整的程序,但有很多检查应该被删除,因为我们正在努力使程序像10行代码一样简单。到目前为止,该程序已在CodeBlocks中用C ++编写,我们宁愿运行它。

#include <iostream>
#include <cstring>

using namespace std;

int main()
{

    char formula[512];

    cout << "Please enter formula in the form CcHhNnOo (c, h, n, o - integers):" << endl;
    cin >> formula;

    if (formula[0] != 'C')
    {
        cout << "Wrong formula! Please use the form CcHhNnOo!" << endl;
        return 0;
    }

    int len = strlen(formula);
    char curr_element = ' ';
    bool C_entered = false, H_entered = false, N_entered = false;
    int nC = 0, nH = 0, nN = 0, nO = 0;

    for (int i = 0; i < len; i++) 
    {

        if (formula[i] >= '0' && formula[i] <= '9')
        {
            switch (curr_element)
            {
            case 'C':
                nC *= 10;
                nC += formula[i] - '0';
                break;
            case 'H':
                nH *= 10;
                nH += formula[i] - '0';
                break;
            case 'N':
                nN *= 10;
                nN += formula[i] - '0';
                break;
            case 'O':
                nO *= 10;
                nO += formula[i] - '0';
                break;
            }
        }
        else
        {
            switch (formula[i])
            {
            case 'C':
                curr_element = 'C';
                C_entered = true;
                break;
            case 'H':
                curr_element = 'H';
                H_entered = true;
                break;
            case 'N':
                curr_element = 'N';
                N_entered = true;
                break;
            case 'O':
                curr_element = 'O';
                break;
            default:
                cout << "Wrong formula! Please use the form CcHhNnOo!" << endl;
                return 0;
            }

            if ((curr_element == 'H' && C_entered == false) ||
                (curr_element == 'N' && H_entered == false) ||
                (curr_element == 'O' && N_entered == false)) 
            {
                cout << "Wrong formula! Please use the form CcHhNnOo!" << endl;
                return 0;
            }
        }

    }

    float weight = nC * 12.011f + nH * 1.008f + nN * 14.007f + nO * 15.999f;
    cout << "MW = " << weight << endl;

    return 0;
}

理想情况下,完美的方案是简化上述代码。

c++ composition chemistry
1个回答
0
投票

这里的东西不一定复杂但至少更短:

#include <iostream>
#include <numeric>
#include <string>
#include <regex>
#include <cctype>
#include <map>

int main() {

    std::string formula;
    std::map<char, int> mapper;

    std::cout << "Enter formula (CcHhNnOo): ";
    std::getline( std::cin, formula );

    if ( std::regex_match( formula.begin(), formula.end(), std::regex( "^((C[0-9]+)?)((H[0-9]+)?)((N[0-9]+)?)((O[0-9]+)?)$" ) ) ) {

        std::vector<int> value;
        char last_char = 'S';

        for ( unsigned int i = 0; i < formula.size(); ++i ) {

            char c = formula[i];

            if ( (std::isalpha( c ) && last_char != 'S') || i == formula.size() - 1 ) {

                if ( i == formula.size() - 1 ) value.push_back( static_cast<int>(c) - 48 );

                int mul = 1;
                mapper[last_char] = std::accumulate( value.rbegin(), value.rend(), 0, [&mul](int a, int b) {
                    int new_value = mul * b + a;
                    mul *= 10;
                    return new_value;
                });

            }

            if ( std::isalpha( c ) ) {

                value = std::vector<int>();
                last_char = c;

            } else { value.push_back( static_cast<int>(c) - 48 ); }
        }

        float weight = mapper['C'] * 12.011f + mapper['H'] * 1.008f + mapper['N'] * 14.007f + mapper['O'] * 15.999f;

        std::cout << weight << "\n";

    }

    return 0;
}

请记住,如果您仅向用户询问数字,则可以避免这种情况:

#include <iostream>

int main() {

    int C, H, N, O;

    std::cout << "Enter formula in order C H N O: ";
    std::cin >> C >> H >> N >> O;

    float weight = C * 12.011f + H * 1.008f + N * 14.007f + O * 15.999f;
    std::cout << "MW = " << weight << "\n";

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.