CS50 Практическая задача ПОЛОВИНА -
Предположим, вы обедаете в ресторане с другом и хотите разделить счет поровну. Вы можете предвидеть сумму, которую вы будете должны, до того, как придет счет с добавленным налогом. В этой задаче вы выполните функцию для расчета суммы, которую каждый из вас должен, исходя из суммы счета, налога и чаевых.
Ваша функция должна использовать входные параметры bill
, tax
и tip
для расчета конечной суммы. Однако, поскольку эти значения являются процентными, вам придется проделать некоторую работу, чтобы преобразовать их в более подходящие форматы для использования в ваших расчетах.
Окончательная сумма к оплате должна быть добавлена к налогу до расчета чаевых. Наконец, вы вернете ровно половину полной суммы, включая сумму счета, налог и чаевые.
Ваша программа должна вести себя в соответствии с приведенными ниже примерами.
half/ $ ./half
Bill before tax and tip: 12.50
Sale Tax Percent: 8.875
Tip percent: 20
You will owe $8.17 each!
half/ $ ./half
Bill before tax and tip: 23.50
Sale Tax Percent: 7
Tip percent: 15
You will owe $14.46 each!
half/ $ ./half
Bill before tax and tip: 100
Sale Tax Percent: 6.25
Tip percent: 18
You will owe $62.69 each!
Это код, который я написал -
// Calculate your half of a restaurant bill
// 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 total = (bill + (bill * (tax / 100)) + (bill * (tip * .01))) / 2;
return ((int)(total * 100.0 + 0.5) / 100.0);
}
Все, что нужно сделать в этой задаче, — это выполнить половину функции, остальное уже задано. Я выполнил функцию и не вижу ничего плохого, но она не дает требуемого результата. Каждый требуемый вывод неверен.
Например, приведенные выше три примера, которые приведены в выходных данных задачи:
1-
You will owe $8.05 each!
2-
You will owe $14.34 each!
3-
You will owe $62.13 each!
Вот что потребовалось и что я получил - https://submit.cs50.io/check50/8bbdc3f80441100b5f1a4e842ef6efe1b7f443fd
## cs50/labs/2023/x/half
### :) half.c exists
Бревно
checking that half.c exists...
### :) half.c compiles
Бревно
running clang half.c -o half -std=c11 -ggdb -lm -lcs50...
### :( Bill of $50, with 10% tax and 20% tip, creates output of $33.00
Причина
expected "33.00", not "You will owe $..."
Бревно
running ./half...
sending input 50...
sending input 10...
sending input 20...
checking for output "33.00"...
**Expected Output:**
33\.00**Actual Output:**
You will owe $32.50 each!
### :( Bill of $50, with 12.5% tax and 20% tip, creates output of $33.75
Причина
expected "33.75", not "You will owe $..."
Бревно
running ./half...
sending input 50...
sending input 12.5...
sending input 20...
checking for output "33.75"...
Ожидаемый результат:
33\.75**Actual Output:**
You will owe $33.13 each!
### :( Bill of $100, with 12.5% tax and 15% tip, creates output of $64.69
Причина
expected "64.69", not "You will owe $..."
Бревно
running ./half...
sending input 100...
sending input 12.5...
sending input 15...
checking for output "64.69"...
Ожидаемый результат:
64\.69
Фактический результат:
You will owe $63.75 each!
@AndrewHenle это cs50. Они так глубоко в это не погружаются. Они только начали изучать C
Что касается «работает правильно, но не дает желаемого результата»: это не то, что означает «работать должным образом».
@EricPostpischil это еще одна форма высказывания: «Он компилируется и связывается», как обычно это первое серьезное препятствие.
Нужно внимательно читать спецификации. "The final amount due, should add the tax to the bill before calculating the tip."
... Приведенный выше код не включает налог при расчете чаевых.
Просто разделите одно длинное трудночитаемое уравнение на более мелкие части:
float half(float bill, float tax, int tip)
{
float total = bill * ( 1 + tax/100.0);
total = total * (1 + tip/ 100.0);
return total /2;
}
Разве не легче читать и понимать? Компилятору все равно.
Упростите себе жизнь при отладке и не вводите данные пользователем — просто создайте несколько тестовых случаев. Это сэкономит вам много времени
float half(float bill, float tax, int tip);
int main(void)
{
printf("You will owe $%.2f each!\n", half(50.0f, 10.0f, 20.0f));
printf("You will owe $%.2f each!\n", half(50.0f, 12.5f, 20.0f));
printf("You will owe $%.2f each!\n", half(100.0f, 12.5f, 15.0f));
}
// TODO: Complete the function
float half(float bill, float tax, int tip)
{
float total = bill * ( 1 + tax/100.0);
total = total * (1 + tip/ 100.0);
return total /2;
}
Кроме того, вы используете математику с плавающей запятой для валюты - это плохая идея. Вам нужны точные результаты, а вычисления с плавающей точкой этого не обеспечивают. См. Не работает ли математика с плавающей запятой? Даже если вы сможете получить правильные ответы с этими задачами на этот вопрос, вы не получите правильные ответы во всех задачах.