用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.状态模式(…

Docker compose部署RocketMQ(单机版)

整个工具的代码都在Gitee或者Github地址内 gitee:solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github:GitHub - ZeroNing/solomon-parent: 这个项目主要是…

Ubuntu20.4系统编译瑞芯微RK3568 SDK

Ubuntu20.4系统编译瑞芯微RK3568 SDK ubuntu20.4系统中编译SDK时,需要安装部分依赖。除了官方给出的依赖之外,要先安装如下依赖,否则会报错 sudo apt-get install libatk-bridge2.0-02.34.1-3 -y sudo apt-get install libgtk-3-dev -y完整…

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;且是工作者…

Android 中的 Zygote 和 Copy-on-Write 机制详解

在 Android 系统中&#xff0c;Zygote 是一个关键的进程&#xff0c;几乎所有的应用进程都是通过它 fork&#xff08;派生&#xff09;出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势&#xff0c;这得益于 fork 操作和 Linux 中的 Copy-on-Write&#xff08;COW&am…

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

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

关于写React的一些反思和总结

这两个星期我都一直在写IT资产管理这个模块。关于这个模块&#xff0c;前端和后端都是我来处理&#xff0c;对于后端&#xff0c;我碰到了很多问题&#xff0c;但是很多问题都可以在比较短的时间内解决&#xff0c;而且不会说完全没有头绪的那种&#xff0c;这一方面源于我本身…

Mybatis中批量插入foreach优化

数据库批量入库方常见方式&#xff1a;Java中foreach和xml中使用foreach 两者的区别&#xff1a; 通过Java的foreach循环批量插入&#xff1a; 当我们在Java通过foreach循环插入的时候&#xff0c;是一条一条sql执行然后将事物统一交给spring的事物来管理&#xff08;Transa…

Thinkphp6视图介绍

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

Ceph client 写入osd 数据的两种方式librbd 和kernel rbd

在Ceph存储系统中&#xff0c;客户端&#xff08;Ceph client&#xff09;写入OSD&#xff08;Object Storage Daemon&#xff09;数据确实可以通过两种主要方式&#xff1a;librbd和kernel rbd。这两种方式各有特点和适用场景&#xff0c;下面将分别进行详细介绍。 librbd方式…

基于大语言模型意图识别和实体提取功能;具体ZK数值例子:加密货币交易验证;

目录 基于大语言模型意图识别和实体提取功能 案例背景 零知识证明过程 具体例子 具体举例(简化) 具体ZK数值例子:加密货币交易验证 定义多项式 承诺 挑战 证明构造 证明验证 结论 zkLLM Zero Knowledge Proofs for Large Language Models 在大模型验证过程中处…

Python小游戏24——小恐龙躲避游戏

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以通过以下命令安装&#xff1a; 【bash】 pip install pygame 【python】代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen …

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…

【C#】第6章:用户界面设计 课后习题

文章目录 C# 控件知识详解一、选择题解析二、填充题解析 以下是一篇关于 C#中各类控件知识点的博客文章&#xff1a; C# 控件知识详解 在 C#编程中&#xff0c;各种控件起着至关重要的作用&#xff0c;它们为用户界面提供了丰富的交互功能。本文将详细介绍 C#中一些常见控件的…

QT_CONFIG宏使用

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

Python期末复习 | 列表、元组、字典、集合与字符串 | 代码演示

列表、元组、字典、集合与字符串 列表 ​ 列表是Python最重要的内置对象之一&#xff0c;是包含若干元素的有序连续内存空间。当列表增加或删除元素时&#xff0c;列表对象自动进行内存的扩展或收缩&#xff0c;从而保证相邻元素之间没有缝隙。 ​ 在形式上&#xff0c;列表…