C++入门编程之成语接龙

2023-11-15

成语接龙问题

问题描述:

题目描述:成语接龙是中华民族传统的文字游戏。它有着悠久的历史,也有广泛的社会基础,是老少皆宜的民间文化娱乐活动。请设计四字成语接龙游戏。
功能需求:
(1) 计一个四字成语类Idiom,包含成语内容,首字母的拼音,末尾字母 的拼音。
(2) 设计一个成语接龙游戏类Game,系统可以判断用户的回答是否是成语,并且可以按照前一个成语,判断是否接龙成功。如果回答的成语接龙正确,则以新的成语作为新的起点,继续接龙;如果不成功,继续为原有的成语接龙。
(3) 设计提示功能,引导用户接龙成功。
(4) 使用外部文件存储相关数据。

开发环境:

Dev C++

解题思路:

  1. 使用外部文件储存,创建一个.txt文件来储存成语,组成成语数据库,用fstream类导入成语库。
  2. 分别用两个ifstream,声明出两个变量,分别储存成语与拼音,放在Idiom类里。
  3. 再定义出一个Game类,声明出6个函数。
     matchIfidiom函数,用来匹配是否为成语。
     matchIfcatch函数,用来检测是否接龙。
     matchIfexist函数,用来检测是否在游戏里存在出现过的成语。
     pointOut函数,用来做提示功能。
     printOut函数,用来输出结果。
     gameStart函数,用来启动游戏。
     String exist成语,用来储存出现过的成语
  4. 在gameStart函数里,根据玩家输入1或2来决定是否退出或者提示。 这个项目中最关键的一点就是,第一次输入的成语必须是一个四字成语,否则直接退出。于是,提示功能只能在第二轮输入开始才能使用。在每次输入成语后,printOut函数都会检测是否为四字成语,是否存在出现的成语(当第二次输入时)。当用户需要提示时,输入“2”,printOut函数将输进来的idiom又赋值为上一个成语(因为“2”不是成语,这也是需要第二次输入才能使用提示功能的原因)。gameStart函数里声明出一个变量idiom,用来给用户输入成语,然后传入printOut函数输入结果。由于需要判断是否接龙,于是在函数里面加入判断语句if(),把idiom放入matchIfcatch函数里,如果不接龙,则实现if语句里面的内容。

程序设计:

#include<iostream>
#include<cstring>
#include<fstream>
using namespace std; 
int tag2;

class Idiom{
	public:
	ifstream a;
	ifstream b;
	string allidiom;
	
		Idiom()
		{
			a.open("1.txt");
			b.open("1.txt");
			while(getline(a,idiom1))
			{
				allidiom+=idiom1.substr(0,8);//储存每行的成语
			}
			
			while(getline(b,idiom2,'#'))
			{   
				pos1=idiom2.find(":")+2;
				pinyin+=idiom2.substr(pos1);//储存每行的拼音 
			}
			a.close();
			b.close(); 
		}
		
	private:
		string idiom1;
		string idiom2;
		string pinyin; 
		int pos1;
};

class Game:public Idiom{
	public:
		bool matchIfidiom(string,string);        //检测是否为四字成语 
		bool matchIfcatch(string,string);             //检测是否接龙 
		void gameStart();                       //开始游戏
		string pointOut(string);            //提示功能 
		void printOut(string);               //输出是否为四字成语
		bool matchIfexist(string);          //检测是否出现同一个成语 
		
		string exist;                       //  用来储存出现过的成语
};

bool Game::matchIfidiom(string idiom,string eachidiom)//检测是否为四字成语 
{
	if(eachidiom.compare(idiom)==0 )
		return true;
	return false;
}

bool Game::matchIfcatch(string lastidiom,string idiom)//检测是否接龙 
{
	string first_i=idiom.substr(0,2);
	string end_i=lastidiom.substr(6,8);
	if(first_i.compare(end_i)==0)
		return true;
	else 
		return false;
}

bool Game::matchIfexist(string idiom)//检测是否出现同一个成语
{
	int pos=exist.find(idiom);         //通过find()函数当exist中含有idiom成语时 则查询失败则返回 string::npos
	if(pos!=string::npos)
		return true;
	return false;
}

void Game::gameStart()//开始游戏 
{
	string idiom;//玩家成语 
	string lastidiom;//储存上一次的成语(从第二个成语开始)
	int tag1=0;//标记从第二个开始 
	
	cout<<"***********功能面板***********"<<endl
		<<"*                            *"<<endl
	    <<"* 途中若想退出游戏输入——1  *"<<endl
	    <<"* 若想要提示输入      ——2  *"<<endl	
		<<"*                            *"<<endl
		<<"******************************"<<endl;
	cout<<"游戏开始,请输入一个四字成语。"<<endl;
	

		
	do{
		cin>>idiom;//用户输入成语 
		tag1++;//标记--从第二个成语开始储存 
			
		if(idiom.compare("1")==0) //退出游戏 
		{
			break;
		} 
		
		if(idiom.compare("2")==0)//提示功能 
		{
			idiom=lastidiom;
			string end_in=idiom.substr(6,8);//截取最后的字符 
			
			idiom=pointOut(end_in);   
			
			if(idiom.compare("Endgame")!=0 )
				cout<<idiom<<endl;	
			else
				{
					cout<<"接龙完毕。";
					break;
				}
				
		}
		
		
		printOut(idiom);             //判断是否为四字成语 
		
		
			if(tag1>=2&&!matchIfcatch(lastidiom,idiom))
			{
				idiom=lastidiom;//若接龙失败,则为原来的成语接龙 
				cout<<"接龙失败,以上一个的成语继续"<<endl; 
			}
			
		 exist.append(idiom);         //  用来储存出现过的成语,一直追加内存空间。 
		 
		if(tag2)
		lastidiom=idiom;
	}while(1);
}

void Game::printOut(string idiom)//输出是否为四字成语 
{
	int tag=0; 
	ifstream eachIdiom;
	string eachidiom;    //每行的单个成语 
	string idiom1;       //缓存的整行成语 
	eachIdiom.open("1.txt");
	while(getline(eachIdiom,idiom1)) 
	{
		eachidiom=idiom1.substr(0,8); 
		if(matchIfidiom(idiom,eachidiom)&&!matchIfexist(idiom))          //matchIfidiom()检查是否为四字成语。matchIfexist()检查是否重复。 
			{
				cout<<"==>";
				tag=1;
				tag2=1;
				break;
			}
				continue;
	}
				
			if(tag!=1)
			{
				cout<<"非成语或出现重复,请重新输入。"<<endl; 
				tag2=0;
			}
				
	
			eachIdiom.close();
} 
   
string Game::pointOut(string end_in)      //提示功能
{
	ifstream eachIdiom1;
	string idiom1;
	string eachidiom;           //暂存读取到的四字成语 
	string eachidiom_first;     //存取当前成语的第一个字 
	int tag=0;                  //通过tag的值判断是否成功找到满足条件的成语。 
	string Pidiom;             //返回的提示成语 
	eachIdiom1.open("1.txt");
	while(getline(eachIdiom1,idiom1)) 
	{
		eachidiom=idiom1.substr(0,8); 
		eachidiom_first=eachidiom.substr(0,2);//首字 
		if(end_in.compare(eachidiom_first)==0)   //如果 end_in == eachidiom_first则为0 
		{
			Pidiom=eachidiom;         
			if(matchIfexist(Pidiom))              //判断该成语前是否出现 如果之前出现则直接重新执行while语句 
				continue;
			tag=1;
			break;
		}
 		
	}
		eachIdiom1.close();
		if(tag==1)
			return Pidiom;             // 此时 Pidiom为满足所有条件的的成语。 
		return "Endgame";               //没有找到成语只能结束游戏 
}

int main()
{
	Game a;
	a.gameStart();		
	system("pause");
	return 0;
}

