默写单词cpp(初学者版本)

news2024/11/30 2:35:02

  • 笔摔坏了
  • 直接使用版:yum:
  • 仔细学习版:yum:
  • ===============
  • 1.直接使用版:yum:(文件+使用规范)
    • (1)文件
    • (2)使用规范
  • 2.仔细学习版。将会讲各个函数的功能和细节。今天太晚了,明天再写。

笔摔坏了

在一个阳光明媚的早晨,我愉快的奋笔疾书,抄写默写着单词“abandon”,喝水的时候,水性笔顺着桌子掉落到地上,我心里一紧,颤颤巍巍的弯腰捡起来,在纸上写个字,发现果然笔尖果然摔坏了。没办法,只能掏出C++primeplus,复习一下什么是类,然后运用脑袋里为数不多的知识写了一个默写单词cpp。

  • 编译环境:Visual Studio 2022

提供两个路径:

直接使用版😋

仔细学习版😋

===============

1.直接使用版😋(文件+使用规范)

(1)文件

头文件 word.h

#include<iostream>
#include<new>
#include<stdio.h>
#include<cstring>
#include <stdlib.h>
#include<time.h>
#pragma warning (disable:4996)

using namespace std;
typedef struct Word   //存储单词的类型
{
	char str_EN[20];  //英文的记录
	char str_CH[10][20];  //一个英文可能有很多中文意思
	int CHcount;   //中文翻译的个数,比如tone的英文意思有色调也有声调
	Word()
	{
		memset(str_EN, 0, sizeof str_EN);
		memset(str_CH, 0, sizeof str_CH);
		CHcount = 0;
	}
}Word;

typedef struct mWord  //记录默写错误的单词
{
	int mistake[100];
	int len;   //默写错误单词的个数
	mWord()
	{
		memset(mistake, 0, sizeof mistake);
		len = 0;
	}
}mWord;

class WordWork  //主体类
{
private:      //私有成员(单词指针,单词个数)
	Word* pp;
	mWord misword;   //默写错误的单词
	int length;  //单词个数
public:
	WordWork()  //初始化成员,为什么misword不需要初始化?实际上执行“mWord misword”这句话的时候就初始化了,mWord有自己的构造函数
	{
		pp = NULL;
		length = 0;
	};
	bool Muen();   //菜单
	bool Dynamic_GetSpace(FILE* fp);
	bool Get_inCPP();  //将单词从文件放入数组
	bool test();   //测试单词
	bool testMis();   //测试错误单词
	bool Wordcmp(char* w, int p_c);   //判断是否默写正确
	int CmpCH(const string s, int p_c);  //判断中文意思对没对
	int Get_point();   //打分
	void Print();   //打印所有单词
	void PrintMis();  //打印错误的单词
	~WordWork()   //析构函数
	{
		delete[]pp;
	}
};

bool WordWork::Dynamic_GetSpace(FILE* fp)  //动态开辟数组
{
	char temp[50];
	while (fgets(temp, 50, fp) != NULL)  //先一行一行读取单词,目的不是将单词提取出来,目的是看有多少单词,然后开辟数组
	{
		length++;
	}
	pp = new Word[length];
	for (int i = 0; i < length; i++)   //初始化单词,此时单词还没有读入,单纯开辟空间,所有待会文件指针fp需要重新指向文件开头
	{
		memset(pp[i].str_CH, 0, sizeof pp[i].str_CH);
		memset(pp[i].str_EN, 0, sizeof pp[i].str_EN);
	}
	return true;
}

int WordWork::CmpCH(const string s, int p_c)   //s是中文串,p_c是pp的下标
{

	int rightCount = 0;
	int i, j;
	for (i = 0; i < pp[p_c].CHcount; i++)//因为s只是一个中文串,即一个中文意思,那么就需要对pp对应下标的所有中文意思都进行一个判断,有一个正确就正确
	{
		for (j = 0; j < s.length(); j++)
		{
			if (s[j] != pp[p_c].str_CH[i][j])break;
		}
		if (j == s.length()) //说明s和pp[p_c].str_CH[i]完全匹配,此时注意,可能pp后面还有字符,即有可能s=="我",pp=="我是"
		{
			if (pp[p_c].str_CH[i][j] == '\0')rightCount++;
		}
	}
	return rightCount;
}

int WordWork::Get_point()  //计算得到的分数
{
	return (100 - misword.len * 2);
}

