[函数]——C++ Prime Plus ch7

1.基本知识

①函数定义

C++对返回类型有限制:不能是数组,但可以是其他类型,甚至是结构体和对象(可以将数组作为结构或对象组成部分来返回)。

②函数原型

函数原型描述了函数到编译器的接口,它将函数返回类型以及参数类型和数量告诉编译器,使得编译器能够正确检查出这些错误,极大降低程序出错的几率。

函数原型中参数列表不要求提供变量名,只需要提供类型列表就好了,但是提供变量名将使得原型更容易理解。

C++自动将传递的值转换为原型中指定的类型(两者都是算术类型,并且转换是有意义的,即保证程序按照想法正确运行),在编译阶段进行的原型化被称为静态类型检查。

③函数调用

2.函数参数和按值传递

①按值传递:

在C++中,使用参数表示实参,参量表示形参。值传递就是将参数的值传递给形参,函数执行的操作将不会影响main()函数中参数的值。

②多个参数

函数可以有多个参数,用逗号将这些参数分隔开即可。

技巧:

1.cin>>tatal>>choice;连续输入

2.多个数字相乘且相除,不要先把乘的算完再算除法,中间值会很大,建议先乘一个数,再除一个数,中间值不会很大,防止越界。

3.函数和数组

①函数接口

函数是处理复杂的类型(如数组和结构)的关键,下面介绍如何将数组和函数结合在一起。

用函数来处理数组,函数的参数至少要为数组名和数组的长度:

int sum_arr(int arr[],int size)

方括号指出arr是一个数组,方括号为空则表示可以将任何长度的数组传递给该函数。但实际情况是arr不是数组,而是一个指针,但在编写函数时,依然可以将它当作数组来使用。

1.函数如何使用指针来处理数组?

我们知道,数组名实际上是数组第一个元素的地址,因此函数传递的是地址,所以正确的函数头应该是这样:

int sum_arr(int* arr,int size)

事实上,这两个声明都是正确的,当且仅当用于函数头和函数原型时 int * arr = int arr[ ].但建议采用数组的形式来声明,这提示用户,arr不进指向int,还指向int数组的第一个int。

请记住下边两个等式:

arr[i] = *(arr+i);
&arr[i] = arr+i;

2.将数组作为参数意味着什么?

传递常规变量时,函数将使用变量的拷贝,但传递数组时,函数将使用原来的数组,这并没有违反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;
}

4.将上述代码组合起来

已经完成了所有处理数组的函数,因此main()函数的工作很简单,只需要判断在更新房地产价值时用户输入是否为数字,如果不是,则要求用户重新输入。

#include
int fill_array(double arr[], int n);
void show_array(const double arr[], int size);
void revalue(double r, double arr

你可能感兴趣的:(C++学习记录,c++,开发语言)