类设计练习
1.1 定义Tree类
定义一个Tree(树)类,有成员 Age(树龄),成员函数 grow(int years) 对 age 加上 years,age() 显示 Tree 对象的 age 的值。
#include <iostream>
using namespace std;
class Tree
{
public:
void setages(int n);
void age();
int grow(int years);
private:
int a = 0;
};
void Tree::setages(int n)
{
a = a + n;
}
int Tree::grow(int years)
{
a = a + years;
return a;
}
void Tree::age()
{
cout << a << endl;
}
int main()
{
Tree t;
t.setages( 3 );
t.age();
t.grow( 20 );
t.age();
return 0;
}
1.2 定义点类Point
定义点类 Point,其中有数据成员 x 和 y,表示点的横坐标与纵坐标。成员函数 double Distance( const Point & ) 的功能是求两点之间的距离。
#include <iostream>
#include <cmath>
using namespace std;
class Point
{
public:
double Distance(const Point &n);
void setPoint();
private:
double x;
double y;
};
void Point::setPoint()
{
cin >> x >> y;
}
double Point::Distance(const Point &n)
{
double d;
d = pow((x-n.x),2) + pow((y-n.y),2);
return sqrt (d);
}
int main() {
Point a, b;
a.setPoint(); // 这里读入a点的横坐标、纵坐标
b.setPoint(); // 这里读入b点的横坐标、纵坐标
cout << a.Distance( b ) << endl;
return 0;
}
1.3 编写一个stack类.part.1
编写一个 stack 栈类,约定:
- 封装数据和操作
- 数据成员为私有属性,包括:
data :保存栈内元素,栈元素类型为 int
tt : 指示栈顶位置
len : 当前栈空间的大小 - 成员函数为公有属性,包括:
- 默认构造函数,完成初始化动作,栈的默认大小是 1000。 最后输出一行:constructing
- 析构函数只输出一行:destructing
- top( &v ),函数返回如果为真,参数 v 带回栈顶元素的值;函数返回如果为假,参数 v 的值没有变化
- pop(),如果栈不空,弹走栈顶元素;如果栈空,没有动作
- push( v ),如果栈已满,没有动作;如果栈未满,参数 v 的值进栈
- size(),返回当前栈内元素个数,如果栈空,返回 0
- output(),自栈底到栈顶,输出栈内元素,每一个元素后面跟一个空格,作为分隔。最后换行。如果栈空,没有输出
输入描述
本题需要解释执行的 5 种命令定义如下:
- 1 a :表示把元素 a 压入栈
- 2 :表示弹走栈顶元素
- 3 :表示读取栈顶元素的值
- 4 :表示取得当前栈内元素的个数
- 5 :表示调用 output() 函数
第一行是命令的数量 n
接下来 n 行,每行是一条命令
输出描述
对第 3、4、5 类命令,输出一行:该命令对应取得的结果
#include<iostream>
using namespace std;
class myStack
{
public:
myStack ();
void push(int v);
void pop();
bool top(int &v);
int size();
void output();
~myStack();
private:
int data[1000];
int tt;
int len;
};
myStack::myStack ()
{
len=1000;
tt=-1;
cout << "constructing" << endl;
}
void myStack::push(int v)
{
if(tt<len-1)
{
tt++;
data[tt]=v;
}
}
bool myStack::top(int &v)
{
v=data[tt];
return true;
}
void myStack::pop()
{
if(tt>=0)
tt--;
}
int myStack::size()
{
return tt+1;
}
void myStack::output()
{
int n;
if(tt==-1)
return;
else
{
for(n=0;n<=tt;n++)
cout<<data[n]<<" ";
cout<<endl;
}
}
myStack::~myStack()
{
cout<<"destructing"<<endl;
}
int main()
{
myStack s;
int n;
cin>>n;
while(n--)
{
int op;
cin>>op;
switch (op)
{
case 1:
int a;
cin>>a;
s.push(a);
break;
case 2:
s.pop();
break;
case 3:
int t;
s.top(t);
cout << t << endl;
break;
case 4:
cout<<s.size()<<endl;
break;
case 5:
s.output();
break;
default:
break;
}
}
return 0;
}
1.4 设计整型链表类List
设计一个整型链表类 List,能够实现链表节点的插入 insert() 、按位置删除节点 deleteByPos() 、按值删除节点 deleteByVAlue() ,以及链表数据的输出操作 print()。
#include <iostream>
using namespace std;
/// 节点的结构
struct Node {
int data;
Node *next;
Node() {
data = 0;
next = nullptr;
}
~Node() { }
};
/// 链表类
class List
{
private:
Node *head;
public:
List()
{
head=new Node;
}
void insert(int n,int m)
{
Node *p,*q;
p = head;
int i;
if(p!=nullptr)
{
for(i=0;i<=n;++i)
{
if(p->next == nullptr)
{
p->next = new Node;
}
p = p->next;
}
}
else
{
return;
}
q = new Node;
q->data = m;
q->next=p->next;
p->next = q;
}
void deleteByPos(int pos)
{
Node *p,*q;
p=head;
int i=0;
if(p!=nullptr)
{
while(i<pos)
{
p = p->next;
++i;
}
}
q = p->next;
p->next = q->next;
delete q;
}
void deleteByValue(int value)
{
Node *p,*q;
p=head;
if(p!=nullptr)
{
while(p->next->next)
{
p=p->next;
if(p->next->data == value)
{
q = p->next;
p->next = q->next;
delete q;
return ;
}
}
}
cout<<"not found data: "<<value<<endl;
}
void print()
{
Node *p = head->next;
while(p->next)
{
p = p->next;
cout<<p->data<<" ";
}
cout<<endl;
}
~List()
{
Node *p,*q;
p=head;
while (p)
{
q = p->next;
delete p;
p = q;
}
}
};
int main()
{
List l1; /// 创建一个空链表对象 l1
l1.insert( 0, 10 ); /// 在第 0 个节点的后面插入值为 10 的新节点,也即在链表头部插入新的节点
l1.insert( 0, 66 );
l1.insert( 1, 292 ); /// 在第 1 个节点的后面插入值为 10 的新节点
l1.print( ); /// 从头到尾输出链表节点的值,每个值后跟一空格
l1.deleteByValue( 66 ); /// 删除链表中第一个值为 66 的节点
l1.print( );
l1.insert( 2, -2 ); /// 在第 2 个节点的后面插入值为 -2 的新节点
l1.insert( 1, 3 ); /// 在第 1 个节点的后面插入值为 3 的新节点
l1.print( );
l1.deleteByPos( 2 ); /// 删除链表中第2个位置的节点,那么“3”就被删掉了
l1.print( );
l1.deleteByValue( 999 );
l1.print( );
return 0;
}
1.5 设计工人类Worker
设计工人类 Worker,它具有姓名 name,年龄 age,工作部门 Dept,工资 salary,等数据成员。
其中,salary 是 Salary 类的一个对象。
下面的程序拟完成 Worker 类的设计并用静态成员统计工人的人数,请把程序补充完整。
提示:这里成员函数 setXX() 用于设置各分项数据,成员函数 getXX() 用于获取各分项数据,XX 代表数据成员,如 age 对应的成员函数则为 setAge() 和 getAge() 。
#include <iostream>
#include <string>
using namespace std;
class Salary {
private:
double Wage, // 基本工资
Subsidy, // 岗位工资
Rent,// 房租
WaterFee, // 水费
ElecFee; // 电费
public:
// 初始化工资数据的各分项
Salary( double i1, double i2, double i3 = 0, double i4 = 0, double i5 = 0 ) {
Wage = i1;
Subsidy = i2;
Rent = i3;
WaterFee = i4;
ElecFee = i5;
}
Salary( ) { // 初始化工资的各分项数据为0
Wage = Subsidy = Rent = WaterFee = ElecFee = 0;
}
void setWage ( double f ) {
Wage = f;
}
double getWage( ) {
return Wage;
}
void setSubsidy( double f ) {
Subsidy = f;
}
double getSubsidy( ) {
return Subsidy;
}
void setRent( double f ) {
Rent = f;
}
double getRent(){
return Rent;
}
void setWaterFee( double f ) {
WaterFee = f;
}
double getWaterFee( ) {
return WaterFee;
}
void setElecFee( double f ) {
ElecFee = f;
}
double getElecFee( ) {
return ElecFee;
}
// 计算实发工资, 实发工资 = Wage + Subsidy - Rent - WaterFee - ElecFee
double RealSalary( ) {
return Wage + Subsidy - Rent - WaterFee - ElecFee;
}
};
int number=0;
class Worker
{
public:
Worker(string n,int a,string d);
Worker();
void setSalary(double w,double s, double r, double wf,double ef );
double getSalary();
int getNum();
void setName(string n);
void setAge(int a);
void setDept(string d);
string getName();
int getAge();
string getDept();
~Worker();
private:
string name;
int age;
string Dept;
Salary salary;
} ;
Worker::Worker(string n,int a, string d)
{
name = n;
age = a;
Dept = d;
number++;
}
Worker::Worker()
{
number++;
}
void Worker::setSalary(double w,double s, double r, double wf,double ef )
{
salary.setWage(w);
salary.setSubsidy(s);
salary.setRent(r);
salary.setWaterFee(wf);
salary.setElecFee(ef);
}
void Worker::setName(string n)
{
name = n;
}
void Worker::setAge(int a)
{
age = a;
}
void Worker:: setDept(string d)
{
Dept = d;
}
string Worker::getName()
{
return name;
}
int Worker::getAge()
{
return age;
}
string Worker::getDept()
{
return Dept;
}
double Worker::getSalary()
{
return salary.RealSalary();
}
int Worker::getNum()
{
return number;
}
Worker::~Worker()
{
number--;
}
int main(){
Worker w1( "John", 30, "design" );
cout << w1.getSalary() << endl;
Worker w2;
cout << "the total num is: " << w1.getNum() << endl;
w2.setName( "Linda" );
cout << "in w2 the name is: " << w2.getName() << endl;
// 基本工资 岗位工资 房租 水费 电费
w2.setSalary( 100000, 400, 300, 200, 100 );
cout << w2.getSalary() << endl;
return 0;
}