_考不上研究生不改名 2023-01-05 19:59 采纳率: 100%
浏览 40
已结题

c语言实现以下问题,求各位指正!

从键盘输入n个日期,输入格式为:月日年 例如:01052023,找出其中距离今天最远的三个日期,请问各位,这个问题有没有更好的解法。
下面是我自己的想法和程序,请各位批评指正。

/*
算法思想:
先把输入的字符串(月日年)通过函数整合为int类型,格式为(年月日)
这样可以直接和今天的日期20201225进行减法运算并取绝对值,绝对值越大,表示距离今天越远。
*/
#include<stdio.h>
#include<math.h>
#include<string.h>
int fun(char *p)
{//返回整合后日期与20201225的差值
    int i=4;
    int data=0;
    while(i<8)
        data=data*10+p[i++]-'0';
    i=0;
    while(i<4)
        data=data*10+p[i++]-'0';
    return abs(data-20201225);
}
void swap(char *p,char *q)
{
    char str[10];
    strcpy(str,p);
    strcpy(p,q);
    strcpy(q,str);
}
void main()
{
    char max1[10],max2[10],max3[10];//按差值大小依次存放距离今天最远的三个日期
    char data[10];  //存放输入的日期
    int n;   //输入日期的个数
    scanf("%d",&n);
    getchar(); //接收输入缓冲区的换行符
    gets(max1);gets(max2);gets(max3); //获取前三个输入的日期
    //三个if调整顺序,max1中日期最远,2和3依次
    if(fun(max1)<fun(max2))
        swap(max1,max2);
    if(fun(max1)<fun(max3))
        swap(max1,max3);
    if(fun(max2)<fun(max3))
        swap(max2,max3);
    for(int i=4;i<=n;i++)
    {
        gets(data);
        if(fun(data)>fun(max1))
        {
            strcpy(max3,max2);
            strcpy(max2,max1);
            strcpy(max1,data);
        }
        else if(fun(data)>fun(max2))
        {
            strcpy(max3,max2);
            strcpy(max2,data);
        }
        else if(fun(data)>fun(max3))
            strcpy(max3,data);
    }
    puts(max1);puts(max2);puts(max3);
}
  • 写回答

3条回答 默认 最新

  • |__WhoAmI__| 2023-01-05 20:08
    关注

    这个程序的思路是正确的。但是在实现方面,可以考虑以下几点优化:

    1、使用 sscanf 函数,而不是手写的 fun 函数,把输入的字符串转化为整数:

    int data;
    sscanf(p, "%2d%2d%4d", &month, &day, &year);
    data = year * 10000 + month * 100 + day;
    return abs(data - 20201225);
    

    2、使用结构体存储每个日期及其差值,而不是使用字符串和临时变量。这样可以减少代码量,同时提高程序的可读性。

    3、使用快速排序函数,而不是手写的 swap 函数,对日期进行排序。
    仅供参考,望采纳,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月13日
  • 已采纳回答 1月5日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 qt+ffmpeg报错non-existing PPS 0 referenced
  • ¥15 FOC simulink
  • ¥15 咨询一下有关于王者荣耀赢藏战绩
  • ¥50 MacOS 使用虚拟机安装k8s
  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?