C/C++教程

第七章 函数——c++的编程模块

本文主要是介绍第七章 函数——c++的编程模块,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

创建函数:
定义、提供原型和调用。
1、为什么需要函数原型
原型描述了函数到编译器的接口,也就是,它将函数返回值的类型以及参数的类型和数量告诉了编译器。
c++的编程风格是将main()放在最前面,因为它通常提供了程序的整体结构。
在原型的参数列表里,可以包括变量名,也可以不包括,原型中的变量名相当于占位符,不必与函数定义中的变量名相同。
例如:

double cheer(double x);
可以写成:
void cheers(int);//只提供参数类型,列表即可

原型的功能:
在这里插入图片描述
仅当有意义时,原型化才会导致类型转换。
(原型不会将整数转换为结构或者指针)
在编译阶段进行的原型化被称为静态类型检查。
2、函数参数和按值传递
2.1、多个参数
在调用函数时,只需要使用逗号将这些参数分开即可。
3、函数和数组

int sum_arr{int arr[],int n}; //函数和数组的结合使用

3.1、函数使用指针来处理数组
1、c++将数组名解释为其第一个元素的地址。

int sum=sum_arr(cookies,ArSize);

在,c++中,当用于函数头或者函数原型中, int *arr[]和int arr[ ]的含义才是相同的。他们都意味着arr是一个int 类型的指针。
谨记:
将指针(包括数组名)加1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值。对于遍历数组而言,使用指针加法和数组下标时等效的。
2、将数组作为参数意味着什么
将数组作为参数可以节省复制整个数组所需的时间和内存,如果数组很大,则使用拷贝的系统开销将非常大;程序不仅需要更多的计算机内存,还需要花费时间来复制大块的数据,另一方面,使用原始数据增加了破坏数据的风险。
3、更多数组函数示例
3.1、填充数组

int fill_array(double arr[], int limit)
{
	using namespace std; 
	double temp;
	int i;
	for (i = 0; i < limit; i++)
	{
		cout << "Enter value #" << (i + 1) << ":";
		cin >> temp;
		if (!cin)
		{
			cin.clear();
			while (cin.get() != '\n')
			{
				cin.clear();
				while (cin.get() != '\n')
					continue;
				cout << "Bad input;input process terminated\n";
				break;
			}
		}
		else if (temp < 0)
			break;
		arr[i] = temp;
	}
	return 0;
}

3.2、显示数组及用const保护数组
为防止函数无意中修改数组的内容,可以在声明形参时使用关键字const。
举例:
void show_array(const double ar[ ],int n);
3.3、修改数组
在修改数组的函数中, 由于这个函数将修改数组的值,因此在声明ar时,不能够使用const。
4、程序说明
通过数据类型和设计适当的函数来处理数据,然后将这些函数组合成一个程序。称为自下而上的程序设计。
传统的过程性编程倾向于从上如下的程序设计,首先指定模块化设计方案,然后在研究细节。
两种方法都很有用,最终的产品都是模块化程序。
5、使用数组区间的函数

for(pt=begin;pt!=end;pt++)
{
    total=total+*pt;
}

pt设置为指向要处理的第一个元素的指针,然后加入total中,然后通过递增操作来更新pt,使之指向下一个元素,当pt等于end时,将指向区间中最后一个元素后面的一个位置,循环将结束。
6、指针和const
6.1、将指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值。

int age=39;
const int *pt=&age;//该声明指出,pt指向一个const int,不能使用pt来修改这个值。换句话,*pt的值为const,不能被修改。
const int **pp2;
int *p1;
const int n=13;
pp2=&p1;
*pp2=&n;
*p1=10;

仅当只有一层关系时,才可以将非const地址或指针赋给const指针。
注意:
如果数据类型本身并不是指针,则可以将const数据或者非cnost数据的地址或指针赋给const指针。
6.2、将指针本身声明为常量,这样可以防止改变指针指向的位置。

请添加图片描述
7、函数和二维数组
数组名将被视为地址,相应的形参是一个指针。
例如:
int sum(int (*ar2)[4],int size);
int sum(int ar2[ ][4],int size);
两种都是正确的表达形式,但是相比较下面的代码的可读性更强。
在这里插入图片描述
8、函数和结构

