Tianjin TianShi College |
Java课程设计
(阶段一文档)
院 别: 信息科学与工程学院 专 业: 计算机科学与技术 班 级: 2019级计科2班 学生姓名: 贾徐沙 指导老师: 董保莲 |
二〇二一年七月
目 录
目录
1 选题
选题一 | 算术运算测试 |
题目要求 | |
实现10道100以内的加减数学计算题,根据题目计算出答案,与输入答案对比,判断做题是否正确,计算得分,时间,做出排行榜。 | |
使用Java知识 | |
Io输入输出流,数组,for循环,if-else分支,写入文件,异常处理,冒泡排序 | |
选题二 | 猜数游戏 |
题目要求 | |
计算机产生随机数,猜对获得胜利,猜不对,提示猜大还是猜小了,继续猜,直到猜对。给出所用时间与评语,做出排行榜,保存到文件 | |
使用Java知识 | |
Io输入输出流,数组,for循环,do-while循环,if-else分支,写入文件,异常处理,冒泡排序 |
2 系统需求分析
2.1 系统可行性分析
一、算术运算测试
- 本程序运用的是eclipse这个软件,采用的是java语言,所以技术上可行。
- 因为eclipse是免费的,在这个软件上就能满足我们的需求,不需要其他的开销,所以经济上也是可行的。
- 本次程序只需要用户有这个软件并配置了环境变量就可以使用,操作简单,因此在操作上是可行的。
二、猜数游戏
- 本程序运用的是eclipse这个软件,采用的是java语言,所以技术上可行。
- 因为eclipse是免费的,在这个软件上就能满足我们的需求,不需要其他的开销,所以经济上也是可行的。
- 本次程序只需要用户有这个软件并配置了环境变量就可以使用,操作简单,因此在操作上是可行的。
2.2 系统需求分析
调研对象:用户玩家
算术运算测试:系统产生随机数,进行10道加减法操作,与用户输入的答案对比,答题结束显示用户答对题数,所用时间,得分,排行榜
猜数游戏:系统产生随机数,与用户输入的答案对比,如果一致,则结束答题,如果不一致,则继续答题,直到一致。结束显示用户所用时间,猜测次数,排行榜。
算术运算测试:
图2-1:算术运算测试功能图
猜数游戏:
图2-2:猜数游戏测试功能图
2.3 进度安排
阶段一进度安排如表3-1所示。
表2-1 进度安排表
阶段 | 持续时间 | 阶段描述 | 输出 |
构思阶段 | 半天 | 需求分析 | 需求说明,功能模块图 |
设计阶段 | 半天 | 系统设计 | 设计说明-可以画流程图;数据库设计 |
实现阶段 | 一天 | 编写代码 | 项目工程源代码 |
半天 | 系统测试 | 进行黑盒测试(功能测试)-测试说明 | |
运行阶段 | 半天 | 部署、运行 | 系统使用说明、运维报告、录制视频 |
3 系统设计
3.1 系统设计
算数运算:for循环控制答题人数与答题数量10道题,if-else分支控制加减法,进入相应的分支具体操作。答题结束显示具体同学答题情况,采用冒泡排序对答题同学排名—答题所得分数多排名靠前,如果分数相等比较时间,时间少的排名靠前。显示排行榜,写入文件,捕捉异常。
猜数游戏:由用户输入答题人数,控制猜数,系统随机产生数字,与用户输入的猜测数字对比,如果一致,则猜数截至,如果不一致,继续猜数直到正确。每猜一次次数累计一次,分数加一,显示每位玩家答题的次数与时间得分,根据次数给出评价,根据答题的次数进行冒泡排序,猜题次数少的靠前,如果次数相等比较时间,时间少的靠前,写入文件。
3.2 文件设计
在程序中运用文件写入将程序运行过程中的生成的信息写入在本台电脑d:\\学生成绩排行榜.txt中和d://猜数游戏排行榜.txt中并保存。 将算数运算过程中产生的加减法运算和结果以及猜数游戏中所猜的数字存在文件当中。
4 系统实现
4.1 代码实现
算术运算测试
package jxs.test;//实现10道100以内的加减法,根据题目计算出答案,与输入答案对比,判断是否正确,计算得分,实现排行榜,保存到文件里
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Random;
import java.util.Scanner;
public class SuanShuYunSuan {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i,j;
int[]a1=new int[3];//存分数
long[]a2=new long[3];//时间
Random ran=new Random();//产生随机数
Scanner input=new Scanner(System.in);
for(i=1;i<=a1.length;i++)//答题人数控制循环
{
int count=0;
long starttime=System.currentTimeMillis();//开始时间
for(j=1;j<=10;j++)//答题数量
{
int a=ran.nextInt(100);
int b=ran.nextInt(100);
int c=ran.nextInt(2);//执行加减法,0代表加法,1代表减法
if(c==0)
{
System.out.println(a+"+"+b+"=?");
int answer=input.nextInt();
if(a+b==answer)
{
count++;//答对累计分数
}
else
{
continue;//答错跳出本次循环继续下一题
}
}
else if(c==1)
{
System.out.println(a+"-"+b+"=?");
int answer=input.nextInt();
if(a-b==answer)
{
count++;//答对累计分数
}
else
{
continue;//答错跳出本次循环继续下一题
}
}
}
long endtime=System.currentTimeMillis();//结束时间
long time=(endtime-starttime)/1000;//毫秒换成秒
a1[i-1]=1*count;//答对一题是一分
a2[i-1]=time;//每题时间
System.out.println("第"+i+"位同学的答题情况:");
System.out.println("共答对"+count+"道题,得分情况为:"+(1*count)+",用时"+time+"秒");
}
//排行榜 采用冒泡排序 答题得分多的靠前
for(int x=0;x<a1.length;x++)
{
for(int y=0;y<a1.length-1-x;y++)
{
if(a1[y]<a1[y+1])
{
int temp=a1[y];
a1[y]=a1[y+1];
a1[y+1]=temp;
long t=a2[y];
a2[y]=a2[y+1];
a2[y+1]=t;
}
}
}
for(int x=0;x<a1.length;x++)
{
for(int y=x+1;y<a1.length;y++)
{
if(a1[x]==a1[y])//分数相等比较时间 时间少的排靠前边
{
if(a2[x]>a2[y])
{
long temp=a2[x];
a2[x]=a2[y];
a2[y]=temp;
}
}
}
}
System.out.println();
System.out.println("*************************排行榜*************************");
System.out.println("名次\t答对题数\t总分\t时间(s)");
for(int z=0;z<a1.length;z++)
{
System.out.println(""+(z+1)+"\t "+(a1[z])+"\t"+a1[z]+"\t "+a2[z]);
}
//把排行榜放到文件(d:\\学生成绩排行榜.txt)
Writer s=null;
BufferedWriter f=null;
try
{
s=new FileWriter("d:\\学生成绩排行榜.txt");
f=new BufferedWriter(s);
f.write("名次\t答对题数\t总分\t所用时间(s)");
f.newLine();
for(int b=0;b<a1.length;b++)
{
f.write(" "+(b+1)+"\t "+(a1[b])+"\t"+a1[b]+"\t "+a2[b]);
f.newLine();
}
System.out.println("成绩排行榜已保存!");
f.flush();
}catch(IOException e)
{
e.printStackTrace();
}finally
{
try
{
f.close();
s.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
猜数游戏
package jxs.test;//计算机产生随机数,猜对获得胜利,猜不对,提示猜大还是猜小了,继续猜,直到猜对。给出所用时间与评语,做出排行榜
//保存到文件
import java.io.*;
import java.lang.reflect.Array;//动态创建和访问数组元素的各种动态方法
import java.util.*;
public class CaiDaXiao {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
System.out.println("请输入参与的人数");
int personNumber=sc.nextInt();
Writer wr=null;//输入流
int guess;//用户猜的数字
long[]a2=new long[3];//时间
int[] score=new int[personNumber];//定义数组存放成绩
int []count1=new int[personNumber];//定义数组存放猜测次数
for(int j=0;j<personNumber;j++) //玩家人数控制循环
{
int number = (int)(Math.random()*100)+1;//产生随机数
int count=0;//猜测次数
System.out.println("***************猜数字游戏****************");
System.out.println("请输入0-100之间的数字");
long starttime=System.currentTimeMillis();//开始时间
//开始猜数
do
{
guess=sc.nextInt();
if(guess==number)
{
System.out.println("恭喜你,猜对了");//猜一次累计一次次数
count++;
count1[j]+=1;
}
else if(guess>number)
{
System.out.println("猜大了,请继续!\n");
count++;
count1[j]+=1;
}
else
{
System.out.println("猜小了,请继续!\n");
count++;
count1[j]+=1;
}
}while(guess!=number);
long endtime=System.currentTimeMillis();//结束时间
System.out.println("这个数字是"+number);
System.out.println("第"+(j+1)+"位玩家共猜了"+count+"次,本次猜数游戏得分:"+count1[j]);
System.out.println("一共用时"+(endtime-starttime)/1000+"秒");//换成秒
a2[j]=(endtime-starttime)/1000;//每位时间
//根据猜测次数给出评价
if(count==1)
{
System.out.println("你太聪明了!");
}
else if(count>=2&&count<=5)
{
System.out.println("不错,再接再厉!");
}
else
{
System.out.println("要努力呀!");
}
//写入文件
try {
/*wr=new FileWriter("d://猜数游戏排行榜.txt",true);
wr.write("\r\n");
wr.write("第"+(j+1)+"位玩家:");
wr.write("\r\n");
wr.write("猜数次数");
String guess1=Integer.toString(count);
wr.write(guess1);
wr.write("\r\n");
wr.write("时间");
wr.write("a2[j]");
wr.write("\r\n");
System.out.println("已写入文件");*/
wr=new FileWriter("d://猜数游戏排行榜.txt",true);
wr=new BufferedWriter(wr);
wr.write("名次\t次数\t所用时间(s)");
for(int b=0;b<score.length;b++)
{
wr.write("\r\n");
wr.write(" "+(b+1)+"\t "+(count1[b])+"\t "+a2[b]);
wr.write("\r\n");
}
System.out.println("成绩排行榜已保存!");
wr.flush();
}catch(IOException e)
{
e.printStackTrace();
}finally
{
try {
wr.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Arrays.sort(count1);//对分数排序
System.out.println("***********排行榜*****************");
System.out.println("本次得分排名如下:");
for(int x=0;x<score.length;x++) //冒泡排序,次数少的排前边,升序,
{
for(int y=0;y<score.length-1-x;y++)
{
if(count1[y]>count1[y+1])//比较次数排序
{
int temp=count1[y];
count1[y]=count1[y+1];
count1[y+1]=temp;
}
}
}
for(int x=0;x<score.length;x++)
{
for(int y=x+1;y<score.length;y++)
{
if(count1[x]==count1[y])//分数相等比较时间 时间少的排靠前边
{
if(a2[x]>a2[y])
{
long temp=a2[x];
a2[x]=a2[y];
a2[y]=temp;
}
}
}
}
System.out.println();
System.out.println("名次\t次数\t时间");
for(int z=0;z<score.length;z++)//控制循环
{
System.out.println(""+(z+1)+"\t " +count1[z]+"\t "+a2[z]);//输出排行榜对应的名次和次数
}
}
}
4.2 运行界面实现
猜数字游戏:用户开始在界面输入参与猜数字游戏的人数,开始进入猜数字游戏,计算机产生随机数,提示用户输入0-100之间的数字,用户输入数字后和计算机产生的随机数进行比较,提示用户猜大还是猜小了,直到两个数相等为止,然后进行下一位玩家的猜数游戏,猜数过程与第一位玩家一致,直到所有玩家都猜完。在排行榜中输出排行信息,猜测次数越少的排名越高
图4-1:猜数字游戏开始输入人数
图4-2具体猜数过程
图4-3显示排行榜
算术运算测试
算术运算测试:在程序中已经定义参与算术运算的人数,开始运行后计算机开始计时,计算机随机产生加减法运算,用户输入自己计算的结果,计算机生成另外的运算,用户再次输入自己的计算结果,直到输入10个运算结果为之。将用户输入的答案和正确答案进行对比,将正确次数记录下来。并将整个运算过程所用的时间记录下来。在排行榜中输出排行,成绩越高的排行越高,若成绩相等,则所用时间越少的排行越高。
图4-4运行后答题
图4-5答题结束显示排行榜
5 系统测试
表5-1算术运算模块测试表
编号 | 测试功能 | 输入描述 | 预期结果 | 运行结果 |
01 | 答题正确不等 | 回答正确题数不等,正确多的靠前 | 正确多的靠前 | 正常,与预期结果一致 |
02 | 正确答题相等时间不等 | 正确答题相等,时间少的排名靠前 | 时间少的靠前 | 正常,与预期结果一致 |
算术运算模块测试主要是针对用户的操作,从测试结果中可以看出该模块的所有功能均能正常实现,且测试结果与预期结果一致。
表5-2 猜数游戏模块测试表
编号 | 测试功能 | 输入描述 | 预期结果 | 运行结果 |
01 | 次数不等 | 猜测次数不等,排名是次数少的靠前 | 次数少的靠前 | 正常,与预期结果一致 |
02 | 次数相等 | 次数相等,时间少的排名靠前 | 时间少的靠前 | 正常,与预期结果一致 |
猜数游戏模块测试主要是针对用户的操作,从测试结果中可以看出该模块的所有功能均能正常实现,且测试结果与预期结果一致。
6 结论和心得
结论:本次项目一通过使用java相关知识,实现了随机产生10道加减法运算的计算,随机猜数字游戏。并能够计算出相应的分数,写入文件中并生成排行榜,将排行榜输出。实现了题目要求,最终结果与预想结果一致。
心得:这次做项目,使我更加清楚地认识到自己所处的位置,经过这次后,我会更加严格要求自己,认真学好每一节课,决不放弃。哪怕每天只是一点点的进步,那也是我用努力换取来的,因此,在接下来的学习中,我会保持的学习态度,继续更加努力,争取尽早掌握自己欠缺的技能.这次项目我视为是一次自我检验自己掌握的程度,网上搜集信息(b站,百度)查漏补缺,不足的地方,更应该自己努力去解决,之后我将重新制定学习计划,恳请老师多多关注我,监督我,当我犯错误得时候帮我指出。