C ++: логика на основе замкнутого цикла - PullRequest
0 голосов
/ 10 октября 2019

Мне было поручено создать Программу со следующими условиями:

Написать программу на C ++, которая принимает сумму в рупиях в качестве входных данных (целых) в диапазоне от Rs. От 100 до рупий100000, а затем спрашивает пользователя о предпочтении конкретной денежной банкноты и отображает общее количество валютных банкнот в рупиях. 500, 100, 50, 20, 10, 5 и 1. Пользователю может быть предоставлено максимум 200 нот по его выбору.

Например: когда пользователь вводит число, Rs. 57477 и вводит 50 нот в качестве своего предпочтительного выбора, результаты будут такими:

Валюта Примечание: Число

500: 74

100: 4

50: 200

20: 3

10: 1

5: 1

1: 2

Я создал вышепрограмма с использованием оператора по модулю и цикла Loop.

Часть моего кода выглядит следующим образом:

if (preference == 500)
{
    notes500 = rupees/500; //This get all the 500 notes
    rupees %= 500; //this will find the remaining rupees after deducting all the 500 notes
    while(notes500 > 200) //this loop will make sure the obtained 500 notes are not greater that 200
    {
        notes500 -=1;
        rupees +=500; //this re add all the 500 notes that are not needed back to main amount
    }
    notes100 = rupees/100; //from here we will get all the 100 notes
    rupees %= 100; //from here we will substract the amount of Rs 100 notes obtained
    //this process will continue to till it reaches 1 rupee notes
    notes50 = rupees/50; 
    rupees %= 50;
    notes20 = rupees/20;
    rupees %= 20;
    notes10 = rupees/10;
    rupees %= 10;
    notes5 = rupees/5;
    rupees %= 5;
    notes1 = rupees;
}

Эта же логика будет продолжена для других предпочтений.

Теперь следующие ограничениябыли применены к программе:

  1. Использование циклов или рекурсий не допускается.
  2. Массивы также не допускаются.
  3. Программу следует составлять с использованием базовых знанийC ++ (например, с помощью структур управления принятием решений, операторов C ++ и т. д.)

Теперь, как мне создать вышеуказанную программу без циклов?

Помощь будет высоко оценена!

Спасибо,

1 Ответ

1 голос
/ 11 октября 2019

Этот код отвечает на вопрос "как мне создать вышеуказанную программу без циклов?"Это достигается мета-программированием с помощью шаблонов. Ограничение рекурсии также решено, потому что компилятор создает итеративный код. Тем не менее, я не мог решить предпочтительное ограничение примечания. Сначала я обрабатываю предпочтительное наименование, но есть много случаев, таких как предпочтительное примечание 1 и общая сумма в 201 рупий. Ждем окончательного решения.

#include <iostream>

template <int denom, typename T>
class VegasCashier {
public:
static T result(T a, T b) {

    int leftOver = b;
    int dcount = 0;

    if (denom == 0) // First time in process the favorite
    {
        leftOver = b;
        dcount = b / a;
        leftOver %= a;
        // From Pete's Comment
        if (dcount > 200) { leftOver += a * (dcount - 200); dcount = 200; }

        if (dcount > 0)
            std::cout << "\tGive " << dcount << " of Denomination "
                << a << " (Favorite) " << std::endl;
    }
    else if (b != 0 && a !=  denom) // c is the favorite
    {
        leftOver = b;
        dcount = b / denom;
        leftOver %= denom;
        // From Pete's Comment
        if (dcount > 200) { leftOver += denom * (dcount - 200); dcount = 200; } 

        if (dcount > 0)
            std::cout << "\tGive " << dcount << " of Denomination "
                << denom << std::endl;
    }

    if (denom == 0) // Special case for desired denomination
        return VegasCashier <500, T>::result(a, leftOver); // Start cashout at highest denom
    else if (denom == 500)
        return VegasCashier<100, T>::result(a, leftOver);
    else if (denom == 100)
        return VegasCashier<50, T>::result(a, leftOver);
    else if (denom == 50)
        return VegasCashier<20, T>::result(a, leftOver);
    else if (denom == 20)
        return VegasCashier<10, T>::result(a, leftOver);
    else if (denom == 10)
        return VegasCashier<5, T>::result(a, leftOver);
    else if (denom == 5)
        return VegasCashier<1, T>::result(a, leftOver);

    return dcount;
  }
};


// This template stops the implementation
template < typename T>
class VegasCashier<1, T> {
 public:
  static T result(T a, T b) {
    if ( b > 0 )
        std::cout << "\tGive " << b << " of Denomination " << 1 << std::endl;
  return 0;
  }
};

// Starting function
template <int denom, typename T>
inline T CasinoResults(T a, T b)
{
  std::cout << "\nCashing out " << b << "..." << std::endl;
  return VegasCashier<0, T>::result(a, b);
}

int main()
{
  CasinoResults<0>(5, 5006);
  CasinoResults<0>(500, 99502);
  CasinoResults<0>(500, 7519);
  CasinoResults<0>(1, 7509); // Fails the Preferred note constraint
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...