课程名称:《程序设计与数据结构》
学生班级:1623班
学生姓名:刘伟康
学生学号:20162330
实验时间:2017年12月15日
实验名称:数据结构综合应用
指导老师:娄嘉鹏、王志强老师
实验要求:
实验五 数据结构综合应用
0 分析系统架构
1 编译、运行、测试系统
2 修改系统
3 分析数据结构、排序、查找算法的应用
实验步骤及代码分析:
团队项目代码托管链接
实验五-0:分析系统架构
所谓的 架构,是一种特定的工作模式,系统架构是系统的组织结构。这部分内容有些专业,所以我一直不知道如何下手。通过查找相关资料,我大致了解了架构涵盖的几部分内容,针对一个软件来说,架构可以分为三个部分,数据访问层、业务逻辑层 和 用户接口层。其中,用户接口层可以调用业务逻辑层的方法,业务逻辑层可以调用数据访问层的方法,这三层又可以调用实体层,实体层可以跨层传递数据。业务逻辑层是核心部分,一个业务逻辑方法可以调用多个数据访问层方法,也会产生多个返回信息。
软件三层架构图如下:
对于我们的项目来说,并没有涉及到数据库的内容,所以使用了之前设计的简易ER图表示 数据访问层 的内容,正好ER图本身就表示实体类型、属性和联系。之后又使用之前设计好的用例图表示 用户接口层 的内容,再联系一些游戏界面构成一幅简易的业务逻辑图(我也不知道算不算逻辑图(¬_¬))。关于软件和硬件之间的联系,我们的项目是一个app软件,硬件是手机。将软件安装到硬件的方式是:通过将项目打包成apk,然后在手机上进行安装。将以上三层结构图联系起来(不包括软件和硬件之间的联系),就得到了一幅相对完整的系统架构图:
点击查看大图:【系统架构图】
如果觉得还不够大请下载查看,文件链接:【系统架构图】
关于分析系统架构,在架构图中就可以体现。由于我对架构图缺乏了解,最后只能设计成这样,有时间 希望老师能讲解一下。
实验五-1:编译、运行、测试
1.git clone 小组项目
2.编译项目,提交编译成功截图(全屏,要有学号信息)
3.提交运行过程中的截图(全屏,要有学号信息)首先,打开 Android Studio,配置好SDK等环境变量后依次点击菜单栏中的
VCS
→Git
→Clone
,复制项目链接即可,操作如下图:(点击图片可放大)第二种克隆项目的方法是传统形式,点击
File
→New
→Project from Version Control
→Git
,之后复制项目链接即可,操作如下图:(点击图片可放大)克隆过程中难免会遇到一些问题,查下资料,把相关配置更新一下一般就可以解决问题,克隆过程及结果截图如下:(点击图片可放大)
OK,接下来编译运行,没有红色提示自然就是编译成功了,运行一下,又会出现一些问题,根据Studio中的提示一步一步来,解决问题后,得到编译和运行过程的截图:
实验五-2:代码修改
1.在小组项目中,找一个合适的地方添加一个按钮,点击显示自己的学号
2.提交运行截图(全屏,要有学号信息)
3.在项目中找一个界面,自己复制一份命名为XXXbak,修改代码,替换原来的部分
4.提交运行截图(全屏,要有学号信息)- 首先要加一个按钮,比较基础,我选择了在游戏结束界面中添加这一控件:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="20162330刘伟康 已结束游戏"
android:textSize="40dp"/>
如图所示:
![](http://images2017.cnblogs.com/blog/1062725/201712/1062725-20171217203312952-566195360.png)
对应的运行过程截图如下:
Game Over 之后:
下一步,在项目中找一个界面,自己复制一份命名为XXXbak,修改代码,替换原来的部分。我在原来的文件夹中复制了这一个项目,更改名称即可:
这样就完成了,这个实验截图比较多。
实验五-3:代码分析
分析小组代码:
1.数据结构的应用情况及相关代码
2.排序算法的应用情况及相关代码
3.查找算法的应用情况及相关代码
4.完成实验报告- 关于数据结构,我们小组选取的是有关 查找和索引 的内容,对于车辆的查找,我们使用了HashMap类:
//车辆查找方法
private boolean Searching(String carName){
boolean judge = false;
HashMap hashMap = new HashMap();
hashMap.put("Flash", R.drawable.car1play);
hashMap.put("Lightening", R.drawable.car2play);
hashMap.put("Flat", R.drawable.car4play);
hashMap.put("Taxi", R.drawable.car3play);
try {
//哈希查找
CarID= (int) hashMap.get(carName);
judge= true;
}catch (Exception e){
Toast.makeText(this,"Can't find the car",Toast.LENGTH_SHORT).show();
}
return judge;
}
我们用车名作为关键字,联系的是图片的id。这一方法是当使用搜索框搜索车辆的时候使用的方法。当在车辆选择界面中的搜索框中输入车辆名的时候,会在哈希表中找该关键字所对应的下标,从而返回车辆图片的id。从而实现用户可以通过查找来查找自己心仪的车辆来进行游戏。
![](http://images2017.cnblogs.com/blog/1062725/201712/1062725-20171217204821093-1977209547.png)
上图中的查找框如下:
![](http://images2017.cnblogs.com/blog/1062725/201712/1062725-20171217204844155-1088870246.png)
如果用户正确拼写出车辆名称,就会进入接下来的音乐选择界面。如果搜索车辆失败(区分大小写、空格),就会弹出`Can't find the car`的提示:
![](http://images2017.cnblogs.com/blog/1062725/201712/1062725-20171217205240796-1965900639.png)
- 关于查找算法,我们小组项目涉及的查找因为数据量不大,难度也不大。因此我们小组使用的是线性查找算法:
//线性查找
public static int linearSearch(String[] data, String target){
boolean judge = false;
int index =0;
while (index < data.length){
if(data[index].equals(target)){
judge = true;
break;
}
index++;
}
if (!judge){
index = -1;
}
return index;
}
这个算法主要用于选择音乐:
if (view.getId()== R.id.music_searchBtn){
String target = findSong.getText().toString();
int resultIndex = Searching.linearSearch(songName,target);
if (resultIndex!=-1){
StartGame.putExtra("songID",songID[resultIndex]);
StartGame.putExtra("carID",idReceiver.getStringExtra("carID"));
startActivity(StartGame);
finish();
}else {
Toast.makeText(this,"曲目不存在",Toast.LENGTH_SHORT).show();
}
}
在音乐选择方法中,有两个数组。下标对应,一个用来放歌曲的名字,一个数组用来放曲目的id。将用户在搜索框中输入的歌曲名,会调用线性查找来查看曲名的数组中是否存在对应的曲目,找到之后会获取对应的曲目id,最后传到主活动中播放曲目。如果找不到也会弹出“曲目不存在”的提示。和车辆查找框一样,音乐查找框也区分大小写和空格。
对应界面如下:
![](http://images2017.cnblogs.com/blog/1062725/201712/1062725-20171217210134499-1035516425.png)
背景图和音乐曲目还是很吸引人的,对应的音乐搜索框如下:
![](http://images2017.cnblogs.com/blog/1062725/201712/1062725-20171217210141171-2026969544.png)
- 其实,markdown也是可以添加输入框和搜索框的,来试试输入框吧:
测试过程及遇到的问题:
1. 克隆时出现:early EOF index-pack faild。
- 解决办法:(查找相关资料)
出现此错误的原因是网络环境较差,或者克隆文件过大导致克隆中断。网络上的解决方法复杂多样,由于当时是在宿舍用学校的网下载的,试过几遍之后都是这个问题,之后我 换了一个速度快一些的网 克隆,于是便解决了问题。
2. 克隆时出现Error:Execution failed for task ':app:transformClassesWithDexForDebug'。
- 解决办法:(查找相关资料)
完整错误如下:
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException:XXX(后面的没有具体保存记录)
查找到的解决方法是:由于build -tools版本与jdk有冲突,所以要更改buildtools版本。
步骤如下:File
→Project Structure
→app
→Build Tools Version
,替换对应的版本即可。关于如何选择对应的版本,我是一个一个试出来的(¬_¬)。
![](http://images2017.cnblogs.com/blog/1062725/201712/1062725-20171217222205374-1827611873.png)
![](http://images2017.cnblogs.com/blog/1062725/201712/1062725-20171217222216858-445597381.png)
其实遇到了很多克隆的问题,根据各种提升更新各种版本,可惜过程没有详细记录。
3. 运行ADB时出现:gradle project sync failed.please fix your project and try again.
解决办法:(查找相关资料)
这个问题缠了我好久,先是重启 Android Studio,然后又反复更改sdk的位置,并且又下载了一个虚拟设备,还是没用,按照网上的方法:点击工具栏中的Build
-->Rebuild project
仍然没有用,之后又查找了一些资料并尝试,终于找到了合理的方法:在 SDK Manager 的 SDK Tools 中勾选 Android Emulator 安装即可:
分析总结:
本次实验的题目是“数据结构的综合运用”,我的感受是:只要前面的团队任务做得不错,这次的实验都可以比较容易地完成,除了一些和clone有关的问题和环境变量的问题之外,本次实验的内容还是挺容易的。
这次实验我遇到的 Android Studio 的环境配置问题很多,因为之前一直没有更新配置文件gradle,所以这次开始克隆时就遇到了一些麻烦,在无奈重装Android Studio之后,仍然没能克隆成功,又根据提示不停更新配件,并且查找资料,再一次成功配置 Studio,可惜的是问题过程记录得太少。
通过这次实验,我也学到了一些架构的内容,架构可以分为三个部分,数据访问层、业务逻辑层 和 用户接口层。业务逻辑层是总体架构的核心。同时我也对软件发布的过程更熟悉了一些,团队合作也给我留下了较为深刻的印象。
PSP(Personal Software Process)时间统计:
-
步骤 耗时 百分比 需求分析 20min 10% 设计 20min 10% 代码实现 20min 10% 测试 40min 20% 分析总结 100min 50%