C++实验四——类和对象(2)

  • Post author:
  • Post category:其他


实验报告


【实验名称】 实验四 类和对象(2)

【实验内容】



题目1

课本习题4.10

设计一个用于人事管理的“人员”类。由于考虑到通用性,这里只抽象出所有类型人员都具有的属性:编号、性别、出生日期、身份证号等。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录人和显示。要求包括:构造函数和析构函数、复制构造函数、内联成员函数、带默认形参值的成员函数、类的组合。


源代码:

Date.h

/*出生日期类声明*/
#ifndef _Date_H_
#define _Date_H_
#include "date.h"

class Date{ public:
    Date(){}
    Date(int y , int m , int d):year(y),month(m),day(d){}
    void setYear(int y){ year = y;}
    void setMonth(int m){ month = m;}
    void setDay(int d){ day = d; }
    int getYear(){ return year; }
    int getMonth(){ return month; }
    int getDay(){ return day; }
    void showDate();
    //void inputDate(); private:
    int year;
    int month;
    int day; };

#endif


Date.cpp

/*出生日期类实现*/
#include "date.h"
#include<iostream>
using namespace std;

    void Date::showDate(){
        cout <<"出生日期为:"<<getYear()<<"年"<<getMonth()<<"月"<<getDay()<<"日"<<endl;
}


Personnel.h

/*人员类声明*/
#ifndef _Personnel_H_
#define _Personnel_H_
#include"Personnel.h"
#include"date.h"

#include<iostream>
using namespace std;
enum Sex{male , female};

class Personnel{
public:
    Personnel(){};
    Personnel(string m , string n , Sex s , Date b , long long id);

    ~Personnel(){ cout << "程序结束,Personne的析构函数启动"<<endl; }
    Personnel( Personnel &p);

    void setName(string m){ name = m; }
    void setSerialNumber(string n){ serialNumber = n; }
    void setSex(Sex s = male){ sex = s; }
    void setBirthday(Date b){ birthday = b; }
    void setID_number(long long id){ ID_number = id; }

    string getName(){ return name; }
    string getSerialNumber(){ return serialNumber; }
    Sex getSex(){ return sex; }
    Date getBirthday(){ return birthday; }
    long long getID_number(){ return ID_number; }

    void officeTime(int hour = 7 , int minute = 30);
    void show();

private:
    string name;
    string serialNumber;
    Sex sex;
    Date birthday;
    long long ID_number;
};
#endif


Personnel.cpp

/*人员实现*/
#include "date.h"
#include "Personnel.h"

    Personnel::Personnel(string m , string n , Sex sex , Date b , long long id){
        name = m;
        serialNumber = n;
        this->sex = sex;
        birthday = b;
        ID_number = id;
    }

    Personnel::Personnel( Personnel &p){
        name = p.name;
        serialNumber = p.serialNumber;
        sex = p.sex;
        birthday = p.birthday;
        ID_number = p.ID_number;
    }

    void Personnel::officeTime(int hour/* = 7*/ , int minute /*= 30*/){
        cout <<name<< "的上班的时间为:" << hour <<":"<< minute <<endl;
    }

    void Personnel::show(){
        cout <<"姓名为:"<<name<<endl;
        cout <<"编号为:"<<serialNumber<<endl;
        cout <<"性别为:";
        switch (sex)
    {
        case 0: cout<<"男性"<<endl; break;
        case 1: cout<<"女性"<<endl; break;
    }
        cout <<"出生日期为:"<<birthday.getYear()<<"年"<<birthday.getMonth()<<"月"<<birthday.getDay()<<"日"<<endl;
        cout <<"身份证号为:"<<ID_number<<endl;
    }


Test1.cpp

#include<iostream>
#include"Personnel.h"
#include"Personnel.cpp"
#include"date.h"
#include"Date.cpp"

