用appinventor制作艾宾浩斯遗忘曲线app

(呕心沥血 仅供参考)

测试效果演示

用appinventor制作课本记背应用程序(基于遗忘曲线设计)

目录

效果演示

项目重难点

总体设计

系统功能模块设计

总体结构如下图所示:

功能模块

详细设计与实现

登录界面

界面与功能总体设计

“账号密码列表”数据库设计

“注册/修改密码”按钮功能设计与实现

“登录按钮”按钮的功能设计与实现

录入新课界面

界面与功能整体设计

对应账号课文列表数据库的设计

日期选择功能与时间相关功能设计与实现

判断课文是否需要复习的相关功能设计与设计

 存储当前课文相关信息的功能设计与实现

 复习清单界面

界面与功能整体设计

 复习清单功能设计与实现

语言复习界面

界面与功能整体设计

课文正确率数据库设计

语言识别功能的设计与实现

“对比正确率”和“总体正确率”按钮相关功能与实现

文本比较算法的设计(难能可贵,脑子烧了)

 复习率统计界面

正确率数据的查找

 测试

测试计划

 测试结果

不足与展望

存在问题

未来展望


项目重难点

1.整体系统功能的设计、设计模式框架的搭建

2.使用人工智能API--OCR功能和语音转文字

3.文本正确率对比设计

4.数据库关系模型搭建

总体设计

系统功能模块设计

总体结构如下图所示:

功能模块

(1)登录页面:进行账号登陆功能:进入登录界面输入账号密码,如果忘记密码或者还没有账号,可以选择“注册/修改密码”按钮。

(2)录入新课界面:选择当前的日期,输入课文的标题,点击“添加并识别内容”按钮,会调用照相机进行拍照,利用OCR识别文字,点击“完成”按钮进行数据的存储,并进入到复习界面。

(3)复习清单界面:显示根据艾宾浩斯遗忘曲线设置的复习间隔时间和复习次数,可以选择清单中的课文,进入到语音复习界面。

(4)语音复习界面:可以点击“开始复习按钮”进行语音转文字的过程,当文本输入完成后,点击“对比正确率”按钮即可看到自己的正确率,点击“总体正确率”按钮可以进入到复习率统计界面。

(5)复习率统计界面:看到某个账号对应某篇课文的复习正确率曲线。

(6)结束界面: 点击“退出”按钮,关闭app,点击“返回”按钮,回到登录界面

详细设计与实现

登录界面

界面与功能总体设计

主要是实现用户登录功能,界面设计如下图所示:

“账号密码列表”数据库设计

将存储用户账号密码的数据库命名为“账号密码列表”,使用appinventor中的微数据库(存储空间地址为TinyDB1—默认地址,可以在其他界面调用)来存储数据,微数据库的使用类似于python中字典的使用,便签相当于字典的键,其中的二维列表相当于字典的值。

设计的数据示例如下:

 {“账号密码列表”:[ [账号1,密码1],[账号2,密码2] ] }   账号为唯一标识。

“注册/修改密码”按钮功能设计与实现

当用户没有账号时或者是忘记了密码时可以按这个按钮进行设置,核心代码如下图所示:

1)确保账号和密码不为空。

2)如果都不为空,就判断是否已经有该账号(有的话进行的是修改密码的操作,没有的话进行的是注册账号的操作)。

3)修改密码----遍历从微数据库中获取到的“账号密码列表”,遍历到对应账号的列表项,修改列表的第2项(密码)为当前密码输入文本框的内容。

4)注册账号----创建列表追加到目前的账号密码列表。

 5)最后进行微数据库中“账号密码列表”的更新。

“登录按钮”按钮的功能设计与实现

当用户在文本框中输入账号和密码后,点击该按钮,进行账号和密码的判断,核心代码如下图所示:

1)遍历微数据库中存储的“账号密码列表”是否有对应的账号和密码。

2)如果有就进入到录入新课界面并传递账号参数(唯一标识),如果没有就显示短暂的消息提醒。

录入新课界面

界面与功能整体设计

选择当前的日期,输入课文的标题,点击“添加并识别内容”按钮,会调用照相机进行拍照,利用OCR技术识别文字,点击“完成”按钮进行今天需要复习的课文相关信息的存储,并进入到复习界面,界面设计如下图所示:

