C++实现文本界面英语词典

news2024/12/26 23:20:50

C++实现文本界面英语词典

C++实现文本界面的英语词典,能在Dev-C++运行。提供两种方案:一是简单仅查词功能;二是具有查词、添加、删除功能,具有选择菜单,值得一提的是,本程序对用户输入菜单选项序号做了检测,排除了无效输入造成的不相应情况。

一、简单仅查词功能

使用map容器实现电子词典,map容器

可以理解为:一种映射,一对一(例如x对y),可以通过x查询到唯一对应的y。

本文实现的功能

读取电子词典的文件,一对一压入map容器中(即英文对应中文解释),然后通过英文,获得中文含义,以达到电子词典的功能。

电子词典的文件Dictionary1.txt,每行一词,单词和解释之间用一个空格分割 (解释中间不能有空格),如

a art.一(个);每一(个)
abandon vt.丢弃;放弃,抛弃
ability n.能力;能耐,本领
able a.有能力的;出色的
baby n.婴儿;孩子气的人
back ad.在后;回原处;回
background n.背景,后景,经历
cabinet n.橱,柜;内阁
cable n.缆,索;电缆;电报
cafe n.咖啡馆;小餐厅
good a.好的;有本事的
zoo n.动物园

源码如下

#include <iostream>
using namespace std;
#include <map>
#include <fstream>
 
int main()
{
	map<string, string> wordDict;
	fstream fs;
	fs.open("Dictionary1.txt", ios::in);
	char buf[1024] = { 0 };
	char key[200] = { 0 };  //单词 
	char value[300] = { 0 };  //解释 
	while (fs.peek() != EOF)
	{
		fs.getline(buf, 1024); //getline从文件中读取一行数据
		sscanf(buf, "%s %s", key, value);  //实现拆分,"%s %s"表示用空格分割符 分别存入key, value 
		wordDict.insert(pair<string, string>(key, value));
	}
	cout <<"单词数量:"<< wordDict.size() << endl;  //单词数量(行数) 
 
	string word;
	while (1)
	{
		cout << "请输入要查询的单词:" ;
		cin >> word;
		int res = wordDict.count(word);
		if (res == 0)
		{
			cout << "未查询到该单词!" << endl;
		}
		else
		{
			cout << "单词解释:" ; 
			cout << wordDict[word] << endl;
		}
	}
 
	return 0;
}

关于sscanf函数可见

https://cplusplus.com/reference/cstdio/sscanf/

scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s - cppreference.com

运行效果:

二、具有查词、添加、删除功能

电子词典的文件Dictionary2.txt,其中第一行记录单词数量,其它行每行一词,单词和解释之间用一个空格分割 (解释中间不能有空格),如

12
a art.一(个);每一(个)
abandon vt.丢弃;放弃,抛弃
ability n.能力;能耐,本领
able a.有能力的;出色的
baby n.婴儿;孩子气的人
back ad.在后;回原处;回
background n.背景,后景,经历
cabinet n.橱,柜;内阁
cable n.缆,索;电缆;电报
cafe n.咖啡馆;小餐厅
good a.好的;有本事的
zoo n.动物园

源码如下

值得一提的是,本程序对用户输入菜单选项序号做了检测,排除了无效输入造成的不相应情况。

#include <windows.h>
#include <iostream>
#include <iomanip>  //对齐输出用到 
using namespace std;

int number;           //全局变量单词总数
 
void menu();          //主界面
void translation_e(); //英译汉
void view();          //查看[列出]全部单词
void remove_();       //删除单词
void add();           //增加单词
 
void read();          //从文件中读取信息
void save() ;         //保存单词到文件里函数
 
void back_t_e();      //英译汉 返回界面
void back_v();        //查看[列出]全部单词 返回界面
void back_r();        //删除单词 返回界面
void back_a();        //增加单词 返回界面

int CheckNum(int& n);  //判断输入的字符串是否为正整数,若是,则合规返归其值 ,否则给出提示 
   
struct words{ 
    char english[30];
    char chinese[60]; 
}word[100];
 
int main()
{
    menu();
    return 0;
}
 