//大灬白 A12345678 2000 7 7 123412345678901234
int main (){
    string name;
    string serialNumber;
    Sex sex = male;
    Date birthday1;
    long long ID_number;
    int year;
    int month;
    int day;
    cout<<"请输入职员的姓名、编号、出生日期、身份证号:"<<endl;
    cin>>name;
    cin>>serialNumber;
    cin>>year>>month>>day;
    cin>>ID_number;
    birthday1.setYear(year);
    birthday1.setMonth(month);
    birthday1.setDay(day);
    Personnel person1(name,serialNumber,sex,birthday1,ID_number);
    person1.show();
    person1.officeTime();

    Personnel person2(person1);
    Date birthday2(1998,11,11);
    person2.setBirthday(birthday2);
    person2.setName("小花");
    person2.setSerialNumber("A87654321");
    person2.setSex(female);
    person2.setID_number(123456199811115678);
    person2.show();
    person2.officeTime(8,30);
    return 0;
}


【实验结果】


在这里插入图片描述



题目2

设计类Computer,CPU,RAM,InputDevice,OutputDevice,为每个类设计必要的成员变量/成员函数/构造函数等,通过类的组合进行使用,生成Computer的对象并进行操作。


源代码:

Second.cpp

#include<iostream>
using namespace std;

/*CPU类*/
class CPU{
public:
    void setClockSpeed(int c){ clockSpeed = c; }
    void setWordLength(int w){ wordLength = w; }
    int getClockSpeed(){ return clockSpeed; }
    int getWordLength(){ return wordLength; }
    void showCPU(){
        cout <<"主频为:"<<clockSpeed<<"GHz  ";
        cout <<"字长为:"<<wordLength<<"位"<<endl;
    }
private:
    int clockSpeed;//4.0GHz
    int wordLength;//64位
};


/*RAM类*/
class RAM{
public:
    RAM(){}
    RAM(int m){
        memory = m;
    }
    void setRAM(int m){ memory = m; }
    int getRAM(){ return memory; }
    void showRAM(){
        cout <<"运行内存为:"<<memory<<"G"<<endl;
    }
private:
    int memory;
};

/*输入设备类*/
class InputDevice{
public:
    InputDevice(){
    }
    void setIn(){
        int i;
        cin >> i;
        in = i;
    }
    int getIn(){ return in; }
private:
    int in;
};

/*输出设备类*/
class OutputDevice{
public:
    OutputDevice(){}
    OutputDevice(int o){
        out = o;
    }
    void setOut(int o){ out = o; }

    void show(){
        cout <<out;
    }
private:
    int out;
};


Test2.cpp

#include<iostream>
#include <stdlib.h>
#include <string.h>
#include"Second.cpp"
using namespace std;

/*计算机类*/
class Computer{
public:
    Computer(){}
    Computer(CPU c,RAM r,InputDevice i,OutputDevice o){
        cp = c;
        ra = r;
        inputDe = i;
        outputDe = o;
        cout <<"Computer构造函数:计算机开机......"<<endl;
    }

    /*计算机的计算函数*/
    void calculator(){
        int n = 1;
        while(n){
            cout<<"进入计算机计算功能,请输入需要计算的数:"<<endl;
            string str;
            cin >>str;//输入字符串
            const char *d = "+-*/";//分隔符
            char *p;//分割后的字符指针
            char charArray[10];//字符数组
            strcpy(charArray,str.c_str());//strncpy(charArray, str.c_str(), 10);
            //int length = str.copy(charArray,9);
            //charArray[length] = '\0';
            int intArray[10];//转换后的数字数组
            int j = 0;
            p = strtok(charArray,d);//分割
            while(p != NULL){
            intArray[j] = atoi(p);//类型转换:字符型转换成整型
            p=strtok(NULL,d);
            j++;
        }
        if(str.find("+",0)!=string::npos){//加法运算
            int result = intArray[0] + intArray[1];
            cout <<intArray[0]<<" + "<<intArray[1]<<" = "<<result<<endl;
        }
        if(str.find("-",0)!=string::npos){//减法运算
            int result = intArray[0] - intArray[1];
            cout <<intArray[0]<<" - "<<intArray[1]<<" = "<<result<<endl;
        }
        if(str.find("*",0)!=string::npos){//乘法运算
            int result = intArray[0] * intArray[1];
            cout <<intArray[0]<<" * "<<intArray[1]<<" = "<<result<<endl;
        }
        if(str.find("/",0)!=string::npos){//除法运算
            double result = (double)intArray[0] / (double)intArray[1];
            cout <<intArray[0]<<"/"<<intArray[1]<<"="<<result<<endl;
        }
        cout<<"是否继续使用计算机计算,输入:1、继续计算  0、退出计算"<<endl;
        cin >>n;
        while(n!=1 && n!=0){
        cout <<"输入指令错误,请重新输入,输入:1、继续计算  0、退出计算"<<endl;
        cin >>n;
        }
        cout <<endl;
      }
    }

