要求
编写一个函数,计算需要把纸折叠多少次(假设纸张足够大,可以无限次折叠),其厚度才能搭建一座登月纸桥,考虑到将来需要到更远的星球,所以函数需要根据具体距离计算纸张折叠的次数并返回。
相关知识
函数是一个命名的程序代码块,是程序完成其操作的一种功能单位。在程序设计中,有许多算法是通用的,例如求一个数的平方根,求一个三角函数等,经常会将这些算法定义为一个函数,这样在程序中需要这些算法的地方就可以直接使用(通过函数调用)它们了。
虽然 C 和 C++ 的库函数已经提供了丰富的功能,但很多时候程序员还是需要根据具体问题的需求定义自己的函数。函数需要先定义再使用(函数调用)。
函数的定义
函数定义的一般格式为:
<返回值类型> <函数名>(<参数列表>)
<函数体>
<返回值类型>
、<函数名>
及<参数列表>
构成了函数头。<返回值类型>
说明函数返回值的数据类型,也称为函数的返回类型。
它可以是任一基本数据类型或用户自定义的数据类型;如果无返回值,则用关键字 void 说明。默认的返回类型是 int,即若未指定返回类型,则返回类型是 int 。
<函数名>
是程序员为该函数指定的名字,函数名需要遵守标识符命名规定。<参数列表>
指明函数的参数的个数、名称和类型,函数定义中的参数称为形式参数,简称形参。
当有多个形式参数时,用逗号分隔。如果函数没有形参,参数列表为空,函数名后面的圆括号不能少,这时也可在括号中加上关键字 void,表示这是一个无参函数。
<函数体>
描述函数的功能,即函数所完成的具体操作,它由一系列说明语句和执行语句组成。
函数体实际上是一个复合语句,花括号不能少,它指明函数体的开始和结束。函数执行时,如同执行一个复合语句一样,顺序执行函数体,直到遇到 return 语句或者遇到表示函数体结束的那个右花括号为止,函数执行完毕后,返回调用程序继续执行。
- 例如,下面的程序定义了一个名为 max 的函数,该函数有3个形式参数 a、 b 和 c,类型均为 int,返回值也是 int类型。函数体由一个变量说明语句、一个赋值语句和一个返回语句构成。函数的功能是求 a 、b 和 c 中最大的值:
int max(int a, int b, int c)
{
int m;
m = (a > b) ? a : b;
return (m > c) ? m : c;
}
constraint:
- 所有函数的定义是并列的、平行的,在一个函数定义内部不允许定义另外一个函数。但可以对别的函数进行调用或作引用说明;
- 函数定义中声明的所有变量都是局部变量,只在声明语句所处的程序块中有效。大多数函数都有一组参数,函数定义时指明了每个形式参数的名字、类型,函数调用时提供的实在参数要与形式参数一一对应(函数调用时需要进行参数传递,将实参的值一个个传给对应的形参)。函数的形式参数也可视为局部变量,在函数体范围内有效;
- 函数可以有返回值,也可以没有返回值;
- 函数没有返回值时,返回类型必须用关键字 void 说明。这类函数的函数体内没有 return 语句或 return 语句中无表达式。当函数执行到 return 语句时,程序返回到调用该函数的地方;如果函数体没有 return 语句,当执行完函数体最后的语句后,程序再返回到调用该函数的地方;
- 函数有返回值时,必须指明返回值类型(不能是 void ),此时函数体必须包含带表达式的 return 语句。表达式的值将返回给调用程序,该值的数据类型必须与返回值类型一致;
- 函数体可有多个 return 语句。调用函数执行时,只要遇到一个 return 语句,就马上忽略剩余代码,立刻返回到调用程序;
- 函数需要先定义后使用,但函数的相互调用关系很难保证所有函数都是先定义后使用的。这时就需要先声明函数原型了。
声明函数
为了让 main 程序(或者其他准备调用函数的程序)知道函数的相关信息,需要在调用程序的前面,以“ 函数原型 ”的方式对被调用的函数进行声明。
在 C 和 C++ 中,函数原型的一般形式为:
<返回值类型> <函数名>(<参数列表>);
函数原型形式上只是比函数头多了一个分号,函数原型参数列表中形参的名称可以省略。函数原型告诉编译器后面将会定义这么一个函数,其函数名、返回值类型、参数列表分别是什么,便于编译器检查函数调用的正确性。
例如,前面函数 max 的函数原型可以为:
int max(int , int , int);
- 建议:如果一个文件中定义多个函数时,把主函数之外的其它函数的函数原型都放在文件中所有函数定义的前面,这样所有函数调用就都符合“先声明,后使用”的原则了。
编程要求
已知:月球离地球最近距离(近地点)为363300
千米,最远距离(远地点)为405500
千米,一张纸的厚度一般为0.088
到0.114
毫米。
程序实现
测试输入:363300 0.088
预期输出:需要折叠42次
测试输入:405500 0.088
预期输出:需要折叠43次
#include <iostream>
using namespace std;
// foldTimes-计算建纸桥的折叠次数
// 参数:dis-星际距离(千米),thick-纸的厚度(毫米)
// 返回值:建桥需要折叠的次数
int foldTimes(double dis, double thick);
int main()
{
double dis, thick;
cin >> dis >> thick;
cout << "需要折叠" << foldTimes(dis,thick) << "次" << endl;
return 0;
}
int foldTimes(double dis, double thick)
{
// 请在这里补充代码,实现函数foldTimes
/********** Begin *********/
int sum = 0;
dis = 1000000 * dis;
while (thick < dis)
{
thick *= 2 ;
sum++;
}
return sum;
/********** End **********/
}
思路:
因为dis
和thick
输入的值没有单位的区分,所以默认为dis
和thick
的开始的输入单位都是毫米,则在dis
输入的值的基础上乘1000的平方换算成千米的单位,然后使用while循环到thick
大于或等于dis
的值位置,每循环一次记录一次,最后返回函数的值为记录的次数的值。