对应账号课文列表数据库的设计

①将存储某个用户的课文列表的数据库命名为“xxx” (“xxx”为账号密码列表中的账号),存储每个账号对应的课文列表,而课文列表包括了5个参数:标题、内容、课文上次学习时间、是第几次学习、是否应该复习,数据库设计示例如下:

数据示例: {   XXX:[      [   标题一,内容一,2024-4-2,0,0  ],

[   标题二,内容二,2024-3-13,2,1 ]         ]

XXX1:[      [   标题一,内容一,2024-4-2,0,0  ],

[   标题二,内容二,2024-3-13,2,1  ]         ]

}             说明:账号为唯一标识,用于区别不同的课文列表

②用微数据库存储某个用户的上次登录时间(只有一个数据),命名为“xxx上次登录时间”,该数据可用于语音复习界面更新某个课文“上次学习时间”和用于下一次相隔时间的计算。

③用微数据库存储某个用户的上次登录时间和现在时间对比的登录相隔时间(只有一个数据),命名为“xxx相隔时长”,会用到复习清单界面的时间提醒标签上。

日期选择功能与时间相关功能设计与实现

①登录相隔时间的计算,用于显示在复习清单界面中。

当设置了当天的日期,就跟上次登录的时间进行对比,主要是通过调用“距离上一次学习的时长”函数并且传递数据库中的上次登录时间和当前输入的时间(日期选择框设定的时间),从而实现这个功能,核心代码如下图所示:

 其中“具体上一次学习的时长”函数的设计主要是通过循环累加天数来统计相隔的时长,其中还涉及了是否为闰年、具体月份天数的判断,核心代码如下图所示:

 

 在录入新课界面和课文清单界面用的微数据库是同一个地址,在本界面进行数据的存储,因而能在课文清单界面中的“时间提示”标签中进行显示,核心代码如下图所示:


②日期选择功能

当在日期选择框中完成了日期的设定,在上一步计算好相隔时间后,就更新“xxx上次登录时间”的数据库,方便下次再登录该界面时进行时间相隔的计算。

判断课文是否需要复习的相关功能设计与设计

功能设计如下:

当用户登录后,会利用用户的账号寻找存储其对应的课文列表,并更新当前的时间,判断该课文是否需要复习,如果需要复习,则会转递到课文清单界面进行选择。当日期选择后,如果该用户的课文列表不为空,就会根据当前的时间进行更新课文列表的操作,涉及到的代码如下图所示:

如上图,主要是通过遍历课文列表中的每一个课文项,根据当前登录时间、课文录入时间、已复习次数进行条件的设置,从而判断该课文是否应该要复习了,并进行数据的替换,具体时间判断逻辑如下表所示:

每篇课文会提醒复习4次。从你开始录入课文开始计时。

     第一次复习在录入后第1周

     第二次复习在录入后第3周

     第三次复习在录入后第6周

     第四次复习在录入后

第9周

第几次学习

要复习的相隔时间

说明

0

0天

之前录入的一次都没有复习的课文,就会更新一下日期,等价于这次录入的新课文,从这个时间开始计算遗忘曲线的周期

1

7天

之前已经学习过一次,在一周后进行复习

2

14天

相隔2周(第一周和第三周间隔)

3

21天

相隔3周(第三周和第六周间隔)

4

21天

相隔3周(第六周和第九周间隔)当复习完(第5次学习)后,课文就不会再出现显示在复习清单中

 存储当前课文相关信息的功能设计与实现

功能设计如下:

首先是在标题的文本输入框中输入课文的标题,然后点击“添加并识别内容”按钮,去调用百度智能云的OCR技术的API接口,将识别到的文本显示在内容的文本输入框中,进行修改后,点击“完成”按钮,实现课文的存储和界面的跳转。

①“添加并识别内容”按钮功能设计

具体的逻辑顺序为,当界面初始化时,先会去访问token客户端的网址,发送GET请求(需要自己注册百度智能云账号,获取到API_id和API_secret,从而确定要访问的URL是什么),获取到acess_token参数,当按钮被点击时,先会调用照相机拍照,当照相机拍照完成后,就会利用相机获取到的图像文件路径和之前获取到的acess_token参数向Http客户端2发送POST请求,调用对应的API服务,核心代码如下图所示:

涉及到的智能百度云的界面如下图所示:

(get)

 (post)

 当点击完成按钮时,会根据输入的课文标题、OCR识别并自己调整后的课文内容进行课文的保存,核心代码如下图所示,主要是调用“保存课文”函数,向下一个界面(复习清单界面)转递用户名参数。(复习清单界面通过同一个地址的数据库能获取到应当复习的课文)

 因为保存的课文是刚录入的课文,因此是当天需要复习的课文,课文的第4项(第几次学习)为0,第5项(是否应该学习)为1(应当学习)。最后将当前课文追加到课文列表,保存到对应账户名的数据库数据,函数代码设计如下图所示:

 复习清单界面

界面与功能整体设计

显示根据艾宾浩斯遗忘曲线设置的复习间隔时间和复习次数,可以选择清单中的课文,进入到语音复习界面,界面如下图所示:

 复习清单功能设计与实现

①获取要复习的课文列表,主要是通过获取数据库中存储的该账号(从录入新课界面传递过来的参数)的课文列表,判断其中哪些是需要复习的课文(判断课文项的第5项是否为1)。核心代码如下图所示:

 

②当点击“查看清单”按钮时,就会调用“初始化课表显示框”函数,appinventor中的列表显示框模块可以通过“,”来实现元素的分割/换行。

显示的课文样例(标题  点击     已复习次数:   上次学习日期)如下:

 主要是取出应背课文列表中的元素,通过“合并文本”的积木,依次连接各个课文项,核心代码如下图所示:

最后当我们选择列表选择框的某一项时,就传递存储用户名和对应课文的标题的列表到语音复习界面。

语言复习界面

界面与功能整体设计

可以点击“开始复习按钮”进行语音转文字的过程,当文本输入完成后,点击“对比正确率”按钮即可看到自己的正确率,点击“总体正确率”按钮可以进入到复习率统计界面,界面设计如下图所示:

课文正确率数据库设计

这里的课文正确率指的是针对某一个用户所录入的某篇课文在不同复习阶段所展现的正确率,会用于在课文正确率统计界面进行曲线的绘制。

①将存储每个用户复习课文的记录存储到一个表中,命名为“用户记录表”,每个列表项包括4个参数(ID,当前的用户名,当前复习的课文标题,当前的正确率),数据示例如下:

{“用户记录表”:[1,用户1,标题1,0.8 ],

[2,用户2,标题1,0.8 ],

[3,用户1,标题2,0.8 ],

[4,用户2,标题2,0.8 ],

[5,用户1,标题1,0.7]

}         说明:ID为唯一标识,每一个记录的ID都不同。 

语言识别功能的设计与实现

主要是通过获取百度智能云中语音识别API接口参数,在appinventor中编写简单的代码,涉及到操作的图片如下:

“对比正确率”和“总体正确率”按钮相关功能与实现

①首先获取当前的复习的课文内容,是利用上一个屏幕中传递过来的账户和对应课文标题列表中的“账号”参数获取到微数据库中对应的账号的课文列表,通过“文章标题”参数遍历课文列表,从而获取到对应的课文内容,核心代码如下图所示:

 ②当用语音输入了文本并进行了调整,点击“对比正确率”按钮,调用“文本比对算法”函数进行正确率的计算,这里设计了当正确率大于60%时,就算复习完成,整体代码如下图所示:

 

 同时在这个过程中会调用“添加用户记录”函数,追加当前复习的记录到“用户记录表”中,调用“更新数据库课文的复习”函数,让课文的学习次数+1,更新其上次学习时间,然后存储到对应的数据库中,代码如下图所示:

③“总体正确率”按钮,主要是设置了转递账号和对应文章标题到下一个界面的逻辑,复习率统计界面会根据这两个参数到“用户记录表”中查找对应的正确率,并绘制曲线,代码设计如下图所示: 

 

文本比较算法的设计(难能可贵,脑子烧了)

模拟了python的jieba库,是通过基于前缀词典的前向最大匹配算法来实现词汇的划分,然后通过把两段文本通过词汇编码、计算频率转化为向量,计算它们的余弦相似度,详细的操作说明如下图所示:

核心代码如下图所示。流程:创建词汇列表(create_vocabulary和tokenize)—词频向量化(encode_text)---套用余弦函数(cosine_similarity)。

 

 复习率统计界面

