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

【实验目的】

1、练习观察指针的内容及其所指的对象的内容

2、通过动态内存分配实现数组,并体会指针在其中的作用。

3、使用字符数组练习处理字符串的方法。

【实验原理】

C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 '\0' 终止的字符数组。因此一个以 null 结尾的字符串,包含了组成字符串的字符。

【实验内容】

1. 改造实验五中的Player类,为每个Player增加种族。在构造函数中,随机指定各项属性。在主函数中生成Player对象数组,并统计每个种族的玩家数量。

代码(详细解释见注释):

#include<iostream>
#include <time.h>
#include <algorithm>
#include<string>
using namespace std;class player
{
public:player();//数值信息随机生成void character();//特性随机生成void Name();//姓名随机生成void Race();//门派随机生成void show();//成员信息显示static void show_count();//显示人员统计static void show_race();//显示门派统计static void show_chara();//显示特性统计private:string name;//姓名int ages;//年龄string sex;//性别string race;//门派int blood;//血量int IQ;//智识int attack;//攻击int attract;//吸引力int social;//社交int medical;//医疗int plant;//种植string my_character;//特性名称string my_details;//特性描述string my_effect;//特性效果//统计static int count;//风暴峡谷人员总数static int male;//风暴峡谷男性static int female;//风暴峡谷女性static int racee[7];//风暴峡谷门派static int chara[10];//风暴峡谷特性
};int player::count = 0;
int player::male = 0;
int player::female = 0;
int player::racee[7] = { 0,0,0,0,0,0,0 };
int player::chara[10]= { 0,0,0,0,0,0,0,0,0,0 };//显示人员男女统计
void player::show_count()
{cout << "总数\t男\t女" << endl;cout << "|" << count << "\t" << "|" << male << "\t" << "|" << female << "\t" << endl;
}//显示风暴峡谷门派统计
void player::show_race()
{string Kinds[7] = {"苍江派","摩尼教","药王谷","藏墨派","飞白派","八法门","剑锋派"};for (int i = 0; i < 7; i++){cout << Kinds[i] << "\t";}cout << endl;for (int i = 0; i < 7; i++){cout << "|" << racee[i] << "\t";}cout << endl;
}//显示风暴峡谷特性统计
void player::show_chara()
{string Character[10];Character[0] = "冷枪手";Character[1] = "农学家";Character[2] = "仿生学";Character[3] = "乐天派";Character[4] = "悲观者";Character[5] = "倾国城";Character[6] = "丑陋";Character[7] = "聪明秃";Character[8] = "园艺精";Character[9] = "格斗者";for (int i = 0; i < 10; i++){cout << Character[i] << "\t";}cout << endl;for (int i = 0; i < 10; i++){cout << "|" << chara[i] << "\t";}cout << endl;
}//初始化
player::player()
{Name();ages = rand() % 100;if (rand() % 2){sex = "男";male++;}else{sex = "女";female++;}Race();blood = 100;IQ = rand() % 100;attack = rand() % 100;attract = rand() % 100;social = rand() % 100;medical = rand() % 100;plant = rand() % 100;character();count++;
}
//初始化名字
void player::Name()
{string NName[36] = {"百里","北堂","北野","淳于","尉迟","成公","叱干","尉迟","尉迟","上官","陈林","淳于","成公","太史","叱利","常夏","陈梁","陈林","公冶","公羊","完颜","公西","公孟","哥舒","谷梁","谷利","高堂","郭罗","诸葛","呼延","宗政","主父","张包","张简","钟任","仲夏"};name = NName[rand() % 36];return;
}
//初始化门派
void player::Race()
{string Kinds[7] = {"苍江派","摩尼教","药王谷","藏墨派","飞白派","八法门","剑锋派"};int flag = rand() % 7;race = Kinds[flag];racee[flag]++;return;
}//特性随机生成
void player::character()
{string Character[10];string details[10];string effect[10];Character[0] = "冷枪手";Character[1] = "农学家";Character[2] = "仿生学";Character[3] = "乐天派";Character[4] = "悲观者";Character[5] = "倾国城";Character[6] = "丑陋";Character[7] = "聪明秃";Character[8] = "园艺精";Character[9] = "格斗者";details[0] = "的枪法还不错,但ta总是需要比别人花更久来瞄准目标";details[1] = "得益于父亲的熏陶,对于种植的事情他简直是无所不知";details[2] = "感觉作为一个人类能做的太有限了,做梦都在研究先进的仿生学部件";details[3] = "总是对他的情况有种积极的感觉,无论什么时候,无论什么情况";details[4] = "喜欢看生命中糟糕的一面";details[5] = "有着貌美的面庞,人们往往在ta张嘴说话之前就已经被倾倒";details[6] = "外貌太丑陋,那张脸生得好像就是一副现代抽象画";details[7] = "实在是机灵过人,ta学起东西来比谁都快";details[8] = "对园艺有一种特殊的爱好。ta对每种一株植物都会觉得很高兴";details[9] = "格斗技术非常不错,但ta用起远程武器来就会很不开心";effect[0] = "攻击+10";effect[1] = "种植+20";effect[2] = "医疗+8";effect[3] = "社交+10";effect[4] = "社交-10";effect[5] = "吸引力+15";effect[6] = "吸引力-15";effect[7] = "智识+12";effect[8] = "种植+8";effect[9] = "攻击+10";int flag = rand() % 10;my_character = Character[flag];my_details = name + details[flag];my_effect = effect[flag];if (flag == 0){attack = min(100, attack + 10);}else if (flag == 1){plant = min(100, plant + 20);}else if (flag == 2){medical = min(100, medical + 8);}else if (flag == 3){social = min(100, social + 10);}else if (flag == 4){social = max(0, social - 10);}else if (flag == 5){attract = min(100, attract + 15);}else if (flag == 6){attract = max(0, attract - 15);}else if (flag == 7){IQ = min(100, IQ + 12);}else if (flag == 8){plant = min(100, plant + 8);}else if (flag == 9){attack = min(100, attack + 10);}chara[flag]++;
}
//显示成员信息
void player::show()
{cout << "*************************" << endl;cout << "姓名:" << name << endl;cout << "性别:" << sex << endl;cout << "年龄:" << ages << endl;cout << "门派:" << race << endl;cout << "血量槽:" << blood << endl;cout << "智识力:" << IQ << endl;cout << "攻击力:" << attack << endl;cout << "吸引力:" << attract << endl;cout << "社交力:" << social << endl;cout << "医疗力:" << medical << endl;cout << "种植力:" << plant << endl;cout << "特性名称:" << my_character << endl;cout << "特性描述:" << my_details << endl;cout << "特性效果:" << my_effect << endl;
}
int main()
{cout << "**********************************" << endl;cout << "***      欢迎来到风暴峡谷      ***" << endl;cout << "*** 1.显示风暴峡谷成员信息     ***" << endl;cout << "*** 2.显示男女人数             ***" << endl;cout << "*** 3.显示每种特性的人数       ***" << endl;cout << "*** 4.显示每个门派的人数       ***" << endl;cout << "*** 5.退出风暴峡谷             ***" << endl;cout << "**********************************\n" << endl;srand((unsigned)time(NULL));player *peo[200];int ans;cout << "请输入风暴峡谷的人员总数:";cin >> ans;cout << "\n***  随机生成玩家信息完毕  ***" << endl;//输入信息for (int i = 0; i < ans; i++){peo[i] = new player();}int flag;while (true){cout << "\n请选择功能:";cin >> flag;if (flag == 1){//显示风暴峡谷成员信息for (int i = 0; i < ans; i++){peo[i]->show();}cout << endl;}else if (flag == 2){//显示男女人数player::show_count();}else if (flag == 3){//显示每种特性的人数 player::show_chara();}else if (flag == 4){//显示每个门派的人数player::show_race();}else if (flag == 5){//退出cout << "成功退出!" << endl;break;}}return 0;
}

