| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1901 人关注过本帖
标题:签到表问题 求助 不知道哪出错了
只看楼主 加入收藏
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:5 
签到表问题 求助 不知道哪出错了
题目
在一周训练结束后,得到了这周的签到表,现在需要统计这周训练时长。共有n个人参加这周培训,每晚训练前需要签到,如果按时训练,会在签到表标注'o',如果缺训,会标注'x'。每周训练三次,每次训练时间为3小时,如果缺席,需要补训,每次缺训需要补训3小时,在补训签到表签到签退。补训签到表一共签了m行,每行有补训人的姓名和时间。你需要按签到表顺序输出每个人的训练总时长,如果达到24小时或以上,输出24:00,如果不足9小时,需要在后面标注缺训时长,时间与最长的姓名之间有一个空格,其它与该行对齐,具体格式见样例。

输入

输入第一行一个整数T,代表接下来有T组测试数据。
接下来T组,每组第一行有2个整数n,m,接下来n行,每行有一个字符串,表示参加训练人的名字,接下来有三个字符'o'或'x','o'表示签到,'x'表示缺席,接下来m行,每行有一个字符串,表示补训人的名字,接下来有两个时间,用hour:minute的形式给出表示签到和签退的时间。
数据范围:1≤T≤10,0≤m<n≤1000,1≤len(name)≤20,0≤hour≤23,0≤minute≤59,同一次补训签到签退在同一天,没有两个人的名字相同.
样例输入
2
8 16
guozhe o o o
guozhenwei o o x
jiangjiawei o x o
shaqingrui o x x
sunhaoyu x o o
sunhongjia x o x
wangyan x x o
wangyu x x x
sunhongjia 08:00 09:00
sunhongjia 09:01 10:01
sunhongjia 10:02 11:02
sunhongjia 11:03 12:03
sunhongjia 12:04 13:04
sunhongjia 13:05 14:05
wangyan 18:00 21:00
wangyan 18:00 21:00
jiangjiawei 13:30 15:00
jiangjiawei 09:00 10:30
guozhenwei 23:58 23:59
guozhenwei 00:00 02:59
sunhaoyu 00:00 23:59
shaqingrui 08:00 11:00
shaqingrui 13:00 16:00
wangyu 07:07 07:08
3 5
a o x o
b x o x
c o x o
c 12:00 14:00
a 00:00 02:00
b 12:34 21:43
c 23:00 23:59
a 19:00 19:30
样例输出
guozhe      09:00
guozhenwei  09:00
jiangjiawei 09:00
shaqingrui  09:00
sunhaoyu    24:00
sunhongjia  09:00
wangyan     09:00
wangyu      00:01(-08:59)
a 08:30(-00:30)
b 12:09
c 08:59(-00:01)

搜索更多相关主题的帖子: 输出 表示 输入 小时 时间 
2020-01-02 14:01
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
收藏
得分:0 
这是我的代码 错的还挺离谱的
#include<stdio.h>
#include<string.h>
struct qd
{
    char name[20];
    char time1,time2,time3;
    char start[5],endd[5];
    int sum=0,sum2;
} a[1000],b[1000];
int main ()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
        {
            scanf("%s%c%c%c",a[i].name,&a[i].time1,&a[i].time2,&a[i].time3);
            if(a[i].time1=='o') a[i].sum+=3;
            if(a[i].time2=='o') a[i].sum+=3;
            if(a[i].time3=='o') a[i].sum+=3;
        }
        for(int i=1; i<=m; i++)
        {
            scanf("%s%s%s",b[i].name,b[i].start,b[i].endd);
        }
        int len=0;
        int hour,minute;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                if(strcmp(a[i].name,b[j].name)==0)
                {
                    len+=((b[j].endd[0]*10+b[j].endd[1])*60+b[j].endd[3]*10+b[j].endd[4])-((b[j].start[0]*10+b[j].start[1])*60+b[j].start[3]*10+b[j].start[4]);
                }
            }
            a[i].sum2=a[i].sum*60+len;
        }
        int len2;
        for(int i=1; i<=n; i++)
        {
            len2=a[i].sum2;
            if(len2>=1440)
            {
                printf("%-12s 24:00\n",a[i].name);
            }
            else if(len2>=540)
            {
                printf("%-12s %02d:%02d\n",a[i].name,len2/60,len2%60);
            }
            else
            {
                printf("%-12s %02d:%02d",a[i].name,len2/60,len2%60);
                len2=540-len2;
                printf("(-%02d:%02d)\n",len2/60,len2%60);
            }
        }
         printf("\n");
    }
    return 0;
}
2020-01-02 14:02
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
收藏
得分:5 
struct qd
{
    char name[20];
    char time1,time2,time3;
    char start[5],endd[5];
    int sum=0,sum2;
} a[1000],b[1000];

好好的结构体定义,偏偏给sum赋值为0,这不是画蛇添足吗?
这样赋值不起作用。
还有一个就是
scanf("%s%c%c%c",a[i].name,&a[i].time1,&a[i].time2,&a[i].time3);

%c指读取一个字符,可以使任意,题目标准输入是每个数据之间以空格分隔。输入时则要把空格略过。建议在%c之前加一个空格,使读入数据的时候以空格区别每一个数据。

[此贴子已经被作者于2020-1-2 22:25编辑过]

2020-01-02 22:14
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
收藏
得分:0 
回复 3楼 bcbbcclbbc
谢谢大佬 确实解决了很多问题
不过这里面时间的计算还是有点问题 我是全转化成分钟在比较计算 然后在转化小时:分钟 不知道哪里出问题了
2020-01-02 22:31
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
收藏
得分:5 
循环中变量的值(变与不变),比如:len,作为一个中间变量,应该在每次用完之后初始化,以防后面的循环使用之前的值,造成不必要的麻烦。
int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
        {
            a[i].sum=0;              //sum初始化
            scanf("%s %c %c %c",a[i].name,&a[i].time1,&a[i].time2,&a[i].time3);
            if(a[i].time1=='o') a[i].sum+=3;
            if(a[i].time2=='o') a[i].sum+=3;
            if(a[i].time3=='o') a[i].sum+=3;
        }
        for(int i=1; i<=m; i++)
        {
            scanf("%s %s %s",b[i].name,b[i].start,b[i].endd);
        }
        int len;
        int hour,minute;
        for(int i=1; i<=n; i++)
        {
            len=0;         //len循环前初始化
            a[i].sum2=0;
          //sum2 使用前初始化(第二次循环输入,原数据应该被清空)同上sum
            for(int j=1; j<=m; j++)
            {
                if(strcmp(a[i].name,b[j].name)==0)
                {
                    len+=((b[j].endd[0]*10+b[j].endd[1])*60+b[j].endd[3]*10+b[j].endd[4])-((b[j].start[0]*10+b[j].start[1])*60+b[j].start[3]*10+b[j].start[4]);
                }
            }
            a[i].sum2=a[i].sum*60+len;
        }
2020-01-04 06:48
Sky_
Rank: 2
等 级:论坛游民
帖 子:38
专家分:10
注 册:2019-12-17
收藏
得分:0 
谢谢大佬 问题完全解决了
2020-01-04 12:56
快速回复:签到表问题 求助 不知道哪出错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028948 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved