2012-01-03 7 views
5

と比較しても問題ありません。さまざまな種類のお金をドルに変換して練習しています。何らかの理由で、char変数の入力として 'e'をタイプし、if文で 'e'と比較すると、比較はできませんが、別の文字に置き換えればうまく動作します。どうしたんだ? HERESにコード:ここで文字 'e'を入力して

int main() 
{ 
    const double yen_per_dollar = .013; 
    const double pound_per_dollar = 1.55; 
    const double euro_per_dollar = 1.29; 

    double amount = 1; 
    char unit = ' '; 

    std::cout << "Please enter a amount followed by a unit (p, y, or e): "; 
    std::cin >> amount >> unit; 

    if (unit == 'y') 
     std::cout << amount << " yen is $" << amount * yen_per_dollar << " dollars.\n"; 
    if (unit == 'p') 
     if (amount == 1) 
      std::cout << amount << " pound is $" << amount * pound_per_dollar << " dollars.\n"; 
     else 
      std::cout << amount << " pounds is $" << amount * pound_per_dollar << " dollars.\n"; 
    if (unit == 'e') 
     if (amount == 1) 
      std::cout << amount << " euro is $" << amount * euro_per_dollar << " dollars.\n"; 
     else 
      std::cout << amount << " euros is $" << amount * euro_per_dollar << " dollars.\n"; 
    else 
     std::cout << "Sorry, that input isn't in the correct format." << std::endl; 
    std::cin >> amount; // Keeps window open 
} 
+8

'3.14e20'は' double'値の有効な指定です。乾杯、 –

+0

ああ、私はそれが何かを持っているかもしれないと思っていました。ちょうど学年の表記を覚えています。ありがとう。 – Fuddlebutts

+1

'system(" pause ");'のようなプラットフォーム依存のテクニックを使ってプログラムを人工的に一時停止しないでください。問題が「ウィンドウが消えてしまう」という問題がある場合は、プログラムの実行時間をウィンドウの寿命と結びつけないようにプログラムを別々に実行してください。あなたのプログラム**はコマンドウィンドウ**を作成しないので、それを維持するのは論理的に責任がありません。 –

答えて

-1

は、あなたのプログラムのための提案です:

1.使用してプログラムを一時停止またはVisual Studioを使用している場合、デバッグウィンドウはを待機するようにプロジェクト設定の変更を行うにはsystem("pause");のようなもの実行後にあなた。

2.次のifステートメントの場合は、elseステートメントと中括弧で囲む必要があります。ここでは、このような方法でそれを行う場合は、あなたの最後のelse文はあなたに正しい結果が得られます

else if (unit == 'p') { 
    if (amount == 1) 
     std::cout << amount << " pound is $" << amount * pound_per_dollar << " dollars.\n"; 
    else 
     std::cout << amount << " pounds is $" << amount * pound_per_dollar << " dollars.\n"; 
} 

、例です。さもなければ、あなたは常に、 "e"を除いて "申し訳ありません、その入力が正しいフォーマットではありません"と感じます。確かに、それはあなたのプログラムで起こっていることです。

3. int戻りタイプmainの機能にreturn 0ステートメントを追加する必要があります。

4の代わりにはstd一度このステートメントを追加することができ、すべての時間を入力し、

using namespace std; 

あなたはプリプロセッサが含まれており、このように、その後std namespace含めて省略することができた後、

cout << "Please enter a amount followed by a unit (p, y, or e): "; 


5. eがありますinteger/doubleなどの数値型で使用するための予約済みの文字。 eは指数関数を意味する。通貨を入力するときは、前にスペースを使用して、このeが数値入力の一部ではないことを明示的に教えてください。それ以外の場合は、文字列を使用して入力を解析する必要があります。

+0

'main()'の最後から明示的な 'return'を省略すると、' return 0; 'と書いたようになります。 'main()'だけがこの免除を取得します。私はそれほど好きではありませんが、それは標準的な振る舞いです(そしてC99もこれをサポートしていますので、C11もそうです)。 –

+0

"return 0"を使うと良いでしょう。昔は、ほとんどのジャッジコンパイラがそうではなかったので、プログラミングコンテストではコンパイル時にエラーが発生しました。 –

+0

プログラムが不要な名前空間のメンバーを含む良い量のメモリを消費していると明示的な資格が良いでしょう。多くの事柄。 –

2

多くのコメントがありますが解決策はありません。実際、私は良い解決策を思い付くこともできませんでした。私が考えることができる最高のものは、カスタムのnum_getファセットをインストールすることです(これだけで、コードは宿題のソリューションとして手渡されるのに適していると確信しています)。これはやや進歩したものです。これを考えてください。

これ以外にも、私は通貨をデータ駆動したいと思っています。つまり、各通貨のコードブランチを使用する代わりに、すべての通貨を記述するコンテナを設定する必要があります(BTW、複数ユーロはユーロです)。結果のプログラムは次のようになります。

#include <iostream> 
#include <locale> 
#include <string> 
#include <tuple> 
#include <map> 
#include <ctype.h> 

struct currency_get: 
    std::num_get<char> 
{ 
    iter_type do_get(iter_type it, iter_type end, std::ios_base&, std::ios_base::iostate& err, double& v) const 
    { 
     std::string input; 
     for (; it != end && (*it == '.' || *it == '-' || *it == '+' 
          || isdigit(static_cast<unsigned char>(*it))); ++it) 
     { 
      input.push_back(*it); 
     } 
     errno = 0; 
     if (input.empty()) 
     { 
      err |= std::ios_base::failbit; 
     } 
     else 
     { 
      v = strtod(input.c_str(), 0); 
     } 

     return it; 
    } 
}; 

int main() 
{ 
    typedef std::tuple<double, std::string, std::string> desc; 
    std::map<char, desc> currencies; 
    currencies['y'] = desc(0.013, "yen", "yen"); 
    currencies['p'] = desc(1.55, "pound", "pounds"); 
    currencies['e'] = desc(1.29, "euro", "euro"); 

    double amount(0); 
    char currency(' '); 
    std::locale loc(std::locale(), new currency_get); 
    std::cin.imbue(loc); 

    if (std::cin >> amount >> currency) 
    { 
     std::map<char, desc>::const_iterator it(currencies.find(currency)); 
     if (it != currencies.end()) 
     { 
      desc const& d(it->second); 
      std::cout << amount << " " << (amount == 1? std::get<1>(d): std::get<2>(d)) << " is " 
         << (std::get<0>(d) * amount) << " dollar" 
         << (std::get<0>(d) * amount == 1? "": "s") << "\n"; 
     } 
    } 
    else 
    { 
     std::cout << "input failed\n"; 
    } 
} 
+2

私は最も簡単な解決策は、数字と通貨指定子の間にスペースを入力するようにユーザーに要求することだと思います。 :) –

関連する問題