2023年省信息教师培训day15

一、结构体

在存储和处理大批量数据时,一般会使用数组来实现,但是每一个数据的类型及含义必须一样。如果需要把不同类型、不同含义的数据当作一个整体来处理,比如 1000 个学生的姓名、性别、年龄、体重、成绩等,怎么处理呢?
C++ 中的结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
使用结构体,必须要先声明一个结构体类型,再定义和使用结构体变量。结构体类型的声明格式如下:

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

定义结构体变量格式如下:
struct 结构体类型名 变量名列表;

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

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

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

例:学生年龄排序

【问题描述】
输入 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;
}

二、共用体

在 C++ 中,共用体也称联合(union),是一种数据格式,能存储不同类型数据,但同一时间只能存储其中的一种类型数据。共同体的大小等于最大的成员大小。例如,存放一个人的信息,如果是成年人,存放他的身份证号码;否则,存放他的学籍号。这里面就有两个成员,但是任何一个人只能使用其中的一个。申明如下:

union 共用体名 {
    成员列表
} 变量列表;

例如,要声明一个记录个人信息的共用体,可以这样:

union person{   // 声明一个共用体类型 person
      char id[18]; // 声明一个字符数组,存储身份证号码
   int num;      // 声明一个整数,存放学籍号
};

引用:共用体变量.成员名;

成绩统计

【问题描述】
兴趣小组收集学员成绩信息,每个学员的成绩有两种表示方法,一种用 best、good、poor 三种等级来表示,还有一种就是直接用分数来表示(百分制)。请保存学员成绩信息,并且统计有多少人是用等级来表示成绩的,用分数来表示成绩的人的平均分是多少(取整就行)。
【输入格式】
第 1 行一个正整数 n,表示学员人数,n≤1000。
第 2~n+1 行,每行一个字符和一个字符串,中间用一个空格隔开。第一个字符表示这个学生成绩类型,有 C、N 两种分别代表等级表示和分数表示,第二个字符串表示成绩信息。
【输出格式】
一行两个整数,分别表示用等级表示成绩的人数和用分数表示成绩人的平均分(取整),中间用一个空格隔开。
【输入样例】
5
C best
C good
N 90
C poor
N 98
【输出样例】
3 94

#include<bits/stdc++.h>
using namespace std;
int main(){
    union res{ // 声明一个共用体 res
       char rank[5]; // 用等级表示成绩
       int x; // 用分数表示成绩
    };
    struct stu{
             char f; // 代表学生用哪种方式记录成绩
             res score;  // 定义 score 为共用体
    };
    stu a[1001];
    int n,count = 0, num = 0;
    cin >> n;
    for(int i = 1; i <= n; i++){
          cin >> a[i].f;
          switch(a[i].f){
                   case  'C': 
				   				for(int j = 0; j < 4; j++)
                                     cin >> a[i].score.rank[j];
                                     count++;
                                     break;
                   case  'N': 
				   				cin >> a[i].score.x;
                                     num += a[i].score.x;
           }
    }
    cout<<count <<" "<<num/(n-count)<<endl;
    return 0;
}

三、文件操作

C++ 程序和文件缓冲区交流的方式有流式和 I/O 方式两种。信息学竞赛中一般使用流式文件操作,流式文件类型一般分为 stream 类的流文件和文件指针 FILE 两种,本课只介绍 stream 类的流文件。
ifstream fin( “ 输入流文件名 ”);
作用是定义一个输入流文件类型变量 fin,初始化指向引号中指定的文本文件。
ofstream fout( “ 输出流文件名 ”);
作用是定义一个输出流文件类型变量 fout,初始化指向引号中指定的文本文件。
fin >> 变量名; // 或 fout << 变量名;
作用是从 fin 文件中输入数据给某个变量,或者把某个变量的值输出到 fout 文件中,这两个语句类似于 cin 和 cout。
fin.close(); // 或 fout.close();
作用是关闭输入文件、输出文件。如果文件没有关闭,则程序结束时会自动关闭,因此比赛时一般省略不写。

例:求和

【问题描述】
从文本文件 sum.in 中读入 n 个正整数,要求对这 n 个数中的奇数和偶数分别求和,再将结果写到文本文件 sum.out 中。
【输入格式】
第 1 行一个正整数 n,1≤n≤5000;
第 2~n+1 行,每行一个正整数,每个数都在 1~20000 之间。
【输出格式】
共有两行,每行包含一个整数,第一行为输入文件中的所有奇数之和,第二行为输入文件中的所有偶数之和。
【输入样例】
5
3
10
7
5
8
【输出样例】
15
18
在 C++ 中,cin 使用的输入设备是键盘,称之为“标准输入(stdin)”。
cout 使用的输出设备是显示器,称之为“标准输出(stdout)”。C++ 可以使用 freopen 函数把 stdin 和 stdout 重新定向到某一个指定的文件,使原来的标准输入、输出变成指定文件的输入、输出。具体语句格式为:
freopen( “ 输入流文件名 ” , ” r ” ,stdin);
freopen( “ 输出流文件名 ” , ” w ” ,stdout);
经过重定向后,任何对 stdin、stdout 的操作都变成了对输入流文件、输出流文件的操作。

#include<cstdio>
#include<iostream>
#include<fstream>
using namespace std;
int main(){
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
    int n,x,s1 = 0,s2 = 0;
    cin >> n;
    for(int i = 1; i <= n; i++){
               cin >> x;
               if(x % 2 == 1) s1 += x;
               else s2 += x;
    }
    cout << s1 << endl << s2 << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值