模拟电信计费系统课程设计报告 下载本文

专业课程设计II报告

( 2015 / 2016 学年 第 一 学期)

题目: 模拟电信计费管理系统

专 业 计算机科学与技术 学 生 姓 名 章慧 班 级 学 号 B12040310 指 导 教 师 黄 睿 指 导 单 位 计算机科学与技术系 日 期 2016.1.4 - 2016.1.14

指导教师成绩评定表

学生姓名 评分内容 平时成绩 章慧 班级学号 评分标准 认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事 设计的科学、合理性 功能丰富、符合题目要求 设计成果 界面友好、外观漂亮、大方 程序功能执行的正确性 程序算法执行的效能 设计报告正确合理、反映系统设计流程 设计报告 文档内容详实程度 文档格式规范、排版美观 简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。 B12040310 专业 优秀 计算机科学与技术 良好 中等 差 验收答辩 评分等级 指导教师 简短评语 该同学出勤率(满勤、较高、一般,较低),学习态度(端正、较端正、一般、较差),演示程序(未)达到了(基本要求、提高要求1或/和2),撰写报告格式(规范、一般)、表述(清晰、一般、不清楚),圆满(较好、基本)完成了课题任务。(可选:尚存在??缺陷。) 指导教师签名 备注

日期 2016-1-14 评分等级有五种:优秀、良好、中等、及格、不及格

模拟电信计费管理系统

一、 课题内容和要求

完成模拟电信计费管理信息系统,基本功能包括:

1、入库功能。从本地选取原始话单文件(text格式),并将话单文件中数据输入话单数据库(表)。

2、计费功能。根据1功能存放在话单数据库中的通话记录和数据库中已建好的长途费率表对每一条通话记录计算其通话费用,并将结果保存在已完成话单划价的费用表中。

3、话费查询。输入一个电话号码,从费用表中统计该电话号码的所有本地话费、长途话费,并从用户表中查找其用户名,最后在屏幕上显示。 4、话单查询。输入一个电话号码,从费用表中查询所有的通话记录并在屏幕显示该用户的所有通话记录。

5、数据管理功能。系统能对相关数据进行增、删、改功能。

6、操作权限管理。用户必须通过登录和权限审核才能操作上述相应功能。

二、需求和思路分析

1、建立数据库telecom(借助于HeidiSQL工具),分别建立课题对应用到的数据库表通话记录表callrecord,长途费率表cost,费用表fee,用户电话表phone,登录操作表operater。

2、入库功能,通过html中

3、计费功能,为保证数据库中每条通话记录的通话费用不重复,故计费功能与入库功能是同步进行的,及将2功能中解析组装成的对象直接与从cost费率表中取得的费率根据calltype属性进行配对相乘放入fee费用表中。

4、话费查询,后端获得前端输入的电话号码数据,通过sql中select语句在fee表中根据calltype进行长途及本地话费统计,并通过out.print()输出在屏幕上。同样,根据获得的电话号码数据通过sql中select语句在phone表中查出用户名并显示。

5、话单查询,与4功能相似,后端获得前端输入的电话号码数据后,通过sql中select语句在callrecord表查出其所有的通话记录并进行展示。

6、数据管理功能,本课设中我以phone表中数据为例进行了增删改操作,前端接收用户输入的电话及用户名(可为空),并设有四个按钮查询,增加,删除,修改,用户可根据电话或用户名查询已有数据,若无可增加,或对数据进行修改,或对数据进行删除。后端通过sql中insert,delete,update来对前端接收到的数据进行增删改。

7、操作权限管理,本课设中,权限部分我是采用的session做的,数据库表operater中增加了一个属性为priority,每个操作者默认都可以进行查询功能,模仿linux系统权限处理的方式,我为priority属性设置了3个字符,对应增删改三个字段,具备该功能则相应位置1,不具备该权限则相应位置0(例:111代表该操作者同时具备查询增删改功能,000代表该操作者只具备查询功能),在登录时便将该操作者对象放入session中,而在后台请求增删改时,则从session中取出该对象,并对该对象的权限属性进行字符串解析,并判断其所具备的权限,根据权限进行相应操作。