void menu()//主界面
{
    read();
    int l;
    
            cout<<"\t欢迎使用简易英汉词典\t\n";
            cout <<"\t     1.单词查找 \t\n";
            cout <<"\t     2.查看全部词库 \t\n";
            cout <<"\t     3.删除单词 \t\n";
            cout <<"\t     4.增加单词 \t\n";
            cout <<"\t     5.退出   \n";
            cout <<"=================================\n";
            
            //处理输入非数字 
            int m;
            while (true){
            	cout <<"请输入选择的编号: ";
               	l=CheckNum(m);
            	if(l>=1 && l<=5) //限制是合规的选项 
        		{
        			
					break;
				}				
			}
              
    switch(l){
        case 1:
            system("cls");
            translation_e();
            break;
        case 2:
            system("cls");
            view();
            break;
        case 3:
            system("cls");
            remove_();
            break;
        case 4:
            system("cls");
            add();
            break;
        case 5:
            cout <<"感谢您的使用,已退出!\n";
            exit(0);
        
        }
}

//判断输入的字符串是否为正整数,若是,则合规返归其值 ,否则给出提示 
int CheckNum(int& n)
{
    int i;
    string x;  //用来接受输入
    bool flag = false;
    while (cin >> x) {
        for (i = 0; i < x.size(); ++i) {
       		 //判断是否为中文
            if (x[i] & 0x80) {
                cout << "\n输入错误,请重新输入正确的数字: ";
                break;
            }
            //判断是否为字母或者其它字符
            if (!isdigit(x[i])) {
                cout << "\n输入错误,请重新输入正确的数字: ";
                break;
            }
        }

        if (i == x.size()) {
            break;   //如果字符串中所有字符都合法,则退出while循环
        }

    }
    n = atoi(x.c_str()); //将仅含数字的string字符串转化为正整数
    return n; //返回值 
}
 
void translation_e() //英译汉
{
    char eng[30]="\0";
    int i;
    cout <<"输入要查询的单词: ";
    getchar();//去掉回车
	cin >>eng;
	for ( i =0;i<number;i++)
	{
		if (strcmp(eng,word[i].english)==0 )
		{
            cout <<"\n该单词含义:  ";
            cout <<word[i].chinese<<"\n";
            break;
               }
	}
	 if (i == number)
        {
            cout <<"\n[错误]未找到该单词!\n";
            }
   back_t_e();
}
 
void back_t_e()  //英译汉(查询单词)返回界面
{
    int l;
    cout <<"\n1.继续";
    cout <<"\n2.返回";
    cout <<"\n=========================";
    cout <<"\n请输入要执行的操作: ";

    //cin >>l;
    
    //处理输入非数字 
    int m;
    while (true){
    	cout <<"请输入选择的编号: ";
       	l=CheckNum(m);
    	if(l>=1 && l<=2) //限制是合规的选项 
		{
			
			break;
		}				
	}
			
    switch(l){
         case 1:
            system("cls");
            translation_e();
            break;
        case 2:
            system("cls");
            menu();
            break;
        }
}
 
void save()  //保存单词到文件里函数
{
	FILE* fp;
	int i,ret;
	fp=fopen("Dictionary2.txt", "w");  //单词文本文件 
	if (fp == NULL)
	{
        cout <<"\n[警告]文件打开失败\n";
	}
    fprintf(fp,"%d\n",number);
 
	for (i = 0; i <number; i++)
	{
 	    ret=fprintf(fp,"%s %s\n",word[i].english,word[i].chinese);
		}
 
		if (ret<0)
		{
            cout <<"\n[错误]文件写入失败\n";
		}
		else
		{
            cout <<"\n[tip]文件写入成功\n";
 	}
	fclose(fp);		//关闭文件指针
}
 
void read()//从文件中读取信息
{
    FILE *fp;
    int i;
    fp=fopen("Dictionary2.txt","r");  //单词文本文件 
    if(fp==NULL)
        {
            cout <<"[警告]文件打开失败\n";
    }
        else {
            cout <<"[tip]文件读取成功\n";
             fscanf(fp,"%d\n",&number);
             for(i=0;i<number;i++)
            {
            	fscanf(fp,"%s %s\n",word[i].english,word[i].chinese);
			}
        }
 
    fclose(fp);
}
 
