题目描述
编写程序,实现某旅馆的客人住宿记录功能。
定义一个Customer类,要求输入客人的姓名,创建一个Customer对象。
类声明如下:
调用类的Display函数输出客人ID(输出顺序号占4位,如第1位为0001,第2位为0002,依此类推)、姓名、总人数。总人数和客人租金用静态成员,其他属性采用普通的数据成员。
输入
输入测试次数t
对于每次测试,首先输入当前年份,
接下来依次输入顾客姓名,0表示输入结束。
输出
每行依次输出顾客信息和旅馆信息。包括顾客姓名,顾客编号,旅馆入住总人数,旅馆当前总收入。
输入样例1
2
2014
张三 李四 王五 0
2015
Cindy David 0
输出样例1
张三 20140001 1 150
李四 20140002 2 300
王五 20140003 3 450
Cindy 20150004 4 600
David 20150005 5 750
思路分析
这道题考查的细节比较多,下面讲讲我遇到了一些问题及解决方法。
首先类声明已经给出来了,这意味着我们不能再去修改类声明。
类声明中有静态数据成员,首先想到的一个问题就是,怎么修改这个静态数据成员,当时知识点掌握的不是很好啊,后来才知道它的访问权限和普通数据成员是一样的,只不过,它必须得在类对象创建之前就要被定义。
还有一个静态函数啊,静态函数只能访问到静态数据成员,无法直接访问非静态数据,必须通过类对象去访问非静态数据。
注意到类声明中的带参数构造函数的参数是一个char指针,函数体中必须给它new一个新内存出来啊,不然跑起来是会出事的。
还有这个一直读取问题,就先循环去读,读到0就break出来。
AC代码
#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
class Customer
{
public:
Customer(char *name);
~Customer();
static void changeYear(int r);
void Display();
private:
static int TotalCustomer;
static int Rent;
static int Year;
int CustID;
char *CustName;
};
int Customer::TotalCustomer=0;
int Customer::Rent=150;
int Customer::Year=2014;
Customer::Customer(char *name):CustID(TotalCustomer+1)
{
TotalCustomer++;
CustName=new char[10];
strcpy(CustName,name);
};
Customer::~Customer(){delete CustName;Rent+=150;}
void Customer::Display()
{
cout<<CustName<<' '<<Year<<setfill('0')<<setw(4)<<CustID<<' '<<TotalCustomer<<' '<<Rent<<endl;
}
void Customer::changeYear(int r)
{
Year=r;
}
int main()
{
char name[10];
int year,t;
cin>>t;
while(t--)
{
cin>>year;
while(1)
{
cin>>name;
if(strcmp(name,"0")==0)
break;
Customer customer(name);
customer.changeYear(year);
customer.Display();
}
}
}