Ако изявление и изрази въпроси съвет

Току-що зададох този въпрос от C програмирането на KN King: Модерен подход. Не е домашно, просто се уча от книгата...

Следната таблица показва ежедневните полети от един град до друг:
Час на заминаване - Час на пристигане
8:00 - 10:16 сутринта
9: 43 ч. - 11:52 ч.
11:19 ч. - 13:31 ч.
12:47 ч. - 15:00 ч.
14:00 ч. - 16:08 ч.
15:45 ч. - 17:55 ч.
7: 00:00 - 21:20
21:45 - 23: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);

person aussie_aj    schedule 02.04.2011    source източник


Отговори (8)


Е, да, вие сте на прав път, но също така можете значително да намалите размера на кода. Вижте, една и съща част от кода, мисля, се повтаря много често във вашата програма:

                    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 и т.н.

И обикновено се прави в края на екзекуцията.

Така че, ако разделите алгоритъма си на две части: първата - намиране на правилния времеви диапазон и втората - отпечатването му, тогава ще се отървете от това копиране/поставяне.

person xappymah    schedule 02.04.2011
comment
Добре, направих някои промени, мисля, че по твоя ред до края на моя въпрос. Изглежда ми много по-добре благодаря! - person aussie_aj; 02.04.2011

Погледнете внимателно този код:

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

Виждате ли защо е излишно?

Тъй като 0 < 12, всеки път, когато b / 60 == 0 е вярно, b / 60 < 12 също ще бъде вярно. Можете да намалите кода си до if (b / 60 < 12) printf("am"); else printf("pm");

person Gabe    schedule 02.04.2011
comment
Страхотно благодаря. Гледах това, мислейки си, че се справям двойно, не знам защо не го промених. Това е страхотно как скрихте отговора! - person aussie_aj; 02.04.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
person Jonathan Leffler    schedule 02.04.2011
comment
Благодаря Джонатан. Както споменах, все още не съм стигнал до главите за функциите и масивите. Запазих публикацията ви, за да се върна към нея, когато отида там. Благодаря! - person aussie_aj; 02.04.2011
comment
@aussie_aj: да; Мислех, че ще се използват техники, които все още не са разгледани, но всяка алтернатива е безсмислено повтаряща се. Всяка алтернатива, базирана на променливи a, b, c, ..., a1, b1, c1, ... ще бъде ужасяващо многословна. Можете да вземете adep[i], bdep[i+1], a1arr[i] и b1arr[i+1] и да видите логиката, която наложих. И книгата не трябва да поставя задачи, които са толкова силно повтарящи се, докато не разполагате с инструментите, за да избегнете повторението. Има училище по програмиране, наречено Agile Programming, и една от максимите на училището е DRY - Не се повтаряй. Отговорът ми се подчинява на СУХО! - person Jonathan Leffler; 02.04.2011
comment
Благодаря Джонатан, научавам толкова много всеки път, когато публикувам нещо тук! Изминал съм само две глави от функциите и масивите, така че сега надниквам напред и се позовавам на вашия код! - person aussie_aj; 02.04.2011

Мисля, че имате нужда от цикличен израз, за ​​да сортирате и изчислите най-близката времева точка. И можете да опаковате вашия израз на условие във функция. Като този:

char* getTimeSuffix(int time) {
    char* ret = "pm"
    if ((time/60 == 0) || (time/60 < 12))
        return "am";
    return ret;
}
person Andrew Li    schedule 02.04.2011
comment
Или дори: if (condition) { return "am"; } else { return "pm"; } без нужда от променлива. - person xappymah; 02.04.2011

Моят подход:

#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;
}
person user3646717    schedule 27.02.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();

}

person Jaseem Unplugged    schedule 09.10.2015

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

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

Еквивалентно 24-часово време: 21:11

person Adriano Pamain    schedule 05.12.2012

@aussie_aj; 1. Въведете час 1:00 сутринта в програмата си и ще получите час на заминаване 8:00 сутринта вместо 21: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();

}

person haccks    schedule 06.06.2013