void add()    //增加单词
{
    int i = number, j, flag,m;
	//cout <<"待增加的单词个数:";
	//cin >>m;
	
    //处理输入非数字 
    int n;
    while (true){
    	cout <<"待增加的单词个数[限制一次1`20]: ";
       	m=CheckNum(n);
    	if(m>=1 && m<=20) //限制是合规的选项 
		{
			
			break;
		}				
	}
	
	getchar();
	if (m > 0){
		do
		{
			flag = 1;
			cout <<"\n请输入第"<< i + 1<<"个单词:\n";
			while (flag)
			{
				flag = 0;
 
				cout <<"英文:";

				cin>>word[i].english;
				for (j = 0; j < i; j++){
					if (strcmp(word[i].english,word[j].english)==0){
                        cout <<"[错误]已存在该单词,请重新输入!\n";
						flag = 1;
						break;
					}
				}
			}
            getchar();
 
			cout <<"中文[不能含有空格]: ";

            cin >> word[i].chinese;
            if (0 == flag){
				i++;
			}
		} while (i<number + m);
 
		number += m;
        cout <<"[成功]单词添加完毕!!!";
        save();
	}

	back_a();
}
 
void back_a()  //增加单词 返回界面
{
    int l;
    cout <<"\n1.继续";
    cout <<"\n2.返回";
    cout <<"\n=========================";
    cout <<"\n请输入要执行的操作: ";

    //in >> l;
    
    //处理输入非数字 
    int m;
    while (true){
    	cout <<"请输入选择的编号: ";
       	l=CheckNum(m);
    	if(l>=0 && l<=2) //限制是合规的选项 
		{
			
			break;
		}				
	}
    
    switch(l){
         case 1:
            system("cls");
            add();
            break;
        case 2:
            system("cls");
            menu();
            break;

        }
}
 
void view()  //查看[列出]全部单词
{
    int i;
    cout <<" 英文\t\t\t 中文\n";
    cout <<" --------------------------------------------------------------------------\n";
    for(i=0;i<number;i++)
    {
		cout <<left<<setw(30)<<word[i].english<<left<<setw(60)<<word[i].chinese<<"\n";
    }
    cout <<" --------------------------------------------------------------------------\n";
    back_v() ;
}
 
void back_v()  //查看[列出]全部单词 返回界面
{
    int l;
    cout <<"1.继续";
    cout <<"\n2.返回";
    cout <<"\n=========================";
    cout <<"\n请输入要执行的操作: ";
    //cin >>l;

    //处理输入非数字 
    int m;
    while (true){
    	cout <<"请输入选择的编号: ";
       	l=CheckNum(m);
    	if(l>=0 && l<=2) //限制是合规的选项 
		{
			
			break;
		}				
	}    
    
    switch(l){
         case 1:
            system("cls");
            view();
            break;
        case 2:
            system("cls");
            menu();
            break;
        default:
            cout <<"[输入错误]请重新输入有效数字!\n";
            Sleep(3000);
            back_v();
            break;
        }
}
 
void remove_() //删除单词
{
    int tab=0; //标记 
	int a;
    char eng1[30];
	cout <<"请输入要删除之单词:";
	//scanf("%s",eng1);
	cin >>eng1;
	int i, j;
	for (i = 0;i<number; i++)
    {
		if (strcmp(word[i].english,eng1)==0)
		{
			cout <<"你将要删除该单词\n\n";
            cout <<" --------------------------------------------------------------------------\n";
            cout <<left<<setw(30)<<word[i].english<<left<<setw(604)<<word[i].chinese<<"\n";
            cout <<" --------------------------------------------------------------------------\n";
			cout <<"\n1.确认删除";
			cout <<"\n2.取消删除";
			cout <<"\n=========================";
			cout <<"\n请输入:";

			//cin >> a;
		    //处理输入非数字 
            int m;
            while (true){
            	cout <<"请输入选择的编号: ";
               	a=CheckNum(m);
            	if(a>=0 && a<=2) //限制是合规的选项 
        		{
        			
					break;
				}				
			}	
			
			if (a == 1)
			{
			    for(j=i;j<number-1;j++){
                        word[j]=word[j+1];
			    }
				cout <<"\n[tip]删除成功!";
				tab=1;
				number--;
				save();
				break;
			}
			else
			{
				cout <<"\n[tip]已取消操作!";
				tab=1;
				break;
			}
			
		}
    }
    
	//if(i==number)
	if(tab==0)
	{
	    cout <<"\n[错误]未找到该单词!!!";
	}
	
	back_r() ;
}
 
