C++函数(三)------函数与结构体

------------------------函数与结构体---------------------------------

1.结构体复习

关于结构体,我以前有对结构体做过基础的讲解

我们可以使用关键字struct很简单的定义一个结构体:

struct travel_time
{
int hours;
int mins;
};             //注意这边的这个分号

2.传递和返回结构体

我们通过一个例子来说明一下结构体与函数的结合。

我们计算行程时间的计算,我们假设驾车从南京到苏州的的时间是三小时20分钟,从苏州到上海需要两小时30分钟。对于这种时间的计算,我们可以用结构体来表示,一个结构体成员表示小时,一个结构体成员表示分钟。我们要计算所花费的时间,则两小时30分钟,我们一般表示成2.5小时。
因此,我们有如下的计算代码:

#include <iostream>
using namespace std;
//先定义一个结构体用于表示小时和分钟变量。
struct travel_time
{
int hours;
int mins;
};
//为了将分钟数表示成小时的形式,我们需要定义一个常量60
int min_hours = 60;//分钟除以60即可得到小时的分数。
//声明两个需要用到的函数原型
void show_time(travel_time t);
travel_time sum(travel_time t1,travel_time t2);

int main()
{
	//前两天的时间
	travel_time day1 = {3,20};
	travel_time day2 = {2,30};
	//计算前两天的总时间
	travel_time time_total_two = sum(day1,day2);
	cout<<"两天的总时间是:";
	show_time(time_total);
	
	travel_time day3 = {5,34};
	cout<<"三天的总时间是:"<<;
	show_time(sum(time_total_two,day3))
	return 0;
}
//实现上述两个函数
travel_time sum(travel_time t1, travel_time,t2)
{
	travel_time total;
	total.mins = (t1.mins + t2.mins);//计算分钟
	total.hours = (t1.hours + t2.hours)+(t1.mins + t2.mins)/min_hours;//计算小时
	return total;
}
//定义一个显示时间的函数
void show_time(travel_time t)
{
	cout<<t.hours<<"小时,"<<t,mins<<"分钟。"<<endl;
	return 0 ;
}

在上述代码中,travel_time 就是一个标准的类型名。

3. 传递结构的地址

3.1 处理结构的另一种形式

我们使用一个直角坐标到极坐标的转换的例子来讲述这个例子。

#include <iostream>
#include <cmath>//数学函数库
using namespace std;
//创建两个结构体,分别表示直角坐标系的x和y,一盒基坐标系的距离和角度。
struct ploar
{
	double distence;
	double angle;
};

struct recet
{
	double x;
	double y;
};
//写两个函数原型
polar recet_to_polar(recet xypos);//直角坐标到极坐标的转换函数
void show_polar(polar dapos);
//主函数部分

int main()
{
	recet rplace;
	polar pplace;
	cout << "输入直角坐标系中x和y的值: ";
	while (cin >> rplace.x >> rplace.y)
	{
		pplace = recet_to_polar(rplace);
		show_polar(pplace);
		cout << "接下来的两个值: ";
	}
	cout << ""完成。 \n;
	return 0;
}
//实现上述两个函数
//1.将基坐标系的参数转换成极坐标系,具体数学思想,大家高中应该都知道
polar recet_to_polar(recet xypos)
{
	polar anwswer;//创建一个结构体对象,实现使用点结构获取成员
	answer.distence = sqrt(xypos.x * xypos.x + xypos.y * xypos.y);//计算距离
	answer.polar = atan2(xypos.y , xypos.x)//计算偏移角度
	return answer;
}
//2. 显示函数
void show_polar (polar dapos)
{
	const double rad_to_deg = 57.29577951;//两种角度形式的转换关系
	cout << "距离 = " << dapos.distence;
	cout << ",角度 = " <<dapos.angle * rad_to_deg;
	cout <<"degrees\n";
	return 0;
}

下面,我们根据上面的例子,对其进行拓展,实现传递结构的地址。

3.2 传递结构的地址

假设要传递结构的地址而不是整个结构以节省时间和空间,则需要重新编写前面的函数,使用指向结构的指针。首先看一看如何编写show_polar()函数。需要修改下面三个地方:

  1. 调用函数时,将结构的地址(&平place)而不是结构本身(pplace)传递给他。
  2. 将形参声明为指向polar的指针,即polar*类型。由于函数不应该修改结构,因此使用了从上图关键字来约束。
  3. 由于形参是指针而不是结构,因此应间接成员运算符(->),而不是成员运算符(.句点的形式)

根据上面三个方面修改的代码如下:

void show_polar (const polar * pda)
{
	const double rad_to_deg = 57.29577951;
	cout << "距离 = "<< pda->distance;
	cout << ", 角度 = "<< pda->angle * rad_to_deg ;
	cout <<"degrees\n";
	return 0;
}

下面对recet_to_polar()函数进行修改。

void recet_to_polar(const recet * pxy,polar * pda)
{
	pda->distence = sqrt(pxy->x * pxy ->x * +pxy->y * pxy ->y);
	pda->angel = atan2(pxy->y,pxy->x);
	eturn 0;
}

由于原来的recet_to_polar函数返回一个结构,因此修改修改方法更复杂些。**为了充分利用指针的下利率,应使用指针,而不是返回值。**为此,需要将两个指针传递给该函数,第一个指针指向要转换的结构,第二个指针指向存储转换结果的结构。函数不返回一个新的结构,而是修改调用函数中已有的结构。因此,第一个参数是const指针,但第二个参数却不是。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值