#include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;
struct travel_time
{
	int hours;
	int mins;
};
const int mins_per_hr = 60;

travel_time sum(travel_time t1, travel_time t2);
void show_time(travel_time t);

int main()
{
	travel_time day1 = { 5,45 };
	travel_time day2 = { 4,55 };
	travel_time trip = sum( day1,day2 );
	cout << "Two-day total: ";
	show_time(trip);

	travel_time day3 = { 4,32 };
	cout << "There-day total: ";
	show_time(sum(trip, day3));

	return 0;
}

travel_time sum(travel_time t1, travel_time t2)
{
	travel_time total;

	total.mins = (t1.mins + t2.mins) % mins_per_hr;
	total.hours = t1.hours + t2.hours + (t1.mins + t2.mins) / mins_per_hr;

	return total;
}

void show_time(travel_time t)
{
	using namespace std;
	cout << t.hours << "hours." << t.mins << "minutes\n";
}

9、传递结构的地址
在这里插入图片描述
10、函数和string对象
除函数getline()外,这个程序像对待内置类型(int)一样对待string对象。如果需要string数组,秩序使用通常的数组声明格式即可:
string list[size];
这样,数组list的每个元素都是一个string对象,也可以像下面这样使用它:
getline(cin,list[i]);
11、函数和array对象
使用array对象来存存储一年四个季度的开支:
std::array<double,4>expenses;
声明这两个函数:
void show(std::array<double,4>da);
void fill(std::array<double,4>*pa);
例如:
使用一个const array 对象,该对象包含四个string对象,用于表示几个季度:
const std::arraystd::string,seaspmssnames=
{“spring”,“summer”,“fafl”,“winter”};
注意,模板array并非只能存储基本数据类型,它还可存储类对象。
12、函数指针
1.获取函数的地址
在这里插入图片描述

2.声明一个函数指针
在这里插入图片描述

3.使用函数指针来调用函数
在这里插入图片描述

第一题:

#include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;
double aerage(double, double);

int main()
{
	using namespace std;
	double a, b;
	cout << "输入两个数:";
	cin >> a >> b;
	while (a != 0&&b != 0)
	{
		cout << "调和平均数:";
		cout << aerage(a, b) << endl;
		cout << "输入两个数:";
		cin >> a >> b;
	}
	return 0;
}

double aerage(double a,double b)
{
	double average;
	average = 2.0*a*b / (a + b);
	return average;
}

第二题:

#include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;
const  int max = 10;
double garde[max];
int number = 0;
void input();//输入
void display();//输出
void calculation();//平均数

int main()
{
	input();
	display();
	calculation();
	return 0;
}

void input()
{
	cout << "输入高尔夫成绩:" << endl;
	while (cin >> garde[number++])
	{
		if (garde[number-1] == -1)
		{
			break;
		}
	}
	number--;
}

void display()
{
	cout << "输出高尔夫成绩:"<<endl;
	for (int i = 0; i < number; i++)
	{
		cout << garde[i] << " ";
	}
	cout << endl;
	
}

void calculation()
{
	double sum = 0;
	for (int i = 0; i < number; i++)
	{
		sum = sum + garde[i];
	}
	cout << "平均成绩:";
	cout << sum/number << endl;
}

第三题:

#include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;
void shuruxianshi(struct box mbox);
void shezhi(struct box *pbox);
struct box
{
	char maker[40];
	float height;
	float width;
	float length;
	float volume;
};
int main()
{
	struct box mbox = { "张",1.0,2.0,3.0,0.0 };
	shuruxianshi(mbox);
	shezhi(&mbox);
	shuruxianshi(mbox);
	return 0;
}
void shuruxianshi(struct box mbox)
{
	cout << "Box maker: " << mbox.maker << endl;
	cout << "Box height: " << mbox.height << endl;
	cout << "Box width: " << mbox.width << endl;
	cout << "Box length: " << mbox.length << endl;
	cout << "Box volume: " << mbox.volume << endl << endl;;
}

void shezhi(struct box *pbox)
{
	pbox->volume = pbox->height*pbox->width*pbox->length;
}

第五题:

#include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;
int factproal(int n);

