#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);