Рефакторинг функций / с использованием return. C

#c

#c

Вопрос:

У меня возникли проблемы с рефакторингом этого кода в функции. Что именно я должен ввести для возврата, чтобы завершить эти последние две функции. Они включают циклы с общим и промежуточным итогом с несколькими вычислениями на основе введенного символа. Я понимаю первые два, просто верните объявленную переменную.

 #include <iostream>
#include <iomanip>

using namespace std; // forgive me for being lazy!

double getPrice();
int getNumber();
double saleTotal(double getPrice, int getNumber);
void retail(double getPrice, int getNumber, double saleTotal);

const double TAX_RATE = .05;

int main()
{
   double myPrice = getPrice();

   int myNumber = getNumber();

   double getTotal = saleTotal(myPrice, myNumber);

   retail;

    return 0;
}

double getPrice()
{
    double price;
    cout << "Enter price $";
    cin >> price;
    return price;
}

int getNumber()
{
   int number;
   cout << "Enter number purchased: ";
   cin >> number;
   return number;
}

double saleTotal(double getPrice, int getNumber)
{
    char saleType;
    double total;
    double subTotal;

    cout << "Type W if this is wholesale purchase. n"
        << "Type R if this is retail purchase. n"
        << "then press return... n";
    cin.ignore();
    cin.get(saleType);

    if ((saleType == 'W') || (saleType == 'w'))
    {
        total = getPrice * getNumber;
        return total;
    }
    else if ((saleType == 'R') || (saleType == 'r'))
    {
        subTotal = getPrice * getNumber;
        total = subTotal   subTotal * TAX_RATE;
        return total;
    }
    else
    {
        cout << "Error in the input...";
    }
}

void retail(double getPrice, int getNumber, double saleTotal)
{
    char saleType;

    cout << setprecision(2) << fixed << showpoint << getNumber << " items at $" << getPrice << endl;
    cout << "Total bill $" << saleTotal;
    if ((saleType == 'R') || (saleType == 'r'))
    {
        cout << " includes sales tax.n";
    }
    return;
}
  

Комментарии:

1. Все переменные неинициализированы в total . Их чтение вызывает неопределенное поведение. Я не могу найти вложенные циклы

2. Я бы предложил создать subTotal total функции и, которые принимают цену, количество приобретенных товаров и тип продажи в качестве аргументов, а затем возвращают промежуточный итог и итог соответственно, а затем вызывают их со значениями, которые вы получаете после получения пользовательского ввода. В настоящее subTotal время на самом деле не знает, какое значение использовать myPrice , потому что оно было установлено и возвращено getPrice() функцией и никогда не передавалось subTotal . (На самом деле, subTotal возможно saleType , параметр вообще не нужен, поскольку это имеет значение только для общего …)

3. Итак, теперь retail зависит от number , price , total , и saleType , которые должны быть аргументами функции. (Строго говоря, он может вычислять total из трех других.) Ваша реализация saleTotal также нуждается в очистке. У вас есть переменные, которые вы передаете в качестве аргументов функции, но тогда у вас также есть куча локальных переменных, которые ничего не делают и вызывают UB, когда они считываются без инициализации.

4. Я снова обновил код непосредственно перед тем, как увидел ваш комментарий. Кажется, я уже сделал так, как вы предложили, однако теперь я не получаю ничего общего или чего-либо от последней функции. Вероятно, потому, что я полагаю, что это пустота, однако я не знаю, что я должен возвращать с помощью четвертой функции. Профессор предложил аннулировать, если нечего возвращать.

5. Это: retail; НЕ вызов функции! Вам нужны круглые скобки и параметры…

Ответ №1:

Как следует из названия методов, вам нужно:

 double subTotal()
{
  ...
  return mySubTotal;
}
  

и:

 double total()
{
  ...
  return total;
}
  

Однако в total() методе saleType переменная используется неинициализированной, как прокомментировал @ThomasSablik, что означает, что ваш код вызывает здесь неопределенное поведение (UB):

 if ((saleType == 'R') || (saleType == 'r'))
  

поскольку вы проверяете неинициализированную переменную в условиях этого оператора if .

subTotal() также вызывает UB по той же причине. Инициализируйте переменную.

Ответ №2:

О ваших функциях subTotal(); и total переменных не знаю myPrice myNumber main() .

Вы объявляете новые переменные с теми же именами, но они НЕ связаны с исходными.

Вам нужно передать эти переменные из main() в другие функции.

Комментарии:

1. Если я помню, это достигается путем добавления переменной, которую мне нужно передать в прототип? Например, double wholesaleTotal (double myPrice); ?

2. @unit5016 Правильно, хотя в этом случае это, вероятно double wholesaleTotal(double myPrice, int myQuantity); , потому, что это зависит от обоих значений.

3. Ах! Спасибо, мой мозг просто застрял на каком-то ментальном блоке, не в состоянии его увидеть.

4. После некоторой возни я теперь получаю «слишком мало аргументов для функции wholesaletotal» в моем блоке main (). Я изменил свой прототип на double wholesaleTotal(double getPrice, int getNumber); и, конечно, изменил заголовок тела моей функции ниже.

5. Теперь вам нужно вызвать его: wholesaleTotal(myPrice, myNumber);