Если заявление и выражение вопроса совет - PullRequest
1 голос
/ 02 апреля 2011

Я только что задал этот вопрос из программирования К.Н. Кинга на языке С: современный подход.Это не домашняя работа, я просто учусь из книги ...

В следующей таблице показаны ежедневные рейсы из одного города в другой:
Время отправления - Время прибытия
8:00 утра - 10:16 утра
9:43 утра - 11:52 утра * 10101 * 11:19 утра - 1:31 вечера * 10101 * 12:47 вечера - 3:00 вечера
14:00 - 16:08
15:45 - 17:55 * 10101 * 19:00 - 21:20 * 10101 * 21:45 - 11:58

Напишите программу, которая запрашиваетпользователь вводит время (выраженное в часах и минутах, используя 24-часовые часы).Затем программа отображает время отправления и прибытия рейса, время вылета которого ближе всего к введенному пользователем:

Введите 24-часовое время : 13: 15
Ближайшее время отправления - 12:47. Прибытие в 15:00.и сравните его с временем отправления, также выраженным в минутах с полуночи.Например, 13:15 - это 13 x 60 + 15 = 795 минут с полуночи, что ближе к 12:47 вечера (767 минут с полуночи), чем к любому другому времени вылета.

ТакДо сих пор мы рассматривали только базовые выражения сравнения и оператор if и switch, поэтому мой ответ должен основываться на них, очевидно, и не слишком причудливо.Мой код, который я придумал, приведен ниже, мне интересно, если бы кто-то захотел взглянуть на него и посмотреть, нахожусь ли я на правильном пути, кажется, он работает, но кажется, много кодаза такую ​​маленькую вещь.Возможно, это было просто, чтобы научить нас логике.Я не вставил весь код, остальное - это одно и то же снова и снова, когда сравниваются значения.У меня нет опыта программирования, поэтому, пожалуйста, будьте осторожны!

Спасибо за ваше время, Эндрю

#include <stdio.h>

