Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何更改此代码以解决此挑战?_C_While Loop - Fatal编程技术网

C 如何更改此代码以解决此挑战?

C 如何更改此代码以解决此挑战?,c,while-loop,C,While Loop,我是一名编程新手,我正试图从在线网站上解决一些问题。其中一个问题阻止了我。 您可以在此处下载问题: 我不知道如何更改此代码以确定从控制台读取数据的最终位置 以下是我编写的代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE 256 int second_time(char a[]) { int hour1, minute1, time;

我是一名编程新手,我正试图从在线网站上解决一些问题。其中一个问题阻止了我。 您可以在此处下载问题:

我不知道如何更改此代码以确定从控制台读取数据的最终位置

以下是我编写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 256

int second_time(char a[])
{
    int hour1, minute1, time;

    hour1 = a[6] - '0';
    hour1 *= 10;
    hour1 += a[7] - '0';

    minute1 = a[9] - '0';
    minute1 *= 10;
    minute1 += a[10] - '0';

    time = (60*hour1) + minute1;
    return time;
}

int first_time(char b[])
{
    int hour2, minute2, time;

    hour2 = b[0] - '0';
    hour2 *= 10;
    hour2 += b[1] - '0';

    minute2 = b[3] - '0';
    minute2 *= 10;
    minute2 += b[4] - '0';

    time = (60*hour2) + minute2;
    return time;
}


int main(void) {
    char line[MAX_LINE];
    int i, j, s, k;
    int first, second, delta;

    scanf("%i", &s);
    getchar();  

    int max[4], max_hour[4];
    int flag = 1;
    for(k=0; k<4; k++)
    {
        max[k] = 0;
    }
    while(flag)
    {
        for(i=0;i<s-1; i++)
        {
            if(i%2 == 0)
            {
                scanf ("%[^\n]%*c", line);

                second = second_time(line); 
                if(s%2 == 0)
                {
                    i++;
                }
            }

            scanf ("%[^\n]%*c", line);

            first = first_time(line);

            delta = first - second;
            if (delta > max[k])
                max_hour[k] = second;
                max[k] = delta;
            second = second_time(line);
        }       
    }

    for(k=0; k<4; k++)
    {
        if(delta < 60)
            printf("Day #%i: the longest nap starts at %.2i:%.2i and will last for %i minutes.\n", k+1, max_hour[k]/60, max_hour[k]%60, max[k]);    
        else
            printf("Day #%i: the longest nap starts at %.2i:%.2i and will last for %i hours and %i minutes.\n", k+1, max_hour[k]/60, max_hour[k]%60, max[k]/60, max[k]%60); 
    }


    return 0;
}
#包括
#包括
#包括
#定义最大值第256行
整数秒(字符a[])
{
一小时一分钟时间;
小时1=a[6]-“0”;
小时1*=10;
小时1+=a[7]-“0”;
分钟1=a[9]-“0”;
分钟1*=10;
分钟1+=a[10]-“0”;
时间=(60*hour1)+分钟1;
返回时间;
}
int第一次(字符b[])
{
一小时二分,时间;
小时2=b[0]-“0”;
小时2*=10;
小时2+=b[1]-“0”;
分钟2=b[3]-“0”;
分钟2*=10;
分钟2+=b[4]-“0”;
时间=(60*小时2)+分钟2;
返回时间;
}
内部主(空){
字符行[最大行];
int i,j,s,k;
int第一,第二,delta;
scanf(“%i”和“&s”);
getchar();
int max[4],max_hour[4];
int标志=1;

对于(k=0;k函数scanf()返回成功匹配的项数。使用此返回值可设置无限循环并检查是否达到EOF。此外,对于这些问题,通常应逐个实例打印结果,不需要将所有答案保留在向量中(你不知道它会有多大)。

你假设时间表是按排序顺序给出的。事实并非如此。因此你需要对其排序,然后线性检查最大自由间隙

何时停止读取数据

只需要像这样输入

    while(scanf("%d",&s)!=EOF) 
    {
        read s schedule.
        sort
        get maximum free gap
        ****BINGO****
        ....
    }

Note: sorting is not relevant to looping but to your AC solution it is.
代码 正如你坚持你的代码
#包括
#包括
#包括
#定义最大值第256行
整数秒(字符a[])
{
一小时一分钟时间;
小时1=a[6]-“0”;
小时1*=10;
小时1+=a[7]-“0”;
分钟1=a[9]-“0”;
分钟1*=10;
分钟1+=a[10]-“0”;
时间=(60*hour1)+分钟1;
返回时间;
}
int第一次(字符b[])
{
一小时二分,时间;
小时2=b[0]-“0”;
小时2*=10;
小时2+=b[1]-“0”;
分钟2=b[3]-“0”;
分钟2*=10;
分钟2+=b[4]-“0”;
时间=(60*小时2)+分钟2;
返回时间;
}
内部主(空){
字符行[最大行];
int i,j,s,k;
int第一,第二,delta;
int max[200],max_hour[200];
int标志=1;
对于(k=0;k ans)
ans=(TT[i].st beg),点=beg;
beg=TT[i].ed;
}
如果((1080-beg)>ans)
ans=(1080-beg),点=beg;
printf(“Day#%d:最长的午睡开始于”++天);
printf(“%02d:%02d并将持续”,点/60,点%60);
如果(ans>=60)
printf(“%d小时和”,ans/60);
printf(“%d分钟。\n”,ans%60);
}
返回0;
}

我有一个带有以下代码的AC

代码:

#include <stdio.h>

int main()
{
    int s, c, day = 0, z, cp, cb, m;
    int f[480], beg, max;
    int h1, m1, h2, m2;
    int p1, p2;
    char line[256];

    while (scanf("%d\n", &s) != EOF) {
    ++day;

    for (z = 0; z < 480; ++z) f[z] = 1;
    beg = 0;
    max = 0;

    for (c = 0; c < s; ++c) {
        scanf("%d:%d %d:%d", &h1, &m1, &h2, &m2);
        fgets(line, 256, stdin);

        p1 = (h1 - 10) * 60 + m1;
        p2 = (h2 - 10) * 60 + m2;
        for (cp = p1; cp < p2; ++cp) f[cp] = 0;
    }

    c = 0;
    while (c < 480) {
        if (f[c]) {
        cb = c;
        m = 0;
        while (f[c] && c < 480) {
            ++c;
            ++m;
        }
        if (m > max) {
            beg = cb;
            max = m;
        }
        } else {
        ++c;
        }
    }

    printf("Day #%d: the longest nap starts at %02d:%02d and will last for ", day, 10 + beg / 60, beg % 60);
    if (max > 59) printf("%d hours and ", max / 60);
    printf("%d minutes.\n", max % 60);
    }

    return 0;
}
#包括
int main()
{
int s,c,day=0,z,cp,cb,m;
int f[480],beg,最大值;
int h1,m1,h2,m2;
int p1,p2;
字符行[256];
while(scanf(“%d\n”,&s)!=EOF){
++一天;
对于(z=0;z<480;++z)f[z]=1;
beg=0;
max=0;
对于(c=0;c最大值){
beg=cb;
max=m;
}
}否则{
++c;
}
}
printf(“第#%d天:最长的午睡时间从%02d:%02d开始,持续时间为”,第天,10+beg/60,beg%60);
如果(最大值>59)打印F(“%d小时和”,最大值/60);
printf(“%d分钟。\n”,最大值%60);
}
返回0;
}

为什么要添加无限循环标记?@coderredoc,因为在用户输入'\n'字符之前,我们没有关于循环长度的任何信息。但它总有一天会结束的,对吗?它为什么是无限的?@coderredoc Ok,已删除。
scanf(%[^\n]]*c,line);
比现在过时的
get()
更糟糕。使用
fgets()
阅读用户输入。请用代码说明您的想法,正如我所说,我是编程新手。我认为对它们进行排序与循环的长度无关!让我们假设它已排序。您也可以使用PDF文档中给出的输入检查您的代码。我这样做了,但它不起作用。只需尝试阅读一次。尝试实现它这不是你对待帮助过你的人的方式,@Uncle。请用代码说明你的想法,正如我说的,我是编程新手。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 256

