C++实验六——数组、指针与字符串

实验报告

【实验名称】 实验六 数组、指针与字符串
【实验内容】

题目1

改造实验五中的Player类,为每个Player增加种族(门派、或其他类似属性)。在构造函数中,随机指定其种族(自行查阅C++中的随机数生成方法)及其他各项属性。在主函数中生成Player对象数组,并统计每个种族的玩家数量。

Player.h

#ifndef _Player_H_
#define _Player_H_
#include "Player.h"
#include <time.h> using namespace std; enum Sex{male,female}; enum Race{mankind,animal,angle,demon};

class Player{ public:
    Player();
    Player(string name , string password , int age = 0, Sex sex = male, string e_mail = NULL);
    static int getPlayerNumber(){ return playerNumber; } //返回当前注册玩家数量
    string getTime(){ return registerTime; } //返回注册时间
    void displayInformation(); //显示玩家信息
    void changeInformation();  //修改玩家信息
    void play(); //开始游戏
    static void statistics();//统计玩家种族数量,性别数量

private:
    void setTime();  //设置注册时间

    static int mankindNumber; //人族玩家数量
    static int animalNumber; //兽族玩家数量
    static int angleNumber;  //天使族玩家数量
    static int demonNumber; //恶魔族玩家数量
    static int maleNumber;  //男性玩家数量
    static int femaleNumber; //女性玩家数量
    static int playerNumber;  //所有注册玩家的数量
    string registerTime;  //注册时间
    static int IDgrowth; //ID号的增长
    int ID;  //唯一玩家ID号
    int grade;       //等级
    int experience;  //经验
    Race race;  //种族

    string name;   //用户名
    string password;  //密码
    int age;      //年龄
    Sex sex;    //性别
    string e_mail;    //邮箱 };

#endif

Player.cpp

#include<iostream>
#include<stdlib.h>
#include"Player.h"
using namespace std;

int Player::playerNumber = 0; //玩家数量
int Player::IDgrowth = 10000; //ID号起始号
int Player::mankindNumber = 0; //人族玩家数量
int Player::animalNumber = 0; //兽族玩家数量
int Player::angleNumber = 0;  //天使族玩家数量
int Player::demonNumber = 0; //恶魔族玩家数量
int Player::maleNumber = 0;  //男性玩家数量
int Player::femaleNumber = 0; //女性玩家数量

  Player::Player(){
      IDgrowth = IDgrowth + rand()%11;
      ID = IDgrowth;
      int temp1;
      temp1 = rand()%4;
      switch(temp1){
          case 0 :
            race = mankind;
            mankindNumber++;
            break;
          case 1 :
            race = animal;
            animalNumber++;
            break;
          case 2 :
            race = angle;
            angleNumber++;
            break;
          case 3 :
            race = demon;
            demonNumber++;
            break;
      }
      int temp2;
      temp2 = rand()%2;
      switch(temp2){
          case 0 :
            sex = male;
            maleNumber++;
            break;
          case 1 :
            sex = female;
            femaleNumber++;
            break;
      }
      grade = 0;
      experience = 0;
      setTime();
      playerNumber++;
  }

  Player::Player(string name , string password , int age , Sex sex , string e_mail){
      this->name = name;
      this->password = password;
      this->age = age ;
      this->sex = sex;
      this->e_mail = e_mail;
      IDgrowth = IDgrowth + rand()%11;
      ID = IDgrowth;
      grade = 0;
      experience = 0;
      setTime();
      playerNumber++;
  }

