C语言程序设计课程设计 (电子英汉词典)

2023-12-24 02:50

本文主要是介绍C语言程序设计课程设计 (电子英汉词典),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 课程设计题目

电子英汉词典

1、每个单词结构包含:英文拼写、中文释义;

2、文件中至少保存30个单词,简单单词为主;

3、包含词条录入、单词查询、词条修改、词条删除功能,修改后保存到文件;

4、信息显示,将所有单词按字母顺序显示。

  • 内容及要求

1、主函数是一个功能选择菜单,其它功能都用各自的函数实现;

2、所有数据文件形式存储,至少提供10组原始数据,在程序执行前,通过文件导入,程序执行完毕后,再将新的数据存入文件(避免在程序执行过程中反复对文件进行读写);

3、多组数据的存储可用结构体数组,用链表实现可加分;

4、可以对数据可以进行增、删、改的编辑操作,增加时,系统监测所添加信息是否存在,如果存在,会提示已经存在,是否修改;删除时,同样要求再次确定;

5、如涉及到排序、查找操作,使用多种算法如选择排序、冒泡排序、折半查找等可加分;

6、对于程序的输入,要有验证功能,如命令菜单只有5项,输入6将提示输入错误,请重新输入,再如需要输入学号,如果输入中文字符将提示输入错误;

7、在基本功能的基础上,如有创新功能可加分。

  • 算法和数据结构设计

#include <stdio.h>

#include <string.h>//调用字符串处理函数

#pragma warning(disable:4996)//忽略改警告

#define MAX_WORDS 100 // 最多存储 100 个单词

struct Word {

 char eng[20]; // 英文拼写

 char chn[50]; // 中文释义

};

struct Word dict[MAX_WORDS]; // 用数组保存单词信息

int wordNum = 0; // 当前保存的单词数量

//单词录入,先打开文件,以追加方式写入单词和中文释义,

//关闭文件,用文件操作 函数 完成

void saveWordsToFile() {

    FILE *fp = fopen("dictionary.txt", "w"); // 打开文件,写入模式

    int i;

    for (i = 0; i < wordNum; i++) {

        fprintf(fp, "%s %s\n", dict[i].eng, dict[i].chn); // 将单词写入文件

    }

    fclose(fp); // 关闭文件

}

//读取

void readWordsFromFile() {

    FILE *fp = fopen("dictionary.txt", "r"); // 打开文件,读取模式

    if (fp == NULL) {

        printf("未找到词典文件\n");

        return;

    }

    char eng[20], chn[50];

    while (fscanf(fp, "%s %s", eng, chn) != EOF) { // 从文件中读取单词

        strcpy(dict[wordNum].eng, eng);

        strcpy(dict[wordNum].chn, chn);

        wordNum++;

    }

    fclose(fp); // 关闭文件

}

//添加单词,上限报错

void addWord() {

    if (wordNum >= MAX_WORDS) { // 单词数量达到上限

        printf("单词数量已达上限,无法添加\n");

        return;

    }

    char eng[20], chn[50];

    printf("请输入英文单词:");

    scanf("%s", eng);

    printf("请输入中文释义:");

    scanf("%s", chn);

    strcpy(dict[wordNum].eng, eng);

    strcpy(dict[wordNum].chn, chn);

    wordNum++;

    saveWordsToFile(); // 将新的单词信息追加写入文件

    printf("添加成功!\n");

}

//查询 ,遍历查找所有的单词

void searchWord() {

    char eng[20];

    printf("请输入要查询的单词:");

    scanf("%s", eng);

    int i;

    for (i = 0; i < wordNum; i++) {

        if (strcmp(eng, dict[i].eng) == 0) { // 如果找到了单词

            printf("%s:%s\n", dict[i].eng, dict[i].chn);

            return;

        }

    }

    printf("未找到该单词\n");

}

//修改 ,先遍历找到该单词 并进行修改

void modifyWord() {

    char eng[20];

    printf("请输入要修改的单词:");

    scanf("%s", eng);

    int i;

    for (i = 0; i < wordNum; i++) {

        if (strcmp(eng, dict[i].eng) == 0) { // 如果找到了单词

            printf("原单词:%s %s\n", dict[i].eng, dict[i].chn);

            printf("请输入修改后的中文释义:");

            scanf("%s", dict[i].chn);

            saveWordsToFile(); // 将修改后的单词信息写入文件

printf("修改成功!\n");

return;

}

}

printf("未找到该单词\n");

}

//词条删除,输入要删除的英文单词,遍历查找中文释义

//删除后写入所有单词与中文释义

void deleteWord() {

char eng[20];

printf("请输入要删除的单词:");

scanf("%s", eng);

int i;

for (i = 0; i < wordNum; i++) {

    if (strcmp(eng, dict[i].eng) == 0) { // 如果找到了单词

        int j;

        for (j = i + 1; j < wordNum; j++) { // 将后面的单词向前移动

            strcpy(dict[j - 1].eng, dict[j].eng);

            strcpy(dict[j - 1].chn, dict[j].chn);

        }

        wordNum--;

        saveWordsToFile(); // 将删除后的单词信息写入文件

        printf("删除成功!\n");

        return;

    }

}

printf("未找到该单词\n");

}

//单词排序,主要是  冒泡排序

