C++对返回类型有限制:不能是数组,但可以是其他类型,甚至是结构体和对象(可以将数组作为结构或对象组成部分来返回)。
函数原型描述了函数到编译器的接口,它将函数返回类型以及参数类型和数量告诉编译器,使得编译器能够正确检查出这些错误,极大降低程序出错的几率。
函数原型中参数列表不要求提供变量名,只需要提供类型列表就好了,但是提供变量名将使得原型更容易理解。
C++自动将传递的值转换为原型中指定的类型(两者都是算术类型,并且转换是有意义的,即保证程序按照想法正确运行),在编译阶段进行的原型化被称为静态类型检查。
①按值传递:
在C++中,使用参数表示实参,参量表示形参。值传递就是将参数的值传递给形参,函数执行的操作将不会影响main()函数中参数的值。
②多个参数
函数可以有多个参数,用逗号将这些参数分隔开即可。
技巧:
1.cin>>tatal>>choice;连续输入
2.多个数字相乘且相除,不要先把乘的算完再算除法,中间值会很大,建议先乘一个数,再除一个数,中间值不会很大,防止越界。
函数是处理复杂的类型(如数组和结构)的关键,下面介绍如何将数组和函数结合在一起。
用函数来处理数组,函数的参数至少要为数组名和数组的长度:
int sum_arr(int arr[],int size)
方括号指出arr是一个数组,方括号为空则表示可以将任何长度的数组传递给该函数。但实际情况是arr不是数组,而是一个指针,但在编写函数时,依然可以将它当作数组来使用。
我们知道,数组名实际上是数组第一个元素的地址,因此函数传递的是地址,所以正确的函数头应该是这样:
int sum_arr(int* arr,int size)
事实上,这两个声明都是正确的,当且仅当用于函数头和函数原型时 int * arr = int arr[ ].但建议采用数组的形式来声明,这提示用户,arr不进指向int,还指向int数组的第一个int。
请记住下边两个等式:
arr[i] = *(arr+i);
&arr[i] = arr+i;
传递常规变量时,函数将使用变量的拷贝,但传递数组时,函数将使用原来的数组,这并没有违反C++按值传递的方法,只是因为形参和实参因为传递的是地址,指向的是同一个东西而已。
并且,因为传递的参数只有数组首元素的地址和数组的大小,函数缺少一些关于原始数组的知识,例如,他不能使用sizeof来获悉原始数组的长度(只能得到指针的大小),而只能依赖传入的第二个参数,所以我们可以“欺骗”函数,使得它处理一整个数组的部分元素(前三个元素,或者第四个元素后的所有元素等)。
编写特定的函数来处理特定的数据操作使得函数模块化,这很重要。假设我们现在要使用一个数组来记录房地产的价值。
思路:(先考虑函数头,在考虑函数功能和其他输入的情况)
1.首先需要确定使用哪种类型。
double类型的取值范围比 int 和 long 大,并且提供足够多的有效位数保证精度。
接下来思考数组元素的数目,假设房地产数目不超过5个,则可以使用一个包含5个元素的double数组。
2.考虑对房地产数组进行的操作。
两个基本操作是填充和显示,我们再添加一个操作:重新评估每种房地产的值,简单起见,假设所有房地产以相同的比率增加或减少。
介绍每个函数的步骤,最后进行整合:
1.填充数组:
改变数组的值,所以不能用const;
通常要管理多个人的投资,因此需要多个数组,数组不能设置固定长度,由第二个参数决定;
用户希望数组被填满时停止读取数据,具备这种特性;
由于用户输入的数量小于数组长度,因此返回实际输入元素的数目;
数组如何提前停止输入? 1)特殊值来结束循环——这里因为正常输入均为正值,我们采用输入负值结束循环。
此外,程序需要对错误输入作出反应——如停止输入等。
#include
int fill_array(double arr[], int n);
int main()
{
return 0;
}
int fill_array(double arr[], int n)
{
using namespace std;
int i = 0;
double temp;
//填充数组
for (i = 0; i < n; i++)
{
cout << "Enter value:\n" << "# " << i + 1 << ":"; //提示语要有
cin >> temp;
//处理错误输入
if (!(cin))
{
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Wrong input!input process terminated.\n";
break;
}
//处理提前结束情况
else if (temp < 0)
{
break; //结束填充
}
//均不是上边两种情况
arr[i] = temp;
}
//填充结束,返回真正填充的数量
return i; //循环最后一步是 i+1,所以直接返回i;
}
2.显示数组及应用const保护
显示函数很简单,只需要将数组名和数组大小传递给函数即可,但是有另一个要考虑的问题,我们仅仅是显示数组,不希望函数修改数组值,所以应用指向const的指针来对数据进行保护。
//显示函数
void show_array(const double arr[], int size)
{
for (int i = 0; i < size; i++)
{
std::cout << "Property: #" <
3.修改数组:
函数参数应该包含所乘的比例,所以有三个参数;
函数修改数组的值,不需要返回值;
要改变数组的值,所以不能使用const保护;
void revalue(double r, double arr[], int size)
{
for (int i = 0; i < size; i++)
arr[i] *= r;
}
已经完成了所有处理数组的函数,因此main()函数的工作很简单,只需要判断在更新房地产价值时用户输入是否为数字,如果不是,则要求用户重新输入。
#include
int fill_array(double arr[], int n);
void show_array(const double arr[], int size);
void revalue(double r, double arr