2016-04-12 19 views
-1

所以我刚刚在SPOJ上完成了“两个数字的总和”。我的代码通过了测试用例;然而,它对我来说似乎并不高雅。我的第一个方法是尝试实现一个模板来处理多种数据类型。我无法弄清楚如何成功地做到这一点。(C++)添加int和/或double并显示总和

我的问题:如何编写这个程序,以便它使用一个类以及一个函数模板(它处理int和double)。我觉得使用floor()有点怪,不合适。如果使用模板不是一个好的解决方案,那么更好的解决方案也很好。谢谢。


编辑: 以下解决方案的工作就好了。我对学习更多关于类的兴趣非常有兴趣(OOP对我来说是新的),我也想了解更多关于模板的知识。这是解决问题的链接SPOJ:http://www.spoj.com/problems/CHITEST1/

我的代码:

//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

首先,我想说的是应用=/=浮点类型是非常危险的。即使你在使用地板。使用比较一些非常低的epsilon值。 (if (abs(a - b) < eps),其中epsilon类似于0.00001,取决于您所需的精度)。第二,我并不真正了解楼层在这里的想法,因为noshowpoint cout修饰符是默认启用的,也就是说,3.3 + 4.7 应该应该正好打印8,如果计算没有任何错误 - 不是8.00000 (我不会那样做,因为它可能导致7.99999998或8.00000001)。楼层具有相同的可靠性水平,因为楼层(7.999998)是7,而不是8.说实话,我会在这里使用。

第三,如果你想学习OOP或模板,这些不是你想要做的任务。这个网站看起来像一个比赛相关的太多,你需要的教育信息。看这里:http://www.cplusplus.com/doc/tutorial/

+0

这个问题现在看起来非常愚蠢。我不知道cout会为我处理这个问题。感谢所有的帮助。我将把变量保留为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; 
}