【问题标题】:Function and selection issue in C++C++中的函数和选择问题
【发布时间】:2010-11-15 17:28:42
【问题描述】:

我修改了这篇文章。我是编程新手,不知道功能是否设置正确,甚至不知道如何允许选择包。以下是我的目标。

我有一个班级作业要编写一个 C++ 程序,该程序将计算客户每月的互联网账单。它将输入客户姓名、客户购买的包裹以及使用了多少小时。

要求是:

输入验证:确保用户只选择包 A B 或 C。如果输入了错误的包,则显示和错误消息。

计算:

PackA 每月 9.95,访问时间为 10 小时。额外每小时 2 美元。 PackB 每月 14.95,访问时间为 20 小时。每增加一小时1块钱。 PackC 每月 19.95 美元,无限制访问。

然后我必须将输出创建为账单。

目前我写的代码是:

/*
 James Hayek
 CIS 165
 Passaic County Community College
 Program 04
*/


#include <iostream>
#include <iomanip>

using namespace std;

double calcBill(double packageChoosen, double hours, double basePack, char name); // This is the function prototype for calcBill
void dispBill(char packageChoosen, double hours, double basePack, char name, char bill); // This is the function prototype for dispBill


int main()
{
 char packageChoosen;
 double bill;
 char name;
 double hours;
 double basePack;

 cout << "Welcome To Your Personal Bill Caclculator!\n\n";
 cout << "Please enter your name: \n";
 cin  >> name;
 cout << "Please choose your package by entering A, B, or C: \n";
 cin  >> packageChoosen;

 bill = calcBill(name, packageChoosen, hours, basePack); // call function calcBill
 dispBill(name, packageChoosen, hours, basePack, bill); // call function dispBill


 return 0;

} // end main




double calcBill(char packageChoosen, double hours, double basePack, char name) //This is the function for calcBill
{

 if (packageChoosen == 'A' || packageChoosen == 'a' && hours <= 10)
 {
  bill = 9.95;
 }
 else if (packageChoosen == 'A' || packageChoosen == 'a' && hours > 10)
 {
  bill = 9.95 + (2 * hours);
 } 

 else
 {
  cout << "Please choose an apropriate package";

 }


 return bill;

} // end main



void dispBill(double packA, double packB, double packC, char name, char bill) //This is the function for dispBill
{



 cout << bill;


 return;

} // end dispBill

我不确定从哪里开始,任何建议将不胜感激。

【问题讨论】:

  • 请编辑您的帖子并将代码格式化为可读的代码(ctrl+K 或“101010”图标)。
  • 您遇到什么错误?编译错误?运行时错误?
  • 呃哦 - 你在字符串中拼错了“计算器”... C++ 不会编译拼写错误的字符串 ;)
  • 为什么拼写错误的计算器很重要?这是一个 cout 声明,我可以写任何我想要的东西,甚至“haayaiidkdfkddd”不?
  • 注意眨眼的笑脸——这是个笑话。你是对的;字符串根本不重要。

标签: c++


【解决方案1】:

&amp;&amp; 运算符比 C++ 中的 || 运算符绑定得更紧密。而不是

packageChoosen == 'A' || packageChoosen == 'a' && hours > 10

作为一个布尔表达式,你很可能想要

(packageChoosen == 'A' || packageChoosen == 'a') && hours > 10

顶部表达式查找“​​包 A”或“包 a 小时 > 10”。下面的表达式查找“​​包 A 或包 a”和“小时 > 10”。

正如 Platinum Azure 在他的回答中提到的,也可以将你必须的任何字符转换为小写,然后与小写字母进行一次比较。

#include <cctype>
// ...
std::tolower(packageChoosen) == 'a' && hours > 10

这使您的代码更具可读性,并且您不必担心运算符优先级。

【讨论】:

  • 是的,正是我建议它的原因。 :-)
  • 嗯,我完全忽略了“and”“or”操作数的操作顺序。谢谢,一旦运行良好,我还将使用“toupper”和“tolower”语句。
  • 你应该 +1 我,因为你有效地偷了我的答案。 :-P
  • 哦,哇,我不知道这上面有元条目。你每天学习新的东西!也许我应该在空闲时间浏览其中一些问题......
【解决方案2】:

Zeke 的回答很中肯;但是,您可以 #include &lt;cctype&gt; 并使用 std::tolower(packageChoosen == 'a' 作为您的条件的一部分。

【讨论】:

  • 循环答案参考万岁!
【解决方案3】:

您需要更多地考虑 OO。你被困在 C 世界。我建议Package 是一个很好的对象。

至于错误,您还没有说出它们是什么,所以我无法真正帮助您。我懒得自己运行编译来获取您应该已经发布的内容。

【讨论】:

  • 对不起,错误是编译错误。我对编程和功能和选择的概念在外部是陌生的,这是要学习的最新课程。我不知道需要面向对象编程,我将不得不查一下。
【解决方案4】:

创建一个抽象类 PackageAbstract 创建一个名为 user 的类 创建一个名为 bill 的类

创建具体类 PackageA、packageB、packageC

在用户类中添加方法: addPackage(packageAbstract* packageAbs){} 添加成员 m_vector 包选择

为计费创建一个包含用户的账单...

您每个月都会循环访问用户以创建账单

对于一个真正的应用程序,您需要一个由用户提供的类 custormers ...

【讨论】:

    【解决方案5】:

    不错的解决方案:

    创建一个抽象类Package,像这样:

    class Package{
    public:
       virtual double calculate(double hours) = 0;
    }
    

    然后从中继承具体的包类型,如下所示:

    class PackageA : public Package{
    public:
       virtual double calculate(double hours){
            return hours < 10 ? 9.92 : 9.95 + hours*2;
       }
    }
    

    然后,您可以使用类似以下代码的代码来计算账单:

    Package* bill_calculators[3];
    bill_calculators[0] = new PackageA();
    bill_calculators[1] = new PackageB();
    bill_calculators[2] = new PackageC();
    char packageChosen;
    cin >> packageChosen;
    packageChosen = toupper(packageChosen) - 'A';
    if(packageChosen >= 0 && packageChosen < 3) cout << bill_calculators[packageChosen]->calculate(hours);
    else cout << "Invalid package\n";
    

    我还没有实际编译或测试过代码,但你明白了:创建一个抽象接口,为子类中的特定包实现算法,然后创建实例并根据用户输入决定使用哪个实例进行计算。 顺便说一句,你必须#include 才能使用 toupper() 函数

    干杯。

    【讨论】:

    • 我会考虑使用类。谢谢你的建议。但是我不认为老师会喜欢那样..因为我们没有上课。她是个坚持不懈的人,希望我们只使用除 main 之外的两个函数,并接受用户输入来选择一个包,然后根据使用的小时数计算账单。
    • 没关系,在这种情况下,您可以简单地在 calcBill 函数中使用 switch(){..} 语句,如下所示: switch(packagechosen){case 'a': //do for包一个; break;...} 等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2011-04-10
    相关资源
    最近更新 更多