C++问题 if else if语句运用问题

问题遇到的现象和发生背景

想要编写一个根据不同物质用不同pH计算方式来算出输入物质的pH值

问题相关代码,请勿粘贴截图

#include
#include
#include
using namespace std;

double Monoweakacid(double k1, double k2, double c1) {

k1 = 0.0; c1 = 0.0;
k2 = 0.0;
cin >> k1 >> c1;
double pH = 0.0;
double kw = 1 * 10 ^ -14;
if (c1 * k1 >= 20 * kw)pH = -log10((-k1 + sqrt(k1 * k1 + 4 * c1 * k1)) / 2);
else if (c1 * k1 < 20 * kw && c1 / k1 >= 500.0) {
    pH = -log10(sqrt(c1 * k1 + kw));
}
else if (c1 * k1 >= 20 * kw && c1 / k1 >= 500.0)pH = -log10(sqrt(c1 * k1));
return pH;

}
double Polyweakacid(double k1, double k2, double c1) {

k1 = 0.0; c1 = 0.0; k2 = 0.0;
cin >> k1 >> k2 >> c1;
double pH = 0.0;
double kw = 1 * 10 ^ -14;
if (c1 * k1 >= 20 * kw)pH = -1*log10((-k1 + sqrt(k1 * k1 + 4 * c1 * k1)) / 2);
else if (c1 * k1 < 20 * kw && c1 / k1 >= 500.0) {
    pH = -1*log10(sqrt(c1 * k1 + kw));
}
else if (c1 * k1 >= 20 * kw && c1 / k1 >= 500.0)pH = -1*log10(sqrt(c1 * k1));
return pH;

}
double Monoweakbase(double k1, double k2, double c1){

    k2 = 0.0; k1 = 0.0; c1 = 0.0;
    cin >> k1 >> c1;
    double pH = 0.0;
    double kw = 1 * 10 ^ -14;
    if (c1 * k1 >= 20 * kw)pH = 14.0 + log10((-k1 + sqrt(k1 * k1 + 4 * c1 * k1)) / 2);
    else if (c1 * k1 < 20 * kw && c1 / k1 >= 500.0) 
        pH = 14.0 + log10(sqrt(c1 * k1 + kw));
    
    else if (c1 * k1 >= 20 * kw && c1 / k1 >= 500.0)pH = 14.0 + log10(sqrt(c1 * k1));
    return pH;
}

double Multiweakbase(double k1, double k2, double c1){

k2 = 0.0; k1 = 0.0; c1 = 0.0;
cin >> k1 >> k2 >> c1;
double pH = 0.0;
double kw = 1 * 10 ^ -14;
if (c1 * k1 >= 20 * kw)pH =14.0+log10((-k1 + sqrt(k1 * k1 + 4 * c1 * k1)) / 2);
else if (c1 * k1 < 20 * kw && c1 / k1 >= 500.0) {
    pH =14.0+log10(sqrt(c1 * k1 + kw));
}
else if (c1 * k1 >= 20 * kw && c1 / k1 >= 500.0)pH =14.0+log10(sqrt(c1 * k1));
return pH;

}
double Amphotericsubstance(double k1, double k2){

k2 = 0.0; k1 = 0.0;
cin >> k1 >> k2;
double pH = 0.0;
pH = -1*log10(sqrt(k1 * k1));
return pH;

}
double buffersubstance(double k1, double c1, double c2) {

c2 = 0.0; k1 = 0.0; c1 = 0.0;
cin >> k1 >> c1 >> c2;
double pH = 0.0;
pH = -1*log10(k1) + log10(c2 / c1);
return pH;

}
double strongacid(double c1){

c1 = 0.0;
cin >> c1;
double pH = 0.0;
 pH = -1*log10(c1);
return pH;

}
double strongbase(double c1){

c1 = 0.0;
cin >> c1;
double pH = 0.0;
 pH = 14.0+log10(c1);
return pH;

}
int main() {
double a = 0.0;
double b = 0.0;
double c = 0.0;
double d = 0.0;
string material;
cin >> material;
if (material == "HBrO" || "HClO" || "HIO" || "HIO3"
|| "CH3COOH" || "HCOOH" || "CH2ClCOOH" || "HF" || "HSIO4" || "H3C6H5O7" || "HCN"
|| "HNO2" || "HAlO" || "H3AsO" || "H3AsO4" || "H2GeO3" || "HIO4" || "H3BO3") {

    cout << Monoweakacid(a, b, c);
}
else if (material == "H2CO3" || "H2CrO4" || "H2S" || "H2C2O4"
    || "H3PO3" || "H3PO2 " || "H4P2O7") {
    cout << Polyweakacid(a, b, c);
}
else if (material == "NH4OH" || "NH4NO3" || "NH3.H2O" || "Si(OH)4"
    || "AgOH" || "Zn(OH)2" || "CH3NH2" || "CO(NH2)2")
{
    cout << Monoweakbase(a, b, c);
}
else if (material == "NaCO3" || "Cu(OH)2" || "Fe(OH)3" || "Fe(OH)2"
    || "Zn(OH)2" || "Mg(OH)2" || "Ca(OH)2" || "Pb(OH)2") {
    cout << Multiweakbase(a, b, c);
}
else if (material == "NH4CN" || "NH4COOH" || "(NH4)2S" || "(NH4)2C2O4"
    || "NaF" || "NaHCO3" || "NH2CH2COOH") {
    cout << Amphotericsubstance(a, b);
}
else if (material == "HCOOH——NaCOOH" || "NH3·H2O——NH4Cl" || "NaH2PO4——Na2HPO4" || "H2CO3——HCO3-"
    ) {
    cout << buffersubstance(a, c, d);
}
else if (material == "HCL") { cout << strongacid(c); }
else if (material == "NaOH") { cout << strongbase(c); }
else return 0;

}

