JAVA课程设计报告完整版Word文档格式.docx
《JAVA课程设计报告完整版Word文档格式.docx》由会员分享,可在线阅读,更多相关《JAVA课程设计报告完整版Word文档格式.docx(66页珍藏版)》请在冰点文库上搜索。
位数可以分超出和不足,并均给出错误提示。
如果位数满足要求后对手机号码类型进行检测。
一般手机号在0~9之间,所以不满足的字符将报错。
通过将输入的整个字符串调用charAt(inti)方法对字符串逐位比较。
本程序的特点在于可以满足了多次输入和错误字符的显示(内容和位置)。
在程序的调试过程中,有过多次输入正确的号码也会报错(还会报错0位错误),这是因为记录错误位子的变量放在错误条件下并且未在循环体中初始化为0。
最终解决了此问题。
(三)程序框图或流程图,程序清单与调用关系
(四)程序运行的测试与分析
实现了多次输入和错误提示,可以判断输入的号码的错误位置及字符,错误类型,满足了设计构思要求。
最终结果如下图:
实验结果截图:
(五)结论心得
实验过程中对于判断条件的选择出现了问题,开始时觉得要对输入的字符一个一个的比较,这样增加了难度也不方便实现。
后面改成了将用户输入完成后的全部字符串当做整体后再来逐位比较。
如果能做成手机外形的面板并能一个一个的判断,只要输入错误字符马上提示,那功能将更加完善。
任务二扑克牌
任务:
设计一个Card类代表扑克牌,每张牌都有自己的花色和大小。
创建一个DeskOfCards类保存54张扑克牌,设计洗牌、发一张牌、报告剩余牌数的方法。
创建main方法测试你的程序。
实现洗牌和发牌。
显示当前片面和剩余牌数。
分析论证:
本题目需要用到数组来存储一副纸牌,并需要用到随机数来代替随机发牌,曾经做过类似工作。
现在需要将产生的随机数和字牌的大小和花色联系起来,可以通过数组来实现。
同时还要达到可以循环发牌,并有发牌信息显示。
根据题目要求,我准备在类Card中用数组存储一副牌(52张),考虑到扑克牌有花色和大小并都是固定的,所以用了两个字符串数组分别初始化花色和大小,再利用下标操作把花色和大小组合在一起,存放另在一个数组里(最终的纸牌组)。
这样就有了一副完整纸牌了。
再创建另一个类DeskOfCard创建两个Card对象,通过在循环里的条件判断对对象进行操作:
洗牌时就将纸牌数组和剩余牌数重新初始化(利用多余的那个对象)。
发牌时用到随机数产生器,产生从0到51的整数和数组小标对应,每个元素代表一张牌。
测试过程中出现了无法显示牌面的问题,通过对象引用找不到具体的纸牌,后来在Card类中添加了getCard(inti)方法返回一张牌,实现了发牌和剩余牌数,并可以多次发牌。
从测试过程中达到了分析时的目的要求,实现了洗牌和发牌(显示牌面和剩余数量)。
实验过程中,开始没有将纸牌的大小和花色分开来定义,导致需要初始化52张牌,后俩采用了循环体将花色和大小进行组合达到了目的的同时又简化了代码,提高了可读性。
本来希望最后的结果可以通过图片的方式显示纸牌,但纸牌的原图片两太大,实现过于繁琐,最终采用了简单的文字表示。
希望今后有机会近一步完善,达到预期效果。
任务三计算器
参考第六章的实验题TelephoneKeypad界面设计一个计算器。
实现输入数字和运算字符并输出结果
结果由对应的运算得出,实现基本运算能力
通过设计一个界面展示一个计算器的功能,包括输入数字和符号并进行准确的运算得出理想的结果。
在第六章中的TelephoneKeypad实验中做过类似的界面只是实现的功能不一样,可在这个基础上加入运算功能即可实现要求。
根据题目的具体要求,我设想通过之前的TelephoneKeypad实验进行改进,除了需要加入一些按钮外,还要对具体的按钮功能进行设计。
在Calculator类中进行了面板的设计,之间加入了需要的各个控件,并且加了ActionListener()类来做事件的触发类。
此类中通过event.getSource()方法与相应的按键进行对应,以此为判断条件来决定做什么操作。
其中包括了被运算数、运算类型、运算数还有等号的事件。
为了可以输出信息还要加入JTextField控件来显示信息,信息通过一个字符串变量来存取。
两个JTextField控件分上下,上面显示最后的运算式(包括每次输入时均要逐步显示输入内容),下面显示最后的结果并以一定的格式输出。
最后还要满足多次输入,因此设计了清楚按键,每次清楚后可以进行下一次的运算。
在程序的调试的过程中出现了,输出内容的错误。
不能逐一的输出输入的内容,最后也没有在上面显示框中显示完整的运算式。
通过检查,发现是字符串的添加位置和没有将内容在原有基础上增加,而是每次更新字符串。
最终通过修改解决了问题。
其间,还出现了按键功能的一些的错乱,都是小问题,多次调试后基本达到了一个简单运算器的功能。
测试过程中进行了多次的运算,包括加、减、乘、除。
每次都可以逐一输出输入的内容并能得出正确的结果并输出。
清除后可以再次运算,基本达到了预期要求。
本程序因为涉及的控件很多,所以排版和引用都要十分注意,不然容易引用错误,导致引用不到你所点击的那个按键等。
还要注意在监听器里的条件判断时相应的操作要考虑清楚。
为了界面美观和人性化,要将按键的顺序按一定的顺序排列不能随机添加。
本程序不足的地方在于运算类型只有加减乘除,并且不能再完成一次运算后立即进行下一次运算,必须清楚后重新开始。
这些不足还有待改善。
相信如果改进过后,这个计算器会达到更加完善的功能和实用性。
任务四愤怒的小鸟
愤怒的小鸟是一款“亿人迷”的游戏,据说大家喜欢它的原因在于大家喜欢抛物线胜过直线。
例题8.15-8.16是笑脸图片直线运动的例子,请修改它在X轴和Y轴的运动轨迹,将它改成抛物线运动。
实现界面中小鸟打击目标
有准确的抛物线
可以多次并操作简单
在例题笑脸的运动中实现了图片按照一定的像素进行平移,到达一个目标地。
所以可以以此为基础进行改进。
对运动中的函数进行改进,将直线运动改成抛物线。
并有效开始时出现提示。
用户可以对图片的出发位置进行控制。
为了达到预期的目标,我将创建了一个BirdPanel类来存放各种组件,主要是存入多张图片和一个十分重要的也是这个程序的核心——定时器Timer。
这个游戏最终可以看到的效果是图片的移动,所以需要通过控制图片在面板中的位置来实现移动。
所以定时器就十分重要了,有了定时器就可以在间隔一段时间中多次触发事件,看到的也就是图片在不停地移动,最终到达目标。
在编写程序过程中,发现需要实现客户对图片初始位置的控制比较困难。
所以为了节省时间就将图片的触发地限制在了固定位置。
每次都将从这一位置触发,并进行抛物运动后,打中目标。
这虽然使程序简单了,可在一定程度上牺牲了部分的功能。
今后还有需要改进。
实验测试过程完成了游戏开始提示和小鸟图片的抛物运动,目标被打击后会场上变化。
只是不能多次操作和随意拖拽小鸟的起始位置,这是一段的局限。
本题目中涉及的核心内容是定时器和图片坐标改变在(运动)的配合使用。
通过对坐标的改变,并结合定时器功能达到动画效果。
本程序的不足在于未能达到预期的人性化,没法随意开始游戏,和市场上的愤怒的小鸟存在巨大差距,这也是这个程序不成熟的地方,但是总算达到了能将图片以抛物线运动到目的地。
基本上完成了目的要求。
今后还需继续改进完善。
任务五石头剪刀布
参考第五章的实验题Rock,Paper,Scissors设计并实现一个和计算机交互的剪刀、石头、布游戏。
人和计算机各选择一项,然后决出胜负。
程序必须随机选取一项但不表示出来,然后提示用户选择。
当用户选择后,程序同时显示出计算机和用户的选择并且输出游戏结果。
游戏一直进行直到用户退出为止,并且输出双方输赢次数和总局数。
能够直观显示用户和电脑的出拳
可以多次进行游戏,知道用户确认退出
每次都给出目前胜负情况
游戏具有随机性和准确性
由于第五章中已经编译过类似的程序,其是通过随机数模拟电脑出拳,在通过用户输入模拟自己出拳,最终来比较电脑和用户的胜负。
只要将原程序改成界面形式并加入具体相应的图片和用户胜负情况的提示,其他的游戏比较与原来一致就行。
根据题目要求需要建立一个Panel’类Fight用于存储图片和组件。
在类中申请了3个panel,第一个用于存放图片,第二个用于存放按键,最后将这两个放进panel3中。
在panel1中的图片需要根据panel2中按键触发的事件进行相应的改变。
电脑和用户都有石头、剪刀和布三张图片进行变化。
每次在用户点击按键石头或剪刀或布后电脑会根据随机数产生器发出的随机数进行相应的“出拳”,然后和用户选择的“出拳”进行比较输赢。
当用户选择后,两者的出拳图会显示在panel1中,并出现信息说明当前游戏总次数和用户和电脑各自的胜出次数。
用户可以再一次游戏介绍后继续点击按键进行多次游戏,每次重复上面功能。
因为本程序是在原有基础上进行的改进,前面又做过小鸟的程序,所以问题不是很大,最不应该的是在图片引用过程中因为图片命名格式的原因耽误了大量时间,导致实验用时较长。
最终完成的游戏还是比较完善的,几乎达到了预期的所有要求。
本程序运行正常,实现了用户点击按键尝试相应的图片,同时电脑也会产生相应的回应发出它的“猜拳”,每一次都会给出当前的游戏总局数和用户和电脑各自的胜利局数。
并且可以随意进行多次,每次的随机性和准确性良好。
界面也较清楚好看。
本题经过较长时间的调试和完善,达到了预期要求和运行目标。
这是本次设计用时最长的题目花了大量时间,最后总算有所回报,到达了一个比较满意的成果。
任务六学生考勤管理系统
考勤信息记录了学生的缺课情况,它包括:
缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)。
试设计考勤管理系统,使之能提供以下功能:
(1)录入学生的缺课记录;
(2)修改某个学生的缺课记录;
(3)查询某个学生的缺课情况;
(4)统计某段时间内,旷课学生姓名及旷课次数;
(5)统计某段时间内,有学生旷课的课程及旷课人次;
本题需要通过用户界面来直观的实现操作,操作尽量简单方便,可以实现上述基本功能。
主要以之前的对话框等GUI组件来实现用户的交互。
可以输入和查询相应的信息以及提示信息,并可以实现简单统计。
本题我设计了一个主面板来承载多个panel;
其中最重要的是JTabbedPane组件,它先承载了主要的按键及菜单和各个文本输入框。
其他的面板主要是安放在JTabbedPane上,并且要求面板中的组件按一定规律排列,用到了布局管理器。
需要实现的功能主要是录入、修改、查询和统计信息。
程序中我分块编写了各个功能的代码,每个功能都将用到相应监听器,通过按键实现功能。
并且在panel类中用到了student类,用于保存基本的学生信息。
在程序的编译和调试过程中出现了许多问题。
开始时面板布局凌乱,输入信息没有反应,并且还会出现报错。
在布局问题上后来用到了布局管理器,编程时将各个功能的版式按照一定的样式统一设计,达到界面简洁美观。
输入信息没反应主要是事件反应器的逻辑错误,经过调整判断条件等改正了错误。
最后,根据老师提出的要求最程序提出了完善,可以通过姓名和学号查询信息,以及不会重复输入同一个人的信息。
基本达到实验目的。
经过调试,程序可以正常运行。
可以实现信息的输入和查询以及修改和统计信息数量。
界面布局较合理,实验截图如下:
本题设计时涉及很多的组件和方法,需要将大量的组件安排到合适的位置,并且要实现相应的功能。
工作量较大,在完善过程中问题也很多。
不过通过自己的努力和思考,最终成功的完成了实验。
实验收获众多,了解了一个较复杂和大段的代码编写时需要耗费很大精力。
参考资料
【1】【美】Johnlewis,WilliamLoftus著《Java程序设计教程》(第六版)——电子工业出版社
【2】【美】Y.DanielLiang著《Java语言程序设计》(基础篇)——机械工业出版社
【3】XX知道——
【4】XX文库——
致谢
本次可是设计能够完成的这样顺利需要感谢很多人,这其中就包括软件班的王浩同学,愤怒的小鸟这个程序借鉴了他的设计。
还有就是本班的黄康杰的同学,他在我调试程序时给出一些好的建议,帮我解决了问题。
特别需要感谢的事我们的崔剑锋老师,是您一个学期以来的严格要求和教导,给我传授知识,今天才能完成这个课程设计。
在这里衷心的对这些给过帮助的人们表示感谢!
附录:
全部源程序清单
源代码一:
手机号码检测器
importjava.util.Scanner;
//手机号码检测器
publicclassPhone
{
publicstaticvoidmain(String[]args)
Stringphone,str;
chary;
intx,m,a;
Scannerscan=newScanner(System.in);
do
{
m=0;
a=0;
System.out.println("
请输入电话号码:
"
);
phone=scan.next();
x=phone.length();
if(x<
11)
System.out.println("
输入错误,位数不足!
else
if(x>
System.out.println("
输入错误,位数过多!
if(x==11)
for(inti=0;
i<
11;
i++)
{
y=phone.charAt(i);
if(y>
='
0'
&
y<
9'
)
{
a++;
}
else
m=i+1;
}
if(a==11)
输入完成!
else
输入错误!
第"
+m+"
位输入错误字符"
+phone.charAt(m-1));
}
System.out.print("
继续输入吗(Y/N):
"
str=scan.next();
}while(str.equals("
Y"
));
退出输入!
}
源代码二:
扑克牌
//*************************************
//Card.java
//主类定义纸牌的花色和大小
publicclassCard
privateString[]card,bao;
privateinta=0;
publicCard()
String[]card1={"
黑桃"
"
红桃"
梅花"
方块"
};
//定义两个数组用于组
String[]card2={"
A"
2"
3"
4"
5"
6"
7"
8"
9"
10"
"
J"
Q"
K"
card=newString[52];
bao=newString[52];
for(inti=0;
i<
4;
i++)
{
for(intj=0;
j<
13;
j++)
card[a]=card1[i].concat(card2[j]);
bao[a]=card[a];
a++;
}
publicStringgetCard(inti)
returncard[i];
publicclassDeskOfCard
privatestaticintcount=52;
publicstaticvoidmain(String[]args)
Stringstring,string2;
Cardm=newCard();
Cardn=newCard();
//这里设定52张牌
Scannerscan=newScanner(System.in);
do
输入您要的操作(xipaiorfapai):
string=scan.next();
if(string.equals("
xiapi"
))
m=n;
//初始化牌组
count=52;
//重新设定计数器
剩余牌数:
+count);
fapai"
{
if(count!
=0)//判定牌是否发完
count--;
intr=(int)(Math.random()*52);
//获取随即数
抽取的牌为:
+m.getCard(r)+"
剩余扑克牌数为:
//输出扑克牌
}//从ArrayList中去掉已抽到了扑克牌
else
牌已经抽完"
Wanttoagain(Y/N):
string2=scan.next();
}while(string2.equals("
源代码三:
计算器
importjava.awt.*;
importjava.awt.event.*;
importjava.text.DecimalFormat;
importjavax.swing.*;
importjavax.swing.border.BevelBorder;
//创建Calculator类,继承自JFrame,实现接口ActionListener
publicclassCalculatorextendsJPanel
//声明相关变量、对象,具体作用下面再逐行讲解
privateDecimalFormatdf;
privateJTextFieldjieguo,jieguo2;
privateJButton[]button;
privateJPanelpanel1,panel2,panel3;
privatedoubleresult,num1,num2;
privateintyunsuan,kong1=0;
privateStrings="
s1="
s2="
;
publicCalculator()//构造方法
df=newDecimalFormat("
0.0000"
//设置结果小数点位数
jieguo=newJTextField(20);
jieguo.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguo.setBackground(newColor(240,245,254));
jieguo.setEditable(false);
jieguo2=newJTextField(20);
jieguo2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguo2.setBackground(newColor(240,245,254));
jieguo2.setEditable(false);
panel1=newJPanel();
panel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel1.setLayout(newBoxLayout(panel1,BoxLayout.Y_AXIS));
panel1.setBackground(newColor(240,245,254));
panel1.add(jieguo);