2017-12-22 18 views
3

私はプログラミング時に新しく、サウナの温度を華氏から摂氏に変換して熱を上げるべきかどうかをユーザーに知らせるプログラムに取り組んでいます元の入力番号に応じて下に移動します。私はコードの大部分をやったことがありますが、今は73度以下または77度以上の数字を書くときにループしない理由がわかりません。私の目が見つからないような問題は誰にも見えますか?私のループがループしない理由を知らない

using System; 

namespace BastunKP 
{ 
    class Program 
    { 
     public static int FahrToCels(int fahr) 
     { 
      int tempCels = (fahr - 32) * 5/9; 
      return tempCels; 
     } 

     public static void Main(string[] args) 
     { 
      Console.WriteLine("Skriv in Fahrenheit: "); 
      int fahr = int.Parse(Console.ReadLine()); 
      int tempCels = FahrToCels(fahr); 

      do 
      { 
       if (tempCels < 73) 
       { 
        Console.WriteLine("Temperaturen är för kallt, skruva upp lite!"); 
       } 
       else if (tempCels > 77) 
       { 
        Console.WriteLine("Temperaturen är för varmt, skruva ner lite!"); 
       } 
       else 
       { 
        Console.WriteLine("Temperaturen är nu lagom, hoppa in!"); 
        return; 
       } 

       fahr = int.Parse(Console.ReadLine()); 
       tempCels = FahrToCels(fahr); 
      }   
      while (tempCels < 73 && tempCels > 77); 
     } 
    } 
} 

私はまた、教師が高いグレードのために、私は摂氏華氏に変換するための場所を数式に見て、それは、二重にするべきであると述べているが、私はこれを行う方法を知らない私の割り当てについて質問がありますまったく変わりません。事前に

おかげ

+0

ようこそStackOverflow! – Squareoot

+3

whileの状態を見てください – BWA

+0

そしてなぜ 'if'のために2つの' else'ステートメントがありますか? – creyD

答えて

1

ようこそ:あなたは論理的||演算子ではなく、論理的&&演算子を使用する必要があります!さて、あなたの質問にお答えしましょう:

最初に、あなたのdo-whileループを考えてみましょう。

do { 
    if (tempCels < 73) { 
     // Temperature too high 
     Console.WriteLine("Temperaturen är för kallt, skruva upp lite!"); 
    } else if (tempCels > 77) { 
     // Temperature too low 
     Console.WriteLine("Temperaturen är för varmt, skruva ner lite!"); 
    } else { 
     // Temperature just right, hop in! 
     Console.WriteLine("Temperaturen är nu lagom, hoppa in!"); 
     return; 
    } 

    fahr = int.Parse(Console.ReadLine()); 
    tempCels = FahrToCels(fahr); 

} 
while (tempCels < 73 || tempCels > 77); 

ご覧のとおり、不要なelse条件を削除しました。現時点で何が起こるかは、すべての条件がチェックされていることです(temp < 73temp > 77、および73 < temp < 77)。

1つの間違いは、他の回答でも指摘されていますが、|| (OR)の代わりに&& (AND)だったということです。そしてもちろん、値が今73の下および77 :)

上の両方にすることはできません、私は/また、いくつかのスタイリングを指摘して、私はあなたが「修正」すべきだと思う一般的なものが欲しい:

1)あなたの一時的な変換方法には、不要な変数の作成と割り当てが含まれています。

public static int fahrToCels(int fahr) { 
     // It returns just the same, without needing to create a new, 
     // temporary temperature variable! 
     return (fahr - 32) * 5/9; 
    } 

2)これは議論の余地があるかもしれないが、一般的な命名規則は、その関数名はキャメルケースで書かれていると言う:あなたは、それはこのように、それなしで全く同じように動作させることができます。

3)このシナリオでは特に問題はありませんが、アプリケーションをスケールアップ(または、より大きなものを操作)すると問題になることがあります。 もっと説明的な名前を付けるのが最善です(大きなプロジェクトでは混乱するかもしれません)。繰り返しますが、これは大きな問題ではなく、将来のために考慮すべきものです。

P.S.私は私の例で変数名を変更していませんでしたが、あなたが示したコードにもっと読みやすく/関連性を持たせるためです。

EDIT:要求ごととして

、ここdouble型として値を維持する方法です。

// Notice the return type and the property types are both double. 
    public static double fahrToCels(double fahr) { 
     return (fahr - 32) * 5/9; 
    } 

この方法では、値は整数のみでなければならない、と分裂の奇妙な結果を生成しない - 彼らはあまりにもdouble型のものとすることができます!

ここで、double型の変数を関数に渡す必要があります。そうしないと、型エラーが発生します。

ヒント:

double fahr = int.Parse(Console.ReadLine()); 

は(のような、言う、17.7)ユーザーが非整数値を渡すことができますし、それが適切に保存されます。

ヒント#2:あなたは本当にフライ変換に行いたい場合は

、あなたはこのようにこれを達成することができます(例えば、値):

int ourInteger = 4; 
double ourNewDoubleNumber = (double)ourInteger/23; 

あなたは種類や型のキャストについての詳細を読むことができますここに:Types and Type Casting

+0

ありがとうございます!あなたの貴重なご意見をお待ちしており、将来のプロジェクトを行う際には心がけています。あなたはまた私の最後の段落について何か知っていましたか?私の先生は、高学年のために "(fahr - 32)* 5/9;"何とか二重に? – Kian

+0

うん。除算を行っているので、整数でない値になる可能性があります。つまり、すべての変数(tempCelsとfahrの両方)をdouble型にすることができます。 –

+0

どうすればいいですか?私はいくつかのconvert.toDoubleとDouble.parseを試しましたが、そのうちの1つではありません。 – Kian

4

tempCels < 73 && tempCels > 77は真なることはありません!

は、おそらくあなたは、一時は77より73未満以上であるが、誰が知っているときに実行するように||を望んでいました。

+0

これは簡単だった – Squareoot

+0

ありがとう!それを私が直した! – Kian

+0

@Kianがあなたを助けたら正解とマークしてください! – tilz0R

0

while条件が真であるときにループしますが、tempCelsは同時に<73>77にはなりません!その状態を修正すれば正常に動作します。

2

tempCels(またはその任意の数)は、同時に73より小さく77より大きくすることはできません。 StackOverflowのに

do { 
    // code 
} while (tempCels < 73 || tempCels > 77); 
// Here ---------------^ 
+0

ありがとう!私はそれを修正した – Kian

+0

あなたは私が書いた最後の段落について何か知っていますか?数式を倍精度に変換することについて – Kian

+0

@Kianは 'double'sと浮動小数点リテラル(例えば' 5'の代わりに '5.0')を使用します。 – Mureinik

関連する問題