目 录
1 选题 2
2 系统需求分析 3
2.1 系统可行性分析 3
2.2 系统需求分析 3
2.3 进度安排 4
3 系统设计 4
3.1 系统设计 4
4 系统实现 15
5 系统测试 18
6 结论和心得 19
选题一 |
算术运算测试 |
题目要求 |
|
实现十道100以内加减法数学题,能根据题目计算出答案,与输入答案对比,判断做题是否正确,最后计算出分数,添加排行榜功能存放到文件或数据库中。
|
|
使用Java知识 |
|
Java基本输入输出 获取当前时间System.currentTimeMillis() 一维数组 Random类 for循环 if-else选择分支 冒泡排序 writer类 异常try-catch-finally
|
|
选题二 |
简易计算器模拟程序 |
题目要求 |
|
仿照 Windows 计算器,编写一个具有 GUI 的计算器,能实现整数的 加、减、乘、除四则运算,更漂亮界面、更方便的操作、支持解析四则运算表达式、支持对大数的加减法,历次计算需存放在文件或数据库中。
|
|
使用Java知识 |
|
继承extends 实现接口implements GUI for循环 选择分支结构 数组 字符串类(StringBuffer) 异常try-catch
|
技术可行性:
算术运算测试:(1)生成随机数,进行加减法运算
(2)两个数组分别存每个人的分数和答题时间
(3)冒泡排序实现成绩排行榜功能
(4)文件管理
简易计算器模拟程序:(1)GUI图形用户界面
(2)addActionListener监听
(3)实现JButton按钮的功能
(4)文件管理
操作可行性:
只需要用户有一台计算机安装好IDE和MySQL操作环境,因此在操作上是可行的。
算术运算测试:
实现十道100以内加减法数学题,能根据题目计算出答案,与输入答案对比,判断做题是否正确,最后计算分数,实现排行榜功能,并将成绩排行榜保存到文件。
简易计算器模拟程序:
仿照 Windows 计算器,编写一个具有 GUI 的计算器,能实现整数的 加、减、乘、除四则运算,更漂亮的界面、更方便的操作、支持对大数的加减法、能将历史计算结果保存到文件,还可以实现阶乘,开根号,平方,返回上一步等功能按钮。
阶段一进度安排如表3-1所示。
表3-1 进度安排表
阶段 |
持续时间 |
阶段描述 |
输出 |
构思阶段 |
1小时 |
需求分析 |
需求说明,功能模块图 |
设计阶段 |
30分钟 |
系统设计 |
设计说明-可以画流程图;数据库设计 |
实现阶段 |
1天 |
编写代码 |
项目工程源代码 |
1小时 |
系统测试 |
进行黑盒测试(功能测试)-测试说明 |
|
运行阶段 |
4小时 |
部署、运行 |
系统使用说明、运维报告、录制视频 |
项目一:算术运算测试:
package com.tianshi.design;
/*
*实现十道 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 MathQue {
public static void main(String[] args) {
int i,j;
int[] a1 = new int[2]; //存分数
long[] b1 = new long[2]; //存所用时间
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); //c==0执行加法,c==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] = 10*count;
b1[i-1] = time;
System.out.println("第"+i+"位同学答题情况:");
System.out.println("共答对"+count+"道题,得分为:"+(10*count)+" ,用时"+time+"秒");
}
//实现成绩排行榜
for(int x=0;x<a1.length-1;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 = b1[y];
b1[y] = b1[y+1];
b1[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(b1[x]>b1[y]) {
long temp = b1[x];
b1[x] = b1[y];
b1[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]/10)+"\t "+a1[z]+"\t "+b1[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 z=0;z<a1.length;z++) {
f.write(" "+(z+1)+"\t "+(a1[z]/10)+"\t "+a1[z]+"\t "+b1[z]);
f.newLine();
}
System.out.println("成绩排行榜已保存!");
f.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
f.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
项目二:简易计算器模拟程序:
package com.gui.test;
/*
* 实现简易计算器:编写一个具有 GUI 的计算器,能实现整数的 加、减、乘、除四则运算
* 历次计算需存放在文件或数据库中
*/
import javax.swing.*;
import javax.swing.JTextField;
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.awt.Color;
public class CalculatorInterface extends JFrame implements ActionListener {
//new两个面板
private JPanel p1 = new JPanel();
private JPanel p2 = new JPanel();
//文本框
private JTextField t1;
private JTextField t2;
private JLabel label; //标签
StringBuffer str;
double x,y;
int z;
private JButton b[] = new JButton[18]; //按钮
private JButton b1,b2,b3,b4,b5,b6,b7,b8;
public CalculatorInterface() {
super("简易计算器");
setBackground(Color.WHITE);
getContentPane().setBackground(Color.DARK_GRAY);
getContentPane().setForeground(Color.BLACK);
Container c = getContentPane(); //容器初始化
t1 = new JTextField(30);
t1.setEditable(false); //文本框不能被编辑
t2 = new JTextField(30);
t2.setEditable(false);
label = new JLabel("董琼林设计的计算器");
label.setForeground(Color.black);
str=new StringBuffer();
p2.add(label);
p2.add(t2);
p2.add(t1);
//setLayout()设置页面当前布局,GridLayout(3,1):3行1列
p2.setLayout(new GridLayout(3,1));
for(int i=0;i<10;i++) {
String s=""+i;
b[i]= new JButton(s);
b[i].addActionListener(this); //监听
}
b[10]= new JButton("-/+"); b[11]= new JButton(".");
b1= new JButton("/"); b2= new JButton("Back");
b3= new JButton("*"); b4= new JButton("C");
b5= new JButton("+"); b6= new JButton("Sqrt");
b7= new JButton("-"); b8= new JButton("=");
b[13]= new JButton("e"); b[12]= new JButton("%");
b[14] = new JButton("n!"); b[15]= new JButton("10^");
b[16]= new JButton("^");
for(int i=0;i<=16;i++) {
b[i].setForeground(Color.black);
}
b1.setForeground(Color.RED); b3.setForeground(Color.RED);
b5.setForeground(Color.RED); b7.setForeground(Color.RED);
b2.setForeground(Color.BLACK); b4.setForeground(Color.BLACK);
b6.setForeground(Color.BLACK); b8.setForeground(Color.BLACK);
p1.add(b[7]); p1.add(b[8]); p1.add(b[9]); p1.add(b1); p1.add(b2);
p1.add(b[4]); p1.add(b[5]); p1.add(b[6]); p1.add(b3); p1.add(b4);
p1.add(b[1]); p1.add(b[2]); p1.add(b[3]); p1.add(b5); p1.add(b6);
p1.add(b[0]); p1.add(b[10]); p1.add(b[11]);p1.add(b7);p1.add(b[12]);
p1.add(b[15]);p1.add(b[13]);p1.add(b[14]);p1.add(b[16]);p1.add(b8);
//5行5列,行间距8,列间距8
p1.setLayout(new GridLayout(5,5,8,8));
b[16].addActionListener(this);
b[14].addActionListener(this); b[15].addActionListener(this);
b[12].addActionListener(this); b[13].addActionListener(this);
b[10].addActionListener(this); b[11].addActionListener(this);
b1.addActionListener(this); b2.addActionListener(this);
b3.addActionListener(this); b4.addActionListener(this);
b5.addActionListener(this); b6.addActionListener(this);
b7.addActionListener(this); b8.addActionListener(this);
c.add(p2);
c.add(p1);
c.setLayout(new FlowLayout()); //流布局
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //单击窗口的关闭按钮时程序执行的操作
setVisible(true); //设置窗体可见
setResizable(false); //设置窗体是否可以调整大小
setSize(420,350); //设置窗体的大小为420*350像素大小
}
public static void main(String[] args) {
CalculatorInterface f = new CalculatorInterface();
}
public void actionPerformed(ActionEvent e) {
try
{
if(e.getSource()==b4) //清空c
{
t1.setText("0"); //显示文字的属性setText(String s)
t1.setHorizontalAlignment(JTextField.RIGHT); //设置对齐方式,向右对齐
str.setLength(0);
}
else if(e.getSource()==b[10]) //变为负数
{
x=Double.parseDouble(t1.getText().trim());
t1.setText(""+(-x));
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else if (e.getSource()==b5) //加法
{
x=Double.parseDouble(t1.getText().trim());
str.setLength(0);
y=0d;
z=0;
}
else if(e.getSource()==b7) //减法
{
x=Double.parseDouble(t1.getText().trim());
str.setLength(0);
y=0d; //这个数字类型是double
z=1;
}
else if(e.getSource()==b3) //乘法
{
x=Double.parseDouble(t1.getText().trim());
str.setLength(0);
y=0d;
z=2;
}
else if(e.getSource()==b1) //除法
{
x=Double.parseDouble(t1.getText().trim());
str.setLength(0);
y=0d;
z=3;
}
else if(e.getSource()==b8)
{
str.setLength(0);
switch(z)
{
case 0: t1.setText(""+(x+y)); t1.setHorizontalAlignment(JTextField.RIGHT);break;
case 1: t1.setText(""+(x-y)); t1.setHorizontalAlignment(JTextField.RIGHT);break;
case 2: t1.setText(""+(x*y)); t1.setHorizontalAlignment(JTextField.RIGHT);break;
case 3: t1.setText(""+(x/y)); t1.setHorizontalAlignment(JTextField.RIGHT);break;
}
//将四则运算的计算结果保存到文件
Writer s = null;
BufferedWriter f = null;
try {
s = new FileWriter("d:\\历史计算结果.txt",true);
f = new BufferedWriter(s);
switch(z)
{
case 0: f.write(x+"+"+y+"="+t1.getText().trim()); break;
case 1: f.write(x+"-"+y+"="+t1.getText().trim()); break;
case 2: f.write(x+"*"+y+"="+t1.getText().trim()); break;
case 3: f.write(x+"/"+y+"="+t1.getText().trim()); break;
}
f.newLine();
f.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
else if(e.getSource()==b[12]) { //%
x=Double.parseDouble(t1.getText().trim());
t1.setText(""+(x*0.01));
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else if(e.getSource()==b[13]) { //e
t1.setText(""+2.71828182845);
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else if(e.getSource()==b[14]) { //阶乘
x=Double.parseDouble(t1.getText().trim());
double sum=1;
if(x==0) {
sum = 0;
}
for(double i=1;i<=x;i++) {
sum = sum*i;
}
t1.setText(""+(sum));
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else if(e.getSource()==b[15]) { //10^
x=Double.parseDouble(t1.getText().trim());
double sum=10;
if(x==0) {
sum = 1;
}
for(double i=1;i<x;i++) {
sum = sum*10;
}
t1.setText(""+(sum));
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else if(e.getSource()==b[16]) { //平方
x=Double.parseDouble(t1.getText().trim());
t1.setText(""+(x*x));
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else if(e.getSource()==b[11]) //.
{
if(t1.getText().trim().indexOf(‘.‘)!=-1)
{
}
else
{
if(t1.getText().trim().equals("0"))
{
t1.setText(str.append(e.getActionCommand()).toString());
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else if(t1.getText().trim().equals(""))
{}
else
{
t1.setText(str.append(e.getActionCommand()).toString());
t1.setHorizontalAlignment(JTextField.RIGHT);
}
}
y=0d;
}
else if(e.getSource()==b6) //开根号
{
x=Double.parseDouble(t1.getText().trim());
if(x<0)
{
t1.setText("数字格式异常");
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else
{
t1.setText(""+Math.sqrt(x));
t1.setHorizontalAlignment(JTextField.RIGHT);
}
str.setLength(0);
y=0d;
}
else
{
if(e.getSource()==b[0])
{
if(t1.getText().trim().equals("0"))
{}
else
t1.setText(str.append(e.getActionCommand()).toString());
t1.setHorizontalAlignment(JTextField.RIGHT);
y=Double.parseDouble(t1.getText().trim());
}
else if (e.getSource()==b2) //返回上一步Back
{
if(!t1.getText().trim().equals("0"))
{
if(str.length()!=1)
{
t1.setText(str.delete(str.length()-1,str.length()).toString());
t1.setHorizontalAlignment(JTextField.RIGHT);
}
else
{
t1.setText("0"); t1.setHorizontalAlignment(JTextField.RIGHT);
str.setLength(0);
}
}
y=Double.parseDouble(t1.getText().trim());
}
else
{
t1.setText(str.append(e.getActionCommand()).toString());
t1.setHorizontalAlignment(JTextField.RIGHT);
y=Double.parseDouble(t1.getText().trim());
}
}
}
catch(NumberFormatException e1){ t1.setText("数字格式异常");
t1.setHorizontalAlignment(JTextField.RIGHT); }
catch(StringIndexOutOfBoundsException e1){t1.setText("字符串索引越界");
t1.setHorizontalAlignment(JTextField.RIGHT);}
}
}
4.1:算术运算测试
4.2:简易计算器模拟程序
5.1:算术运算测试
5.2:简易计算器模拟程序
表6-1 简易计算机测试表
编号 |
测试功能 |
输入描述 |
预期结果 |
运行结果 |
HP01 |
数字按钮的测试 |
输入一个或多个0-9的数字 |
显示的是输入的数字 |
正常,与预期结果一致 |
HP02 |
运算符号按钮的测试 |
输入+ - * /中的运算符 |
/ 中当除数为0时,会提示错误,其他运算符结果正常 |
正常,与预期结果一致 |
HP03 |
功能按钮的测试 |
点击n! 10^ sqrt ^ %等按钮 |
显示的是运算后的最终结果 |
正常,与预期结果一致 |
通过本次阶段一的实验,让我了解了GUI图形界面设计的一些知识,还有巩固了之前学过的java基础知识,让之前原本模糊的知识更加清晰明了,在实际编程过程中,我也遇到了各种各样的错误,这也多亏了老师的指点和班级同学的帮忙,使我一步步克服了编程过程中遇到的困难。虽然我所写的程序并没有实现所有功能,但是我觉得自己进步了,很多原来都不懂的东西现在都已经了解了。
还让我明白了在拿到一个需求时,不是立刻就写代码,而是先分析需求,有什么样的功能,怎么去实现,思考思路,画流程图等等,弄好了这些,才能开始写代码,最后还要进行多次测试。
我认为学知识不能凭自己的爱好和一时兴趣,要一步一个脚印,认认真真,踏踏实实,理论与实践相结合,在扎实掌握课本实例和内容之后,有一定的扩展阅读和课外学习,充分全面的了解JAVA的应用和扩展运用,多动手,提高自己的编程能力。
原文:https://www.cnblogs.com/dqlcool/p/13205429.html