第2关:几点几分了?
200
- 任务要求
- 参考答案
- 评论
任务描述
本关任务:编写一个函数 whatTime,该函数通过秒表显示的秒数,计算当前的时间(几点几分几秒),计算得到的时间通过参数返回。
相关知识
本关内容涉及传引用,是 C++ 对 C 语言的扩充部分, C 语言不包括这部分内容。
由于 C++ 的函数只能返回一个值,而本题要求返回当前时间(几点几分几秒),需要返回三个值,所以没法通过 return 语句一次返回(如果学了结构也可以把三个数据一起打包返回),但 C++ 函数参数提供了另一种返回值的方式:引用参数。
函数调用时,需要进行参数传递,即把实参的值逐个传给对应的形参。对 C++ 而言参数的传递方式有两种:传值和传引用。
参数传值
传值是指值的复制,即把实参的值传递给形参,实参和形参是不同的变量,有各自独立的存储空间,因此函数被调用执行时,只能访问形式参数对应的内存单元,不能访问或修改实在参数的值。
下面的 swap 函数试图交换两参数的值。
#include <iostream>
using namespace std;
// 交换 x 和 y 的值
void swap(int x,int y)
{
int temp = x;
x = y;
y = temp;
}
int main()
{
int a = 10, b = 20;
// 调用函数,试图交换
swap(a, b);
cout << "a:" << a << " b:" << b << endl;
return 0;
}
程序的运行结果显示 a 和 b 的值并没被交换。
这是因为 main 函数在执行swap(a,b)
时,是把实在参数 a 和 b 的值传给了 swap 中形式参数 x 和 y,swap 函数中交换的也只是形参 x 和 y 这两个局部变量的值,跟 a 、b 两个变量无关,当 swap 函数执行完后,就返回到 main 函数的调用语句处,继续向下执行,输出 a 、b 的值,因此依然是原来的10和20。
参数传引用
传引用是指调用函数时,把对实参变量的引用传给形式参数,即将实参变量的地址存放到对应的形参的形式单元中。
当程序转入到被调用函数后,在执行函数体过程中,对形式参数的任何引用或赋值都被处理成对相应形式单元的间接访问,即根据形式单元中存放的实参变量的地址找到实参单元,对形式参数的引用或赋值被处理成对该实参单元的访问。
也就是说,对形参的访问实际上就是对实参的访问,可以通过修改实参的方式把数据传出被调用函数。
提示:传引用要求实在参数必须是变量。
修改上面的 swap 函数,实现真正的交换。
#include <iostream>
using namespace std;
// 交换x和y的值
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
int main()
{
int a = 10, b = 20;
// 调用函数,试图交换
swap(a, b);
cout << "a:" << a << " b:" << b << endl;
return 0;
}
输出结果为:a:20 b:10
程序中函数 swap 的参数定义为int &x,int &y
,其中 x 、y 前面的 & 为引用符号,表示 x 、y 是引用变量,调用该函数时,对应参数的传递采用传引用方式。这时函数 swap 中修改 x 和 y 的值,实际上就是在修改实参 a 和 b 的值。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,编写函数 whatTime,该函数通过秒表显示的秒数(该数据由平台提供,你需要获取后使用),计算当前的时间(几点几分几秒),计算得到的时间通过参数返回。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:23456
预期输出:6:30:56
测试输入:34567
预期输出:9:36:7
#include <iostream>
using namespace std;
void whatTime(int secs, int &h, int &m, int &s)
{
// 请在这里补充代码,设计并实现函数whatTime,使main函数中的函数调用正确
/********** Begin *********/
s = secs % 60;
m = secs / 60 % 60;
h = secs / 60 / 60;
/********** End **********/
}
int main()
{
int secs; // secs秒表上的秒数
int h, m, s; // 当前时间:h-小时,m-分,s-秒
cin >> secs; // 输入秒表上的秒数
whatTime(secs,h,m,s); // 计算当前时间
cout << h << ":" << m << ":" << s << endl; // 输出当前时间
return 0;
}