运行结果及报错内容

输入H2CO3 4.310^-7 5.610^-11 结果是inf
输入HCL 10 但是我还得再输一个数,明明我设置的参数只有一个

我的解答思路和尝试过的方法

我把else if (material == "HCL") { cout << strongacid(c); }前的if条件语句删除了,之后输入HCL 10 结果正确为1

我想要达到的结果

准确的输入相应的参数并输出正确的值

material == "HBrO" || "HClO" 这种写法不对,应该是
strcmp(material,"HBrO")==0 || strcmp(material,"HCIO")==0
也就是每一次比较都必须写完整。
简便点的方法是,你把这些不同的元素放在不同的数组里,写个函数,判断输入的字符串属于哪个数组,然后执行相关的操作。
如下:


//写一个比较函数
int isInArr(string s,string arr[],int n)
{
    for(int i = 0;i<n;i++)
    {
        if(s.compare(arr[i])==0)
            return 1;
    }
    return 0;
}


int main() {
    double a = 0.0;
    double b = 0.0;
    double c = 0.0;
    double d = 0.0;
    string material;

    string arr1[]={"HBrO" , "HClO" , "HIO" , "HIO3"    , "CH3COOH" , "HCOOH" , "CH2ClCOOH" , "HF" , "HSIO4" , "H3C6H5O7" , "HCN"
        , "HNO2" , "HAlO" , "H3AsO" , "H3AsO4" , "H2GeO3" , "HIO4" , "H3BO3"};
    string arr2[] = {"H2CO3" , "H2CrO4" ,"H2S" , "H2C2O4", "H3PO3" , "H3PO2 ", "H4P2O7"};

    string arr3[] = {"NH4OH" , "NH4NO3" , "NH3.H2O" , "Si(OH)4"    , "AgOH" , "Zn(OH)2" , "CH3NH2" , "CO(NH2)2"};
    string arr4[] ={"NaCO3" , "Cu(OH)2" , "Fe(OH)3" , "Fe(OH)2"    , "Zn(OH)2" , "Mg(OH)2" , "Ca(OH)2" , "Pb(OH)2"};
    string arr5[] ={"NH4CN" , "NH4COOH" , "(NH4)2S" , "(NH4)2C2O4", "NaF" , "NaHCO3" , "NH2CH2COOH"};
    string arr6[] ={"HCOOH——NaCOOH" , "NH3·H2O——NH4Cl" , "NaH2PO4——Na2HPO4" , "H2CO3——HCO3-"};


    cin >> material;
    if (isInArr(material,arr1,18)) {
            cout << Monoweakacid(a, b, c);
    }
    else if (isInArr(material,arr2,7)) {
            cout << Polyweakacid(a, b, c);
    }
    else if (isInArr(material,arr3,8) )
    {
        cout << Monoweakbase(a, b, c);
    }
    else if (isInArr(material,arr4,8)) {
            cout << Multiweakbase(a, b, c);
    }
    else if (isInArr(material,arr5,7) ) {
            cout << Amphotericsubstance(a, b);
    }
    else if (isInArr(material,arr6,4)) {
            cout << buffersubstance(a, c, d);
    }
    else if (material.compare("HCL") == 0) { cout << strongacid(c); }
    else if (material.compare("NaOH") ==0 ) { cout << strongbase(c); }
    else return 0;
}

字符串的比较,用strcmp函数。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632