【实验报告】C语言实现猜单词的小游戏

之前帮别人写的一个简单的报告,无偿分享给大家~代码在后面,有一些图片出于懒惰没有上传。比较简单,喜欢的话关注我~,请勿商用~

1 系统功能模块结构图

该程序主要思路:

头文件设计,存储结构设计,函数设计;

函数包括:

显示主菜单,功能选择函数

文件读入写入函数,两个txt文件,四个函数

进行游戏设计两个函数

单词的增删改设置1一个函数

对于记录的排序设置一个排序方式函数

2 数据结构设计及用法说明

利用结构体和数组进行存储

应用函数的实参形参实现各个函数的信息一致

typedef struct HISTORY

{

    char name[32];

    int count;

    int len;

}JL;

以下是在M函数中定义的局部变量,主要是结构体数组和字符数组以及整型统计

JL LS[128];

char words[128][2][32];

int SUM1=R1(LS);//计数——历史信息

int SUM2 = R2(words);//计数——单词信息

3 程序结构(画流程图)

该图为函数M()的流程图,该函数是菜单作用,循环调出功能。

该图是主函数

对单词功能菜单实现的源代码以及分析

int W(char words[128][2][32], int SUM2)//对单词增删改,返回的是单词的总共数量

{

int I;char en[32], ch[32];

    printf("\t\t         单词管理\n");

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

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

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

    printf("\t\t         4.退出管理\n");

    printf("\t\t请输入相应功能前的数字进行操作:\n");

    scanf("%d", &I);

    switch (I)//switch结构调用功能

{

        case 1:

            printf("请输入单词的英文和中文\n");

            scanf("%s %s", words[SUM2][1], words[SUM2][0]);

            return SUM2+1;

        case 2:

            printf("请输入要删除单词的中文\n");

            scanf("%s", ch);

            for (int i = 0; i < SUM2; i++)

{

                if (strcmp(ch, words[i][0]) == 0)//寻找相同的单词

{

                    for (int j = i; j < SUM2 - 1; j++)//用strcpy函数将后面的单词移动上前,达成删除功能

{

                        strcpy(words[j][0], words[j + 1][0]);

                        strcpy(words[j][1], words[j + 1][1]);

                    }

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

                    return SUM2-1;

                }

            }

            printf("没有找到该单词!\n");

            return SUM2;//如果没有这个单词,就不改变SUM2

        case 3:

            printf("请输入单词的英文和中文\n");

            scanf("%s %s", en, ch);

            for (int i = 0; i < SUM2; i++)

{

                if (strcmp(ch, words[i][0]) == 0)

{

                    strcpy(words[i][1], en);//用strcpy功能更改单词

                }

            }

            break;

        case 4:

            return SUM2;

        default:

            break;

    }

    return SUM2;

}

4各模块的功能

函数

形参

功能介绍和返回值

void H;

()

欢迎界面

无返回值

void M;

()

功能选择

无返回值

int R1;

(JL LS[128])

读取history.txt文件

返回历史信息的条数

Int R2;

(char words[128][2][32])

读取words.txt文件

返回单词的条数

int G1;

(char words[128][2][32], int SUM2,JL LS[128],int SUM1)

开始游戏

返回历史记录的长度

JL G2;

(JL ret,char word_ch[32], char word_en[32])

进行猜单词

返回一个历史记录

int W;

char words[128][2][32], int SUM2)

单词管理菜单

返回值0

int callback;

(const void* a, const void* b)

排序回调函数

返回值0或1

void save1;

(JL LS[128], int SUM1)

保存历史记录

无返回值

void save2;

(char words[128][2][32], in()t SUM2)

存储单词

无返回值

int main;

()

主函数

返回值0

5 试验结果

设计过程中出现的问题和解决方法:

1 函数的逻辑结构问题

解决方法:分析关联,明确调用关系

2 部分代码语法不清晰

解决方法:查询书籍和互联网,询问老师同学

以下是玩家尝试游戏的输入输出样例:

输入:1

输入玩家姓名

输入:alice

谜底:白

单词首字母:w

你还有3次机会,请输入完整单词

输入:write

w-ite

