目录
本次设计主要是对大学时间所学的 Android 技术开发 ,数据库等课程的一次巩固复习及应用。本设计根据用户确定的单词本以及在设置中自定义的学习量,要求系统有计划地每天帮用户安排单词复习;用户可以自由选择更换单词本以及重置学习记录;可以通过各大翻译平台提供的 API 查找单词例句,可以了解自己的学习记录和记忆情况,可以自定义系统主题;
本课题的开发平台为:
操作系统:Microsoft Windows 10
程序语言:Java,XML
IDE 工具:AndroidStudio 4.1.1
IDE 插件:Database browser
数据库服务器:SQLite
其他工具:Android 7.0 以上系统的智能手机或者模拟器
本章主要对系统构建进行较为详细的需求分析、目标分析和功能分析。
据调查,2019 年美国的互联网用户规模已不低于 2.9 亿人,互联网使用率达到 89.4%,每日手机使用的平均时长超过三个小时。在免费应用中比较热门类型为社交类,游戏类,办公类及网络视频类;在付费应用中比较热门类型为工具类及网络游戏类。在 Android 平台,GooglePlay 中拥有庞大的应用程序;其数量和下载量均远超国内任意一家应用商店,由此可见国外使用移动应用程序的大潮早已来临,刺激了更多移动应用程序的开发需求。[17]不同于国内多数开发者在应用程序开发语言的选择上仍然使用 Java 作为开发语言,国外多数开发者普遍选用 Kotlin 作为开发语言。[18]
国内的 Android 开发还是主要以应用开发为主, 主要分成三类: 为企业开发应用、游戏开发和开发通用应用。
背单词 App 的开发,需要用户能够随时地操作用户数据以及对每日任务和各单词出现的词频率自动做出调整,以满足用户高效率背诵单词的需要;因而在安排用户复习时对应单词本中的词频计算尤为重要,本系统目标是按艾宾浩斯遗忘曲线和用户熟识度相结合安排复习的方法来实现用户单词背诵效率最大化[20]。此外,应用还需要实时给出直观的用户熟识度统计和完成情况图:
对各个单词的熟识度应由用户在复习单词时来自主选择;熟识度包括熟记,认识,模糊和忘记四个选项,每个熟识度将由系统判断在保证今日任务的情况下再次安排复习。保证用户在当天背诵记忆能够更加巩固,牢靠。
本应用充分利用艾宾浩斯遗忘曲线,使用户对非今日任务做一个合理的复习;艾宾浩斯遗忘曲线计算方法只依赖与系统时间戳;被由于艾宾浩斯遗忘曲线而安排用户复习的单词将刷新该单词的遗忘率(这与用户熟识度无关);从而保证用户对过去已学单词的背诵记忆够更加巩固,牢靠。
通过数据库统计数据并且利用 API 以图的形式直观地展现给用户。统计图包括当前词本学习进度统计图,艾宾浩斯遗忘曲线图和学习情况统计图;其中学习情况统计图提供用户明确的用户熟识度情况,剩余计划和单词收藏情况。
通过用户界面设置达到用户自定义每日任务量,用户学习任务管理和系统主题等目的,进一步提高用户的使用体验和学习效率。
该系统由两个子系统构成:前台展示背单词子系统和后台数据管理子系统。同时主要包含两种 JSON 数据解析和一种 XML 数据解析过程:幽灵背单词 API 词汇本和词汇数据解析,爱词霸词典 API 数据解析。其中幽灵背单词 API 数据解析是关键部分,是全部相关词汇的数据来源。
前台展示背单词子系统

前台展示背单词子系统简述
后台数据管理子系统

后台数据管理子系统简述
该系统的主要功能规划如图 3-3 所示,这里展现的只是系统的主要流程的大致环节,详细说明会在后面功能模块的详细设计中涉及。

复习功能模块是展示给用户的第一个 fragment,其工作原理和用户界面是背单词 App 最关键的部分,对是否能激发用户继续使用本应用起着非常巨大的作用。因此,复习功能模块的设计需要重视用户的体验度和美工设计,同时还需要兼具使用方便,信息全面等特点。在复习功能模块中,fragment 主体上从上到下依次分为三个框架,第一个框架显示该用户的今日进度和单词任务量信息;第二个框架是用户对当前单词的操作框架(例如单词收藏,单词发音和熟识度选择等);第三个框架是单词释义,音标,例句等信息。
为了方便叙述,先从第二框架和第三框架开始介绍。
对用户来说,如果不进行任何操作,第二框架和第三框架的可见部分只有单词,单词音标,单词发音和单词收藏。单词的词性,释义,和例句部分以及单词的熟识度选择部分会被完全隐藏起来。本项目将单词例句和单词词性控件上设置点击事件并由提示性点击文字。用户执行相应操作后则会显示第二框架和第三框架的用户熟识度选择,单词词性和单词例句。其中用户熟识度一共有四种选择,分别是熟记,认识,模糊和忘记。单词操作以及熟识度选择的作用如下:
在初始化数据时,应用程序将准备 wordList 和 hitList。其中 wordList 中装有今日用户需要完成的所有单词而 hitList 装有所有被击中词汇(在这里将因熟识度而再次被安排复习的所有单词成为被击中词汇,下同)。用户必须在这四种熟识度中选择一个才能进行下一个单词的复习。在准备安排下一个单词复习时将由 50% 的可能性使该单词是来自 hitList;
第一框架中的今日进度和每日任务量数据都来自于用户数据表,当用户在进行熟识度选择并且下一个单词是来自于 wordList 时,今日进度加一。今日进度的最大值不大于每日任务量否则提示任务已完成信息。当用户未完成昨日任务量时,今日进度会重置为 1,但在安排复习时仍然从昨日未进行熟识度选择的那个单词开始计算。当用户在设置功能模块中重新设置任务量时分为以下几种情况:
复习功能模块演示(白日主题和夜间主题)


