C++复合数据类型struct

结构体
在存储和处理大批量数据时,一般会使用数组来实现,但是每一个数据的类型及含义必须一样。如果需要把不同类型、不同含义的数据当作一个整体来处理,如 1000 个学生的姓名、性别、年龄、体重、成绩等,怎么处理呢?
C++ 提供了结构体(struct)来解决这类问题。

结构体类型的声明格式如下:

struct 类型名{
    数据类型1   成员名1;
    数据类型2   成员名2;};

也可以把结构体类型声明和变量定义合在一起,格式如下:

struct 类型名{
    数据类型1   成员名1;
    数据类型2   成员名2;} 变量名;

结构体的使用
结构体变量具有以下特点
(1)可以对结构体变量的整体进行操作。
例如:swap(a[i],a[j])
(2)可以对结构体变量的成员进行操作。
引用结构体变量中成员的格式为:
结构体变量名. 成员名
(3)结构体变量的初始化方法与数组类似。

例1、学生信息
【问题描述】
输入一个学生的信息,包括姓名、性别、年龄、体重,再输出这些信息。
【输入格式】
一行,依次是学生的姓名、性别、年龄、体重。
【输出格式】
一行,依次是姓名、性别、年龄、体重(体重保留一位小数)。
【输入样例】
zhangsan m 20 90.5
【输出样例】
zhangsan m 20 90.5

#include<bits/stdc++.h>
using namespace std;
struct student{
     string name;
     char sex;
     int age;
     double weight;
};
int main(){
     student stu;
     cin >> stu.name >> stu.sex >> stu.age >> stu.weight;
     cout << stu.name <<  “ “ << stu.sex <<  “ “ << stu.age <<  “ “ ;
     cout << fixed << setprecision(1) << stu.weight << endl;
     return 0;
}

例2、年龄排序
【问题描述】
输入 n 个学生的信息,包括姓名、性别、出生年月。要求按年龄从小到大依次输出这些学生的信息。数据保证没有学生同年同月出生。
【输入格式】
第一行一个整数 n,表示学生人数,n≤100。
接下来 n 行,每一行依次输入学生的姓名、性别、出生年份、出生月份。
【输出格式】
按年龄从小到大,一行输出一个学生的原始信息。
【输入样例】
5
John male 1999 12
David female 1999 8
Jason male 1998 11
Jack female 1998 8
Kitty female 2000 7
【输出样例】
Kitty female 2000 7
John male 1999 12
David female 1999 8
Jason male 1998 11
Jack female 1998 8

#include<bits/stdc++.h>
using namespace std;
struct stu{
    string name;
    string sex;
    int year,month;
};
const int MAXN = 110;
stu a[MAXN];
int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++)
          cin >> a[i].name >> a[i].sex >> a[i].year >> a[i].month;
    for(int i = 1; i <= n; i++)
          for(int j = i+1; j <= n; j++)
                if(a[i].year < a[j].year || a[i].year == a[j].year && a[i].month < a[j].month)
                       swap(a[i],a[j]);
    for(int i = 1; i <= n; i++){
          cout<< a[i].name <<  ” ” << a[i].sex <<  ” ” ;
          cout<< a[i].year <<  ” ” << a[i].month << endl;
    }
    return 0;
}

运算符重载
“运算符重载”常用于解决结构体或自定义数据类型的加法、减法等特殊含义的运算。运算符重载的一般格式为:

类型名 operator 运算符 (const 类型名 变量)const{}

成员函数
在 C++ 中,允许在结构中定义函数,该函数称为“成员函数”。描述形式如下:

struct 结构名 {
          数据成员
          成员函数
};

例1、作业统计
【问题描述】
为了了解学生的课后作业负担情况,需要统计学生连续若干天完成作业所需的总时间。现在,输入某位学生 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;
}

例2、身高问题
【问题描述】
输入 n 个学生的信息,每个学生信息包括姓名、身高、学号。编程输出身高最高的学生的信息。
【输入格式】
第 1 行一个正整数 n,表示学生个数,n≤100。
以下 n 行,每一行依次输入学生的姓名、身高、学号。
【输出格式】
输出最高的学生信息,如存在身高一样的请输出学号小的那个同学。
【输入样例】
5
John 172 20160302 【输出样例】David 173 20160306
David 173 20160306
Jason 168 20160309
Jack 152 20160311
Kitty 147 20160319

#include<bits/stdc++.h>
using namespace std;
struct stu{
        string name;
        int heigh;
        int num;
        void input(){
                 cin >> name >> heigh >> num;
        }
        void output(){
                 cout << name <<  “ “ << heigh <<  “ “ << num << endl;
        }
 };
stu a[110];
 int main(){
    int n;
    stu maxn;
    maxn.heigh = maxn.num = 0;
    cin >> n;
    for(int i = 1; i <= n; i++){
                    a[i].input();
                    if(a[i].heigh > maxn.heigh) maxn = a[i];
                    else if(a[i].heigh == maxn.heigh && a[i].num < maxn.num) maxn = a[i];
     }
     maxn.output();
     return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值