当前位置:编程学习 > C/C++ >>

关于C++编程

创建一个Client类。
要求:
(1)包含有字符型数组成员变量m_name(姓名),整型成员变量m_age(年龄)、m_type(客户类别,包括1、2、3三种类别)。
(2)包含一个带参的构造函数用来初始化每个数据成员以及一个无参的构造函数将所有成员变量都初始化为默认值。
(3)包含成员函数SetName(char *pName)和GetName()用来设置姓名和得到姓名。
(4)包含成员函数SetType(int type)和GetType()用来设置和得到客户类别。
(5)设计一个普通函数display(Client c),通过调用Client类相应的成员函数将客户信息显示出来。
(6)设计主函数main(),测试Client类以及display()函数。

然后,
1)增加一个静态成员函数CmpName(Client c1,Client c2),功能是比较两个Client类对象c1和c2的成员变量m_name的大小(字母表顺序)。2)编写一个普通函数sort(Client *pc, int n),功能是将包含n个Client类对象的数组,按照姓名的升序排序。
3)再编写一个主函数main(),接收用户输入的不确定个数的客户信息,按照姓名的升序排序后输出。

答案:首先来说一下楼上的ServiceBoy的错误之处,在于SetName函数,看一下我的测试代码:

void main()
{
 Client c;
 char* name = new char[10];
 char* n = "testname";
 memcpy(name, n, strlen(n)+1);
  c.SetName(name);
 c.Display(c);
 delete[] name; //在这里没有对c对象做任何处理,仅对动态分配的字符进行释放
     //然后再次显示c
 c.Display(c);
}

 

测试结果如下:

还有普通函数我想应该不是成员的函数,而就是一个普通的函数,并且主函数测试任意个对象的时候楼上的限制在10个以内,这是不应该的。

我给您写了个结果如下:

 

//类

class Client
{
public:
 //不带参数构造函数
 Client()
 {
  m_name = NULL;
  m_age = 0;
  m_type = 1;
 }
 //带参数构造函数
 Client(const char* name, unsigned int age, unsigned int type)
 {
  if(NULL != name)
  {
   m_name = new char[strlen(name)+1];
   strcpy(m_name, name);
  }
  else
  {
   m_name = NULL;
  }
  m_age = age;
  m_type = type;
 }
 //复制口早函数
 Client(const Client& c)
 {
  m_name = new char[strlen(c.GetName())+1];
  strcpy(m_name, c.GetName());
  SetType(c.GetType());
  SetAge(c.GetAge());
 }

 //重载=运算符
 Client& operator=(const Client& c)
 {
  SetName(c.GetName());
  SetType(c.GetType());
  SetAge(c.GetAge());
  return *this;
 }

 //析构函数
 ~Client()
 {
  if(NULL != m_name)
  {
   delete[] m_name;
  }
 }
 
 void SetName(const char* name)
 {
  if(NULL == name)
  {
   if(NULL != m_name)
   {
    delete [] m_name;
   }
   m_name = NULL;
   return;
  }
  if(NULL != m_name)     //如果原来已经有名字,则释放
  {
   delete[] m_name;
  }
  m_name = new char[strlen(name)+1]; //重新为名字分配空间
  strcpy(m_name, name);
 }
 
 char* GetName() const
 {
  return m_name;
 }
 
 void SetType(int type)
 {
  m_type = type;
 }
 
 int GetType() const
 {
  return m_type;
 }

 void SetAge(int age)
 {
  m_age = age;
 }

 int GetAge() const
 {
  return m_age;
 }

 static int CmpName(Client c1, Client c2)
 {
  return strcmp(c1.GetName(), c2.GetName());
 }

private:
 char* m_name;
 unsigned int m_age;
 unsigned int m_type;
};

void Display(const Client& c)
{
 cout<<"客户姓名:";
 if(NULL != c.GetName())
  cout<<c.GetName()<<endl;
 else
  cout<<endl;
 cout<<"客户年龄:"<<c.GetAge()<<endl;
 cout<<"客户类型:"<<c.GetType()<<endl;
}

void sort(Client* pc, int number)
{
 for(unsigned int i=0; i<number-1; ++i)
 {
  for(unsigned int j=i+1; j<number; ++j)
  {
   if(1 <= Client::CmpName(pc[i], pc[j]))
   {
    Client tmp = pc[i];
    pc[i] = pc[j];
    pc[j] = tmp;
   }
  }
 }
}
//主函数:

void main()
{
 cout<<"不带参数构造函数:"<<endl;
 Client c;
 Display(c);
 int age, type;
 char name[16] = {0};
 cout<<"设置姓名:";
 cin>>name;
 c.SetName(name);
 cout<<"设置年龄:";
 cin>>age;
 c.SetAge(age);
 cout<<"设置类型:";
 cin>>type;
 c.SetType(type);
 cout<<"设置之后:"<<endl;
 Display(c);
 unsigned int number = 0;
 cout<<"请输入员工个数:\n";
 cin>>number;
 Client* clients = new Client[number]; //动态分配用户输入的个数
 
 cout<<endl<<"以下带参数构造函数"<<endl;
 unsigned int i=0;
 for(i=0; i<number; ++i)
 {
  char name[10] = {0};
  unsigned int age;
  unsigned int type;
  cout<<"目前是第"<<i+1<<"人:";
  cout<<"请输入姓名:";
  cin>>name;
  cout<<"请输入年龄:";
  cin>>age;
  cout<<"请输入类型:";
  cin>>type;
  clients[i] = Client(name, age, type);
 }

 cout<<"Before sort"<<endl;
 for(i=0; i<number; i++)
 {
  Display(clients[i]);
 }
 
 sort(clients, number);
 
 cout<<"After sort"<<endl;
 for(i=0;i<number;++i)
 {
  Display(clients[i]);
 }
 delete[] clients;    //释放
 cin>>number;
}

我编写了一个头文件:Client.h——

#include "iostream.h"
#include "string.h"

 

class Client
{
private:
 char *m_name;
 unsigned int m_age;
 unsigned int m_type;

public:
 /*带参和不带参构造函数*/
 Client()
 {
  m_name=NULL;
  m_age=0;
  m_type=1;
 }
 Client(char *name,unsigned int age,unsigned int type)
 {
  m_name=name;
  m_age=age;
  m_type=type;
 }

 /*普通函数*/

 void SetName(char *name)
 {
  m_name=name;
 }

 char* GetName()
 {
  return m_name;
 }


 void SetType(int type)
 {
  m_type=type;
 
 }

 int GetType()
 {
  return m_type;
 }

 void Display(Client c)
 {
  cout<<"客户姓名:"<<c.m_name<<endl;
  cout<<"客户年龄:"<<c.m_age<<endl;
  cout<<"客户类型:"<<c.m_type<<endl;
 }
 static int CmpName(Client c1,Client c2)
 {
  return strcmp(c1.GetName(),c2.GetName());
 }

 void Sort(Client* pc,unsigned int number)
 {
  for (unsigned int i=0;i<number-1;++i)
  {
   pc = pc+i;

   for (unsigned int j=i+1;j<number;++j)
   {
    
    if(CmpName(*pc,*(pc+j))>1)
    {
     //如果前者大于后者,则拷贝后者
     Client c;
     c.m_age= (*(pc+j)).m_age;
     c.m_name=(*(pc+j)).m_name;
     c.m_type=(*(pc+j)).m_type;

     (*(pc+j)).m_age=(*pc).m_age;
     (*(pc+j)).m_name=(*pc).m_name;
 &n

上一个:如何学好C++语言软件编程?
下一个:C++提取网页信息

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,