int main()
{
	int n;
	cout << "输入整数参数:" << endl;
	while (cin >> n)
	{
		if (n == -1)
		{
			break;
		}
		else
		{
			cout << "输出阶乘:\n" << factproal(n) << endl << endl;
			cout << "输入整数参数:" << endl;
		}
	}
	return 0;
}

int factproal(int n)
{
	if (n == 0||n==1)
		return 1;
	else
		return n * factproal(n - 1);

	return 0;
} 

第六题:

#include <iostream>
#include <string>
include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;
const int max = 10;
int fill_array(double data[], int max);
void show_array(double data[], int longs);
void reverse_array(double data[], int longs);

int main()
{
	int longs;
	double data[max];
	longs = fill_array(data, max);
	show_array(data, longs);
	reverse_array(data, longs);
	return 0;
}

int  fill_array(double data[], int max)
{
	int longs = 0;
	double temp;
	int i;
	cout << "输入数值:" << endl;
	for ( i = 0; i < max; i++)
	{
		cout << "第" << i << "个数:";
		cin >> temp;
		if (!cin)
		{
			cin.clear();
			while (cin.get() != '\n')
			{
				continue;
			}
			break;
		}
		else if (temp < 0)
		{
			cout << "输入数据已经结束,请进入其他函数!";
			break;
		}
		data[i] = temp;
	}
	return i;
}

void show_array(double data[], int longs)
{
	cout << endl;
	cout << "输出数组的内容:" << endl;
	for (int i = 0; i < longs; i++)
	{
		cout << data[i] << " ";
	}
}

void reverse_array(double data[], int longs)
{
	cout << endl;
	cout << "显反转后的数组的内容:" << endl;
	for (int i = longs - 1; i >=0; i--)
	{
		cout << data[i] << " ";
	}
}

第八题:

#include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;

const int Seasons = 4;
const char *Snames[Seasons] = { "Spring", "Summer", "Fall", "Winter" };
struct cost
{
	double expenses[Seasons];
};
void fill(double *pa)
{
	for (int i = 0; i < Seasons; i++)
	{
		cout << "Enter " << Snames[i] << " expenses: ";
		cin >> pa[i];
	}
}
void show(double *pa)
{
	double total = 0.0;
	cout << "\nEXPENSES\n";
	for (int i = 0; i < Seasons; i++)
	{       
		cout << Snames[i] << ": $" << pa[i] << endl;
		total += pa[i];
	}
	cout << "Total Expenses: $" << total << endl;
}
void fill(struct cost *pCost)
{
	for (int i = 0; i < Seasons; i++)
	{
		cout << "Enter " << Snames[i] << " expenses: ";
		cin >> pCost->expenses[i];
	}
}
void show(struct cost *pCost)
{
	double total = 0.0;
	cout << "\nEXPENSE\n";
	for (int i = 0; i < Seasons; i++)
	{
		cout << Snames[i] << ": $" << pCost->expenses[i] << endl;
		total += pCost->expenses[i];
	}
	cout << "Total Expense: $" << total << endl;
}
int main()
{
	// situation a
	cout << "Situation a: " << endl;
	double pa[Seasons] = { 0 };//初始化double数组内都为0
	fill(pa);//输入季度的存储开支
	show(pa);//输出每季度以及总的开支

	// situation b
	cout << endl << endl;
	cout << "Situation b: " << endl;
	struct cost *pCost = new struct cost;//动态分配数组
	fill(pCost);
	show(pCost);
	delete pCost;
	return 0;
}

第十题:

#include <iostream>
#include <string>
#include <ctime>
#include <istream>
using namespace std;

double add(double x, double y)
{
	return x + y;
}

double mul(double x, double y)
{
	return x * y;
}

double calculate(double x, double y, double(*fun)(double, double))
{
	return fun(x, y);
}
void number()
{
	double x = 0.0;
	double y = 0.0;

	cout << "Enter two double number: ";
	while (cin >> x >> y)
	{
		cout << "Call add, the result of " << x << "  and  " << y << "  is  " << calculate(x, y, add) << endl;
		cout << "Call mul, the result of " << x << "  and  " << y << "  is   "<< calculate(x, y, mul) << endl;
		cout << "Enter next two doublee number: ";
	}
}
int main()
{
	number();
	while (getchar());
	return 0;
}
这篇关于第七章 函数——c++的编程模块的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!