C# расчет аренды комнаты по списку скидок - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь рассчитать стоимость аренды комнаты по дисконтной таблице. Постановка проблемы: Компания предлагает своим сотрудникам субсидированное пребывание в одном из своих гостевых домов. Схема скидок

  • 50% на первые 2 дня пребывания
  • 25% на следующие 2 дня
  • 15% на следующие 2 дня
  • 0% на пребывание более 6 дней

Проблема в том, что мои расчеты всегда неверны. Например, если сотрудник уже прожил в гостевом доме 4 дня и теперь просит еще 3 дня, арендную плату следует рассчитывать на 1 день со скидкой 0%. Аналогичным образом, если сотрудник уже находился там в течение 2 дней и теперь запрашивает еще 5 дней, с него взимается 2 дня со скидкой 25%, 2 дня со скидкой 15% и 1 день со скидкой 0%. Я надеюсь, что это проясняет проблему.

Вот структура программы:

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List<ExemptionDetails> exemptionDetailsList = new List<ExemptionDetails>();

        exemptionDetailsList.Add(new ExemptionDetails{ExemptionTo = 2, ExemptionPercentage = 50});//First 2 Days, 50% off
        exemptionDetailsList.Add(new ExemptionDetails{ExemptionTo = 2, ExemptionPercentage = 25});//Next 2 Days, 25% off
        exemptionDetailsList.Add(new ExemptionDetails{ExemptionTo = 2, ExemptionPercentage = 15});//Next 2 Days, 15% off
        //No reimbursement for more than 6 days

        var perDayRent = 2000.00M;//per day rent of the room
        var daysAvailedInPast = 2;//has already availed 2 days discount
        var daysAppyingNow = 5;//need to calculate the rent of 5 days based on discount scheme
        var calculatedRent = 0.00M
        foreach (var item in exemptionDetailsList)
        {
            //I have tried a lot of options here but all of them failed. Need to calculate the rent for 5 days according to the list above.
        }

        Console.WriteLine(calculatedRent);//should give result: 8400
    }
}

public class ExemptionDetails
{
    public int ExemptionTo
    {
        get;
        set;
    }

    public int ExemptionPercentage
    {
        get;
        set;
    }
}

1 Ответ

0 голосов
/ 03 апреля 2020
 public class Program
{
    public static void Main()
    {
        List<ExemptionDetails> exemptionDetailsList = new List<ExemptionDetails>();

        exemptionDetailsList.Add(new ExemptionDetails { ExemptionTo = 2, ExemptionPercentage = 50 });//First 2 Days, 50% off
        exemptionDetailsList.Add(new ExemptionDetails { ExemptionTo = 2, ExemptionPercentage = 25 });//Next 2 Days, 25% off
        exemptionDetailsList.Add(new ExemptionDetails { ExemptionTo = 2, ExemptionPercentage = 15 });//Next 2 Days, 15% off
                                                                                                     //No reimbursement for more than 6 days

        var perDayRent = 2000.00M;//per day rent of the room
        var daysAvailedInPast = 3;//has already availed 2 days discount
        var daysAppyingNow = 5;//need to calculate the rent of 5 days based on discount scheme
        var calculatedRent = 0.00M;
        var daysRemain =  daysAppyingNow;
        foreach (var item in exemptionDetailsList)
        {  if (daysAvailedInPast - item.ExemptionTo >= 0)
            {
                daysAvailedInPast = daysAvailedInPast - item.ExemptionTo;
                continue;
            }

                if (daysRemain > 0)
            {
                if (item.ExemptionTo <= daysRemain) {
                    calculatedRent += ((perDayRent * (100-item.ExemptionPercentage)) / 100) * (item.ExemptionTo - daysAvailedInPast);
                    daysRemain = daysRemain - (item.ExemptionTo - daysAvailedInPast);
                }
                else {
                    calculatedRent += ((perDayRent * (100-item.ExemptionPercentage)) / 100) * daysRemain;
                    daysRemain = 0;
                }
            }
            else
            {
                break;
            }
            daysAvailedInPast = 0;
        }
        if(daysRemain > 0)
        {
            calculatedRent += perDayRent * daysRemain;
        }

        Console.WriteLine(calculatedRent);//should give result: 8400
    }
}

public class ExemptionDetails
{
    public int ExemptionTo
    {
        get;
        set;
    }

    public int ExemptionPercentage
    {
        get;
        set;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...