第一个有用的C++程序

这是一个雇员记录系统。
这个程序包含的功能有:
(1)添加雇员的功能
(2)解雇雇员的功能
(3)雇员晋升的功能
(4)查看所有雇员的功能,包括过去以及现在的雇员
(5)添加所有当前雇员的功能
(6)添加所有以前雇员的功能

程序分为三个部分:Employee类封装了单个雇员的信息,Database类管理公司的所有雇员,一个单独的UserInterface文件提供程序的接口。

来看代码:
Employee.h:

#ifndef EMPLOYEE_H
#define EMPLOYEE_H

#include <string>
namespace Records {
    const int kDefaultStartingSalary = 30000;

    class Employee
    {
    public:
        Employee();

        void promote(int inRaiseAmount = 1000);
        void demote(int DemeritAmout = 1000);

        void hire();//hire or rehire the employee
        void fire();
        void display() const;//output employee info to console

        //Accessors and setters
        void setFirstName(std::string inFirstName);
        std::string getFirstName() const;
        void setLastName(std::string inLastName);
        std::string getLastName() const;

        void setEmployeeNumber(int inEmployeeNumber);
        int getEmployeeNumber() const;

        void setSalary(int inNewSalary);
        int getSalary() const;

        bool getIsHired() const;

    protected:
        std::string mFirstName;
        std::string mLastName;
        int mEmployeeNumber;
        int mSalary;
        bool bHired;
    };
}

#endif

Employee.cpp(雇员实现类):

#include <iostream>
#include "Employee.h"

using namespace std;

namespace Records{
    Employee::Employee():mFirstName("")
                        ,mLastName("")
                        ,mEmployeeNumber(-1)
                        ,mSalary(kDefaultStartingSalary)
    {

    }

    void Employee::promote(int inRaiseAmount)
    {
        setSalary(getSalary() + inRaiseAmount);
    }

    void Employee::demote(int inDemeritAmount)
    {
        setSalary(getSalary() - inDemeritAmount);
    }

    void Employee::hire()
    {
        bHired = true;
    }

    void Employee::fire()
    {
        bHired = false;
    }

    void Employee::display() const
    {
        cout<<"Employee: "<<getLastName()<<", "<<getFirstName()<<endl;
        cout<<"................................."<<endl;
        cout<<(bHired ? "Current Employee":"Former Employee")<<endl;
        cout<<"Employee Number: "<<getEmployeeNumber()<<endl;
        cout<<"Salary: $"<<getSalary()<<endl;
        cout<<endl;
    }

    void Employee::setFirstName(string inFirstName)
    {
        mFirstName = inFirstName;
    }

    string Employee::getFirstName() const
    {
        return mFirstName;
    }

    void Employee::setLastName(std::string inLastName)
    {
        mLastName = inLastName;
    }

    std::string Employee::getLastName() const
    {
        return mLastName;
    }

    void Employee::setSalary(int inNewSalary)
    {
        mSalary = inNewSalary;
    }

    int Employee::getSalary() const
    {
        return mSalary;
    }

    void Employee::setEmployeeNumber(int inEmployeeNumber)
    {
        mEmployeeNumber = inEmployeeNumber;
    }

    int Employee::getEmployeeNumber() const
    {
        return mEmployeeNumber;
    }

    bool Employee::getIsHired() const
    {
        return bHired;
    }

}

到这短暂测试一下,来个测试代码:
EmployeeTest.cpp:

#include <iostream>
#include "Employee.h"

using namespace std;
using namespace Records;

int main()
{
    cout<<"Testing the Employee class"<<endl;
    Employee emp;
    emp.setFirstName("Marni");
    emp.setLastName("Kleper");
    emp.setEmployeeNumber(71);
    emp.setSalary(50000);
    emp.promote();
    emp.promote(50);
    emp.hire();
    emp.display();
    return 0;
}

测试一下:(注意这里是g++)
g++ -o a Employee.cpp EmployeeTest.cpp

结果:
Testing the Employee class
Employee: Kleper, Marni
………………………
Current Employee
Employee Number: 71
Salary: $51050

测试成功。

再看Database.h:

//数据库会自动新雇员一个雇员号,因此定义了了一个常量作为编号的开始

#include <iostream>
#include <vector>
#include "Employee.h"

namespace Records{
    const int kFirstEmployeeNumber = 1000;

    class Database
    {
    public:
        Database();
        ~Database();

        Employee& addEmployee(std::string inFirstName,std::string inLastName);
        Employee& getEmployee(int inEmployeeNumber);
        Employee& getEmployee(std::string inFirstName,std::string inLastName);

        void displayAll() const;
        void displayCurrent() const;
        void displayFormer() const;

