C语言 日期(年月日 ) 排序

日期是一个struct
格式为 00 Jan 11 // 00年一月 11日
99 Feb 22// 99年二月 22日
08 Mar 02// 03年三月2日
要求按照从小到大排序,年份在90-10之间,代表1990年到2010年。
排序当然是年月日的顺序排,先排年,再排月,再排日。

#include "stdio.h"
#include "string.h"

//日期结构体
struct date
{
int y;//年
char m[4];//月
int d;//日
};

//比较年份
int cmpY(int a, int b)
{
//年份在90-10之间,代表1990年到2010年
if (a < 100 && a > 10)
a +=1900;
else
a += 2000;
if (b < 100 && b > 10)
b +=1900;
else
b += 2000;

if (a > b)
return 1;
else if (a == b)
return 0;
else
return -1;
}

//比较月份
int cmpM(char *a, char *b)
{
//定义字符串数组,表示12个月份的英文
char m[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int i, j;
for (i = 0; i < 12; i++)
if (strcmp(a,m[i]) == 0)
break;

for (j = 0; j < 12; j++)
if (strcmp(a,m[j]) == 0)
break;

if (i < j)
return 1;
else if (i == j)
return 0;
else
return -1;
}

//综合年,月,日比较
int cmpYMD(struct date a, struct date b)
{
if (cmpY(a.y,b.y) == -1)
return -1;
else if (cmpY(a.y,b.y) == 1)
return 1;
else
{
if (cmpM(a.m,b.m) == -1)
return -1;
else if (cmpM(a.m,b.m) == 1)
return 1;
else
{
if (a.d > b.d)
return 1;
else if(a.d == b.d)
return 0;
else
return -1;
}
}
}
void main()
{
//定义结构体数组
struct date dt[3]={
{ 0, "Jan", 11},
{99, "Feb", 22},
{ 8, "Mar", 2}};
struct date dtTemp;
int i, j;

//排序
for (i = 0; i < 3-1; i++)
for (j = i+1; j < 3; j++)
if (cmpYMD(dt[i],dt[j]) == 1)
{
dtTemp = dt[i];
dt[i] = dt[j];
dt[j] = dtTemp;
}

//输出排序过后的日期
for (i = 0; i < 3; i++)
{
printf("%d %s %d\n",dt[i].y,&dt[i].m,dt[i].d);
}
}追问

不好意思,那个年份的输入08年一定要输入08,而不是8,能帮忙改一下么。

追答

修改版如下:

#include "stdio.h"
#include "string.h"

//日期结构体
struct date
{
char y[3];//年
char m[4];//月
int d;//日
};

//新增加,将字符串表示的年份转成整形表示
int intY(char *a)
{
int k = 0;
k += a[0] - '0';//十位上的数值
k = k*10 + (a[1] - '0');//十位上的数值乘以10再加上个位上的数值
return k;
}

//比较年份(修改后,参数类型变了)
int cmpY(char *y1, char *y2)
{
//新增加两条语句
int a = intY(y1);
int b = intY(y2);

//年份在90-10之间,代表1990年到2010年
if (a 10)
a += 1900;
else
a += 2000;
if (b 10)
b += 1900;
else
b += 2000;

if (a > b)
return 1;
else if (a == b)
return 0;
else
return -1;
}

//比较月份
int cmpM(char *a, char *b)
{
//定义字符串数组,表示12个月份的英文
char m[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int i, j;
for (i = 0; i b.d)
return 1;
else if(a.d == b.d)
return 0;
else
return -1;
}
}
}
void main()
{
//定义结构体数组
struct date dt[3]={
{"00", "Jan", 11},
{"99", "Feb", 22},
{"08", "Mar", 2}};
struct date dtTemp;
int i, j;

//排序
for (i = 0; i < 3-1; i++)
for (j = i+1; j < 3; j++)
if (cmpYMD(dt[i],dt[j]) == 1)
{
dtTemp = dt[i];
dt[i] = dt[j];
dt[j] = dtTemp;
}

//输出排序过后的日期
for (i = 0; i < 3; i++)
{
//修改输出格式
printf("%s %s %d\n",dt[i].y,dt[i].m,dt[i].d);
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-12
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
/*
一月 Jan. January
二月 Feb. February
三月 Mar. March
四月 Apr. April
五月 May. May
六月 June. June
七月 July. July
八月 Aug. Aguest
九月 Sept. September
十月 Oct. October
十一月 Nov. November
十二月 Dec. December
缩写:正规的英语中六月、七月不缩写,九月的缩写是4个字母,其他月份3个字母。
*/
char strm[12][10]={"Jan","Feb","Mar","Apr","May","June","July","Aug","Sept","Oct","Nov","Dec"};
struct Date
{
int y,d;
char m[10];
int value;
}d[10000];
int findm(char m[])
{
int i;
for(i=0;i<12;i++)
if(strcmp(m,strm[i])==0)return i;
return -1;
}
bool cmp(Date a,Date b)
{
return a.value<b.value;
}
int main()
{
int n=3,i,j;
/*
3
00 Jan 11
99 Feb 22
08 Mar 02
*/
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%s%d",&d[i].y,d[i].m,&d[i].d);
j=findm(d[i].m);
d[i].value=d[i].y*10000+j*100+d[i].d;
}
sort(d,d+n,cmp);
for(i=0;i<n;i++)
{
printf("%02d %s %02d\n",d[i].y,d[i].m,d[i].d);
}
return 0;
}
第2个回答  2012-03-15
首先,你的闰年判断就有问题。教你个口诀:“四年一润,一百年不润,四百年再润”。
其实就可以用if(yr%4==0||yr%100!=0&&yr%400==0){那么是闰年}
你的检验判断也可以利用mont数组的,首先判断是不是在闰年,然后判断输入days是不是大于的mont[mn](如果是闰年要判断二月+1)。
相似回答