Информация о приближении расчета тарифа - PullRequest
0 голосов
/ 10 июня 2018

В основном я пытаюсь задать вопрос о том, как рассчитать плату.Тем не менее, мой код очень длинный.Я использовал чертовски «если» и «еще» для своего кода.Мне было интересно, есть ли лучший способ подойти к этому вопросу.

Сначала я попытался использовать циклы, чтобы продолжать составлять плату, но я сталкиваюсь с проблемой, когда мое время пересекает критический момент.Я добавил время к TimeIn вместе со своими платежами, но, поскольку оно пересекает отметку 7 утра, мне нужно сбросить его обратно на 7 утра, чтобы мои сборы были начислены правильно.И тогда я сдался, когда мой код тоже стал очень длинным.

Например.Цикл добавляет с 0630 до 0730, сборы должным образом увеличены, первые 30 минут 0700 будут пропущены, а сборы ошибочно начислены.

Вопрос, который я попытался:

Г-н.В течение многих лет Ву каждый день ездил на работу на такси.Тем не менее, в последние годы стоимость такси растет довольно быстро.Поэтому он рассматривает возможность поехать на работу вместо этого.Одна из затрат на вождение - плата за парковку.Тарифы на парковку на рабочем месте г-на Ву приведены в таблице ниже.

                 Weekday              Saturday                      Sunday 
4am ~ 7am        $2.00 per hour       $2.50 per hour                 $5
7am ~ 6pm        $1.20 per 30 minute  $1.50 per 30 minutes           per
6pm ~ midnight   $5.00 per entry      $7.00 per entry                entry

Special note:
1. The car park opens at 4am and closes at midnight. All vehicles must leave 
by midnight.
2. There is a grace period of 10 minutes on any day (i.e., it is completely 
free to park for 10 minutes or less regardless of day and time.)
3. There is a 10% surcharge for parking more than 10 hours on a weekday and 
20% for Saturday. There is no surcharge for Sunday.
4. There is an additional $3.00 fee for exiting after 10pm on any day. 
(Surcharge is not applicable on this fee.)

Ваша программа должна читать одно целое число, которое представляет собой целое число от 1 до 7, обозначающее деньнеделю (1 - понедельник, 7 - воскресенье).Он также должен читаться в двух числах, представляющих время и время ожидания в 24-часовом формате.Затем следует рассчитать и отобразить плату за парковку (с двумя десятичными знаками).Вы можете предположить, что входные данные действительны (т. Е. День находится в пределах указанного диапазона, время ожидания и время ожидания между 4:00 и полночью в 24-часовом формате, а время ожидания не раньше, чем время ввода).

Мой чрезвычайно длинный код:

#include <stdio.h>
#include <math.h>

double computeFee(int, int, int);

int main(void){
int day, timeIn, timeOut;
scanf("%d %d %d", &day, &timeIn, &timeOut);
printf("Enter day: %d\n", day);
printf("Enter time-in: %d\n", timeIn);
printf("Enter time-out: %d\n", timeOut);
printf("Parking fee is $%.2lf\n", computeFee(day, timeIn, timeOut));
return 0;
}

double computeFee(int day, int timeIn, int timeOut){
double fee = 0;
double TimeIn, TimeOut;

TimeIn = 60*(floor(timeIn/100)) + (timeIn%100);
TimeOut = (60*(floor(timeOut/100)) + (timeOut%100));
if((day>=1)&&(day<=5)){
    if(TimeIn<420){
        if(TimeOut<420){
            fee += 2*ceil((TimeOut - TimeIn)/60);
        }
        else{
            fee += 6;
            if(TimeOut>=1080){
                fee += 31.4;
            }
            else{
                fee += 1.2*ceil((TimeOut - 420)/30);
            }
        }
    }
    if(TimeIn>=420){
        if(TimeIn>=1080){
            fee = 5;
        }
        else{
            if(TimeOut>=1080){
                fee += (1.2*ceil((1080 - TimeIn)/30) + 5);
            }
            else{
                fee += (1.2*ceil((TimeOut - TimeIn)/30));
            }
        }
    }
    if((TimeOut-TimeIn)>=600){
        fee *= 1.1;
    }

}
if(day == 6){
    if(TimeIn<420){
        if(TimeOut<420){
            fee += (2.5*ceil((TimeOut - TimeIn)/60));
        }
        else{
            fee += 7.5;
            if(TimeOut>=1080){
                fee += 40;
            }
            else{
                fee += (1.5*ceil((TimeOut - 420)/30));
            }
        }
    }
    if(TimeIn>=420){
        if(TimeIn>=1080){
            fee = 7;
        }
        else{
            if(TimeOut>=1080){
                fee += (1.5*ceil((1080 - TimeIn)/30) + 7);
            }
            else{
                fee += (1.5*ceil((TimeOut - TimeIn)/30));
            }
        }
    }
    if((TimeOut-TimeIn)>=600){
        fee *= 1.2;
    }

}
if(day == 7){
    fee = 5;
}
if((timeOut/100)>=22){
    fee += 3;
}
if((timeOut - timeIn)<=10){
    fee = 0;
}
return fee;
}

Примеры расчета сборов:

Example 1: Tuesday, 4:29am to 7:50am.
• 4:29am to 7am is charged as 3 1-hour slots: $2.00 * 3 = $6.00
• 7am to 7:50am is charged as 2 30-minute slots: $1.20 * 2 = $2.40
• Total fee = $6.00 + $2.40 = $8.40

Example 2: Saturday, 7:01am to 7:49pm.
• 7:01am to 6pm is charged as 22 30-minute slots: $1.50 * 22 = $33.00
• 6pm to 7:49pm is charged as one entry: $7.00
• 20% Surcharge for parking more than 10 hours: ($33.00 + $7.00) * 20% = 
 $8.00
• Total fee = $33.00 + $7.00 + $8.00 = $48.00

Example 3: Sunday, 3pm to 10:01pm.
• 3pm to 10:01pm is charged as one entry: $5.00
• Additional fee for exiting after 10pm: $3.00
• Total fee = $5.00 + $3.00 = $8.00

Example 4: Thursday, 11:49pm to 11:59pm.
• Grace period
• Total fee = $0.00

Example 5: Monday, 12pm to 10:01pm.
• 12pm to 6pm is charged as 12 30-minute slots: $1.20 * 12 = $14.40
• 6pm to 10:01pm is charged as one entry: $5.00
• 10% Surcharge for parking more than 10 hours: ($14.40 + $5.00) * 10% = 
$1.94
• Additional fee for exiting after 10pm: $3.00
• Total fee = $14.40 + $5.00 + $1.94 + $3.00 = $24.34

Спасибо, что прочитали мой длинный вопрос.И заранее спасибо за помощь.

примечание: я не изучаю массивы и все, что за этим стоит.Пока изучайте только циклы и операторы выбора (читая учебное пособие по программированию на K & R до главы 17, используя Online GeekforGeek в качестве компилятора).Тем не менее, я все равно буду очень признателен за решения, использующие другие методы.

...