大连民族学院
计算机科学与工程学院实验报告
实验题目: 数据库编程
课程名称: Java语言
实验类型:□演示性 □验证性 □操作性 □设计性 █综合性
专业:软件工程 班级:102 学生姓名:杨腾飞 学号:2010082225
实验日期:20##年 12月10日 实验地点:多媒体机房(一)
实验学时:4 实验成绩:
指导教师签字: 20## 年 12月 21日
一、构建实验指导书中的student数据库表
Create table student(
Sno int primary key,
Sname varchar(20),
Sex varchar(20),
Sage varchar(20)
);
二、验证性实验程序的运行结果及理解
第一题的输出结果: 学号 姓名 性别 年龄
--------------------------------
7968, 赵小龙 , 男 , 20
解释: 因为程序向数据库插入了一条数据,然后又取出了这条数据所以输出的结果和插入的数据相同。
第二题的输出结果: 全体学生信息表
-------------------------------------------
学号 姓名 性别 年龄
-------------------------------------------
7968 赵小龙 男 20
1111 张三 男 18
解释: 第二行数据时执行程序的时候由用户输出的数据然后插入数据库的数据,然后程序输出了student表中的所有数据,所以会输出两行数据。
第三题的输出结果: 男学生信息表
------------------------------
学号 姓名 年龄
-----------------------------
7968 赵小龙 20
1111 张三 18
解释:程序让输入性别,然后按性别输出数据库中的数据,在输入性别后执行的sql语句就将对应程序中?处替换为用户输入的数据。
三、数据库应用程序的开发
1. 数据库设计
(1) 概念模型E-R图
(2) 数据库表设计
Student表设计
Class表设计
2. 程序功能模块
模块一:连接数据库模块
功能描述:此模块式专门用来连接数据库的,有关数据库的连接都写在了这个模块里,在对数据库进行增、删、改、查的时候,需要连接数据库是直接调用此模块即可。
模块二:增加学生信息
功能描述:实现对学生信息相关的各个信息的添加录入。同时该学生对应的班级的总人数自动增加1。
模块三:删除学生信息
功能描述:用户输入要删除的学生姓名,程序把该学生信息全部删除,同时返回删除成功信息。并且该学生对一个的班级总人数自动减少1。
模块四:修改学生信息
功能描述:用户输入要修改的学生姓名,程序找到该学生的信息,并提示用户输入要修改的信息,输入完成后程序更新数据库里的各字段值。
模块五:查找学生信息
功能描述:查找学生信息时可以按学号和姓名查找,用户输入要查找的学生,程序返回该学生的各个信息。
模块六:按班级或性别统计学生信息
功能描述:用户选择此功能时,程序会将数据库里的学生信息按班级或性别顺序输出。
模块七:增加班级信息
功能描述:实现对班级表的增加操作,用户可以制定班级名称和班级编号,班级总人数默认为0.
模块八:删除班级信息
功能描述:删除数据库表中已存在的班级,若该班级人数不为0,则不能删除。
模块九:修改班级信息
功能描述:可以对班级的信息进行修改,如班级的名称。
3. 程序的实现
整个程序的数据流程图
数据库连接实现过程
publicclass Connect {
String url = "jdbc:odbc:stu";
Connection con;
Connect(){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url, "", "");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这是连接数据库模块的代码,在每次进行操作前都会打开数据库,所以单独写成了一个类,在别的模块进行数据库操作时只需调用此模块即可。
由于每个模块的具体实现代码太长,就不在这里打印出来了,这里给出菜单选项的实现过程。
publicclass menu {
staticvoid Menu(){
System.out.print("------------学生信息管理系统-------------");
System.out.print("\n1.添加学生");
System.out.print("\n2.删除信息");
System.out.print("\n3.修改信息");
System.out.print("\n4.按学号查询信息");
System.out.print("\n5.按姓名查询信息");
System.out.print("\n6.按班级统计学生信息");
System.out.print("\n7.按性别统计学生信息");
System.out.print("\n8.班级管理");
System.out.print("\n0.退出\n");
System.out.print("请输入选择:");
}
publicstaticvoid main(String[] args) {
int select;
Scanner in=new Scanner(System.in);
Menu();
select=in.nextInt();
in.nextLine();
while(select!=0){
switch(select){
case 1:
Add ad=new Add();
ad.addToDB();
break;
case 2:
new Delete();
break;
case 3:
new Modify();
break;
case 4:
new Select_sno();
break;
case 5:
new Select_name();
break;
case 6:
new Display_class();
break;
case 7:
new Display_class();
break;
case 8:
new Manage_class();
break;
}
Menu();
select=in.nextInt();
in.nextLine();
}
}
}
四、实验总结
编程序时在用户选择序号时,程序会把输入的回车换行当做一个字符串处理,所以在用户输入一个int型数后,用户会没有输入字符串的机会,通过查看老师给的例子发现,在输入int后往往要在后面紧接着加上一行in.nextLine(),加上这句代码后程序的问题就解决了。
在编写插入学生信息模块时,要级联的操作数据库,也就是在student表插入一个数据行后,要同时将class表中学生对应的班级人数加1。同时在删除班级时,先查看班级的人数是否为0,如果不是0,则不能允许用户删除,因为student的class字段引用了班级里的class_no字段作为外码,删除后会造成学生信息的不完整。
通过这个实验,学会了用java连接数据库,而且感受到了用数据库存放数据的方便性,以前做学生信息管理系统都是用数组或链表存储学生信息,存入的信息不能保存,每次重新执行程序信息都会被清空,使用数据库后信息能够方便的保存和操作。
第二篇:JAVA实验报告
编号:
JAVA大学教程实验报告
院 系:计算机科学与工程学院
专 业: 计算机科学与技术
学生姓名: 方 遥
学 号: 1100310107
指导教师: 汪华登
20##年12月15日
实验一 Java开发环境及基本语法
一、实验目的
1、掌握常用的Java集成开发环境的使用,特别是Eclipse和NetBeans。
2、掌握Java基本语法,重点是面向对象的思想和语法。
3、掌握控制台下(应用程序)的输入输出方法,作为后续部分实验的基础。
二、实验类型
设计型。
三、实验内容
1、打开实验室计算机上的集成开发环境Eclipse或NetBeans(重点是Eclipse),掌握其基本使用方法。了解开发软件的各个菜单功能。会创建java项目(Project),会编辑和编译、运行项目代码。
2、验证和学习所给的几个例子程序及其讲解。然后自己编写一个至少由一个类构成的Java程序,其功能是在运行后,能接收用户输入一个学生的姓名以及java课的成绩(百分制),并输出对该学生成绩是否达到60分的及格分的判断(可使用if语句)。例如,输入学生姓名李明,然后输入成绩50,则输出“李明的成绩为不及格”。
3、编写一个程序来表示长方体的长宽高等数据并有计算体积的函数可供调用,长方体类从矩形类继承而来。程序运行时能接受输入任意的3 个数作为长方体的长、宽和高,然后能够输出所输入的长宽高及所计算出的体积。注意不能把代码全部写在main函数里面,不能直接输出长宽高的乘积。在解决该问题的程序设计中,将体积计算等功能封装成方法调用,长宽高等属性封装到矩形类和长方体类中,尽量多地用到接口的定义、类的定义、成员变量的定义、成员函数的定义、类的继承等面向对象的语法和知识点。在此基础上熟悉、理解和解释类的封装、继承等面向对象编程思想和概念。
四、预备知识
作为一门完全面向对象的程序设计语言,Java语言编写的所有程序都是由类(以及接口)构成的。所以我们需要重点掌握类的定义、修饰,对象的创建,类的继承,以及接口等面向对象语法知识。Java中没有模板、多继承、运算符重载等C++中比较复杂的语法部分,其面向对象语法相对简单。
大家此前一般学过C或C++语言等,那么请注意,由于Java是“完全”面向对象的语言,任何程序代码都是类或接口构成,所以请务必摒弃在C语言等的学习过程中形成的喜欢在main函数外部定义全局变量等习惯,因为这些做法在Java中将直接成为错误。Java程序都只由接口和(或)类构成,类中才可定义普通数据类型或复合数据类型的成员变量。对于初学面向对象程序设计的学习者而言,类看起来很复杂,实际上我们应该注意到:类只是由两种东西构成的,一种是成员变量,另一种是成员函数(或称成员方法)。对于Java程序而言,只有在成员函数中,才可以编写和存在具体的执行语句。而在Java程序的类中的成员函数中,就涉及到数据类型和循环语句等基本语法。
Java的基本语法与C语言是很接近的。同样有普通数据类型变量(在Java中包括整型、字符型、布尔型等)的定义,同样有if语句,if-else语句,switch语句,以及while循环,for循环,do-while循环。此处不单独举例,大家首先可在main函数中自己编写简单的代码对这些基本语法概念进行练习和验证。然后应用Java的面向对象语法,设计类和定义对象等,进行Java面向对象编程思想和语法的熟悉。
实验源代码1:
import java.util.Scanner;
publicclass Shiyan1_1 {
publicstaticvoid main(String[] args) {
// TODO 自动生成的方法存根
int score;
String name;
Scanner input=new Scanner(System.in) ;
System.out.println("请输入名字");
name=input.next();
System.out.println("请输入成绩");
score=input.nextInt();
Student s1=new Student(score,name);
s1.IfGreat();
input.close();
}
}
class Student
{
int score;
String name;
public Student(int s,String nam)
{
score=s;
name=nam;
}
publicvoid IfGreat()
{
if(score<60)
{
System.out.println(name+"的成绩为不及格!");
}
else System.out.println(name+"的成绩已及格!");
}
}
运行结果:
请输入名字
姚明
请输入成绩
65
姚明的成绩已及格!
实验源代码2:
import java.util.Scanner;
publicclass Shiyan1_2{
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
double l,w,h;
@SuppressWarnings("resource")
Scanner input=new Scanner(System.in);
System.out.println("请分别输入长方体的长宽高");
l=input.nextDouble();
w=input.nextDouble();
h=input.nextDouble();
Cft cft=new Cft(l,w,h);
cft.show();
}
}
class Jx
{
double l;//长
double w;//宽
public Jx(double a,double b)
{
l=a;
w=b;
}
}
class Cft extends Jx
{
double h;//高
public Cft(double a,double b,double c)
{
super(a,b);
h=c;
}
publicvoid show()
{
double v=l*w*h;
System.out.println("长方体的体积为:"+v);
}
}
运行结果:
请分别输入长方体的长宽高
21 23 52
长方体的体积为:25116.0
实验二 系统类和数组
一、实验目的
1、通过字符串处理类的应用,掌握系统类的使用方法。
2、掌握数组的定义和使用。
3、进一步掌握Java程序设计的基本过程和基本方法。
二、实验类型
设计型
三、实验内容
1、应用数组和字符串,编写一个用于统计学生成绩的程序,运行之后,首先能接受用户输入不超过10个学生的姓名和Java课的分数。输入结束之后,能输出这批学生的Java课最高分者和最低分者的姓名和分数。还能接受用户输入学生姓名来查询某学生的成绩,当姓名不存在时,向用户提示不存在该学生。
2、通过应用Java中常用的数组和字符串,编写一个简单的通讯录程序,来熟悉系统类和数组的应用。通讯录由多条记录构成。每条记录包括一个联系人的姓名、性别、电话、通信地址,并具有显示、查询、增加、修改、删除等功能,且每执行一次功能操作后,可以选择用类似以下的格式,输出通讯录的所有信息记录:
编号 姓名 性别 电话 通信地址
01 张三 男 123456 上海
02 李四 女 456789 桂林
可考虑用数组分别存储姓名,性别,电话,通信地址,那么显示、查询,增加、修改、删除操作就可转换为对数组元素的操作。通讯录中的所有记录的每一个字段可以采用一维或二维或其它类型数组来存放。请发挥自己的思考能力,用自己熟悉的或者觉得更合理的方式来设计程序解决问题,完成该实验。
四、预备知识
面向对象是Java语言的重要特点,所有Java程序都必须是完全面向对象的,需要一个或多个类来完成某一个任务。如果每次要完成什么项目,这些类都要重头开始全都由开发者设计,其工作量很可能是很大的,这显然不现实。在前面的实验里面,我们自己定义了一些类来构成程序(我们称之为用户自定义类),也用到了一些系统提供的类(即系统类)来封装数据和实现功能(例如使用字符串String类定义字符串对象)。实际上系统类是Java面向对象程序设计的基础,系统类贯穿到所有Java程序的设计之中。Java开发包中提供了非常多的系统类,而且除了Sun(现已并入Oracle)公司自己推出的标准开发包之外,很多其它公司或个人也开发了各种开发包用于在设计中的复用。这些包中的系统类有的是用于输入输出的,有的是用于网络程序设计的,有的是用于图形图像处理的,种类繁多,数量庞大,并被组织成很多个包来存放。对于非官方的开发包,我们需要在编译路径下导入。对于JDK本身提供的系统类,我们在具体需要用到它们的时候,只需要在程序的开头,用import关键字将其导入即可。常用的有 “Java.lang”包、”java.io”包、”java.util”包、”java.net”包、”java.awt”包、”java.applet”包等。大家可以打开JDK API帮助文档观察,其中就列出了几乎所有的包和类。
1、Java中数组的定义与使用
(1)先定义,方法是:类型说明符数组名[]; 或 类型说明符[] 数组名。
(2)然后再创建,方法是:数组名=new 类型说明符[数组元素的个数] 或数组名={初值表列};
也可以将上述两步合并为一步创建:类型说明符数组名[]={初值表列}; 或 类型说明符[] 数组名={初值表列};
注意Java中的数组可以是不规则的,即不一定是几行几列并且每行元素个数都一样多的。例如语句int[][] xx={{3,2,7},{1,5},{6}}; 所定义出来的数组结构如下图:
实验源代码1:
package shiyan;
import java.util.Scanner;
publicclass Shiyan2_1{
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
int n=0;
Student stu[]=new Student[10];
Scanner input=new Scanner(System.in);
System.out.println("要输入几个学生的成绩?");
n=input.nextInt();
// System.out.println("请分别输入第+(i+1)+个学生的姓名、成绩");
for(int i=0;i<n;i++)
{
System.out.println("请分别输入第"+(i+1)+"个学生的姓名、成绩");
String name=input.next();
int score=input.nextInt();
stu[i]=new Student(score,name);
}
System.out.println("**************************");
//judge(stu);
judge(stu,n);
System.out.println("**************************");
System.out.println("请输入要查找的名字");
String nam=input.next();
serch(stu,n,nam);
System.out.println("**************************");
input.close();
}
//输出最高分和最低分
publicstaticvoid judge(Student s[],int n)
{
int minIndex=0;
int maxIndex=0;
int min=s[0].score;
int max=s[0].score;
for(int i=1;i<n;i++)
{
if(min>s[i].score)
{
min=s[i].score;
minIndex=i;
}
if(max<s[i].score)
{
max=s[i].score;
maxIndex=i;
}
}
System.out.println("最高分的姓名:"+s[maxIndex].name+" 分数:"+s[maxIndex].score);
System.out.println("最低分的姓名:"+s[minIndex].name+" 分数:"+s[minIndex].score);
//System.out.println(minIndex);
}
//按名字查找
publicstaticvoid serch(Student s[],int n,String name)
{
for(int i=0;i<n;i++)
{
if(s[i].name.equals(name))
{
System.out.println("查找结果为:"+s[i].name+" "+s[i].score+"分");
return;
}
}
System.out.println("查无此人");
}
}
运行结果:
要输入几个学生的成绩?
3
请分别输入第1个学生的姓名、成绩
张三 65
请分别输入第2个学生的姓名、成绩
李四 56
请分别输入第3个学生的姓名、成绩
方遥 99
**************************
最高分的姓名:方遥 分数:99
最低分的姓名:李四 分数:56
**************************
请输入要查找的名字
方遥
查找结果为:方遥 99分
**************************
实验源代码2:
package shiyan;
import java.util.Scanner;
publicclass Shiyan2_2 {
finalstaticintN=10;
static Person ps[]=new Person[N];
static Scanner input=new Scanner(System.in);
publicstaticvoid main(String[] args) {
// TODO 自动生成的方法存根
input();
/*print();
search();
insert();
print();
delete();
print();
update();
print();*/
menu();
}
//菜单
publicstaticvoid menu()
{
System.out.println("========="
+ "\n请选择:\n1:查询 \n2:插入 \n3:删除 \n4:修改\n0:退出\n"
+ "=========");
int n=input.nextInt();
for(;;){
if(n==0){
System.out.println("已退出!");
break;
}
switch(n){
case 1:
search();
break;
case 2:
insert();
print();
break;
case 3:
delete();
print();
break;
case 4:
update();
print();
break;
}
System.out.println("========="
+ "\n请选择:\n1:查询 \n2:插入 \n3:删除 \n4:修改\n0:退出\n"
+ "=========");
n=input.nextInt();
}
}
//输入
publicstaticvoid input()
{
for(int i=0;i<ps.length;i++)ps[i]=new Person();//初始化对象数组
System.out.println("几个人");
int n=input.nextInt();
System.out.println("编号 姓名 性别 电话 地址");
for(int i=0;i<n;i++)
{
int no=input.nextInt();
String nam=input.next();
String sex=input.next();
int telNum=input.nextInt();
String add=input.next();
ps[i]=new Person(no, nam, sex, telNum, add);
}
}
//打印输出
publicstaticvoid print()
{
System.out.println("************************************");
System.out.println("编号\t姓名\t性别\t电话\t地址");
for(int i=0;i<ps.length;i++)
{
if(ps[i].no!=-1)
{
System.out.print(ps[i].no+"\t"+ps[i].name+"\t"+ps[i].sex+"\t"+ps[i].telNum+"\t"
+ps[i].address);
System.out.println();
}
}
System.out.println("************************************");
}
//按编号查询
publicstaticvoid search()
{
System.out.println("编号?");
int no=input.nextInt();
System.out.println("************************************");
System.out.println("查询结果");
for(int i=0;i<ps.length;i++)
{
if(ps[i].no==no)
{
System.out.println("编号\t姓名\t性别\t电话\t地址");
System.out.print(ps[i].no+"\t"+ps[i].name+"\t"+ps[i].sex+"\t"+ps[i].telNum+"\t"
+ps[i].address);
System.out.println();
System.out.println("************************************");
return;
}
}
System.out.println("查无此人");
System.out.println("************************************");
}
//插入
publicstaticvoid insert()
{
for(int i=0;i<ps.length;i++)
{
if(ps[i].no==-1)
{
System.out.println("编号 姓名 性别 电话 地址");
int no=input.nextInt();
String nam=input.next();
String sex=input.next();
int telNum=input.nextInt();
String add=input.next();
ps[i]=new Person(no, nam, sex, telNum, add);
return;
}
}
System.out.println("存储已满,无法添加");
}
//按编号删除
publicstaticvoid delete()
{
System.out.println("编号?");
int no=input.nextInt();
for(int i=0;i<ps.length;i++)
{
if(ps[i].no==no)
{
ps[i].no=-1;
ps[i]=new Person();
return;
}
}
System.out.println("查无此人");
}
//按编号修改
publicstaticvoid update()
{
System.out.println("编号?");
int no=input.nextInt();
for(int i=0;i<ps.length;i++)
{
if(ps[i].no==no)
{
System.out.println("编号 姓名 性别 电话 地址");
no=input.nextInt();
String nam=input.next();
String sex=input.next();
int telNum=input.nextInt();
String add=input.next();
ps[i]=new Person(no, nam, sex, telNum, add);
return;
}
}
System.out.println("查无此人");
}
}
class Person
{
int no; //编号
String name; //姓名
String sex; //性别
int telNum; //电话
String address;//通信地址
public Person()
{
this.no=-1;
}
public Person(int no,String name,String sex,int telNum,String address)
{
this.no=no;
this.name=name;
this.sex=sex;
this.telNum=telNum;
this.address=address;
}
}
运行结果:
几个人
3
编号 姓名 性别 电话 地址
1 张三 男 123 桂林
2 李四 男 456 南宁
3 王舞 女 789 北京
=========
请选择:
1:查询
2:插入
3:删除
4:修改
0:退出
=========
1
编号?
2
************************************
查询结果
编号 姓名 性别 电话 地址
2 李四 男 456 南宁
************************************
=========
请选择:
1:查询
2:插入
3:删除
4:修改
0:退出
=========
2
编号 姓名 性别 电话 地址
4 赵二 男 756 上海
************************************
编号 姓名 性别 电话 地址
1 张三 男 123 桂林
2 李四 男 456 南宁
3 王舞 女 789 北京
4 赵二 男 756 上海
************************************
=========
请选择:
1:查询
2:插入
3:删除
4:修改
0:退出
=========
3
编号?
1
************************************
编号 姓名 性别 电话 地址
2 李四 男 456 南宁
3 王舞 女 789 北京
4 赵二 男 756 上海
************************************
=========
请选择:
1:查询
2:插入
3:删除
4:修改
0:退出
=========
0
已退出!
实验三 图形界面程序的界面设计
一、实验目的
1、掌握Java图形界面程序设计的基本思想和步骤。
2、掌握JDK中AWT包和Swing包的基本使用方法和区别。
3、掌握容器和布局的概念和使用。
4、掌握图形界面程序的界面设计方法和步骤。
二、实验类型
设计型
三、实验内容
1、自己编写所有代码,设计一个程序的界面。该程序的功能要求是:运行之后,界面要求基本如左图所示。其中界面设计时的顶层容器要求使用JFrame(或Frame),界面上的“简易计算器”、“运算数一”、“运算数二”、“运算结果”这些提示标签使用组件JLabel(或Label),输入运算数和输出运算结果使用JTextField(或TextField),“相加”、“相减”和“全部清零”使用按钮JButton(或Button)。 请注意查阅JDK的API文档中这些相关的类,看看它们具有哪些构造函数可以用来生成所需的对象,它们具有哪些方法可以用来进行调用。注意保存好本次实验代码,下一次实验将会要求实现其事件处理以继续完善。
2、下面的左图和右图分别是windows系统中的标准型和科学型计算器的界面截图。打开你使用的微软公司Windows操作系统或Linux等其它操作系统中自带的“计算器”软件,观察和参照其界面和功能,实现一个接近其界面和功能的计算器(标准型或科学型)的界面。并保存好代码,在下一次实验中实现其事件处理(即运算功能)。
实验源代码:
import javax.swing.*;
import javax.swing.JFrame;
public class Shiyan3 {
JFrame jf=new JFrame("简易计算器");
JButton jb1=new JButton("相加");
JButton jb2=new JButton("相减");
JButton jb3=new JButton("清零");
JLabel jlable1=new JLabel("运算数一");
JLabel jlable2=new JLabel("运算数二");
JLabel jlable3=new JLabel("运算结果");
JTextField jtextf1=new JTextField(20);
JTextField jtextf2=new JTextField(20);
JTextField jtextf3=new JTextField(20);
//构造方法
public Shiyan3()
{
jf.setSize(300,400);
jf.setLayout(null);
jb1.setSize(60,30);
jb2.setSize(60,30);
jb3.setSize(60,30);
jb1.setLocation(70, 280);
jb2.setLocation(180, 280);
jb3.setLocation(125, 320);
jlable1.setSize(70, 30);
jlable2.setSize(70, 30);
jlable3.setSize(70, 30);
jlable1.setLocation(75,75);
jlable2.setLocation(75,125);
jlable3.setLocation(75,175);
jtextf1.setSize(90,30);
jtextf2.setSize(90,30);
jtextf3.setSize(90,30);
jtextf1.setLocation(155, 75);
jtextf2.setLocation(155, 125);
jtextf3.setLocation(155, 175);
jf.add(jlable1); jf.add(jlable2); jf.add(jlable3);
jf.add(jtextf1); jf.add(jtextf2); jf.add(jtextf3);
jf.add(jb1); jf.add(jb2); jf.add(jb3);
jf.setResizable(false);
jf.setLocation(600, 100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
//jf.pack();
}
public static void main(String[] args) {
new Shiyan3();
}
}
运行结果:
实验四 图形界面程序的事件处理
一、实验目的
1、掌握Java图形界面程序设计的基本思想和步骤。
2、掌握图形界面程序设计中键盘鼠标事件处理的机制。
3、了解常用的监听器接口及其方法和作用。
4、掌握图形界面程序设计中事件处理的方法和步骤。
二、实验类型
设计型
三、实验内容
1、在上一个实验(实验三)的第1题中,我们设计了一个简易计算器的界面。但仅仅要求设计出其界面,而没有要求进行事件处理。在本次实验中,请实现其事件处理。使得程序运行之后,当输入两个小数作为运算数后,点击“相加”或者“相减”按钮,两数相加或相减的结果就会显示在“运算结果”框中。 如果点击“全部清零”按钮,那么两个运算数输入框和运算结果框中就会完全被清空。
2、对于第1题,除了正常数据之外,用户还可能因为好奇或误操作导致这样几种情况: (1)1个或2个运算数均未输入;(2)输入的数据串中含有除小数点和数字之外的非法字符;(3)输入的数据串中不含有除小数点和数字之外的非法字符,但小数点的个数超过1个或小数点的位置在数据的开头或结尾处。 请改进你的程序,对这几种情况进行判断,不允许使用正则表达式或异常处理机制,完全使用字符串类的各种方法,对这几种输入情况得到的用户所输入的字符串进行分析判断,并在你的程序图形界面上向用户进行相应的提示。
3、在上一个实验(实验三)的第2题中,我们设计了一个仿Windows系统自带的计算器的界面。但仅仅要求设计出其界面,而没有要求进行事件处理。在本次实验中,请实现其事件处理。使得程序运行之后,各项主要运算功能能良好运行。请自己输入数据进行测试。并尽量实现对非法数据的判断和处理。
实验源代码:
import javax.swing.*;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Shiyan4{
JFrame jf=new JFrame("简易计算器");
JButton jb1=new JButton("相加");
JButton jb2=new JButton("相减");
JButton jb3=new JButton("清零");
JLabel jlable1=new JLabel("运算数一");
JLabel jlable2=new JLabel("运算数二");
JLabel jlable3=new JLabel("运算结果");
JLabel jlable4=new JLabel("简易计算器");
JTextField jtextf1=new JTextField(20);
JTextField jtextf2=new JTextField(20);
JTextField jtextf3=new JTextField(20);
//构造方法
public Shiyan4()
{
jf.setSize(300,400);
jf.setLayout(null);
jb1.setSize(60,30);
jb2.setSize(60,30);
jb3.setSize(60,30);
jb1.setLocation(70, 280);
jb2.setLocation(180, 280);
jb3.setLocation(125, 320);
jlable1.setSize(70, 30);
jlable2.setSize(70, 30);
jlable3.setSize(70, 30);
jlable4.setSize(80,30);
jlable1.setLocation(75,75);
jlable2.setLocation(75,125);
jlable3.setLocation(75,175);
jlable4.setLocation(120, 20);
jtextf1.setSize(90,30);
jtextf2.setSize(90,30);
jtextf3.setSize(90,30);
jtextf1.setLocation(155, 75);
jtextf2.setLocation(155, 125);
jtextf3.setLocation(155, 175);
jtextf3.setEditable(false);//设为不可编辑
jb1.addActionListener(new BtEvent1(jtextf1, jtextf2,jtextf3));
jb2.addActionListener(new BtEvent2(jtextf1, jtextf2,jtextf3));
jb3.addActionListener(new BtEvent3(jtextf1, jtextf2,jtextf3));
jf.add(jlable1);
jf.add(jlable2);
jf.add(jlable3);
jf.add(jlable4);
jf.add(jtextf1);
jf.add(jtextf2);
jf.add(jtextf3);
jf.add(jb1);
jf.add(jb2);
jf.add(jb3);
//jf.add(jtextf1);
jf.setResizable(false);
jf.setLocation(600, 100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
//jf.pack();
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Shiyan4();
}
//判断是否为数字
public static boolean isNUM(String s)
{
int count=0;
char ch=s.charAt(0);
if(ch=='-'||(ch>='0'&ch<'9'))
{
for(int i=1;i<s.length();i++)
{
ch=s.charAt(i);
if(!Character.isDigit(ch)&ch!='.')return false;
if(ch=='.')count++;
}
if(count<2&ch!='.')return true;
}
// System.out.println(count);
return false;
}
}
//相加
class BtEvent1 implements ActionListener
{
JTextField jt1=null;
JTextField jt2=null;
JTextField jt3=null;
public BtEvent1(JTextField jtf1,JTextField jtf2,JTextField jtf3) {
// TODO 自动生成的构造函数存根
jt1=jtf1;
jt2=jtf2;
jt3=jtf3;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
String s1=jt1.getText();
String s2=jt2.getText();
if(s1.equals("")||s2.equals(""))
JOptionPane.showMessageDialog(null, "必须为数字请重新输入");
else if(!Shiyan4.isNUM(s1)||!Shiyan4.isNUM(s2))
JOptionPane.showMessageDialog(null, "必须为数字请重新输入");
else{
double x=Double.parseDouble(s1);
double y=Double.parseDouble(s2);
jt3.setText(Double.toString(x+y));
}
}
}
//相减
class BtEvent2 implements ActionListener
{
JTextField jt1=null;
JTextField jt2=null;
JTextField jt3=null;
public BtEvent2(JTextField jtf1,JTextField jtf2,JTextField jtf3) {
// TODO 自动生成的构造函数存根
jt1=jtf1;
jt2=jtf2;
jt3=jtf3;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
String s1=jt1.getText();
String s2=jt2.getText();
if(s1.equals("")||s2.equals(""))
JOptionPane.showMessageDialog(null, "必须为数字请重新输入");
else if(!Shiyan4.isNUM(s1)||!Shiyan4.isNUM(s2))
JOptionPane.showMessageDialog(null, "必须为数字请重新输入");
else{
double x=Double.parseDouble(s1);
double y=Double.parseDouble(s2);
//jt3.setText(Double.toString(x-y));
jt3.setText(String.valueOf(x-y));
}
}
}
//清零
class BtEvent3 implements ActionListener
{
JTextField jt1=null;
JTextField jt2=null;
JTextField jt3=null;
public BtEvent3(JTextField jtf1,JTextField jtf2,JTextField jtf3) {
// TODO 自动生成的构造函数存根
jt1=jtf1;
jt2=jtf2;
jt3=jtf3;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
jt1.setText("");
jt2.setText("");
jt3.setText("");
}
}
运行结果:
实验五 异常
一、实验目的
1、掌握异常的概念、作用、分类和进行异常处理的语法结构。
2、了解系统异常类的体系和系统定义的常见标准异常。
3、掌握用户自定义异常类的定义和抛出异常的方法。
4、通过掌握异常来分析调试程序的编译错误和编写更健壮的程序。
二、实验类型
设计型
三、实验内容
1、标准异常:设计一个程序,使得其运行时,可以接受用户输入若干个整数并依次存入数组中,不限定输入数的个数,使得在输入数的个数超过数组的实际大小时产生数组下标越界异常(ArrayIndexOutOfBoundsException)。程序代码中“不需要”对异常进行捕获处理,观察异常产生时程序运行是否被中断,编译器产生了怎样的提示。
2、自定义异常:设计一个新的程序或者完善题目1的程序,使得其运行时,可以接受用户输入若干个数并依次存入数组中。要求用户输入的整数必须大于0小于100。如果不符合这个范围则抛出异常。请自定义一个异常类来表示这种情况,并在用户的输入不符合要求时抛出该异常。
实验源代码:
import java.util.Scanner;
//自定义异常类
classmyExceptionextends Exception
{
public myException()
{
System.out.println("输入错误,输入范围0-100");
}
}
publicclass Shiyan5_2 {
publicstaticboolean even(int num)throws myException{
if(num<100&num>0)
returntrue;
else {
myException myE=new myException();
throw myE;
}
}
publicstaticvoid main(String[] args) {
Scanner input=new Scanner(System.in) ;
int a[]=newint[5];
System.out.println("依次输入"+a.length+"个整数!");
try{
for(int i=0;i<a.length;i++)
even( a[i]=input.nextInt() );
System.out.println("successfully input!");
}
catch(myException e){
//e.printStackTrace();
System.out.println("产生异常的名称为:"+e.toString());
}
}
}
运行结果:
依次输入5个整数!
12
65
56
321
输入错误,输入范围0-100
产生异常的名称为:shiyan.myException