bool WordWork::Wordcmp(char* w, int p_c)  //k==1,英文   p_c表示pp的下标,w是默写的字符串
{
	if (w[0] >= 'a' && w[0] <= 'z')  //很明显默写的英文
	{
		int i = 0;
		while (w[i] != '\0' && pp[p_c].str_EN[i] != '\0' && w[i] == pp[p_c].str_EN[i])
		{
			i++;
		}
		if (w[i] != '\0' || pp[p_c].str_EN[i] != '\0')
		{
			return false;
		}
	}
	else  //默写的中文,那么可能一个单词有好几个中文意思,就需要更加复杂的判断了,这里规定有一个意思默写正确就算正确
	{
		int rightCount = 0;   //正确的中文意思个数
		string t = "";       //将字符串w复制道t,因为t是已经配置好的字符串类模板,更加好使用
		for (int i = 0; w[i] != '\0'; i++)
			t += w[i];
		//考虑到可能默写的中文有好几个意思,每个意思中间用','分隔。

		string s = "";     //s用来记录t中的某一段字符串来判断是否正确
		for (int i = 0; i < t.length(); i++)  //这里仔细看有一个小巧妙,我自己定义的遇到','表示收集完一个中文意思,但是如果没有','呢?所以for循环外面还要判断一次
		{
			if (t[i] == -93 && t[i + 1] == -84)  //遇到,表示收集完一个中文意思
			{
				rightCount += CmpCH(s, p_c);  //然后看看这个收集到的中文意思是否存在
				s = "";
				i++; //需要多一次i++,跳到t[i+1]后面,即跳过逗号
			}
			else
				s += t[i];
		}
		if (s.length() != 0)  //收集最后一个中文意思(包含两种情况,本来就只有一个意思,那么很显然自然也是最后一个。有多个意思,而这个是最后一个)
		{
			rightCount += CmpCH(s, p_c);
		}
		return rightCount == 0 ? false : true;
	}
	return true;
}

bool WordWork::Muen()
{
	int choice = 1;
	while (choice != 4)
	{
		cout << "*********1.默写单词   2.存入单词   3.打印单词    4.退出*********\n";
		cin >> choice;
		switch (choice)
		{
		case 1:
		{  //先将文件数据存入数组,然后使用哈希表和随机种子函数打乱单词,最后默写
			test();
			break;
		}
		case 2:   //读文件,按行读取文件
		{
			Get_inCPP(); //从文件获得单词到cpp程序
			break;
		}
		case 3:  //打印单词
		{
			Print();
			break;
		}
		case 4:
			break;

		default:
		{
			choice = 1;
			break;
		}
		}
	}
	return true;
}

void WordWork::Print()  //打印单词
{
	for (int i = 0; i < length; i++)
	{
		printf("(%d) %s: ", i + 1, pp[i].str_EN);
		//cout << "(" << i + 1 << ") " << pp[i].str_EN;
		for (int j = 0; j < pp[i].CHcount; j++)
		{
			if (j == pp[i].CHcount - 1)cout << pp[i].str_CH[j];
			else
				printf("%s,", pp[i].str_CH[j]);
			//cout << pp[i].str_CH[j];
		}
		cout << endl;
	}
	cout << endl;
}

void WordWork::PrintMis()  //打印错误的单词
{
	cout << "你默写错误的单词是:\n";
	for (int i = 0; i < misword.len; i++)
	{
		printf("(%d)%s:", i + 1, pp[misword.mistake[i]].str_EN);  //默写英文
		for (int j = 0; j < pp[misword.mistake[i]].CHcount - 1; j++)    //默写中文
		{
			printf("%s,", pp[misword.mistake[i]].str_CH[j]);
		}
		printf("%s\n", pp[misword.mistake[i]].str_CH[pp[misword.mistake[i]].CHcount - 1]);
	}
	cout << endl << endl;
}

