西电计算机Java上机实验报告参考模板
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安电子科技大学
Java课程上机练习题
(2016年度)
上
机
报
告
班级:
姓名:
学号:
一、J ava语言基础
1、实验目标:
掌握Java语法;掌握Java程序结构;掌握Java编译、调试、运行的方法。
2、实验要求:
编写一个程序,程序提供两种功能:
(1)用户输入一个整数,程序计算并输出从1开始到该整数的所有整数之和;同时,计算并输出不大于该整数的所有素数的数目。
(2)用户输入一个数字串,程序判断该数字串各位上数字的奇偶性,并分别输出奇、偶数位的计数值及各位的加和值。
3、题目分析:
判断整数是素数要构建一个测试类,然后统计是素数的个数;数字串需要判断每位的数字的奇偶性,则要将数字串转化为数组的形式,然后进行奇偶判断,进行统计。
4、题目设计实现:
分别设计判断素数、整数求和、格式转变、判断奇偶性、各位求和的函数。
5、实现过程:
//判断一个数是否是素数
public static boolean isPrime(int a){
boolean flag = true;
if(a<2)
return false;
else
for(int i = 2;i<=Math.sqrt(a);i++){
if(a%i == 0)
flag = false;
}
return flag;
}
//在main函数计算求和及判断
public static void main(String []args){
int sum=0,j=0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数计算他的和");
int num = sc.nextInt();
for(int i=1;i<=num;i++){
sum = sum + i;
if(isPrime(i))
j++;
}
System.out.println("这个数的和为"+sum+"\n素数有"+j+"个");
//输入一个字符串并转化为数字存放到数组中
public static void main(String[] args){
System.out.println("请输入一串数字串");
Scanner scan = new Scanner(System.in);
String line = scan.next();
int odd=0,even=0,sumo=0,sume=0;
char[] c = line.toCharArray();
//求和
for(int i = 0; i<line.length(); i++){
if((int)c[i]%2 == 0){
even++;
sume = sume +(int)c[i]-48;
}
else{
sumo = sumo +(int)c[i]-48;
odd++;
}
}
System.out.println("奇数共有"+odd+"个\n"+"奇数和为"+sumo);
System.out.println("偶数共有"+even+"个\n"+"偶数和为"+sume);
}
6、实验结果:
7、个人总结:
通过这次基础练习,对Java的各种规范和函数调用有了一定的熟悉,因为之前的编过类似的,所以用Java上手没有很陌生,算是一个很好的入门基础。
8、源代码:
1.整数
import java.util.Scanner;
public class test {
public static void main(String []args){
int sum=0,j=0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数计算他的和");
int num = sc.nextInt();
//System.out.println("hello world!");
for(int i=1;i<=num;i++){
sum = sum + i;
if(isPrime(i))
j++;
}
System.out.println("这个数的和为"+sum+"\n素数有"+j+"个");
sc.close();
}
public static boolean isPrime(int a){
boolean flag = true;
if(a<2)
return false;
else
for(int i = 2;i<=Math.sqrt(a);i++){
if(a%i == 0)
flag = false;
}
return flag;
}
}
2.数字串
import java.util.Scanner;
public class test {
public static void main(String[] args){
System.out.println("请输入一串数字串");
Scanner scan = new Scanner(System.in);
String line = scan.next();
int odd=0,even=0,sumo=0,sume=0;
char[] c = line.toCharArray();
//System.out.println((int)c[0]);
for(int i = 0; i<line.length(); i++){
if((int)c[i]%2 == 0){
even++;
sume = sume +(int)c[i]-48;
}
else{
sumo = sumo +(int)c[i]-48;
odd++;
}
}
System.out.println("奇数共有"+odd+"个\n"+"奇数和为"+sumo);
System.out.println("偶数共有"+even+"个\n"+"偶数和为"+sume);
scan.close();
}
}
二、Java的面向对象特性
1、实验目标:
掌握面向对象的编程方法;掌握Java的面向对象特性;掌握采用面向对象技术构建系统的一般方法。
2、实验要求:
编写一个程序,程序提供对图形的绘制功能(模拟绘制,采用文本输出的形式表现绘制内容):
1.构建所有图形的父类:Shape,该类中定义图形的基本属性及方法。
2.构建基本图形类:矩形(Rectangle)、圆(Circle)、正三角形(Triangle)。
3.可通过多态实现对任意图形的绘制。
//上塑型
4.定义静态方法,该方法可以对传入的对象实例进行判断,并输出该对象实例的类型。
//输入输出
5.定义静态方法,该方法可以输出传入的对象实例的中心点坐标。
6.构建测试类,该类实现与用户的交互,向用户提示操作信息,并接收用户的操作请求。
//用户输入画的图形
3、题目分析:
首先需要构建一个关于图形的类,然后要构建三个特殊的子类,使用继承的思想,实现对图形得绘制和实现
4、题目设计实现:
设计父类,和子类,然后能对输出的类进行判断和选择,并且定义它的中心坐标
5、实现过程:
//定义父类及它的方法
public class Shape{
int length=0;
int wide=0;
int line=0;
int list=0;
public Shape()
{
}
public Shape(int line,int list)
{
this.line = line;
this.list = list;
}
public void draw()
{
System.out.println("draw");
}
}
//定义三个子类
//矩形
class Rectangle extends Shape{
public Rectangle(){
super(3,3);
}
public void draw(){
System.out.println("draw a rectangle");
}
}
//圆
class Circle extends Shape{
public Circle(){
super(4,2);
}
public void draw(){
System.out.println("draw a Circle");
}
}
//三角
class Triangle extends Shape{
public Triangle(){
super(1,3);
}
public void draw(){
System.out.println("draw a Triangle");
}
}
//输出类的定义
class printData{
static void printClass(Object obj){
System.out.println("the class of the Shape is:"+obj.getClass());
}//输出类名
static void printrank(Shape str){
System.out.println("the coordinate of the centre is:x:"+str.line+" y:"+str.list);
}//输出中心点坐标
}
//main函数中进行交互和判断
public static void main(String[] args){
int num=-1;
Scanner sr = new Scanner(System.in);
//交互选择
while(num!=3){
System.out.println("please input the number of the shape you want");
System.out.println("0:Rectangle 1:Circle 2:Triangle 3:exit");
num = sr.nextInt();
Shape s = new Shape();
switch(num)
{
case 0:
{
s = new Rectangle();//向上转型
s.draw();
printData.printClass(s);
printData.printrank(s);
break;
}
case 1:
{
s = new Circle();
s.draw();
printData.printClass(s);
printData.printrank(s);
break;
}
case 2:
{
s = new Triangle();
s.draw();
printData.printClass(s);
printData.printrank(s);
break;
}
case 3:break;
default:
System.out.println("it's wrong!");
break;
}
}
System.out.println("you have exit");
sr.close();
}
6、实验结果:
7、个人总结:
通过这次作业,学会了Java继承的基础用法,并在定义中使用静态方法和重构等一些用法来实现转型,可能是用的不熟,过程中出现了大量的错误,经过几次修改终于做了出来,收获很大。
8、源代码:
import java.util.Scanner;
public class Shape{
int length=0;
int wide=0;
int line=0;
int list=0;
public Shape()
{
}
public Shape(int line,int list)
{
this.line = line;
this.list = list;
}
public void draw()
{
System.out.println("draw");
}
}
class Rectangle extends Shape{
public Rectangle()
{
super(3,3);
}
public void draw()
{
System.out.println("draw a rectangle");
}
}
class Circle extends Shape{
public Circle()
{
super(4,2);
}
public void draw()
{
System.out.println("draw a Circle");
}
}
class Triangle extends Shape{
public Triangle()
{
super(1,3);
}
public void draw()
{
System.out.println("draw a Triangle");
}
}
class printData{
static void printClass(Object obj){
System.out.println("the class of the Shape is:"+obj.getClass());
}
static void printrank(Shape str){
System.out.println("the coordinate of the centre is:x:"+str.line+" y:"+str.list);
}
}
class TestShape{
public static void main(String[] args){
int num=-1;
Scanner sr = new Scanner(System.in);
while(num!=3){
System.out.println("please input the number of the shape you want");
System.out.println("0:Rectangle 1:Circle 2:Triangle 3:exit");
num = sr.nextInt();
Shape s = new Shape();
switch(num)
{
case 0:
{
s = new Rectangle();//向上转型
s.draw();
printData.printClass(s);
printData.printrank(s);
break;
}
case 1:
{
s = new Circle();
s.draw();
printData.printClass(s);
printData.printrank(s);
break;
}
case 2:
{
s = new Triangle();
s.draw();
printData.printClass(s);
printData.printrank(s);
break;
}
case 3:break;
default:
System.out.println("it's wrong!");
break;
}
}
System.out.println("you have exit");
sr.close();
}
}
三、Java的高级语言特征
1、实验目标:
熟悉Java的泛型;了解Java的泛型特点;初步掌握Java的泛型编程方法。
2、实验要求:
编写一个程序,程序提供记事本功能:
1.构建记事本类,该类能存储不定数量的记录;能获得已经存储的记录数量;能追加记录;能展示已经存储的全部记录或其中任何一条记录;能删除已经存储的全部记
录或其中任何一条记录。
2.构建测试类,该类实现与用户的交互,向用户提示操作信息,并接收用户的操作请求。
3、题目分析:
构建一个记事本类,要存储不定量的记录,需要用链表数组存放,利用链表数组的功能可以查询、添加、显示、删除记录。
进行与用户交互,建立测试类。
4、题目设计实现:
记事本类,用泛型ArrayList,建立测试类isTest(),进行与用户交互,再构建一个显示类showText()和删除类deleteText()。
5、实现过程:
static ArrayList<String> diaryText = new ArrayList<String>();//引用泛型
//建立显示类,显示选择的记录
public static void showText(ArrayList<String> list,int n){
if(list.isEmpty())
System.out.println("尚无记录\n");
else{
if(n==0)
for(int j=0; j < list.size(); j++)
System.out.println((j+1)+":"+diaryText.get(j));
else if(n>0&&n<=list.size())
System.out.println(n+":"+diaryText.get(n-1));
else
System.out.println("输入错误,请重新输入\n");
}
}
//建立删除类,删除选择的记录
public static void deleteText(ArrayList<String> list,int n){ if(list.isEmpty())
System.out.println("尚无记录\n");
else{
if(n==0){
list.clear();
System.out.println("已清除全部记录\n");
}
else if(n>0&&n<=list.size()){
list.remove(n-1);
System.out.println("已删除第"+n+"条数据\n");
}
else
System.out.println("输入错误,请重新输入\n");
}
}
//建立测试类,与用户进行交互
public static void isTest(){
int num=0,i=0;
String str;
Scanner input = new Scanner(System.in);
System.out.println("记事本功能");
System.out.println("请输入想要执行的功能");
while(true){
System.out.println("1——记事");
System.out.println("2——已记录数");
System.out.println("3——追加记录");
System.out.println("4——显示已存储记录(0为全部记录)");
System.out.println("5——删除记录(0为全部记录)");
System.out.println("6——退出");
num = input.nextInt();
if(num==6){
System.out.println("您已退出程序\n");
input.close();
System.exit(0);
}
else switch(num){
case 1:{
System.out.println("请输入内容");
input.nextLine();
str = input.nextLine();
diaryText.add(str);
System.out.println("已保存\n");
break;
}
case 2:{
System.out.println("已记录数为:"+diaryText.size()+"\n");
break;
}
case 3:{
System.out.println("请输入修改的记录号");
i = input.nextInt();
System.out.println("请输入修改内容");
input.nextLine();
str =input.nextLine();
diaryText.set(i-1, str);
System.out.println("已修改\n");
break;
}
case 4:{
System.out.println("请输入要显示第几条的内容");
i = input.nextInt();
showText(diaryText,i);
break;
}
case 5:{
System.out.println("请输入要删除第几条的内容");
i = input.nextInt();
deleteText(diaryText,i);
break;
}
default:{
System.out.println("输入错误,请重新输入!\n");
break;
}
}
}
}
6、实验结果:
1——记事2——已记录数3——追加记录
4——显示已存储记录5——删除记录6——退出
(0为全部记录)(0为全部记录)
7、个人总结:
这次试验学到关于泛型的知识,并学会调用泛型中用到的一些方法,比如添加,显示,删除这些方法,对泛型的运用有了基础的认识。
8、源代码:
import java.util.*;
public class diarytext {
static ArrayList<String> diaryText = new ArrayList<String>();
public static void showText(ArrayList<String> list,int n){
if(list.isEmpty())
System.out.println("尚无记录\n");
else{
if(n==0)
for(int j=0; j < list.size(); j++)
System.out.println((j+1)+":"+diaryText.get(j));
else if(n>0&&n<=list.size())
System.out.println(n+":"+diaryText.get(n-1));
else
System.out.println("输入错误,请重新输入\n");
}
}
public static void deleteText(ArrayList<String> list,int n){ if(list.isEmpty())
System.out.println("尚无记录\n");
else{
if(n==0){
list.clear();
System.out.println("已清除全部记录\n");
}
else if(n>0&&n<=list.size()){
list.remove(n-1);
System.out.println("已删除第"+n+"条数据\n");
}
else
System.out.println("输入错误,请重新输入\n");
}
}
public static void isTest(){
int num=0,i=0;
String str;
Scanner input = new Scanner(System.in);
System.out.println("记事本功能");
System.out.println("请输入想要执行的功能");
while(true){
System.out.println("1——记事");
System.out.println("2——已记录数");
System.out.println("3——追加记录");
System.out.println("4——显示已存储记录(0为全部记录)");
System.out.println("5——删除记录(0为全部记录)");
System.out.println("6——退出");
num = input.nextInt();
if(num==6){
System.out.println("您已退出程序\n");
input.close();
System.exit(0);
}
else switch(num){
case 1:{
System.out.println("请输入内容");
input.nextLine();
str = input.nextLine();
diaryText.add(str);
System.out.println("已保存\n");
break;
}
case 2:{
System.out.println("已记录数为:"+diaryText.size()+"\n");
break;
}
case 3:{
System.out.println("请输入修改的记录号");
i = input.nextInt();
System.out.println("请输入修改内容");
input.nextLine();
str =input.nextLine();
diaryText.set(i-1, str);
System.out.println("已修改\n");
break;
}
case 4:{
System.out.println("请输入要显示第几条的内容");
i = input.nextInt();
showText(diaryText,i);
break;
}
case 5:{
System.out.println("请输入要删除第几条的内容");
i = input.nextInt();
deleteText(diaryText,i);
break;
}
default:{
System.out.println("输入错误,请重新输入!\n");
break;
}
}
}
}
public static void main(String[] args){
isTest();
}
}
四、Java的输入输出
1、实验目标:
掌握Java输入输出类;掌握Java输入输出特点;掌握Java输入输出编程方法。
2、实验要求:
编写一个程序,程序实现对用户指定的文本文件中的英文字符和字符串的个数进行统计的功能,并将结果根据用户选择输出至结果文件或屏幕。
1.构建统计类,该类实现对I/O的操纵;实现对文本文件中英文字符、字符串的统计;实现对统计结果的输出。
2.构建测试类,该类实现与用户的交互,向用户提示操作信息,并接收用户的操作请求。
3、题目分析:
对指定文件进行输入后的操作要用输入输出流来进行,将文件中的内容通过字符串的形式保存,通过文件类对文件进行各种操作。
4、题目设计实现:
用一个类实现对所有字母的查找,一个类实现对字符串的定位查找并统计,一个类进行统计字母,测试类与用户交互。
5、实现过程:
/*计数字符*/
static int lookword(File file) throws Exception{
Scanner input = new Scanner(file);
int count1 = 0;
while(input.hasNext()){
String s = input.next();
char a[] = s.toCharArray();
for(int i=0; i<a.length; i++){
if(isword(a[i]))
count1 ++;
}
}
input.close();
return count1;
}
/*计数字符串的个数*/
static int lookstring(File file) throws Exception{
Scanner input = new Scanner(file);
int count2 = 0;
/*用hasNext()判断下一位是否有数,然后用next()将指针移向下一位*/
while(input.hasNext()){
input.next();
count2 ++;
}
input.close();
return count2;
}
/*判定是否为字母*/
private static boolean isword(char word){
if(word >= 'a' && word <= 'z' || word >= 'A' && word <='Z')
return true;
return false;
}
//交互测试类
public static void isTest() throws Exception{
Scanner in = new Scanner(System.in);
System.out.println("请输入要统计的文件名:");
String f = in.next();
File file = new File("src/statistics/"+f);
if(!file.exists()){
System.out.println("没有找到文件");
System.exit(0);
}
System.out.println("文件的长度是:" + file.length());
System.out.println("这个文件有 " + statistics.lookword(file) + "个字符");
System.out.println("这个文件有 " + statistics.lookstring(file) + "个字符串");
in.close();
}
6、实验结果:
文本test.txt内容
结果:
7、个人总结:
通过这次实验,学会了对文件的输入输出的io方式进行了学习,并加入了抛出异常的方式,对文本操作的方式字符和字符串也有不同。
8、源代码:
import java.util.Scanner;
import java.io.File;
public class statistics {
/*计数字符*/
static int lookword(File file) throws Exception{
Scanner input = new Scanner(file);
int count1 = 0;
while(input.hasNext()){
String s = input.next();
char a[] = s.toCharArray();
for(int i=0; i<a.length; i++){
if(isword(a[i]))
count1 ++;
}
}
input.close();
return count1;
}
/*计数字符串的个数*/
static int lookstring(File file) throws Exception{
Scanner input = new Scanner(file);
//eDelimiter("|,|\\?|\\.");//用指定符号截断字符串
int count2 = 0;
/*用hasNext()判断下一位是否有数,然后用next()将指针移向下一位*/
while(input.hasNext()){
input.next();
count2 ++;
}
input.close();
return count2;
}
/*判定是否为字母*/
private static boolean isword(char word){
if(word >= 'a' && word <= 'z' || word >= 'A' && word <='Z')
return true;
return false;
}
public static void isTest() throws Exception{
Scanner in = new Scanner(System.in);
System.out.println("请输入要统计的文件名:");
String f = in.next();
//String loc ="test.txt";
//System.out.println(f);
File file = new File("src/statistics/"+f);
//System.out.println(file.getAbsolutePath());
if(!file.exists()){
System.out.println("没有找到文件");
System.exit(0);
}
System.out.println("文件的长度是:" + file.length());
System.out.println("这个文件有 " + statistics.lookword(file) + "个字符");
System.out.println("这个文件有 " + statistics.lookstring(file) + "个字符串");
in.close();
}
public static void main(String arg[]) throws Exception{
isTest();
}
}
五、Java的多线程编程
1、实验目标:
掌握Java输入输出类;掌握Java输入输出特点;掌握Java输入输出编程方法。
2、实验要求:
编写一个程序,程序模拟某电影院三个售票窗口同时出售电影票的过程。
1.电影票顺序出售,程序模拟显示售票的详细过程(如:“窗口X出售编号XXX电影票”)。
2.三个窗口同时出票,出票间隔采用随机控制。
3.不能重复出售相同的电影票。
3、题目分析:
采用多线程,对同一事件进行并行操作,三个窗口售票的是同一个电影,所以三个出现的时间是不确定的,所以要对并发过程进行控制。
4、题目设计实现:
多线程使用需要定义静态的值,才可以使用多线程,把票数定义为静态,然后开启三个线程同时售票,售票窗口随机售票。
5、实现过程:
/*卖票类继承接口Runnable,实现资源的共享*/
class SellTicket implements Runnable{
String name;
ArrayList<saleticket> movie;
public SellTicket(String name, ArrayList<saleticket> movie){
= name;
this.movie = movie;
}
public void run(){
while(saleticket.sell(movie)){
saleticket.sell(name, movie);
try{
Thread.sleep((long)(Math.random()*1000));
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
String film;
static int ticket = 20;
static int num = 0;
public saleticket(String film,int ticket){
this.film = film;
saleticket.ticket = ticket;
}
/*判断剩余票数*/
static boolean sell(ArrayList<saleticket> movie){
for(int i = 0; i < movie.size(); i++){
movie.get(i);
if(saleticket.ticket != 0)
return true;
}
return false;
}
public static void main(String arg[]){
ArrayList<saleticket> movie = new ArrayList<>();
saleticket m1 = new saleticket("《神奇动物世界》",ticket);
saleticket m2 = new saleticket("《神奇动物世界》",ticket);
saleticket m3 = new saleticket("《神奇动物世界》",ticket);
movie.add(m1);
movie.add(m2);
movie.add(m3);
Runnable t1 = new SellTicket("1号", movie);
Runnable t2 = new SellTicket("2号", movie);
Runnable t3 = new SellTicket("3号", movie);
Thread t_1 = new Thread(t1);
Thread t_2 = new Thread(t2);
Thread t_3 = new Thread(t3);
//启动线程,调用run方法
t_1.start();
t_2.start();
t_3.start();
}
/*共享数据用synchronized锁方式访问,可以具有互斥的作用*/
static synchronized void sell(String name ,ArrayList<saleticket> movie){
int film = (int)(Math.random()*10%3);
movie.get(film);
if(saleticket.ticket > 0){
movie.get(film);
saleticket.ticket--;
NumberFormat f=new DecimalFormat("0000000");
movie.get(film);
System.out.println(name +"窗口售出"+ movie.get(film).film+"编号
"+f.format(num++)+ " --剩余票量:" +saleticket.ticket);
}
}
6、实验结果:
7、个人总结:
通过本次试验,学习了采用多线程实现的方法,采用多线程的过程中,也需要有很多注意的地方,比如共享资源静态化,多线程如何排他性,互斥访问共享区的资源,采用什么方法进行多线程会更佳,有了更佳深入的认识。
8、源代码:
import java.util.ArrayList;
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class saleticket {
String film;
static int ticket = 10;
static int num = 0;
public saleticket(String film,int ticket){
this.film = film;
saleticket.ticket = ticket;
}
/*判断剩余票数*/
static boolean sell(ArrayList<saleticket> movie){
for(int i = 0; i < movie.size(); i++){
movie.get(i);
if(saleticket.ticket != 0)
return true;
}
return false;
}
public static void main(String arg[]){
ArrayList<saleticket> movie = new ArrayList<>();
saleticket m1 = new saleticket("《神奇动物世界》",ticket);
saleticket m2 = new saleticket("《神奇动物世界》",ticket);
saleticket m3 = new saleticket("《神奇动物世界》",ticket);
movie.add(m1);
movie.add(m2);
movie.add(m3);
Runnable t1 = new SellTicket("1号", movie);
Runnable t2 = new SellTicket("2号", movie);
Runnable t3 = new SellTicket("3号", movie);
Thread t_1 = new Thread(t1);
Thread t_2 = new Thread(t2);
Thread t_3 = new Thread(t3);
//启动线程,调用run方法
t_1.start();
t_2.start();
t_3.start();
}
/*共享数据用synchronized锁方式访问,可以具有互斥的作用*/
static synchronized void sell(String name ,ArrayList<saleticket> movie){ int film = (int)(Math.random()*10%3);
movie.get(film);
if(saleticket.ticket > 0){
movie.get(film);
saleticket.ticket--;
NumberFormat f=new DecimalFormat("0000000");
movie.get(film);
System.out.println(name +"窗口售出"+ movie.get(film).film+"编号"+f.format(num++)+ " --剩余票量:" +saleticket.ticket);
}
}
}
/*卖票类继承接口Runnable,实现资源的共享*/
class SellTicket implements Runnable{
String name;
ArrayList<saleticket> movie;
public SellTicket(String name, ArrayList<saleticket> movie){
= name;
this.movie = movie;
}
public void run(){
while(saleticket.sell(movie)){
saleticket.sell(name, movie);
try{
Thread.sleep((long)(Math.random()*1000));
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!。