你还有2次机会,请输入完整单词

输入:white

谜底:心

单词首字母:h

你还有3次机会,请输入完整单词

输入:heart

谜底:父亲

单词首字母:f

你还有3次机会,请输入完整单词

输入:father

谜底:一个

单词首字母:a

你还有3次机会,请输入完整单词

输入:an

游戏结束!

6 调试与测试

调试方法:

1输入简单样例测试

2根据编译器提示改错

3使用编译器debug

程序运行结果截图及文字分析:

1 程序运行测试步骤如下:

  1. 创建txt文件words.txt

按英文 中文格式创建

  1. 创建txt文件history.txt

空白文件

  1. 输入内容,尝试玩家猜单词输入
  2. 查看历史记录
  3. 进行单词的增删改
  4. 关闭系统
  5. 查看两个txt文件现状

2 程序运行结果截图如下:

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

                         1.开始游戏

                         2.单词管理

                         3.历史记录

                         4.退出系统

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

                请输入相应功能前的数字进行操作:

3

以下是前三名玩家的最优历史记录

玩家姓名tim 猜单词次数1 猜单词长度4

玩家姓名alice 猜单词次数5 猜单词长度18

请按任意键继续. . .

7 总结

设计的收获和体会:

通过一学期系统的学习,综合运用了课内外的C语言知识,独立完成了这个具有多种功能,较为完善的猜单词系统。

该系统综合运用了结构体,指针,函数,文件读写等知识,,以较精炼的语言实现了数据的文件流,格式输入输出,结构体存储,,简易计算和查找,筛选数据,排序等功能。

在编写代码的过程中,曾多次出现例如知识点盲区,出现明显的BUG,逻辑结构运用混乱等问题,通过询问老师以及前辈,互联网自学等方式解决了问题,提升了自我。完成该项实验,对于基础的C语言语法有了更深刻的理解,提高了自学能力和耐心,对此有了很大的收获。

历经数日,终于做出了系统的雏形,有着小小的成就感。但我也认识到做一个完善系统的不易。在编写的过程中,有不少的的设想,因为能力不足没有实现。距离真正的系统开发,我们还有很多可以学习的地方。

千里之行,积于跬步。希望能在未来学习的过程中,能融会贯通,力争以后能有更好的编写代码的能力,把程序做得更好。

参考文献

https://www.csdn.net/?spm=1001.2101.3001.4476

附录

#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_SECURE_NO_WARNINGS

#include<math.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

typedef struct HISTORY

{

    char name[32];

    int count;

    int len;

}JL;

void H();//欢迎界面

void M(); //功能选择

int R1(JL LS[128]);//读取history.txt文件,返回历史信息的条数

int R2(char words[128][2][32]);//读取words.txt文件,返回单词的条数

int G1(char words[128][2][32], int SUM2,JL LS[128],int SUM1);//开始游戏,返回历史记录的长度

JL G2(JL ret,char word_ch[32], char word_en[32]);//一次游戏 返回一个历史记录

int W(char words[128][2][32], int SUM2);//单词管理菜单

int callback(const void* a, const void* b);//排序回调函数

void save1(JL LS[128], int SUM1);//保存历史记录

void save2(char words[128][2][32], int SUM2);//存储单词

int main()

{

    H();

    M();

    return 0;

}

void H()//欢迎界面

{  

printf("欢迎进入猜单词系统!\n\n");  

printf("\t\t  |--------------------------|\n");

printf("\t\t  |------- 猜单词系统 -------|\n");

printf("\t\t  |--------------------------|\n");

printf("\n");

return;

}

void M() //功能选择

