在C++中输入浮点数?

3

我编写了一个程序来计算所有可能性,但是输入的是整数,现在我需要输入浮点数,我该如何更改程序以输入浮点数?如果我可以为第一个开关做到这一点,那么我就可以为所有开关做到这一点:

#include <fstream>
using namespace std;
ifstream in("multimi.in");
ofstream out("produs.out");
void input(int *v)
{
    for(int i=1; i<=2; i++)
        in>>v[i];
}

int main()
{
    float a[3],b[3],c[3],d[3],e[3],s[3];
    int num_tot;
    in>>num_tot;
    switch(num_tot)
    {
        case 2:
        input(a);
        input(b);

        for(int i=1; i<=2; i++)
            for(int j=1; j<=2; j++)

                    out<<a[i]<<","<<b[j]<<endl;
        break;

这是使用int类型的可行代码:

#include <fstream>

using namespace std;
ifstream in("multimi.in");
ofstream out("produs.out");
void input(int *v)
{
    for(int i=1; i<=2; i++)
        in>>v[i];
}

int main()
{
    int a[3],b[3],c[3],d[3],e[3],s[3];
    int num_tot;
    in>>num_tot;
    switch(num_tot)
    {
        case 2:
        input(a);
        input(b);

        for(int i=1; i<=2; i++)
            for(int j=1; j<=2; j++)

                    out<<a[i]<<","<<b[j]<<endl;
        break;

1
根据类型编写模板函数 - PaulMcKenzie
除了代码中的其他问题,指向浮点数的指针与指向整数的指针不兼容,为什么你的函数参数不是指向浮点数的指针? - anastaciu
1
请展示您声称能够正常工作的代码的“int”版本。展示错误的“float”代码并没有什么用处。有了“好”的代码,我们在提供答案时才有可操作性。 - PaulMcKenzie
1个回答

1
如果你想在你的输入函数中解析一个浮点数值,你需要一个兼容的参数。由于你正在传递一个浮点数数组作为参数(它变成了数组的第一个元素的指针),所以你需要一个指向浮点数而不是整数的指针。请保留HTML标签。
void input(float *v){ ... }

我还需要指出的是,您正在绕过数组中的第一个元素,索引从[0]开始。

另一件事情是要避免使用全局变量,如果您想在函数中使用in流,可以将其作为函数的参数通过引用传递,前提是您知道其寿命将超过引用的生命周期:

综上所述,您将得到以下内容:

void input(float *v, ifstream& in)
{
    for (int i = 0; i < 2; i++)
        in >> v[i];
}

int main()
{
    ifstream in("test.txt");
    ofstream out("produs.out");
    float a[2], b[2];
    int num_tot;

    if (in.is_open() && out.is_open()) //it's important to check for successful file opening
    {
        in >> num_tot;

        switch (num_tot)
        {
        case 2:
            input(a, in);
            input(b, in);
            for (int i = 0; i < 2; i++)
            {
                out << a[i] << ", " << b[i] << endl;
            }
            break;
        }
    }
}

如果您需要同时适用于intfloat的内容,您可以使用模板创建一个可以接受两种类型的函数。我承认现在可能有些困难,但当您更加熟悉该语言时,可以考虑这个建议。
template<typename T> void input(T& v, ifstream& in)
{
    for (int i = 0; i < 2; i++)
        in >> v[i];
}

这里的T可以接受intfloat,而且还具有传递引用的优点。当然,如果您希望这样做,仍然可以使用指针,但通过引用传递更可取,因为它更安全。

注脚

考虑不使用using namespace std;。您可以查看this link 了解原因,以及何时可以安全地使用和替代方案。


谢谢!我真的很感激!你能推荐一本提高我在C++或Java方面技能的书吗? - ilie alexandru
@iliealexandru,当然,实际上我会将您重定向到流行语言的语言书籍/教程,以获取所有主要语言和特别是C++的书籍列表《权威C++书籍指南和列表》,这些列表中没有糟糕的书籍,因此您可以随意选择。 - anastaciu
@iliealexandru,不用谢,事实上第一个链接有点偏差,它会直接跳到一个答案,这个更准确一些 https://dev59.com/a-o6XIcBkEYKwwoYTzRZ,不幸的是,Java 没有像 C++ 那样全面描述的指南。 - anastaciu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接