这个题我又是一个愚蠢的人
我应该看完题 再思考用什么做的
就像我总不能基本上把无聊的前奏写了一半,然后发现,哦,原来用结构体会超级简单。
题目描述
每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。
输入
测试输入的第一行给出记录的总天数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
#include
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;imax_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
#include
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;
}
看下考察的知识点都有哪些
- 字符串操作函数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字符串的指针。
- 字符串数组的定义和使用
在C语言中,字符串通常用字符数组来表示。例如,要定义一个长度为10的字符串数组,可以使用如下语句:
char str[10];
。在定义时,必须指定字符数组的长度。然后,就可以通过下标和循环遍历的方式对字符串进行操作,例如赋值、拷贝、比较等。配合字符串操作函数,可以实现各种字符串处理功能。需要注意的是,在定义字符串数组时,必须留出\0结束符所需的空间。例如,若要存储一个长度为3的字符串,字符数组应当至少分配4个字节的空间,前3个字节存储字符串内容,最后一个字节存储\0结束符。
然后对这道题的话,还是建议有一下结构体的使用。 下面我将写一个使用了结构体的程序。
#include
#include
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;j0||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);
}
}
}