void showWords() {

if (wordNum == 0) { // 没有单词信息

printf("词典为空\n");

return;

}

int i, j;

char temp[20];

for (i = 0; i < wordNum - 1; i++) {

    for (j = i + 1; j < wordNum; j++) {

        if (strcmp(dict[i].eng, dict[j].eng) > 0) { // 如果前面的单词应该排在后面

            strcpy(temp, dict[i].eng);

            strcpy(dict[i].eng, dict[j].eng);

            strcpy(dict[j].eng, temp);

            strcpy(temp, dict[i].chn);

            strcpy(dict[i].chn, dict[j].chn);

            strcpy(dict[j].chn, temp);

        }

    }

}

//最终显示

printf("英文单词\t中文释义\n");

for (i = 0; i < wordNum; i++) {

    printf("%s\t\t%s\n", dict[i].eng, dict[i].chn);

}

}

int main() {

readWordsFromFile(); // 从文件中读取单词信息

int choice;

while (1) {

    printf("\n电子英汉词典\n");

    printf("1. 添加单词\n");

    printf("2. 查询单词\n");

    printf("3. 修改单词\n");

    printf("4. 删除单词\n");

    printf("5. 显示所有单词\n");

    printf("0. 退出程序\n");

    printf("请输入功能选项:");

    scanf("%d", &choice);

    switch (choice) {

        case 1:

            addWord();

            break;

        case 2:

            searchWord();

            break;

        case 3:

            modifyWord();

            break;

        case 4:

            deleteWord();

            break;

        case 5:

            showWords();

            break;

        case 0:

            return 0;

        default:

            printf("无效的选项,请重新输入\n");

    }

}

return 0;

}

  • 核心代码分析

这里不需要连续打印出完整代码,在介绍实现的各个功能时,对应的贴上相应那段代码,并用文字加以解释。

1. 添加单词

void addWord() {

    if (wordNum >= MAX_WORDS) { // 单词数量达到上限

        printf("单词数量已达上限,无法添加\n");

        return;

    }

    char eng[20], chn[50];

    printf("请输入英文单词:");

    scanf("%s", eng);

    printf("请输入中文释义:");

    scanf("%s", chn);

    strcpy(dict[wordNum].eng, eng);

    strcpy(dict[wordNum].chn, chn);

    wordNum++;

    saveWordsToFile(); // 将新的单词信息追加写入文件

    printf("添加成功!\n");

}

2.查询 ,遍历查找所有的单词

void searchWord() {

    char eng[20];

    printf("请输入要查询的单词:");

    scanf("%s", eng);

    int i;

    for (i = 0; i < wordNum; i++) {

        if (strcmp(eng, dict[i].eng) == 0) { // 如果找到了单词

            printf("%s:%s\n", dict[i].eng, dict[i].chn);

            return;

        }

    }

    printf("未找到该单词\n");

}

3.修改单词 ,先遍历找到该单词 并进行修改

void modifyWord() {

    char eng[20];

    printf("请输入要修改的单词:");

    scanf("%s", eng);

    int i;

    for (i = 0; i < wordNum; i++) {

        if (strcmp(eng, dict[i].eng) == 0) { // 如果找到了单词

            printf("原单词:%s %s\n", dict[i].eng, dict[i].chn);

            printf("请输入修改后的中文释义:");

            scanf("%s", dict[i].chn);

            saveWordsToFile(); // 将修改后的单词信息写入文件

printf("修改成功!\n");

return;

}

}

printf("未找到该单词\n");

}

4.词条删除,输入要删除的英文单词,遍历查找中文释义

void deleteWord() {

char eng[20];

printf("请输入要删除的单词:");

scanf("%s", eng);

int i;

for (i = 0; i < wordNum; i++) {

    if (strcmp(eng, dict[i].eng) == 0) { // 如果找到了单词

        int j;

        for (j = i + 1; j < wordNum; j++) { // 将后面的单词向前移动

            strcpy(dict[j - 1].eng, dict[j].eng);

            strcpy(dict[j - 1].chn, dict[j].chn);

        }

        wordNum--;

        saveWordsToFile(); // 将删除后的单词信息写入文件

        printf("删除成功!\n");

        return;

    }

}

printf("未找到该单词\n");

}

5.单词排序,主要是冒泡排序

void showWords() {

if (wordNum == 0) { // 没有单词信息

printf("词典为空\n");

return;

}

int i, j;

char temp[20];

for (i = 0; i < wordNum - 1; i++) {

    for (j = i + 1; j < wordNum; j++) {

        if (strcmp(dict[i].eng, dict[j].eng) > 0) { // 如果前面的单词应该排在后面

            strcpy(temp, dict[i].eng);

            strcpy(dict[i].eng, dict[j].eng);

            strcpy(dict[j].eng, temp);

            strcpy(temp, dict[i].chn);

            strcpy(dict[i].chn, dict[j].chn);

            strcpy(dict[j].chn, temp);

        }

    }

}

6.最终显示

printf("英文单词\t中文释义\n");

for (i = 0; i < wordNum; i++) {

    printf("%s\t\t%s\n", dict[i].eng, dict[i].chn);

}

  • 运行效果分析

主页菜单

1.添加单词

2.查询单词

3.修改单词

4.删除单词

5.显示所有单词

6.退出程序

  • 总结

一周的课程设计已经结束了。回想学习c语言的过程中,既有快乐又有烦恼,通过这次c语言的课程设计,我明白了很多也知道了很多,更收获了很多。

回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。在设计的过程中遇到的问题,这毕竟独立做的,难免会遇到各种各样的问题,同时在设计的过程中发现自己的不足之处,对以前所学的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识从新温故。

很感谢这次的课程设计,它使我更加地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题;另外,在做任何事倒要有耐心,不要一遇到困难就退缩;在学习和工作中要时刻谨记“团结”二字,它好比通向成功的铺路石,不可或缺。

这篇关于C语言程序设计课程设计 (电子英汉词典)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/530333

相关文章

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(