【C语言】简易英语词典

文章目录

  • 一、定义英语单词信息的结构体
  • 二、主函数功能逻辑
  • 三、查单词函数
  • 四、背单词函数
  • 五、补充

一、定义英语单词信息的结构体

添加必要的头文件、宏定义和声明,之后定义英语单词信息结构体。

/* 头文件和宏定义 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>/* 单词最大长度 和 单词定义最大长度 */
#define MAX_WORD_LENGTH 20 
#define MAX_DEFINITION_LENGTH 200/* 英语单词结构体定义 */
struct EnglishWord
{char word[MAX_WORD_LENGTH]; // 单词拼写char definition[MAX_DEFINITION_LENGTH]; // 单词定义
};/* 函数声明 */
void searchWord(const char *filename);
void memorizeWord(const char *filename);

可以更改结构体的信息,以此来添加新功能。

添加另一个定义,之后可以收藏单词,查看收藏单词列表…

/* 结构体定义表示一个英文单词1、单词是否收藏2、单词拼写3、单词定义
*/
struct EnglishWord
{int isFavorite;char word[MAX_WORD_LENGTH];char definition[MAX_DEFINITION_LENGTH];
};

二、主函数功能逻辑

包含一个主循环,该循环持续显示菜单并等待用户输入。根据用户的选择,程序将执行相应的操作,如查单词、背单词或退出系统。在选择查询单词时,程序还包含一个嵌套循环,允许用户连续查询单词直到选择退出。程序会持续运行,直到用户选择退出系统。

/* 主函数*/
int main()
{// 定义int choice;while (1){printf("--------英语单词词典--------\n");printf("\t1. 查单词\n");printf("\t2、背单词\n");printf("\t0. 退出系统\n");printf("请选择操作:");scanf("%d", &choice);switch (choice){case 1:/* 连续查询 */while (1){char ch;searchWord("English.txt");printf("继续搜索单词(y/n): ");scanf(" %c", &ch); // 在%c前添加一个空格以跳过可能的空白字符while (getchar() != '\n');if (ch == 'n'){break;}}break;case 2:memorizeWord("English.txt");break;case 0:printf("成功退出系统。");exit(0);break;default:printf("无效选择,请重新输入!");}}return 0;
}
  1. 主循环: 主函数采用了一个无限循环 while (1),使得用户可以在执行完一次操作后选择继续进行其他操作或退出系统。
  2. 菜单显示和选择: 主循环内部通过 printf 显示简单的菜单,包括查单词、背单词、退出系统的选项。使用 scanf 获取用户的选择,并通过 switch 语句根据用户的选择执行相应的操作。
  3. 操作执行: switch 语句中根据用户的选择,执行相应的操作。如果用户选择查单词,则进入嵌套循环,调用 searchWord 函数实现连续查询。如果用户选择背单词,则调用 memorizeWord 函数执行背单词操作。如果用户选择退出系统,则输出退出信息并调用 exit(0) 退出程序。
    1. 查单词操作: 在选择查单词时,通过嵌套循环实现连续查询。用户可以在一次查询结束后选择是否继续查询,通过输入 ‘y’ 或 ‘n’ 决定。内部调用 searchWord 函数进行查询,保留用户的选择状态。
    2. 背单词操作: 在选择背单词时,调用 memorizeWord 函数执行背单词操作。用户在背单词的过程中可以通过按下任意键继续背下一个单词,包括 Enter 键。通过嵌套循环和非阻塞键盘输入的方式实现。
    3. 退出系统操作: 在选择退出系统时,输出退出信息并调用 exit(0) 退出程序,结束主循环。

三、查单词函数

这C语言函数用于在给定的文件中搜索指定的英文单词。
英语单词文件已进行资源绑定,可以在我的资源中进行查看。

void searchWord(const char *filename)
{// 变量定义FILE *file;int flag = 0;char searchWord[MAX_WORD_LENGTH];struct EnglishWord currentWord;// 打开文件,并检查是否打开成功if ((file = fopen(filename, "r")) == NULL){printf("无法打开文件 %s\n", filename);return;}// 获取用户输入待查找的英文单词printf("请输入待查找的英文单词(小写): ");scanf("%s", searchWord);// 遍历文件,查找匹配的英文单词while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF){if (strncmp(currentWord.word, searchWord, strlen(searchWord)) == 0){printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);flag = 1;}}if (0 == flag) {printf("未找到英文单词:%s\n", searchWord);}// 关闭文件fclose(file);
}
  1. 函数声明:

    void searchWord(const char *filename);
    
  2. 参数:

    • filename: 包含英文单词及其解释的文件名。
  3. 局部变量和结构体定义

    FILE *file;
    int flag = 0;
    char searchWord[MAX_WORD_LENGTH];
    struct EnglishWord currentWord;
    
    • file: 文件指针,用于打开和读取文件。
    • flag: 用于标记是否找到匹配的英文单词。
    • searchWord: 存储用户输入的待查找的英文单词。
    • currentWord: 结构体,包含英文单词和对应的解释。
  4. 文件打开检查:

    if ((file = fopen(filename, "r")) == NULL)
    {printf("无法打开文件 %s\n", filename);return;
    }
    
    • 检查文件是否成功打开,如果未成功,则输出错误信息并返回。
  5. 用户输入待查找的英文单词:

    printf("请输入待查找的英文单词(小写): ");
    scanf("%s", searchWord);
    
    • 提示用户输入待查找的英文单词。
  6. 遍历文件并比较英文单词:

    while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF)
    {// 检查是否找到匹配的英文单词if (strncmp(currentWord.word, searchWord, strlen(searchWord)) == 0){printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);flag = 1;}
    }
    
    • 使用**fscanf**逐行读取文件内容,比较每一行的英文单词与用户输入的待查找单词。
    • 如果找到匹配,输出英文单词和解释,设置**flag**为1。
  7. 输出结果:

    if (0 == flag)
    {printf("未找到英文单词:%s\n", searchWord);
    }
    
    • 如果未找到匹配的英文单词,输出相应提示。
  8. 关闭文件:

    fclose(file);
    
    • 关闭打开的文件,以防止内存泄漏

四、背单词函数

通过逐个从文件中读取英文单词及其解释,使用户能够逐个记忆这些单词,并且能够读取上次结束的位置。
英语单词文件已进行资源绑定,可以在我的资源中进行查看。

void memorizeWord(const char *filename)
{// 变量定义char ch;FILE *file;FILE *recordFile;long lastPosition = 0;struct EnglishWord currentWord;// 打开文件,并检查是否打开成功if ((file = fopen(filename, "r")) == NULL){printf("无法打开文件 %s\n", filename);return;}// 获取文件最后载入位置if ((recordFile = fopen("position_record.txt", "r")) == NULL){printf("单词位置记录失败!");return;}else{fscanf(recordFile, "%ld", &lastPosition);fclose(recordFile);fseek(file, lastPosition, SEEK_SET);}// 逐一输入单词while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF){FILE *recordFile;// 判断是否继续背单词printf("按任意键背下一单词(q to quit)");scanf(" %c", &ch);if (ch == 'q') { break; }while ((ch = getchar()) != '\n' && ch != EOF);printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);// 将本次读取的单词位置保存进新文件lastPosition = ftell(file);if ((recordFile = fopen("position_record.txt", "w")) == NULL){printf("单词位置记录失败!");}else{fprintf(recordFile, "%ld", lastPosition);fclose(recordFile);}}// 关闭文件fclose(file);
}
  1. 打开文件:

    • 函数接受一个文件名作为参数,并尝试以只读模式打开该文件。
    • 如果文件打开失败,函数打印错误消息并返回。
    if ((file = fopen(filename, "r")) == NULL)
    {printf("无法打开文件 %s\n", filename);return;
    }
    
  2. 获取上次读取的位置:

    • 函数尝试打开名为 “position_record.txt” 的记录文件,该文件保存上次读取的文件位置。
    • 如果记录文件打开失败,函数打印错误消息并返回。
    • 如果成功打开记录文件,函数读取上次读取的文件位置,并将文件指针移到该位置。
    if ((recordFile = fopen("position_record.txt", "r")) == NULL)
    {printf("单词位置记录失败!");return;
    }
    else
    {fscanf(recordFile, "%ld", &lastPosition);fclose(recordFile);fseek(file, lastPosition, SEEK_SET);
    }
  3. 逐个输入单词:

    • 使用循环从文件中逐个读取英文单词及其解释,存储在结构体 struct EnglishWord 中。
    • 在每个单词显示后,程序提示用户按任意键继续或按 ‘q’ 键退出。
    • 用户按 ‘q’ 键退出时,循环终止。
    while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF)
    {// ... (显示单词,等待用户输入)if (ch == 'q') { break; }// ... (保存当前读取位置)
    }
  4. 记录当前读取位置:

    • 在每次成功读取一个单词后,将当前文件指针位置保存到 “position_record.txt” 文件中,以便下一次程序运行时能够从上次中断的位置继续读取。
    lastPosition = ftell(file);
    if ((recordFile = fopen("position_record.txt", "w")) == NULL)
    {printf("单词位置记录失败!");
    }
    else
    {fprintf(recordFile, "%ld", lastPosition);fclose(recordFile);
    }
  5. 关闭文件:

    • 最后关闭打开的文件。
    fclose(file);
    

五、补充

  • 完整程序

    /* 相关头文件 */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>/* 单词最大长度 和 单词定义最大长度 */
    #define MAX_WORD_LENGTH 20
    #define MAX_DEFINITION_LENGTH 200// 结构体定义表示一个英文单词
    struct EnglishWord
    {char word[MAX_WORD_LENGTH];char definition[MAX_DEFINITION_LENGTH];
    };// 函数声明
    void searchWord(const char *filename);
    void memorizeWord(const char *filename);int main()
    {// 定义int choice;printf("--------英语单词词典--------\n");printf("\t1. 查单词\n");printf("\t2、背单词\n");printf("\t0. 退出系统\n");printf("请选择操作:");scanf("%d", &choice);switch(choice) {case 1: /* 连续查询 */while(1) {char ch;searchWord("English.txt");printf("继续搜索单词(y/n): ");scanf(" %c", &ch); // 在%c前添加一个空格以跳过可能的空白字符while(getchar() != '\n');if (ch == 'n') {break;}}break;case 2:memorizeWord("English.txt");break;default:printf("无效选择,请重新输入!");}    return 0;
    }// 查找英文单词的函数
    void searchWord(const char *filename)
    {/* 定义 */FILE *file;int flag = 0;char searchWord[MAX_WORD_LENGTH];struct EnglishWord currentWord;/* 打开文件,并检查是否打开成功 */if ((file = fopen(filename, "r")) == NULL){printf("无法打开文件 %s\n", filename);return;}printf("请输入待查找的英文单词(小写): ");scanf("%s", searchWord);/* 遍历文件,同时将格式化文件的内容逐一赋值到 word 和 definition 中 */while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF){// 检查是否找到匹配的英文单词if (strncmp(currentWord.word, searchWord, strlen(searchWord)) == 0){printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);flag = 1;}}if (0 == flag) {printf("未找到英文单词:%s\n", searchWord);}// 一定要关闭文件,防止内存泄漏fclose(file);
    }void memorizeWord(const char *filename)
    {char ch;FILE *file;FILE *recordFile;long lastPosition = 0; struct EnglishWord currentWord;// if ((file = fopen(filename, "r")) == NULL){printf("无法打开文件 %s\n", filename);return;}// 获取文件最后载入位置if ((recordFile = fopen("position_record.txt", "r")) == NULL){printf("单词位置记录失败!");return;}else {fscanf(recordFile, "%ld", &lastPosition);fclose(recordFile);fseek(file, lastPosition, SEEK_SET); }// 逐一输入单词while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF){FILE *recordFile;/* 判断是否继续背单词 */printf("按任意键背下一单词(q to quit)");scanf(" %c", &ch); // 获取用户输入if (ch == 'q') { break; }while ((ch = getchar()) != '\n' && ch != EOF);printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);/* 将本次读取的单词位置保存进新文件 */lastPosition = ftell(file);if ((recordFile = fopen("position_record.txt", "w")) == NULL){printf("单词位置记录失败!");}else{fprintf(recordFile, "%ld", lastPosition);fclose(recordFile);}}fclose(file);
    }
    

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

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

相关文章

Java实现快乐贩卖馆管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元

【前沿技术杂谈&#xff1a;AI 模型训练成本】到 2030 年&#xff0c;AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元 简述五年后&#xff0c;人工智能将掌握在谁的手中&#xff1f; 简述 根据 OpenAI 最近的一份报告&#xff0c;到 2030 年&#xff0c;训练大型 AI 模型的成…

AutoSAR(基础入门篇)8.6-实验:配置I/O

注意: 本次实验是接着上一次实验做的,大家应该要养成一个良好的习惯就是备份工程。比如我们现在是接着上次做的,但是最好在开始前将之前的工程备 份一遍,以防止出错重来。当然,最好的方法还是使用Git管理。还有一点要说明的是:很多之前实验中出现过的操作我们不再重复展…

npm报错之package-lock.json found. 问题和淘宝镜像源过期问题

1、package-lock.json found. 问题的解决 在执行yarn add react-transition-group -S 安装react-transition-group时出现package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in orde…

Vue 新版 脚手架 初始化 笔记

Vue2/Vue3 修改 node 更新源 将默认的 更新源修改为 淘宝的 下载地址 PS C:\Users\Administrator> npm config set registry https://registry.npm.taobao.org PS C:\Users\Administrator>npm config get registry https://registry.npm.taobao.org/安装 npm install…

Mybatis Day02

增删改查 环境准备 创建一个emp表创建一个新的springboot工程&#xff0c;选择mysql、lombok、mybatis依赖application.properties中引入数据库连接信息创建对应的实体类Emp准备Mapper接口EmpMapper&#xff0c;mapper代表程序运行时自动创建接口的代理对象&#xff0c;并放入…

算法学习(三)双指针

双指针 1. 概念 4.1 数组里的双指针 用暴力解法一定可解&#xff0c;双重循环得出结果。使用双指针的方法&#xff0c;可以借助一个额外变量&#xff0c;实现降维优化。 &#xff08;1&#xff09;相反方向运动 两个指针在数组的头和尾&#xff0c;都往中间移动&#xff0c…

EasyCaptcha,开源图形验证码新标杆!

引言&#xff1a; 随着互联网的普及&#xff0c;验证码已成为网站和应用程序中不可或缺的安全组件。它能够有效地防止自动化攻击、垃圾邮件和机器人活动。在众多验证码解决方案中&#xff0c;Easy-captcha以其简单易用和高度可定制的特点受到了开发者的青睐。本文将指导读者如…

v-model原理

v-model原理 v-model原理表单类组件封装v-model简化代码 v-model原理 1.原理&#xff1a; v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是value属性 和 input 事件的合写 <template><div id"app" ><input v-model"msg"…

Linux 基础概念

Linux 基础概念 ‍ 在最初学习Linux之前&#xff0c;首先需要搞清楚一些概念。熟悉这些概念之后紧接着熟悉各种命令&#xff0c;这有助于Linux命令的学习。这些概念绝对是你必须知道的&#xff0c;而且有些概念并不显而易见。但是当理解它们以后&#xff0c;你的shell命令也将…

Java 学习和实践笔记(8)

视频解释说&#xff0c;上图不用我们常规的写法&#xff0c;仅仅只是为了在同样的情况下&#xff0c;少写一个a而已&#xff01;这我目前不能理解。毕竟后面这种对初学者来说&#xff0c;看起来更一目了解。

DS Wannabe之5-AM Project: DS 30day int prep day14

Q1. What is Alexnet? Q2. What is VGGNet? Q3. What is VGG16? Q4. What is ResNet? At the ILSVRC 2015, so-called Residual Neural Network (ResNet) by the Kaiming He et al introduced the anovel architecture with “skip connections” and features heavy b…

爬爬爬——今天是浏览器窗口切换和给所选人打钩(自动化)

学习爬虫路还很长&#xff0c;第一阶段花了好多天了&#xff0c;还在底层&#xff0c;虽然不是我专业要学习的语言&#xff0c;和必备的知识&#xff0c;但是我感觉还挺有意思的。加油&#xff0c;这两天把建模和ai也不学了&#xff0c;唉过年了懒了&#xff01; 加油坚持就是…

【INTEL(ALTERA)】为什么 Nios V/m EMIF 数据移动器设计示例的 JTAG 终端中的内存测试失败?

说明 由于英特尔 Quartus Prime 专业版软件 22.3 版存在一个问题&#xff0c;当为Intel Agilex 7 - Nios V/m EMIF 数据移动器设计示例&#xff08;预安装设计&#xff0c;随英特尔 Quartus Prime 专业版软件一起提供&#xff09;的内存位置时&#xff0c;您可能会在 JTAG 终端…

LeetCode、1318. 或运算的最小翻转次数【中等,位运算】

文章目录 前言LeetCode、1318. 或运算的最小翻转次数【中等&#xff0c;位运算】题目链接与分类题解位运算 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…

Linux:信号的处理

文章目录 信号处理 本篇总结的是关于信号的处理 信号处理 在之前有这样的观点&#xff1a;信号在合适的时候被处理好&#xff0c;当进程收到信号后&#xff0c;当前进程可能在做优先级更高的事&#xff0c;所以它来不及处理这个信号&#xff0c;那么就会把这个信号暂时保存起…

从零开始:Linux下的Miniconda安装教程

&#x1f680;从零开始&#xff1a;Linux下的Miniconda安装教程&#x1f680; &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;二、Miniconda简介&#xff1a;开启您的数据科学之旅的得力助手&#xff01; &#x1f333;&#x1f333;三、Lin…

Linux_文件系统

假定外部存储设备为磁盘&#xff0c;文件如果没有被使用&#xff0c;那么它静静躺在磁盘上&#xff0c;如果它被使用&#xff0c;则文件将被加载进内存中。故此&#xff0c;可以将文件分为内存文件和磁盘文件。 内存文件 磁盘文件 软、硬链接 一.内存文件 1.1 c语言的文件接口 …

实验5-1 使用函数计算两个复数之积

若两个复数分别为&#xff1a;c1​x1​y1​i和c2​x2​y2​i&#xff0c;则它们的乘积为 c1​c2​(x1​x2​−y1​y2​)(x1​y2​x2​y1​)i。 本题要求实现一个函数计算两个复数之积。 函数接口定义&#xff1a; double result_real, result_imag; void complex_prod( doub…

OpenMVG(EXIF、畸变、仿射特征、特征匹配)

本人之前也研究过OpenMVS但是对于OpenMVG只是原理层次的了解&#xff0c;因此乘着过年期间对这个库进行详细的学习。 目录 1 OpenMVG编译与简单测试 1.1 sfm_data.json获取 1.2 计算特征 2 OpenMVG整个流程的运行测试 3 OpenMVG实战 3.1 SVG绘制 3.2 解析图片的EXIF信息…