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()函数。需要修改下面三个地方:
- 调用函数时,将结构的地址(&平place)而不是结构本身(pplace)传递给他。
- 将形参声明为指向polar的指针,即polar*类型。由于函数不应该修改结构,因此使用了从上图关键字来约束。
- 由于形参是指针而不是结构,因此应间接成员运算符(->),而不是成员运算符(.句点的形式)
根据上面三个方面修改的代码如下:
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指针,但第二个参数却不是。
C++函数(三)------函数与结构体相关推荐
- 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.C++初识 1.1 第一个c++程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 ...
- 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定
上一篇文章学习了几种函数调用约定的区别,点击链接查看上一篇文章:[软件开发底层知识修炼]二十四 ABI之函数调用约定 本篇文章继续学习函数调用约定中,关于函数返回值的问题.当函数返回值为结构体时,函数 ...
- [C] 三、回调结构体
三.回调结构体 作者:解琛 时间:2020 年 12 月 18 日 #include <stdio.h> #include <string.h> #include <st ...
- C++阶段01笔记汇总【C++软件安装、C++初识、数据类型、运算符、程序流程结构、数组、函数、指针、结构体】
C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 C++课程安排 1 C++初识 1.1 第一个C++程序 1.1.1 创建项目 1.1.2 创建文件 1.1.3 编写代码 1. ...
- JNI调用c++函数,该函数的参数是结构体(——对象的传递)
第三方C++函数接口为 int api_get_logfile(Struct fileinfo tfile),参数是个结构体,且套了另一个结构体: struct fileinfo{ char *fu ...
- c语言中结构体头文件是什么,函数形参里有结构体指针,为什么在头文件生
满意答案 lam950 2017.04.08 采纳率:59% 等级:8 已帮助:913人 C语言用结构体指针作函数参数 这种方式比用结构体变量作函数参数效率高,因为无需传递各个成员的值,只需传递 ...
- struct timeval结构体 以及 gettimeofday()函数、struct timespec结构体
struct timeval结构体 struct timeval结构体在time.h中的定义为: struct timeval { __time_t tv_sec; /* Seconds. */ __ ...
- 函数指针数组指针+结构体数组
/***************** 结构体数组 计算一个班学生四门课程平均分 ************************/#include <stdio.h> #include & ...
- mysql文件结构体_MySQL InnoDB文件相关的三个重要结构体
我们使用mysql常使用innodb存储引擎,它包括两种,一种是innobase,另外一种是innodb plugin.今天主要介绍innodb plugin的file I/O操作,innodb pl ...
- 【C语言】考研复试题目集(三)【结构体】
文章目录 结构体 基本定义 结构体的定义 成员的获取和赋值 共用体(union) 结构体 基本定义 结构体的定义 成员的获取和赋值 #include <stdio.h>void main( ...
最新文章
- Windows Phone应用程序政策性约束
- opencv中的waitKey(0)不起作用
- 全国计算机二级qq闪退,电脑上QQ闪退怎么回事?各个系统版本电脑QQ闪退现象的解决方法介绍...
- 零基础自学html5要多久?Web前端学习路线的6点建议
- mongodb对数组元素及内嵌文档进行增删改查操作(转)
- before和after怎么区分_触发器before和after的区别
- 旷视申请赴港IPO:阿里蚂蚁金服持股近30%
- [转载]spring使用PropertyPlaceholderConfigurer加载properties文件处理中文乱码
- python pickle模块详解
- c++采集声卡输出_使用Core Audio实现对声卡输出的捕捉
- iOS检测当前设备是否越狱系统
- 网站ICP备案是什么呢?
- seo站内优化的10点建议及分析处理方案
- 电脑硬件升级完全解决方案
- Cisco Packet Tracer 配置交换机与路由器静态路由
- c语言结构体张三丰,第五次视频我发到网易云课堂上了
- Java网络爬虫--一步步使用Java网络爬虫技术实现豆瓣读书Top250数据的爬取,并插入数据库
- ROS入门学习笔记|话题发布与订阅
- 分布式之gossip共识算法分析
- IT行业能干到多少岁?