int main (int argc, const char * argv[]) {


// Flight departure times since midnight
// 8am, 9:45am, 11:19am, 12:47pm
// 2pm, 3:45pm, 7pm, 7:45pm
int a = 480, b = 585, c = 679, d = 767,
    e = 840, f = 945, g = 1140, h = 1185;

// Flight arrival times for respective departure times.
int a1 = 616, b1 = 712, c1 = 811, d1 = 900,
    e1 = 968, f1 = 1075, g1 = 1280, h1 = 1438;

int hours, minutes, time, t, u;

// Get the users time

printf("Enter a 24 hour time (hh:mm): \n");
scanf("%d:%d", &hours, &minutes);

time = hours * 60 + minutes;

printf("Closest departure time is ");

if (time <= a)
    printf("8:00am");
else
    if (time > a && time <= b) {
                t = time - a; 
                u = b - time;
                if (t < u) {
                    printf("%.2d:%.2d", a / 60, a % 60);
                        if (a / 60 == 0)
                            printf("am");
                        else if (a / 60 < 12)
                            printf("am");
                        else if (a / 60 == 12)
                            printf("pm");
                        else
                            printf("pm");
                    printf(", arriving at %d:%.2d", a1 / 60, a1 % 60);
                        if (a1 / 60 == 0)
                            printf("am");
                        else if (a1 / 60 < 12)
                            printf("am");
                        else if (a1 / 60 == 12)
                            printf("pm");
                        else
                            printf("pm");
                }
                else {
                        printf("%.2d:%.2d", b / 60, b % 60);
                        if (b / 60 == 0)
                            printf("am");
                        else if (b / 60 < 12)
                            printf("am");
                        else if (b / 60 == 12)
                            printf("pm");
                        else
                            printf("pm");
                    printf(", arriving at %d:%.2d", b1 / 60, b1 % 60);
                        if (b1 / 60 == 0)
                            printf("am");
                        else if (b1 / 60 < 12)
                            printf("am");
                        else if (b1 / 60 == 12)
                            printf("pm");
                        else
                            printf("pm");
                }
    }

Изменения согласно совету, который мне дали: (Спасибоxamypah и Gabe) ...

int hours, minutes, time, t, u, x, y;

// Get the users time

printf("Enter a 24 hour time (hh:mm): \n");
scanf("%d:%d", &hours, &minutes);

time = hours * 60 + minutes;

printf("Closest departure time is ");

if (time <= a)
    printf("8:00am");
else
    if (time > a && time <= b) {
                t = time - a; 
                u = b - time;

                if (t <= u) {
                    x = a;
                    y = a1;
                }
                else {
                    x = b;
                    y = b1;
                }

Затем, в конце программы, после нескольких из перечисленных выше действий:

printf("%.2d:%.2d", x / 60, x % 60);

if (x / 60 < 12)
    printf("am");
else 
    printf("pm");
    printf(", arriving at %d:%.2d", y / 60, y % 60);

if (y / 60 < 12)
    printf("am");
else
    printf("pm");

На самом деле мне пришлось внести некоторые изменения в этот оператор выводаили же он отображал время в 24-часовом формате с am и pm после:

if (x / 60 < 12)
    printf("%d:%.2d am", x / 60, x % 60);
else 
    printf("%d:%.2d pm", (x / 60) - 12, x % 60);

printf(", arriving at ");

if (y / 60 < 12)
    printf("%d:%.2d am", y / 60, y % 60);
else
    printf("%d:%.2d pm", (y / 60) - 12, y % 60);

Ответы [ 8 ]

3 голосов
/ 02 апреля 2011

Да, вы на правильном пути, но вы также можете значительно уменьшить размер кода.Послушайте, я думаю, один и тот же кусок кода очень часто повторяется в вашей программе:

                    printf("%.2d:%.2d", a / 60, a % 60);
                        if (a / 60 == 0)
                            printf("am");
                        else if (a / 60 < 12)
                            printf("am");
                        else if (a / 60 == 12)
                            printf("pm");
                        else
                            printf("pm");
                    printf(", arriving at %d:%.2d", a1 / 60, a1 % 60);
                        if (a1 / 60 == 0)
                            printf("am");
                        else if (a1 / 60 < 12)
                            printf("am");
                        else if (a1 / 60 == 12)
                            printf("pm");
                        else
                            printf("pm");

Он повторяется для a, для b и т. Д.И обычно это делается в конце выполнения.

Итак, если вы разбиваете свой алгоритм на две части: первая - нахождение правильного временного диапазона, а вторая - его распечатка, затем вы избавляетесьэто копия / вставка.

2 голосов
/ 02 апреля 2011

Посмотрите внимательно на этот код:

if (b / 60 == 0)
    printf("am");
else if (b / 60 < 12)
    printf("am");

Вы понимаете, почему он избыточен?

1 голос
/ 02 апреля 2011

Разумный ответ требует использования массивов и функций. Вы, похоже, тоже не очень хорошо выглядите рядом.

Данные можно представить так, используя макрос, чтобы скрыть повторяющиеся вычисления:

#define TIME(hh, mm) ((hh) * 60 + (mm))

static const int dep[] = { TIME( 8,  0), TIME( 9, 45), TIME(11, 19), TIME(12, 47),
                           TIME(14,  0), TIME(15, 45), TIME(19,  0), TIME(19, 45) };
static const int arr[] = { TIME(10, 16), TIME(11, 52), TIME(13, 31), TIME(15,  0),
                           TIME(16,  8), TIME(17, 55), TIME(21, 20), TIME(23, 58) };
enum { NUM_TIMES = sizeof(dep) / sizeof(dep[0]) };

Вам также следует использовать функцию для форматирования времени в виде строки. Обратите внимание, что время am / pm странное; Вы должны заменить 12 на 0 (поэтому 12:59 утра наступает незадолго до 1:00 утра). Функция предполагает, что переданный буфер достаточно большой (минимум 9 байт), чтобы принять отформатированную строку.

char *timestr(int hhmm, char *buffer)
{
    int hh = (hhmm / 60) % 12;
    if (hh == 0)
        hh = 12;
    sprintf(buffer, "%.2d:%.2d %s", hh, hhmm % 60, (hhmm < TIME(12, 0)) ? "am" : "pm");
    return buffer;
}

Теперь, учитывая прочитанное значение, вы можете найти правильное значение довольно просто:

void find_and_print_nearest_time(int time)
{
    int i = 0;
    if (time < dep[i])
        // Before first departure
        print_times(time, dep[i], arr[i]);
    else if (time >= dep[NUM_TIMES-1])
        // After last departure
        print_times(time, dep[NUM_TIMES-1], arr[NUM_TIMES-1]);
    else
    {
        // Somewhere in the middle
        for (i = 0; i < NUM_TIMES - 1; i++)
        {
            if (time >= dep[i+1])
                continue;
            if (time < (dep[i] + dep[i+1]) / 2)
                print_times(time, dep[i], arr[i]);
            else if (time < dep[i+1])
                print_times(time, dep[i+1], arr[i+1]);
            break;
        }
    }
}

void print_times(int u_time, int dep, int arr)
{
    char buffer1[9];
    char buffer2[9];
    char buffer3[9];
    printf("Given %s, the nearest departure time is %s, arriving at %s\n",
           timestr(u_time, buffer1), timestr(dep, buffer2), timestr(arr, buffer3));
}

Оставив только с main() написать:

#include <stdio.h>

int main(void)
{
    int hours, minutes, time;

    // Get the user's time
    printf("Enter a 24 hour time (hh:mm): \n");
    if (scanf("%d:%d", &hours, &minutes) == 2)
    {
        time = hours * 60 + minutes;
        find_and_print_nearest_time(time);
    }
    return(0);
}

Или с циклом (проще для тестирования!):

int main(void)
{
    int hours, minutes, time;

    while (scanf("%d:%d", &hours, &minutes) == 2)
    {
        // Should check 0 <= hours <= 23
        // Should check 0 <= minutes <= 59
        // Might accept 24:00
        time = TIME(hours, minutes);
        find_and_print_nearest_time(time);
    }
    return(0);
}

При тестировании я собирал вещи в несколько ином порядке, но код сработал так, как я ожидал в первый раз. Предоставлены входные данные:

00:00
06:00
08:00
08:50
08:51
08:52
08:53
08:54
08:55
09:42
09:43
09:44
10:30
10:31
10:32
10:33
14:50
14:51
14:52
14:53
14:54
14:55
21:44
21:45
21:46
23:59

Вывод был:

Given 12:00 am, the nearest departure time is 08:00 am, arriving at 10:16 am
Given 06:00 am, the nearest departure time is 08:00 am, arriving at 10:16 am
Given 08:00 am, the nearest departure time is 08:00 am, arriving at 10:16 am
Given 08:50 am, the nearest departure time is 08:00 am, arriving at 10:16 am
Given 08:51 am, the nearest departure time is 08:00 am, arriving at 10:16 am
Given 08:52 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 08:53 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 08:54 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 08:55 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 09:42 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 09:43 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 09:44 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 10:30 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 10:31 am, the nearest departure time is 09:45 am, arriving at 11:52 am
Given 10:32 am, the nearest departure time is 11:19 am, arriving at 01:31 pm
Given 10:33 am, the nearest departure time is 11:19 am, arriving at 01:31 pm
Given 02:50 pm, the nearest departure time is 02:00 pm, arriving at 04:08 pm
Given 02:51 pm, the nearest departure time is 02:00 pm, arriving at 04:08 pm
Given 02:52 pm, the nearest departure time is 03:45 pm, arriving at 05:55 pm
Given 02:53 pm, the nearest departure time is 03:45 pm, arriving at 05:55 pm
Given 02:54 pm, the nearest departure time is 03:45 pm, arriving at 05:55 pm
Given 02:55 pm, the nearest departure time is 03:45 pm, arriving at 05:55 pm
Given 09:44 pm, the nearest departure time is 07:45 pm, arriving at 11:58 pm
Given 09:45 pm, the nearest departure time is 07:45 pm, arriving at 11:58 pm
Given 09:46 pm, the nearest departure time is 07:45 pm, arriving at 11:58 pm
Given 11:59 pm, the nearest departure time is 07:45 pm, arriving at 11:58 pm
0 голосов
/ 09 октября 2015

Внесены изменения, чтобы сделать его более совершенным

включает

int main()
{
int h,m,t,temp1,temp2,
    a1,a2,d1,d2;      //a1,a1 & d1,d2 are ariival & dep. time res.

//Departure times
// dt1 = 480, dt2 = 583, dt3 = 679, dt = 767, 
// dt5 = 840, dt6 = 945, dt = 1140, dt = 1305;

//Arrival times    
// at1 = 616, at2 = 712, at3 = 811, at4 = 900, 
// at5 = 968, at6 = 1075, at7 = 1280, at8 = 1438;

printf("Enter a 24-hour time(hh:mm): ");
scanf("%d:%d",&h,&m);

t = h*60 + m;

printf("Closest departure time is ");

//CONDITIONS FOR CLOSEST DEPARTURE TIME.
if(t <= 480)
{
    temp1 = 480 - t;
    temp2 = t + 135; //Since time is 9:45p.m and not midnight;
    d1 = 480; d2 = 1305;
    a1 = 616; a2 = 1438;
}
else if(t <= 583) 
{
     temp1 = 583 - t;
     temp2 = t - 480;
     d1 = 583; d2 = 480;
     a1 = 712; a2 = 616;
}
else if(t <= 679)
{
     temp1 = 679 - t;
     temp2 = t - 582;
     d1 = 679; d2 = 582;
     a1 = 811; a2 = 712;
}
else if(t <= 767)
{
     temp1 = 767 - t;
     temp2 = t - 679;
     d1 = 767; d2 = 679;
     a1 = 900; a2 = 811;
}
else if(t <= 840)
{
     temp1 = 840 - t;
     temp2 = t - 767;
     d1 = 840; d2 = 767;
     a1 = 968; a2 = 900;
}
else if(t <= 945)
{
     temp1 = 945 - t;
     temp2 = t - 840;
     d1 = 945; d2 = 840;
     a1 = 1075; a2 = 968;
} 
else if(t <= 1140)
{
     temp1 = 1140 - t;
     temp2 = t - 945;
     d1 = 1140; d2 = 945;
     a1 = 1280; a2 = 1075;
}
else if(t <= 1305 || t >= 1305)
{
     temp1 = 1305 - t;
     temp2 = t - 1140;
     d1 = 1305; d2 = 1140;
     a1 = 1438; a2 = 1280;
}

// COMPUTING CLOSEST DEPARTURE TIME.
if(temp1 < temp2)
{
     h = d1/60;
     m = d1%60;
}
else
{
    h = d2/60;
    m = d2%60;
}

//PRINTING CLOSEST DEPARTURE TIME.

if(h < 12)
     printf("%.2d:%.2d a.m.",h,m);
else
{
    if(h == 12)
         printf("%.2d:%.2d p.m.",h,m);
    else         
        printf("%.2d:%.2d p.m.",h - 12,m);
}

//COMPUTING CORRESPONDING ARRIVAL TIME.
printf(", arriving at ");
if(temp1 < temp2)
{
     h = a1/60;
     m = a1%60;
}
else
{
    h = a2/60;
    m = a2%60;
}

//PRINTING CORRESPONDING ARRIVAL TIME.
 if(h < 12)
     printf("%.2d:%.2d a.m.",h,m);
else
{
    if(h == 12)
         printf("%.2d:%.2d p.m.",h,m);
    else         
        printf("%.2d:%.2d p.m.",h - 12,m);
}                         
getch();

}

0 голосов
/ 27 февраля 2015

Мой подход:

#include <stdio.h>

int main(void)
{
    int hours, minutes, time;

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

    time = hours * 60 + minutes;

    if(time < /*hour in minutes*/8*60+/*minutes*/0+((/*minutes to the next hour*/60-0+/*more hours in minutes?*/0+/*extra minutes*/43)/*dividing by 2 gives the half of time*/2.0)){
        printf("Closest departure time is 8:00 a.m, arriving at 10:16 a.m.\n");
    }
    else if(time < 9*60+43+((60-43+60+19)/2.0)){
        printf("Closest departure time is 9:43 a.m, arriving at 11:52 a.m.\n");
    }
    else if(time < 11*60+19+((60-19+0+47)/2.0)){
        printf("Closest departure time is 11:19 a.m, arriving at 1:31 p.m.\n");
    }
    else if(time < 12*60+47+((60-47+60+0)/2.0)){
        printf("Closest departure time is 12:47 p.m, arriving at 3:00 p.m.\n");
    }
    else if(time < 14*60+0+((60-0+0+45)/2.0)){
        printf("Closest departure time is 2:00 p.m, arriving at 4:08 p.m.\n");
    }
    else if(time < 15*60+45+((60-45+60*3+0)/2.0)){
        printf("Closest departure time is 3:45 p.m, arriving at 5:55 p.m.\n");
    }
    else if(time < 19*60+45+((60-0+60+45)/2.0)){
        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");
    }

  return 0;
}
0 голосов
/ 07 июня 2013

@ aussie_aj;1.Время 1:00 утра в вашей программе ню получит время вылета 8:00 вместо 9:45 вечера !!2.Введите 12:10 в свою программу и посмотрите ВОЛШЕБСТВО !!:)

#include <stdio.h>

int main()
{
int h,m,t,temp1,temp2,
    a1,a2,d1,d2;      //a1,a1 & d1,d2 are ariival & dep. time res.

//Departure times
// dt1 = 480, dt2 = 583, dt3 = 679, dt = 767, 
// dt5 = 840, dt6 = 945, dt = 1140, dt = 1305;

//Arrival times    
// at1 = 616, at2 = 712, at3 = 811, at4 = 900, 
// at5 = 968, at6 = 1075, at7 = 1280, at8 = 1438;

printf("Enter a 24-hour time(hh:mm): ");
scanf("%d:%d",&h,&m);

t = h*60 + m;

printf("Closest departure time is ");

//CONDITIONS FOR CLOSEST DEPARTURE TIME.
if(t <= 480)
{
    temp1 = 480 - t;
    temp2 = t - 0;
    d1 = 480; d2 = 1305;
    a1 = 616; a2 = 1438;
}
else if(t >=480 && t <= 583) 
{
     temp1 = 583 - t;
     temp2 = t - 480;
     d1 = 583; d2 = 480;
     a1 = 712; a2 = 616;
}
else if(t <= 679)
{
     temp1 = 679 - t;
     temp2 = t - 582;
     d1 = 679; d2 = 582;
     a1 = 811; a2 = 712;
}
else if(t <= 767)
{
     temp1 = 767 - t;
     temp2 = t - 679;
     d1 = 767; d2 = 679;
     a1 = 900; a2 = 811;
}
else if(t <= 840)
{
     temp1 = 840 - t;
     temp2 = t - 767;
     d1 = 840; d2 = 767;
     a1 = 968; a2 = 900;
}
else if(t <= 945)
{
     temp1 = 945 - t;
     temp2 = t - 840;
     d1 = 945; d2 = 840;
     a1 = 1075; a2 = 968;
} 
else if(t <= 1140)
{
     temp1 = 1140 - t;
     temp2 = t - 945;
     d1 = 1140; d2 = 945;
     a1 = 1280; a2 = 1075;
}
else if(t <= 1305 || t >= 1305)
{
     temp1 = 1305 - t;
     temp2 = t - 1140;
     d1 = 1305; d2 = 1140;
     a1 = 1438; a2 = 1280;
}

// COMPUTING CLOSEST DEPARTURE TIME.
if(temp1 < temp2)
{
     h = d1/60;
     m = d1%60;
}
else
{
    h = d2/60;
    m = d2%60;
}

//PRINTING CLOSEST DEPARTURE TIME.

if(h < 12)
     printf("%.2d:%.2d a.m.",h,m);
else
{
    if(h == 12)
         printf("%.2d:%.2d p.m.",h,m);
    else         
        printf("%.2d:%.2d p.m.",h - 12,m);
}

//COMPUTING CORRESPONDING ARRIVAL TIME.
printf(", arriving at ");
if(temp1 < temp2)
{
     h = a1/60;
     m = a1%60;
}
else
{
    h = a2/60;
    m = a2%60;
}

//PRINTING CORRESPONDING ARRIVAL TIME.
 if(h < 12)
     printf("%.2d:%.2d a.m.",h,m);
else
{
    if(h == 12)
         printf("%.2d:%.2d p.m.",h,m);
    else         
        printf("%.2d:%.2d p.m.",h - 12,m);
}                         
getch();

}

0 голосов
/ 05 декабря 2012

1. напишите программу, которая запрашивает у пользователя 12-часовое время, отображает время в 24-часовой форме.

Введите 12-часовое время: 21:11

Эквивалент 24 часа: 21:11

0 голосов
/ 02 апреля 2011

Я думаю, что вам нужно выражение цикла для сортировки и вычисления ближайшего момента времени. И вы можете упаковать выражение вашего условия в функцию. Как это:

char* getTimeSuffix(int time) {
    char* ret = "pm"
    if ((time/60 == 0) || (time/60 < 12))
        return "am";
    return ret;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...