{   

JL LS[128];

char words[128][2][32];

int SUM1=R1(LS);//计数——历史信息

int SUM2 = R2(words);//计数——单词信息

while (1)

{

printf("\t\t=================================\n");

printf("\t\t         1.开始游戏\n");

printf("\t\t         2.单词管理\n");

printf("\t\t         3.历史记录\n");

printf("\t\t         4.退出系统\n");

printf("\t\t=================================\n");

printf("\t\t请输入相应功能前的数字进行操作:\n");

        int I;

scanf("%d", &I);

        switch (I)

{

        case 1:

            SUM1 =G1(words,SUM2,LS,SUM1);

            save1(LS, SUM1);

            break;

        case 2:

            SUM2= W(words, SUM2);

            save2(words, SUM2);

            break;

        case 3:

            qsort(LS,SUM1, sizeof(JL), callback);

            printf("以下是前三名玩家的最优历史记录\n");

            for (int i=0;i<3&&i<SUM1;i++)

{

                printf("玩家姓名%s 猜单词次数%d 猜单词长度%d\r\n", LS[i].name, LS[i].count, LS[i].len);

            }

            system("pause");

            break;

        case 4:

         printf("\t\t欢迎下次使用!\n");

            exit(0);

        default:

            break;

        }

    }

}

int R1(JL LS[128])//读取history.txt文件,返回历史信息的条数

{

    FILE* fp;

    int SUM= 0;

    fp = fopen("history.txt", "r");

    while (fscanf(fp, "%s %d %d",LS[SUM].name,&LS[SUM].count,&LS[SUM].len) != EOF)//

{

        SUM++;

    }

    fclose(fp);

    return SUM;

}

int R2(char words[128][2][32])//读取words.txt文件

{

    FILE* fp;

    int SUM= 0;

    fp = fopen("words.txt", "r");

    while (fscanf(fp, "%s %s", words[SUM][1], words[SUM][0]) != EOF)//前一个存英文,后一个存中文

{

     SUM++;//每读一条计数增加

}

    fclose(fp);

    return SUM;//返回单词的条数

}

void save1(JL LS[128], int SUM1)//保存历史记录

{

    FILE* fp;

    fp = fopen("history.txt", "w");

    for (int i = 0; i <SUM1; i++)

{

        fprintf(fp, "%s %d %d\n", LS[i].name, LS[i].count, LS[i].len);

    }

    fclose(fp);

}

void save2(char words[128][2][32], int SUM2)//存储单词

{

    FILE* fp;

    fp = fopen("words.txt", "w");

    for (int i = 0; i < SUM2; i++)

{

        fprintf(fp, "%s %s\n",

            words[i][1], words[i][0]);

    }

    fclose(fp);

}

int G1(char words[128][2][32], int SUM2,JL LS[128],int SUM1)//开始游戏,返回历史记录的长度

{

JL h;

h.count = 0;

h.len=0;

printf("输入玩家姓名\n");

scanf("%s", h.name);

int prelen=h.len,I=4;//设置有4次机会

while(I--)

{

int r = rand();

r %= SUM2;

h= G2(h,words[r][0], words[r][1]);

if(h.len==prelen)break;

prelen=h.len;

}

printf("游戏结束!\n");

system("pause");

    for (int i = 0; i < SUM1; i++)

{

        if (strcmp(h.name, LS[i].name) == 0)//已经有这个名字

{

            if (h.count / h.len < LS[i].count / LS[i].len)

{

                LS[i] = h;

return SUM1;

            }

        }

    }

    LS[SUM1] = h;//从来没有

    return SUM1+1;

}

JL G2(JL ret,char word1[32], char word2[32])//一次游戏 返回一个历史记录

{

char A[32];

int count=0;

    printf("谜底:%s\n", word1);

    printf("单词首字母:%c\n",word2[0]);

    while (count <3)

{

printf("你还有%d次机会,请输入完整单词\n",3-count);

        count++;

        scanf("%s",A);

        for (int i= 0; i < (int)strlen(word2); i++)

{

            if (A[i] != word2[i])

{

               A[i] = '-';

            }

        }

        A[strlen(word2)] = '\0';

        if (strcmp(A, word2) == 0)

        {

ret.count+=count;

ret.len+=strlen(word2);

return ret;

}

        else

{

            printf("%s\r\n", A);

        }

    }

    count=0xfffff;//没有猜中

    return ret;

}

int W(char words[128][2][32], int SUM2)//对单词增删改,返回的是单词的总共数量

