【实验名称】 实验六 数组、指针与字符串
【实验内容】
题目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以及字符串操作函数,自行设计一个字符串类,类中的字符串使用字符指针进行描述,设计常见的字符串操作函数。主要设计了字符串复制、字符查找、字符连接、获取子字符串等函数,通过字符指针和字符数组来操纵字符串,实验过程中更加深刻的理解了指针的使用方法,以及对野指针、指针异常处理的了解,指针虽然用起来非常的方便和强大,但使用的时候也要多加小心注意。