【问题标题】:input float in C++?在 C++ 中输入浮点数?
【发布时间】:2021-03-25 12:53:25
【问题描述】:

我编写了一个程序来计算所有可能性,但是使用整数,现在我必须为浮点数做这件事,我怎样才能将程序更改为输入浮点数而不是整数? 这只是一部分,但如果我可以在第一次切换时做到这一点,我可以为所有人做到:

#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;

【问题讨论】:

  • 根据类型写template functions
  • 除了代码中的其他问题,指向float的指针与指向int的指针不兼容,为什么你的函数参数不是指向float的指针?
  • 向我们展示您声称可以正常工作的代码的int 版本。显示损坏的float 代码并没有什么好处。有了“好”的代码,我们就可以在提供答案时使用。

标签: c++


【解决方案1】:

如果您想在 input 函数中解析 float 值,则必须有一个兼容的参数,因为您将浮点数组作为参数传递(它成为指向第一个元素的指针数组),您需要一个指向 float 的指针,而不是指向 int 的指针。

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 技能吗?
  • @iliealexandru,当然,事实上,我会将您重定向到 Language Books/Tutorials for popular languages 以获取所有主要语言的书籍列表,尤其是 C++ The Definitive C++ Book Guide and List,没有坏书到达这些列表,所以你可以随意选择。
  • @iliealexandru,不客气,如果事实上第一个链接有点偏离,它会引导你找到答案,这是更准确的stackoverflow.com/q/22873/6865932,不幸的是没有一个全面的描述指南java 就像 C++ 的那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多