【实验名称】 实验四 类和对象(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,整个字符串进行四则运算并不复杂,只是其中的字符串分割、各种类型转换和指针符号还要多细心注意细节。