C: invalid operands to binary expressions (не пойму, как делить, если нельзя делить указатель)

Рейтинг: 0Ответов: 2Опубликовано: 21.02.2023

Не могу понять, как мне совершить деление. Выдает 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;
}'''

Ответы

▲ 0

Просто уберите скобочки в объявлениях переменных:

float tax_percent;
float bill_amount;
float tip_percent;

Со скобочками они выглядят как функции, а не переменные, поэтому и возникает ошибка.

Правда, остаётся ещё вопрос с инициализацией этих переменных (им не присвоено никакое значение), но это уже к вам вопрос.

▲ 0

Ну вы же запросили уже эти значения в функции 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;
}