结构体数组用法--输出生日题 sort排序

生日

*排序输出名字

有n行,

即n个生日从大到小同学的姓名。***(如果有两个同学生日相同,输入靠后的同学先输出)***
输入

3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1

输出

Luowen
Yangchu
Qiujingya

运用结构体
c语言

#include<stdio.h>
#define N 110 //人数 
struct student{    //用结构体存他们的信息
	char s[100];
	int y;
	int m;
	int d;
}str[N]; 
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%s%d%d%d",&str[i].s ,&str[i].y ,&str[i].m ,&str[i].d );
	}
	
	for(int i=0;i<n-1;i++)  **//从出生早  到 晚 排列** 
	{
		for(int j=i+1;j<n;j++)
		{
			if(str[i].y >str[j].y )   //这里比较年月日难需要考虑
			{
				str[110]=str[i],str[i]=str[j],str[j]=str[110];
			}
			else if(str[i].y ==str[j].y )
			{
				if(str[i].m >str[j].m )
					str[110]=str[i],str[i]=str[j],str[j]=str[110];
					else if(str[i].m == str[j].m )
					{
						if(str[i].d >=str[j].d ) //这是年月日相同 输出后面的
						str[110]=str[i],str[i]=str[j],str[j]=str[110];
					}
			}
		}
	}
	
	for(int i=0;i<n;i++)
	{
		printf("%s",str[i].s );
		printf("\n");
	}
	return 0;
}

说明当年不一样时;直接换,相同时else if (相同)
然后考虑 月 不一样时 直接换,相同时else if(相同)
然后日 不一样就直接换了

用c++中的sort排序

#include <iostream>
#include<algorithm> //这是他的头文件
#define N 105
using namespace std;

struct student{
	string name;
	int year,month,day;
	int ji;//用来记录结构体是第几个输入的
}stu[N]; 
bool cmp(student a,student b)
{
	if(a.year != b.year ) return a.year < b.year ;
	if(a.month != b.month ) return a.month < b.month ;
	if(a.day != b.day ) return a.day < b.day ;
	return a.ji > b.ji ;//当遇到相同年月日时输出后面一个
						//在直接排序中用后面一个替换掉前面一个
						//在这是输出ji 比较大的那个
	//else if(a.day ==b.day ) return  b.day >a.day ;
}

int main()
{
	int n;
	cin >>n;
	for(int i=0;i<n;i++)
	{
		cin >>stu[i].name >>stu[i].year >>stu[i].month >>stu[i].day ;
		stu[i].ji=i+1;
	}
	sort(stu,stu+n,cmp);
	for(int i=0;i<n;i++)
		cout <<stu[i].name<<endl ;
	return 0;
 } 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值