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;
}