2016-04-12 13 views
-1

これで、SPOJで「2つの数値の合計」を完成させました。私のコードはテストケースを通過しました。しかし、それは私にとって非常にエレガントではないようです。私の最初のアプローチは、複数のデータ型を扱うテンプレートを実装しようとすることでした。私はこれをうまくやり遂げる方法を理解できませんでした。(C++)intおよび/またはdoubleを加算して合計を表示

私の質問:このプログラムは、クラスと関数テンプレート(intとdoubleを処理する)を使用するように、どのように記述できますか?私はfloor()を使うのがちょっと奇妙で不適切だと感じています。テンプレートを使用するのが良い解決策でない場合は、より良い方が良いと思うでしょう。ありがとう。


EDIT: 以下のソリューションがうまく動作します。私はクラスについてもっと学びたいと思っています(OOPは私にとっては初めてです)。また、テンプレートについてもっと学びたいと思います。 http://www.spoj.com/problems/CHITEST1/

マイコード:ここでSPOJ上の問題へのリンクですたぶん、あなたはこの探している

//For t test cases, output the sum of two numbers 

#include <iostream> 
#include <cmath> 
using namespace std; 

int main() { 
    int t; 
    cin >> t; 
    while (t--) { 
     double a, b, sum; 
     cin >> a >> b; 
     sum = a + b; 
     if (sum != floor(sum)) cout << sum << endl; 
     else cout << static_cast<int>(sum) << endl; 
    } 
    return 0; 
} 
+0

「エレガントな」と考えるものを教えてください。 – trojanfoe

+1

なぜジャグリング?完全な問題文へのリンクを追加できますか? – Quentin

+0

テンプレート化されたソリューションの実装に関して、あなたが試したことがうまくいかなかったことを詳述するとよいでしょう。あなたの解決策は、 'a'と' b'が異なるタイプまたは同じであると説明しようとしましたか? –

答えて

1

まず、私が適用することを言うと思います=/=を浮動小数点型に変換することは非常に危険です。床を使用している場合でも。いくつかの非常に低いイプシロン値との比較を使用してください。 (if (abs(a - b) < eps)、ここでεは0.00001のようなもので、希望の精度に応じて変わります)。 noshowpoint COUTの修飾子が意味デフォルト、正確に3.3 + 4.7 べき印刷8で有効になっているため、

第二には、私は本当に、床がここにいるの考えを理解していない、それはエラーなしで計算した場合 - ではない8.00000 (それは7.99999998または8.00000001にもなる可能性があるので、私はそれに頼ることはありません)。床は同じレベルの信頼性があります。床(7.999998)は8ではなく7であるからです。正直言って、ここでは丸を使用します。

第3に、OOPやテンプレートを習得したい場合、これは実行したいタスクではありません。このサイトは、コンテスト関連のコンテンツのように見えます。あなたは教育情報が必要です。ここをクリックしてください:http://www.cplusplus.com/doc/tutorial/

+0

この質問は今はまったくばかげているようです。私は臆病者が私のためにこれを処理することを知らなかった。すべての助けをありがとう。変数をdouble型にして、小数点を表示するかどうかをcoutが決定するようにします。ガイダンスをありがとう。私は基本プログラミングを練習する方法としてSPOJを使用していますが、私はOOPを問題に使用しようとしていました(全く必要ないもの)。 –

+0

さて、幸運にも、そして、あきらめないで! C++は楽しいです:) –

0

:!

#include <iostream> 
using namespace std; 

template <typename T> 
void getAddAndPrint() 
{ 
    T a, b; 
    cin >> a >> b; 
    T sum = a + b; 
    cout << sum << endl; 
} 

int main() { 
    // your code goes here 

    getAddAndPrint<double>(); 
    getAddAndPrint<int>(); 
    return 0; 
}