C++题目练习01

类设计练习

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 栈类,约定:

  1. 封装数据和操作
  2. 数据成员为私有属性,包括:
    data :保存栈内元素,栈元素类型为 int
    tt : 指示栈顶位置
    len : 当前栈空间的大小
  3. 成员函数为公有属性,包括:
  • 默认构造函数,完成初始化动作,栈的默认大小是 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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值