int second_time(char a[])
{
    int hour1, minute1, time;

    hour1 = a[6] - '0';
    hour1 *= 10;
    hour1 += a[7] - '0';

    minute1 = a[9] - '0';
    minute1 *= 10;
    minute1 += a[10] - '0';

    time = (60*hour1) + minute1;
    return time;
}

int first_time(char b[])
{
    int hour2, minute2, time;

    hour2 = b[0] - '0';
    hour2 *= 10;
    hour2 += b[1] - '0';

    minute2 = b[3] - '0';
    minute2 *= 10;
    minute2 += b[4] - '0';

    time = (60*hour2) + minute2;
    return time;
}


int main(void) {
    char line[MAX_LINE];
    int i, j, s, k;
    int first, second, delta;



    int max[200], max_hour[200];
    int flag = 1;
    for(k=0; k<200; k++)
    {
        max[k] = 0;
    }
    while(scanf("%i", &s)!=EOF)
    {
        getchar();
        for(i=0;i<s-1; i++)
        {
            if(i%2 == 0)
            {
                scanf ("%[^\n]%*c", line);

                second = second_time(line); 
                if(s%2 == 0)
                {
                    i++;
                }
            }

            scanf ("%[^\n]%*c", line);

            first = first_time(line);

            delta = first - second;
            if (delta > max[k])
                max_hour[k] = second;
                max[k] = delta;
            second = second_time(line);
        }       


        for(k=0; k<s; k++)
        {
            if(delta < 60)
                printf("Day #%i: the longest nap starts at %.2i:%.2i and will last for %i minutes.\n", k+1, max_hour[k]/60, max_hour[k]%60, max[k]);    
            else
                printf("Day #%i: the longest nap starts at %.2i:%.2i and will last for %i hours and %i minutes.\n", k+1, max_hour[k]/60, max_hour[k]%60, max[k]/60, max[k]%60); 
        }
    }


    return 0;
}
typedef struct {
    int st, ed;
} schedule;
int cmp(const void *i, const void *j) {
    schedule *a, *b;
    a = (schedule *)i, b = (schedule *)j;
    return a->st <= b->st;
}
int main() {
    int n, i, a, b, c, d, day = 0;
    schedule TT[100];
    while(scanf("%d", &n) !=EOF) {
        for(i = 0; i < n; i++) {
            scanf("%d:%d %d:%d", &a, &b, &c, &d);
            getchar();
            TT[i].st = a*60 + b;
            TT[i].ed = c*60 + d;

        }
        qsort(TT, n, sizeof(schedule), cmp);
        int beg = 600, ans = 0, point;
        for(i = 0; i < n; i++) {
            if(( TT[i].st-beg ) > ans)
                ans = (TT[i].st-beg ), point = beg;
            beg = TT[i].ed;
        }
        if((1080 - beg) > ans)
            ans = (1080- beg), point = beg;
        printf("Day #%d: the longest nap starts at ", ++day);
        printf("%02d:%02d and will last for ", point/60, point%60);
        if(ans >= 60)
            printf("%d hours and ", ans/60);
        printf("%d minutes.\n", ans%60);
    }
    return 0;
}
#include <stdio.h>

int main()
{
    int s, c, day = 0, z, cp, cb, m;
    int f[480], beg, max;
    int h1, m1, h2, m2;
    int p1, p2;
    char line[256];

    while (scanf("%d\n", &s) != EOF) {
    ++day;

    for (z = 0; z < 480; ++z) f[z] = 1;
    beg = 0;
    max = 0;

    for (c = 0; c < s; ++c) {
        scanf("%d:%d %d:%d", &h1, &m1, &h2, &m2);
        fgets(line, 256, stdin);

        p1 = (h1 - 10) * 60 + m1;
        p2 = (h2 - 10) * 60 + m2;
        for (cp = p1; cp < p2; ++cp) f[cp] = 0;
    }

    c = 0;
    while (c < 480) {
        if (f[c]) {
        cb = c;
        m = 0;
        while (f[c] && c < 480) {
            ++c;
            ++m;
        }
        if (m > max) {
            beg = cb;
            max = m;
        }
        } else {
        ++c;
        }
    }

    printf("Day #%d: the longest nap starts at %02d:%02d and will last for ", day, 10 + beg / 60, beg % 60);
    if (max > 59) printf("%d hours and ", max / 60);
    printf("%d minutes.\n", max % 60);
    }

    return 0;
}