id:49扑克排排序(结构体)

题目描述:

自定义结构体表示一张扑克牌,包含类型——黑桃、红桃、梅花、方块、王;大小——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