在经历了六周的时间,经历了需求分析,系统设计,编码调试以及测试,我们共同完成了小学生四则运算系统,实现了基本功能。在这个过程中我们真正走过了一遍软件开发的流程。现在对项目做一个总结,讲解项目的功能实现过程,并谈谈大家对这个课程和项目的感受~
①小组分工
这次我们的小组开发团队属于小团队,软件设计、开发的过程中需要频繁的交流,最开始的时候大家做了大致的小组分工,后期根据个人的不同情况和项目开发状态,还经历了多次调整。其实在过程中,多数的设计开发过程,大家都是在一起进行的,属于功能团队模型,但每个人都有自己的侧重点,这样能最好的发挥各自的优势,并能很好的合作。晓丽同学主要负责前期的调查问卷的设计,发放和调查问卷结果的分析,让项目的功能和UI设计方向大致确定。雪莹同学负责后台的代码与前后台的接口部分,基本实现了系统的功能。功功同学负责前端的设计,依据自己绝佳的审美和设计让系统有了比较美观的界面。旭莹同学负责后期的代码测试,文档整理,使项目更加完整。
图1 github上commit图
图2 network图
这次我们的项目托管在github上,所有文档及代码都上传到github中,一开始我们制定的上传方式是每个人一个branch,在自己的branch上工作,当工作都完成时,合并并删除分支。但在项目进行中,发现这种方法的弊端是,当我需要另一个分支的文件的时候,查看不方便,于是我们修改了上传的规则。每push一次文件,就要提出一个pull request ,并通知其他组员,comment这个pull request。这样再合并分支。这样大家都知道了项目的进度,查找文件也更方便了。这时其中一次pull request的截图。
图3 pull request
②项目设计
在项目设计的时候我们对项目的功能和UI设计做了详细的调查,对用户的需求分析做了详细的调查。我们主要分成了两部分,一个部分是在线上利用微信平台对认识的亲戚朋友进行采访。另一个部分是利用网上调查问卷的形式对软件的功能、设计进行了调查,最后对143份问卷进行了分析。具体细节在之前的博客已经展示了,需要查看的点下面的链接~
http://www.cnblogs.com/hahalovejava20160905/p/5941030.html
③项目实现
系统采用网站的形式,开发工具为Visual Studio 2013和SQL server 2008。使用的是C#.net作为后台,前台使用的是HTML+CSS+JavaScript。具体实现了登录,注册,随机测试,错题再测,查看测试记录的功能。下面就具体功能详细说一下项目的实现。
1.用户管理功能
图4 登录界面
登录界面是系统的起始页,不登录就没法进入系统,运用前台JavaScript的代码,保证了登录的窗口的自适应,就是不论窗口多大,输入用户名,密码的模块始终在窗口中展示。下图就是窗口缩小后的状态。
图5 窗口自适应
注册功能分为三步,输入信息,确认信息,注册成功,其中输入信息的时候,系统可以自主判断用户名是否重复,保证用户的用户名是不能重复的。
图6 注册界面
如果在登录界面忘记了密码,可以进入找回密码的部分,利用之前注册填写的找回密码的问题和答案来重置密码。
图7 找回密码
图8 重置密码
在进入系统后任意一个个人中心的按钮,可以进入个人中心的部分查看自己的信息,可以选择退出系统或者修改自己的个人信息。
图9 个人中心
2.测试功能
登录系统后进入到系统的主页面,在主页面我们一开始设计的有四种测试的功能。现在由于时间的问题,只做了前两种测试,后两种测试还有待完善。
图10 系统主页面
首先说一下随机测试,随机测试可以自己设置随机测试的相关参数。
图11 选择参数
对于分数的显示使用了MathJax。
在<head>标签里加上以下代码就可以实现分数表示,但注意一定要联网。
1 <script type="text/x-mathjax-config"> 2 MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); 3 </script> 4 <script type="text/javascript" 5 src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> 6 </script> 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
随机出题并结题的步骤主要有以下三个步骤,第一是利用程序的随机函数生成算式,并存到List<string>中,其中,有检查算式是否重复的函数。具体代码如下:
1 public static int ran(int down, int up) //随机生成1至n的整数 2 { 3 //RandomNumbers.Seed(); 4 5 int result = r.Next(down, up+1);//(RandomNumbers.NextNumber() % (up - down + 1) + 1); 6 return result; 7 } 8 9 public static bool is_unique(string str, List<string> s) //判断生成的算式是否独特 10 { 11 int count = 0; 12 for (int i = 0; i < s.Count; i++) 13 { 14 if (str != s[i]) 15 { 16 count++; 17 } 18 else 19 break; 20 } 21 if (count == s.Count) 22 { 23 return true; //生成的算式是独特的 24 } 25 else 26 { 27 return false; 28 } 29 } 30 31 public List<string> generate(int low, int high, int muldiv, int frac, int par) 32 { 33 int integer1; 34 int integer2; 35 List<string> str = new List<string>(); //str用来保存生成的题目 36 int ch1; //switch语句的选项 37 int ch2; 38 39 int ch4; 40 char sign = ' '; //运算符号 41 //int right1 = 0; 42 //int wrong = 0; 43 for (int i = 1; i <= 20; ) 44 { 45 int start = 1; //start用来标记算式是否是刚开始生成 46 string first = null; //四则运算的第一个运算数,第二个运算数 47 string second = null; 48 string cal = null; 49 int num = ran(1, 6) + 1; //num为参与运算的参数个数 50 for (int j = 1; j < num; ) 51 { 52 //------------------------------------------------------- 53 if (muldiv == 1) //允许乘除 54 { 55 ch1 = ran(1, 3); //随机生成运算符号 56 switch (ch1) 57 { 58 case 1: 59 sign = '+'; 60 break; 61 case 2: 62 sign = '-'; 63 break; 64 case 3: 65 sign = '*'; 66 break; 67 case 4: 68 sign = '/'; 69 break; 70 default: 71 Console.Write("Have bug!"); 72 Console.Write("\n"); 73 break; 74 } 75 } 76 else //不允许乘除 77 { 78 ch1 = ran(1, 2); 79 switch (ch1) 80 { 81 case 1: 82 sign = '+'; 83 break; 84 case 2: 85 sign = '-'; 86 break; 87 default: 88 Console.Write("Have bug!"); 89 Console.Write("\n"); 90 break; 91 } 92 } 93 //------------------------------------------------------- 94 if (frac == 1) //算式中有分数 95 { 96 ch2 = ran(1, 3); //四则运算题目的三种情况 97 switch (ch2) 98 { 99 case 1: //整数和整数 100 { 101 102 integer1 = ran(low, high); 103 integer2 = ran(low, high); 104 105 first = Convert.ToString(integer1); 106 second = Convert.ToString(integer2); 107 } 108 break; 109 case 2: //整数和分数 110 { 111 112 integer1 = ran(low, high); 113 114 first = Convert.ToString(integer1); 115 Fraction f = reduction(reafra(low, high)); 116 second = '[' + f.high + "\\" + f.low + ']'; 117 } 118 break; 119 case 3: //分数和分数 120 { 121 Fraction f1 = reduction(reafra(low, high)); 122 Fraction f2 = reduction(reafra(low, high)); 123 first = "[" + f1.high + "\\" + f1.low + "]"; 124 second = "[" + f2.high + "\\" + f2.low + "]"; 125 } 126 break; 127 default: 128 Console.Write("有错误!"); 129 Console.Write("\n"); 130 break; 131 } 132 } 133 else //不允许真分数参与运算 134 { 135 136 integer1 = ran(low, high); 137 138 first = Convert.ToString(integer1); 139 integer2 = ran(low, high); 140 141 second = Convert.ToString(integer2); 142 } 143 //------------------------------------------------------- 144 if (par == 1) //允许带括号 145 { 146 ch2 = ran(1, 4); 147 switch (ch2) 148 { 149 case 1: 150 { 151 if (start == 1) //start为1表示算式还未生成前两个运算数 152 { 153 cal = first + sign + second; 154 start = 0; 155 } 156 else 157 { 158 cal = cal + sign + first; //将已经生成的算式和新生成的运算数相连 159 } 160 } 161 break; 162 case 2: 163 { 164 if (start == 1) 165 { 166 cal = second + sign + first; 167 start = 0; 168 } 169 else 170 { 171 cal = second + sign + cal; 172 } 173 } 174 break; 175 case 3: 176 { 177 if (start == 1) 178 { 179 cal = '(' + first + sign + second + ')'; //添加括号的情况 180 start = 0; 181 } 182 else 183 { 184 cal = '(' + cal + sign + first + ')'; 185 } 186 } 187 break; 188 case 4: 189 { 190 if (start == 1) 191 { 192 cal = '(' + second + sign + first + ')'; 193 start = 0; 194 } 195 else 196 { 197 cal = '(' + second + sign + cal + ')'; 198 } 199 } 200 break; 201 default: 202 Console.Write("Have bug!"); 203 Console.Write("\n"); 204 break; 205 } 206 } 207 else //不允许括号参与运算 208 { 209 ch4 = ran(1, 2); //输出的两种情况 210 switch (ch4) 211 { 212 case 1: 213 { 214 if (start == 1) 215 { 216 cal = first + sign + second; 217 start = 0; 218 } 219 else 220 { 221 cal = cal + sign + first; 222 } 223 } 224 break; 225 case 2: 226 { 227 if (start == 1) 228 { 229 cal = second + sign + first; 230 start = 0; 231 } 232 else 233 { 234 cal = second + sign + cal; 235 } 236 } 237 break; 238 default: 239 Console.Write("有错误!"); 240 Console.Write("\n"); 241 break; 242 } 243 } 244 j++; 245 } 246 if (str.Count == 0) //vector str,若str为空,添加第一个运算式到vector中 247 { 248 str.Add(cal); 249 i++; 250 } 251 if (is_unique(cal, str)) //判断生成的算式和之前已经生成的运算式是否重复 252 { 253 str.Add(cal); //将生成的运算式添加到str中 254 i++; 255 } 256 } 257 return str; 258