  void Player::setTime()  //获取当前时间,作为注册时间
      {
        time_t timep;
        time (&timep);
        char tmp[64];
        strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S",localtime(&timep) );
        registerTime = tmp;
     }

/*显示玩家信息
*/
  void Player::displayInformation(){
      cout <<ID<< "号玩家信息如下:" <<endl;
      cout << "玩家姓名:" << name <<endl;
      cout << "唯一ID号: " << ID <<endl;
      cout << "注册时间: " << registerTime <<endl;
      cout << "玩家等级: " << grade <<endl;
      cout << "玩家目前的经验: " << experience <<endl;
      cout << "玩家年龄: " << age <<endl;
      cout << "玩家性别: ";
      switch(sex){
          case 0:
            cout<< "男生" <<endl;
            break;
          case 1:
            cout<< "女生" <<endl;
            break;
      }
      cout << "玩家的邮箱: " << e_mail <<endl;
  }


/*修改玩家信息
*/
  void Player::changeInformation(){
      int n = 1;
      while(n){
      cout << "请输入您需要修改的信息编号:0、用户名 1、密码: 2、性别 3、邮箱" <<endl;
      int m;
      string str;
      cin >>m;
      switch(m){
          case 0:
              cout<<"请输入新的用户名:"<<endl;
              cin >>str;
              name = str;
              break;
              break;
          case 1:
              cout<<"请输入新的密码:"<<endl;
              cin >>str;
              password = str;
              break;
          case 2:
            cout<<"请输入性别:男生 or 女生"<<endl;
            cin >>str;
            if(str == "男生") {
                    sex = male;
                    cout <<"性别修改为男生"<<endl;
            }
            if(str == "女生") {
                    sex = female;
                    cout <<"性别修改为女生"<<endl;
            }
            break;
          case 3:
            cout<<"请输入新的邮箱:"<<endl;
            cin >>str;
            e_mail = str;
            cout <<"邮箱修改为:"<< e_mail <<endl;
      }
      cout <<"是否要继续修改信息: 0、退出修改  1、继续修改"<<endl;
      cin>>n;
      }
  }

/*开始游戏
*/
  void Player::play(){ //
      cout << "尊贵的  " <<name<< "  玩家进入游戏" <<endl;
  }

/*统计玩家种族数量,性别数量
*/
void Player::statistics(){
      cout<<"统计每个种族的玩家数量:"<<endl;
      cout<<"人族玩家数量为:"<<mankindNumber<<endl;
      cout<<"兽族玩家数量为:"<< animalNumber <<endl;
      cout<<"天使族玩家数量为:"<<angleNumber<<endl;
      cout<<"恶魔族玩家数量为:"<<demonNumber<<endl;
      cout<<"统计每个性别的玩家数量:"<<endl;
      cout<<"男性玩家数量为:"<<maleNumber<<endl;
      cout<<"女性玩家数量为:"<<femaleNumber<<endl;
  }

Main.cpp

#include<iostream>
#include"Player.h"
#include"Player.cpp"
using namespace std;

int main(){
    srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面不然要很长时间等待
    Player player1("大灬白","A12345678",20,male,"qq1234567@qq.com");
    player1.displayInformation();
    player1.changeInformation();
    player1.displayInformation();
    player1.play();
    cout<<endl;
    Player array[1000];
    cout<<"目前的注册玩家数量为:"<<Player::getPlayerNumber()<<endl;
    Player::statistics();
    return 0;
}

【实验结果】
在这里插入图片描述

题目2

不使用现成的string以及字符串操作函数,自行设计一个字符串类,类中的字符串使用字符指针进行描述,设计常见的字符串操作函数,在主程序中进行测试,并尽量增强其功能。

SetString.cpp

#include<iostream>
#include<stdio.h>
using namespace std;

class SetString{
public:
    SetString(){}
    SetString(const char *c){
        setStrcpy(array,c);
        length = 0;
        while(this->array[++length]!='\0');
    }

    SetString(const char *c,const int length){
        setStrcpy(array,c);
        this->length = length;
    }

/*
strcpy(char * , char *)字符串复制函数
*/
    char* setStrcpy(char * strDest,const char * strSrc)
    {
    if ((NULL==strDest) || (NULL==strSrc))
    //抛出异常
    throw "Invalid argument(s)";
    char * strDestCopy = strDest;
    while ((*strDest++=*strSrc++)!='\0');
    return strDestCopy;
    }

/*
*字符查找函数:查找某个字符在数组中的位置
*/
    int setFind(const char a,const int start){
        int i;
        for(i = start;i<length;i++) {
                if( array[i] == a ){
                cout<<"在"<<array<<"中查找"<<a<<"的位置为:"<<i+1<<endl;
                return i;
                }
        }
        cout<<"所要查找的字符不存在!"<<endl;
        return -1;
    }

/*字符连接函数*/
    void setStrcat(SetString &s){
        int i = 0;
        int j = 0;
        //查找字符串1的末尾
        while(this->array[++i]!='\0');
        while(s.array[j]!='\0') {
                this->array[i++] = s.array[j++];
        }
        array[i]='\0';
        cout<<"连接后字符数组中的值为:"<<array<<endl;
    }

    void output(){
        cout<<"输出字符数组的长度:"<<length<<endl;
        cout<<"输出字符数组中的值:"<<array<<endl;
    }

/*获取子字符串*/
char* setSubstr( int offset, int length)
{

    int real_length = ((this->length - offset) >= length ? length : (this->length - offset));//判断srcstr的长度减去需要截取的substr开始位置之后,剩下的长度
    //是否大于指定的长度length,如果大于,就可以取长度为length的子串
    //否则就把从开始位置剩下的字符串全部返回。
    char* tmp = array+offset;
    tmp[real_length] = '\0';
    cout<<"从"<<array<<"数组的第"<<offset<<"个位置开始"<<"截取"<<length<<"个字符的字符数组为:"<<tmp<<endl;
    return tmp;
}

private:
    //输入的字符数组
    char array[100];
    char * str;
    //数组中字符的长度
    int length;
};


int main(){
    SetString str1("ABC");
    //字符串复制
    SetString str2("a12345678",9);
    str2.output();
    //字符查找函数
    str2.setFind('6',0);
    //字符连接函数
    str1.setStrcat(str2);
    //获取子字符串
    str2.setSubstr(4,5);
    return 0;
}

【实验结果】
在这里插入图片描述

【小结或讨论】
本次实验是实验六 数组、指针与字符串,第一题主要是伪随机函数的使用,通过使用srand((unsigned)time(NULL))来使随机数列随当前系统时间而变化,之后统计各个种族,每种性别的人数,声明了多个对应的静态变量来记录各个种族、每种性别的人数。第二题不使用现成的string以及字符串操作函数,自行设计一个字符串类,类中的字符串使用字符指针进行描述,设计常见的字符串操作函数。主要设计了字符串复制、字符查找、字符连接、获取子字符串等函数,通过字符指针和字符数组来操纵字符串,实验过程中更加深刻的理解了指针的使用方法,以及对野指针、指针异常处理的了解,指针虽然用起来非常的方便和强大,但使用的时候也要多加小心注意。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值