创建2个读取和显示数据的函数



我正在尝试创建一个函数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++不允许像您尝试的那样多次重试。有多种方法可以做到这一点。


解决方案一:传递指向值的指针并在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);

请注意,&存在于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;
}

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

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

使用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;
}

最新更新