2017-01-19 10 views
0

に直接行きます。コードに問題があります。それはエラーなしでコンパイルされますが、正しい値であってもユーザーからの入力を受けた直後に、最初の条件文をスキップしてELSEに直接行き、プログラムを終了させます。私はこの行動の原因を見つけることができないようです。入力後、私のプログラムは最初のIF文をスキップして、ELSE

私はそれが条件文が構築されている方法の問題かもしれないと思う

if(((S <= 25 && S <= 75) % 5 == 0) && (U < 0.2 && U < 0.7)){

は私が入力した値が25 <= S <= 75で、5で割り切れるかどうかを確認する必要があるだけでなく、他の値が0.2 < U < 0.7

ています

Course Assignment

//#include "stdafx.h" // Header File used VS. 
#include <iostream> 
//#include <iomanip> // Used to format the output. 
#include <cstdlib> // Used for system(). 
#include <math.h> // Used for sqrt(). 
using namespace std;// ? 


int main(){ 

    int S; // Gram/Litre 
    double U; // Specific Max. Growth Rate. Per Hour. 
    double D; // Maximum Dilution Rate. 
    const int K = rand() % 7 + 2; // Saturation Constant - Randomly Gegerated Number Between 2 & 7. In Hour/Litre. 

    cout << "Enter value between 25 and 75, divisible by 5, for S in Gram/Litre: "; 
    cin >> S; 
    cout << "Enter value bigger than 0.2, but less than 0.7, for U per Hour: "; 
    cin >> U; 

    if(((S <= 25 && S <= 75) % 5 == 0) && (U < 0.2 && U < 0.7)){ // Check Condition ***May Need Adjustments*** 

     D = U * (1 - sqrt (K/(K + S))); // Might have to adjust values to fit data type double. Add .00 
     cout.precision(3); // Prints 3 values after decimal point. 
     cout << "Maximum dilution rate is: " << D << endl; 

     if(D < 0.35 && D < 0.45){ 
      cout << "Kinetic parameters are acceptable." << endl; 
     } 
     else{ 
      cout << "Kinetic parameters are not acceptable." << endl; 
     } 

    } 
    else{ 
     cout << "Invalid Input. Program will now terminate." << endl; 
    } 

    system("PAUSE"); // Pauses the program before termination. 
    return 0; 
} 
+0

'cin 'のようなサウンドは正しくクリアされていません:http://stackoverflow.com/q/20913785/477563 –

+0

' S <= 25'はあなたの説明と一致しません。また '(S <= 25 && S <= 75)'の結果が 'S'自体ではなく5で割り切れるかどうかをチェックします。 あなたの条件を分割して、異なる部分の値を 'bool isSInRange =(25 <= S && S <= 75);のように一時的に保存したいかもしれません。 –

+0

もう1つ質問がありますが、変数 'D'を表示すると、代わりに' U'の値が表示されるようです。私は数学で何の問題も見ません。D = U *(1 - sqrt(K /(K + S))); 'cout.precision(3);' 'cout <<"最大希釈率は次のとおりです: "<< D << endl;何が原因だろうか? –

答えて

1

まず、あなたが 25 <= S && S <= 75、ないS <= 25 && S <= 75を持っている必要があります。 U < 0.2およびD < 0.35と同じ - 0.2 < U0.35 < Dである必要があります。

第2に、上記の文はブール値を返します。したがって、Sが25と75の間の値であればブール値は1の整数値にキャストされ、1 % 5 == 0は常にfalseになります。 (Sがこの範囲外にある場合同様に、ブール値は整数0と0 % 5 == 0にキャストされ、常に真であろう)は、以下のようにif文

、正しい完全である:

if((25 <= S && S <= 75) && (S % 5 == 0) && (0.2 < U && U < 0.7)){ ... if(0.35 < D && D < 0.45){ ... } ... }

+0

合意。しかし、(たくさんの(不要なカッコ))があります。 'if(25 <= S && S <= 75 && S%5 == 0 && 0.2

1

あなたが入力から25と75の間の数字を読めば、if(((S <= 25は常にfalseです。

if(((S >= 25 && ...を使用する必要があります。あなたは25 < = S < = 75をしたい場合は

+0

それは唯一のバグではありません... –

0

問題は、主にループ条件にあります。たとえば、あなたのコードから、この行で:

if(((S <= 25 && S <= 75) % 5 == 0) && (U < 0.2 && U < 0.7)){ 
     //... 
    } 

ザ・条件S < = 25 & & S < = 75は、単にあなたのパラメータの状態、理由は言葉でS < = 25ように書き換えることができる場合Sが25以下であればOR、Sが75以下であれば等である。

同じ問題がここに存在する:U < 0.2 & & U < 0.7を。もう一度、ifステートメントは、Uが0.2未満でUが0.7未満かどうかを単純にチェックします。これは、前者がtrueの場合は後者が常に真です。

はしかし、2つの入力を受け入れる前に、あなたの出力文で、あなたはSは、Sが25より大きいことを意味し、= S 25 < < = 75の範囲を持つべきであると述べています。それほどではない。 Uの同じ問題:0.2 < U < 0.7の範囲の入力を期待しています。

あなたは書き直す必要がありますどのようにあなたの次のように文がある場合、その後:

if((S >= 25 && S <= 75) && (S % 5 == 0) && (U > 0.2 && U < 0.7)){ 
     //... 
    } 

これだけではなく、読んで理解し、それはまた、エラーを排除するために、あなたのif文の条件が容易になります。これは今すぐ動作するはずです。コードの意味は同じです:Sは25と75(これらの数値を含む)の間でなければなりません。5で割り切れる必要があり、Uは0.2と0.7の間でなければなりません。

はところで、同じ間違いはまた、あなたのコードのこの部分に存在する:

if(D < 0.35 && D < 0.45){... 

私は以下のそれを修正:

if(D > 0.35 && D < 0.45){... 

幸運を!

関連する問題