bool WordWork::Get_inCPP()   //从文件中读取单词,按照行读入
{
	//(1)打开文件夹(存入单词的文件夹)
	char str[20];
	memset(str, 0, sizeof str);
	cout << "输入文件名:";
	getchar();
	cin.getline(str, 20);
	FILE* fp = fopen(str, "r+");
	rewind(fp);
	if (!fp)
	{
		cout << "文件打开失败!\n";
		return false;
	}
	if (feof(fp))
	{
		cout << "文件是空的!\n";
		return false;
	}

	//(2)开辟数组空间,用于存储文件夹内单词信息(中文意思,英文意思)
	Dynamic_GetSpace(fp);   //动态开辟空间
	rewind(fp);             //将fp重新指向文件夹起始位置
	char temp[50];
	memset(temp, 0, sizeof temp);
	int p_i = -1;			//当前行,为什么是-1,因为下面while内第一句就是p_i++,由于数组下标从0开始,所以先设置-1

	//(3)
	//每一行的规则: 英文 空格若干 中文,中文,中文 换行符"\n"

	while (fgets(temp, 50, fp) != NULL)   //按照行读入 (乱七八糟一堆,目的就是把单词存入数组以便操作)
	{
		p_i++;
		int t_i = 0;  //从文件读入单词字符
		int E_i = 0;  //英文的下标

		//区分一下,一个英文只有一个英文,但是一个英文有多个中文意思
		int C_j = 0;  //第j个中文
		int C_j_i = 0;//第j个中文下标

		//按照每一行的书写规则,一一读取字符

		while (temp[t_i] != ' ')  //空格的asciil码是32
		{
			pp[p_i].str_EN[E_i] = temp[t_i];
			E_i++;
			t_i++;
		}
		while (temp[t_i] == ' ')
			t_i++;
		while (temp[t_i] != '\0')
		{
			//说明一下:中文里面逗号的ascill码是"-93和-84"(每个中文都由两个char决定)
			while ((temp[t_i] != -93 || temp[t_i + 1] != -84) && temp[t_i] != '\n')   //只要不是遇到逗号或者换行符,就读入
			{
				pp[p_i].str_CH[C_j][C_j_i] = temp[t_i];
				C_j_i++;
				t_i++;
			}
			while (temp[t_i] == -93 && temp[t_i + 1] == -84)
			{
				t_i += 2;
				C_j++;
				C_j_i = 0;
			}
			if (temp[t_i] == '\n')
			{
				t_i++;
				C_j++;
			};
		}
		pp[p_i].CHcount = C_j;
		memset(temp, 0, sizeof temp);
	}
	if (feof(fp) != 0)  //关闭文件,用完就关
	{
		fclose(fp);
		return true;
	}
	else     //提示文件没有读完,感觉这句话不需要
	{
		fclose(fp);
		cout << "文件没有走到末尾!\n";
		return false;
	}
}

bool WordWork::test()    //用时间种子函数随机生成下标,按顺序存入哈希表,然后按照哈希表下表默写单词
{
	//时间种子
	time_t t;
	t = time(0);
	srand(t);
	//哈希表1
	int* Hash = new int[length];
	int Ha_c = 0;
	for (int i = 0; i < length; i++)Hash[i] = -1;
	//哈希表2
	int* vis = new int[length];  //vis记录哪些下标被用过
	for (int i = 0; i < length; i++)vis[i] = -1;
	for (int i = 0; i < length; i++)
	{
		int k = rand() % length;
		while (vis[k] != -1)k = (k + 1) % length;
		vis[k] = 1;
		Hash[Ha_c++] = k;
	}
	cout << "\n\n\n\n\n\n\n\n*********************!!开始默写!!*************************\n"
		<< "****************************************\n******************************************\n\n\n";
	t = time(0);   //使用随机函数来交替默写英文中文
	srand(t);
	for (int i = 0; i < length; i++)
	{
		char w[50];
		memset(w, 0, sizeof w);
		int k = rand() % 2;
		if (k == 1)  //默写英文
		{
			cout << "(" << i + 1 << "):";
			for (int j = 0; j < pp[Hash[i]].CHcount; j++)
			{
				if (j == pp[Hash[i]].CHcount - 1)cout << pp[Hash[i]].str_CH[j] << "  ";
				else
					printf("%s,", pp[Hash[i]].str_CH[j]);
				//cout << pp[i].str_CH[j];
			}
			cin >> w;
		}
		else  //默写中文
		{
			cout << "(" << i + 1 << "):" << pp[Hash[i]].str_EN << "   ";
			cin >> w;
		}
		cout << endl;
		//记录下错误的单词
		if (!Wordcmp(w, Hash[i]))  //如果单词默写错误,那么将错误的单词的下标存入misword
		{
			misword.mistake[misword.len] = Hash[i];
			misword.len++;
		}
		if (w[0] == '0')break;  //中途退出,不写了 
	}
	cout << "\n\n***********你的分数是:************\n\n************************************\n\n             " << Get_point() << endl << "\n\n************************************\n\n************************************\n\n";
	cout << endl << endl;
	testMis();
	delete[]Hash;
	delete[]vis;
	return true;

}