统计功能模块是被设计用来直观地反映用户学习情况的 fragment,其统计数据全部来源于数据库并且被实时更新。因此除一定的点击响应事件外(如扇形统计图可以随用户手势进行原地旋转),用户不可以直接对统计图进行编辑或修改操作。其运用了 HelloChart 图形绘制框架,可以描绘除各种漂亮的统计图。通过 HelloChart,本模块包含了用户学习进度扇形统计图,艾宾浩斯遗忘数据折线图和用户学习情况柱形统计图:
统计功能模块演示(白日主题和夜间主题)长截图

词本功能模块也是背诵单词 App 的核心模块之一,其主要功能是用来帮助用户更换当前所学词本,执行这个操作后再回到复习功能模块中会发现今日进度会被重置,但是用户每日任务量保持不变,在统计功能模块中针对当前所学词本的学习进度扇形统计图数据也发生改变。此外词本功能还有“我的收藏”选项以查看所有已收藏词汇并且用户可以任意取消收藏某个单词,还有搜索框以查询数据库中相关词汇和网络查询,这里只介绍最为主要的切换词本功能。词本中的所有数据是预加载的并直接通过 AsyncTask 同步到数据库和应用界面中,但是每个词本未必有单词数据,因为如果将全部数据预加载会出现 API 频繁访问错误。最终解决方案是用户必须要选择一个词汇本,再由 AsyncTask 将对应词汇本中的词汇数据同步到数据库和复习功能模块 fragment 中。当用户是初次使用本应用时,复习功能模块中所有控件都将不可用并且会给出选择词本提示,如图所示;

实现用户选择词本操作也很简单,全部书本列是可以滑动的,并设有点击事件;因此用户只需要直接点击所列词汇本名称即可,此时该功能模块界面会有切换成功提示。当然,如上所述相应的数据也会自动添加并更新到数据库和各大功能模块中。词本功能模块界面如图所示:
词本选择(白日主题和夜间主题)

设置功能模块的功能主要有用户每日任务量设置,用户数据重置和应用主题切换,此外还有用户切换和当前单词本更新功能;其作用分别是:
设置功能模块图例如图所示(白日主题和夜间主题):

用户登录界面:

代码界面,亲测无误 
艾宾浩斯遗忘曲线的实现方式
艾宾浩斯遗忘曲线是有推荐公式的。但是为了系统效率更高,采用取点法使用艾宾浩斯遗忘曲线。在后台数据管理子系统中更新时间戳时,会利用当前时间戳与原时间戳作比较如果差值达到下表数值则更新为当前时间戳并且更新对应的记忆值。时间戳差值更新处理办法如表 4-1 所示:
表 4-1 时间戳差值更新处理办法
| 差值 | 刚刚 | 15min | 20min | 1h | 8h | 1 天 | 2 天 | 6 天 | 30 天 |
|---|---|---|---|---|---|---|---|---|---|
| 记忆值 | 100 | 58 | 44 | 36 | 34 | 28 | 25 | 21 | 15 |
在复习功能模块中,首先选择与包含在当前书本内的,记忆值小于 40 且大于 0(即已学过且遗忘值大于 60)的单词,并将遗忘值传入击中函数。若该单词被击中则放入 wordList 之中;这样就实现了利用艾宾浩斯遗忘曲线实现对当前词汇本所有已学单词复习的过程。



| 表名 | 功能说明 |
|---|---|
| logs | 登录日志表,用户登录成功记录 |
| users | 用户信息表,记录具体的用户信息 |
| wordlist | 用户词汇数据表,记录用户词汇使用信息和词汇信息 |
| booklist | 用户词汇本数据表,记录用户词汇本使用信息和词汇本信息 |
登录日志表
| 表名 | logs | logs |
|---|---|---|
| 字段 | 数据类型 | 说明 |
| user_id | integer | 非空 |
| user | text | 非空 |
| appkey | text | 非空 |
| date_num | integer | 日期 |
用户信息表
| 表名 | users | users |
|---|---|---|
| 字段 | 数据类型 | 说明 |
| user_id | integer | PK |
| user | text | 非空 |
| appkey | text | 非空 |
| class_id | text | 书本 id |
| word_position | integer | 默认 100 |
| today_progress | integer | 默认 1 |
| date_num | integer | 日期 |
| theme_night | integer | 1—黑夜主题;;0—白日主题;;默认 0 |
用户
| 表名 | booklist | booklist |
|---|---|---|
| 字段 | 数据类型 | 说明 |
| msg | text | 默认 failure |
| title | text | 书本名 |
| class_id | text | 书本 id |
| word_num | integer | 默认 0 |
| course_num | integer | 默认 0 |
| existence_item | integer | 1—词汇数据存在;;0—词汇数据不存在;;默认 0 |
用户词汇数据表
| 表名 | wordlist | wordlist |
|---|---|---|
| 字段 | 数据类型 | 说明 |
| word_id | integer | PK,自增 |
| msg | integer | 默认 failure |
| class_id | integer | 书本 id |
| course_num | integer | 默认 0 |
| symbol | text | 音标 |
| sound | text | 发音地址 |
| name | text | 英文单词 |
| descrimination | text | 释义 |
| favorites | integer | 1—收藏单词;;0—不收藏单词;;默认 0 |
| time_stamp | integer | 时间戳;默认 1618674655870 |
| memory | integer | 记忆值,默认 0 |
| word_operation | integer | 3—熟记;;2—认识;;1—模糊;;0—忘记;;默认 0 |
| example_sentence | text | 例句 |
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem