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

  • 笔摔坏了
  • 直接使用版: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]后面,即跳过逗号}elses += 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];elseprintf("%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);//哈希表1int* Hash = new int[length];int Ha_c = 0;for (int i = 0; i < length; i++)Hash[i] = -1;//哈希表2int* 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] << "  ";elseprintf("%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] << "  ";elseprintf("%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.mzph.cn/news/756293.shtml

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

相关文章

推荐4个c++进度条开源库

在C中&#xff0c;有许多开源库可以帮助你创建进度条。以下是一些常用的C进度条库&#xff1a; 1. **indicators**: - GitHub链接: [https://github.com/p-ranav/indicators](https://github.com/p-ranav/indicators) - 特点: 轻量级&#xff0c;易于使用&#xff0c;支…

OpenCV学习笔记(十)——利用腐蚀和膨胀进行梯度计算以及礼帽和黑帽

梯度计算 在OpenCV中&#xff0c;梯度计算是图像处理中的一个基本操作&#xff0c;用于分析图像中像素值的变化速率的方向&#xff0c;其中梯度的方向是函数变化最快的方向&#xff0c;因此在图像中&#xff0c;沿着梯度方向可以找到灰度值变化最大的区域&#xff0c;这通常是…

我的自建博客之旅04之Halo

我的自建博客之旅04之Halo Halo是我无意间发现的一款博客框架,如果你讨厌Hexo,Vuepress等静态框架本地编辑,构建部署等方式,如果你想要一款一次搭建,前台是博客,后台是文章维护,并且支持各种定制化折腾的博客框架,可能Halo会比较适合你。 因为我个人还是比较偏技术,…

【数据结构取经之路】栈

目录 引言 栈的性质 顺序栈 栈的基本操作 初始化 销毁 插入 删除 判空 取栈顶元素 栈的大小 完整代码&#xff1a; 引言 栈(stack)&#xff0c;可以用数组实现&#xff0c;也可以用链表实现。用数组实现的栈叫顺序栈&#xff0c;用链表实现的栈叫链式栈&#…

wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载材质文件Mtl 中的纹理图片最简实例(十六)

文章目录 前言一、3d 立方体 model 属性相关文件1. cube.obj2. cube.Mtl3. 纹理图片 cordeBouee4.jpg二、代码实例1. 依赖库和头文件1.1 assimp1.2 stb_image.h2. egl_wayland_obj_cube.cpp3. Matrix.h 和 Matrix.cpp4. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c5.…

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

Hero Talk|无缝扩展:Kubernetes 上的 Amazon Aurora 分片和流量管理

亚马逊云科技 Data Hero 潘娟正在打开开源之门。作为“2020 中国开源先锋人物”以及“2021 OSCAR 尖峰开源人物”奖项获得者&#xff0c;她致力于赋能数据领域的开发者&#xff0c;助力他们把握先机。在亚马逊云科技 re:Invent 2023 大会上&#xff0c;潘娟就 Kubernetes 上的 …

【Godot4.2】 基于SurfaceTool的3D网格生成与体素网格探索

概述 说明&#xff1a;本文基础内容写于2023年6月&#xff0c;由三五篇文章汇总而成&#xff0c;因为当时写的比较潦草&#xff0c;过去时间也比较久了&#xff0c;我自己都得重新阅读和理解一番&#xff0c;才能知道自己说了什么&#xff0c;才有可能重新优化整理。 因为我对…

打造精美响应式CSS日历:从基础到高级样式

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

ARM开发板实现24位BMP图片缩放

ARM开发板实现24位BMP图片缩放 一、linux平台bmp图片缩放 最近想在ARM开发板实现BMP图片的缩放&#xff0c;查看了一些资料&#xff0c;大家部分理论知识可参考&#xff1a; akynazh博主 &#xff0c;这位博主程序以window平台为主进行显示&#xff0c;发现在linux平台下编译…

堆排序(数据结构)

本期讲解堆排序的实现 —————————————————————— 1. 堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 • 升序&#xff1a;建大堆 • 降序&#xff1a;建小堆 2. 利用堆删除思想来进行排序. 建堆和堆删…

12|检索增强生成:通过RAG助力鲜花运营

什么是 RAG&#xff1f;其全称为 Retrieval-Augmented Generation&#xff0c;即检索增强生成&#xff0c;它结合了检 索和生成的能力&#xff0c;为文本序列生成任务引入外部知识。RAG 将传统的语言生成模型与大规模 的外部知识库相结合&#xff0c;使模型在生成响应或文本时可…

LeetCode 每日一题 Day 102-108

2864. 最大二进制奇数 给你一个 二进制 字符串 s &#xff0c;其中至少包含一个 ‘1’ 。 你必须按某种方式 重新排列 字符串中的位&#xff0c;使得到的二进制数字是可以由该组合生成的 最大二进制奇数 。 以字符串形式&#xff0c;表示并返回可以由给定组合生成的最大二进…

3.18号arm

4 跳转指令 实现汇编程序跳转的两种方式 直接修改PC的值 mov pc , #0x04 通过跳转指令跳转 b 标签 程序跳转到指定的标签下执行&#xff0c;此时LR寄存器不保存返回地址 bl 标签 程序跳转到指定的标签下执行&#xff0c;此时LR寄存器保存返回地址 5 内存读写指令&#xff0…

Vue+SpringBoot打造用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

英伟达深夜放王炸|字节跳动游戏之路波折不断|文旅短剧风口将至|25岁QQ魅力不减,5亿人在用|云计算市场疯长152%|电商巨头齐瞄向富足悠闲银发族

新闻一分钟速览 文旅短剧风口将至&#xff0c;一地狂拍十部&#xff0c;影视界看法分歧&#xff0c;悬念丛生&#xff01;字节跳动游戏之路波折不断&#xff0c;能否逆风翻盘引关注。折叠屏手机痛症治愈&#xff0c;实力席卷高端市场&#xff0c;势头强劲&#xff01;雷军豪言…

学习笔记Day12:初探LInux 2

Linux初探 同一个目录中不允许出现文件及文件夹重名 查看文件 cat &#xff08;Concatenate&#xff09;查看文本文件内容&#xff0c;输出到屏幕&#xff08;标准输出流&#xff09; 常用参数 -A打印所有字符&#xff0c;包括特殊字符&#xff08;换行符、制表符等&#xff…

File的学习1

File对象就表示一个路径&#xff0c;可以是文件的路径&#xff0c;也可以是文件夹的路径 这个路径可以是存在的&#xff0c;也可以是不存在的。 package MyFile;import java.io.File;public class FileDemo01 {public static void main(String[] args) {//1.根据文件路径创建…

如何定期清理数据库中的无效数据?

企业的数据库在运行相当长一段时间后&#xff0c;都会出现无效数据的堆积&#xff0c;这些数据包含了过时、重复、错误、缺失&#xff08;空字段&#xff09;的数据&#xff0c;长期占据着宝贵的数据库空间。而在上云热潮的推动下&#xff0c;绝大多数企业已经将他们的业务数据…

fastjson反序列化攻略

漏洞原理 Json.parseObject(json, User.class)方法中&#xff0c;通过指定type的值实现定位某类&#xff0c;会执行User类的构造方法和属性中的get&#xff0c;set方法 判断是否是fastjson/&#xff08;jackson&#xff09; 1.2.24-1.2.83都会有dnslog的payload {"zer…