void back_r() //删除单词 返回界面
{
    int l;
    cout <<"\n1.继续";
    cout <<"\n2.返回";
    cout <<"\n=========================";
    cout <<"\n请输入要执行的操作: ";

    //cin >> l;
    //处理输入非数字 
    int m;
    while (true){
    	cout <<"请输入选择的编号: ";
       	l=CheckNum(m);
    	if(l>=0 && l<=2) //限制是合规的选项 
		{
			
			break;
		}				
	}
    
    switch(l){
        case 1:
            system("cls");
            remove_();
            break;
        case 2:
            system("cls");
            menu();
            break;  
        }
}

 运行效果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zabbix“专家坐诊”第183期问答汇总

问题一 Q&#xff1a;老师&#xff0c;请问一下zabbix采集的数据怎么过滤&#xff0c;获取数据是nottime20:30 notafter3&#xff0c;怎么过滤出netafter3 &#xff1f;谢谢。 A&#xff1a;过滤器设置如下图。 问题二 Q&#xff1a;大佬&#xff0c;请问一下被管节点部署了…

视觉Slam十四讲笔记

视觉SLAM十四讲 ch1~2 虚拟机部分指令解析在其他文件中进行引用该库编译器参考链接&#xff1a;虚拟机部分 CMakeList.txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件 指令解析 &#xff08;1&#xff09;PROJECT(projectname [CXX] [C] [Java]): 该…

力扣(LeetCode)427. 建立四叉树(2023.03.01)

给你一个 n * n 矩阵 grid &#xff0c;矩阵由若干 0 和 1 组成。请你用四叉树表示该矩阵 grid 。 你需要返回能表示矩阵的 四叉树 的根结点。 注意&#xff0c;当 isLeaf 为 False 时&#xff0c;你可以把 True 或者 False 赋值给节点&#xff0c;两种值都会被判题机制 接受…

Elasticsearch进阶之(核心概念、系统架构、路由计算、倒排索引、分词、Kibana)

Elasticsearch进阶之&#xff08;核心概念、系统架构、路由计算、倒排索引、分词、Kibana&#xff09; 1、核心概念&#xff1a; 1.1、索引&#xff08;Index&#xff09; 一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&…

能源消耗监测管理系统,在建筑节能中起到哪些重要作用?

能源是一切活动的基础更是社会经济发展的命脉&#xff0c;但随着经济的建设&#xff0c;能源资源的消耗也越来越大&#xff0c;其中建筑是最大的消耗者。水、电、气等能源的消耗量逐年增长&#xff0c;这种能源并不是取之不尽用之不竭的&#xff0c;能源的日益紧张和环境恶化&a…

IM即时通讯开发MQ消息队列

消息是互联网信息的一种表现形式&#xff0c;是人利用计算机进行信息传递的有效载体&#xff0c;比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一。 消息从发送者到接收者的典型传递方式有两种&#xff1a; 1&#xff09;一种我们可以称为即时消息&#xff1a…

【FATE联邦学习】Fateboard的使用

fateboard文档 https://fate.fedai.org/fateboard/ github Fateboard文档 https://github.com/FederatedAI/FATE-Board/blob/master/README-CN.md 背景 Fateboard是FATE框架的任务看板。 在配置FATE时&#xff0c;Fateboard一般是被安装好了的&#xff0c;安装过程查看这里 A…

你知道如何获取全国省市街道区域信息吗?

随着互联网和快递行业的飞速发展&#xff0c;在中国广袤的大地上&#xff0c;全国行政区域规划星罗棋布&#xff0c;要查询一个行政单元如果不运用科技的手段查询可是非常的不易&#xff0c;现在&#xff0c;全国行政区划查询API的作用越来越大&#xff0c;它可以帮助我们对地址…

比特数据结构与算法(第四章_下)二叉树OJ(力扣:144,965,104,226,100,572)

