C语言问题,希望设计一个简结的。

陈钰铠 发布于 2013/07/26 17:05
阅读 801
收藏 1

@redraiment 你好,想跟你请教个问题:

下面的表格给出了一个城市到另一个城市的每日航班信息。        

起飞时间                                  抵达时间

8:00a.m.                              10:16 a.m.

9:43 a.m.                               11:52 a.m.

..............

(具体在程序中)


编写一个程序,要求用户输入一个时间(用24小时制的时分表示)。 程序选择起飞时间与用户输入最接近的航班,显示出相应的起飞时间和抵达时间。

Enter a 24-hour time : 13:15

Closest departure time is 12:47 p.m., arriving at 3:00 p.m.

提示:把输入用从午夜开始的分钟数表示。将这个时间与表格里也用从午夜开始的分钟数表示的起飞时间相比。例如:13:15从午夜开始是13X60 +15 =795分钟, 与下午12:47(从午夜开始是767分钟)最接近。

我自己编写了一个,但太过于繁琐,而且不太标准,希望你帮我设计一个简练的,谢谢!

#include <stdio.h>
#define time hour*60 + minute
int main()

{
int hour, minute;

printf("Enter a 24-hour time: ");

scanf("%d:%d", &hour, &minute);

if (0 < time && time <= ((9*60 +43) - 8*60)/2 + 8*60)
   
printf("Closest departure time is 8:00 a.m., arriving at 10:16 a.m.\n");

else if (((9*60 +43) - 8*60)/2 + 8*60 < time && time <= ((11*60 + 19) - (9*60 +43))/2 + (9*60 +43))
printf("Closest departure time is 9:43 a.m., arriving at 11:52 a.m.\n");

else if (((11*60 + 19) - (9*60 +43))/2 + (9*60 +43) < time && time <= ((12*60 + 47) - (11*60 + 19))/2 + (11*60 +19))
printf("Closest departure time is 11:19 a.m., arriving at 1:31 a.m.\n");

else if (((12*60 + 47) - (11*60 + 19))/2 + (11*60 +19) < time && time <= (14*60 - (12*60 +47))/2 + (12*60 +47))
printf("Closest departure time is 12:47 p.m., arriving at 3:00 p.m.\n");

else if (((14*60 - (12*60 +47))/2 + (12*60 +47)) < time && time <= ((15*60 + 45) - 14*60)/2 + (14*60))   
printf("Closest departure time is 2:00 p.m., arriving at 4:08 p.m.\n");

else if (((15*60 + 45) - 14*60)/2 + 14*60 < time && time <= (19*60 - (15*60 +45))/2 + (15*60 +45))
printf("Closest departure time is 3:45 p.m., arriving at 5:55 p.m.\n");

else if ((19*60 - (15*60 +45))/2 + (15*60 +45) < time && time <= ((21*60 + 45) - 19*60)/2 + 19*60)
printf("Closest departure time is 7:00 p.m., arriving at 9:20 p.m.\n");

else
printf("Closest departure time is 9:45 p.m., arriving at 11:58 p.m.\n");   
}




加载中
0
redraiment
redraiment

如果需要考虑时间是循环的(比如和第二天的班次比较)就修改cmp函数:

#include <stdlib.h>
#include <stdio.h> 

int schedule[][2] = {
  { 8 * 60 +  0, 10 * 60 + 16}, /* 08:00 => 10:16 */
  { 9 * 60 + 43, 11 * 60 + 52},
  {11 * 60 + 19, 13 * 60 + 31},
  {12 * 60 + 47, 15 * 60 +  0},
  {14 * 60 +  0, 16 * 60 +  8},
  {15 * 60 + 45, 17 * 60 + 55},
  {19 * 60 +  0, 21 * 60 + 20},
  {21 * 60 + 45, 23 * 60 + 58}
};
int except;

int cmp(const void* a, const void *b) {
  int m = ((int*)a)[0];
  int n = ((int*)b)[0];
  return abs(m - except) - abs(n - except);
}

void time_convert(int timestamp, char* s) {
  sprintf(s, "%d:%02d %c.m.", timestamp / 60 % 12, timestamp % 60, timestamp < 720? 'a': 'p');
}

int main(void) {
  char from[16], to[16];
  int hour, minute;

  printf("Enter a 24-hour time: ");
  scanf("%d:%d", &hour, &minute);

  except = hour * 60 + minute;
  qsort(schedule, sizeof(schedule) / sizeof(schedule[0]), sizeof(schedule[0]), cmp);

  time_convert(schedule[0][0], from);
  time_convert(schedule[0][1], to);

  printf("Closest departure time is %s, arriving at %s.\n", from, to);

  return EXIT_SUCCESS;
}

0
泡不烂的凉粉
泡不烂的凉粉

选择起飞时间与用户输入最接近的航班.

如果我没理解错. 这个问题应该很简单. 
时间差, 不就是用 输入的时间-起飞时间计算绝对值, 如果 > 12小时, 相差时间= 24小时 - 间隔时间. 之后对间隔时间排序不就获得最接近的了.

循环遍历时刻表
间隔时间= 绝对值(输入时间-起飞时间);
如果(间隔时间>12小时) 间隔时间 = 24小时 - 间隔时间.
时间差列表[起飞时间]=间隔时间
循环遍历结束
排序时间差列表(时间差列表);
获取起飞时间对应的数据.

完成.

0
陈钰铠

多谢了,很简练,就是太过于高深莫测,我这初级水平,有些语句还不怎么理解,多谢你的热心回答!!!

二楼也多谢了你的热心指导!

返回顶部
顶部