Как вызвать функцию и запустить ее и вернуть символ? - PullRequest
0 голосов
/ 28 февраля 2019

В этом коде не запускается моя первая функция getPatientType.Этот код переходит непосредственно к разделу: «Каковы медицинские расходы, а затем запрашивает плату за обслуживание и возвращает 0 независимо от того, что я ввожу. Я ищу некоторую помощь в получении и корректной работе этого кода.

#include <iostream>
#include <iomanip>
using namespace std;
int numdays;
float dailyRate;
double medChrg;
double totalChrg;
char doAgain;
char patientType;
int daysHospital;
double serviceChrg;



int main()
{

Я не уверен, что это правильный способ вызова этой функции и почему она не запускается.

    char getPatientType(char);

    if (patientType == 'y' || patientType == 'Y') 
    {
        cout << "How many days was the patient in the hospital? ";
        cin >> daysHospital;
        while (daysHospital < 0) {
            cout << "Enter a valid number of days: ";
            cin >> daysHospital;
        }

        cout << "What is the daily rate? : ";
        cin >> dailyRate;
        while (dailyRate < 0)
        {
            cout << "Enter a valid daily Rate. : ";
            cin >> dailyRate;

        }
    }

    cout << "What are the medical charges?: ";
    cin >> medChrg;
    while (medChrg < 0) {
        cout << "Enter a valid medical charge : ";
        cin >> medChrg;
    }
    cout << "What are the services charges?: ";
    cin >> serviceChrg;
    while (medChrg < 0) {
        cout << "Enter a valid medical charge : ";
        cin >> medChrg;
    }

    double calcBillFor(int, float, double, double);
    double calcBillFor(double, double);

    cout << "The charges for the patient will be " << totalChrg;
    system("pause");

}


char getPatientType(char) {

    cout << "What is the type of Patient, type I for Impatient, and O for 
Outpatient?: ";
    cin >> patientType;
    if (patientType != 'I' || patientType != 'i' || patientType != 'o' || 
patientType != 'O')
    {
        cout << "Enter a valid patient type: ";
        cin >> patientType;

    }
    return patientType;

}

Я также должен использовать возможность C ++ для возможностиперегрузка, поэтому эти две функции вызываются с одинаковым именем, но разными параметрами.

double calcBillFor(int, float, double, double) {
    totalChrg = (dailyRate * daysHospital) + medChrg + serviceChrg;
    return totalChrg;
}

double calcBillFor(double, double) {
    totalChrg = (medChrg + serviceChrg);
    return totalChrg;
}

Система не показывает, что у меня есть какие-либо ошибки, поэтому я не понимаю, почему весь код работает неправильно.есть что-то, что я пропускаю или логические ошибки, пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

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

// delete all of these...
int numdays;
float dailyRate;
double medChrg;
double totalChrg;
char doAgain;
char patientType;
int daysHospital;
double serviceChrg;

Вместо этого сделайте их параметрами ваших функций.Например, вот как вы могли бы записать их как параметры:

double calcBillFor(int daysHospital, float dailyRate, double medChrg, double serviceChrg)
{
    ...
}

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

Первая строка в main() - это char getPatientType(char);.Это не подходящий способ вызова функции.Это декларация, и она объявляется внутри main(), что нелогично.Цель этого объявления - сказать: «Эй, где-то есть функция с именем getPatientType, и в качестве параметра она принимает char, и она возвращает char, но я ничего не знаю об этом, кроме этого."

Причина, по которой в вашем коде используется объявление, заключается в том, что фактическая функция getPatientType ниже main().Поскольку он ниже main(), main() не может знать, что он существует даже без объявления функции.Вот почему вы должны сделать что-то вроде этого:

char getPatientType(char);
/*   "Hey, compiler! Somewhere there's a function called getPatientType
 *    that takes a char and returns a char, but that's all I know about
 *    it right now."
 */
int main() { ... }

Таким образом, вы видите, как объявления функций находятся вне и над главной функцией .Это делает так, что когда вы на самом деле вызываете getPatientType внутри main, компилятор не будет кричать на вас, потому что он никогда даже не слышал 1035 * из getPatientType.Это потому, что вы сказали ему ожидать, что getPatientType будет позже в коде, так что он останется доволен.

Однако, если мы посмотрим на getPatientType позже в коде, мы быстро узнаем, чтодаже не нужно передавать char!Вместо этого это можно было бы написать так:

char getPatientType() {
    char patientType;
    cout << "What is the type of Patient, type I for Impatient, and O for Outpatient?: ";
    cin >> patientType;
    if (patientType != 'I' || patientType != 'i' || patientType != 'o' || 
        patientType != 'O')
    {
        cout << "Enter a valid patient type: ";
        cin >> patientType;
    }
    return patientType;
}

Поскольку мы изменили внешний вид getPatientType, нам также необходимо изменить это объявление, которое мы сделали ранее main().

char getPatientType();
/*   "Hey, compiler! Somewhere there's a function called getPatientType
 *    that takes NOTHING and returns a char, but that's all I know about
 *    it right now."
 */
int main() { ... }

Вот как бы вы назвали такую ​​функцию:

char patientType = getPatientType();
// patientType now stores our input

Остальное зависит от вас.Я надеюсь, что это прояснило некоторые вещи для вас.

0 голосов
/ 28 февраля 2019

Правильный способ вызова функции - это вызов: char patientType = getPatientType(); внутри int main().Ваша подпись функции должна быть char getPatientType() { ... }.Вы не предоставляете никаких параметров для функции.Пользователь предоставляет параметры внутри функции.Вам нужно поместить эту функцию вверху вашего файла ИЛИ объявить ее вверху.Вы можете объявить это, поставив char getPatientType(); вверху.Это говорит вашей программе, поверьте мне, я расскажу вам, что эта функция делает к концу моей программы.Внутри вашей функции вам нужно определить char patientType;.Эта переменная - место, куда вы можете поместить содержимое cin.

Вы действительно должны подумать о том, чтобы называть две функции разными именами.Они рассчитывают одно и то же, но требуют разных значений.Вам будет трудно вспомнить, что вам нужно предоставить, и чем больше ваша программа, тем сложнее она будет.например, calcBillOverDays.Вы также можете отделить функциональность.calcServiceCharge () и calcDailyCharge ()

0 голосов
/ 28 февраля 2019

This:

int main()
{
    char getPatientType(char);

    if (patientType == 'y' || patientType == 'Y') 

Не является вызовом функции getPatientType, это предварительное объявление функции внутри области действия main.

Кроме того, поскольку getPatientTypeфактически не принимает никаких входных параметров, часть (char) не требуется

Лучше:

char getPatientType(); // forward declaration

int main()
{

    patientType = getPatientType();  // actually call the function

    if (patientType == 'y' || patientType == 'Y') 

Фактическая getPatientType функция определяется следующим образом:

char getPatientType() {

    cout << "What is the type of Patient, type I for Impatient, and O for 
Outpatient?: ";
     <rest of code not shown for brevity>
}
0 голосов
/ 28 февраля 2019

Не выдает ошибку, потому что функция getPatientType () определена после основной, может быть для другой работы (может использоваться внутри других функций, определенных после функции getPatientType () ...)

Это не дает ошибку также из-за этого "char getPatientType (char);".означает, что вы объявляете или создаете прототип функции.И определил его через некоторое время.

для решения вашей проблемы

объявляет функцию getPatientType () вне основного тела .., но когда вы вызываете эту функцию, не забудьте передатьпараметр типа char в соответствии с типом данных параметра функции.

или

определяют функцию getPatientType () внутри основного тела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...