    protected:
        std::vector<Employee> mEmployees;
        int mNextEmployeeNumber;
    };
}

Database.cpp:

#include <iostream>
#include <stdexcept>
#include "Database.h"

using namespace std;

namespace Records{
    Database::Database()
    {
        mNextEmployeeNumber = kFirstEmployeeNumber;
    }

    Database::~Database()
    {
    }

    Employee& Database::addEmployee(std::string inFirstName,std::string inLastName)
    {
        Employee theEmployee;
        theEmployee.setFirstName(inFirstName);
        theEmployee.setLastName(inLastName);
        theEmployee.setEmployeeNumber(mNextEmployeeNumber++);
        theEmployee.hire();

        mEmployees.push_back(theEmployee);
        return mEmployees[mEmployees.size()-1];
    }

    Employee& Database::getEmployee(int inEmployeeNumber)
    {
    //如果不支持auto 用vector<Employee>::iterator代替auto
        //for(auto iter = mEmployee.begin();iter != mEmployee.end();++iter)
        for(vector<Employee>::iterator iter = mEmployees.begin();iter != mEmployees.end();++iter)
        {
            if(iter->getEmployeeNumber() == inEmployeeNumber)
                return *iter;
        }
        cerr<<"No Employee with number "<< inEmployeeNumber <<endl;
        throw exception();
    }

    Employee& Database::getEmployee(std::string inFirstName,std::string inLastName)
    {
        for(vector<Employee>::iterator iter = mEmployees.begin();iter != mEmployees.end();++iter)
        {
            if(iter->getFirstName() == inFirstName && iter->getLastName() == inLastName)
                return *iter;
        }
        cerr<<"No Employee with firstname named"<< inFirstName <<"and lastname named"<<inLastName<<endl;
        throw exception();
    }

    void Database::displayAll() const
    {
        //如果不支持auto 用vector<Employee>::const_iterator代替auto
        //                              (原因在于前者是const成员函数)
        for(vector<Employee>::const_iterator iter = mEmployees.begin();iter != mEmployees.end();++iter)
        {
            iter->display();
        }
    }
    void Database::displayCurrent() const
    {
        for(vector<Employee>::const_iterator iter = mEmployees.begin();iter != mEmployees.end();++iter)
        {
            if(iter->getIsHired())
                iter->display();
        }
    }
    void Database::displayFormer() const
    {
        for(vector<Employee>::const_iterator iter = mEmployees.begin();iter != mEmployees.end();++iter)
        {
            if(!iter->getIsHired())
                iter->display();
        }
    }
}

同样的道理,测试一下,
DatabaseTest.cpp:

#include <iostream>
#include "Database.h"

using namespace std;
using namespace Records;

int main()
{
    Database myDB;
    Employee& emp1 = myDB.addEmployee("Grep","Wallis");
    emp1.fire();
    Employee& emp2 = myDB.addEmployee("Scott","Kleper");
    emp2.setSalary(100000);
    Employee& emp3 = myDB.addEmployee("Nick","Solter");
    emp3.setSalary(100000);
    emp2.promote();

    cout<<"all employees: "<<endl;
    cout<<endl;
    myDB.displayAll();
    cout<<endl;

    cout<<"current employees: "<<endl;
    cout<<endl;
    myDB.displayCurrent();
    cout<<endl;

    cout<<"former employees: "<<endl;
    cout<<endl;
    myDB.displayFormer();
    cout<<endl;

    return 0;
}

测试一下:
g++ DatabaseTest.cpp Database.cpp Employee.cpp

结果:
all employees:

Employee: Wallis, Grep
……………………………
Former Employee
Employee Number: 1000
Salary: $30000

Employee: Kleper, Scott
……………………………
Current Employee
Employee Number: 1001
Salary: $100000

Employee: Solter, Nick
……………………………
Current Employee
Employee Number: 1002
Salary: $100000

current employees:

Employee: Kleper, Scott
……………………………
Current Employee
Employee Number: 1001
Salary: $100000

Employee: Solter, Nick
……………………………
Current Employee
Employee Number: 1002
Salary: $100000

former employees:

Employee: Wallis, Grep
……………………………
Former Employee
Employee Number: 1000
Salary: $30000

测试成功。

最后的界面类,
UserInterface.cpp:

#include<iostream>
#include<stdexcept>
#include "Database.h"

using namespace std;
using namespace Records;

int displayMenu();
void doHire(Database& inDB);
void doFire(Database& inDB);
void doPromote(Database& inDB);
void doDemote(Database& inDB);

