C: invalid operands to binary expressions (не пойму, как делить, если нельзя делить указатель)
Не могу понять, как мне совершить деление. Выдает invalid operands to binary expressions. Проблема в строке 25, tax = tax_percent / 100 * bill_amount (и похоже, такая же ошибка тогда вылезет в tip = tip_percent / 100 * tax_bill). Порывшись в интернете, поняла только, что причина в том, что tax _percent это указатель. При попытке поставить (float)tax_percent выдает ошибку pointer cannot be cast to type float. Подскажите, пожалуйста, как мне тогда разделить?
// Data types, operations, type casting, return value
#include <cs50.h>
#include <stdio.h>
float half(float bill, float tax, int tip);
int main(void)
{
float bill_amount = get_float("Bill before tax and tip: ");
float tax_percent = get_float("Sale Tax Percent: ");
int tip_percent = get_int("Tip percent: ");
printf("You will owe $%.2f each!\n", half(bill_amount, tax_percent, tip_percent));
}
// TODO: Complete the function
float half(float bill, float tax, int tip)
{
float tax_percent();
float bill_amount();
float tip_percent();
//Convert tax percent into float. Bill times tax.
tax = tax_percent / 100 * bill_amount;
//Add tax to the bill
float tax_bill = tax + bill_amount;
//Convert tip percent into float. Bill times tip.
tip = tip_percent / 100 * tax_bill;
//Add tip to the bill and the tax
bill = tax_bill + tip;
//Divide it in two
return bill / 2;
}'''
Ответы (2 шт):
Просто уберите скобочки в объявлениях переменных:
float tax_percent;
float bill_amount;
float tip_percent;
Со скобочками они выглядят как функции, а не переменные, поэтому и возникает ошибка.
Правда, остаётся ещё вопрос с инициализацией этих переменных (им не присвоено никакое значение), но это уже к вам вопрос.
Ну вы же запросили уже эти значения в функции main(). И передали их в функцию half(). Вам не нужно заново определять эти переменные.
Просто внутри функции значения этих переменных присвоены переменным, которые вы указали в сигнатуре (описании) функции.
float half(float bill, float tax, int tip);
// вызов
printf("You will owe $%.2f each!\n", half(bill_amount, tax_percent, tip_percent));
Т.е. значение bill_amount присвоено переменной bill, tax_percent - tax, tip_percent - tip.
После этого есть 3 варианта работы:
1 - самый простой, перепишите сигнатуру функции, чтобы переменные назывались также, как в main()
// сигнатура функции с другими именами параметров
float half(float bill_amount, float tax_percent, int tip_percent)
{
// float tax_percent(); // удалить
// float bill_amount(); // удалить
// float tip_percent(); // удалить
//Convert tax percent into float. Bill times tax.
tax_percent = tax_percent / 100 * bill_amount;
....
2 - переписать весь код внутри half() с использованием новых переменных
float half(float bill, float tax, int tip)
{
//Convert tax percent into float. Bill times tax.
// вместо
// tax = tax_percent / 100 * bill_amount;
// переписываете все операции с новыми именами из параметров функции
float tip_percent = tip; // нужно для использования типа float вместо int
tax = tax / 100.0 * bill;
bill += tax; //Add tax to the bill
tip_percent = tip_percent / 100.0 * tax; //Convert tip percent into float. Bill times tip.
bill += tip_percent; //Add tip to the bill and the tax
return bill / 2; //Divide it in two
}
3 - костыль, вместо него лучше использовать 1 вариант. Потому что так получается дублирование значений в 2 переменных и можете сами запутаться, когда какое использовать.
float half(float bill, float tax, int tip)
{
float tax_percent = tax;
float bill_amount = bill;
float tip_percent = tip;
//Convert tax percent into float. Bill times tax.
tax_percent = tax_percent / 100 * bill_amount;
....
UPD Собственно всё работает и без изменения объявления функции и без введения кучи дополнительных переменных.
float half(float bill, float tax, int tip)
{
float tip_percent = tip; // нужно для использования типа float вместо int
tax = bill * tax / 100.0;
bill = bill + tax;
tip_percent = bill * tip_percent / 100.0;
bill += tip_percent;
return bill / 2.0;
}
И в принципе можно ещё укоротить
float half(float bill, float tax, int tip)
{
float tip_percent = tip; // нужно для использования типа float вместо int
bill += bill * tax / 100.0;
bill += bill * tip_percent / 100.0;
return bill / 2.0;
}
И поскольку переменной tip больше не присваиваются значения, то можно прямо её использовать в расчетах - она автоматически приведется к типу float(т.к. при умножении float на int результат операции будет иметь тип float)
float half(float bill, float tax, int tip)
{
bill += bill * tax / 100.0;
bill += bill * tip / 100.0;
return bill / 2.0;
}