作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/06 01:50:31
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
{
\x09int y;//年
\x09char m[4];//月
\x09int d;//日
};
//比较年份
int cmpY(int a, int b)
{
\x09//年份在90-10之间,代表1990年到2010年
\x09if (a < 100 && a > 10)
\x09\x09a +=1900;
\x09else
\x09\x09a += 2000;
\x09if (b < 100 && b > 10)
\x09\x09b +=1900;
\x09else
\x09\x09b += 2000;
\x09if (a > b)
\x09\x09return 1;
\x09else if (a == b)
\x09\x09return 0;
\x09else
\x09\x09return -1;
}
//比较月份
int cmpM(char *a, char *b)
{
\x09//定义字符串数组,表示12个月份的英文
\x09char m[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
\x09int i, j;
\x09for (i = 0; i < 12; i++)
\x09\x09if (strcmp(a,m[i]) == 0)
\x09\x09\x09break;
\x09for (j = 0; j < 12; j++)
\x09\x09if (strcmp(a,m[j]) == 0)
\x09\x09\x09break;
\x09
\x09if (i < j)
\x09\x09return 1;
\x09else if (i == j)
\x09\x09return 0;
\x09else
\x09\x09return -1;
}
//综合年,月,日比较
int cmpYMD(struct date a, struct date b)
{
\x09if (cmpY(a.y,b.y) == -1)
\x09\x09return -1;
\x09else if (cmpY(a.y,b.y) == 1)
\x09\x09return 1;
\x09else
\x09{
\x09\x09if (cmpM(a.m,b.m) == -1)
\x09\x09\x09return -1;
\x09\x09else if (cmpM(a.m,b.m) == 1)
\x09\x09\x09return 1;
\x09\x09else
\x09\x09{
\x09\x09\x09if (a.d > b.d)
\x09\x09\x09\x09return 1;
\x09\x09\x09else if(a.d == b.d)
\x09\x09\x09\x09return 0;
\x09\x09\x09else
\x09\x09\x09\x09return -1;
\x09\x09}
\x09}
}
void main()
{
\x09//定义结构体数组
\x09struct date dt[3]={
\x09\x09{ 0, "Jan", 11},
\x09\x09{99, "Feb", 22},
\x09\x09{ 8, "Mar", 2}};
\x09struct date dtTemp;
\x09int i, j;
\x09//排序
\x09for (i = 0; i < 3-1; i++)
\x09\x09for (j = i+1; j < 3; j++)
\x09\x09\x09if (cmpYMD(dt[i],dt[j]) == 1)
\x09\x09\x09{
\x09\x09\x09\x09dtTemp = dt[i];
\x09\x09\x09\x09dt[i] = dt[j];
\x09\x09\x09\x09dt[j] = dtTemp;
\x09\x09\x09}
\x09
\x09//输出排序过后的日期
\x09for (i = 0; i < 3; i++)
\x09{
\x09\x09printf("%d %s %d\n",dt[i].y,&dt[i].m,dt[i].d);
\x09}
}
再问: 不好意思,那个年份的输入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 < 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]={ {"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); } }