ZZULIOJ 1190: 按出生日期排序(结构体专题)

题目描述

送人玫瑰手有余香,小明希望自己能带给他人快乐,于是小明在每个好友生日的时候发去一份生日祝福。小明希望将自己的通讯录按好友的生日排序,这样就查看起来方便多了,也避免错过好友的生日。为了小明的美好愿望,你帮帮他吧。小明的好友信息包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好友的信息,按生日的月份和日期升序输出所有好友信息。

输入

首先输入一个整数n(1<=n<=10),表示好友人数,然后输入n行,每行包含一个好友的信息:姓名(不超过20位),以及三个整数,分别表示出生日期的年月日。

输出

按过生日的先后(月份和日期)输出所有好友的姓名和出生日期,用空格隔开,出生日期的输出格式见输出样例。 

样例输入 

3
Zhangling 1985 2 4
Wangliang 1985 12 11
Fangfang 1983  6 1

样例输出

Zhangling 1985-02-04
Fangfang 1983-06-01
Wangliang 1985-12-11
#include<stdio.h>
#include<stdlib.h>
typedef struct student{
	char name[21];
	int a,b,c;
}student;
void swap(student *x,student *y){
	student *t;
	t=(student *)malloc(sizeof(student));
	*t=*x;
	*x=*y;
	*y=*t;
}
int main(){
	student *stu,temp;
	int t,i,j;
	scanf("%d",&t);
	stu=(student *)malloc(sizeof(student)*t);
	getchar();
	for(i=0;i<t;i++){
		scanf("%s %d %d %d",stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
	}
	for(i=1;i<t;i++){
		for(j=0;j<t-i;j++){
			if(stu[j].b>stu[j+1].b)
				swap(&stu[j],&stu[j+1]);			
			else if(stu[j].b==stu[j+1].b){
				if(stu[j].c>stu[j+1].c)
				swap(&stu[j],&stu[j+1]);					
			}
		}
	}
	for(i=0;i<t;i++)
		printf("%s %d-%02d-%02d\n",stu[i].name,stu[i].a,stu[i].b,stu[i].c);
	return 0;
}

 

### 回答1: 对于"按出生日期排序结构体专题)",我们可以通过定义一个结构体来表示每一个人的相关信息,包括姓名、出生日期等等。然后,可以使用快速排序或者其他的排序算法来对这些结构体按照出生日期进行排序,得到一个按照出生日期排好序的人员列表。 ### 回答2: 题目意思是对一组结构体出生日期排序。我们可以先定义一个结构体,包含姓名和出生日期两个属性: ```c++ struct Person { string name; int year, month, day; }; ``` 接下来,我们需要定义一个比较函数,用于排序。由于涉及到年月日三个维度的比较,稍微有点麻烦。可以按照年份 -> 月份 -> 日份的顺序逐级比较。这样可以保证排序结果是正确的。函数代码如下: ```c++ bool cmp(const Person& a, const Person& b) { if (a.year != b.year) { return a.year < b.year; } if (a.month != b.month) { return a.month < b.month; } return a.day < b.day; } ``` 最后,我们可以调用`sort`函数进行排序: ```c++ int main() { int n; cin >> n; vector<Person> persons(n); for (int i = 0; i < n; i++) { cin >> persons[i].name >> persons[i].year >> persons[i].month >> persons[i].day; } sort(persons.begin(), persons.end(), cmp); for (int i = 0; i < n; i++) { cout << persons[i].name << endl; } return 0; } ``` 完整代码如下: ### 回答3: 1190题让我们实现一个按照出生日期排序的程序,我们需要使用结构体描述每个人的基本信息,包括姓名、生年月日等。 对于这个问题,我们可以使用快速排序的思路来实现。首先,我们需要建立一个结构体数组来存储每个人的信息,然后根据出生日期来确定排序依据。我们可以将出生日期转换为一个整数,例如将“1997年8月5日”转换为“19970805”,然后再进行比较大小。 接下来,我们需要实现快速排序的算法来对结构体数组进行排序。快速排序是一种基于分治思想的高效排序算法,其核心思想是通过把一个数组分成两个子数组来解决问题,然后递归地处理子数组。在每一次分割的时候,我们可以选择最左侧的元素作为枢轴元素,然后将所有小于等于枢轴元素的元素放置在左侧子数组中,所有大于枢轴元素的元素放置在右侧子数组中。最后,我们可以将枢轴元素放置在正确的位置上,这样就完成了一次分割操作。 接下来,我们通过代码解释如何实现1190题: ```cpp #include <iostream> #include <algorithm> using namespace std; const int MAX_N = 1005; struct Person { string name; //姓名 int year, month, day; //生年月日 }p[MAX_N]; bool cmp(Person a, Person b) { int a_val = a.year * 10000 + a.month * 100 + a.day; //将日期转换为数字,方便比较 int b_val = b.year * 10000 + b.month * 100 + b.day; return a_val < b_val; //按照日期升序排序 } void quick_sort(Person *p, int left, int right) { if (left >= right) return; //递归终止条件 int i = left, j = right; Person pivot = p[left]; while (i < j) { while (i < j && cmp(p[j], pivot)) j--; p[i] = p[j]; while (i < j && cmp(pivot, p[i])) i++; p[j] = p[i]; //交换两个元素 } p[i] = pivot; //将枢轴元素放置在正确的位置上 quick_sort(p, left, i - 1); quick_sort(p, i + 1, right); //递归地处理子数组 } int main() { ios::sync_with_stdio(false); //关同步流加速cin入和cout int n; cin >> n; for (int i = 0; i < n; i++) { cin >> p[i].name >> p[i].year >> p[i].month >> p[i].day; //入每个人的信息 } quick_sort(p, 0, n - 1); //快速排序 for (int i = 0; i < n; i++) { cout << p[i].name << endl; //排序后的结果 } return 0; } ``` 经过以上的代码解释,我们相信大家已经对1190题有了一定的理解。总之,这题需要我们掌握以下两个技巧: 1. 利用结构体来存储每个人的信息; 2. 快速排序算法的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值