【问题标题】:create 2 functions that read and display data [duplicate]创建2个读取和显示数据的函数[重复]
【发布时间】:2021-03-11 07:20:49
【问题描述】:

我正在尝试创建函数 read() 和 display()。他们应该读取 3 个值并使用另一个函数 display() 打印这 3 个值。我试过这样做:

#include<iostream>
int read(void);
void display(int n1, int n2, int n3);
using namespace std;
int main()
{
    int n1, n2, n3;
    n1, n2, n3 = read();
    print(n1,n2,n3);
    reverse(n1,n2,n3);
    
    return 0;    
}

int read(void)
{
    int n1, n2, n3;
    
    cout << "Enter three numbers: ";
    cin >> n1;
    cin >> n2;
    cin >> n3;
    return n1, n2, n3;
}

void display(int n1, int n2, int n3)
{
    cout << n1 << " " << n2 << " " << n3 << endl;
    return;
}

它只存储了 n3 值。我还有其他方法可以解决这个问题吗?

【问题讨论】:

  • 不能从 C/C++ 中的函数返回三个值。通过指针传递计算值或创建并返回动态数组。
  • 看起来你已经习惯了 Python 或类似的东西。如果要在 C++ 中返回多个值,则需要做更多的工作。看看std::tuplestructured bindings 这个案例。
  • 要返回多个值,然后将它们分配给多个值,您可以使用结构化绑定en.cppreference.com/w/cpp/language/structured_binding

标签: c++


【解决方案1】:

C++ 不允许像您尝试的那样多次重新运行。有多种方法可以做到这一点。


解决方案一:传递指向值的指针并在read函数中设置它们:

#include <iostream>

using namespace std;

void read(int* n1, int* n2, int* n3);
void display(int n1, int n2, int n3);

int main()
{
    int n1, n2, n3;
    read(&n1, &n2, &n3);
    display(n1, n2, n3);
    //print(n1,n2,n3);
    //reverse(n1,n2,n3);

    return 0;
}

void read(int* n1, int* n2, int* n3)
{
    cout << "Enter three numbers: ";
    cin >> *n1;
    cin >> *n2;
    cin >> *n3;
}

void display(int n1, int n2, int n3)
{
    cout << n1 << " " << n2 << " " << n3 << endl;
    return;
}

另外,对于同样的方法,您可以处理引用而不是指针,在 C++ 中,通过引用传递可以应用于所有类型,而不仅仅是原始类型。它看起来像这样:

void read(int &n1, int &n2, int &n3)
{
    cout << "Enter three numbers: ";
    cin >> n1;
    cin >> n2;
    cin >> n3;
}

调用它的函数main 会变成:

read(n1, n2, n3);

请注意,&amp; 存在于 read 函数签名中至关重要,以确保您通过引用而不是值传递。按值传递不会反映原来传递的参数。

这与通过指针传递的效果相同,但看起来更简洁,并且不需要您使用*


解决方案二:在 cpp 文件中声明它们是全局的。我不推荐这种解决方案,因为函数最好携带自己的数据,而不是过多地依赖全局变量,除非没有其他方法。一般来说,类/结构更适合这个。

#include<iostream>

void read(void);
void display();

int n1, n2, n3;  // declared here

using namespace std;

int main()
{
    read();
    display();
    //print(n1,n2,n3);
    //reverse(n1,n2,n3);
    
    return 0;    
}

void read(void)
{
    cout << "Enter three numbers: ";
    cin >> n1;
    cin >> n2;
    cin >> n3;
}

void display()
{
    cout << n1 << " " << n2 << " " << n3 << endl;
    return;
}

解决方案三:使用数据结构来保存值并进行处理。在这种方法中,我们将 n1 n2 n3 作为结构的一部分,并从函数中获取它。

#include<iostream>

struct data{
    int n1; 
    int n2;
    int n3; 
}

data read(void);
void display(data);



using namespace std;

int main()
{
    data d = read();
    display(d);
    //print(n1,n2,n3);
    //reverse(n1,n2,n3);
    
    return 0;    
}

data read(void)
{
    data d; 
    cout << "Enter three numbers: ";
    cin >> d.n1;
    cin >> d.n2;
    cin >> d.n3;
    return d;
}

void display(data d)
{
    cout << d.n1 << " " << d.n2 << " " << d.n3 << endl;
    return;
}

正如其他人在 cmets 中建议的那样,您也可以使用 std::tuple 返回多个值,它的工作方式类似于在解决方案三中使用 data struct 的方式,这是我最推荐给您的解决方案案例:

#include <iostream>
#include <tuple>

using namespace std;

tuple<int, int, int> read(void);
void display(tuple<int, int, int>);




int main()
{
    tuple<int, int, int> d = read();
    display(d);
    //print(n1,n2,n3);
    //reverse(n1,n2,n3);
    
    return 0;    
}

tuple<int, int, int> read(void)
{       
    int n1, n2, n3; 
    
    cout << "Enter three numbers: ";
    cin >> n1;
    cin >> n2;
    cin >> n3;
    
    return std::make_tuple(n1, n2, n3);
}

void display(tuple<int, int, int> d)
{
    cout << std::get<0>(d) << " " << std::get<1>(d) << " " << std::get<2>(d) << endl;
    return;
}

【讨论】:

  • @ThomasSablik 我的直觉告诉我要使用引用,但我无缘无故地选择了指针。我知道最好推荐参考,我会编辑。
【解决方案2】:

使用 C++14,您可以使用结构化绑定、auto 返回类型和元组。它与 Python 非常相似,但更冗长:

#include <iostream>
#include <tuple>

void display(int n1, int n2, int n3);

auto read(void) {
    int n1, n2, n3;
    
    cout << "Enter three numbers: ";
    cin >> n1;
    cin >> n2;
    cin >> n3;
    return std::make_tuple(n1, n2, n3);
}

int main()
{
    auto [n1, n2, n3] = read();
    display(n1,n2,n3);
    
    return 0;    
}

void display(int n1, int n2, int n3)
{
    std::cout << n1 << " " << n2 << " " << n3 << '\n';
    return;
}

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2018-05-16
    • 2021-05-10
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多