{

int I;char en[32], ch[32];

    printf("\t\t         单词管理\n");

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

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

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

    printf("\t\t         4.退出管理\n");

    printf("\t\t请输入相应功能前的数字进行操作:\n");

    scanf("%d", &I);

    switch (I)//switch结构调用功能

{

        case 1:

            printf("请输入单词的英文和中文\n");

            scanf("%s %s", words[SUM2][1], words[SUM2][0]);

            return SUM2+1;

        case 2:

            printf("请输入要删除单词的中文\n");

            scanf("%s", ch);

            for (int i = 0; i < SUM2; i++)

{

                if (strcmp(ch, words[i][0]) == 0)//寻找相同的单词

{

                    for (int j = i; j < SUM2 - 1; j++)//用strcpy函数将后面的单词移动上前,达成删除功能

{

                        strcpy(words[j][0], words[j + 1][0]);

                        strcpy(words[j][1], words[j + 1][1]);

                    }

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

                    return SUM2-1;

                }

            }

            printf("没有找到该单词!\n");

            return SUM2;//如果没有这个单词,就不改变SUM2

        case 3:

            printf("请输入单词的英文和中文\n");

            scanf("%s %s", en, ch);

            for (int i = 0; i < SUM2; i++)

{

                if (strcmp(ch, words[i][0]) == 0)

{

                    strcpy(words[i][1], en);//用strcpy功能更改单词

                }

            }

            break;

        case 4:

            return SUM2;

        default:

            break;

    }

    return SUM2;

}

int callback(const void* a, const void* b)//排序回调函数