三、概要设计

1、建立数据库

a、通话记录表callrecord 名称 recordid phoneno calltype duration 数据类型 int varchar(11) int int 注释 通话记录号 电话号码 0:本地 1:长途 通话时长 约束 主键 表1、通话记录表 b、长途费率表cost 名称 calltype price 数据类型 int int 注释 类型 费率 约束 主键 表2、长途费率表 c、费用表fee 名称 phoneid

数据类型 int 注释 费用号

约束 主键 phoneno phonetype price varchar int int 电话号码 通话类型 价格 表3、费用表 d、操作员工表operater 名称 operatername password priority 数据类型 varchar varchar varchar(3) 注释 操作员工名 密码 权限 约束 主键 表4、操作员工表 e、用户表phone 名称 phoneno username 数据类型 varchar varchar 注释 电话号码 用户名 约束 主键 表5、用户表 2、入库流程图

开始选择本地存放话单文件目录获得文件流存入BufferedReader中取出callList进行计费功能Yes读取文件流的一行是否为空No“,”分割字符串并组装成callrecord对象,加入callList同时将对象插入到数据库表calllrecord中

图1、入库流程图

3、计费流程图

开始从数据库表cost中取出长途费率信息放入costList中取出callList结束NocallList(index)是否存在Yesfor循环costList费率集合,直至匹配到相同的callType,将callList(index)中的通话时长与costList中对应的费率相乘,并组装成对象fee,同时插入到数据库表fee中

图2、计费流程图 4、话费查询流程图

开始用户输入电话号码根据电话号码从数据库表fee中查出所有的费用信息并放入feeList中数据库存储时均以角为单位,故展示时需要进行元的换算后展示到页面NofeeList(index)是否存在Yes判断feeList(index)中calltype属性,为0则叠加到localFeeNum,为1则叠加到longFeeNum。

图3、话费查询流程图 5、话单查询

话单查询较话费查询更为简单,在此不做流程图说明,简要文字说明。用户在页面输入手机号码,后端接收数据后以此为条件在数据库表callrecord中查询出信息,并用for循环进行展示即可。

6、数据管理,操作权限流程图

开始增加用户输入手机号和用户名查询根据条件在数据库表phone中联合查询出结果并进行展示修改删除从session中取出operater对象,并从对象中取出priority属性str从session中取出operater对象,并从对象中取出priority属性str从session中取出operater对象,并从对象中取出priority属性strStr.charAt(0)是否等于1Str.charAt(1)是否等于1Str.charAt(2)是否等于1Yes将获得的手机号和用户名组装成phone对象并插入到数据库表phone中Yes将获得的手机号和用户名组装成phone对象并从数No据库表phone中删除该行记录Yes将获得的手机号和用户名组装成phone对象并从数据库表phone中更改该行记录NoNo不具备该权限 图4、数据管理流程图

四、详细设计

1、入库功能 Service:

