题目描述:
自定义结构体表示一张扑克牌,包含类型——黑桃、红桃、梅花、方块、王;大小——2,3,4,5,6,7,8,9,10,J,Q,K,A,小王、大王。输入n,输入n张扑克牌信息,从大到小输出它们的排序结果。
假设扑克牌的排序规则是大王、小王为第一大、第二大,剩余52张扑克牌按照先花色后大小排序。
花色:黑桃>红桃>梅花>方块。
大小: A>K>Q>J>>10>9>...>2。
提示:百度sort函数、strstr函数使用。
输入:
测试次数t
每组测试数据两行:
第一行:n,表示输入n张扑克牌
第二行:n张扑克牌信息,格式见样例
输出:
对每组测试数据,输出从大到小的排序结果
输入样例:
3
5
黑桃4 红桃10 梅花Q 方块K 黑桃A
10
大王 梅花10 红桃K 方块9 黑桃8 梅花A 方块Q 小王 黑桃2 黑桃J
5
红桃K 梅花K 黑桃K 方块K 小王
输出样例:
黑桃A 黑桃4 红桃10 梅花Q 方块K
大王 小王 黑桃J 黑桃8 黑桃2 红桃K 梅花A 梅花10 方块Q 方块9
小王 黑桃K 红桃K 梅花K 方块K
#include <iostream> #include <algorithm> #include <string.h> #define _CRT_SECURE_NO_WARNINGS using namespace std; struct Puke; void cele(Puke& p); struct Puke { int Num; int num; char name[100]; }; int compare(Puke a, Puke b) { if (a.Num != b.Num) { return a.Num > b.Num; } else if (a.num != b.num) { return a.num > b.num; } } int main() { int t; cin >> t; while (t--) { int n; cin >> n; Puke* p = new Puke[n]; for (int i = 0; i < n; i++) { char name1[100]; cin >> name1; strcpy_s(p[i].name, name1); cele(p[i]); } sort(p, p + n, compare); for (int i = 0; i < n; i++) { cout << p[i].name; if (i != n - 1) cout << " "; } cout << endl; } return 0; } void cele(Puke& p) { if (strstr(p.name, "大王"))p.Num = 6; else if (strstr(p.name, "小王"))p.Num = 5; else if (strstr(p.name, "黑桃"))p.Num = 4; else if (strstr(p.name, "红桃"))p.Num = 3; else if (strstr(p.name, "梅花"))p.Num = 2; else p.num = 1; if (strstr(p.name, "2"))p.num = 2; else if (strstr(p.name, "3"))p.num = 3; else if (strstr(p.name, "4"))p.num = 4; else if (strstr(p.name, "5"))p.num = 5; else if (strstr(p.name, "6"))p.num = 6; else if (strstr(p.name, "7"))p.num = 7; else if (strstr(p.name, "8"))p.num = 8; else if (strstr(p.name, "9"))p.num = 9; else if (strstr(p.name, "10"))p.num = 10; else if (strstr(p.name, "J"))p.num = 11; else if (strstr(p.name, "Q"))p.num = 12; else if (strstr(p.name, "K"))p.num = 13; else if (strstr(p.name, "A"))p.num = 14; }
sort的使用:
1.简单使用:
(1)用于C++中,对给定区间所有元素进行排序;
(2)使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高;
(3)头文件 #include <algorithm>。
2.sort函数有三个参数
sort(first,last,my_compare);
其中,first是元素的起始地址,last是结束地址,my_compare是排序的方式。对[first,last)(一定要注意这里的区间是左闭又开)区间内数据根据cmp的方式进行排序。也可以不写第三个参数,此时按默认排序,从小到大进行排序。(https://blog.csdn.net/weixin_41588502/article/details/86620305)
3.自定义排序
(1)定义比较函数my_compare(int a, int b):
bool my_compare(int a, int b){ if(a!=b)return a<b; //降序排 //if(a!=b)return a>b; //升序排 }
ps:sort有自带的function来定义升降序:
sort(a, a+n, greater<type>()) //升序排 sort(a, a+n, less<type>()) //降序排 //type是进行排序的数据类型 ?
(2)重载比较符“<”:
struct Puke{ int Num; int num; char name[100]; bool operator<(Puke &p){ if(Num!=p.Num){ if(Num>p.Num)return true; else return false; } else if(num!=p.num){ if(num>p.num)return true; else return ; } } };
在上述扑克排问题中,就可以在struct中重载运算符“<”,此时,在运用sort不用写自定义排序函数。
sort(p,p+n);
strstr()的使用:
strstr(str1,str2) 这是在判断str2是否是str1的子串。
当str2是str1的字串时,返回str2在str1中出现的首地址。否则,返回NULL;
(ps:strstr()返回的是char*类型的一个指针)
char arr1[20]="123456789"; char arr2[10]="345"; char arr3[10]="346"; if(strstr(arr1,arr2)) cout<<strstr(arr1,arr2)<<endl; if(strstr(arr1,arr3)==NULL) cout<<"NULL"<<endl;
输出:(当返回’3‘的首地址时输出,就会输出从该地址开始到’ ‘处截至的字串)
3456789 NULL