正确率数据的查找

当在语音复习界面点击了“总体正确率”按钮,就会转递有账号和文章标题的列表,根据这个数据在“用户记录表”中查找满足账号相同且文章标题相同的记录项,代码设计如下图:

 并把记录项存储到“该用户记录表”的列表中,并根据这个列表的长度,创建相同长度的颜色数组、次数数组、正确率数组(每一个项为“该用户记录表”中的第4项—正确率),代码设计如下图所示:

 绘制曲线功能的实现

用了现有的扩展组件,如下图所示,实现了对应的功能。

主要是通过上一步得到的次数数组、正确率数组作为x、y坐标,调用SimpleChart组件的CreateLineGraph函数绘制折线图,代码设计如下图所示:

 测试

测试计划

 测试结果

时间

界面

4.1

4.8

 

4.10

4.17

4.22

5.1

6.10

只复习绝句

7.25

都进行复习

9.27

最后的正确率曲线—编程小队的《绝句正确率》曲线

不足与展望

存在问题

①语音识别只能识别短文本,不太稳定。可能需要使用手机自带的语音转文字功能。

②日期输入必须比之前大,还没有实现通过系统自动获取时间,需要手动输入日期。

③两个百度识别(OCR、语音识别)的功能都需要保证网络的通畅。

④app用久了会卡顿,没有做屏幕的清除和关闭。

未来展望

实现更加智能的艾宾浩斯遗忘曲线,根据自己对课文的熟悉程序去调整复习的周期,在复习完后,学生可以选择自己对课文的熟悉程度,当很陌生时进入上一个周期,增加复习的次数,当觉得很熟悉时,可以进入下一个周期,提前完成任务,参考案例如下图所示:

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

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

相关文章

【设计模式】行为型模式(三):责任链模式、状态模式

