7-241 按日期排序

输入格式:

本题只有一组测试数据,且日期总数不超过100个。按“MM/DD/YYYY”的格式逐行输入若干日期。

输出格式:

按“MM/DD/YYYY”的格式输出已从小到大排序的各个日期,每个日期占一行。

输入样例:

12/31/2005
10/21/2003
02/12/2004
11/12/1999
10/22/2003
11/30/2005

输出样例:

11/12/1999
10/21/2003
10/22/2003
02/12/2004
11/30/2005
12/31/2005

 

 解题

#include<stdio.h>
#include<stdlib.h>

//定义一个Date数据类型的结构体
typedef struct {
    int day;
    int month;
    int year;
}Date;


/*定义一个顺序表结构体,通过Date类型的数组来存放日期,
和顺序表的长度length(从1开始计数到n)*/
typedef struct{
    Date date[100];
    int length = 0;
}seqlist;


/*从键盘读入数据到顺序表L中的Date数组内的month、day和year中,
同时L的长度length随着读入的组数的增加而增加*/
void create(seqlist &L){
    int i = 0;
    while(~scanf("%2d/%2d/%4d", &L.date[i].moth, &L.date[i].day, &L.date[i].year)){
        i++;
        L.length++;
    }
}


/*冒泡排序,在排序的阶段分为year不相等和相等的两种情况,
在year相等的情况下又分为month相等和不相等都两种情况, 
在month相等的情况下只有day不相等的情况。如果其中任意一个不相等,
即可触发交换条件。要注意的是中间变量temp是Date数据类型的,
因为我们的数组也是Date类型的。*/
void sort(seqlist &L, int length){
    Date temp;
    int i, j;
    for(i = 0; i < length-1; i++){
        for(j = 0; j < length-1-i; j++){
            if(L.date[j].year > L.date[j+1].year){
                temp = L.date[j+1];
                L.date[j+1] = L.date[j];
                L.date[j] = temp;
            }else if(L.date[j].year == L.date[j+1].year){
                if(L.date[j].moth > L.date[j+1].moth){
                    temp = L.date[j+1];
                    L.date[j+1] = L.date[j];
                    L.date[j] = temp;
                }else if(L.date[j].moth == L.date[j+1].moth){
                    if(L.date[j].day > L.date[j+1].day){
                        temp = L.date[j+1];
                        L.date[j+1] = L.date[j];
                        L.date[j] = temp;
                    }
                }
            }
        }
    }
}

int main(){
    seqlist L;//将L定义为seqlist类型的变量
    create(L);//读入数据
    sort(L, L.length);//排序

    //打印,不满两位数的用0补齐
    for(int i = 0; i < L.length; i++){
        printf("%02d/%02d/%4d\n", L.date[i].moth, L.date[i].day, L.date[i].year);
    }
    return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值