未初始化?,学费成本,局部变量,

uninitialized?, tuitionCost, local Variable,

本文关键字:局部变量 初始化      更新时间:2023-10-16
int main()
{
    double tuitionCalc(int sumCreditHoursTaken);
    int numCourses;
    double total = 0.0;
    double tuitionCost= 0.0;

    cout << "tt This Program calculates a student's total number ofn";
    cout << "ttcredit hours and tution for a given semester.n";
    cout << "nPlease enter the number of Courses you will be taking this semester: ";
    cin >> numCourses;
    for ( int count = 1; count <= numCourses; count++)
    {
        double sumCreditHoursTaken;
        cout << " please enter the number of credit hours for course" << count << ": ";
        cin >> sumCreditHoursTaken;
        total += sumCreditHoursTaken;
    }
    cout << fixed << showpoint << setprecision(2);
    cout << "Your Total number of credit hours is: " << total << endl;
    cout << "Your total tuition will be: $" << tuitionCalc(tuitionCost) << "nn";
    return 0;
}

并且 IM 调用的函数是

double tuitionCalc(int sumCreditHoursTaken)
{
    double tuitionCost = 0.0;
    double costCreditHour = 147.00;
    double maxHoursFullTuition = 12;
    double maintFeeAddOn = 29.33;`
    if (sumCreditHoursTaken <= maxHoursFullTuition)
        cout<< " " <<  (sumCreditHoursTaken * costCreditHour);
    else if (sumCreditHoursTaken > maxHoursFullTuition)
        cout << " " << (maxHoursFullTuition * costCreditHour) + ((sumCreditHoursTaken - maxHoursFullTuition) * maintFeeAddOn);
    return tuitionCost;
}

课程数输入为 5学分为 3,3,3.5,4,2.5我得到了总学分,但ICANT似乎显示了学费?谢谢 S

您实际上永远不会tuitionCalc()方法中为tuitionCost赋值,因此它将始终0.0

详细说明:您正在从tuitionCalc()返回tuitionCost。您首先初始化tuitionCost = 0.0,但从不继续为其分配任何计算值。因此,当您返回 tuitionCost 时,它将返回您将其初始化为的值:0.0

我还没有详细检查您的代码,但是如果您的输入包含浮点数,则将sumCreditHoursTake的类型从int更改为double。

此外,将调用学费计算的参数从学费成本更改为总计

OP 似乎已经误解了范围以及如何将变量传递给函数。

main中,OP 定义了 tuitionCosttuitionCalc定义了另一个tuitionCost。这些是不同的tuitionCost。它们表示内存中的不同位置,并且可以存储不同的值。

接下来,因为定义了tuitionCalc函数

double tuitionCalc(int sumCreditHoursTaken)

tuitionCalc(tuitionCost)tuitionCost将其转换为整数,并将副本传递到tuitionCalc中,它将与名称 sumCreditHoursTaken 一起使用。可以说OP在这一点上有三个tuitionCalc。不是他们想要的。

分解tuitionCalc原型,我们看到它需要 sumCreditHoursTaken ,一个整数,并且基于名称所花费的学分数,而不是总成本。 tuitionCalc还返回一个double并从中推断函数的用途;的名字,人们会期望它计算并返回学费。

就像阿纳托利在他的回答中所说的那样,tuitionCalc的输入几乎肯定应该是total的,计算的学分总数,输出应该是tuitionCost的。

由于这有家庭作业的味道,因此完全回答这个问题不符合OP的最佳利益。相反,这里有一些建议:

消除main tuitionCost。它只会增加混乱。您可以重用变量名称,但只能在有明显好处的情况下这样做。如果你有一个cost和一个接受和使用cost的函数,那么对两者都使用 cost 是有意义的。请记住,函数内部的成本是一个不同的实体,除非您通过引用传递。在

void function(int & cost)

被调用者

function(cost);

两个cost是相同的。但在

void function(int cost)

被调用者

function(cost);

function的开销都是调用方cost的副本,函数所做的任何更改都只会影响副本。

声明变量靠近使用它们的位置。这样,阅读您的代码的人就不必上下滚动,否则就不必去寻找。它对你也有帮助,因为它会犯一些错误,比如"为什么调用一个用double int的函数更明显?

不要cout tuitionCalc.计算并返回tuitionCost 。允许main输出tuitionCost 。名称类似于 calc 的函数应该只计算。名称应尽可能接近地描述功能。

首先,您应该在声明函数原型之前创建它。您使用的代码中存在一些混乱,我尽力省略错误,希望这有所帮助!

#include <iostream>
#include <iomanip>
using namespace std;
double tuitionCal(double sumCreditHoursTaken);
int main() {
     double tuitionCalc(int sumCreditHoursTaken);
    int numCourses;
    double total = 0.0;
    //double tuitionCost= 0.0;

    cout << "tt This Program calculates a student's total number ofn";
    cout << "ttcredit hours and tution for a given semester.n";
    cout << "nPlease enter the number of Courses you will be taking this semester: ";
    cin >> numCourses;
    double sumCreditHoursTaken; // you should create this variable outside the for loop
    for ( int count = 1; count <= numCourses; count++)
    {
        cout << " please enter the number of credit hours for course" << count << ": ";
        cin >> sumCreditHoursTaken;
        total += sumCreditHoursTaken;
    }
    double tuitionCost=tuitionCal(total);
    cout << fixed << showpoint << setprecision(2);
    cout << "Your Total number of credit hours is: " << total << endl;
    cout << "Your total tuition will be: $" <<tuitionCost<< "nn";// I assume this is what you want

    return 0;
}
double tuitionCal(double sumCreditHoursTaken)//the parameter type is double now
{
    double tuitionCost = 0.0;
    double costCreditHour = 147.00;
    double maxHoursFullTuition = 12;
    double maintFeeAddOn = 29.33;
    if (sumCreditHoursTaken <= maxHoursFullTuition)
        tuitionCost=(sumCreditHoursTaken * costCreditHour);
    else if (sumCreditHoursTaken > maxHoursFullTuition)
       tuitionCost=(maxHoursFullTuition * costCreditHour) + ((sumCreditHoursTaken - maxHoursFullTuition) * maintFeeAddOn);
    return tuitionCost;
    //I don't see a point of returning the value and couting both you can 
    //do only one of the oprations
}