运行结果:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++入门编程之成语接龙 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 单片机stm32使用ESP8266MQTT AT指令发送json字符串

    一 问题描述 基于文章 lt 单片机stm32使用rt thread软件包at device的AT指令 gt 测试发现使用MQTT AT指令发送主题信息时 直接发送字符串正常 发送json字符串时出问题 提示错误 数据格式的区别如下 s 正
  • 转:最详细的JavaScript 教程,入门级都能看懂

    目录 介绍 JavaScript特点 用法 实例1 head中的script函数 实例2 body中的script函数 实例3 外部调用JavaScript 输出 实例1 aler 弹窗输出 实例2 document write 输出 实例
  • TTL电路的拉电流、灌电流、扇出数及扇出数计算

    电流 灌电流 扇入数 扇出数 扇出数在数字电路中是非常常见的名词 下面我们先给出这些概念的定义 然后从原理出发 介绍这些名词的关系及扇出数的计算方法 灌电流 灌电流是数字电路输出端口为低电平时外部负载输入的电流 表征输入电流的能力 拉电流
  • 算力还是服务器?这不是一道选择题

    关注我们牛年牛气冲天 算力 顾名思义就是设备的计算能力 它无影无形 虽然看不见 摸不到 却真实存在 小到智能手机 PC 大到服务器 超级计算机 算力就 藏 存各种各样的硬件设备中 像沉睡的金矿 等待你去挖掘 算力 说了算 在云计算时代 一切
  • [荐]硕博经验——科研论文阅读与写作实战技巧

    又转自西电好网 http bbs xdnice com b99t378538 htm硕博经验 转来的 早知道就好了 少走很多弯路啊 该文从 举止优雅的猪 那里看见的 感觉很不错 不过我感觉到了博士才知道这些似乎有点晚了 或者是有不少人也不会
  • 21.openssl编程——EVP

    21 1 EVP 简介 Openssl EVP high level cryptographic functions 提供丰富的密码学中的各种函数 EVP主要封装如下功能函数 a 实现了base64编解码BIO b 实现了加解密BIO c
  • Android Studio 界面显示不全问题

    最近想试试google的android studio开发工具 安装完成后 按照向导新建一个工程 发现向导界面太大 整个屏幕显示不过来 调整界面大小也无法搞定 我用的是ubuntu系统 笔记本分辨率为1366 768 上网百度了好多 发现不少
  • redis集群设置密码

    注意事项 1 如果是使用redis trib rb工具构建集群 集群构建完成前不要配置密码 集群构建完毕再通过config set config rewrite命令逐个机器设置密码 2 如果对集群设置密码 那么requirepass和mas
  • Prometheus 安装及应用(内容较全面)

    prometheus 安装及应用 prometheus 官网 grafana dashboards 模板 prometheus 参考示例 Prometheus普罗米修斯 希腊神话人物 是一个开源的系统监控和告警系统 在kubernetes容
  • 较完整的koa2项目结构实例、脚手架-mysql,gulp

    koa2 starter A koa2 starter by using mysql gulp includes async await pm2 express style middlewares Based on 17koa koa2 d
  • 什么是LDO的线性调整率和负载调整率?

    原文来自公众号 工程师看海 后台回复 LDO仿真文件 LDO是常见的电源架构 线性调整率和负载调整率是两个重要的参数 线性调整率 line regulation 指的是 在特定负载电流条件下 当出入电压变化时 引起的对应输出电压的变化量 从
  • 华为OD题目: 简单的解压缩算法

    华为OD题目 简单的解压缩算法 知识点栈 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现需要实现一种算法 能将一组压缩字符串还原成原始字符串 还原规则如下 1 字符后面加数字N 表示重复字符N次 例如 压缩内容为A3 表
  • 以太坊如何通过构建智能合约来销售商品?

    如何通过构建以太坊智能合约来销售商品 这是个问题 毫无疑问 比特币已经改变了我们看待和理解什么是金钱 价值以及最近由智能合约产生的所有权的方式 这很有趣 因为几乎每个人都听说过它或加密货币 来自许多业务领域的人 不仅仅是我们 IT工作者 在
  • %f %.2f %lf %.2lf的含义

    f表示单精度浮点型 float 默认保留 lf表示双精度浮点型 double 默认保留6位 2表示只保留小数点后两位数 下面举例 include
  • Attention机制的解释

    The Illustrated Attention Attention Seq2Seq 是一种由Encoder和Decoder组成的结构 可以将输入转化成一种中间形态并在Decoder输出 而Attention则是解决方案 经典的是Bahd
  • 设计模式:简单工厂、工厂方法、抽象工厂

    参考 Java设计模式之创建型 工厂模式详解 简单工厂 工厂方法 抽象工厂 知乎 工厂方法 以生产手机为例 具体的UML图如下 这种方法的优点是对于用户来说 不再需要面对具体的生产逻辑 只需要将生产的安排工作和细节都交给工厂类去做 缺点是在
  • MATLAB算法实战应用案例精讲-【深度学习】ECANet注意力机制(附Python实现代码)

    目录 前言 算法原理 算法思想 局部跨通道交互 Local Cross Channel Interaction
  • python批量复制文件问题,Python—批量复制文件

    批量复制文件 并修改后缀名 import os shutil yml文件根路径 ymlroot E GTEA gaze 原始图片根路径 srcroot E GTEA Gaze Dataset png 目标图片根路径 dstroot E Ga
  • Hadoop命令大全

    Hadoop命令大全 1 列出所有Hadoop Shell支持的命令 bin hadoop fs help 2 显示关于某个命令的详细信息 bin hadoop fs help command name 3 用户可使用以下命令在指定路径下查
  • C++入门编程之成语接龙

    成语接龙问题 问题描述 题目描述 成语接龙是中华民族传统的文字游戏 它有着悠久的历史 也有广泛的社会基础 是老少皆宜的民间文化娱乐活动 请设计四字成语接龙游戏 功能需求 1 计一个四字成语类Idiom 包含成语内容 首字母的拼音 末尾字母