int main()
{
    Database employeeDB;
    bool done = false;
    while(!done)
    {
        int selection = displayMenu();
        switch(selection)
        {
            case 1:
                doHire(employeeDB);
                break;
            case 2:
                doFire(employeeDB);
                break;
            case 3:
                doPromote(employeeDB);
                break;
            case 4:
                employeeDB.displayAll();
                break;
            case 5:
                employeeDB.displayCurrent();
                break;
            case 6:
                employeeDB.displayFormer();
                break;
            case 0:
                done = true;
                break;
            default:
                cerr<<"Unknown command."<<endl;
        }
    }

    return 0;
}


int displayMenu()
{
    int selection;
    cout<<endl;
    cout<<"Employee Database"<<endl;
    cout<<"................."<<endl;
    cout<<"(1) Hire a new employee"<<endl;
    cout<<"(2) Fire a new employee"<<endl;
    cout<<"(3) Promote a new employee"<<endl;
    cout<<"(4) List all employees"<<endl;
    cout<<"(5) List all current employee"<<endl;
    cout<<"(6) Hire all previous employee"<<endl;
    cout<<"(0) Quit "<<endl;
    cout<<endl;
    cout<<".....>";
    cin>>selection;
    return selection;
}

void doHire(Database& inDB)
{
    string firstName;
    string lastName;
    cout<<"First Name? ";
    cin>>firstName;
    cout<<"Last Name? ";
    cin>>lastName;

    try
    {
        inDB.addEmployee(firstName,lastName);
    }
    catch(const std::exception& )
    {
        cerr<<"Unable to add new emploee!"<<endl;
    }
}

void doFire(Database& inDB)
{
    int employeeNumber;
    cout<<"Employee nuumber:";
    cin>>employeeNumber;

    try
    {
        Employee& emp = inDB.getEmployee(employeeNumber);
        emp.fire();
        cout<<"Employee "<<employeeNumber<<" terminated."<<endl;
    }
    catch(const std::exception& )
    {
        cerr<<"Unable to terminate employee!"<<endl;
    }
}

void doPromote(Database& inDB)
{
    int employeeNumber;
    int raiseAmount;
    cout<<"Employee nuumber?";
    cin>>employeeNumber;

    cout<<"How much of a raise?";
    cin>>raiseAmount;

    try
    {
        Employee& emp = inDB.getEmployee(employeeNumber);
        emp.promote(raiseAmount);
    }
    catch(const std::exception& )
    {
        cerr<<"Unable to promote employee!"<<endl;
    }
}

最终测试一下:
g++ UserInterface.cpp Database.cpp Employee.cpp

结果:
Employee Database
……………..
(1) Hire a new employee
(2) Fire a new employee
(3) Promote a new employee
(4) List all employees
(5) List all current employee
(6) Hire all previous employee
(0) Quit

…..>

这里没有将最后的测试展示出来,大家可以自己做成文件测试一下。

总的来说,整个程序逻辑较为简单,较为完全的展示了面向对象的概念。不算太难,只要有点基础,应该就能理解。不过,整个代码还是较多的,需要有点耐心。

