Практическая проблема CS50-HALF. Что я могу сделать, чтобы устранить неполадки в моем коде, который работает правильно, но не дает желаемого результата?

CS50 Практическая задача ПОЛОВИНА -

Фон

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

Детали реализации

Ваша функция должна использовать входные параметры bill, tax и tip для расчета конечной суммы. Однако, поскольку эти значения являются процентными, вам придется проделать некоторую работу, чтобы преобразовать их в более подходящие форматы для использования в ваших расчетах.

Окончательная сумма к оплате должна быть добавлена ​​к налогу до расчета чаевых. Наконец, вы вернете ровно половину полной суммы, включая сумму счета, налог и чаевые.

Вопрос-мысль

  • Как вы думаете, почему в C существуют разные типы данных?

Как проверить свой код

Ваша программа должна вести себя в соответствии с приведенными ниже примерами.

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!

введите здесь описание изображения

Кроме того, вы используете математику с плавающей запятой для валюты - это плохая идея. Вам нужны точные результаты, а вычисления с плавающей точкой этого не обеспечивают. См. Не работает ли математика с плавающей запятой? Даже если вы сможете получить правильные ответы с этими задачами на этот вопрос, вы не получите правильные ответы во всех задачах.

Andrew Henle 08.01.2023 13:58

@AndrewHenle это cs50. Они так глубоко в это не погружаются. Они только начали изучать C

0___________ 08.01.2023 14:37

Что касается «работает правильно, но не дает желаемого результата»: это не то, что означает «работать должным образом».

Eric Postpischil 08.01.2023 14:39

@EricPostpischil это еще одна форма высказывания: «Он компилируется и связывается», как обычно это первое серьезное препятствие.

0___________ 08.01.2023 14:54

Нужно внимательно читать спецификации. "The final amount due, should add the tax to the bill before calculating the tip." ... Приведенный выше код не включает налог при расчете чаевых.

Fe2O3 08.01.2023 21:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
199
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто разделите одно длинное трудночитаемое уравнение на более мелкие части:

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;
}

https://godbolt.org/z/fzvo8e5zq

Другие вопросы по теме