*****1112: 4004 开门人和关门人

文章讲述了如何用C语言编写程序解决根据签到签离记录找出每天开门和关门人的题目。程序涉及字符串比较函数strcmp和strcpy的使用,以及结构体在处理复杂数据时的作用。文中给出了错误代码的分析和正确代码示例。
摘要由CSDN通过智能技术生成

这个题我又是一个愚蠢的人

我应该看完题 再思考用什么做的

就像我总不能基本上把无聊的前奏写了一半,然后发现,哦,原来用结构体会超级简单。

题目描述

每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。

输入

测试输入的第一行给出记录的总天数N (N > 0 )。下面列出了N天的记录。每天的记录在第一行给出记录的条目数M ( M > 0 ),下面是M行,每行的格式为:
证件号码 签到时间 签离时间
其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

输出

对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,且没有多人同时签到或者签离的情况。

样例输入 复制

3
1
ME3021112225321 00:00:00 23:59:59
2
EE301218 08:05:35 20:56:35
MA301134 12:35:45 21:40:42
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40

样例输出 复制

ME3021112225321 ME3021112225321
EE301218 MA301134
SC3021234 CS301133

绿植 写这个破烂程序 因为自己读错题了,写了半个小时了啊啊啊啊呜呜呜

为啥这个程序的第二三行 只能出的来gm人啊

通过检测,发现是km出现了问题,可是我的gm是复制的km啊,究竟是怎么回事///

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    char zj[20];
    int hour,min,sec;
    int mhour,mmin,msec;
    char km[20];
    char gm[20];
    char c;
    int max_hour,min_hour;
    int max_min,min_min;
    int max_sec,min_sec;
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
           
            memset(zj,0,sizeof(zj));
            int day;
            scanf("%d",&day);
            max_hour=max_min=max_sec=-1;
            min_hour=min_min=min_sec=10000;
            
            for(int i=0;i<day;i++)
            {
                memset(km,0,sizeof(km));
                memset(gm,0,sizeof(gm));
                scanf("%s %02d%c%02d%c%02d %02d%c%02d%c%02d",zj,&hour,&c,&min,&c,&sec,&mhour,&c,&mmin,&c,&msec);
                if(hour<min_hour)
                {
                    strcpy(km,zj);
                    min_hour=hour;
                    min_min=min;
                    min_sec=sec;
                }
                 if(hour==min_hour)
                {
                    if(min<min_min)
                    {
                        strcpy(km,zj);
                        min_min=min;
                        min_sec=sec;
                    }
                }
                if(hour==min_hour)
                {
                    if(min==min_min)
                    {
                       if(sec<min_sec)
                       {
                           strcpy(km,zj);
                           min_sec=sec;
                       }
                    }
                }
                
                if(hour>max_hour)
                {
                    strcpy(gm,zj);
                    max_hour=hour;
                    max_min=min;
                    max_sec=sec;
                }
                if(hour==max_hour)
                {
                    if(min>max_min)
                    {
                        strcpy(gm,zj);
                        max_min=min;
                        max_sec=sec;
                    }
                }
                if(hour==max_hour)
                {
                    if(min==max_min)
                    {
                       if(sec>min_sec)
                       {
                           strcpy(gm,zj);
                            max_sec=sec;
                       }
                    }
                }
                
            }
            printf("%s %s\n",km,gm);
        }
    }
}

  别问了 这道题 问就是崩溃 各种找程序 结果找到的都是错的。

经历一个半小时之后,没关系,正常的,别放弃!!!!!!!!

找到了一个正确的程序,现在让我们来分析一下它的思路叭

这个题所有的都采用的是字符串的比较,可以说是考察的知识点是非常简单的。

但是不要过于焦虑,至少我们已经学会了这道题,也学会了一个新思路,也就是时间也是可以用字符串来比较的。

#include <stdio.h>
#include <string.h>

int main()
{
    int n, t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        char max2[10] = "00:00:00", max1[10] = "23:59:59";
        char t1[10], t2[10], num1[30], num2[30], num[30];
//num1 开门人 num2 关门人
        getchar();
        for(int i = 0; i < n; i++)
        {
            scanf("%s %s %s", num, t1, t2);
            if(strcmp(t1, max1) <= 0)
            {
                strcpy(num1, num);
                strcpy(max1, t1);
            }
            if(strcmp(t2, max2) >= 0)
            {
                strcpy(num2, num);
                strcpy(max2, t2);
            };
        }
        printf("%s %s\n", num1, num2);    
    }
    return 0;
}

看下考察的知识点都有哪些

  1. 字符串操作函数strcmp和strcpy

strcmp是比较两个字符串大小的函数,

原型为:int strcmp(const char *str1, const char *str2)

它可以比较两个字符串是否相等,并返回以下三种值之一:

  • 如果str1等于str2,则返回0
  • 如果str1小于str2,则返回一个负整数
  • 如果str1大于str2,则返回一个正整数

注意,如果使用strcmp比较两个字符串的大小,必须确保这两个字符串都是以\0结尾的。

strcpy是将一个字符串复制到另外一个字符串中的函数,原型为:char *strcpy(char *dest, const char *src)。它将源字符串src(以\0结尾)复制到目标字符串dest中,并返回指向dest字符串的指针。

  1. 字符串数组的定义和使用

在C语言中,字符串通常用字符数组来表示。例如,要定义一个长度为10的字符串数组,可以使用如下语句:char str[10];。在定义时,必须指定字符数组的长度。然后,就可以通过下标和循环遍历的方式对字符串进行操作,例如赋值、拷贝、比较等。配合字符串操作函数,可以实现各种字符串处理功能。需要注意的是,在定义字符串数组时,必须留出\0结束符所需的空间。例如,若要存储一个长度为3的字符串,字符数组应当至少分配4个字节的空间,前3个字节存储字符串内容,最后一个字节存储\0结束符。

 

然后对这道题的话,还是建议有一下结构体的使用。 下面我将写一个使用了结构体的程序。 

 

#include<stdio.h>
#include<string.h>
struct cc{
    char name[20];
    char in[20];
    char out[20];
} early,last,sb;
int main()
{
    int n;
      int m;
    while(scanf("%d",&n)!=EOF)
    {
       for(int j=0;j<n;j++)
        {
          
        scanf("%d",&m);
        for(int i=0;i<m;i++)
        {
            scanf("%s %s %s",&sb.name,&sb.in,&sb.out);
            if(strcmp(early.in,sb.in)>0||i==0)
            {
                strcpy(early.in,sb.in);
                strcpy(early.name,sb.name);
            }
            if(strcmp(last.out,sb.out)<0||i==0)
            {
                strcpy(last.out,sb.out);
                strcpy(last.name,sb.name);
            }
            
        }
        printf("%s %s\n",early.name,last.name);
        }
        
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值