bool WordWork::testMis()  //默写错误的单词
{
	while (misword.len != 0)  //没有全部默写对不让走!!
	{
		PrintMis();   //先输出默写错误的单词小看一下
		time_t t;
		t = time(0);
		srand(t);
		int hash[100];
		int ha_c = 0;
		memset(hash, 0, sizeof hash);
		cout << "\n\n\n\n\n\n\n\n*********************!!开始默写错误单词!!*************************\n"
			<< "****************************************\n*********************************\n";
		for (int i = 0; i < misword.len; i++)
		{
			char w[20];
			memset(w, 0, sizeof w);
			int k = rand() % 2;
			if (k == 1)  //默写英文
			{
				cout << "(" << i + 1 << "):";
				for (int j = 0; j < pp[misword.mistake[i]].CHcount; j++)
				{
					if (j == pp[misword.mistake[i]].CHcount - 1)cout << pp[misword.mistake[i]].str_CH[j] << "  ";
					else
						printf("%s,", pp[misword.mistake[i]].str_CH[j]);
					//cout << pp[i].str_CH[j];
				}
				cin >> w;
			}
			else  //默写中文
			{
				cout << "(" << i + 1 << "):" << pp[misword.mistake[i]].str_EN << "   ";
				cin >> w;
			}
			cout << endl;
			//记录下错误的单词
			if (!Wordcmp(w, misword.mistake[i]))  //如果单词默写错误,那么将错误的单词的下标存入misword
			{
				hash[ha_c] = misword.mistake[i];
				ha_c++;
			}
		}
		for (int i = 0; i < ha_c; i++)
			misword.mistake[i] = hash[i];
		misword.len = ha_c;
		cout << "\n\n你的分数是:" << Get_point() << endl;
	}
	cout << "恭喜你全部完成今日的目标!\n\n\n";
	return true;
}

主文件 wordmain.cpp

#include"word.h"
#include<iostream>
#include<cstring>
#include <stdlib.h>
#pragma warning (disable:4996)
using namespace std;

int main()
{
	WordWork op;
	op.Muen();
	return 0;
}

(2)使用规范

首先抱歉,代码写的很乱,很难看。

1:打开项目的文件夹,在名字为项目文件名字的文件夹里面创建txt文档

在这里插入图片描述

在这里插入图片描述

2: 创建txt文档,命名day1,2,3,4,,以此类推,这是我的习惯。
在这里插入图片描述

在这里插入图片描述

3:将要默写的单词按照图中格式写进txt文档,格式是:英文+空格+中文+“,”+中文+“,”+…+换行符(回车)
4:注意逗号是中文下的逗号
5:不要添加多的符合,比如句号感叹号
6:点击保存

7:打开项目,点击运行。将会弹出这个页面:

在这里插入图片描述

8:输入数字2,输入文件名,由于之前是将txt文件放入项目文件内,所以不需要添加多余路径,这是“相对路径”。不懂什么是“相对路径”和“绝对路径”的可以取了解一下。
9:输入数字3,打印单词,看看是否有错误的填写或者可以取复习一下单词
在这里插入图片描述
10.输入数字1,默写单词
在这里插入图片描述
这里提一嘴!!!如果说不想默写那么多,可以按“0”退出默写。

再有一点,如果一个英文有多个中文意思,只要有一个是正确的将判断正确?

随后会给默写的单词打分。如果是满分将不需要重复默写,如果不是满分将会将错误的打印出来并让你重新默写直到你全对为止!

在这里插入图片描述
在这里插入图片描述

2.仔细学习版。将会讲各个函数的功能和细节。今天太晚了,明天再写。

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

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

相关文章

蓝桥杯--全球气温变暖

