分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 C语言 C++ JAVA C# JSP PYTHON PHP
数据结构与算法 操作系统 编译原理 数据库 计算机网络 软件工程 VC++程序设计
游戏 PC程序 APP 网站 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019

资源列表

  • 基于C语言实现的仓库管理系统

    1 题目要求该系统用于实现仓库管理,系统应支持入库、出库、库存查询以及打印。用户可自定库存警戒值,库存低于警戒值时以红字显示。仓库信息需要用文件存储。
    2 需求分析根据题目要求,由于货品信息存放在文件中,所以应该提供文件的读入、输出等操作;在程序中要浏览货品信息,应提供显示、查找、排序等操作;实现货物入库功能,要提供结构体的输入操作;实现统计功能,要提供相应的统计操作;实现修改功能,要提供修改操作;另外,还要提供键盘式菜单实现功能选择。
    3 总体设计根据上面的需求分析,可以将该系统的系统的设计分为大模块,即入库模块、出库模块、查询模块、排序模块、修改模块和统计模块等。

    4 详细设计4.1 主函数
    #include<stdio.h>#include<windows.h>#include<string.h>#include<conio.h>void main(){ int sele; Re_file(); //读取货品信息 sele=1; while(sele) { system("cls"); printf("\n\n"); printf("*********************************************\n"); printf("* *\n"); printf("* 1.入库 2.出库 *\n"); printf("* *\n"); printf("* 3.查询 4.排序 *\n"); printf("* *\n"); printf("* 5.修改 6.统计 *\n"); printf("* *\n"); printf("* 7.退出 *\n"); printf("* *\n"); printf("*********************************************\n"); printf("请选择功能序号:"); scanf("%d",&sele); switch(sele) { case 1:Stock_in();Display();break; case 2:Stock_out();Display();break; case 3:Query();break; case 4:Sort();Display();break; case 5:Modify();Display();break; case 6:Statistics();break; case 7:exit(0);sele=0;break; } printf("\n\n按任意键继续...\n"); getch(); } Wr_file();}
    4.2 各功能模块设计4.2.1 数据读入模块单独看各组数据信息,货品名称是字符串,可以采用字符型数组;其他数据均可用整数存放。数据信息存放在文件中,一条记录对应一种货品的信息,既符合习惯也方便信息管理。把一种货品的相关信息作为结构体成员,如果要存放若干种货品的信息就要用结构体数组。
    typedef struct{ int num; //货品编号 char name[20]; //货品名称 int stock; //原始库存 int in; //入库数目 int out; //出库数目 int amount; //最终库存 int warning_value; //警戒值 int state; //库存状态(是否低于警戒值)}goods;goods s[M]; //用于存放货品信息 goods r[M]; //用于存放入库货品信息 goods t[M]; //用于存放出库货品信息
    s[M]、r[M]、t[M]的M为货品种类数,程序中采用宏定义的方式,可以随时在源程序宏定义中修改。本程序中宏定义为:#define M 50。
    void Re_file() //读入原始库存文件{ FILE*fp; N=0; fp=fopen("goods.txt","r"); while(fscanf(fp,"%d%s%d%d%d%d%d",&s[N].num,&s[N].name,&s[N].stock,&s[N].in,&s[N].out,&s[N].amount,&s[N].warning_value)!=EOF) N++; fclose(fp); P=N;}
    4.2.2 入库模块
    该模块的功能是根据题目要求读入货品的入库数据。注意在主函数中已经读入了原始数据。
    void Stock_in() //读入入库文件{ FILE*fp; int i,j; N=0; fp=fopen("stockin.txt","r"); while(fscanf(fp,"%d%d",&r[N].num,&r[N].in)!=EOF) N++; fclose(fp); for(i=0;i<P;i++) { for(j=0;j<N;j++) { if(r[i].num==s[j].num) s[j].in=r[j].in; } } for(i=0;i<P;i++) s[i].amount=s[i].stock+s[i].in;}
    4.2.3 出库模块该模块的功能是根据题目要求读入货品的出库数据。注意在主函数中已经读入了原始数据。
    void Stock_out() //读入出库文件{ FILE*fp; int i,j; N=0; fp=fopen("stockout.txt","r"); while(fscanf(fp,"%d%d",&t[N].num,&t[N].out)!=EOF) N++; fclose(fp); for(i=0;i<P;i++) { for(j=0;j<N;j++) { if(t[i].num==s[j].num) s[j].out=t[j].out; } } for(i=0;i<P;i++) s[i].amount=s[i].stock+s[i].in-s[i].out;}
    4.2.4 浏览模块
    该模块的功能是显示所有货品的记录信息。根据货品库存数目是否低于警戒值,分别按红字显示和白字显示。采用SetConsoleTextAttribute函数改变输出字体颜色。
    void Display() //显示库存情况{ int i,j; system("cls"); Estimate(); printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n"); for(i=0,j=1;i<P;i++,j++) { if(s[i].state==1) //库存值小于警戒值红字显示 { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED); printf("%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n", s[i].num, s[i].name, s[i].stock, s[i].in, s[i].out, s[i].amount, s[i].warning_value); if(j%10==0&&j!=P) //控制每次显示十行 { printf("按任意键继续..."); getch(); puts("\n"); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE); printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n"); } } else if(s[i].state==0) //库存值不小于警戒值白字显示 { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE); printf("%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n", s[i].num, s[i].name, s[i].stock, s[i].in, s[i].out, s[i].amount, s[i].warning_value); if(j%10==0&&j<P) { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE); printf("按任意键继续..."); getch(); puts("\n"); printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n"); } } }}
    4.4.5 判断模块该模块用于判断货品库存数目是否小于警戒值并记录,多次在其他被模块调用。
    // 判断库存值是否小于警戒值void Estimate(){ int i; for(i=0;i<P;i++) { if(s[i].amount>=s[i].warning_value) s[i].state=0; else if(s[i].amount<s[i].warning_value) s[i].state=1; }}
    4.4.6 查询模块
    该模块的功能是根据输入的货品名称或货号查找对应的记录,找到以后,显示货品记录。同时,库存数目小于警戒值以红字显示。
    // 查询货品void Query(){ int k,m,i,j=-1; char n[20]; system("cls"); printf("\n\n"); printf("*********************************************\n"); printf("* *\n"); printf("* *\n"); printf("* *\n"); printf("* 1.货品编号 2.货品名称 *\n"); printf("* *\n"); printf("* *\n"); printf("* *\n"); printf("*********************************************\n"); printf("\n\n请输入查询选项:"); scanf("%d",&k); if(k==1) { printf("请输入货品编号:"); scanf("%d",&m); for(i=0;i<P;i++) { if(m==i) j=m-1; } } else if(k=2) { printf("请输入货品名称:"); scanf("%s",&n); for(i=0;i<P;i++) { if(strcmp(n,s[i].name)==0) j=i; } } Estimate(); if(j==-1) { printf("\n没有找到!\n"); Printf_back(); } else { if(s[j].state==1) { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED); printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n");printf("%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n",s[j].num,s[j].name, s[j].stock,s[j].in,s[j].out,s[j].amount,s[j].warning_value); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE); Printf_back(); } else { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_BLUE); printf("货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值\n"); printf("%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n",s[j].num,s[j].name, s[j].stock, s[j].in, s[j].out,s[j].amount,s[j].warning_value); Printf_back(); } }}
    4.4.7 排序模块该模块的功能是将货品记录按照最终库存升序排列。这里按照冒泡法排序。排序完成后显示货品记录,显示完成后返回主菜单
    // 商品库存总量从小到大排序void Sort() { int i,j; goods t; for(i=0;i<P-1;i++) for(j=i+1;j<P;j++) { if(s[i].amount>s[j].amount) { t=s[i]; s[i]=s[j]; s[j]=t; } } Display(); Printf_back();}
    4.4.8 修改模块
    该模块的功能是根据货品编号或货品名称找到要修改的记录,并提示用户修改该记录的哪部分信息(原始库存、入库数目、出库数目、警戒值),然后根据用户的选择修改相应的位置。最后显示货品信息供用户确认。
    // 修改货品信息void Modify() { int k,m,i,j=-1,t,h; char n[20]; system("cls"); printf("\n\n"); printf("*********************************************\n"); printf("* *\n"); printf("* *\n"); printf("* *\n"); printf("* 1.货品编号 2.货品名称 *\n"); printf("* *\n"); printf("* *\n"); printf("* *\n"); printf("*********************************************\n"); printf("\n\n请输入修改选项:"); scanf("%d",&k); if(k==1) { printf("请输入货品编号:"); scanf("%d",&m); for(i=0;i<P;i++) { if(m==i) j=m-1; } } else if(k==2) { printf("请输入货品名称:"); scanf("%s",&n); for(i=0;i<P;i++) { if(strcmp(n,s[i].name)==0) j=i; } } if(j==-1) { printf("\n没有找到!\n"); Printf_back(); } else { printf("\n\n"); printf("*********************************************\n"); printf("* *\n"); printf("* 1.原始库存 2.入库数目 *\n"); printf("* *\n"); printf("* 3.出库数目 4.警戒值 *\n"); printf("* *\n"); printf("*********************************************\n"); printf("请选择修改选项:"); scanf("%d",&t); if(t==1) { scanf("%d",&h); s[j].stock=h; } else if(t==2) { scanf("%d",&h); s[j].in=h; } else if(t==3) { scanf("%d",&h); s[j].out=h; } else if(t==4) { scanf("%d",&h); s[j].warning_value=h; } s[j].amount=s[j].stock+s[j].in-s[j].out; } printf("请确认核对货品信息:\n"); Display();}
    4.4.9 统计模块
    该模块的功能是根据用户的选择统计货品总数或最终库存低于警戒值的货品种数。统计结束后将所有货品信息以文件形式输出。
    // 统计数目void Statistics() { int k,i,j,m=0,n=0; system("cls"); printf("\n\n"); printf("*********************************************\n"); printf("* *\n"); printf("* *\n"); printf("* *\n"); printf("* 1.库存总数 2.库存状态 *\n"); printf("* *\n"); printf("* *\n"); printf("* *\n"); printf("*********************************************\n"); printf("\n\n请输入查询选项:"); scanf("%d",&k); if(k==1) { for(i=0;i<P;i++) m=m+s[i].amount; printf("库存总数为:%d",m); } else if(k==2) { Estimate(); for(j=0;j<P;j++) if(s[j].state==1) n=n+1; printf("低于库存警戒值的商品种数为:%d",n); } Wr_file();}
    4.4.10 数据输出模块该模块的功能是将货品信息写入文件。
    // 写输出文件int Wr_file() { FILE*fp; int i; fp=fopen("amount.txt","w"); for(i=0;i<P;i++) fprintf(fp,"%-9d %-10s%-10d%-10d%-10d%-10d%-10d\n",s[i].num,s[i].name, s[i].stock,s[i].in,s[i].out,s[i].amount,s[i].warning_value); fclose(fp); return 1;}
    5 上机操作5.1 数据源该程序的运行需要四个文件,三个用于读取货品信息,一个用于存储货品息。goods.txt文件的格式如下:
    货品编号 货品名称 原始库存 入库数目 出库数目 最终库存 警戒值1 A1 456 0 0 456 4002 A2 23 0 0 23 1003 A3 67 0 0 67 1004 A4 104 0 0 104 1005 A5 78 0 0 78 100
    用于读取货品编号、货品名称、原始库存、警戒值等货品信息。
    stockin.txt文件的格式如下:
    货品编号 入库数目1 573 784 805 236 10
    用于读取入库信息。
    stockout.txt文件的格式如下:
    货品信息 出库数目1 102 53 234 125 3
    用于读取出库信息。
    amount.txt文件用于存储货品信息。
    5.2 编译、链接和运行5.3 结果主函数界面

    入库模块

    出库模块

    查询模块

    排序模块

    修改模块

    统计模块

    6 总结通过这次课程设计,我进一步理解和运用了结构化程序设计的思想方法,初步掌握了开发小型实用系统的基本方法,学会了调试较长的程序,能够利用流程图描述算法,进一步掌握和提高利用C语言进行程序设计的能力。
    在程序的编写中,我们首先要构架好整体结构,然后再将各个模块的函数写出来。在写函数的过程中,我们要选择性地利用到所学的知识,如排序法、while循环、if语句等,实现相应的功能。一个较大的程序主要调试方法有分模块调试和分步调试。文件的数据格式很重要,要与程序读取的数据类型保持一致。程序调试通了以后,在修改其中的细节问题。
    学习好C语言这门课,能为我们以后开发出更多实用的程序打下坚实的基础。要学好C语言这门课,我们平时就要勤于实践,锻炼自己的逻辑思维能力与整体构架能力。
    9 评论 166 下载 2018-11-05 10:24:37 下载需要5点积分
  • 基于java的改良版超级玛丽

    1. 用户需求1.1 用户希望游戏要有它的创新性,有吸引力我们的这个游戏考虑到用户的这样的希望有新鲜感的心理需求。所以我们游戏首先有很多创意。从开始构思的时候我们就想基于软件园的实际生活,做一款跟我们每天的生活都息息相关的游戏。这样就产生了《逃离寝室》这样的构思,游戏主人公会从寝室之中逃出,然后越过种种障碍,闯过许多关,最后成功上完一天的课程。像这种冒险类游戏其实有很多,像是超级玛丽、temple run,地铁跑酷等等,一个游戏的灵魂不是他的游戏方法,而是其主题的定位。可以说在创意上面,我们已经占领了先机。
    1.2 用户希望有帮助等基本功能在吸引用户之后,要满足用户的对游戏的探索能力。在编写这个游戏的后期,我们小组给程序设置了帮助功能,将会给用户讲解游戏的规则以及具体的游戏方法,进一步指导用户将这个游戏玩下去。
    1.3 用户希望有好的视觉体验我们小组,为了使用户有更好的视觉体验,在游戏的编写过程中也一直在商讨关于游戏的人物障碍物背景等等的外观,以求使用户在游戏的过程中不会产生审美疲劳。也有更好的体验。
    1.4 用户希望有更好的听觉体验为了实现这个目标我们给游戏增加了背景音乐。
    1.5 用户希望游戏过程流畅为了实现这个目标我们进行了两方面的工作。第一就是游戏的障碍物的出现比例和节奏的调整,如果障碍物太多或者太少,会使游戏太难或太简单,以至于用户丧失游戏兴趣。其次就是运用了多线程的方法,使电脑的CPU合理分配,使游戏的画面更加流畅,不会出现卡机等现象。
    2. 系统设计计划做一个类似于超级玛丽之类的冒险游戏。主人公就是我们作为游戏原型。主要的任务就是主人公会试图从寝室出来赶时间去上课,途中会遇到种种困难阻碍我们上课的道路,我们需要做得就是闯过这些障碍最终顺利到达教室。我们的具体的类的大致设计和构思为:

    游戏流程:

    3. 系统实现我们每个周的任务进度:
    第一周

    我们已经想出了大体的设计方向及游戏的某些功能及流程
    已经初步做了几个像素小人
    正在做GIF形式的小人,一像素一像素的改
    做了一些图形界面的学习设计
    待解决的问题及后续的工作安排
    怎么样将真人做成人物并融合到程序里面
    具体的算法流程等还不是非常清楚,正在学习的阶段
    后续会先开始进行简单的地图的绘制以及人物和障碍物的创建

    第二周

    已完成的工作
    音效类,游戏中相应的音效
    精灵类,游戏中存在的人物形象,人物所存在的动画效果以及所拥有的特效;以及人物所产生的相应效果,满足相关的游戏性
    金币类,实现金币与人物的交互功能,实现金币的基础算法
    新增素材:下载了一些简单的人物素材和音乐背景,准备先做一个demo,再具体改
    本周遇到的问题 对GUI用户界面的一些方法还不是很熟悉
    写精灵的过程中出现精灵不能随着操作的指令做相应的动作,系统指令无效,无法实现交互。通过查阅资料以及不断地改进尝试终于发现了监听器出现了问题,最终改变监听器的错误,得到改进,精灵可以完成用户想让其进行的各种动作
    在创建金币类的过程中,出现了程序错误,不能正常实现金币的产生,后来经过debug发现是由于金币数组越界产生的,随后改变数组的定义,得到解决

    第三周

    本周完成了map背景类,将从网上搜集的图片元素加入界面中,实现界面的设计,实现界面可以随着指令发生移动而完成相应功能; 精灵碰撞类,实现精灵与地图元素的交互功能,当精灵与元素进行碰撞之后,实现相应的动画效果
    数据文件及数据库文件还未全部进行加入。正在设计基本类
    素材:像素小人已经初步捏好。从而实现创建了精灵类
    音效已经找好并自己录制了一部分。实现了音效类
    增强了小组成员的之间的融合。经过美工的PS设计,使得我们的界面更加的好看更加的友好。同时增加了交互的功能设计,比如调节音量等。下一步准备增加更多的交互式设计,实现更多的功能选择比如调节速度调节难度等等

    第四周

    进一步优化界面,加强人机交互的功能。人物素材也进行了修改,准备动作、前进动作、跳跃动作等等都进行了讨论并由美工进行了进一步的制作和修改。基本实现了游戏算法类和动画类
    游戏的完整体系已经基本完成了,大体框架已经形成,接下来进行细节处的改动即可。加入游戏开始页面以及游戏流畅性。游戏的开始界面已经结合我们的具体的功能进行了设计,并进行了编写和实现
    在编写动画类的时候出现了动画编程中的动画闪烁和图像残缺不全等现象,后来我们从网上发现是多线程的部分方法出现了问题。为了每秒中多次更新屏幕,必须创建一个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求。应该生成一个独立的动画线程来完成图像的显示和更新。并改变了一些其他的方法,进一步优化我们的动画效果
    在编写游戏算法类的时候,具体的算法可能还是考虑的不够清楚,常常出一些运行中的错误或者出现编写的某段代码对整个项目无效的情况。经过仔细的思考逐步解决了这些问题
    初步根据我们的系统设计,写了一个游戏的思路以及规则方法
    大体的文案已经形成。

    第五周

    进一步优化界面,加强人机交互的功能。人物素材也全部完成,包括各种行进跳跃动作。把美工所有捏的小人都增加到程序中去了。正式更新了部分的原创设计。使整个界面更加人性化有设计性
    讨论设计了游戏的开始界面及结束界面并进行开发。结合内部的具体构造进行设计,力求准确美观实现各种功能.对人物进行了进一步的修改。逐渐与原来的想法进行拟合。制作开始和结束界面的时候总是有不协调性看起来很奇怪,并且有些想法无法实现。经过不断地努力和修改逐渐解决了这些问题。开始和结束界面初步成型。再做微型调整即可

    第六周

    Javadoc进行了部分修改,因难以全部传输上去,此处仅提供大体的构架和截图,我们在其内部进行了具体的修改
    所做的项目测试工作。项目总体进度
    仍存在的问题,及待提高的方面
    还有一些在测试时发现的问题没有解决,接下来需要大家一起解决代码中的bug,共同解决游戏进行的过程中出现的种种问题,种种影响游戏顺利进行或者不流畅的画面等等问题

    第七周

    本阶段的工作主要是项目的系统收尾工作
    正在进行文档的修改和最终总结报告的书写工作
    更改了一些界面上面的设计。进行系统的最终完善
    比如设计了一些夜间场景。最终的成果的效果还没有最终确定。正在进行不断地比较和修改。开始画面希望能更加完善。还未添加帮助等功能,接下来会进一步添加,尽可能的完善。尽早的提交上我们的作品
    界面、美工、素材的美化。正在进行更改。美工正在进行对素材的梅美化。以求我们的界面更加的美观并且实用,符合我的们的设计的整体风格和思路。下附我们目前的界面,当然我们还会进行不断地改善和调整

    4. 美工素材整体游戏使用了扁平化设计理念。扁平化概念的核心意义是:去除冗余、厚重和繁杂的装饰效果。而具体表现在去掉了多余的透视、纹理、渐变以及能做出3D效果的元素,这样可以让“信息”本身重新作为核心被凸显出来。同时在设计元素上,则强调了抽象、极简和符号化。模拟现实物品的造型和质感,通过叠加高光、纹理、材质、阴影等效果对实物进行再现,也可适当程度变形和夸张,界面模拟真实物体,拟物设计会让你第一眼就认出这是个什么东西。交互方式也模拟现实生活的交互方式。简约而不简单,搭配一流的网格、色彩设计,让看久了拟物化的用户感觉焕然一新;突出内容主题,减弱各种渐变、阴影、高光等拟真视觉效果对用户视线的干扰,让用户更加专注于内容本身,简单易用。设计更容易,优秀扁平的设计只需保证良好的架构、网格和排版布局,色彩的运用和高度一致性。
    在色彩搭配方面,颜色是影响整个游戏的重要因素,不同的颜色对人的感觉有不同的影响。整体颜色采用了冷色调, 多为蓝、绿等。游戏主人公使用了与背景有鲜明对比的红、橙。建筑物使用了传统的灰色调,制作了具有使其与背景整体协调。通过对游戏的各种元素、颜色、字体、图形、空白等,使用一定的规格,使得设计良好的游戏看起来应该是和谐的。游戏设计上要保持一致性,这又是很重要的一点。一致的结构设计,可以让浏览者对游戏的形象有深刻的记忆。一致的背景界面设计,可以让浏览者迅速而又有效的进入在软件中自己所需要的部分,一致的操作设计,可以让玩家快速地了解、上手游戏。建筑风格上参考纪念碑谷,给玩家带来新鲜的感觉。



    5. 收获体会以往几周的实验报告摘要
    第一周结论分析与体会:

    每一个项目的进行都需要具体的执行方案和具体的分工合作。
    好的创意和构思往往来源于生活。
    在做一个项目之前应该先想好具体的框架及模板模块,以防真正执行起来的时候出现种种难以预料的问题。
    任何创意的背后都需要强大的技术支持和不断地学习,经验的积累。

    第二周结论分析与体会:

    学习的过程是艰苦的迂回的,所有的代码都不是能够突然写出来突然完成的。
    不能太急于求成,从小的方面一点点的进行,最终实现整个类的实施,才是比较可行的方法。学习的过程是必须的,不能急躁。
    在一些容易出错的地方比如数组超界之类的问题要一开始就多加注意。写代码的时候要有给每一个模块增加注释的习惯,这样遇到问题的时候比较好随时回来改。
    debug的时候要有耐心,一遍遍的进行调试更改,不能急躁。
    要懂得合作。合作的力量是无穷的!

    第三周结论分析与体会:

    每一个程序的实现不能只是简单地大体的做一下,必须要考虑要多种因素的影响,考虑到用户的游戏时的视觉感官体验等等。
    增强游戏的功能,提供更多的交互功能。在游戏过程中能够随时进行调节。
    每一个项目的进行都需要经过不断的调试不断的改进,前面做的某些东西要根据实际的项目发展进行改变。制定目标时不能定死。多做一些动态方法。有利于项目的进行。
    想法也要尽可能完善,尽量在初期考虑到后面的可行性。

    第四周结论分析与体会:

    必须要考虑要多种因素的影响,考虑到用户的游戏时的视觉感官体验等等。
    每一个项目的进行都需要经过不断的调试不断的改进,前面做的某些东西要根据实际的项目发展进行改变。制定目标时不能定死。多做一些动态方法。有利于项目的进行。
    有了大体的框架可能更有利于下面的进一步细节的改动,有些细节不用太过拘泥,可以形成基本框架之后再进行改动。要有整体意识。

    第五周结论分析与体会:

    每一个项目的进行都需要经过不断的调试不断的改进,前面做的某些东西要根据实际的项目发展进行改变。制定目标时不能定死。多做一些动态方法。有利于项目的进行。
    有了大体的框架可能更有利于下面的进一步细节的改动。

    第六周结论分析与体会:

    必须要考虑要多种因素的影响,考虑到用户的游戏时的视觉感官体验等等。
    游戏基本完成时其测试的安排十分重要,包括测试的规划,如何进行,部署,怎么样才能发现更多的问题并且进行解决,发现问题的时候又应该如何解决,对我们来说都是一些挑战。测试前要事先做好规划,并且测试进行的过程中发现的问题要及时记录并想办法解决。

    第七周:结论分析与体会:

    每一个游戏的完成都是艰难的,只有坚持到底,不断地学习不断地进步才能实现最后的成功。
    在今后的学习生活中还要不断培养自己的自学能力,遇到各种困难都不能退缩。逐步增强自己解决问题的能力。

    最终总体体会:
    课设的构想是美妙的,但是真正做起来却是困难的。从组队确定好主题到现在我们遇到了很多很多的困难。刚开始的时候什么都不懂,经过上学期的学习,对于GUI、多线程等等就只是听说过,一点也不懂,难以想象这样的我们有一天会做出这样一个比较完整的作品。回过头来想想走过的路真是感慨万千。经过了课程设计的锻炼,我们总结出了以下这样的几个经验或者说是体会。

    首先,对于任何事物都要有一个总体的规划。对于大体要做成什么样子,必须有一个整体的规划并且向着那个明确的目标努力,不能无组织的随便乱写。必须有了正确的明确的大方向的指引,才能不断的朝这个目标努力并且最终实现。
    其次,任何事物的完成要有扎实的基本功做基础。像刚开始的我们什么都不懂。在游戏的编写过程中我们也吃了很多苦。上课的时候认真听讲做笔记,下课之后课下也要不断地对代码进行研究,研究各种资料。我们都深切的感受到,没有深厚的技术基础做保障,所有的都是空谈。
    实践出真知。很多时候只是上课好像听懂了或者是看视频看懂了其实真正自己敲起来的时候还是觉得很困难,出现了很多的bug,也都得一点点的去改,有时候很多bug发现不了也改不出来的时候特别烦躁,不过也得耐心一点点看。可以说在这个过程中我们每个人都吃了很多苦,不过也正因为这个过程我们的能力也得到了很大的提高,从一开始的什么都不会到现在的可以完成一个完整的游戏,这对我们来说已经是巨大的飞跃和提高。在这个过程中我们极大的锻炼了自己的自学能力。
    团队的力量是无穷的。自己一个人完成一个大的任务可能是困难的,但是有了小组的合作,有了大家的齐心协力任何困难都会被解决的很好。
    我们的代码可能还比较幼稚比较简单,但是我们已经付出了很多努力,不管多难,都能努力咬牙坚持去学习去尝试去自己写,而不是简单地copy网上的或者别人的代码。正因为有了这样的毅力有了这样的决心才会有进步才会有提高。我们也知道我们的能力还不足,我们也还有很大的进步的空间。在以后的学习中,生活中,我们还会继续努力,课程设计虽然即将告一段落,但是我们的学习之路还远远没有结束,将来的路还很长。我们会永远记得这段努力完成课设的时光,并继续加油、继续努力。向着我们的未来向着我们的目标不断迈进。
    0 评论 2 下载 2019-06-24 14:10:51 下载需要15点积分
  • 基于javaEE学生选课系统

    摘 要本人结合学生选课管理的实际需要,完成了对学生选课管理系统的需求分析、功能模块划分、数据库模式分析等,并由此设计了后台数据库以及前台应用程序。
    文中首先对课题背景,数据库基础理论和SQL语言进行了简单的讨论;对学生选课管理系统进行了详细分析,划分了具体的功能模块;最后,给出了学生选课系统应用程序的设计过程,以及每个功能模块的核心代码。
    系统可以实现学生选课的一些重要功能,如:课程的添加、删除,信息查询、选课、生成课表,以及学生选课管理人员、用户个人信息的维护等。学生选课系统主要是为学生选课的管理提供全面、准确、科学的管理方法,方便快捷地处理选课的管理信息;避免了信息处理错误,提高了信息管理的工作效率,便捷的网上选课,大大地节省人力和物力的开支。
    1. 开发工具选择采用一个开放源代码的、基于Java的可扩展开发平台eclipse作为主要开发工具,以及一个大型关系数据库管理系统SQL Server作为数据管理工具
    2. 开发环境
    开发系统:Win7
    系统开发平台:eclipse5.0
    系统开发语言:javaEE

    3. 本报告的主要内容本报告详细的介绍了学生选课系统的开发过程,主要涉及到的工作如下:选课的一些重要功能,如:课程的添加、删除,信息查询、选课、生成课表,以及学生选课管理人员、用户个人信息的维护,系统的总体设计、系统的概念设计、系统各模块的详细设计、系统运行与测试。
    功能要求:

    用户登录
    查看个人信息
    修改个人信息
    查看个人选课情况
    查看所有课程信息,能够选定课程
    退选课程

    4. 关系型数据库关系数据库由表组成。一个关系是由一个二维表来定义的:表的行保存事物的一组属性数据,表的列定义了事物的属性
    5. 创建数据库表设计如下所示的实体和属性的定义:

    课程信息(课程代号,课程名称,学分)
    学生信息(学号,姓名,性别,出生年月日,专业)
    学生登录信息(学号,用户名,密码,权限代号)
    学生选课信息(学号,课程代号,学期,上课时间,任课老师)
    用户权限(权限名称,权限代号)。

    学生表和专业表是单向多对多的关系专业表与学生表是一对多的关系


    6. 系统总体结构及功能模块划分6.1 功能模块设计
    6.2 struts图
    6.3 系统主要功能实现及代码6.3.1 主页面
    6.3.2 学生信息录入
    6.3.3 所有课程信息
    6.3.4 学生信息查看
    6.3.5 总体图
    总结通过这次课程设计,使我灵活应用所学javaEE知识,,结合javaEE理论知识,编写程序实现系统所需功能。初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法分析和解决问题的能力;并用系统的的观点进行系统设计,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养我们严谨的科学态度和良好的编程风格。进一步加深对SSH框架的知识的理解,并能够利用SSH框架的知识实现教务管理系统。同时在这学期的实验中,培养了以专业的眼光去对待我们系统中的每一段代码,这算是一次不可多得的实践机会。在这一次的实践过程中,个人动手能力,方方面面都得到了一定程度的提高。在这个过程中,我学会了很多学习的方法。而这是日后最实用 也是最宝贵的。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。通过这次课程设计使我明白了自己知识还比较欠缺,只是学习书本知识还是远远不够的,自己不会的东西还有太多,学习需要自己长期的积累,在以后的学习、工作中都应该不断的学习,将课本的理论知识与生活中的实践知识相结合,不断提高自己文化知识和实践能力。
    0 评论 1 下载 2019-06-24 13:55:49 下载需要11点积分
  • 基于Java和Sql Server的C/S架构图书管理系统

    1 系统设计目标1.1 应用背景图书管理系统是各图书馆都需要使用的系统,它能帮助图书管理员更好地管理海量图书,尤其是在图书馆藏数量和读者数量都很大的图书馆,我们无法用手写的方式录入、管理图书信息和借阅信息,必须借助图书管理系统来完成这些工作。
    1.2 总体目标系统的使用者分为管理员和读者。管理员负责新书的录入、旧书的清理、借书审核、还书审核,以及日常的维护,有权限增删图书的信息;读者要能够根据书名查找图书,并选择中意的图书进行借阅,读完以后还可以还书;读者没有权限修改图书的信息,他对图书的操作仅限于借、还。这就是一个简单的图书管理系统的大致功能。
    2 需求分析系统总体功能需求列表如下表所示。



    功能编号
    功能名称
    功能描述
    权限




    1
    录入图书信息
    将新的书籍信息录入系统
    管理员


    2
    删除图书信息
    将损坏的图书从系统删除
    管理员


    3
    修改图书信息
    更新图书信息
    管理员


    4
    审核还书申请
    审核读者的还书请求,检查图书损坏情况并开出罚单
    管理员


    5
    审核借书申请
    审核读者是否有罚金未交,确定读者是否可借阅书籍
    管理员


    6
    查找书籍
    通过书名查找书籍信息
    读者


    7
    查询个人信息
    读者查询个人信息
    读者


    8
    查询借书记录
    读者查询借书记录
    读者


    9
    借书
    读者选择书籍进行借阅
    读者


    10
    还书
    归还借阅的书籍
    读者


    11
    续借
    继续借阅到期的书籍
    读者


    12
    交款
    缴纳罚金
    读者



    性能需求上,要求所有的操作都没有明显的延迟,这对于现在的计算机来说不算难事,所以是不用刻意考虑性能方面的因素的。
    数据完整性,具体在数据库设计中说明。
    系统的数据流图如下图所示。

    3 总体设计系统采用C/S模式实现,没有为服务器设计专门的客户端,实际上服务器就是数据库,用户是读者和管理员。主要分为两大功能板块:管理员和读者。
    实际的图书管理系统要配合扫描仪等设备进行使用,我们的系统显然不能连接外设,适当信息需要手动输入。
    系统的总体结构图如下图所示。

    3.1 管理员3.1.1 图书信息管理具体又分为两个部分:新书上架,也就是将新书的各项信息录入到数据库;查询维护,通过索书号、书名、作者等信息进行查询,得到查询结果后,可以选中并删除图书,这主要是方便管理员查找图书,找到以后还可以精准地删除图书。
    3.1.2 读者信息管理与图书信息管理类似,可以录入、查找并修改或注销读者信息。
    3.1.3 借阅管理分为借书和还书两部分。读者想要借书时,发出一个借书请求,管理员收到该请求后,查看该读者是否还存在有罚金未交的情况,若是,则拒绝读者的借书请求;否则,同意借书。读者还书时也发出还书请求,管理员收到后,查看该读者是否延期还书,或者图书损坏,若是,则开出罚单,等待读者缴费,若图书损坏,则将图书标记为损坏,否则,进行还书登记。
    3.2 读者3.2.1 借阅分为借书、还书和续借。借书时,可以根据关键字在数据库中进行查找,选择借书,此时发出借书申请,等图书管理员审核通过后才能成功借书;还书时,从借阅列表中选择尚未归还的书籍,发出还书请求,等待管理员审核,若审核发现图书有损坏,则会收到罚单;续借是将当前正在借阅的书籍再延长一个借书周期。
    3.2.2 查看报表读者可以查看个人信息、借阅信息、罚单。
    4 数据库设计4.1 ER图用Microsoft Visio2010与SQL server连接,生成的实体关系图如下图所示。

    4.2 权限控制图书馆的访问者主要是管理员和读者,所以设置两个用户。管理员有所有表的所有权限,读者的权限则要受到限制。
    在上图的6个表中,读者有权限访问馆藏表、图书表和作者表,因为读者需要查询图书;读者有权限访问读者信息表,因为他需要查看自己的个人信息;读者有权限查询和更新借阅表,因为他需要查看自己的借书记录,此外,发起借书请求时会向借阅表中增加一条记录,所以需要更新权限;读者有权限查询和更新罚单表,与前者同理,读者需要查看罚单,并且缴纳罚金时会修改罚单状态,所以需要更新权限。读者没有删除任何一个表的权限,有查询所有表的权限和修改部分表的权限。
    4.3 数据库逻辑结构设计数据库主要分成三大部分:图书信息、借阅信息和读者信息,其中借阅信息和读者信息分别可用一个表实现,但是图书信息相对较复杂。在了解了学校图书馆的图书管理系统以后,发现每一本书都有一个索书号,一个索书号可以对应该书的多本实体,每个实体只用索书号是无法区分的,图书馆采用条码进行区分,所以需要增设馆藏信息表来存放每本实体书的条码号和馆藏地点、馆藏状态等。
    同样的,一本书也可能有多个作者,所以也需要用一个单独的表来存放作者,这里我们暂不考虑作者同名的情况,所以没有给作者设置编号。出版社在一般情况下不会同名,也不设置单独的表。
    借阅信息用于存放读者的借阅记录,由于借阅过程存在罚款,所以还有一个罚款表。
    最终图书管理系统的数据库共有6个表:图书信息表、作者信息表、馆藏信息表、借阅信息表、罚款信息表、读者信息表和罚单表,表项分别如下:

    图书信息表:题名,索书号,出版社,发行时间,版本。主码为索书号,题名也不能为空
    馆藏信息表:条码,索书号,馆藏地点,状态。主码为条码,索书号为外码,来自图书信息表,馆藏状态不能为空
    作者信息表:索书号,作者。索书号为外码,来自图书信息表
    借阅信息表:条码,读者编号,借阅日期,归还日期,借阅编号,状态。主码为借阅编号,条码为来自馆藏信息表的外码,读者编号为来自读者信息表的外码
    读者信息表:编号,姓名。编号为主码
    罚款信息表:罚单号,罚金,罚款原因,状态,借阅编号。主码为罚单号,借阅编号为来自借阅信息表的外码

    除了基本表外,还需要若干个视图来实现系统的功能。

    图书视图:题名,索书号,作者,出版社,发行时间,版次,条码,馆藏地点,状态。该视图用于管理员和读者查询图书的结果显示,是图书信息表、馆藏信息表和作者表三者的连接
    借阅记录视图:借阅编号,条码,书名,读者编号,读者姓名,借阅时间。该视图用于管理员对读者的借书请求进行处理,视图中包含所有读者的所有借阅记录,是借阅信息表、图书信息表和读者信息表的连接
    借阅统计:借阅申请次数、借阅成功次数、还书申请次数、还书破损册数。该视图用于管理员的统计查询,对一段时间内的借书、还书信息进行统计
    借阅排行:索书号,书名,借阅次数。用于管理员统计一段时间内借阅次数排名前列的书籍,了解图书馆最受欢迎的书籍情况

    4.4 数据库物理设计图书表设计如下表所示:



    字段名
    类型
    主键/外键
    为空
    索引
    取值
    备注




    索书号
    char(20)
    主键






    书名
    char(100)







    出版社
    char(30)







    发行时间
    date



    合法日期



    版本
    tinyint



    正整数



    馆藏信息表设计如下表所示:



    字段名
    类型
    主键/外键
    为空
    索引
    取值
    备注




    条码
    int
    主键


    从1起自增



    索书号
    char(20)
    外键


    来自图书表



    馆藏地点
    char(100)







    状态
    tinyint



    0、1、2
    1-在馆 2-借出 0-损坏



    著作表设计如下表所示:



    字段名
    类型
    主键/外键
    为空
    索引
    取值
    备注




    索书号
    char(20)
    外键


    来自图书表



    作者
    char(20)







    读者表设计如下表所示:



    字段名
    类型
    主键/外键
    为空
    索引
    取值
    备注




    编号
    int
    主键


    从1自增



    姓名
    char(10)







    密码
    char(20)







    借阅表设计如下表所示:



    字段名
    类型
    主键/外键
    为空
    索引
    取值
    备注




    借阅编号
    int
    主键


    从1自增



    条码
    int
    外键


    来自馆藏表



    读者编号
    int
    外键


    来自读者表



    借阅日期
    datetime







    归还日期
    datetime







    状态
    tinyint



    0-4
    1-申请借阅 2-在借 3-申请归还 4-已归还 0-失效



    罚单表设计如下表所示:



    字段名
    类型
    主键/外键
    为空
    索引
    取值
    备注




    罚单号
    int
    主键


    从1自增



    借阅编号
    int
    外键


    来自借阅表



    罚金
    int







    罚款原因
    bit



    0、1
    0-过期归还罚款 1-损坏图书罚款


    状态
    bit



    0、1
    0-用户未交罚金 1-罚金已付



    5 详细设计与实现系统用Java语言实现,通过jdbc与SQL server进行连接,获取数据库中的数据。对管理员和用户分别提供了客户端,图形界面用Javafx实现。
    5.1 读者-搜索图书5.1.1 流程图算法的业务流程图如下图所示。借书功能与搜索功能是密不可分的,一般都是先搜索再借书。程序初始化时就从数据库中查找出所有的图书信息,并显示到表格上,用户可以直接选择从表中选取某一项,然后进行借阅;如果图书信息过多,直接选取较为困难,可以在输入框中输入关键字搜索,再选择图书进行操作。

    5.1.2 算法说明图书的状态,如在馆、借出等,在数据库中是用int型存储的,所以向管理员展示时,必须用汉字直观地打出,所以要将int转换成字符串;
    由于每本书都可能有多个作者,所以要对作者进行特别处理,当多条记录的索书号相同而作者不同时,要合并为一条记录,把各个作者拼接成一个字符串,中间用分号隔开;
    此外,在数据库中,如果某个字段是长度为20的字符类型,而实际只用了8个字符,那么后面12个字符会用空格填充,这虽然不影响查询的结果,但是在表格中显示时,空格也会占用空间,所以需要用Java中String.trin()去除多余的空格。
    5.1.3 数据库实现sql语句如下,其中index是搜索的关键字,关键字可以是图书的索书号的一部分、书名的一部分或者图书作者的一部分,即只要有部分字段匹配即可搜索处结果,所以where子句中用“like”进行匹配。
    sql = "select * from dbo.图书 t,dbo.馆藏 t2,dbo.著作 t3 where t.索书号=t2.索书号 " + " and t3.索书号=t.索书号 and (t.索书号='"+index +"' or t.题名 like '%"+index+"%' or t2.条码='"+index+"' or t3.作者 like " + "'%"+index+"%') order by t2.条码,t.索书号,t3.作者";
    5.2 读者-借书5.2.1 流程图图书搜索功能中,在选中了图书并申请借阅以后,要进行一系列判断审核,流程图如下图所示。

    5.2.2 算法说明从选中表项中获取该的条码号,实际上从表中可以直接获取图书的馆藏状态,但是考虑到表中数据可能未及时更新,该书在数据库中可能已经改变状态,所以不能用表中的状态。
    根据条码号从数据库中查询该书状态,如果已经借出或者已经损坏,则提示用户借书失败;否则,可以生成借阅信息,插入到借阅信息表中,并提示用户借书请求成功。这不意味着真正地借书成功,还要等待管理员审核。
    5.2.3 数据库实现插入借阅信息sql语句如下,借阅时间是当前时间,借阅编号自动生成。
    sql = "insert into dbo.借阅(条码,读者编号,借阅时间,状态," + "借阅编号) values("+barcode+",'"+Main.getUser()+"'," + "'"+df.format(new Date())+"',1,"+(count+1)+")";
    5.3 读者-续借/还书5.3.1 流程图算法流程图如下图所示。续借和还书都是以借阅记录表为基础的。虽然在需求分析中,这些功能是相互独立的,但在实际实现时,我们要把他们充分联系起来,这也是为了用户的使用方便。
    从数据库中获取该读者所有的借阅记录,读者可以选中任意一条记录,选择续借或者归还该书籍。

    5.3.2 算法说明读者查看借阅记录时,借阅记录表已经初始化好,从数据库中选取了该读者的所有历史借阅记录,记录的状态分为在借、已归还。
    读者选中某条记录后,若选择续借,则首先要判断是不是在借记录,不是则无法续借,然后还要判断该书是否过期未还,借书期限为一个月,超过期限的书是不可以续借的,若上述条件都满足,则续借成功,将数据库中的借阅时间更新为当前时间,还书期限重新计时。
    若读者选择归还,则先判断该记录是否为在借记录,若不是,则无法归还,若是,则直接申请归还,这不需要新增一条借阅记录,只需要将借阅记录中的状态从在借修改为申请还书,管理员看到以后会进行审核。
    5.4 读者-查看个人信息该选项只能查看信息,不可进行其他操作,功能简单。
    获取读者在借册数的sql语句如下:
    sql = "select count(*) total from dbo.借阅 t where t.读者编号" + "='"+usernum+"' and t.状态=2";
    获取读者总罚金数的sql语句如下:
    sql = "select sum(t.罚金) total from dbo.罚单 t,dbo.借阅 t2 " + "where t.借阅编号=t2.借阅编号 and t2.读者编号='"+usernum+"' and t.状态=1";
    5.5 读者-查看罚单该选项只能查看信息,功能简单。获取罚单的sql语句如下:
    sql = "select t.罚单号,t.罚金,t.罚款原因,t.状态,t.借阅编号,t4.题名," + "t3.借阅时间,t3.归还时间" + " from dbo.罚单 t,dbo.馆藏 t2,dbo.借阅 t3,dbo.图书 t4 " + "where t.借阅编号=t3.借阅编号 and t3.条码=t2.条码 and " + "t2.索书号=t4.索书号 and t3.读者编号='"+Main.getUser()+"'";
    5.6 管理员-查询图书管理员查询图书与读者查询图书的流程基本相同,不再赘述。
    5.7 管理员-下架旧书
    5.7.1 流程图算法流程图如上图所示。
    5.7.2 算法说明由于管理员看到的图书信息实际上是由图书信息表和馆藏信息表连接生成的,所以在进行图书下架时,既涉及到馆藏信息的删除,又有图书信息的删除。有些书籍没有馆藏信息,只有图书信息,则只需要删除图书信息表,否则只要删除馆藏信息表,不能删除图书信息表,因为该图书可能存在其他实体,我们只能一次删除馆藏信息中的一个实体,如果把图书信息也一并删除,则馆藏信息的外键引用会出错。
    5.8 管理员-录入图书5.8.1 流程图算法流程图如下图所示。

    5.8.2 算法说明录入图书时,索书号和条码号绝对不能为空,须在所有操作之前检查。录入的情况分两种:首先是索书号已经存在的,也就是说,这本书以前就在图书馆中存在,现在又购置了该种书的一批新书,所以图书信息不需要再插入,直接插入馆藏表即可;
    第二种是该书原本不存在的情况,图书馆第一次购置该种书,则需要先插入图书信息表,然后再插入馆藏信息表,不可改变插入顺序,否则外键引用出错。
    5.8.3 数据库实现插入图书信息:
    sql = "insert into dbo.图书(题名,索书号,出版社," + "发行时间,版本) " + "values ("+bname+","+isbn+","+press+","+ymd+","+version+")";
    插入馆藏信息:
    sql = "insert into dbo.馆藏(条码,索书号,馆藏地点," + "状态) " + "values ("+barcode+","+isbn+","+store+",1)";
    5.9 管理员-查询读者5.9.1 流程图算法流程图如下图所示:

    5.9.2 算法说明搜索框的输入可以是读者编号、读者姓名的一部分,在数据库中的读者信息表中查找符合要求的项,这样的项可能有多个,循环取出,依次查找他们的在借册数和罚金数额,都添加到结果表格中显示。
    5.10 管理员-修改读者5.10.1 算法说明管理员选中读者表中的某个以后,选择修改该读者的信息,由于Javafx中的表格直接修改不太方便,所以用弹窗的方式修改。将原来的读者信息在弹窗中显示,管理员选择修改,点击确认以后,将修改后的信息写入到数据库中该读者对应的条目。
    5.11 管理员-注销读者
    5.11.1 流程图算法流程图如上图所示。
    5.11.2 算法说明管理员选中某个读者,选择注销该读者,先判断读者是否有在借书籍,如果有,则不能注销,否则该读者无法还书;再判断该读者是否有罚金未交,如果有,则不可注销,否则会造成图书馆的亏损。若上述情况都没有,则直接将其从读者信息表中删除,其他在外键中引用了该读者的表项也会被触发器一并删除。
    5.12 管理员-审核借书5.12.1 流程图算法流程图如下图所示:

    5.12.2 算法说明审核读者的借书申请时,首先要检查读者已经借了多少册书,若达到上限,则不允许继续借书;然后检查该读者的罚单,如果有罚金未交,也不允许借书;再检查该读者在借记录,若有书过期未还,不允许借书。
    以上情况均不存在,则读者有借书资格,然后检查该书是否在馆,因为该书可能被前面的读者借走了,若在馆则允许借书,审核通过,否则失败。
    5.13 管理员-审核还书5.13.1 流程图算法流程图如下图所示:

    5.13.2 算法说明管理员审核还书时,先要看图书是否损坏,判断以后填写,如果损坏,则需要生成书籍损坏的罚单,还要将该图书的馆藏信息状态修改为损坏。然后再判断读者是否未按时归还该书籍,若是,则需要生成延期的罚单。最后将归还日期写入数据库,审核完成。
    5.14 数据库事务实现在进行书籍的录入时,先要向图书信息表添加数据,然后再向馆藏信息表添加数据,这两者是分两步进行的。在一般情况下,两步都会成功。但是,特殊情况下,可能插入图书信息成功,而插入馆藏信息失败,这是不应该的。为此我们要添加数据库事务,目的是,对于连续的几个数据库操作,要使其成为原子操作,也就是,要么全都执行成功,要么全都不执行。假如第一条成功了,而第二条失败了,那么要将第一条的结果回滚,部分代码如下所示:
    stmt.executeUpdate(sql_1);stmt.execteUpdate(sql_2);conn.commit();//若所有结果执行完成,则执行提交事务ps.close();conn.close()catch(ClassNotFoundException e){ e.printStackTrace();}catch(SQLException e){ e.printStackTrace(); try{ //只要有一个sql语句错误,则事务回滚 conn.rollback(); }catch(SQLException e){ e.printStackTrace(); } }
    5.15 触发器-删除空白书籍5.15.1 触发器说明书籍的信息是存放在图书信息、馆藏信息两个表中的,在录入某种书籍时,先在图书信息表种录入一条数据,再在馆藏信息表中录入多条数据,表示该种书的多个实体。假如该种书全都损坏,则馆藏表中关于该书的条目全都被删除,此时图书信息表中还残留有该书的信息,这条信息已经无效了,需要删除。为了避免手动删除,使用触发器来实现,每次更新或者删除馆藏信息后,检测图书信息表中是否有某条记录已经没有馆藏书籍,将它从图书信息表中删除。
    5.15.2 触发器实现触发器功能部分如下:
    ALTER TRIGGER [dbo].[delete_emptybook] ON [dbo].[馆藏] AFTER DELETE,UPDATEAS BEGIN SET NOCOUNT ON; delete from 图书 where 0=(select count(*) from 馆藏 where 馆藏.索书号=图书.索书号)END
    15.16 触发器-设置图书损坏5.16.1 触发器说明当读者还书时,管理员需要判定该书是否损坏,如果鉴定为损坏,则需要开具罚单,罚单中有一项表示罚款的原因是书籍损坏还是迟还,如果该项填写为书籍损坏,则自动将馆藏表中对应的书籍馆藏状态设置为损坏,省去了手动设置。
    5.16.2 触发器实现触发器功能部分实现如下:
    ALTER TRIGGER [dbo].[set_bookbroken] ON [dbo].[罚单] AFTER INSERT,DELETE,UPDATEAS BEGIN update 馆藏 set 状态=0 where exists (select * from inserted,(select * from 借阅)t where inserted.罚款原因=1 and inserted.借阅编号=t.借阅编号 and t.条码=馆藏.条码)END
    5.17 触发器-设置罚金5.17.1 触发器说明在开具罚单时,管理员只需要填写罚款原因,而罚款金额有数据库生成,规定过期还书罚款1元,书籍损坏罚款5元,自动设置罚款的触发器根据罚款原因进行罚金的设置。
    5.17.2 触发器实现触发器功能部分实现如下:
    ALTER TRIGGER [dbo].[set_fine] ON [dbo].[罚单] AFTER INSERT,DELETE,UPDATEAS declare @sake bit;BEGIN select @sake = 罚款原因 from 罚单; if @sake=0 begin update 罚单 set 罚金=1 where exists(select * from inserted where 罚单.罚单号=inserted.罚单号) end else begin update 罚单 set 罚金=5 where exists(select * from inserted where 罚单.罚单号=inserted.罚单号) endEND
    5.18 触发器-修改读者信息5.18.1 触发器说明管理员有一项功能是修改读者的信息,如果只是修改了读者姓名、密码等,那么只需要修改读者表这一个表,而如果修改了读者编号,即修改了主码,那么与该读者有关的借阅信息表中存有的该读者的编号也要进行修改,这一操作不能让管理员执行,需要用触发器实现。
    5.18.2 触发器实现触发器功能部分实现如下:
    ALTER TRIGGER [dbo].[update_aboutuser] ON [dbo].[读者] AFTER UPDATEAS declare @old char(10) declare @newuser char(10)BEGIN select @old=t.编号 from deleted t select @newuser =t.编号 from inserted t update dbo.借阅 set 读者编号=@newuser where 借阅.读者编号=@oldEND
    6 系统测试6.1 管理员-图书查询测试6.1.1 测试说明可以在选择框输入索书号、作者或者是书名,均可查询出结果。
    6.1.2 测试过程管理员的图书查询维护界面如下图所示,未执行查询时会显示所有的图书信息。

    查询可以根据索书号、书名、作者这三个关键字的全部或者部分进行查询,根据索书号查询结果如下图所示。

    根据书名查找结果如下图所示。

    根据作者查询结果如下图所示。

    查询失败结果如下图所示,书库中暂无该书。

    若输入框为空,则查询结果为所有书籍。
    6.2 管理员-图书下架测试6.2.1 测试说明任务书中要求管理员可以进行旧书下架,旧这个概念比较模糊,没法严格定义,所以我们把一本书是否已经“旧”了的决策权交给管理员,也就是说,管理员可以删除任何他认为算作旧书的书籍,所以管理员可以选择任何书籍进行删除,除非该书已借出,不在馆。
    6.2.2 测试过程选中已经借出的书籍《大卫•科波菲尔》,选择下架,弹出窗口警告该书已借出,不可删除,如下图所示。

    选择在馆图书《夏洛的网》,点击下架,结果如下图所示,删除成功。

    《夏洛的网》只有一本实体书,删除以后,馆藏信息表中已经没有该书,而图书信息表中还有该书,此时触发器检测到该书没有馆藏信息,在图书信息表中将其自动删除。
    6.3 管理员-新书上架测试6.3.1 测试说明新书上架界面如下图所示,其中索书号一栏用的是下拉框,既可以选择又可以输入,这样设计是因为,录入图书时,有两种情况:其一,图书馆购置了一批最新的书籍,馆中没有这种书,那么索书号必须要新分配,所以要输入索书号;其二,馆中已经有的书,最近又增购了一些,录入这些书籍时,就可以直接从列表中选择索书号了,我们的测试也分这两种情况进行。书籍的条码号不需要手动填写,数据库会自增生成。

    6.3.2 测试过程首先选择录入已经存在的书籍,从索书号列表中选择一个索书号,如下图所示,书名、作者等项会自动填充,且不可编辑,只有条码号和馆藏地点可以填写。

    填写好以后,点击录入,录入成功,结果如下图所示,最后一行是《兄弟》新录入的馆藏本,条码号为168。

    再测试录入馆中没有的书籍,我们录入一本计算机丛书《编译原理》,索书号为cs3,其他各项信息如下图所示。

    确定录入,录入成功,结果如下图所示,最后一行是刚录入的书籍。

    测试异常情况,不填写索书号直接录入,弹出窗口警告;不填写馆藏地点直接录入,也提示错误。
    6.4 管理员-读者查询6.4.1 测试说明读者信息查询可以根据读者编号、读者姓名的一部分或全部进行,但不能通过用户密码进行查询,因为涉及到密码的操作不太安全,实际上这里将用户密码直接显示也是不太好的,只不过我们认为管理员有一切权限,所以可以查看用户密码。
    6.4.2 测试过程读者查询维护界面初始化如下图所示,表中显示了所有的读者。

    根据读者姓名查询,在搜索框输入“张”,查询结果如下图所示。

    根据读者编号进行查询,结果如下图所示。

    查询异常情况,输入的关键字不匹配,查询结果为空,如下图所示。

    6.5 管理员-录入读者信息6.5.1 测试说明读者录入分为正常录入、读者编号重复异常、信息不全异常。
    6.5.2 测试过程录入一名读者,如下图所示。

    录入以后,在读者列表中可以看到刚刚录入的读者信息;将读者姓名、密码之中的任意一项空缺,点击录入,将提示信息填写不全
    6.6 管理员-修改读者信息6.6.1 测试说明管理员可以选择一条用户信息,选择修改。修改后点击确定,即可修改成功。不允许修改主码读者编号,因为该项是自增的,不可编辑,可以任意修改读者姓名和登录密码。
    6.6.2 测试过程选择读者“张三”,点击修改,弹出窗口如图 4 36所示。将读者姓名修改为“李四”,密码改为“lisi”,点击确定。

    6.7 管理员-注销用户6.7.1 测试说明管理员有权限删除任何一个用户,只是也要受一些限制。如果读者有借书还未归还,则不能删除;如果读者有罚金未交,则不能删除。只有读者与图书馆不存在利益关系时才可注销账户。
    6.7.2 测试过程选择3号用户蔡韬,点击删除,注销成功。
    6.8 管理员-查看报表统计报表的功能较为简单,如下图所示是借阅统计报表,可以选择开始时间和结束时间,统计该段时间内的总借阅申请、借阅成功、还书申请、还书成功数目。

    如下图所示是借阅排行榜,可以选择开始时间和结束时间,统计该段时间内,图书馆的书籍借出次数,降序排列,便于管理员掌握受欢迎的书籍种类。

    6.9 借书/还书综合测试6.9.1 测试说明由于读者的借书和管理员的借书审核、读者的还书和管理员的还书审核,互相之间是密不可分的,所以测试也不能孤立地进行,我们将读者和管理员的借书、还书操作混合交替进行,以达到测试借书、还书的目的。
    管理员审核读者的借出请求时,首先要判断读者在借册数是否超标,再判断是否有在借的书过期未还,最后判断是否有罚金还未交,以上三种情况都拒绝借书,否则审核通过,借书成功。
    借书测试计划是,先让一个用户连续申请借书4次,管理员进行审核,由于用户借书上限是3本,所以该用户的前三次请求均能通过,属于正常情况,第4次被拒绝,属于异常中的借书册数超标。然后读者申请还书,管理员很合还书时将该书鉴定为损坏,对读者开罚单,读者收到罚单后再次借书会失败,这是借书异常中的罚款未交异常。再将读者借书日期修改为超过1个月以前,这样读者再次借书也会失败,属于借书异常中的有书过期未还异常。
    6.9.2 测试过程读者请求借书,连续申请4次。在管理员一端可以看到读者“张鑫”的4次借书请求,如下图所示。

    管理员进行借书审核,读者借书成功;审核到第4本书时,系统检测到该读者已经借书3本,不可继续借书,所以弹窗警告,借书失败;紧接着,读者申请还书;管理员审核还书,管理员填写鉴定图书是否损坏,默认为正常,可以下拉选择损坏;选择损坏并点击确定,图书损坏需要罚款5元。
    由于该读者还书时被鉴定为损坏图书,所以他已经被取消了借阅资格,只有缴纳了罚金以后才会被取消限制,现在该读者再次尝试借书,管理员审核时检测到他有罚金未交,拒绝了借书请求。要恢复还书资格,读者必须缴纳罚款,读者成功缴纳5元罚金,重获借书资格并再次申请借书。管理员再次审核读者的借书请求,借书成功。
    最后一种异常情况,就是读者借书过期未还时,不可继续借书。我们设置的借书期限是一个月,考虑到测试时生成的借阅记录都是今天的,所以短时间内不会超过借书期限,为了完成测试,我们直接到SQL server中将借阅事件修改到两个月以前,这样一来,这条借阅记录就一定过期了。如下图所示,最后一条借阅记录时间为4月12日。

    该读者有书过期未还,现在再次申请借书,管理员审核借书信息时,检测到他有书过期未还,拒绝借书。读者将过期未还的书申请还书,管理员审核时,系统检测到该书过期,收取1元罚金,该读者被取消借书资格,只有缴纳罚金以后才会取消限制。
    6.9.3 结果分析以上测试过程涵盖了读者借书、读者还书、管理员审核借书、管理员审核还书。读者不管有没有借书资格,都是可以发出借书申请的,最终借书是否通过,在管理员一方决定。读者所借书籍不管是不是已经过期、是不是损坏,都是可以申请还书的,最终是否罚款,在管理员一方判断。所以说,读者借书、还书都没有异常情况。
    管理员审核借书,有三种异常情况:该读者已经有3本书在借未还;该读者有罚金未交;该读者有至少一本书过期未还。这三种情况在测试都进行了处理。
    管理员审核还书,有正常情况和两种异常情况。不论如何,都会弹出窗口要求管理员填写图书是否损坏,如果填写正常,那么直接审核通过;如果填写损坏,那么罚款5元;如果读者还书时已经超过借书期限,则罚款1元。在测试用例中上述情况都进行了测试。
    综上,读者、管理员的借书、还书综合测试成功,系统功能达到设计目标。
    6.10 读者-图书查询6.10.1 测试说明读者的图书查询与管理员稍有不同,管理员的查询是单条件查询,而为了使读者的使用体验更好,向读者提供了多条件查询。
    6.10.2 测试过程可以根据书名、作者或者出版社进行单项查找,不需要的条件直接不填即可。

    6.11 读者-查看借书记录6.11.1 测试过程如下图所示是该读者的借书记录,最后一列“在借”表示当前正在读者手中的书籍,“借阅失败”可能是因为读者有罚金未交等异常情况引起的,“已还”表示读者已经成功归还书籍。

    6.12 读者-查看基本信息6.12.1 测试过程如下图所示是当前读者的基本信息。

    6.13 读者-续借6.13.1 测试说明一本书籍在借,且为过期时,读者可以选择续借,续借成功后,借阅时间更新为当前时间,借阅期限重新计算。当书籍过期未还时不可续借,不是在借的书籍也不可续借。以下测试将对上述三种情况进行测试。
    6.13.2 测试过程当前读者的借阅记录如下图所示,有两本在借书籍,一本是4月12日借阅的,已经过期,另一本是6月13日借阅的,还未过期。

    选择续借6月13日借阅的书籍,如下图所示,续借成功。

    续借成功后,书籍的借阅时间进行了更新。选择续借4月12日借阅的书籍,系统检测到该书已过期,拒绝了续借。选择一条借阅失败的记录进行续借,系统提示该条信息不可续借。
    7 课程总结主要熟悉了SQL server的使用,学会了新增用户并设置用户权限;掌握了sql查询语句的多种用法以及较为复杂的查询逻辑的实现;掌握了触发器的简单使用;将数据库知识和实际结合,实现了一个功能比较完备的管理系统。
    实验过程中使用了MySQL和SQL server两个数据库,两者各有优劣,基本的操作都已经掌握,在以后的使用了可以灵活选择。只是对于命令行下操作数据库还不够熟悉。
    触发器的实现花费了较多时间,因为触发器的语句写法很灵活,而且Oracle、SQL server等不同数据库的触发器语法还大不相同。在编程的过程中发现,很多能够在高级语言中实现的功能,其实也可以在数据库中用触发器实现,两者对比,选择用触发器实现更好,可以减少编码量。
    在系统生成报表时,是用sql语句对多个表进行连接生成的,而没有使用视图,这方面还有待改进,用视图生成报表更加方便。
    软件功能学习部分的选做题没有完成,有时间还需要实现,加深对数据库的理解和操作的熟练程度。
    4 评论 39 下载 2019-03-14 10:30:10 下载需要15点积分
  • 基于JSP实现的课程资源管理系统网站

    一、系统需求1.1 用户信息管理
    用户:系统管理员、教师、学生
    登录:用户进行账号、密码等信息填写登陆后,教师、学生可以查看账号信息或进行课程、教学资源、作业管理等操作,系统管理员登录后可以行使增删账号的权限
    忘记密码:教师、学生填写学/工号和姓名,重置密码为学/工号后六位,系统管理员只允许后台操作重置密码
    修改密码:填写账号、当前密码、新密码

    1.2 课程管理规定每名教师可以教授多门课程,一门课程可以由多名老师授课,学生可以选修多门课程,每门课程可以被多名学生选择,课程名可以相同,但课程号唯一,对应特定的授课教师。
    1.3 教学资源的管理
    课件管理:教师每门课程只能有一个课件,每个课件可以有多个章节,教师可以上传/下载授课课程对应的课件。学生可以搜索、下载、在线查看其选修课程的课件
    作业管理:每门课程每个课时有相应的作业,教师可以发布作业要求、查看学生作业提交状态、下载学生的作业、对作业进行评分、给出批改意见并做统计分析。学生可以查看课程的作业要求,进行作业的提交,查看作业的批改情况

    1.4 教学信息发布老师可以发布其教授课程的学生成绩,或对学生的成绩进行修改。学生可以查询自己选修课程的成绩,并对教师进行教学评价。
    二、系统架构2.1 构架该系统采用表示层、业务逻辑层、数据访问层三层构架。
    在系统主页面,用户可以通过已有的账号密码进行登录,验证成功则进入个人信息页面;也可以进行忘记密码之后的重置操作,验证成功则完成重置并返回系统主页面再次登录
    在个人信息页面,用户可以修改当前账号密码,验证成功则完成修改则返回系统主页面。在此之外,不同身份的用户可以有不同的操作。

    管理员:查看现有帐号信息,对帐号进行增、删等操作
    教师:查看课程信息,包括预览、下载课件,查看作业情况(提交、批改意见、评分)等;修改课程信息,包括上传、重传课件,下载作业,提交作业批改意见、评分,发布新作业要求,更新系统公告等
    学生:查看课程信息,包括预览、下载课件,查看作业情况(提交、批改意见、评分)等;修改课程信息,包括上传、重传作业等

    2.2 系统流程
    表示层效果采用HTML5、CSS等语言和前端框架jQuery,实现用户交互界面。交互界面包括用户登录界面,个人信息展示页面,课程、课件、作业查看页面等
    业务逻辑层利用Servlet,JSP来处理来自前端的请求,获取数据库数据,并作出相应的处理,将处理数据提交到前端,显示给用户
    数据访问层利用Hibernate架构操作数据库,通过应用程序经过Hiberante持久层来访问数据库。数据访问层的关键是确定表结构和表属性,便于业务逻辑层进行对数据库的查询,良好的数据库结构,对数据操作有很大的用处

    2.3 系统结构
    三、数据库设计与构架3.1 E-R图
    3.2 物理设计admin(管理员账号信息表)



    adm_id
    password




    varchar
    varchar



    teacher(教师账号信息表)



    tea_id
    name
    password




    varchar
    varchar
    varchar



    student(学生信息表)



    stu_id
    name
    password




    varchar
    varchar
    varchar



    course(课程信息表)



    course_no
    title
    credit
    tea_id




    varchar
    varchar
    decimal(3,1)
    varchar



    stu_course(选课信息表)



    course_no
    stu_id
    grade
    tea_evaluation




    varchar
    varchar
    decimal(3,1)
    decimal(3,1)



    courseware(课件信息表)



    course_no
    file_title






    varchar
    varchar



    tea_homework(发布作业情况表)



    course_no
    homework_no




    varchar
    varchar



    stu_homework(提交作业评分表)



    course_no
    homework_no
    stu_id
    status
    grade
    opinion




    varchar
    varchar
    varchar
    bit
    decimal(3,1)
    varchar



    四、模块设计4.1 用户模块
    4.2 教学信息模块
    4.3 作业管理模块
    4.4 课件管理模块
    4 评论 124 下载 2018-11-06 12:56:48 下载需要5点积分
  • 基于JAVA的局域网聊天软件的设计与实现(仿制QQ)

    一、系统分析1.1 问题描述
    客户端

    实现简易版的局域网聊天器实现富文本内容聊天智能聊天机器人群发消息传送文件等功能
    服务器端

    实现群发通知管理聊天线程

    1.2 系统功能分析
    客户端功能

    登陆注册发送表情消息发送文本消息截取图片图片处理震动效果发送文件群发消息设置聊天文本样式
    服务器端

    广播通知

    1.3 开发平台及工具介绍
    Eclipse Mars2
    二、系统设计2.1 系统总体结构设计系统采用自己设计的网络消息传输协议,系统采用CS架构模式实现数据传送。


    2.2 系统各个类及类之间关系设计


    注:

    界面一般是继承了JFrame或JWindowJList、JTable所用的model和渲染器renderer都是自己重写的其余的一些比较琐碎的关系理起来比较复杂程序中的控件大多是自己自定义改写的
    2.3 数据存储的设计(文件等)
    采用键值对的方式存储账号密码
    截图默认保存在ScreenCut/+文件名.jpg
    用到了多种流操作,以及网络传输最关键的套接字操作

    2.4 界面设计
    自定义渲染和数据模型,实现JList、JTable的外交改变
    最长用的是在渲染器中继承JTable实现Renderer接口


    三、系统实现


    四、系统测试模块测试与系统测试:
    4.4 登陆测试
    4.5 注册测试
    4.6 表情测试
    4.7 震动测试震动效果无法截图!
    4.8 截图测试

    4.9 滤镜效果测试


    4.10 设置测试
    4.11 机器人聊天测试

    4.12 文件传输测试



    4.13 服务器管理界面测试

    五、总结通过这次的课程设计,可以说是开阔了自己的眼界,可以总结为以下几个方面:

    对JAVA体系的更深入的了解、对JAVA图像处理初步认识、对JAVA网络通信流的操作、流的套接更进一步深刻了解
    对网络通信的理解,CS、BS架构模式的了解
    对设计模式的初步认识与使用,线程管理这块单例模式的功能
    对JAVA的MVC模式的更深刻了解,层与层的分工明确,效率高,易管理,让人惊叹
    对线程的理解更深刻了,深谙UI主线程与处理耗时操作的子线程的逻辑处理关系
    对网络协议的初步了解,关于协议的定义了解,以及各种传送协议的效率比较有了大体。印象,Socket通信UDP和TCP通信机制初步了解
    对系统的架构设计有了初步认识,缓存机制,分布式系统等,虽然代码中还未实现,程序也并不是面向抽象编程和面向接口编程,代码低耦高聚效果一般,但仍然受益

    知识方面,在课程设计的任务中主要负责jlist jtable覆盖重写、基础类的继承重写、接口实现、界面设计与美化等。玩了半个假期后很多学过的知识都记不清楚了,所以打码的过程中经常翻书,让我又重温了知识;一部分知识书上没有,还需要上网查询或者找同学帮忙解决。有很多瓶颈时候,但坚持过去,看到一起完成的作品会有很大的满足感;其他方面:经过这次课程设计任务,我又一次认识到了团队合作的力量和重要性。一起讨论问题:苦恼过,失落过,兴奋过,到最后的成就感,让我成长,也对自己有了很大的信心。
    在这次课程设计,我们一起讨论要实现这个系统的哪些功能,把各自的想法说出来研究,我们还根据各自所学之长来分配工作,让我意识到在团队合作里每个人都能分享自己的想法、找到自己的位置发挥所长很重要,这样才能让我们更好地完成我们的工作。在完成我们的任务的过程中,我把每个功能逐步实现,比如在实现登录功能的时候,我会先把输入正确的账号和密码登录成功的功能实现,然后再实现判断输入的账号和密码是否一致,若不一致就返回重新输入账号密码这一功能,这让我在发现错误的时候更加容易找出并解决。在此过程虽然遇到许多困难,但是我都会去研究课本和课件里的例题或者上网去看教学视频,一步一步测试,自己实在无法解决了就去找同学帮助。
    经过这次课程设计,我对Java有了更深的了解,但这还远远不够,为了未来的发展,我必须更加努力地去学习更广更深的知识。
    3 评论 52 下载 2018-11-06 09:45:15 下载需要7点积分
  • 基于JSP和SSH框架实现的物流管理系统

    1 任务概述1.1 目标该项目软件的开发是为了提高物流公司的业务效率,降低人力、物理的损耗,使管理和业务操作更方便、科学。
    本软件系统一旦实施应用,公司的各项信息都可以更安全可靠的保存、查看,在业务实施过程中,可以大大的降低出错率,同时节省大量的时间和金钱,为公司赚的更多的利润。
    1.2 用户的特点
    超级管理员:拥有最大权限,可以为系统分配用户的权限,进行各项了解
    员工管理员:由超级管理员分配权限,管理公司的所有员工
    总公司配送点管理员:由超级管理员分配权限,管理公司的所有配送点
    配送点管理员:由超级管理员分配权限,管理配送点的各项事务。 其下由车辆、订单、线路、报表管理员


    1.3 运行环境软件环境




    名称
    版本
    语种




    操作系统
    Windows
    2003



    操作系统的附加功能





    数据库平台
    Oracle
    9.2i



    应用平台
    任意操作系统




    邮件系统
    pop
    3.0



    客户端软件
    IE
    7.0或6.0




    1.4 需求规定本系统是提供物流公司的日常事务管理,主要有管理用户、员工、车辆、线路、配送点、订单、报表等业务。还为客户提供在线查询等功能。
    1.4.1 系统功能层次模块图
    1.4.2.1 员工管理
    功能描述:由总公司统一管理公司员工,主要的功能有增加员工,员工信息修改,员工信息删除,员工信息查询
    增加员工:当公司有新员工入职,则新建员工信息
    员工信息修改:当员工信息变更的时候进行修改,如职位变动,工资变动等
    员工信息删除:当有员工离职的时候,删除该员工信息
    员工信息查询:供员工管理员方便管理员工


    1.4.2.2 用户管理
    功能描述:由超级管理员对用户分配不同的权限,权限包括:配送点管理员,配送点操作员
    分配权限:当新增配送点时为该配送点分配一个配送点管理员,再由该配送点管理员分配配送点操作员权限
    删除用户:当配送点用户发生变更时,根据需要删除对应的用户信息
    查询:由上级管理员查询由他分配的下级管理员的信息


    1.4.2.3 车辆管理功能描述:管理配送点拥有的所有车辆,包括新购车辆登记,车辆调度,车辆的状态记录及查询

    新购车辆登记:登记新购车辆的基本信息
    车辆调度:根据车辆的具体信息(状态,吨位,容积等)进行调度
    车辆的状态:车辆现在处于空闲,途中,维修中
    车辆查询:配送点操作员查看现有车辆的具体信息


    1.4.2.4 配送点管理功能描述:由总公司新增配送点,查看配送点信息,修改配送点信息,删除配送点

    新增配送点:当公司根据业务需求需要扩展配送规模,新开设配送点并添加配送点信息
    查看配送点信息:为了方便公司管理,随时了解配送点具体信息
    修改配送点信息:如配送点信息有变更,则修改配送点信息
    删除配送点:根据公司业务需求删除配送点
    配送价格管理:配送点根据自己的配送范围制定配送价格


    1.4.2.5 线路管理功能描述:由总公司进行线路的添加,删除和查询

    线路添加:在现有的配送点范围内,添加新线路
    线路删除;如配送点有变动,则删除该线路
    线路查询:配送点操作员调度车辆需查询线路,管理员维护线路信息,客户查看线路


    1.7.2.6 订单管理接受订单模块,订单状态修改模块,订单删除模块,生成交接单模块,以及查询订单。

    接受订单:接受用户所填写的订单输入到系统中
    订单状态维护:配送点管理员对所有的订单都应该进行审查和批复。而且应该维护订单的各种状态,包括:接受、在途(在哪个点)、在配送中、客户已收、等待支付等
    订单删除:当订单生成后,根据具体的信息或者特殊的信息,管理员来删除删除订单
    生成交接单:当货物发货时,生成交接单,当货物运送到某个配送点的时候,检查完货物,司机应该与该配送点的管理员来填写交接单,以保证货物能在各个段内安全的配送
    查询订单:订单管理员查询当日订单,当月订单,按订单号查询


    1.4.2.7 客户端
    货物状态查询:根据订单号查询货物状态
    价格查询:根据货物的重量,体积,目的地查询配送价格
    网点查询:查看配送点的配送范围和配送价格等


    2 设计思想2.1 系统构思
    2.2 运用关键技术本系统运用的是SSH所搭建成的框架,并且在局部的地方用到了Ajax技术和DWR框架,并且前台用的是Div+Css技术所搭建成的。
    2.3 数据结构Car表

    Carstate表

    Cartype表

    City表

    Deliveryspot表

    Employee表

    Line表

    Linetaile表

    Order表

    Orderstate表

    Position表

    Power表

    Province表

    Receipt表

    Receiptdetaile表

    Use表

    3 服务器端的安装及运行3.1 程序的运行环境
    要求操作系统为windows 操作系统
    对计算机硬件配置要求较高,至少要1GB内存
    服务器程序为tomcat
    数据库为oracle 9i
    要求安装有JDK 1.5

    3.2 程序的安装
    安装JDK 1.5 并且配置其环境变量
    安装tomcat服务器
    将获取的程序war包放入tomcat安装目录下的webapps文件夹下
    安装oracle服务器,并且将程序的数据库脚本导入
    启动tomcat服务器

    4 功能演示配送点管理

    员工管理


    用户管理

    线路管理


    车辆管理



    报表管理

    订单管理


    交接单管理

    投递单管理
    2 评论 49 下载 2018-11-05 18:37:42 下载需要13点积分
  • 基于QT实现的日历程序

    1 概要1.1 简介本篇设计文档主要讲述了计52班的吴启凌根据小学期第一周李国良老师所教的内容,来实现的程序Calendar的设计思路,架构,以及一些设计细节。
    1.2 实现的功能Calendar实现了日历的基本功能以及一些附加功能,主要有

    正确地按照公历显示日历。
    能够添加、删除、修改事件序列,某个事件在设置时,能够按天,按周,按月重复发生;删除事件时,能删除可重复事件的单个或全部。
    能够设置每一天的颜色。
    能够与本地文件实现拖拽交互。当用户把文件拖到某一天上时,能够保存到Calendar所在的目录下,并在当天格子内显示文件名。双击某一天能够打开一个对话框,其中显示了该天上的所有文件,并且能够拖拽到本地保存。此外,还设计了一个按钮来打开和关闭拖拽交互。
    能够使用配置文件,包括XML和ini文件来保存信息。其中,XML用于保存事件和每天的颜色,ini用于保存语言,是否打开拖拽交互的信息。信息能够通过save按钮保存,也可在关闭程序时自动保存。支持导入,导出XML文件。
    可以对日历进行整体拖拽,并设置了一个按钮来固定、解锁界面,锁定后,日历不再响应鼠标动作,并且能将鼠标事件传递到桌面。
    国际化:支持中文、英文两种模式。

    2 系统架构2.1 文件结构Calendar的代码根据界面分组,文件如下
    Mycalendar构建了日历的样式及其交互模式,Filesdialog和Listwidget用于显示日期所储存的文件,以及提供拖拽功能,Scheduledialog用于新建及编辑事件,Schedule类用于储存事件,Schedulemanager用于管理事件,而Mainwindow则作为各组件沟通的纽带。

    2.2 组件分析Schedule类用于储存事件的描述,开始、结束日期、重复模式等信息。Schedulemanager提供了对Schedule管理的接口,包括添加、编辑、删除事件,获取某天的事件列表或单个事件,以及获取全部事件。

    Scheduledialog用于向用户显示事件的描述、重复模式信息,同时接受用户的编辑。
    Listwidget重写了QListWidget的mousePressEvent事件处理函数,在用户对列表中的文件按下鼠标时,传递文件路径的信息。
    Mycalendar则是工程中较为重要的一个类,重写了父类的dragEnterEvent和dropEvent来处理鼠标拖入事件,并在鼠标拖入文件时,将文件复制到Calendar所在目录下,并显示在日期格子中。重写了paintCell来获取每个日期的外框的位置信息,以此来判断鼠标将文件拖到了哪一天内;以及在日期中显示文件名,设置日期颜色。重写了resizeEvent来重置datepos中储存的矩形信息,以免造成拖拽的误差。

    Mainwindow则是工程中的核心类,用于收集、处理、传递几乎所有的信息。三个public slots用于在三个事件按钮按下时,弹出窗口并收集事件信息;on_calendar_clicked用于在鼠标点击calendar时,在列表框中刷新事件信息,以及在colorbox,即颜色选择框内显示该天的颜色信息;on_actionLock_triggered在lock按钮按下时,固定窗口并设置鼠标穿透;on_checkBox_toggled用于读取是否开启文件拖拽按钮的信息;on_languageBox_currentTextChanged用于设置语言;最后三个槽用于保存配置信息、导入XML、导出XML。

    3 用户界面3.1 主界面界面如下图1所示,左半边区域为日历部分,中间为功能按钮,右边为事件显示区域。此外工具栏中为lock按钮,菜单栏中Calendar可以弹出下拉菜单。
    如图2,3,点击某天后,右侧列表框中会显示当天事件,用户可以点击New按钮来新建事件,或者可以点击列表框中的条目,再点击Edit或Delete按钮来编辑或删除事件,删除时,会出现确认对话框,三个选项分别对应删除单个事件、全部事件、取消删除。
    在color标签下方的下拉框中,可以设置某天的颜色。
    Language下拉框可以设置语言,设置后需要重启才能生效。需要重新设置一下翻译文件加载的路径。
    Enable drag的复选框能够开启、关闭文件拖拽功能。
    按lock按钮能够锁定日历,由于锁定后鼠标穿透,需要用快键键Ctrl + L来解锁。
    在Calendar的下拉菜单栏中,save能够保存设置,import XML能导入事件、日期颜色设置,export XML能够导出事件、日期颜色设置。
    0 评论 3 下载 2019-06-23 18:06:52 下载需要10点积分
  • 基于JAVA和SQL SERVER数据库实现的火车票预售系统

    1 系统设计1.1 设计目的乘坐火车是我们生活中几乎不可缺少的一件事儿,每天都会有各种各样的火车班次发布与被预定。针对这个火车票预售的环节我设计了一个火车票预售系统,为购票用户与卖票管理人员之间搭建平台。让我们的用户能够通过该软件对管理人员发布的航班进行预购与查询。另一方面也可以加强我们的管理人员对班次信息与乘客的管理与查询。
    本系统的根本目的是让管理人员能够发布与查询班次信息、查询乘客信息等;用户可以通过该系统对班次进行预购、自己购票记录的查询等。
    1.2 需求分析1.2.1 信息要求该系统主要记录用户、班次、火车、银行卡之间的关系

    用户分为管理员与购票用户

    售票管理员信息:管理员编号、管理员名字、管理员电话购票用户信息:身份证号、电话号码、银行卡号
    班次信息

    班次号、火车号、出发地点、目的地、出发时间、到达时间
    火车信息

    火车号、火车节数、座位数、各种座位票价、火车车速
    银行卡信息:

    银行卡号、余额、持有人身份证号
    身份证信息

    身份证号、姓名、性别、所有者
    车票信息

    车票号、班次号、座位号、乘客身份证号、车票价钱、车厢数

    1.2.2 处理要求
    能够正确、高效、迅速地完成所有操作
    一个管理员可以管理多个班次、一个用户可以多次订购不同时间段的车票

    1.2.3 安全性与完整性需求
    安全性

    该系统需要用户进行账号的注册与登陆通过对不同的用户种类的检测来给予不同的权限与界面用户登陆自己账号后只能查询自己用户名下身份证的购票信息与个人信息用户不可对班次、火车等信息进行修改售票员能对班次信息进行修改与查询,对于用户信息只能查询不能修改
    完整性

    实体完整性

    手机号、班次号、火车号、银行卡号、身份证号、车票号分别为用户、班次、火车、银行卡、身份证、车票的主码
    参照完整性

    班次号中的火车号为火车表的主码、银行卡号中所有者号码为用户的主码、车票中的火车号与班次号分别为火车表与班次表的主码。以上外码要么为空要么是参照表中已有数据

    用户定义完整性

    性别只能是男女、车票钱不能为空、车速不能为空、班次目的地与出发地不能为空、用户类型只能是 0 与 1:0 表示普通用户、1 表示管理员用户。用户名字不能为空

    1.3 开发和运行环境选择
    开发工具

    前台开发语言为 Java后台数据库为 SQL SERVER 2017
    运行环境

    Java 1.8 版本 Windows2000 以上

    2 数据库设计2.1 数据库概念设计本系统中包括六个实体:身份证实体、银行卡实体、用户实体、车票实体、火车实体、班次实体,根据需求需求分析的结果以上六个实体对应的 ER 属性图如下图所示。

    系统整体 E-R 图

    2.2 数据库逻辑设计根据 E-R 图向关系模型的转换原则,一个实体型转换为一个关系模式,实体的属性就是关系的属性。因此按照图 2.7 中的整体 E-R 图,本数据库系统中应包括六张表:身份证、银卡、用户、车票、火车、和班次。






    3 火车票预售系统详细设计3.1 功能概述售票管理员系统主要包含如下几个功能:

    发布与删除班次及其相关信息
    查看班次详细信息
    通过班次号对班次进行详细查询
    通过身份证号码查询乘车人信息

    用户系统主要包含如下几个功能:

    通过地点、时间查询班次信息
    通过班次号查询班次详细信息
    添加和删除信用卡
    添加、修改和删除乘车人信息
    查询得到班次后可以为乘车人购买车票
    查看自己用户的购票记录

    整体功能描述图如下图所示:

    3.2 火车票预售系统详细设计3.2.1 界面设计3.2.1.1 管理员界面设计在使用管理员账号登录过后,会出现管理员主界面。在界面最上方有初始地点选择和时间选择控件,可以通过时间和地点的详细选择来针对性地发布班次信息,在点击发布后会弹出火车号填写对话框,在此处填写火车号以完成班次发布的目的,如下图在发布下方有一个查看按钮,通过在左边列表中选择想查看的班次再点击该按钮即可查看到详细的班次信息如下图所示。


    3.2.1.2 用户系统界面设计在使用用户权限帐号登录过后,会进入相应的用户界面,用户界面分为四个 fragment,第一个 fragment 通过站点和时间来查询班次列表,在查询到班次后可以通过购买按钮对车票进行购买,购买时需要选择乘车人、勾选座位信息和选择支付的信用卡,如下图所示。


    在第二个 fragment 里用户可以通过班次号来查询班次信息与购票,如下图所示,在点击查询后按钮会自动变成购票,后续购票操作和第一个 fragment 一样。


    在第三个 fragment 里用户可以查询到自己所有的购票记录,可以通过查看详细按钮进行查看,还可以通过退票按钮进行退票操作,如下图所示。


    最后是用户信息界面,用户可以在此处看到自己用户名以及邮箱号,如下图所示。用户可以在此界面增、删、改常用乘车人信息,如下图所示。也可以添加和删除信用卡,如下图所示。




    3.2.2 功能实现整体功能是通过两个 Activity 与四个 Fragment 来实现,具体实现功能顺序为下图所示。本系统大量使用 Dialog 来对详细信息填写进行管理。
    功能实现过程中使用到 UI 的类有 17 个,其中三个抽象父类用于限制所有界面的业务处理与逻辑执行顺序,其余 14 个子类用于详细界面以及功能的实现,整体界面代码框架如下图所示。
    注:Dialog 是在 Fragment 中使用,Fragment 是放置到底层 Activity 使用。

    4 系统测试发布班次示意图

    发布班次示意图

    到数据库查询如下图所示:

    购票操作示意图 1

    购票操作示意图 2

    到数据库查询如下图所示:

    退票操作示意图

    到数据库查询如下图所示:

    5 总结三个星期的时间非常快就过去了,这三个星期不敢说自己有多大的进步,获得了多少知识,但起码是了解了项目开发的部分过程。虽说上过数据库等相关的课程,但是没有亲身经历过相关的设计工作细节。这次课设证实提供了一个很好的机会。通过这次的系统设计,我在很多方面都有所提高。综合运用所学知识的理论知识实际训练从而培养和提高学生独立工作的能力,巩固所学的知识,掌握系统程序的编排和运行,使自己的独立思考能力有了显著提高。
    从各种文档的阅读到开始的需求分析、概念结构设计、逻辑结构设计、物理结构设计。亲身体验了一回系统的设计开发过程。很多东西书上写的很清楚,貌似看着也很简单,思路非常清晰。但真正需要自己想办法去设计一个系统的时候才发现其中的难度。经常做到后面突然就发现自己一开始的设计有问题,然后又回去翻工,在各种反复中不断完善自己的想法。
    我们学习并应用了SQL 语言,对数据库的创建、修改、删除方法有了一定的了解,通过导入表和删除表、更改表学会了对于表的一些操作,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程,为毕业设计打下基础。
    很多事情不是想象中的那么简单的,它涉及到的各种实体、属性、数据流程、数据处理等等。很多时候感觉后面的设计根本无法继续,感觉像是被前面做的各种图限制了。在做关系模型转换的时候碰到有些实体即可以认为是实体又可以作为属性,为了避免冗余,尽量按照属性处理了。
    不管做什么,我们都要相信自己,不能畏惧,不能怕遇到困难,什么都需要去尝试,有些你开始认为很难的事在你尝试之后你可能会发现原来并没有你以前觉得的那样,自己也是可以的。如果没有自信,没有目标,没有信心就不可能把事情做好,当其他人都在迷茫的时候,自己一定要坚信目标。有一个这样的感觉就是课程设计学到的东西比一个学期都多。
    参考文献[1] CSDN 论坛、简书论坛、知乎论坛
    [2] 毕广吉.Java 程序设计实例教程[M]. 北京:冶金工业出版社,2007 年
    [3] 肖成金,吕冬梅。 Java 程序开发数据库与框架应用[J]. 科技展望,2017,05:19.
    [4] 吕锋,梅细燕,周晓东;基于 JDBC 的数据库管理及其应用[J];武汉理工大学学报;2002 年 10 期
    [5] 姚永一,SQL Server 数据库实用教程,北京:电子工业出版社,2010.
    [6] 高云,崔艳春,SQL Server 2008 数据库技术实用教程,北京:清华大学出版社,2011
    [7] 何玉洁,梁琦,数据库原理与应用(第二版),北京:机械工业出版社,2011
    [8] 壮志剑,数据库原理与 SQL Server,北京:高等教育出版社,2008
    [9] 杜丁超.计算机软件 Java 编程特点及其技术分析
    [10] 萧仁惠,陈锦辉. JDBC 数据库程序设计[J].北京:中国铁道出版社,2004
    4 评论 96 下载 2018-11-20 11:12:53 下载需要17点积分
  • 基于html的火柴人羽毛球游戏

    火柴人羽毛球
    一、游戏简介
    火柴人羽毛球灵感来自于flash小游戏
    游戏中,玩家可操作画面中的火柴人来进行羽毛球比赛
    通过键盘上的左右键控制火柴人的左右移动,按上键跳跃,按下键挥拍击球
    当某一方分数达到7分即判定取胜
    玩家可以选择与其他玩家对战、与不同难度AI对战,以及观看AI对战

    二、游戏实现2.1 绘图部分该游戏为实时性游戏,为保证流畅,采用了游戏常用的60fps的帧率。每一帧绘制的内容包括背景图片、当前比分、火柴人以及羽毛球。下面分别介绍绘图部分的各个细节:

    半透明图片常见的GDI库只能绘制BMP图片,其附带的透明选项也只是选取图片左上角像素作为透明颜色,并不能实现真正的半透明绘图,画出的图片常会带有丑陋的白边。为了解决这一问题,我们使用了GDI+库,它支持各种各样的图片格式,当然也就包括含有透明通道的PNG格式。有了GDI+,我们也就实现了更为精美的游戏画面。
    双缓冲绘图绘制出图片并完成一些简单的动画后,我们发现在刷新一帧时,画面会出现闪烁。想到以前使用MFC编程时曾接触过双缓冲绘图方法。画面出现闪烁的原因是绘图时多次把像素转移到屏幕上,而双缓冲可以先在内存中建立起一块画布,等到在内存中全部绘完,再调用BitBlt函数将像素逐个复制到屏幕上。这样便避免了画面的闪烁。
    局部刷新GDI+固然比GDI功能强大,但它绘图效率低是不容忽视的问题。与Direct2D使用显卡绘图不同,GDI+使用的是CPU,再加上我们的游戏需要绘制很多元素,对绘图优化就显得很有必要。我们注意到,切换一帧时,并不是全部元素都需要重新绘制,因此也就可以使用局部刷新技术,只重绘更新了的区域。
    人物动画在FLASH中,开发者可添加一种名为影片剪辑的元素,它可以做与主时间轴异步的动画,影片剪辑可以极大地方便动画的制作。然而,汇编语言并没有强大的动画制作工具,实现精细的动画也就需要很复杂的处理。例如,绘制人物时,手臂挥拍、脚步移动、跳起时阴影保留在地面上,这些是各自独立的。我们将小人的图像拆解开来,分别画四个部分,这就实现了游戏中小人复杂的运动。



    图片旋转游戏中的羽毛球并不是圆球,因此也就涉及到了旋转。我们并没有简单地制作许多张不同角度的羽毛球素材,而是只用了一张图片。使用GDI+中的函数GdipImagePointsI,可以以图片左上、右上、左下三点为基准,规定三个新的基准点,对原有矩形做线性变换,以此来完成图像的旋转。
    2.2 逻辑部分
    运动模型现实中,羽毛球由于受到的空气阻力较大,其的运动轨迹不同于其他球类,不呈现抛物线。我们在游戏中为了还原真实性,使用了如下运动方程:
    \\[\vec a=\vec g-\gamma\cdot \vec v=\frac{{\rm d}\vec v}{{\rm d}t}\\]式子中,\(\gamma\)为空气的粘滞系数。
    碰撞判定羽毛球涉及的碰撞判定有很多:球网、地面、墙壁(球可以反弹回来!)都具有碰撞判定。在游戏中,球的运动是离散、不连续的,因此在每一帧计算时,球的判定点很难恰好处于墙壁等障碍物的平面上。对于球撞击障碍物反弹的动作,我们的处理方法是:

    使球的坐标做关于平面的对称变换
    使球垂直于平面方向的速度分量反向
    不同平面有不同的弹力系数,对应于不同的反弹速度

    有了这样的处理,球的运动才会精确反弹。
    击球判定击球是游戏中角色最主要的动作。游戏中击球的判定也很独特:人的可击球区域是球拍面挥动起来可达到的扇形圆环区域,羽毛球飞出的角度与速度是在击球瞬间由人与球的相对位置决定的。此外,根据球的高度不同,角色也可以自动判断应该从上方还是从下方击球。
    AIAI的设计可以说是本游戏的一个亮点。游戏中,分别有两个函数leftAIconsider与rightAIconsider,这些函数会根据包括羽毛球位置在内的游戏状态信息,指挥小人的行为(移动、跳跃、击球)。游戏内置了两个不同难度的AI,玩家亦可自行修改AI决策函数,利用AI-AI对战模式与内置的AI进行PK。

    三、其他亮点
    实现了背景音乐播放,并且为击球动作添加了音效
    可以屏蔽中文输入法,避免点击字母时跳出输入法
    创建窗口时,获取到屏幕分辨率,使窗口处于屏幕正中央
    0 评论 7 下载 2019-06-22 22:15:12
  • 基于C#和MySQL实现的房屋租赁管理系统

    第一章 引言随着房价的不断升高,人们对房屋的需求越来越难以满足,对于一些在外地工作的人来说租房子成为了一种常态,因此出现了越来越多的房屋中介,而对于房屋中介而言,管理日益增加租户的信息和房产的信息成了一个至关重要的问题。与此同时,环保也是大家关注的焦点。因此,开发一款能够实现无纸化的管理系统来管理房屋和租户的信息就显得十分必要。
    房屋租赁管理系统的任务目标:简化房屋信息及租客信息的管理步骤,可以方便快捷地查询所需要的信息,系统自动进行水电等费用的计算。在系统启动时有对用户身份的检查,以保证信息的安全性。
    房屋租赁管理系统的开发及运行环境:

    Windows7 64位
    Microsoft Visual Studio 2010
    Mysql 5
    Windows .NET4.0及以上

    第二章 系统分析与设计2.1 需求分析通过对任务的分析,可以发现运行的系统要能实现以下的功能:

    登录管理:实现以正确的员工号、密码和登录人员身份才能登陆系统的功能,正确登录之后才能进行之后的管理
    房屋信息管理:包括添加新的房屋信息、修改房屋信息、查询房屋信息、删除房屋信息
    用户信息管理:包括添加新的用户信息、修改用户信息、查询用户信息、删除用户信息
    租赁信息管理:包括查询某个房屋的租赁状况、添加租赁关系、删除租赁关系
    水电费用管理:包括水电费用的查询、添加、修改、删除
    财务收支记录:添加公司的财务记录(不允许修改和删除)
    收费项目设置:设置水费、电费、物业费、宽带费单价及财务余额
    管理员信息维护/密码修改:若登陆用户为超级管理员(admin),则可以管理其他员工的信息,否则就只有修改自己密码的权限

    数据流图如下:

    2.2 数据库概念结构设计E-R图

    2.3 数据库逻辑结构设计关系模式(加粗的为主键,所有表中数据均为varchar类型):

    管理员(用户名、密码)
    房屋信息(房屋编号、所属区域、房屋名称、房屋类型、房屋面积、装修情况、房屋设施、房屋用途、月租价格、房间状态、备注说明)
    用户信息(身份证号、用户姓名、性别、电话)
    租赁信息(房屋编号、租户身份证号、租赁开始时间、租赁月数 、月租金)
    水电费信息(受理单号、房屋编号、上次电表数、本次电表数、上次水表数、本次水表数、收费金额)
    财务收支报(编号、类型、金额、日期)
    杂项设置(编号、水费单价、电费单价、宽带费单价、物业费单价、财务余额)

    管理员表(manageruser)



    列名
    含义
    数据类型
    约束




    user
    管理员用户名
    varchar(20)
    主键


    password
    密码
    varchar(20)
    不为空



    房屋信息表(roominf)



    列名
    含义
    数据类型
    约束




    num
    房屋编号
    varchar(10)
    主键


    weizhi
    房屋位置
    varchar(30)
    不为空


    mingzi
    房屋名称
    varchar(20)
    不为空


    zhonglei
    房屋类型
    varchar(10)
    不为空


    mianji
    房屋面积
    varchar(11)
    不为空


    zhuangxiu
    装修状况
    varchar(4)
    不为空


    sheshi
    屋内设施
    varchar(20)
    不为空


    yongtu
    房屋用途
    varchar(4)
    不为空


    jiage
    房屋价格
    varchar(11)
    不为空


    zhuangtai
    房屋状态
    varchar(4)
    不为空


    beizhu
    备注信息
    varchar(40)
    不为空



    用户信息表(userinf)



    列名
    含义
    数据类型
    约束




    sfzid
    身份证号
    varchar(18)
    主键


    username
    姓名
    varchar(10)
    不为空


    xingbie
    性别
    varchar(2)
    不为空


    dianhua
    电话
    varchar(14)
    不为空



    房屋租赁表(roomrent)



    列名
    含义
    数据类型
    约束




    roomnum
    房屋编号
    varchar(10)
    主键


    sfznum
    身份证号
    varchar(18)
    主键


    starttime
    开始租住时间
    varchar(12)
    不为空


    monthnum
    租住月份数
    varchar(4)
    不为空


    monthlyrent
    月租金
    varchar(20)
    不为空



    水电费表(billsinf)



    列名
    含义
    数据类型
    约束




    danhao
    受理单号
    varchar(15)
    主键


    roomnum
    房屋编号
    varchar(10)
    不为空


    predianbiao
    上次电表数
    varchar(15)
    不为空


    dianbiao
    本次电表数
    varchar(15)
    不为空


    preshuibiao
    上次水表数
    varchar(15)
    不为空


    shuibiao
    本次水表数
    varchar(15)
    不为空


    jine
    金额
    varchar(20)
    不为空



    财务报表(caiwu)



    列名
    含义
    数据类型
    约束




    bianhao
    编号
    varchar(20)
    主键


    leixing
    类型
    varchar(2)
    不为空


    jine
    金额
    varchar(15)
    不为空


    date
    日期
    varchar(12)
    不为空



    杂项设置表(othersetting)



    列名
    含义
    数据类型
    约束




    bianhao
    编号
    varchar(10)
    主键


    shuiprice
    水价
    varchar(10)
    不为空


    dianprice
    电价
    varchar(10)
    不为空


    wangprice
    网费
    varchar(10)
    不为空


    wuyeprice
    物业费
    varchar(10)
    不为空


    yue
    余额
    varchar(10)
    不为空



    2.4 数据库创建在实验室实验室使用的是phpadmin建立的数据库roomrentsystem,本机上没有,用Navicat演示、下图为创建表的界面:

    下图为创建外码的界面:

    若使用SQL命令建表则如下:
    水电费表:
    CREATE TABLE IF NOT EXISTS `billsinf` ( `danhao` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `roomnum` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `predianbiao` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `dianbiao` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `preshuibiao` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `shuibiao` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `jine` varchar(20) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`danhao`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    财务表
    CREATE TABLE IF NOT EXISTS `caiwu` ( `bianhao` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `leixing` varchar(2) COLLATE utf8_unicode_ci NOT NULL, `jine` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `date` varchar(12) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`bianhao`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    管理员信息表
    CREATE TABLE IF NOT EXISTS `manageruser` ( `user` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`user`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    杂项设置表
    CREATE TABLE IF NOT EXISTS `othersetting` ( `bianhao` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `shuiprice` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `dianprice` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `wangprice` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `wuyeprice` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `yue` varchar(10) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`bianhao`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    房屋信息表
    CREATE TABLE IF NOT EXISTS `roominf` ( `num` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `weizhi` varchar(30) COLLATE utf8_unicode_ci NOT NULL, `mingzi` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `zhonglei` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `mianji` varchar(11) COLLATE utf8_unicode_ci NOT NULL, `zhuangxiu` varchar(4) COLLATE utf8_unicode_ci NOT NULL, `sheshi` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `yongtu` varchar(4) COLLATE utf8_unicode_ci NOT NULL, `jiage` varchar(11) COLLATE utf8_unicode_ci NOT NULL, `zhuangtai` varchar(4) COLLATE utf8_unicode_ci NOT NULL, `beizhu` varchar(40) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`num`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    租赁表
    CREATE TABLE IF NOT EXISTS `roomrent` ( `roomnum` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `sfznum` varchar(18) COLLATE utf8_unicode_ci NOT NULL, `starttime` varchar(12) COLLATE utf8_unicode_ci NOT NULL, `monthnum` varchar(4) COLLATE utf8_unicode_ci NOT NULL, `monthlyrent` varchar(20) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`roomnum`,`sfznum`), KEY `userinfyueshu` (`sfznum`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    用户信息表
    CREATE TABLE IF NOT EXISTS `userinf` ( `sfzid` varchar(18) COLLATE utf8_unicode_ci NOT NULL, `username` varchar(10) COLLATE utf8_unicode_ci NOT NULL, `xingbie` varchar(2) COLLATE utf8_unicode_ci NOT NULL, `dianhua` varchar(14) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`sfzid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    约束关系
    ALTER TABLE `roomrent` ADD CONSTRAINT `roominfyueshu` FOREIGN KEY (`roomnum`) REFERENCES `roominf` (`num`) ON DELETE CASCADE ON UPDATE CASCADE, ADD CONSTRAINT `userinfyueshu` FOREIGN KEY (`sfznum`) REFERENCES `userinf` (`sfzid`) ON DELETE CASCADE ON UPDATE CASCADE;
    第三章 系统开发及实现开发本系统采用C#语言+Mysql数据库,数据显示使用了DataGridView控件。
    3.1 登陆模块界面设计如下:

    登陆模块为Login.cs:当用户点击登陆按钮时用用户名和密码向数据库中的manageruser表提交查询,若校验通过则将用户名作为初始化参数传递到MainForm.cs、否则提示用户不存在或密码错误。
    主要代码:
    sqltext1 = "select password from manageruser where user='" + username + "'";ds = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sqltext1, null);MainForm mainform = new MainForm(username);
    主界面代码:
    // 在窗口初始化时通过函数重载,获得当前登陆的用户的用户名public MainForm(){ usernamestr = "admin"; InitializeComponent();}public MainForm(string user){ usernamestr = user; InitializeComponent();}
    根据登陆的用户不同,顶部工具菜单第二项可能为管理员信息维护、修改密码,登陆用户若为admin则为管理员信息维护,否则为修改密码。
    窗口的主体部分用SplitContainer空间分割为两部分,左侧为功能列表、右侧为具体的操作窗口。当点击功能能列表中的不同按钮时、右侧操作窗口内容随之改变。
    关键代码(切换右侧操作窗口):
    splitContainer1.Panel2.Controls.Clear();Rentinf rentinf = new Rentinf();rentinf.TopLevel = false;rentinf.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;rentinf.WindowState = FormWindowState.Normal;rentinf.Dock = DockStyle.Fill;rentinf.KeyPreview = true;rentinf.Parent = splitContainer1.Panel2;rentinf.Show();
    3.2房屋信息管理模块界面设计如下:


    可以按照房屋编号、房屋名称、房屋区域、房屋状态进行查询。
    查询关键代码:
    sqltext1 = "select * from roominf where " + chaxunfangshi + " like '%" + textBox1.Text + "%'";roomdataGridView.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sqltext1, null).Tables[0].DefaultView;
    添加关键代码:
    sqltext="insert into roominf(num, weizhi, mingzi, zhonglei, mianji, zhuangxiu, sheshi, yongtu, jiage, zhuangtai, beizhu)values('" + num + "','" + weizhi + "','" + mingzi + "','" + leixing + "','" + mianji + "','" + zhuangxiu + "','" + sheshi + "','" + yongtu + "','" + jiage + "','" + zhuangtai + "','" + beizhu + "')";MySqlHelper.ExecuteNonQuery(MySqlHelper.Conn,CommandType.Text,sqltext, null);roomdataGridView.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text,"select * from roominf ", null).Tables[0].DefaultView;
    修改代码:
    sqltext = "update roominf set weizhi='" + weizhi + "',mingzi='" + mingzi + "',zhonglei='" + leixing + "',mianji='" + mianji + "',zhuangxiu='" + zhuangxiu + "',sheshi='" + sheshi + "',yongtu='" + yongtu + "',jiage='" + jiage + "',zhuangtai='" + zhuangtai + "',beizhu='" + beizhu + "' where num='" + num + "'";MySqlHelper.ExecuteNonQuery(MySqlHelper.Conn, CommandType.Text, sqltext, null);roomdataGridView.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, "select * from roominf ", null).Tables[0].DefaultView;
    删除关键代码:
    sqltext = "delete from roominf where num='" + num + "'"; MySqlHelper.ExecuteNonQuery(MySqlHelper.Conn,CommandType.Text, sqltext, null);roomdataGridView.DataSource=MySqlHelper.GetDataSet(MySqlHelper.Conn,CommandType.Text, "select * from roominf ", null).Tables[0].DefaultView;
    3.3 用户信息管理模块可以按照身份证号、姓名、电话查询相应的用户信息。
    添加、修改、删除操作与房屋信息管理类似。在代码中设置了身份证号和电话号码,必须为数字的函数进行处理。


    3.4 租赁信息管理模块用于查询、记录房屋租赁信息。期中由于数据房屋编号和身份证号是外键,分别参照房屋信息表和用户信息表,所以房屋信息和身份证号使用了comobox控件来完成选择,不允许手工输入。

    3.5 水电费用管理模块用于记录出租的房屋的水电费用信息。由电表数据来计算应缴费的金额,并存入数据库。添加、修改、删除操作与房屋信息管理类似。

    3.6 财务收支模块本模块用于记录公司的收支状况,为防止篡改,不允许进行修改和删除。

    3.7 其他Admin用户登陆后工具菜单中显示相应的菜单可以进入,用于进行系统管理员信息的修改和删除、若非admin管理员登陆,则不显示该菜单,只显示修改密码的菜单。
    其他设置模块用于设置水费电费等设置。仅与费用计算有关。


    第四章 总结学习中,只学习了一些基本的SQL语句特点及操作方法,但这次课程设计是要求作出一个独立的系统,不仅要用到SQL知识,还有用到其他的软件,这些软件大部分对我来说都是陌生的,这让我在设计的过程中遇到了很大的困难,课设后我稍加总结,我在课程设计中遇到了以下方面的问题:

    本次课设我采用了Mysql 作为建立数据库的工具,C#作为开发界面的工具。Mysql对我来说都是不熟悉的,在这里我遇到了第一个难题,如何在C#中使用Mysql数据库,一度设计进度为零,但后来经过在网上查阅资料和自己摸索,慢慢的我能作出一些界面了。这一个麻烦算是解决了。
    在做好界面之后,又遇到了另一个问题,不知道怎么把设计好的界面和SQL建立的数据库连接在一起,如果不能连接在一起的话,那这次课设将是不成功的,后经去图书馆查阅资料,上网搜索资料,和同学讨论,在了解到想要把C#做的界面的Mysql建立的数据库连接在一起必须要用到数据库操作类,在从网上找到相应的操作类后,既能连接到数据库了,能够实现一些基本的功能。
    数据库中数据的显示也是困扰了我很久的问题,经过网络查询最终我选择DataGridView来显示数据。

    第五章 心得体会这次课程设计对我的意义很大。不仅巩固了就知识,还学会了新知识。更是激起了我对数据库的兴趣。
    设计时,遇到了很多在书本中和课堂上没有机会遇到的问题,在课堂上只能学习到数据库中有一些最为基本的知识,但在课程设计中这些基本知识只是一个基础。这体现在课程设计中的是我花费近一半的时间去学习怎么把C#和Mysql数据库连接在一起,怎么能实现一个界面到另一个界面的跳转,怎么通过直观上界面的操作改变个显示数据库中的信息。这个过程是很痛苦的,一方面是对设计出一个系统的兴趣驱使我不断的去学习新知识和改正错误;另一方面是对设计出一个系统没有任何经验,甚至在设计过程中没有人可以指导你或是和你有一起讨论,一度都想过随便弄一个现有的程序修改一下交差。但是看到运用所学知识做出的成果时,还是选择继续做下去,哪怕不能实现太多的更能,但最起码要凭借自己去做出一个系统。
    在课设中遇到了诸多苦难和千奇百怪的错误,一度灰心过。但当改正错误时,不由兴起一股成就感,这些改正后的错误一直激励我坚持到最后,从这次的课程设计中我巩固了以前所学,新学习到了C#知识,遇到了很多错误,但是最终也完成了一个系统,这次课程设计对我来说是使我受益匪浅!
    附录(部分源代码)判断textbox中获取的string是否为数字的函数:
    using System.Text.RegularExpressions;public bool IsNum(String strNumber) { Regex objNotNumberPattern = new Regex("[^0-9.-]"); Regex objTwoDotPattern = new Regex("[0-9]*[.][0-9]*[.][0-9]*"); Regex objTwoMinusPattern = new Regex("[0-9]*[-][0-9]*[-][0-9]*"); String strValidRealPattern = "^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$"; String strValidIntegerPattern = "^([-]|[0-9])[0-9]*$"; Regex objNumberPattern = new Regex("(" + strValidRealPattern + ")|(" + strValidIntegerPattern + ")"); return !objNotNumberPattern.IsMatch(strNumber) && !objTwoDotPattern.IsMatch(strNumber) && !objTwoMinusPattern.IsMatch(strNumber) && objNumberPattern.IsMatch(strNumber); }
    数据库操作类MySqlHelper.cs:关键代码
    public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){ MySqlCommand cmd = new MySqlCommand(); using (MySqlConnection conn = new MySqlConnection(connectionString)) { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; }}public static DataSet GetDataSet(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){ //创建一个MySqlCommand对象 MySqlCommand cmd = new MySqlCommand(); //创建一个MySqlConnection对象 MySqlConnection conn = new MySqlConnection(connectionString); //在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在 try { //调用 PrepareCommand 方法,对 MySqlCommand 对象设置参数 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); //调用 MySqlCommand 的 ExecuteReader 方法 MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter.SelectCommand = cmd; DataSet ds = new DataSet(); adapter.Fill(ds); //清除参数 cmd.Parameters.Clear(); conn.Close(); return ds; } catch (Exception e) { throw e; }}
    参考文献[1] 萨师煊著系统概论(第四版), 2006: P91-P117
    [2] 马俊等著C#程序设计及应用教程(第二版), 2009:P220-P230
    [3] 历小军等著软件开发过程及规范, 2013:P178-P180
    [4] 王华杰, 黄山, 著《精通C#数据库编程》 科学出版社
    [5] 周峰, 李德路, 王征 著《Visual C#.NET 20. 中文版基础与实践教程》电子工业出版社
    [6] 康莉 著《新手学Visual C# 2008 程序设计》电子工业出版社
    2 评论 80 下载 2018-11-05 22:29:54 下载需要5点积分
  • 基于Java的学生注册管理系统

    摘 要随着学校的规模不断扩大,学生数量急剧增加,有关学生的各种信息量也成倍增长。面对庞大的信息量需要有学生管理系统来提高学生管理工作的效率。通过这样的系统可以做到信息的规范管理、科学统计和快速查询、修改、增加、删除等,从而减少管理方面的工作量。目前社会上信息管理系统发展飞快,各个企业事业单位都引入了信息管理软件来管理自己日益增长的各种信息,学生管理系统也是有了很大的发展,商业化的学生信息管理软件也不少。
    该报告中的程序是简单的学生管理系统,该系统完全独立开发,力求使系统功能简洁明了,但功能齐全且易于操作。使用Java程序编写,能够进行学生信息的录入、修改、查看、删除等操作。
    关键字:信息,管理系统
    1 绪 论一直以来学生的成续管理是学校工作中的一项重要内容,我国的大中专院校的学生成绩管理水平普遍不高。随着办学规模的护大和招生人数的增加,建立一个成绩维护系统是非常必要的。普通的成绩管理已不能适应时代的发展,因为它浪费了许多的人力和物力。在当今信息时代这种传统的管理方法必然被以计算机为基础的信息管理系统所代替。为了提高成绩管理的效率,我选择了学生成绩管理系统作为毕业设计的课题本系统在大多数成绩管理系统的基础上,主要增加了教师对成绩的操作,教师改完试卷后不用在往学院的教务处办公室报送成绩,可以直接的把成绩上传到网络上,学生也可以方便快速的查询到自己的成绩,考试后教务管理人员也不必总呆在学院的办公室,他们都不受时间,位置,空间的限制,只要有上网的条件,在家里就可以完成有关成绩的录入,更新,管理,查询和删除。本系统将会改变以前靠手工管理学生成绩的状况,提高工作效率。希望能为老师和学校的工作带来便利。
    建立学生成绩管理系统,采用计算机对学生成绩进行管理,进一步提高办学效益和现代化水平。帮助广大教师提高工作效率,实现学生成绩维护工作流程的系统化、规范化和自动化。为了使系统在学院的管理中发挥更大的作用,实现工作过程的计算机化,提高工作效率和工作质量,现提出如下的系统开发目标:

    系统应具有实用性、可靠性和适用性,同时注意到先进性
    对各个数据库进行动态管理,防止混乱
    不同用户有不同的查询和修改权限,防止非法查询非法修改
    能够对查询结果进行分类汇总,实现报表打印和下载
    方便用户的操作,尽量减少用户的操作

    随着高校办学规模的扩大和招生人数的增加,学生成绩管理维护是学校管理中异常重要的一个环节,作为学校,除了育人,就是育知,学生成绩管理的计算机化是整个学校教务管理中的重要一部分,介于它的重要性,学生成绩管興系統的开发与应用就逐渐提入议程并占着越来越重要的份量。运用学生成绩管理维护系统可以减轻学院教学人员的工作量,缩小开支,提高工作效率与准确率,能够节省时间,学生也能够尽快的知道自己的考试成绩,投入新的课程的学习或复习这次没有考过的课程。而学生成绩管理系统的应用也为今天的民办教育在未来市场的竞争力有所提高。在现代高科技的飞跃发展,人们工作习惯的改变,特别是电脑的大量普及,人们生活节奏越来越快,怎样提高工作效率是人们首先考虑的问题。学生成绩管理是一个非常繁琐与复杂的一项工作,一个原因就是工作量大,不好管。对于一个学校而言,管理好学生的成绩,是非常重要的。因此开发出一套学生成绩管理系统是非常必要的。
    2 系统需求分析与设计2.1 系统需求分析利用计算机进行学生信息管理,不仅能够保证准确、无误、快速输出,而且还可以利用计算机对有关信息进行査询,检索迅速、查找方便、可靠性高、存储量大、保密性好。要科学地实现信息化管理,开发一个适合学校的,能够进行信息存储、查询、修改等功能的信息管理系统是十分重妻的。我这次的课题就是设与实现一个学生信息管理系统。
    1.2 系统设计以下是学生信息管理系统功能模块关系图,主要包含、添加、修改、删除、学生信息等功能。

    3 数据库设计3.1 数据库需求分析java数据库课程设计之学生信息管理系统,利用java数据库的实现对学生信息的管理,包括学生,老师,班级,课程,课程成绩,考试类别的操作。
    3.2 数据库表设计以下为本系统中所有表的简单介绍:
    管理员基本信息表包含管理员编号、管理员姓名、管理员密码,设计时注意sid设为主键,如表所示:



    字段名称
    数据类型
    长度
    逻辑关系




    sid
    int
    11
    主键


    username
    varchar
    255



    password
    varchar
    255



    学生表包含的信息是学生编号、学生姓名、学生性别、学生年龄、家庭住址、联系电话等信息,设计时注意ID字段设为主键,如表所示:



    字段名称
    数据类型
    长度
    逻辑关系




    sid
    int
    11
    主键


    sno
    varchar
    255



    sname
    varchar
    255



    password
    varchar
    255



    sgender
    inr
    11



    class-id
    inr
    11
    外键


    age
    inr
    11



    address
    varchar
    255



    mobile
    varchar
    255



    班级表包含的信息是班级编号、班级名,设计时注意ID字段设为主键,设为Int类型,如表所示:



    字段名称
    数据类型
    长度
    逻辑关系




    cid
    int
    11
    主键


    cname
    varchar
    255



    课程表包含的信息是课程编号、课程名、学时、学分,设计时注意ID字段设为主键,设为Int类型,如表所示:



    字段名称
    数据类型
    长度
    逻辑关系




    cid
    int
    11
    主键


    cname
    varchar
    255



    cperiod- expriment
    int
    255



    credit
    int
    255



    ctype
    varchar
    255



    学生课程表包含的信息是学生编号、课程编号,如表所示:



    字段名称
    数据类型
    长度
    逻辑关系




    id
    int
    11
    主键


    sid
    int
    11
    外键


    cid
    int
    11
    外键



    分数表包含的信息是学生ID、课程ID,其中sid为主键,设为int型,如图所示:



    字段名称
    数据类型
    长度
    逻辑关系




    sid
    int
    11
    主键


    student-id
    int
    11
    外键


    course-id
    int
    11
    外键


    grade
    int
    11



    4 系统实现4.1 管理员管理员登录页面

    管理员查看成绩

    管理员添加新班级

    管理员添加新成绩

    管理员添加新课程

    管理员添加新学生

    4.2 普通用户普通用户登录

    普通用户的成绩

    普通用户的个人资料

    普通用户的课程

    5 系统测试


    测试用例名
    测试步骤
    预期结果
    实测结果




    “DBConnection连接” 测试
    实例化DBConnection对象,调用Connect()方法
    控制台没有打印异常
    与预期结果相符


    “DBConnection关闭连接” 测试
    实例化DBConnection对象,调用close()方法
    程序执行过程中没有任何异常,程序正常退出
    与预期结果相符


    “DBConnection查询” 测试
    实例化DBConnection对象,调用Connect()方法,调用getQuery(String sql)方法传入sql语句,调用close()方法
    返回查询结果
    与预期结果相符


    “DBConnection批量查询” 测试
    实例化DBConnection对象,调用Connect()方法,调用getQueryMany(String sql1, String sql2) 方法传入两条sql语句,调用close()方法
    返回查询结果
    与预期结果相符


    “DBConnection插入删除更新” 测试
    实例化”DBConnection对象,调用Connect()方法,调用update(String sql)方法传入sql语句,调用close()方法
    返回查询修改结果数量
    与预期结果相符


    “DBHelper查看学生列表” 测试
    调用getStudentList()方法
    返回学生列表
    与预期结果相符


    “DBHelper登录” 测试
    调用stuLogin(String username, String pwd)方法,传入用户名和密码
    返回非-1
    与预期结果相符


    “DBHelper超级用户登录” 测试
    调用superUserLogin(String username, String pwd)方法,传入超级管理员用户名和密码
    返回非-1
    与预期结果相符


    “DBHelper添加学生信息” 测试
    调用addStuProfile()方法,传入学生信息
    返回true
    与预期结果相符


    “DBHelper通过主键查看学生成绩” 测试
    调用selectStuScoreBySID(int sid) 方法
    返回学生成绩
    与预期结果相符


    “DBHelper添加学生成绩” 测试
    调用addScoreProfile(int stuID, int courseID, int grade)方法
    返回true
    与预期结果相符


    “DBHelper查看科目成绩” 测试
    调用selectStuScoreByCID(int courseID)方法
    返回科目成绩
    与预期结果相符


    “DBHelper查看学生某一科目成绩” 测试
    调用selectStuScorebySIDandCID(int sid, int cid)方法
    返回科目成绩
    与预期结果相符


    “DBHelper修改学生密码” 测试
    调用updateStuPWD(String newPWD, int id)方法
    返回true
    与预期结果相符


    “DBHelper查看学生基本信息” 测试
    调用selectStuProfile(int id)方法
    返回学生信息
    与预期结果相符


    “DBHelper查看管理员信息” 测试
    调用selectSuperuserProfile(int id)方法
    返回管理员信息
    与预期结果相符


    “DBHelper通过学生主键查看学生选课” 测试
    调用selectCourseList(int studentID)方法
    返回学生选课
    与预期结果相符


    “DBHelper修改学生班级” 测试
    调用updateStuClassBySID(int studentID, int newClassID)方法
    返回true
    与预期结果相符


    “DBHelper修改学生信息” 测试
    调用updateStuProfile()方法
    返回true
    与预期结果相符


    “DBHelper通过课程主键查询成绩排名” 测试
    调用getScoreRankingByCID(int courseID)方法
    返回成绩排名
    与预期结果相符


    “DBHelper查看课程列表” 测试
    调用getCourseList()方法
    返回课程列表
    与预期结果相符


    “DBHelper通过课程名称查询课程” 测试
    调用selectCourseByCName()方法
    返回查看课程
    与预期结果相符


    “DBHelper添加课程” 测试
    调用addCourse()方法
    返回true
    与预期结果相符


    “DBHelper通过课程主键修改课程信息” 测试
    调用updateCourseInfo()方法
    返回true
    与预期结果相符


    “DBHelper查看班级列表” 测试
    调用selectClassList()方法
    返回班级列表
    与预期结果相符


    “DBHelper添加班级” 测试
    调用addClass(String newClassName)方法
    返回true
    与预期结果相符


    “DBHelper修改班级名称” 测试
    调用renameClassByCID(int classID, String newClassName)方法
    返回true
    与预期结果相符



    结 论充实的Java课程设计结束了,从刚开始的不只如何下手到最后看到自己的程序按自己的想法运行,心里时不时的有一种喜悦。通过这两周的实验,我认识到书上和老师教的内容是有限的,要想掌握更多的知识我们必须多动脑,多思考,不断地靠自己去学习,同时我们还应向他人请教,从而了解更多自己不知道的知识。
    通过这两周的编程我发现了自己的一些不足,在编写时经常犯一些低级错误,由于我们的马虎而浪费了不少时间。这些不足既然被发现就得在以后的做事中注意,争取改掉。
    在这期间,经过努力我们掌握了一些基本的面向对象语言进行程序设计的技巧,更深的理解和运用结构化程序设计的思想和方法,掌握开发一个小型实用系统的基本方法,同时学会了一些调试一个较长程序的基本方法,提高了书写程序设计开发文档的能力(书写课程设计报告)。
    2 评论 20 下载 2019-03-03 21:57:25 下载需要14点积分
  • 基于汇编语言的电话本程序设计

    一、软件背景介绍1.1背景知识电话本的历史背景是基于手机的发展上的。1973年4月的一天,一名男子站在纽约街头,掏出一个约有两块砖头大的无线电话,并打了一通,引得过路人纷纷驻足侧目。这个人就是手机的发明者马丁·库帕。当时,库帕是美国著名的摩托罗拉公司的工程技术人员。
    这是世界上第一通移动电话是打给他在贝尔实验室工作的一位对手,对方当时也在研制移动电话,但尚未成功。库帕后来回忆道:“我打电话给他说:‘乔,我现在正在用一部便携式蜂窝电话跟你通话。’我听到听筒那头的‘咬牙切齿’——虽然他已经保持了相当的礼貌。”到今年4月,手机已经诞生整整46周年了。这个当年科技人员之间的竞争产物现在已经遍地开花,给我们的现代生活带来了极大的便利。
    手机给我们带来的作用(为什么现在人人离不开手机):

    不用远行,可以及时问候对方
    危难之时显身手,堪称贴身保镖
    在生命的最后时刻,实现表达情感的愿望
    可以用来缓解冲突和矛盾
    拉近家庭成员距离,他们时刻都在自己身边
    探视上司位置,可以随时表达自己的意向
    能委婉地拒绝他人,不失友情和面子
    向自己所爱的人表达思想,言语和文字尽在其中
    看天气识云,规范自己的行踪
    现场取证资料,成为日后不可缺少的用途

    随着电子产品快速发展,在手机用户大量激增的今天,人们需要记录管理的电话号码也越来越多,面对如此压力,简单的电话本将很艰难在满足人们的需求,拥有一个良好的电话簿管理系统则是必须的。
    1.2 基本功能本款软件包含了一半电话簿的基本功能,即添加、删除、插入、查找用户等,同时还扩大了电话簿容量以及生存范围,即在内存允许的情况下添加用户数量不做限制,且可在多系统下运行。

    1.3 运行截图

    二、核心算法思想2.1 整体算法思想概括程序运行开始时,界面首先有一个显示日期与时间的小画面,并有一行“欢迎进入电话本”的字幕。这一界面是在程序末尾添加了一个提取系统时间和日期的子程序,在前端声明定义此时的时间和日期,能够让人在运行最初有一种耳目一新的好感。
    随后,便会自动跳转到主界面,也就是电话本管理界面。主界面通过程序的运行分为了三个小的版块。最上面是一个小版块是标题电话本系统,给予一定的提示作用。中间的小版块,分别为姓名与编号。最下面的一个大版块,用来记录并保存所存储进入电话本系统的信息,并与第二版块的姓名和编号相对应。通过提示存入功能并将输入的姓名和编号信息记录,能够在电话本管理系统中保存并展示出来。
    主界面中用菜单栏来显示存储信息的新建,编辑,删除,帮助,关于和退出六大功能,并分别以编号1到6的数字来加以区分和声明。在主程序中,同样有六个对应的子程序和这六大核心功能声明对应。首先,我们想要存储一个新的电话信息时,在跳转后的主界面中按下回车键,菜单栏便会跳出来,此时指定到菜单栏的新建一行,按下回车键后,会跳转到新建栏界面,并按照提示依次输入姓名和编号信息,姓名和编号信息最长字节数都设置为50个,为用户的新建留有了足够的存储空间。编辑和删除功能的运行时,都需要已经有了所存储的电话本管理信息,将光标指示到想要编辑或者删除的那一行,同样回车键并跳转界面,输入想要编辑的信息或者将之删除,可完成此功能。
    在声明子程序的关于和帮助功能时,调用判断键盘中断子程序,并判断是否有键盘输入,无输入则继续执行原先功能,有输入则判断是否为回车键等,是则可以判断跳转相应位置执行对应的操作,指示到该行并完成界面跳转后,看到的是有关于电话本的简要介绍,并以双语的形式呈现出来,随后随机输入键盘中的任意键并能完成对界面的跳转。退出功能尤为重要,他能够将界面的管理串联起来,使得使用者能够在界面的跳转中更加便利快捷,在每完成一个小的功能后,退出键Q能够使我们返回到主界面,方便我们进行下一操作,同样,在主界面指示到退出键Q时,电话本管理系统会关闭。这就涉及到了六个主要操作。
    当存储的信息达到已经设置的字节数后,需要判断存储空间是否为满;若存储空间达到了满的情况,只能执行编辑和删除功能,这样使得程序有了很强的可靠性和实时性,因为在实际生活中,电话本信息的存储本身有可容纳限度的。这样程序内部便引入了众多相关函数,对这些函数进行实现和细化之前,需要对整个电话本管理系统运行期间的概要流程有所了解。
    2.2 具体算法运算解读分层的模块化设计思想在主界面和跳转界面中均有涉及,整个电话本系统采用了模块化结构设计作为应用程序,有较强的拓展性和实用性。在子程序中,多次用到了栈这一数据结构的方法,在每一次调用子程序的过程时,都会申请CPU现场和恢复CPU现场,并将要使用的操作数或者操作码通过寄存器寻址的方式压入栈中,直到子程序顺利运行结束时,寄存器中的操作数或者操作码都按顺序被弹出栈中。在子程序中,较多的使用了判断语句,判断是否可以编辑电话信息记录的姓名和编号,如果是,便可以使用键盘中断功能使程序跳转至下一个可以编辑信息的界面;如果不是,则子程序执行LOOP循环,继续判断下一存储信息,直到所有的文件信息均被访问完结束。程序中用到字符串和字符指针的部分有很多,该功能的实现需要将用户输入的字符逐个送入缓冲区中,与电话信息已存储的数组数据进行比较,得出结果并可以声明执行下一操作。
    系统操作功能相应齐全,操作比较简单,能够满足用户实际的需求。菜单栏的功能并不复杂,六大基本功能都是我们所常见的。进入界面后窗口背景是黑色调,信息存储背景是灰色调,这些都可以通过选项进行调整。在规范录入的过程中,电话信息和数组数据都得到了较规范的保存,并能够处理一些特殊情况的要求,类似对电话信息的编辑处理等等。为了便于更好的理解和其他人员理解代码,我们添入了子程序的注释工作,使得电话本管理系统操作起来对程序的了解更加深刻。
    三、核心算法流程图流程图简要介绍了电话本菜单栏信息中的编辑功能,由开始界面指针的指向直到判断是否存有电话信息,然后能够向用户声明完成编辑内容。同样,其他的新建,删除等功能也是如此,通过界面指针的不同指向而完成不同的声明内容。


    四、开发中遇到的问题
    当输入的联系人过多时查找的时间和方式过于慢和复杂,和软件中的进制转化问题解决方法:利用相同首字母的查找方式,大大减少了查询时间,为软件的流程更快做好了铺垫,方便又好用。软件中的数据进行进制转化,为了要求更方便于使用,加入了一个进制转化的代码控制过程,当输入时会自动进行转化,方便使用。
    软件内的时间如何随着时间的变化而变化解决方法:写了一段提取系统时间的程序,设置不同的指针去指向不同的位置,从而把系统的时间提取到程序之中,当使用软件时,首界面会显示你所用的系统的时间,但是如果你给的系统时间与对的时间不对,就只能靠自己手动去修改系统内的时间,软件的时间显示才能是正确的。
    怎么准确的存储到已输入联系人的信息解决方法:设置了一个坐标表明的系统,每个信息都有自己所在的坐标,分为左上、左下、右上、右下,准确的锁定了每个信息的位置。还加入了上翻和下翻的程序,使得在使用时能快速的查找到使用者所需要的信息。
    显示过程中有不明显的状态解决方法:输出的信息加黑设置,并且用坐标的形式保存输出所有存入的信息,设置一个光标,对所输入的信息进行加黑和位置的存储,然后转化为坐标的光标,确定每个信息的位置,从而在使用软件时能使显示更加明确和准确。
    编辑过多导致存储的信息不清晰解决方法:设置SI、DI两个指针,对编辑进去的信息两两比较,用二十六个字母的排列顺序,从第一位一直向后进行比较,然后加入了一个将两个数组调换的程序,使得所存入的数据按照顺序排好。这一方法我也同样加入到了查询功能中,将坐标查询法和这个排列顺序的方法,使得在使用时用户更加方便,软件的启用界面也更加清晰。
    开机界面过程怎么设计更能吸引使用者解决方法:设计使画面更加好看对称,加入了一个画图过程,加入了一些小方块和空格笑脸等特殊的符号,使开机界面更加吸引使用者。当首界面转到使用界面时,插入了一个时间延搁过程,使可以在首届面能多停留一会,但又不能太久耽误了使用者的时间,因此这个时间的把握至关重要。
    删除过程中误删或是完全删除后怎么处理解决方法:多设置一个界面,当删除时会自动跳出,当使用者确定删除可以选择OK,当反应过来觉得不删时,还可以有反悔的机会,但是如果这一步也没有注意到删错,还设置了一个储存库,可以去恢复删除的数据。如果刚用时没有联系人可以删除的数据时,设置了置零为空时不允许再次删除,缓冲区的信息也不允许再更改。
    写一个主程序太复杂,思路容易混乱。我们在完成-一个程序时,可以简单的把一个程序划分为几个完整的几部分,使每一部分 独立的完成特定的一部分和计算任务。子程序的使用还可以大大的减小程序的体积,在一程序中,如果需要多次反复的是用某一段代码的话,就可以将这段代码设定为子程序,以后想使用时,只要一CALL再一RET就OK了。我认为使用子程序的关键在于明白子程序的机理,明白子程序是如何保存和恢复断点的信息的,只有真正的理解了这一点才能更好地利用好子程序。
    不小心会漏掉ret,导致程序自动终止。在编写子函数时,一定要在其结尾加上ret,然后再加上结束标志ENDP。由于在结尾没有加RET,结果程序不能正确运行,而且总是自动终止了程序,加上ret后,即可正确运行了。

    五、心得体会电话簿管理程序较长,算法比较复杂,调试的过程中遇到了各种各样的问题。各种各样的小错误寻找起来十分困难。在今后编写程序时应当随时找错。不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。后来慢慢的接触多了,听老师讲的多了,了解多了,渐渐的产生了兴趣。课设让我们把这一学期所学的汇编语言知识得到了很好的应用,开拓了我们的思路,所谓温故而知新,这次课设也让我们对以前的知识有了一个全面的回顾,加深了对己学知识的理解。课设过程中艰辛,花费时间很长,需要很强的耐力和信心。而这也是对我们的一次考验,养成了坚持不懈和吃苦耐劳的精神。通过这次课程设计的实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的其体内容,值从汇编语言这门课程开始。已发现程序设计的乐趣,在学习汇编语言的过程中也学会了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。在实际模储过程中犯的一些错误还会有意外的收获,感觉实训很有意思。在具体操作中对这学期所学的汇编语言的理论知识得到巩固,达到实动的基本目的,也发现自芒的不足之处。在以后的上机中应更加注意,同时体会到汇编语言具有的语句古老,使用键转,执行教许高等特点。发现上机实训的重要作用,特别是对寄存和转化有了深刻的理解。
    通过实际操件,学会了汇编语言程序编程的其本步骤、基本方法,开发了自己告的逻辑思维能力,培养了分析问题、解决问题的能力深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的唯一标准”的寓意。
    本人在此希望以后应多进行这样的训练,加长时间和次数,培养学生独立思考问题的能力,提高实际操作水平。总之,汇编的这次课设让我们学到很多,也收获了很多,这必将成为我人生中一个深刻的回忆。我深深体会到了在许多方面的欠缺和不足,比如。在需求分析时,由于自己的实践经验不够,很难分析需求到位:在编写代码时,由于自己技术知识水平不广,常常遇到技术难题;还有自己没有良好的编程习惯,不注释,有时连自己也看懵了非编程的结构不好,维修和修改代码是很慢。这次实训计我意识到了再己做为计算机软件工程专业的学生,要想在以后的职业中崭露头角,除了要有过硬的理论知识,健康的体魄外,还必须具备良好的心理素质,使自己在以后的途中无论经历什么样的困难,都立于不败之地“纸上得来终觉钱,绝知此事要躬行!”在这短短的时间里,准我深深的感觉到自己在实际应用中所学专业知识的匮乏。让我真真领悟到“学无止境”这句话的含义。而所学的,都是课本上没有面对我们又非常实用的东西,这又给我们的实训增加了浓墨淡采的光辉。我懂得了实际生活中,专业知识是怎样应用与头践的。
    在这次文训中,我不仅知道了职业生涯所需具备的专业知识,而且让我深深体会到个团队中各成员合作的重要性,要善于团队合作,善于利用别人的智慧,这才是大智慧。靠单一的力量是很难完成一个大项目的,在进行团队合作的时候,还耍耐心听取每个成员的意见,使我们的组合达到更加完美。员实训过程中,除了要专业知识,包括人际交往,沟通方式及相关礼节方面的内容,对于团队开发来说,团结一致我深有体会。团队的合作注重沟通和信任,不能不屑于做小事,永远都要保持亲和诚信,把专业理论运用到具体实践中,不仅加深我对理论的掌握和运用,还让我拥有了一次又一次难忘的开发经历,这也是实训最大的收获。
    0 评论 0 下载 2019-06-21 12:14:51 下载需要6点积分
  • 基于汇编语言的井字棋游戏程序开发设计

    一、游戏背景介绍1.1 背景介绍井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。井字棋的具体玩法为在一个3x3的棋盘上,一个玩家用X做棋子,另一个玩家用O做棋子,谁先在棋盘上的一行、一列或对角线上画满三个棋子,即可获胜,如果棋盘下满无人胜出,即为平局。
    由于井字棋玩法简单,界面比较简洁,能够快速完成游戏,因此具有较强的娱乐性,基本上每个人都会玩。所以我们将其作为我们设计的项目。
    在这个项目中,我们设计为双人对战游戏,并且能够对玩家的落棋进行判断,是否符合井字棋的游戏规则。还有输赢检测机制,能立即检测出来是否有玩家获胜。
    1.2 基本功能由于井字棋只有9个棋子位,所以在我们用一种更简单的表示方法,即直接用1-9个9个数字来表示位置,其索引顺序与键盘上的数字键排列一致,下棋时玩家看着数字键下,较为简便。

    当有玩家先在棋盘上的一行、一列或对角线上画满三个棋子时,该玩家获得胜利。

    判断胜利的方法就是检测所有的横行和竖列以及对角线是否画满三个棋子。具体实现方法为先检查斜方向是否有三个一样的棋子,有的话对应棋子的玩家胜出,结束游戏。如果没有就继续检查横方向,如果有三个一样的棋子,对应棋子的玩家胜出,结束游戏。没有的话继续检查竖方向,如果有三个一样的棋子,对应棋子的玩家胜出,结束游戏,如果还没有,就代表没有玩家胜出。继续游戏。
    当棋盘的格子都被落棋了,但是没有玩家在一行、一列或对角线上画满三个棋子,此时双方打成平手。

    在玩家游戏过程中,如果玩家落棋不符合井字棋游戏规则的话,程序会提醒落棋错误,并且要求玩家重新落棋,直到玩家落棋成功。

    二、核心算法思想2.1 设计棋盘的算法棋盘是整个游戏中的框架,玩家在落子后都会显示一个棋盘目前状态。
    先绘制棋盘的上边界,然后调用绘制行的方法来绘制棋盘的内容。每个格子都由多个竖线和空格组成,这就需要不断地打印这些字符来实现,具体方法是绘制一个竖线,在绘制格子里的数字或者棋子,然后再绘制一个竖线,这样一个一个格子就绘制好了。
    棋盘一共有九个格子,每行有三个格子,每画完一个格子后,就会跳转到下一个字符,画这个字符所在的格子,并且每绘制三个格子就进行换行,这样9个格子就会组成一个3x3的棋盘。
    同时给棋盘里的格子和每个格子的符号以及玩家的两个棋子分配了不同的颜色,这样使得界面比较美观。
    2.2 设计棋子并定义玩法的算法该程序是一个双人游戏,这里我们的玩家有两名,所以我们可以定义棋子为X和O,通过比较指令可以规定他们依次落棋,落棋次数最多为9次,玩家落棋后即可把相应格子的数字改为玩家的棋子并涂上颜色,在游戏界面中还会提示玩家选择的格子。
    2.3 检测有效数字的算法在游戏过程中,玩家要落的必须是数字1-9,而不能是其他的字符,并且已经落棋的格子不能再落棋。首先玩家选择要从键盘上敲的字符,我们把玩家输入的字符放到寄存器中,同时进行检查数字是否有效。
    通过比较指令完成对有效数字的判断。如果大于等于1并且小于等于9,则玩家输入的字符有效,如果小于1或大于9或者是其他的字符,则提醒玩家这不是一个有效数字,需要重新选择落子的位置,直到所下的棋子为有效数字。
    最后一步是检查所下的是有效数字是否重复占用,玩家不能在自己以及对手之前落棋的位置进行重复落棋,必须保证不会下重复的棋子。当玩家进行重复落棋时,程序会提醒玩家该位置已经有棋子,需重新选择落棋位置,直到所选位置是新的。
    2.4 检测有玩家胜利的算法在游戏过程中,由于某个玩家在棋盘一个方向连成三个棋子便可以判定其胜利,所以需要有算法去检测三子连线。我们需要从不同方向去考虑,横方向,纵方向,斜方向,这就涉及三种检测算法。
    首先进行斜方向检测。先获取斜方向上第一个和第二个棋子,进行比较,如果不一样,就进行反斜方向的检测,如果一样,继续获取该方向上第三个棋子,继续进行比较,如果还是一样的话,说明再该方向上有玩家胜出。反斜方向的检测机制与斜方向的相同。
    如果斜方向没有三个一样的,则进行横方向的检测,首先是第一行的检测,获取该行的第一个棋子和第二个棋子进行比较,如果不一样进行下一行检测,一样的话就获取该行第三个棋子,进行比较,如果一样,说明在该方向上有玩家胜出,不一样的话进行下一行检测。第二行的检测方法与第一行相同。第三行检测如果不一样,就说明没有玩家胜出。
    如果横方向没有三个一样的,就进行竖方向检测。首先是第一列的检测,获取该列的第一个棋子和第二个棋子进行比较,如果不一样进行下一列检测,一样的话就获取该列第三个棋子,进行比较,如果一样,说明在该方向上有玩家胜出,不一样的话进行下一列检测。第二列的检测方法与第一列相同。第三列检测如果不一样,就说明没有玩家胜出。
    如果棋子已经下满,并且通过三个方向的检测,并没有玩家胜出,此时游戏平局。
    2.5 界面设计玩家每落一次棋,就更新一次棋盘。并且在游戏过程中有语句提示,一开始会有欢迎语句和规则介绍语句,之后随着玩家每落一次棋,程序都会显示当前玩家是谁,落棋的位置,当游戏结束时,会有胜利提示语句,平局会有双方打平提示语句。
    三、核心算法流程图核心算法主要分为判断落棋是否有效,判断输赢。

    本程序是通过玩家输入棋盘上相应的位置数字来进行落棋,当玩家输入一个字符,判断是否是在1-9的数字,并且对应位置没有落过棋,最后根据玩家所代表的符号(X或O)来进行落棋。

    当玩家落好一次棋后,程序就会从三个方向进行输赢判断。先进行斜方向判断,然乎进行横方向判断,最后进行竖方向判断,只要满足其中一种就代表有玩家获胜,还需判断出当前玩家是哪个,哪个玩家就获胜,另一个玩家就输了。

    主方法的基本思路就是:首先判断玩家输入的字符是否有效,若不是则重新选择落子位置直到是有效位置,若是,则该玩家落子,程序进行输赢判断,如果有一方胜出,则游戏结束,如果没有,则临一玩家进行落棋。双方最多总共落九次,九次之后还没有玩家胜出的话,打成平局,游戏结束。如图所示。
    四、开发中遇到的问题4.1 汇编语言定义变量问题在学习c语言和c++语言时,习惯了首先声明变量,而汇编语言中无需变量的声明,因为汇编语言是直接对具体的内存单元操作,而每个单元有16进制的地址码,因此所有变量都可人为地由该地址码表示。但是汇编语言提供了EQU伪指令,可以将特定的内存空间标记为特定的名称,这就为变量定义提供了可能。而使用EQU伪指令的好处就是将抽象的物理内存分化为具体的变量名,避免了内存冲突,同时又增加了程序可读性。
    4.2 系统功能调用中遇到的问题系统功能调用——由DOS提供的一组实现特殊功能的子程序供程序员在编写自己的程序时调用,以减轻编程的工作量。分两种,DOS系统功能调用和BIOS终端调用。汇编语言中DOS系统功能调用有很多,涉及屏幕显示、文件管理、I/O管理等等,每个子程序都有一个功能号,所有的功能调用的格式都是一致的。调用的步骤大致如下:

    系统功能号送到寄存器AH中;
    入口参数送到指定的寄存器中;
    用INT 21H指令执行功能调用;
    根据出口参数分析功能调用执行情况。

    4.3 给字符上色问题既然是游戏,那么我们就要考虑其美观性,给棋盘上色能使游戏更加美观,给棋子涂上颜色更加提高了分辨感,那么问题就在于如何给棋盘和棋子上色。这里用INT 10H 指令执行功能调用,把11送到bl寄存器中,而11所对应的二进制数1011为淡青色,这样棋盘的边框就涂上了淡青色;把14送到bl寄存器中,而14所对应的二进制数1110为黄色,这样数字就涂上了黄色;同理玩家1的棋子x涂成淡绿色,玩家2的棋子o涂成淡红色。优化游戏界面如图所示。

    4.4 寄存器问题代码中大量充斥着各种寄存器,通过查阅资料了解一些寄存器的功能,以数据寄存器为例:数据寄存器可分为8位的寄存器,作为通用寄存器,可存储算术逻辑运算的操作数和运算结果。

    AX,Accumulator,通累加器,用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高;BX,Base,基址寄存器,虽然属于数据寄存器,但它经常用作地址寄存器。CX,Count,计数寄存器,经常用作一个循环的计数,在循环语句中,默认CX的内容为循环次数。在位操作中,当移多位时,要用CX的低8位CL来指明移位的位数。DX,Data,数据寄存器,在进行乘、除运算时,它可作为默认的操作数参与运算,但在I/O指令中,DX用于表示I/O的端口地址。
    5.5 对简化主方法编写的问题这里设计了一些子方法,子方法对程序结构化的作用是其可简化主方法的编写,使得程序主干的编写思路清晰化,而一些复杂的算法与功能则放在一层层的子方法中实现。在井字棋代码中我们设计了打印字符串,画棋盘,玩家落棋顺序,判断胜利等子方法,这些方法通常比较复杂,在执行主方法的时候可直接调用这些子方法。
    五、心得体会首先,在汇编语言这方面是零基础,刚入手的前两天简直是寸步难行。参考一些教材书又很难看懂,什么ax,bx,cx啊,看着就心烦。但是,借鉴之前学习c语言的方法,又对比了两者之间的相同思想,最后在脑海中形成了一些思维框架。我和我搭档的同学互相研究这门语言并且交换心得,感觉有了很大进步。在编写过程中用到了很多基础知识,但是在程序运行时总会出现一些问题,由于汇编基础比较薄弱,所以有时会打错了程序代码,误解了知识点,不了解程序结构等,但是通过查阅资料,请教老师并和同学讨论,最终解决了所有问题,也成功的运行出了结果。通过本次课程设计,不仅加深了我对汇编程序设计的认识,也提高了改写程序代码和动手操作的能力,还有编程的基本习惯和开发系统时应注意的流程,同时也对各种指令有了进一步的理解。并且我发现一个好的汇编程序不仅要正确可行,还要有健壮性,当用户输入非法的数据,使运行环境改变时,程序能恰当地作出反应或进行处理,不会产生莫名奇怪的输出结果。因为完成设计的时间较短,并且对汇编语言知识比较生疏,设计之中难免有一些错误和不妥之处,同时也需要改进,所以真诚的希望尊敬的老师批评指正。
    在接触这门课程后,感到汇编语言并不是很容易就可以弄懂的。相比较以前学过的高级语言如C、C++等,电脑等于在迁就人的思维方式,但学汇编,人却必须要去迁就电脑的思维方式,要设身处地地用电脑的角度去思考问题,这就是我们学习汇编语言时遇到的最大的障碍。 另外,在C语言中不到10个语句构成的程序,用汇编语言却要好几十行甚至上百行。这不得不让我们对汇编产生一种恐惧感。事实上,这是完全不必要的。一旦对它的原理掌握后,编写程序就容易多了。另外,学习汇编语言能让我们更加了解计算机内部的组织结构,对我们计算机专业的学生来说,学习汇编也是提升综合能力的关键环节。
    汇编的学习不仅仅是学习其语法,而更多的是学习计算机基本的体系结构。其中遇到很多新的概念,名字。如寄存器、中断、寻址方式等。这些概念在刚接触汇编这门课的时候难以理解,但在之后的学习中通过老师的讲解,自己亲手编程的方式也就渐渐清晰明了。在学习汇编语言时,指令的功能是学习和掌握的重点,要准确有效并合理的使用这些指令,必须了解一些使用的规则。现对汇编语言编程时的规则进行总结,归纳起来有三点:1、要求指令操作数的寻址方式;2、指令对标志位的影响和标志位对指令的影响;3、指令的执行时间,对可完成同样功能的指令,要选用执行时间短的指令。
    0 评论 0 下载 2019-06-21 12:11:47 下载需要8点积分
  • 基于C++实现的高考成绩模拟录取系统

    一、原程序功能、结构1.1 功能定义一个学生类 包括:姓名、性别、年龄、准考证号、毕业学校、语文、数学、英语三门课的成绩、两门选测课及其等级:分为a+, a, b+, b, c+, c, d+, d
    主要的类成员函数包括:

    采用动态分配,设计构造和析构函数
    计算某一门课的平均成绩
    对成绩排序,可以是升序也可以是降序
    根据分数,按照5分一个分数段,进行人数统计
    根据招生人数以及等级,来划定分数线。

    所有结果,存入文件。 主程序中设计相应的菜单,以便调用相应的功能。
    1.2 程序流程图
    二、课程设计要求的实现2.1 一些主要函数及其说明2.1.1 文本读取函数(部分)char a[20],b[10],c[20],d[20],e[10],f[10],g;int m,n,o,p;while(i < 50){ infile.getline(a,20,','); infile.getline(b,10,','); infile>>m; infile>>g; infile.getline(c,20,','); infile.getline(d,20,','); infile>>n; infile>>g; infile>>o; infile>>g; infile>>p; infile>>g; infile.getline(e,10,','); infile.getline(f,10,'\n'); t[i].setname(a); t[i].setsex(b); t[i].setage(m); t[i].setcnumber(c); t[i].setschoolname(d); t[i].setchinesescore(n); t[i].setmathscore(o); t[i].setenglishscore(p); t[i].seta1(e); t[i].seta2(f); i++; realsize++;
    2.1.2 成绩排序函数//计算总成绩并排序void sortsum(Student *ss){ int num; int *sum=new int[num]; for(int i=0;i<num;i++) { sum[i]=ss[i].mathscore+ss[i].chinesescore+ss[i].englishscore; } int temp; //冒泡排序 for(int j=0;j<num;j++) for(int k=0;k<num-1-j;k++) if(sum[k]>sum[k+1]) { temp=sum[k]; sum[k]=sum[k+1]; sum[k+1]=temp; } int lowmark,highmark; //按照5分一个分数段进行人数统计 lowmark=sum[0]; highmark=sum[num-1]; for(int n=lowmark+5;n<=highmark;n+=5) { int size=0; for(int m=0;sum[m]<n;m++) { size++; } cout<<"分数范围为"<<n-5<<"~"<<n<<"的有:"<<size<<endl; } delete[]sum;}
    2.1.3 主函数中用switch语句实现功能选择cout<<"1.计算某门科目平均成绩;"<<endl;cout<<"2.排序;"<<endl;cout<<"3.进行分数段人数统计;"<<endl;cout<<"4.划定高考录取分数线;"<<endl;cout<<"5.结束录取;"<<endl;cout<<"请输入需要实现的功能序号:";int p;cin>>p;//开关语句实现功能选择函数switch(p){ case 1: int k; cout<<"请输入所要计算平均值的科目的代码(具体代码表请参见表1):"; cin>>k; s.Average(k,t); //通过类的对象作为借口访问类的公有成员函数 break;case 2: s.sortsum(t); break;case 3: cout<<"在排序中已经实现分数段人数统计并保存!"<<endl; break;case 4: s.setmarkline(t); break;case 5: cout<<"谢谢使用!"<<endl; break;default: cout<<"Input P error!"<<endl;}
    三、课程设计中所遇问题和解决在函数中不能直接将文本文件中的信息录入到类的对应的成员中

    解决办法是将文本信息的读取函数定义为类的友元函数,这样它就能访问类的私有数据成员了。
    经常因为粗心出现下面这个错误

    主要是因为在功能函数中少写了“}”,补上即可。
    类对象的值不能直接赋值给int类型数组

    将数组定义为学生类类型数组。
    数组之间不能直接赋值

    需要用字符串函数strcpy实现数组织间的数值传递。
    代码上的不足:只能保存排序后的学生信息,而不能通过排序后的数组名称访问类中的私有成员,导致文件中的成绩信息不能与其相对应的考生符合
    //计算总成绩并排序void sortsum(Student *ss){ int num; int *sum=new int[num]; for(int i=0;i<num;i++) { sum[i]=ss[i].mathscore+ss[i].chinesescore+ss[i].englishscore; } int temp; //冒泡排序 for(int j=0;j<num;j++) for(int k=0;k<num-1-j;k++) if(sum[k]>sum[k+1]) { temp=sum[k]; sum[k]=sum[k+1]; sum[k+1]=temp; } int lowmark,highmark; //按照5分一个分数段进行人数统计 lowmark=sum[0]; highmark=sum[num-1]; char filename[256]; cout<<"请输入保存分数段人数统计信息的文件名称:"<<endl; cin>>filename; //分数段人数统计信息存入文件 ofstream outfile(filename,ios::out||ios::noreplace); while(!outfile) { cout<<"不能打开此文件!"<<endl; cout<<"请再次输入文件名:"; cin>>filename; outfile.clear(); outfile.open(filename,ios::out||ios::noreplace); }
    改进方法是将sum数组定义为Student类数组。
    四、设计的收获和体会一开始拿到这个题目时,很懵,题目需要反复去看,反复斟酌隐含意思以及一些隐含的要求,例如对成绩排序后保存信息时,不仅仅要保存成绩的排序信息,还要把它对应的考生信息保存入文件中。
    做课设有利于复习以前的知识,新学知识,很快用上,也会去请教别人。
    对成绩的排序不仅可以从总成绩,也可以是按单门英语或语文或数学成绩排序。功能函数均定义为类的成员函数。仅仅一个程序突然停止运行的错误我就改了两天。文件里的内容不能直接赋给类的成员!文件由于没有选测课序号,不能分文理科,所以文理分科函数不能使用,但是是正确的函数。由于功能4调用了功能2里的排序文件,所以功能2必须先于功能4执行。先把功能函数的代码依次写好,可是后来写录入函数的时候出现问题,就发现改起来很复杂,应该先把录入函数写好,再去写功能函数,num的值先自己设置一个已知的值,最后再在主函数里实现人数统计,num由文本给出。
    五、程序主界面
    2 评论 9 下载 2018-11-15 14:39:49 下载需要3点积分
显示 60 到 75 ,共 15 条
eject