144. 二叉树的前序遍历难度简单给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。示例 1&#xff1a;输入&#xff1a;root [1,null,2,3]输出&#xff1a;[1,2,3]示例 2&#xff1a;输入&#xff1a;root [ ]输出&#xff1a;[ ]示例 3&#xff1a;输入&#…

【react】react18的学习

一、安装 $ create-react-app [Project name]默认支持sass 二、核心依赖 react&#xff1a;react 核心 react-dom&#xff1a;用于开发渲染web 应用&#xff1b; react-scripts&#xff1a;封装webpack服务&#xff1b; "start": "react-scripts start&quo…

网络应用之html 的基本结构

html 的基本结构学习目标能够写出html的基本结构1. 结构代码<!DOCTYPE html><html><head><metacharset"UTF-8"><title>网页标题</title></head><body>网页显示内容</body></html>第一行<!DOCTYPE ht…

认识Cesium旋转大小变量

前文代码中有如下&#xff1b;矩阵乘以旋转大小&#xff0c;还放入mat&#xff1b; Cesium.Matrix4.multiply(mat, rotationX, mat); 初看以为rotationX是一个数值&#xff0c;因为矩阵可以和数相乘&#xff1b; 但是看它的代码&#xff0c;rotationX是由一长串代码获得的&a…

计算机网络高频知识点(二)

目录 一、三次握手 二、为什么是三次握手而不是两次握手 三、四次挥手 四、挥手为什么需要四次 五、websocket 1、是什么 2、原理 3、websocket与http的关系 4、特点 六、http结构 七、HTTP头都有哪些字段 八、http1.0和http1.1&#xff0c;还有http2有什么区别 九…

同样做软件测试,和月薪30K 的学弟聊了一晚上,我心态崩了...

过去的一年&#xff0c;你攒到钱了吗&#xff1f; 在一条话题为“今年你存了多少钱”的微博下&#xff0c;网友们贡献了近 3000 条“成绩单”&#xff0c;大多数称自己没攒到钱&#xff0c;甚至负债累累。 攒钱&#xff0c;为什么就这么难呢&#xff1f; 工资水平赶不上房价…

TDengine | 03 | TDengine2.4.0监控部署

1 前提条件 1.1 服务 TDengine 集群已经部署并正常运行taosAdapter 已经安装并正常运行TDengine 集群 REST API 地址&#xff0c;如&#xff1a;http://tdengine:6041TDengine 集群认证信息&#xff0c;做监控用的用户名和密码 1.2 版本 Linux : Ubuntu 18.04.5 LTS TDengi…

MySQL主从复制+读写分离详细方案

MySQL主从复制读写分离详细方案一、MySQL主从复制1.1mysql的复制类型1.2mysql主从复制的工作过程1.3MySQL的四种同步方式1.3.1异步复制&#xff08;Async Replication&#xff09;1.3.2同步复制&#xff08;Sync Replication&#xff09;1.3.3半同步复制&#xff08;Semi-Sync …

2023上半年软考中/高级报名+学习备考+考试重点

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

CentOS7.6快速安装Docker

快速安装 官网安装参考手册&#xff1a;https://docs.docker.com/install/linux/docker-ce/centos/ 确定你是CentOS7及以上版本,yum是在线安装! [rootVM-4-5-centos ~]# cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core)接下来您只管自上向下执行命令即可&#x…

阿里云服务器ECS适用于哪些应用场景?

云服务器ECS具有广泛的应用场景&#xff0c;既可以作为Web服务器或者应用服务器单独使用&#xff0c;又可以与其他阿里云服务集成提供丰富的解决方案。 云服务器ECS的典型应用场景包括但不限于本文描述&#xff0c;您可以在使用云服务器ECS的同时发现云计算带来的技术红利。 阿…

【项目】实现对接京东财务余额管理页面

目录需求实现后端京东财务余额Controller京东财务余额Service前端index.vuejdbalance.jsapi/jdbalance.js效果需求 通过调京东财务余额接口&#xff0c;在项目中开发相应管理页面。 实现 后端 因为京东的接口返回值里面已经有分页的参数了&#xff0c;因此会和平常自己写分…