【问题标题】:pH Level - Keeps Returning Same AnswerpH 值 - 不断返回相同的答案
【发布时间】:2015-06-30 17:27:03
【问题描述】:

我正在制作一个程序,用户可以在其中输入 0-14 之间的数字。我目前有2节课。一个用于计算,另一个用于 main(程序运行的地方)。

计算

公共类 phcalculations {

public static final double MIN = -0.999;
public static final double stronglyAcidic =0;
public static final double acidic =2.1;
public static final double weaklyAcidic =4.1;
public static final double nearNeutralAcid =6.1;
public static final double Neutral =7;
public static final double nearNeutralBase=7.01;
public static final double weaklyAlkaline=8.1;
public static final double alkaline=10.1;
public static final double stronglyAlkaline=12.1;
public static final double MAX = 12.11;

//finds id double is acceptable

public phcalculations(double pH){
    //---Not valid pH
    if (pH < MIN || pH > MAX){
    System.out.println(pH +" is not a vaild pH");
    } else{
        myValue = pH;
    }


}




//method for finding pH

public String label(){
    //---Not valid pH
    if (myValue < stronglyAcidic || myValue > stronglyAlkaline){
        return "Error";
    //---Strongly Acidic 0-2
    } else if(myValue>stronglyAcidic){
        return "Strongly Acidic";
    //---Acidic 2.1-4.0 
    } else if (myValue > acidic ){
        return "Acidic";
    //---Weakly Acidic 4.1-6.0
    } else if (myValue> weaklyAcidic){
        return "Weakly Acidic"; 
    //---Near neutral   6.1-6.99
    } else if (myValue >nearNeutralAcid){
        return "Near Neutral";
    //--Neutral 7
    } else if (myValue == Neutral){
        return "Neutral";
    //---Near Neutral 7.01 -8
    } else if (myValue > nearNeutralBase){
        return "Near Neutral";
    //---Weakly Acidic 8.1-10
    } else if (myValue> weaklyAlkaline){
        return "Weakly Acidic";
    //---Alkaline 10.1-12.0
    } else if (myValue > alkaline){
        return "Alkaline";
    //---Strongly Acidic 12.1-14
    } else if (myValue>stronglyAlkaline){
        return "strongly Alkaline";
    } else {
        return "error";
    }


}


private double myValue;

}


主要

import java.util.Scanner;

公共类 pHMain {

public static void main(String[] args) {

    Scanner kbd = new Scanner(System.in);
    boolean done =false;
    while (!done){
        System.out.println("Enter pH: ");
        double pHInput = kbd.nextDouble();
        if(pHInput < phcalculations.MIN ){
            done =true;
        } else{
            phcalculations ph = new phcalculations(pHInput);
            System.out.println("pH level is ---> " + ph.label());
        }
    }







}

}


我运行程序时怎么会返回“强酸性”

感谢您的帮助。 谢谢

这是用java写的

【问题讨论】:

    标签: java class while-loop boolean


    【解决方案1】:

    您的label 方法的逻辑不正确。你的第二个条件:

    } else if(myValue>stronglyAcidic){
    

    涵盖了您留下的所有可能值。您需要测试两侧有界的特定范围,而不是您拥有的一侧范围。试试

    } else if(myValue > stronglyAcidic && myValue < acidic){
    

    除了最后一个之外的其余条件需要类似的替换,例如

    } else if (myValue > acidic && myValue < weaklyAcidic){
    

    此外,由于您的 stronglyAlkaline 值不是考虑的最大值,您的第一个条件将错过所有 "Strongly alkaline" 值。试试:

    if (myValue < stronglyAcidic || myValue > MAX){
    

    ...根据您的要求,MAX 可能应该是 14 而不是 12.11

    【讨论】:

    • 不应该是 myValue &gt;= acidic 还是应该删除整个布尔表达式,因为它在 else if 中,并且从上面的检查中暗示 myValue &gt;= acidic 已经存在?
    • @M.Shaw 是的,这些条件应该考虑到 pH 值可能恰好是一个边界值的可能性,所以&gt;=(或碱性值的高端&lt;=)是正确。
    【解决方案2】:

    你的逻辑是错误的。它总是大于 strongAcidic ,因此第一个真实的 if 测试(不是错误 if 测试)将始终为真。解决办法,先修改那个else-if

    if (myValue < stronglyAcidic || myValue > stronglyAlkaline){
        return "Error";
    //---Strongly Acidic 0-2
    } else if(myValue > stronglyAcidic && myValue < weaklyAcidic) {
       ...
    

    不过,重要的是,在这种情况下,您需要在头脑中遍历您的代码逻辑,就像您是 JVM 一样,并查看您的代码将在每一行执行什么操作。

    【讨论】:

      【解决方案3】:

      假设myValue == 8。当你这样做时:

      } else if(myValue>stronglyAcidic){
          return "Strongly Acidic";
      //---Acidic 2.1-4.0 
      } else if (myValue > acidic ){
          return "Acidic";
      //---Weakly Acidic 4.1-6.0
      } // etc.
      

      第一个if 将检查8 &gt; 0 并返回"Strongly Acidic" 作为结果。因此,它永远不会检查第二个或任何其他条件。

      要解决这个问题,您可以颠倒条件的顺序,从更具体、更高的值检查到不太具体、更低的值:

      } else if (myValue > stronglyAlkaline) {
          // this should be the first condition
          return "strongly Alkaline";
      } else if (myValue > alkaline) {
          // this should be the second condition
          return "Alkaline";
      } // and so on until
      
      ...
      
      } else if(myValue > stronglyAcidic) {
          // and the last condition
          return "Strongly Acidic";
      }
      

      因此,例如,myValue == 11,第一个条件 (11 &gt; 12.1) 将是 false,但第二个条件 (11 &gt; 10.1) 将是 true,它将返回 "Alkaline"

      【讨论】:

        猜你喜欢
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2015-02-22
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        相关资源
        最近更新 更多