【蓝桥杯冲刺省一,省一看这些就够了-C++版本】蓝桥杯C++结构体相关杂项及相关练习题

蓝桥杯历年省赛真题

点击链接免费加入题单

杂项

结构体排序

结构体是 自定义类型 ,它就像一个 能装不同数据类型 的“包裹”。当你声明一个结构体后,需要赋予这个结构体一个名字(即 结构体名 )。而 定义具体变量时,也可以定义结构体数组 。这相当于告诉计算机,你一口气定义了许多“包裹”,每一个“包裹”里面都可以装入许多不同或相同数据类型的变量。

1.结构体的声明

使用结构体前,需要先声明一个结构体类型,再进行定义和使用。结构体类型的声明格式为:

struct 结构体类型名{     //其中,sruct是关键字,在c++中表示结构体
	数据类型 成员变量1;    //多个成员变量可以具有不同的数据类型
	数据类型 成员变量2;
    ......
};

声明之后,就可以定义结构体变量了,格式如下:

结构体类型名 变量名;(struct 可省略)  
例如

我们需要表示一个学生的信息,首先我们声明学生的结构体:

struct student{   //student表示结构体的类型名
	string name;
	char sex;
	int age;
	float height,score;
};

然后定义一个具体的学生:

student zhangsan;//声明一个student的结构体变量叫zhangsan

当然我们如果需要很多学生,可以声明为结构体数组:

student a[1001];//创建结构体数组a
//a数组中的每一个元素都是一个结构体类型student的变量
另外

为方便起见,我们一般直接在声明结构体的同时定义变量,格式如下:

struct 结构体类型名{     //其中,sruct是关键字,在c++中表示结构体
   数据类型成员变量1//多个成员变量可以具有不同的数据类型
   数据类型成员变量2......
}结构体变量表;

比如:

struct student{
	string name;  
	char sex;
	int age;   
	float height,score;
}a[1001];
2.结构体的使用

(1)将结构体变量视为一个整体进行操作,例如:

swap(a[1], a[2]);  

(2)使用符号“.”对结构体变量的成员进行操作,“.”的含义可以理解为中文的“的”,格式为:

结构体名.成员变量名

比如:

student  a;//李四
cin >> a.name;//输入赋值李四的名字
a.age = 23;//直接赋值给李四的年龄为23
3.结构体的初始化

(1)集合形式,比如:

student  a = {"tuotuo",'F',12,168,100};

(2)逐一赋值,比如:

student  a;
cin >> a.name >> a.sex;
a.age = 12;
4.结构体中的sort()函数

现在给你一个结构体,现在有这样一个要求:按照年龄从小到大输出。

那我们就照结构体中成员变量age(也就是年龄)进行从小到大的排序,代码如下:

struct student {
	string name;    
	int age;    
	float height;
}a[10];
bool cmp(student a, student b){    
	return  a.age < b.age;
}
int main(){    
	...//输出        
		sort(a, a + n, cmp);//按照年龄从小到大排序        
	...//输出
}

数组标记与数组连续性

字符统计 (蓝桥杯Java 2022B组省赛 | 数组标记)
  • 题目思路

​ 数组标记是指用数组去存储问题中的输入数据或者中间数据,比如计数、判断有无,本质上是用空间换时间,最常见的好处就是降低代码的时间复杂度,不容易出现超时问题。同时这种标记法也可以用上我们之前的 map

​ 本题只需要用数组去标记出现字符出现的次数即可,需要结合前面字符ASCII值的知识。

// 标记数组
int flag[N];  // flag[i] 用于标记状态或者计数

flag[i] = 1;  // 数组标记状态,选择 / 不选择

flag[i]++;    // 数组标记计数,记录i出现的次数
  • 代码
#include<bits/stdc++.h>

using namespace std;

string s;
int b[26];

int main() {
    cin >> s;
    for (int i = 0; i < s.size(); i ++)
        b[s[i] - 'A'] ++;
    int maxx = 0;
    for (int i = 0; i < 26; i ++)
        maxx = max(maxx, b[i]);
    for (int i = 0; i < 26; i ++)
        if (b[i] == maxx) cout << char(i + 'A');
    return 0;
}
单词分析(蓝桥杯Java2020B组省赛第二场 | 数组标记)
数组连续性
// 连续最长相同、最长上升或下降: 相邻两项比较,并讨论即可
int a[N], s = 0;
int ans = 0;

for(int i = 1; i <= n; i++) {
    if(a[i] == a[i-1]) {  // a[i] < a[i-1]  或 a[i] > a[i-1]
        s++;
        ans = max(ans, s);
    } else {
        s = 1;
    }
}
cout << ans;
拓拓的字符串压缩
  • 题目思路

​ 先求出字符串长度,然后从下标 0 0 0 开始每次和后面一个字符比较

​ (1)如果和后面一个字符相等,计数的变量加1

​ (2)如果和后面一个字符不相等,输出字符以及计数的变量,并将计数的变量清空为1

​ 最后需要在循环外,再输出最后一个字符以及计数变量。为什么呢?我们考虑一下 aabbccc 最后一个字符 c 是不是后面没有不同的字符,我们发现我们只会在字符串不相等的时候才输出,所以最后一个字符 c 和它出现的次数没有输出。

  • 代码
#include<bits/stdc++.h>

using namespace std;

int main()
{
	string str;
	cin >> str;
	int n = str.size();
	int c = 1;
	for(int i = 0;i < n - 1;i++) {
		if(str[i] == str[i + 1]) {//相等计数加1
			c++;
		}
		else {
			cout << str[i] << c;
			c = 1;//清空为1不是0,因为这个字符出现了代表至少有1个
		}
	}
	cout << str[n - 1] << c;//可能最后几个字符连续相等需要在循环外补充输出
	return 0;
}
  • 20
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值