public void importFile(String fileName) { System.out.println(\开始入库\ List list = new ArrayList(); File file = new File(fileName); try { //读入文件流 FileReader fileReader = new FileReader(file); BufferedReader br = new BufferedReader(fileReader); String str; //循环获取文件内容每一行 while ((str = br.readLine()) != null) { //对每行字符串进行分割组成对象 String[] strArray = str.split(\

CallRecord callRecord = new CallRecord(); callRecord.setPhoneno(strArray[0]);

callRecord.setCalltype(Integer.parseInt(strArray[1])); callRecord.setDuration(Integer.parseInt(strArray[2])); list.add(callRecord);

entityDao.save(callRecord); } countFee(list); br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

}

Controller:

@RequestMapping(value = \GET) public void uploadfile(@RequestParam(\ System.out.println(\文件名\ uploadService.importFile(fileName);

}

uploadFile.jsp:

请选择导入文件

返回主页面

2、计费功能 Service:

public void countFee(List callList){ System.out.println(\开始计费\

}

List costList = entityDao.createQuery(\

Fee fee = new Fee();

for(CallRecord callRecord:callList){ for(Object obj : costList){ //通话类型匹配后进行计算并组装对象后入库 Cost cost = (Cost)obj; if(callRecord.getCalltype() == cost.getCalltype()){ fee.setPhoneno(callRecord.getPhoneno()); fee.setPrice(callRecord.getDuration()*cost.getPrice()); fee.setPhoneType(callRecord.getCalltype()); entityDao.save(fee); break; } } }

Controller:

@RequestMapping(value=\ public void feeQuery(@RequestParam(\response) throws IOException{ response.setCharacterEncoding(\ response.setContentType(\标明消息体是什么类型 System.out.println(\电话号码为\ List objList=feeService.phoneQuery(phoneNo); String userName = feeService.userQuery(phoneNo); PrintWriter out = response.getWriter(); double localFee = objList.get(0)/10+objList.get(0)*0.1; double longFee = objList.get(1)/10+objList.get(1)*0.1; out.print(userName+\客户你好!

\ out.print(\本地话费:\ out.print(\长途话费:\ out.print(\合计话费:\

}

3、话费查询

Service:

public List phoneQuery(String phoneNo){ List objList=entityDao.createQuery(\phoneNo='\ int localFeeNum = 0; int longFeeNum = 0; for(Object obj : objList){

//对查询出的话费list对通话类型进行匹配并叠加 Fee fee=(Fee)obj; if(fee.getPhoneType()==0){ localFeeNum+=fee.getPrice(); } if(fee.getPhoneType()==1){ longFeeNum+=fee.getPrice(); } }

List feeList=new ArrayList(); feeList.add(localFeeNum); feeList.add(longFeeNum); return feeList; }

Controller:

@RequestMapping(value=\ public void feeQuery(@RequestParam(\response) throws IOException{ response.setCharacterEncoding(\ response.setContentType(\标明消息体是什么类型 System.out.println(\电话号码为\ List objList=feeService.phoneQuery(phoneNo); String userName = feeService.userQuery(phoneNo); PrintWriter out = response.getWriter(); double localFee = objList.get(0)/10+objList.get(0)*0.1; double longFee = objList.get(1)/10+objList.get(1)*0.1; out.print(userName+\客户你好!

\ out.print(\本地话费:\ out.print(\长途话费:\ out.print(\合计话费:\

}

4、话单查询

Service:

public List recordQuery(String phoneNo){ List recordList = entityDao.createQuery(\com.dianxinfee.entity.CallRecord where phoneNo='\ return recordList; }

Controller:

@RequestMapping(value=\ public void recordQuery(@RequestParam(\

response) throws IOException{ response.setCharacterEncoding(\ response.setContentType(\标明消息体是什么类型 System.out.println(\电话号码为\ List objList=feeService.recordQuery(phoneNo); String userName = feeService.userQuery(phoneNo); PrintWriter out = response.getWriter(); out.print(userName+\客户你好!

\ for(Object obj : objList){ CallRecord callRecord = (CallRecord)obj; if(callRecord.getCalltype()==0){ out.print(\本地:\分钟
\ } if(callRecord.getCalltype()==1){ out.print(\长途:\分钟
\ } } }

话费话单查询在同一个页面fee.jsp:

Fee.jsp:

返回主页面

请输入手机号

5、数据管理操作权限 登录时service:

public Operater operaterQuery(Operater operater) { List opeList = entityDao.createQuery(\where operaterName='\ + operater.getOperaterName() + \+ \ if (opeList.size() == 0) { return null; } else { return (Operater) opeList.get(0); } }

Controller:

@RequestMapping(value = \POST)

public String userMainPage(Operater operater,HttpServletRequest request){ HttpSession session=request.getSession(); System.out.println(operater.getOperaterName()); Operater opera = loginService.operaterQuery(operater); if(opera == null){ return \ } session.setAttribute(\ return \}

查询时service:

public List queryPhone(String phoneNo,String userName){

}

String sql = \if(phoneNo!=\ sql+=\}

if(userName!=\ sql+=\}

List objList=entityDao.createQuery(sql); return objList;

Controller:

@RequestMapping(value=\GET) public void queryUser(@RequestParam(\ @RequestParam(\throws IOException{ response.setCharacterEncoding(\ response.setContentType(\标明消息体是什么类型 String name = URLDecoder.decode(userName,\ System.out.println(\用户名\ PrintWriter out = response.getWriter(); List objList = userService.queryPhone(phoneNo, name); for(Object obj:objList){ Phone phone = (Phone)obj; out.print(phone.getPhoneno()+\>\ } if(objList.size()==0){ out.print(\无查询结果\ } }

增加时service:

public void addPhone(String phoneNo,String userName){ Phone phone=new Phone(); phone.setPhoneno(phoneNo); phone.setUsername(userName); entityDao.save(phone); }

Controller:

@RequestMapping(value=\GET) public void addUser(@RequestParam(\ @RequestParam(\ HttpServletRequest request) throws IOException{

HttpSession session=request.getSession(); Operater opera = (Operater)session.getAttribute(\ String name = URLDecoder.decode(userName,\ System.out.println(\用户名\ response.setCharacterEncoding(\ response.setContentType(\标明消息体是什么类型 PrintWriter out = response.getWriter(); if(opera.getPriority().charAt(0)=='0'){ out.print(\您没有插入权限,请尝试其他操作\ }else{ userService.addPhone(phoneNo, name); out.print(\增加一条信息\ } }

删除时service:

public void deletePhone(String phoneNo,String userName){ Phone phone=new Phone(); phone.setPhoneno(phoneNo); phone.setUsername(userName); entityDao.delete(phone); }

Controller:

@RequestMapping(value=\GET) public void deleteUser(@RequestParam(\ @RequestParam(\ HttpServletRequest request) throws IOException{ HttpSession session=request.getSession(); Operater opera = (Operater)session.getAttribute(\ String name = URLDecoder.decode(userName,\ System.out.println(\用户名\ response.setCharacterEncoding(\ response.setContentType(\标明消息体是什么类型 PrintWriter out = response.getWriter(); if(opera.getPriority().charAt(1)=='0'){ out.print(\您没有删除权限,请尝试其他操作\ }else{ userService.deletePhone(phoneNo, name); out.print(\删除一条信息\ } }

修改时service:

public void updatePhone(String phoneNo,String userName){ Phone phone=new Phone();

}

phone.setPhoneno(phoneNo); phone.setUsername(userName); entityDao.update(phone);

Controller:

@RequestMapping(value=\GET) public void updateUser(@RequestParam(\ @RequestParam(\ HttpServletRequest request) throws IOException{ HttpSession session=request.getSession(); Operater opera = (Operater)session.getAttribute(\ System.out.println(\用户\ String name = URLDecoder.decode(userName,\ System.out.println(\用户名\ response.setCharacterEncoding(\ response.setContentType(\标明消息体是什么类型 PrintWriter out = response.getWriter(); System.out.println(\用户权限\ if(opera.getPriority().charAt(2)=='0'){ out.print(\您没有更改权限,请尝试其他操作\ }else{ userService.updatePhone(phoneNo, name); out.print(\更新一条信息\ } }

数据管理页面User.jsp:

请输入手机号 请输入姓名


为乱码问题设置拦截器部分代码:

@WebFilter(\

public class Encoding implements Filter {

/**

* Default constructor. */

public Encoding() {

// TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub // place your code here request.setCharacterEncoding(\ // pass the request along the filter chain chain.doFilter(request, response); } /**

}

* @see Filter#init(FilterConfig) */

public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub }

Hibernate部分代码:

public class EntityDaoImple extends HibernateDaoSupport implements EntityDao{ public List createQuery(final String queryString) { //第二种不安全方式,将session从IOC剥离出来 //List list= getSession().createQuery(\ //HibernateCallback是一个接口,里面只有一个方法doInHibernate,实现这个方法,new接口 /*getHibernateTemplate().executeFind(HibernateCallback obj) {return obj.doInHibernate(org.hibernate.Session session);}*/ List list1=getHibernateTemplate().executeFind( new HibernateCallback() { public Object doInHibernate(org.hibernate.Session session) throws org.hibernate.HibernateException { Query query = session.createQuery(queryString); List rows= query.list(); return rows; } }); return (List)list1; }

public Object save(final Object model) {

return getHibernateTemplate().execute( new HibernateCallback() {

public Object doInHibernate(org.hibernate.Session session) throws org.hibernate.HibernateException { session.save(model); return null; } }); }

public void update(final Object model) {

getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(org.hibernate.Session session)

throws org.hibernate.HibernateException { session.update(model); return null; } }); }

public void delete(final Object model) { getHibernateTemplate().execute(

new HibernateCallback() {

public Object doInHibernate(org.hibernate.Session session) throws org.hibernate.HibernateException { session.delete(model); return null; } }); } }

Spring mvc与hibernate配置文件: Web.xml:

xsi:schemaLocation=\

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\ id=\ version=\> dianxinfee

log4jConfigLocation

/WEB-INF/config/log4j.properties

org.springframework.web.util.Log4jConfigListener

spring

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

/WEB-INF/config/spring-dianxin.xml

1

spring

/

default *.html

contextConfigLocation

/WEB-INF/config/springContext.xml

org.springframework.web.context.ContextLoaderListener

setEncoding

com.dianxinfee.filter.Encoding

coding UTF-8

setEncoding /*

index.html index.htm index.jsp default.html default.htm default.jsp

Spring-dianxin.xml:

http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd\

xmlns:aop=\

xmlns:context=\ xmlns:mvc=\ xmlns:xsi=\

xmlns=\>

class=\/>

/common/failure /common/failure /common/failure

class=\>

class=\> application/json;charset=UTF-8

springContext.xml:

http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd\>

value=\>

org.hibernate.dialect.MySQLDialect true true update com.dianxinfee.entity

class=\>

日志配置文件log4j.properties:

# This is the configuring for logging displayed in the Application Server log4j.rootCategory=DEBUG,stdout,logfile

#stdout configure log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern= %d %p [%c] - <%m>%n

#logfile configure log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/patent.log #log4j.appender.logfile.File=/WEB-INF/logs/ssm.log

#\日\志\文\件\的\路\径\和\名\称 #log4j.appender.R.File=./../logs/ssm.log log4j.appender.logfile.MaxFileSize=10M log4j.appender.logfile.MaxBackupIndex=100

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern= %d %p [%c] - <%m>%n

#debug log for spring

log4j.logger.org.springframework=DEBUG

# debug log for ibatis log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG

log4j.logger.java.sql.PreparedStatement=DEBUG

五、测试数据及其结果分析

登录页面:

若数据库中不存在此账户密码(即用户名或密码输入错误),则页面仍停留在此页面。

若用户名密码输入正确则跳转到主页面:

点击话单入库选择浏览本地话单文件:

话单文件:

点击确认导入后将同时完成话单入库和计费两个功能:

Callrecord表:

Fee表:

点击话费账单查询可实现话费查询和账单查询相应功能: 话费查询:

电话用户phone表可查得18362972518用户为章慧:

话费fee中可计算出本地话费共:1.6,长途话费共3.2:

话单查询:

从通话记录表callrecord中可查询出该记录:

点击用户管理即实现对系统数据的增删改功能,同时用户操作权限也在这里得到体现:

数据库phone表中原始数据:

输入一条数据库中没有的数据18020129173,孙炜程:

查无结果点击增加:

查看数据库或点击查看均可检测正确性: 数据库phone表:

点击查询:

一下结果均以点击查询为例,不进行数据库展示。 将姓名孙炜程修改为孙小美并点击修改:

点击查询:

点击删除将此行记录删除:

点击查询:

以上结果均在操作员zhanghui权限为111的基础上进行,故所有操作均可实现。

操作operater表:

现在切换账户为query,即权限为000,只可查询。 登录:

查询:

点击增加提示您插入权限:

点击删除:

点击修改:

至此,所有功能均以实现。

六、调试过程中的问题(格式:宋体,4号,加粗,两端对齐)

问题: 1、 乱码:

a、 页面数据展示时乱码

将每个jsp页面的contentType中charset和pageEncoding设置为UTF-8。

b、 js数据传到后台接收时乱码

将前端js请求中url加上两层encodeURI(encodeURI(url)),并在后端接收数据时加上URLDecoder.decode(字段名)解码进行获取。 c、 从后端传到前端展示的数据乱码

在后端将response的 编码格式及消息体设置为UTF-8。 response.setCharacterEncoding(\

response.setContentType(\

2、 数据库后台采用的hibernate框架,调用其接口进行查询时“from 表名”,这里的表名应是包名.类名,而不是直接写类名。

3、 此项目搭配的框架是spring mvc,一开始出bug的时候控制台没报错,后加入log4j配置才能从控制台看出报错问题并解决。

4、 对数据库中数据进行增删改时,传入的字符串需要在两端加上‘’。 改进:

1、 话单入库时采用的是从前端接收文件目录地址,然后采用读文件流的方式获取其内容并进行解析,而前端file标签提供了直接将文件内容通过post方式传入后台的功能,可以直接后后台接收数据再进行解析。

2、 项目只在登录时提供了验证入口,用户仍然可以直接通过访问url访问其他页面,可通过获取session的方式查看当前有无用户登录,若无则自动跳转到登录页面,不给用户直接通过Url访问其他页面的方式,提高安全性。

3、 项目在用户登录时设计的不够人性化,在登录时可采用ajax技术提示用户输入的用户名和密码是否正确,以便用户可以清楚哪个部分出了差错并进行修改后再次提交。

4、 在话单入库时可提供模板下载功能,提醒用户以什么格式进行填写话单文本,以及可增加提示用户选择文件文本格式是否正确的功能。 5、 数据库设计的较简单,比如话单表里可增加通话时间段,几点通话开始,几点通话结束。

七、专业课程设计总结

在本次课设之前,我对项目的搭建环境是比较生疏的,因为在实习时都是搭建好的环境,让我们直接开发后端,而这次课设,则是我通过百度,查阅资料等途径一步一步将环境搭建好的,同时,对项目整体的分析与设计有了一定的认识,毕竟这个的完成我是从头到尾都参与进来的。通过本次课设也增强了我设计流程图的能力,另外也锻炼了我定位bug的能力,如通过system,out,print打印输出查看结果是不是自己想要的,又如通过log打印输出的内容判断,又如通过设置端点调试等等,而在这其中最为重要的是耐心,一旦自己在面对这些问题心态慌了,那么就会烦躁,伴随而来的不是问题解决,而是没有思绪,其次我觉得细心是在编写代码时最重要的品质,有时一个大小符号会让你纠结半天,那么何不在编写代码时就仔细加仔细,将这些小问题杜绝。

课程设计中遇到的这些问题虽然最后都得以解决,但同时也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自分析与设计,使我掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。在课程设计中我遇到了很多问题,最后在老师同学的指导下,并通过不断的查阅资料终于游逆而解,同时,课程设计使我对抽象的理论有了具体的认识。

在今后学习实践过程中,我一定要不懈努力,不能遇到问题就想到要退缩,

一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退。

回顾两周的课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是多么的重要,只有理论知识是远远不够的,正所谓“书上得来终觉浅,要知此事须躬行”。只有把所学的理论知识与实践结合起来,从理论中得出结论,才真正是自己的知识,从而提高自己的实际动手能力和独立思考的能力。在课程设计过程中遇到的问题,可以说得是困难重重,但可喜的是最终都得到了解决。