运行演示:

2. 不使用现成的string以及字符串操作函数,自行设计一个字符串类,设计常见的字符串操作函数,在主程序中进行测试。

代码(详细解释见注释):

#include<iostream>
using namespace std;
//字符串类
class STring
{
public:STring(char *c);int len();void add(STring a, STring b);int find(STring a, STring b);void copy(STring a);friend void add();friend void copy();
private:char *ch;
};
//构造函数
STring::STring(char *c)
{ch = (char*)malloc(100);if (c == NULL){ch[0] = '\0';return;}for (int i = 0; i < 100; i++){ch[i] = c[i];}
}
//求长度
int STring::len()
{int num = 0;for(int i=0;;i++){if (ch[i] == '\0')break;num++;}return num;
}
//字符串拼接
void STring::add(STring a, STring b)
{int length1 = a.len();int length2 = b.len();for (int i = 0; i < length1; i++){ch[i] = a.ch[i];}for (int i = length1; i < length1 + length2; i++){ch[i] = b.ch[i - length1];}ch[length1 + length2 + 1] = '\0';
}
//字符串匹配
int STring::find(STring a, STring b)
{int length1 = a.len();int length2 = b.len();int j;for (int i = 0; i < length1; i++){if (a.ch[i] != b.ch[0])continue;j = 0;while (j < length2 && i + j < length1){j++;if (b.ch[j] != a.ch[i + j])break;}if (j == length2)return i;}return -1;
}
//字符串复制
void STring::copy(STring a)
{if (a.ch == NULL)return;for (int i = 0; i < 100; i++){ch[i] = a.ch[i];}
}
//字符串拼接调用
void add()
{char *c1 = (char*)malloc(100);cout << "请输入字符串1:";cin.getline(c1, 100);STring string1(c1);char *c2 = (char*)malloc(100);cout << "请输入字符串2:";cin.getline(c2, 100);STring string2(c2);char *c3 = (char*)malloc(100);STring string3(c3);string3.add(string1, string2);cout <<"拼接后的字符串为:"<< string3.ch << endl;
}
//字符串匹配调用
void find()
{char *c1 = (char*)malloc(100);cout << "请输入母字符串:";cin.getline(c1, 100);STring string1(c1);char *c2 = (char*)malloc(100);cout << "请输入要查找的字符串:";cin.getline(c2, 100);STring string2(c2);int begin = string1.find(string1, string2);if (begin == -1){cout << "未在母串中找到子串" << endl;}else{cout << "子串在母串中的起始位置为:" << begin + 1 << endl;}
}
//字符串复制调用
void copy()
{char *c = (char*)malloc(100);cout << "请输入待拷贝的字符串1:";cin.getline(c, 100);STring string1(c);STring string2(NULL);cout << "复制前:字符串2 = " << string2.ch << endl;string2.copy(string1);cout << "复制后:字符串2 = " << string2.ch << endl;
}int main()
{cout << "****************************" << endl;cout << "***     字符串模拟器     ***" << endl;cout << "*** 1.字符串长度         ***" << endl;cout << "*** 2.字符串拼接         ***" << endl;cout << "*** 3.字符串匹配         ***" << endl;cout << "*** 4.字符串复制         ***" << endl;cout << "*** 5.退出字符串模拟     ***" << endl;cout << "****************************\n" << endl;int flag;while (true){cout << "\n请选择功能:";cin >> flag;//消除回车的影响char ch[1];cin.getline(ch, 1);if (flag == 1){//字符串长度char *c = (char*)malloc(100);cout << "请输入字符串:";cin.getline(c, 100);STring string1(c);cout << "该字符串长度为:" << string1.len() << endl;}else if (flag == 2){//字符串拼接add();}else if (flag == 3){//字符串匹配find();}else if (flag == 4){//字符串复制copy();}else if (flag == 5){//退出cout << "成功退出!" << endl;break;}}return 0;
}

运行演示:

【小结或讨论】

这次的实验难度并不大,整体写起来也比较流畅。稍微有两点我觉得要注意一下。

第一个是题目一中,我一开始使用随机函数生成的时候发现生成的一百个人物的所有属性都是一样的,这就让我很奇怪。之后我上网查询之后发现,原来我多次重复使用了srand((unsigned)time(NULL))这个初始化函数,而程序运行其实是很快的,这就导致所有人的属性都一样。因此我只在主函数开始处设置了初始化,这个问题就顺利解决。

第二个是题目二中,由于我希望读入的字符串中能包括空格,所以我使用了cin.getline函数,这是以回车作为结束标志的。但是我的程序中,功能选择会产生一个回车,这就导致cin.getline直接读入了功能选择的回车而直接结束,为了解决这个,我在功能选择后放了一个缓冲位,专门用来读入多余的回车,这样问题就解决了。

但还是那句话,这样的实验并不科学,一些无聊的“自由发挥”实在没有必要。绝对不是一种值得提倡的方式。

C++实验6 改造实验5中的Player类、自行设计字符串类相关推荐

  1. string 字符串中字符无效_7.3 C++字符串类 | 使用string输出

    C++字符串类 C++提供了一种新的数据类型:字符串类型,它和char,int类型一样,可以用来定义变量,用一个名字代表一个字符序列,这就是字符串变量. 读者需要明白string并不是C++本身具有的 ...

  2. c语言课题设计字符串处理函数报告,C语言输入输出库函数设计实验报告.doc

    C语言输入输出库函数设计实验报告 第 PAGE \* MERGEFORMAT I页 共 SECTIONPAGES \* MERGEFORMAT 1页 华中科技大学计算机科学与技术学院 C语言课程设计报 ...

  3. 液位单闭环实验计算机控制,过程控制实验报告3(液位单闭环实验)

    <过程控制实验报告3(液位单闭环实验)>由会员分享,可在线阅读,更多相关<过程控制实验报告3(液位单闭环实验)(2页珍藏版)>请在人人文库网上搜索. 1.班级:082班 座号: ...

  4. Ecol. Lett. | 生态学实验设计中“梯度实验”和“重复实验”的抉择

    本文转载自"生态学文献分享",已获授权 To replicate, or not to replicate – that is the question: how to tackl ...

  5. 实验二十二 SCVMM中的SQL Server配置文件

    实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...

  6. 实验6 在应用程序中播放音频和视频

    实验报告 课程名称 基于Android平台移动互联网开发 实验日期 2016年4月15日 实验项目名称 设计一个简单登陆界面 实验地点 S3010 实验类型 □验证型    √设计型    □综合型 ...

  7. 凸透镜成像实验软件_论文丨几何光学实验在初中物理教学中的应用

    论几何光学实验在初中物理 教学中的应用 李敏名师工作室   彭虎 摘要:几何光学实验是人们从几何光学的基本原理出发,根据研究的目的,利用科学仪器.设备,人为地控制或模拟光学现象,排除干扰,突出主要因素 ...

  8. 【云计算与虚拟化】第三章 实验二 在ESXi主机中安装操作系统

    实验二  在ESXi主机中安装操作系统 为ESXi主机添加一块数据存储磁盘,大小为80G,磁盘名称为:ESXi-loc-80G(截图)   2.登录vSphere Client,加载新添加的数据存储磁 ...

  9. 校内实验六,Windows系统中基于用户名密码的身份认证

    Windows系统中基于用户名密码的身份认证 一.实验目的 二.实验环境及原理 三.实验内容 1 检查和删除不必要的账户 2 禁用guest用户. 3 设置帐户/密码登录身份认证 4 匿名Admini ...

最新文章

  1. 降低噪声和电磁干扰的原则
  2. 八卦一下 惠普曾是Oracle的练爱对象
  3. 从未在一起更让人遗憾_擦肩而过的遗憾,远离家乡逆行武汉,盘点《在一起》那些泪目瞬间...
  4. 如何在MFC线程中使用控件的成员变量和函数
  5. 如何直接强制客户端刷新.js文件
  6. 命中率_数据说话!詹姆斯的“皇家射手团”命中率为近十年最低
  7. mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据
  8. python 图像处理_Python中的十大图像处理工具
  9. 12、常见Conditional注解源码解析-ConditionalOnBean(写作中...)
  10. samba for linux下载,Samba 4.4.3 SMB for Linux 发布下载
  11. 解决Hbase的几个常见bug
  12. postman下载文件乱码
  13. 大一新生HTML期末作业 学生个人网页设计作业 HTML5响应式个人简历网站模板 web前端网页制作课作业
  14. 电脑倒计时调用写好的html,HTML网页 倒计时(入门级)
  15. python opencv4.0 提取alpha 通道
  16. android+google+play,打开链接的google play商店在手机版android
  17. 【MySql】mysql之用户管理
  18. $.closest()
  19. Illustrating How Mechanical Assemblies Work
  20. jenkins cicd k8s 多分支流水线构建

热门文章

  1. 【Android -- 性能优化】过度绘制分析工具 — GPU
  2. 数据极化,紫光西部数据的“突围”之路
  3. [iOS]PDF格式的矢量图作为图片资源自动适配
  4. Dubbo面试题大汇总
  5. 精品基于Python实现的大学校园短视频社交软件系统-微信小程序
  6. [3]技术浅谈——追溯技术之路(一)
  7. 二级目录部署springboot项目
  8. A-level成绩复议成功的可能性大吗?
  9. javaWeb04(验证码登陆新闻增加)
  10. Redis的AOF配置