{

    JL* x = (JL*)a;

    JL* y = (JL*)b;

    if (x->count / x->len < y->count / y->len) return 1;

    else if (x->count / x->len == y->count / y->len) return 0;

    else return 1;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(一)

前言 Jmeter&#xff0c;Postman一些基本大家相比都懂。那么真实在项目中去使用&#xff0c;又是如何使用的呢&#xff1f;本文将一文详解jmeter接口测试 一、接口测试分类 二、目前接口架构设计 三、市面上的接口测试工具 四、Jmeter简介&#xff0c;安装&#xff0c;环境…

计算机网络—OSPF单区域配置

目录 目录 1.实验环境准备 2.配置 OSPF 3.验证 OSPF 配置 4.修改 OSPF hello 和 dead 时间参数 5.OSPF缺省路由发布及验证 6.控制 OSPF DR/BDR 的选举 7.配置文件 拓扑图&#xff1a; 1.实验环境准备 基本配置以及IP编址。 <Huawei>system-view Enter system vi…

YOLOv8改进 | 注意力篇 | 利用YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM&#xff0c;SEAM&#xff08;Spatially Enhanced Attention Module&#xff09;注意力网络模块旨在补偿被遮挡面部的响应损失&#xff0c;通过增强未遮挡面部的响应来实现这一目…

【JAVA】CSS定位与CSS3属性、渐变、CSS3字体、2D变换

1 定位 1.1 相对定位 相对定位没有脱离文档流 定位元素的显示层级比普通元素高 定位元素可以通过margin&#xff0c;float调整位置&#xff0c;但不推荐 包含块&#xff1a;父元素 left和right同时写&#xff0c;右失效 上下同时写&#xff0c;下失效 <head><s…

从零学习Linux操作系统 第三十四部分 Ansible中的执行流控制

一、ansible中的迭代循环 循环迭代任务# 1、简单循环# loop: ##赋值列表 – value1 – value2 – … {{item}} 迭代变量名称 2、循环散列或字典列表 二、Ansible中的条件语句 when: 条件1条件2 条件判断 ‘’value “字符串”,value 数字‘<’value < 数字‘>…

【基础计算机网络2】物理层——通信基础

【前言回顾】 【考纲内容】 一、物理层的基本概念 1.1 物理层的主要任务 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒介。物理层的主要任务&#xff1a;确定与传输媒体接口有关的一些特性。 1.2 物理层的一些特性 机械特性…

C++变参模板

从c11开始&#xff0c;模板可以接受一组数量可变的参数&#xff0c;这种技术称为变参模板。 变参模板 下面一个例子&#xff0c;通过变参模板打印一组数量和类型都不确定的参数。 #include <iostream> #include <string>void print(void) {std::cout<<&quo…

【最新版】ChatGPT/GPT4科研应用与AI绘图论文写作(最新增加Claude3、Gemini、Sora、GPTs技术及AI领域中的集中大模型的最新技术)

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

关于playbook中when条件过滤报The conditional check ‘result|failed‘ failed的问题

问题现象 在使用plabook中的when做过滤脚本如下&#xff1a; --- - hosts: realserversremote_user: roottasks:- name: Check if httpd service is runningcommand: systemctl status httpdregister: resultignore_errors: True- name: Handle failed service checkdebug:ms…

docker常用操作-docker私有仓库的搭建(Harbor),并将本地镜像推送至远程仓库中。

1、docker-compose安装&#xff0c;下载docker-compose的最新版本 第一步&#xff1a;创建docker-compose空白存放文件vi /usr/local/bin/docker-compose 第二步&#xff1a;使用curl命令在线下载&#xff0c;并制定写入路径 curl -L "https://github.com/docker/compos…

基于Spring Boot + Vue的电影购票系统

基于Spring Boot Vue的电影购票系统 功能介绍 分为用户端和商家端&#xff0c;商家端只能让拥有商家角色的人登录 商家可以在系统上面注册自己家的影院信息选择影院进去管理&#xff0c;在选择完要进行操作的影院后&#xff0c;可以在系统的电影库选择电影为当前的影院进行电…

Docker容器Docker桌面配置镜像加速

打开Docker Desktop应用程序&#xff0c;点击设置 具体配置如下&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"features": {"buil…

VScode(Python)使用ssh远程开发(Linux系统树莓派)时,配置falke8和yapf总结避坑!最详细,一步到位!

写在前面&#xff1a;在Windows系统下使用VScode时可以很舒服的使用flake8和yapf&#xff0c;但是在ssh远程开发树莓派时&#xff0c;我却用不了&#xff0c;总是出现问题。当时我就开始了漫长的探索求知之路。中间也请教过许多大佬&#xff0c;但是他们就讲“能用不就行了&…

Windows10/11配置WSL(Ubuntu)环境

文章目录 WSL介绍WSL部署扩展&#xff1a;辅助工具Windosw Terminal安装下载 WSL介绍 传统方式获取Linux操作系统&#xff0c;是安装完整的虚拟机及镜像环境&#xff0c;例如虚拟机VMware 而使用WSL,可以以非常轻量化的方式&#xff0c;得到Linux系统环境 它无需单独虚拟一套硬…

PaddlePaddle----基于paddlehub的OCR识别

Paddlehub介绍 PaddleHub是一个基于PaddlePaddle深度学习框架开发的预训练模型库和工具集&#xff0c;提供了丰富的功能和模型&#xff0c;包括但不限于以下几种&#xff1a; 1.文本相关功能&#xff1a;包括文本分类、情感分析、文本生成、文本相似度计算等预训练模型和工具。…

计算机设计大赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

【C语言基础】:深入理解指针(终篇)

文章目录 深入理解指针一、函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 typedef关键字 二、函数指针数组三、转移表四、回调函数4.1 什么是回调函数4.2 qsort使用举例4.2.1 使用qsort函数排序整形数据4.2.2 使用qsort排序结构数据4.2.3 qsort函数的模拟实现 …

WPF(1)的MVVM的数据驱动学习示例

MVVM Model:数据模型、View 界面、ViewModel 业务逻辑处理 项目结构 界面数据绑定 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/x…

Timus#1005

C【动态规划】 #include<iostream> #include<vector> using namespace std; int main() {int n;cin >> n;vector<int> dp(100000 * 20);vector<int> a(n);int ans 0, cur 0;for (int i 0; i < n; i){cin >> a[i];ans a[i];}int sum…

虚拟主播视频制作,低成本的数字人播报方案

传统的视频制作方式往往面临着成本高、周期长、人力投入大等挑战。为了满足企业对于高效、低成本视频制作的需求&#xff0c;美摄科技凭借其强大的技术研发实力&#xff0c;推出了面向企业的虚拟主播视频解决方案&#xff0c;为企业带来了全新的数字人播报视频制作体验。 美摄…