import java.util.Scanner;public class top7 {//全球边暖//思路&#xff0c;就是找出上下左右都是#的地方&#xff0c;如果这个地方是的&#xff0c;那么此时countstatic int count0;public static void main(String[] args) {Scanner scanner new Scanner(System.in);int ns…

Java语法学习七之类和接口

抽象类 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 比如&#xff1a;…

【STL】List容器介绍+相关练习题详细版本

List 1.List介绍2.使用注意3.list与vector的对比4.练习题 1.List介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;…

一文搞懂机器学习

一、引言 在当今的数字时代&#xff0c;一个概念不断出现在科技前沿的讨论中 —— 机器学习。作为人工智能领域的一个重要分支&#xff0c;机器学习已经从理论研究走向实际应用&#xff0c;深刻地改变着我们的工作和生活方式。 机器学习的核心思想是让机器通过数据学习并做出…

《1w实盘and大盘基金预测 day7》

昨日预测有点差劲&#xff0c;最低点也相差五个点。 打分C 公众号&#xff1a;JavaHelmet 昨天预测&#xff1a; 3052-3062-3076-3115 3067是趋势线&#xff0c;有回踩需求 5-30-60分钟级别顶钝 大盘冲到标红的点位3115或者3100就需注意。不要随意追高&#xff08;最高309…

稀碎从零算法笔记Day22-LeetCode:存在重复元素 II

题型&#xff1a;哈希表、数组 链接&#xff1a;219. 存在重复元素 II - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] …

幻兽帕鲁游戏搭建(docker)

系列文章目录 第一章&#xff1a; 幻兽帕陆游戏搭建 文章目录 系列文章目录前言一、镜像安装1.创建游戏目录2.拉取镜像3.下载配置文件4.启动游戏 二、自定义配置总结 前言 这段时间一直在写论文还有找工作&#xff0c;也没学啥新技术&#xff0c;所以博客也很长时间没写了&am…

【Python】使用selenium对Poe批量模拟注册脚本

配置好接码api即可实现自动化注册登录试用一体。 运行后会注册账号并绑定邮箱与手机号进行登录试用。 测试结果30秒一个号 import re import time import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options imp…

5 Redis主从集群

文章目录 Redis主从集群1.1主从集群搭建1.1.1 伪集群搭建与配置1.1.2 分级管理1.1.3 容灾冷处理 1.2主从复制原理1.2.1 主从复制过程1.2.2 数据同步演变过程 2.1 哨兵机制实现2.1.1 简介2.2.2 Redis 高可用集群搭建2.2.3 Redis 高可用集群的启动2.2.4 Sentinel 优化配置 3.1 哨…

Springboot 博客_002 项目环境配置

引入相关依赖 mysqlmybatis <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-…

[小程序开发] 常见问题2:npm init -y 报错

在微信开发者工具终端中输入npm init -y 报错 npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包 括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 原因&#xff1a;未下载Node.js 解决方法&#xff…

窗口函数(sample database classicmodels _No.8 )

窗口函数&#xff08;sample database classicmodels _No.8 &#xff09; 准备工作&#xff0c;可以去下载 classicmodels 数据库具体如下 点击&#xff1a;classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章目录 窗口函…

Visual Studio 2013 - 调试模式下根据内存地址查看内存

Visual Studio 2013 - 调试模式下根据内存地址查看内存 1. 查看内存References 1. 查看内存 调试 -> 窗口 -> 内存 -> 内存1-4 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Git浅谈配置文件和免密登录

一、文章内容 简述git三种配置ssh免密登录以及遇见的问题git可忽略文件git remote 相关操作 二、Git三种配置 项目配置文件(局部)&#xff1a;项目路径/.git/config 文件 git config --local user.name name git config --local user.email 123qq.cc全局配置文(所有用户): …

docker入门(二)—— docker三大概念(镜像、容器、仓库)

docker 的三大必要概念 docker 的三大必要概念——镜像、容器、仓库 docker 架构图 镜像&#xff08;image&#xff09;&#xff1a;模版。&#xff08;web项目&#xff1a;1、环境 2、配置变量 3、上线项目 4、配置项目需要的静态文件&#xff09;打包成镜像 docker 镜像&a…

LeetCode 2312.卖木头块:动态规划(DP)

【LetMeFly】2312.卖木头块&#xff1a;动态规划(DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/selling-pieces-of-wood/ 给你两个整数 m 和 n &#xff0c;分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices &#xff0c;其中 prices[i] [hi, …

DNF的概念和操作命令

yum是linux系统中基于rpm包管理的一种软件管理工具。 在dnf.conf文件中&#xff0c;我们可以配置某个网络服务器位软件源仓库。配置的方法&#xff0c;就是用vim编辑/etc/dnf/dnf.conf这个文件。

基于 RisingWave 和 Kafka 构建实时网络安全解决方案

实时威胁检测可实时监控和分析数据&#xff0c;并及时对潜在的安全威胁作出识别和响应。与依赖定期扫描或回顾性分析的安全措施不同&#xff0c;实时威胁检测系统可提供即时警报&#xff0c;并启动自动响应来降低风险&#xff0c;而不会出现高延迟。 实时威胁检测有许多不同的…

C语言案例02,请编程序将“China“译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母,变为Glmre,持续更新~

一.题目 /* 请编程序将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。 例如,字母“A”后面第4个字母是“E”&#xff0c;用“E”代替“A”。因此,“China”应译为“Glmre”。 请编一程序,用赋初值的方法使cl,c2&#xff0c;c3,c4,c5 这5个变量的值分…

避坑指南!树莓派使用Adafruit_PCA9685驱动

一、硬件连线 二、软件配置 打开树莓派的IIC sudo raspi-config下载Adafruit_PCA9685 坑&#xff1a;如果直接使用命令安装会发现&#xff0c;报下面的错误。我们需要先安装conda&#xff0c;然后创建一个虚拟环境&#xff0c;创建完成后&#xff0c;激活环境。不要在自己创…