Стоимость парковки упражнения из книги Дейтел с


Я учусь код с Дейтел х С: как программировать книга, 6-е издание. Упражнения вот 5.9 (плата за парковку):

Гараж взимает минимальную плату за 2.00$, чтобы припарковаться на срок до трех часов, а дополнительные $0.50 в час за каждый час или его часть в течение трех часов. Максимальная плата за любой 24-часовой период $10.00. Предположим, что нет парковок более чем на 24 часа. Написать программу, которая будет вычислять и печатать плату за парковку каждый из трех клиентов, которые паркуют свои машины в этом гараже вчера. Вы должны войти в час на стоянке для каждого клиента. Ваша программа должна вывести результаты в табличной чистюля формат, и должна вычислить и напечатать сумму вчерашнего квитанции. Программа должна использовать calculateCharges функции определить стоимость для каждого клиента.

Мое решение ниже. Эти упражнения не имеют никаких ответов, поэтому я не знаю, как я могу улучшить этот код, где я хочу знать, если это возможно, чтобы обойтись без переменных "один", "два" и "три", а также автоматизировать процесс печати (после цикла for, В основном) внутри цикла.

#include <stdio.h>

float calculateCharges( float hours );

float charge;

int main()
{
    int customer;
    float one;
    float two;
    float three = 0;
    float hours;

    for( customer = 1; customer <= 3; customer++ ) {
        printf( "Enter customer #%d parking hours: ", customer );
        scanf( "%f", &hours );

        if( customer == 1 )
            one = hours;
        else if( customer == 2 )
            two = hours;
        else
            three = hours;
    }
    printf( "%s%10s%12s", "Car", "Hours", "Cost" );
    printf( "\n%d%12.1f%12.1f", 1, one, calculateCharges( one ) );
    printf( "\n%d%12.1f%12.1f", 2, two, calculateCharges( two ) );
    printf( "\n%d%12.1f%12.1f", 3, three, calculateCharges( three ) );
    printf( "\n%s%8.1f%12.1f", "TOTAL", one + two + three, calculateCharges( one ) + calculateCharges( two ) + calculateCharges( three ) );
}

float calculateCharges( float hours )
{
    int h = hours;
    charge = 2.0;

    if( hours > 0 ) {
        if( hours <= 3 )
            return charge;

        else if( hours <= 24 ) {
            while( h > 3 ) {
                charge += .5;
                h--;
                if( charge >= 10 )
                    charge = 10;
            }
            return charge;
        }
    }
    else
        printf( "\nThe amount of time entered is not supported." );
}


Комментарии
1 ответ

Я вижу ряд вещей, которые могут помочь вам улучшить ваш код.

Устранить глобальные переменные там, где это целесообразно

Этот код объявляет и использует глобальную переменную charge. Глобальные переменные запутывания фактических зависимостей в коде и сделать техническое обслуживание и понимание кода, которые гораздо труднее. Это также делает код более сложным для повторного использования. По всем этим причинам, как правило, гораздо предпочтительнее, чтобы исключить глобальные переменные, либо делая их локальные и/или передавая их в и из функции. Таким образом, связь является четкой и могут быть легко изменены в случае необходимости. Например, для устранения charge Global, просто сделать его локальным для calculateCharges.

Рассмотреть вопрос об улучшении имена

Я думаю hours не плохое имя переменной, но one является, поскольку hours дает читателю некоторое представление о том, почему переменная существует, но one может быть что угодно.

Проверить возвращаемые значения ошибок

Вызов scanf может потерпеть неудачу. Вы можете проверить возвращаемое значение, чтобы убедиться, что они не или программы может произойти сбой (или хуже), когда дали некорректных входных данных или из-за низких системных ресурсов. Строгая обработка ошибок-это разница между в основном работают против безглючная программа. Вы должны стремиться к последнему.

Понимаю переменных, проходя

Когда вы пишите это:

float calculateCharges( float hours )

Это означает, что функция принимает float имени hours в качестве аргумента. Потому что он не говорит float &hours, который будет принимать ссылку на переменной (указатель, по сути), она передается по значению. Это означает, что это действительно не нужно создавать локальную копию имени h; просто использовать hours напрямую.

Разложить программу на более мелкие части

Сейчас большая часть кода в main это не обязательно неправильно, но это означает, что это не только трудно использовать, но и трудно устранить. Лучше разделить код на мелкие кусочки. Так оно проще для понимания и легче исправить или улучшить. Например, один может иметь функцию для ввода и один для вывода печати в дополнение к уже имеющейся функции, которая преобразует часа за дополнительную плату.

Убедитесь, что все пути возвращают значение

В calculateCharges процедура возвращает сумму, если прошло несколько часов больше, чем ноль, но что если нет? Сейчас код не возвращает значение, которое является проблемой. А не печатать сообщение, лучше бы вернуть какой-то специальный маркер значение, например -1, что вызывающий код может проверить, а потом уже она сама выберет соответствующее действие.

Использовать массив

Вместо того, чтобы назвать вещи one, two, threeсоздайте массив: float hours[3]; и цикл через это.

4
ответ дан 29 марта 2018 в 10:03 Источник Поделиться