    ~Computer(){ cout <<"Comouter析构函数:计算机关机......"<<endl; }

private:
    CPU cp;
    RAM ra;
    InputDevice inputDe;
    OutputDevice outputDe;
};

int main(){
    int temp;
    CPU c;
    RAM r;
    InputDevice in;
    OutputDevice out;

    cout <<"您正在输入设备中,请输入CPU的主频为:"<<endl;
    in.setIn();
    temp = in.getIn();
    c.setClockSpeed(temp);

    cout <<"您正在输入设备中,请输入CPU的字长为:"<<endl;
    in.setIn();
    temp = in.getIn();
    c.setWordLength(temp);

    cout <<"您正在输入设备中,请输入RAM的运行内存为:"<<endl;
    in.setIn();
    temp = in.getIn();
    r.setRAM(temp);

    Computer com(c,r,in,out);
    com.calculator();//计算机的计算功能

    cout <<"您正在输出设备中,输出CPU的主频为:"<<endl;
    temp = c.getClockSpeed();
    out.setOut(temp);
    out.show();
    cout <<"GHz"<<endl;

    cout <<"您正在输出设备中,输出CPU的字长为:"<<endl;
    temp = c.getWordLength();
    out.setOut(temp);
    out.show();
    cout <<"位"<<endl;

    cout <<"您正在输出设备中,输出RAM的运行内存为:"<<endl;
    temp = r.getRAM();
    out.setOut(temp);
    out.show();
    cout <<"G"<<endl;
    return 0;
}


【实验结果】


在这里插入图片描述


【小结或讨论】


本次实验是实验四、类和对象(2),主要要求包括:实现构造函数和析构函数、复制构造函数、内联成员函数、带默认形参值的成员函数、类的组合等,总体难度不大,就是比较繁琐。

在写第一题时,引入了Date.cpp、Personnel.cpp、Test1.cpp三个C++文件和Date.h、Personnl.h两个头文件。但当我在Test1.cpp中进入了Date.h、Personnl.h两个头文件之后,调用Date.cpp、Personnel.cpp中实现的函数却报了没有定义的错,后来又反复看了书上是这样调用的,刚开始一直没有解决,后来我又在主文件Test1.cpp中引入了Date.cpp、Personnel.cpp两个文件就解决了问题。这里codeblocks和书上的调用方式好像不一样,可能codeblocks认为我在.h头文件中只是声明了函数,在调用时必须要定义,所以要引入.cpp文件中函数的实现,可能是codeblocks独有的特点吧。

第二题计算机类没什么太难的地方,就是需要自己去构思设计有点脑壳疼,之后就是把5个类组合起来,我是把所有的值都通过输入设备输进来,再通过输出设备输出其他三个类的值。计算机的功能我就设计了计算,先输入加减乘除(±

/)四则运算的字符串,再通过strtok()函数的分割和atoi()函数的转换,将字符串装换成整型进行运算,最后输出结果。过程中就是指针运用有点忘了,在用atio函数:int atio(const char

)时,刚开始传值*p,编译器给我报错不能把字符型传给字符指针,我还一脸懵逼,后来才突然发觉要传值p,整个字符串进行四则运算并不复杂,只是其中的字符串分割、各种类型转换和指针符号还要多细心注意细节。



版权声明:本文为Onlyone_1314原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。