复合数据类型
(根据相关资料简单总结了一些常见复合数据类型)
下图介绍了数据类型之间的关系
下面我们给出结构体和枚举的介绍
1.
C++ 中的结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
使用结构体,必须要先声明一个结构体类型,再定义和使用结构体变量。结构体类型的声明格式如下:
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;
…
};
也可以把结构体类型声明和变量定义合在一起,格式如下:
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;
…
} 变量名;
**这里要注意分号的位置。
结构体变量具有以下特点: (1)可以对结构体变量的整体进行操作。
例如:swap(a[i],a[j]) (2)可以对结构体变量的成员进行操作。
引用结构体变量中成员的格式为:
结构体变量名. 成员名 (3)结构体变量的初始化方法与数组类似。
在这里补充一个重点:运算符重载
“运算符重载”常用于解决结构体或自定义数据类型的加法、减法等特殊含义的运算。运算符重载的一般格式为:
类型名 operator 运算符 (const 类型名 变量)const{
…
}
有下面一个例题:
【问题描述】
为了了解学生的课后作业负担情况,需要统计学生连续若干天完成作业所需的总时间。现在,输入某位学生 n天完成作业的时间,格式为时、分、秒,最后输出这位学生 n 天完成作业的总时间(秒)。
【输入格式】
第 1 行一个正整数 n,表示有 n
天; 第 2~ 第 n+1 行,每行 3 个整数,分别代表时、分、秒。
【输出格式】
一行信息,表示这个学生完成作业的总时间,具体格式见输出样例。
【输入样例】
3 1 20 30 1 20 45 1 19 30
【输出样例】
4hour 0minute 45second
**本题需要把若干时间(时、分、秒)相加,但又不是普通的加法运算。所以,可以利用运算符重载,另外定义一个“+”运算,实现对两个结构体变量的加法。
#include<bits/stdc++.h>
using namespace std;
struct worktime{// 声明一个结构体类型 worktime 记录学生完成作业的时间
int hr,minut,sec; // hr,minut,sec 分别代表时分秒
worktime operator +(const worktime x)const{ // 对 + 进行重新定义
worktime tmp;
tmp.sec = (sec + x.sec) % 60;
tmp.minut = (minut + x.minut + (sec + x.sec) / 60) % 60;
tmp.hr = hr + x.hr + (minut + x.minut + (sec + x.sec) / 60) / 60;
return tmp;
}
};
int main(){
worktime stu,sum;
int n;
cin >> n;
sum.hr = sum.minut = sum.sec = 0;
for(int i = 1; i <= n; i++){
cin >> stu.hr >> stu.minut >> stu.sec;
sum = sum + stu;// 两个结构体 sum 和 stu 通过重载 + 运算符进行加法运算
}
cout << sum.hr << ” hour ” << sum.minut << ” minute ” << sum.sec << ” second ” ;
return 0;
}
通过这个例题简单了解了运算符重载,这是重点也是难点。
下面简单介绍枚举:
枚举类型定义了一组命名的整数常量,以提高代码的可读性
enum TrafficLight { red, green, yellow };
TrafficLight枚举类型定义了3个常量:0,1,2 分别和名字red,green以及yellow关联。
TrafficLight是一个枚举类型,可以用来定义枚举变量,变量的值只能是枚举成员。
TrafficLight stop = red;
可以指定枚举成员的值
编译器会给未指定值的枚举成员赋予相邻值的下一整数值
enum ShapeType {circle=10, square=20, rectangle};
//rectangle成员的值是21
可以使用未命名的枚举类型定义常量
enum {False, True}; //定义了两个常量False和True,值分别是0和1
下面简单介绍一下——标准库string类
- string 表示可变长度的字符序列
- 字符串是对象
- string 类支持字符串对象的各种操作
- 各种初始化方式
- 字符串之间的复制、比较、连接
- 查询字符串长度和判断字符串是否为空
- 访问字符串中的单个字符
- 使用string 类要包含头文件——< string >
以下是几个主要点:
-
在读写string对象时,可以使用标准库中iostream可以读写string对象。可以用循环读取未知数量的string对象输入操作符返回输入流对象,如果输入流对象处于有效状态,表示没有遇到文件结束或非法输入
-
getline()函数:
//每次读取一行文本,直到文件结束
string line;
while(getline(cin, line))
cout << line << endl;
-
两个字符串可以直接用运算符“+”连接,结果得到一个新的string对象。"+"运算符要求至少有一个运算对象是string。
-
用下标运算符可以访问string对象中指定位置的字符
string对象s的下标范围从0到s.size()-1。