實驗報告
- 題目1
- 題目2
【實驗名稱】 實驗六 陣列、指標與字串
【實驗內容】
題目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以及字串操作函式,自行設計一個字串類,類中的字串使用字符指標進行描述,設計常見的字串操作函式,主要設計了字串復制、字符查找、字符連接、獲取子字串等函式,通過字符指標和字符陣列來操縱字串,實驗程序中更加深刻的理解了指標的使用方法,以及對野指標、指標例外處理的了解,指標雖然用起來非常的方便和強大,但使用的時候也要多加小心注意,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229309.html
標籤:其他
上一篇:2020-12-02
下一篇:C語言小游戲——小熊跳板