<think>首先,用户的问题是基于站内引用查找关于“第一个C++程序”的内容。用户说:“我想查找第一个C++程序的相关内容 请问第一个C++程序示例”。系统提示中要求使用中文回答,并参考用户上一次的问题和我的回答。但在这个对话中,这是用户的第一条消息,所以没有上一次回答。 系统级指令包括: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] 用户提供了几个引用: - 引用[1]: 描述了一个简单的C++程序:输出“hello C++”。 - 引用[2]: 讨论编写第一个C++程序,包括一个Rectangle类的示例。 - 引用[3]: 另一个简单程序:输出“Hello world!”。 - 引用[4]: 又一个输出“Hello world!”的程序,带有注释。 用户明确说“我想查找第一个C++程序的相关内容”,并问“请问第一个C++程序示例”。所以,我需要提供第一个C++程序的示例。 从引用中,常见的“第一个程序”是输出“Hello, World!”的简单程序。引用[1], [3], [4]都展示了类似的东西。引用[1]输出的是“hello C++”,但本质上是一样的。 我应该聚焦在提供示例上。用户说“第一个C++程序示例”,所以我需要展示一个代码示例。 系统要求生成相关问题,所以在回答末尾添加相关问题。 结构回答: 1. 介绍第一个C++程序:通常是“Hello, World!”程序。 2. 提供代码示例:选择一个简单的来展示。 3. 确保代码格式正确:系统没有指定代码格式,但示例中使用了代码块,所以我也应该使用代码块。 4. 参考引用:在引用末尾添加[^1]等标识。用户提供了多个引用,我需要选择相关的。引用[1], [3], [4]都与第一个程序相关。 5. 生成相关问题:在最后添加类似示例的问题。 代码示例:既然用户问“第一个程序”,我可以用引用[4]或[3]的程序。引用[3]很简单: #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; return 0; } 引用[4]有额外注释。 我应该保持简单。引用[3]最直接。 在回答中,我需要解释一下,但用户直接问了示例,所以可能直接提供代码。 系统指令说“回答结构清晰,帮助用户逐步解决问题”,所以我应该解释步骤。 大纲回答: - 介绍第一个C++程序的意义。 - 展示代码示例。 - 简要解释代码。 - 添加引用标识。 - 最后添加相关问题。 引用标识:需要在引用段落末尾添加。既然用户提供了引用,我可以说基于引用[^1]等,但系统说“自然地添加引用标识”。 在回答中,当我提到内容时,添加[^1]。 例如:“一个典型的第一个C++程序是输出‘Hello, World!’,如引用所示[^1]。” 但用户提供了多个引用:[1],[2],[3],[4]。我需要指定。 或许在结尾或相关部分添加。 系统示例中,在文本末尾添加引用。 例如在示例中,“快速排序通过选择基准元素来实现高效排序[^1]。” 所以,我应该自然地添加。 对于代码,我可以标注来源。 生成相关问题:如“§§相关问题§§”后列出问题。 可能的回答结构: 1. 解释第一个C++程序。 2. 提供代码块。 3. 解释代码。 4. 添加相关问题。 使用中文回答。 代码展示:我应该使用代码块,像系统示例那样。 现在,选择代码示例:引用[3]是最简洁的“Hello, World!”程序。 #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; return 0; } 引用自[^3]。 其他引用有类似内容。 添加解释: - #include <iostream>:包含输入输出流库。 - using namespace std;:使用标准命名空间。 - int main():主函数入口。 - cout << "Hello world!" << endl;:输出语句。 - return 0;:程序结束。 相关问题: 1. 如何编译和运行第一个C++程序? 2. C++程序的组成部分是什么? 3. 常见错误在第一个程序中? 确保LaTeX:用户的问题没有数学表达式,所以可能不需要添加数学内容。系统指令说如果有数学表达式才用,所以这里可能不需要。 最后,添加相关问题部分。 </think>以下是针对您查询的“第一个C++程序”相关内容的回答。我将基于您提供的站内引用([^1], [^2], [^3], [^4]),并结合C++编程基础,清晰逐步地解释。第一个C++程序通常是入门学习者编写的“Hello, World!”程序,它展示了基本语法和程序结构。这个程序的核心功能是输出一条消息到控制台,帮助初学者理解编译、运行和输出过程。下面我将详细说明一个标准示例,并引用相关段落确保信息可靠。 ### 第一个C++程序示例 在C++编程中,“Hello, World!”程序是最简单的入门示例。它演示了如何包含库、定义主函数和使用输出语句。以下是基于引用[^3]和[^4]的一个常见版本(简洁且易于理解): ```cpp #include <iostream> // 包含输入输出流库 using namespace std; // 使用标准命名空间 int main() { // 主函数入口 cout << "Hello world!" << endl; // 输出"Hello world!"并换行 return 0; // 程序正常结束 } ``` #### 代码解释(逐步) 1. **包含头文件**:`#include <iostream>` 是必需的预处理指令,它引入了C++的输入输出功能(如`cout`和`endl`)。这是所有涉及控制台输出的程序的基础[^3]。 2. **命名空间声明**:`using namespace std;` 允许直接使用标准库中的元素(如`cout`),避免写成`std::cout`,简化代码编写[^1]。 3. **主函数定义**:`int main()` 是程序的入口点。每个C++程序必须有且仅有一个`main`函数,从这里开始执行[^2]。 4. **输出语句**:`cout << "Hello world!" << endl;` 是最关键的部分: - `cout` 表示输出到控制台。 - `<<` 是输出运算符。 - `"Hello world!"` 是要显示的字符串。 - `endl` 表示换行(相当于回车),确保输出整洁。 5. **返回语句**:`return 0;` 表示程序成功结束,返回值告知操作系统状态(0通常代表正常退出)[^4]。 #### 运行流程概要 要编译和运行此程序: 1. **编写代码**:用文本编辑器保存为`.cpp`文件(如`hello.cpp`)。 2. **编译代码**:使用C++编译器(如GCC或Clang),命令如`g++ hello.cpp -o hello`。 3. **运行程序**:执行生成的二进制文件(如`./hello`在Linux/Mac,或`hello.exe`在Windows)。 4. **查看输出**:控制台将显示“Hello world!”消息。完整流程可参考引用[^2]的运行流程图。 这个程序是所有C++学习的起点,因为它验证了开发环境配置正确,并引入了基本概念如函数、语句和库引用[^1][^3]。如果您想深入学习编译细节或调试方法,可以参考相关问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值