行为型模式(三):责任链模式、状态模式 5.责任链模式(Chain of Responsibility)5.1 通俗易懂的解释5.2 具体步骤5.3 代码示例5.3.1 处理者接口5.3.2 具体处理者5.3.3 测试类5.3.4 输出 5.4 总结 6.状态模式(…

CC3学习记录

🌸 CC3 之前学习到的cc1和cc6都是通过Runtime进行命令执行的,如果Runtime被加入黑名单的话,整个链子也就失效了。而cc3则是通过动态类加载机制进行任意代码执行的。 🌸 版本限制 JDK版本:8u65 Commons-Collections…

flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例

flutter字体大小切换案例 小字体&#xff0c;标准字体&#xff0c;大字体&#xff0c;超大字体案例 Android iOS设备带有选择记录 我的flutter项目版本 environment: sdk: ‘>3.4.4 <4.0.0’ 图片案例 pubspec.yaml 添加依赖 # 屏幕尺寸适配 https://github.com/OpenF…

设计模式(四)装饰器模式与命令模式

一、装饰器模式 1、意图 动态增加功能&#xff0c;相比于继承更加灵活 2、类图 Component(VisualComponent)&#xff1a;定义一个对象接口&#xff0c;可以给这些对象动态地添加职责。ConcreteComponent(TextView)&#xff1a;定义一个对象&#xff0c;可以给这个对象添加一…

django入门【05】模型介绍(二)——字段选项

文章目录 1、null 和 blank示例说明⭐ null 和 blank 结合使用的几种情况总结&#xff1a; 2、choices**choices 在 Django 中有以下几种形式&#xff1a;**&#xff08;1&#xff09; **简单的列表或元组形式**&#xff08;2&#xff09; **字典映射形式**&#xff08;3&#…

C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1

各位小伙伴们&#xff0c;上一期的保留小数位数教学够用一辈子&#xff0c;有不错的点赞量&#xff0c;可我连一个粉丝铁粉都没有&#xff0c;你愿意做我的第一个铁粉吗&#xff1f;OK废话不多说&#xff0c;开始&#xff01; 温故与知心 可能你也学过&#xff0c;且是工作者…

【提高篇】3.3 GPIO(三,工作模式详解 上)

目录 一,工作模式介绍 二,输入浮空 2.1 输入浮空简介 2.2 输入浮空特点 2.3 按键检测示例 2.4 高阻态 三,输入上拉 3.1 输入上拉简介 3.2 输入上拉的特点 3.3 按键检测示例 四,输入下拉 4.1 输入下拉简介 4.2 输入下拉特点 4.3 按键检测示例 一,工作模式介绍…

Thinkphp6视图介绍

一.MVC MVC 软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09; ThinkPHP6 是一个典型的 MVC 架构 控制器—控制器&#xff0c;用于将用户请求转发给相应的Model进行处理&a…

C++(Qt)软件调试---内存泄漏分析工具MTuner (25)

C(Qt)软件调试—内存泄漏分析工具MTuner &#xff08;25&#xff09; 文章目录 C(Qt)软件调试---内存泄漏分析工具MTuner &#xff08;25&#xff09;[toc]1、概述&#x1f41c;2、下载MTuner&#x1fab2;3、使用MTuner分析qt程序内存泄漏&#x1f9a7;4、相关地址&#x1f41…

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏&#xff0c;之前以为和#define、DEFINES 差不多&#xff0c;看了定义才发现不是那么回事&#xff0c;定义如下&#xff1a; 看注释就知道了QT_CONFIG宏&#xff0c;其实是&#xff1a;实现了一个在编译时期安全检查&#xff0c;检查指定的Qt特性…

Redis下载历史版本

Linux版本&#xff1a; https://download.redis.io/releases/ Windows版本&#xff1a; https://github.com/tporadowski/redis/releases Linux Redis对应gcc版本

8 软件项目管理

软件项目管理 1、软件项目管理概念1.1 软件项目管理内容1.2 软件项目管理的4P要素人员产品过程项目 2、软件项目度量2.1 软件项目度量定义及度量方法2.2 面对规模的度量2.3 面对功能的度量UFC相关的五类组件14个复杂性调节因素 F i F_i Fi​一个功能点开发代码行数 2.4 软件估算…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西&#xff0c;主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数&#xff08;或 alloca&#xff09;分配的是栈内存&#xff0c;它的特点是&#xff1a; 生命周…

如何保证Redis与MySQL双写一致性

什么是双写一致性问题&#xff1f; 双写一致性主要指在一个数据同时存在于缓存&#xff08;如Redis&#xff09;和持久化存储&#xff08;如MySQL&#xff09;的情况下&#xff0c;任何一方的数据更新都必须确保另一方数据的同步更新&#xff0c;以保持双方数据的一致状态。这一…

STM32设计学生宿舍监测控制系统

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 随着科技的飞速发展和智能化时代的到来&#xff0c;学生宿舍的安全、舒适…

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数&#xff0c;初始化节点对象&#xff0c;包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点&#xff0c;默认为None self.rig…

【C#】C#编程入门指南:构建你的.NET开发基础

文章目录 前言&#xff1a;1. C# 开发环境 VS的基本熟悉2. 解决方案与项目的关系3. 编辑、编译、链接、运行4. 托管代码和CLR4.1 CLR&#xff1a;4.2 C# 代码第编译过程&#xff08;两次编译的&#xff09; 5. 命名空间6. 类的组成与分析7. C# 的数据类型7.1 值类型7.2 引用类型…

算法闭关修炼百题计划(八)

一半来自力扣的push题单 1.最大连续1的个数II2.长度为k的无重复字符子串3.句子的相似性4.移位字符串分组5.x的平方根6.Z字形变换 1.最大连续1的个数II 给定一个二进制数组nums&#xff0c;如果最多可以翻转一个0&#xff0c;则返回数组中连续1的最大个数 之前是Window&#x…

论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking

VIPose: Real-time Visual-Inertial 6D Object Pose Tracking 文章概括摘要I. INTRODACTIONII. 相关工作III. APPROACHA. 姿态跟踪工作流程B. VIPose网络 文章概括 引用&#xff1a; inproceedings{ge2021vipose,title{Vipose: Real-time visual-inertial 6d object pose tra…

K8S containerd拉取harbor镜像

前言 接前面的环境 K8S 1.24以后开始启用docker作为CRI&#xff0c;这里用containerd拉取 参考文档 正文 vim /etc/containerd/config.toml #修改内容如下 #sandbox_image "registry.aliyuncs.com/google_containers/pause:3.10" systemd_cgroup true [plugins.…