java编程习题

2024-08-11

java编程习题(通用8篇)

java编程习题 篇1

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

JAVA编程习题1

4.test10097求两个数的和

/*输入n表示做n次下面的操作: 输入两个正整数,输出它们的和.例: 输入:

//表示n=2,做两次操作 10 11 20 30 输出: sum=21 sum=50 */

5.test20001求两个数的和与差

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

/*程序填空,不要改变与输入输出有关的语句。输入整数a和b,计算并输出a、b的和与差。例: 输入 2-8 输出 The sum is-6 The difference is 10*/

6.test20002求平方根

//程序填空,不要改变与输入输出有关的语句。输入1个实数x,计算并输出其平方根。例: 输入 1.21 输出

The square root of 1.21 is 1.1

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

7.test20003华氏温度转换成摄氏温度

/*程序填空,不要改变与输入输出有关的语句。

输入华氏温度f,计算并输出相应的摄氏温度c。c = 5/9(f-32).例:括号内是说明 输入

17.2(华氏温度)输出

The temprature is-8.****/

8.test20004计算旅途时间

程序填空,不要改变与输入输出有关的语句。

输入2个整数time1和time2,表示火车的出发时间和到达时间,计算并输出旅途时间。

有效的时间范围是0000到2359,不需要考虑出发时间晚于到达时间的情况。

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

例:括号内是说明 输入

712 1411(出发时间是7:10,到达时间是14:11)输出

The train journey time is 6 hrs 59 mins.9.test20005数字加密

程序填空,不要改变与输入输出有关的语句。输入1个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将第1位和第3位上的数字互换,第2位和第4位上的数字互换,组成加密后的新数。例:括号内是说明 输入 1257 输出

The encrypted number is 4601(每一位上的数字加9除以10取余后,得0146,交换后得到4601)

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

10.test20006大小写字母转换

程序填空,不要改变与输入输出有关的语句。输入一个大写英文字母,输出相应的小写字母。例: 输入 G 输出 g

import java.io.*;public class T20006 {

public static void main(String[] args)throws IOException

{

char ch;

ch=(char)System.in.read();

/*------------------*/

ch=(char)(ch+32);

// 以ASCII码计算

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

}

System.out.println(ch);

} 11.Test20007计算三门课程的平均成绩

程序填空,不要改变与输入输出有关的语句。

已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均分。本题无输入。输出示例:

math = 87, eng = 72, comp = 93 average = 84

12.test20008计算存款利息

程序填空,不要改变与输入输出有关的语句。输入存款金额 money、存期 year 和年利率 rate,精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

根据下列公式计算存款到期时的利息 interest(税前),输出时保留2位小数。

interest = money(1+rate)^year10 / 2 =

(数字与运算符之间有一空格)输出 5 10 */ /*补充知识:in.next()与in.nextline()的区别

in.next只接受一个字,不能接受一个带有空格的字符串,如下: 例如输入: Show me--(回车)用next()只能得到Show,因为遇到空格表示结束,但是nextline()则要遇到回车才知道结束.可以看一个例子,演示给大家看,如下:----------

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

import java.util.Scanner;public class Test60011{

public static void main(String []args)

{

String s1_1,s1_2,s2;

Scanner in=new Scanner(System.in);

s1_1=in.next();

System.out.println(s1_1);

System.out.println(“----------”);

in.nextLine();// 把剩余的吃掉

s2=in.nextLine();

System.out.println(s2);

System.out.println(“----------”);

s1_1=in.next();

s1_2=in.next();

System.out.println(s1_1+“

”+s1_2);

} }------------*/

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

39.求1+1/2!+……1/N!//求1+1/2!+1/3!+....(用方法求n!)

40.求a+aa+aaa+……(用方法)//求a+aa+aaa+aa…a

41.统计一个整数中数字的个数

/*程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(repeat=3)-21902 2

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

345543 输出:

count=2

(-21902中有2个2)count=1

(有1个2)count=0

(345543中没有2)*/

42.判断素数(用方法)

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

NO

(1不是素数)

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

YES

(2是素数)NO

(9不是素数)YES

(17是素数)

43.统计素数并求和

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(素数就是只能被1和自身整除的正整数,1不是素数,2是素数)。要求定义并调用函数prime(m)判断m是否为素数。例:括号内是说明 输入:

(repeat=3)1 10

(m=1, n=10)20 35(m=20, n=35)14 16(m=14, n=16)输出:

count=4, sum=17

(1到10之间有4个素数:2,3,5,7)count=3, sum=83

(20到35之间有3个素数:23, 29, 31)count=0, sum=0

(14到16之间没有素数)

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

44.输出Fibonacci序列

/*程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

Fibonacci 序列(第1项起):1 1 2 3 5 8 13 21......要求定义并调用函数fib(n),它的功能是返回第n项Fibonacci数。例如,fib(7)的返回值是13。输出语句:System.out.print(f+“ ”);

例:括号内是说明 输入:

(repeat=3)1 10

(m=1, n=10)20 100(m=20, n=100)1000 6000(m=1000, n=6000)输出: 1 2 3 5 8

(1到10之间的Fibonacci数)21 34 55 89

(20到100之间的Fibonacci数)

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

1597 2584 4181

(1000到6000之间的Fibonacci数)*/

45.求完数

/*输入2 个正整数m和n(1<=m,n<=1000),输出m 到n之间的所有完数

(完数就是因子和与它本身相等的数)。

要求定义并调用函数factorsum(number),它的功能是返回number的因子和。

例如,factorsum(12)的返回值是16(1+2+3+4+6)。输出语句:System.out.print(i+“ ”);例:括号内是说明 输入: 2

(repeat=2)20 500(m=100, n=400)1 100

(m=1, n=100)输出: 28 496 1 6 288*/

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

46.求各位数字的立方和等于它本身的数 程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

输出语句:System.out.print(i+“ ”);例:括号内是说明 输入: 2

(repeat=2)100 400(m=100, n=400)1 100

(m=1, n=100)输出:

153 370 371(1*1*1+5*5*5+3*3*3=153;3*3*3+7*7*7=370;3*3*3+7*7*7+1*1*1=371)1

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

47.将一个整数逆序输出

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

要求定义并调用函数reverse(number),它的功能是返回number的逆序数。

例如reverse(12345)的返回值是54321。例:括号内是说明 输入

(repeat=4)123456-100-2 99 输出 654321-1-2 99

48。十进制转换二进制

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat(0

要求定义并调用函数 dectobin(n),它的功能是输出 n 的二进制。例如,调用dectobin(10),输出1010。

输出语句:System.out.print(t);

//t为某位二进制数 例:括号内是说明 输入: 3

(repeat=3)15 100 0 输出: 1111 1100100 0

49。求平均值

程序填空,不要改变与输入输出有关的语句。

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

输入一个正整数repeat(0

(repeat=2)3 1 2-6 5 12 2 5 4 0 输出 aver=-1.0 aver=4.6

50。求最大值及其下标

/*输入一个正整数n(1

(设最大值惟一,下标从0开始)。例:括号内是说明 输入

(repeat=3)3 1 6 4 3 10 8 1 5 1 2 5 4 0

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

输出

max=6,index=1

(最大值6的下标是1)max=10,index=0

(最大值10的下标是0)max=5,index=2

(最大值5的下标是2)*/

51。逆序输出

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(repeat=2)4 10 8 1 2 5 1 2 5 4 0 输出 2 1 8 10 0 4 5 2 1

52。交换最小值和最大值

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

最大值与最后一个数交换,然后输出交换后的n个数。例:括号内是说明 输入

(repeat=3)5 4 3 5 1 2 4 1 5 6 7 5 5 4 3 2 1 输出 1 3 2 4 5 1 5 6 7 1 4 3 2 5 53。排序

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(repeat=3)4 5 1 7 6 3 1 2 3 5 5 4 3 2 1

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

输出 7 6 5 1 3 2 1 5 4 3 2 1

54。矩阵运算

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(2+3+4+5+6+7+8=35)

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

55。加法口诀表

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(repeat=1)3

(n=3)输出: +

56。判断上三角函数

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(上三角矩阵,即主对角线以下的元素都为0, 主对角线为从矩阵的左

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

上角至右下角的连线)例:括号内是说明 输入:

(repeat=2)3 1 2 3

0 4 5 0 0 6(n=3)2 1 0-8 2

(n=2)输出: YES NO

57。求矩阵每行元素之和

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(repeat=1)3 2(m=3, n=2)6 3 1-8

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 12 输出: sum of row 0 is 9 sum of row 1 is-7 sum of row 2 is 15

58。找鞍点

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

(repeat=2)4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9(n=4)2 1 7 4 1

(n=2)输出: a[2][1]=6 NO

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

59。求字符串长度

程序填空,不要改变与输入输出有关的语句。连续输入一批以 # 结束的多串字符。统计并输出每串字符的长度。输出使用:System.out.println(len);例:括号内是说明 输入:

hello 12#abc+0#

(连续输入2串字符“hello 12”和“abc+0”)输出:

(“hello 12”的长度是8)5

(“abc+0”的长度是5)

60。统计大写辅音字母

程序填空,不要改变与输入输出有关的语句。输入一个正整数n(0

输入一行字符串,统计并输出字符串中大写辅音字母的个数(大写辅音字母:除“A”,“E”,“I”,“O”,“U”以外的大写字母)。例:括号内是说明 输入:

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

(输入3个字符串)HELLO IT12 uieiaba 输出:

(“HELLO”中有3个大写辅音字母)1

(“IT12”中有1个大写辅音字母)

0

(“uieiaba”中没有大写辅音字母)

61。查找字符

程序填空,不要改变与输入输出有关的语句。

先输入一个字符ch。然后输入一个正整数n(0

输入一行字符串,在字符串中查找该字符(ch),如果找到,则输出 该字符在字符串中最后出现的位置(从0开始);否则输出“Not Found”。例:括号内是说明 输入:

m

(输入一个字符)3

(要输入3行字符串)moon

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

programming 1234

输出:

0

(m在“moon”中最后出现位置是0)7

(m在“programming”中最后出现位置是7)Not Found

(“1234”中没有m)

62。字符串替换

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

对应字母

A ──→ Z

B ──→ Y

C ──→ X

D ──→ W

……

X ──→ C

Y ──→ B

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

Z ──→ A 例:括号内是说明 输入:

(输入3行字符串)A flag of USA IT12 oueiaba 输出: Z flag of FHZ RG12 oueiaba

63。十六进制转换十进制

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat(0

个新字符串(十六进制形式),然后将其转换为十进制数后输出。例:括号内是说明 输入:

精心收集

精心编辑

精致阅读

如需请下载!

演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案

(输入3行字符串)10 Pf4+1-+A

输出: 16 3905 10

-----------------------

精心收集

精心编辑

精致阅读

如需请下载!

java编程习题 篇2

Java的动画编程,为了不断更新屏幕显示图像,一般采用创建线程,在线程中调用帧图像循环的方法实现动画。而如果在主线程中调用动画循环,则会占用过多CPU资源而影响程序效率,并且不利于动画程序的调用控制。因此,应单独创建一个实现动画循环的动画线程,当动画循环完成后,应及时停止该线程以释放CPU资源,即在程序中将线程置为null,代码为:animatorThread=null。如需同时实现多个动画显示,可利用Java多线程技术,利用主AWT线程调用其余各线程,图像过大时可采用其后所述技术优化动画显示效果。

动画显示不平滑甚至发生闪烁的原因是因为图像更新的频率与屏幕的刷新频率不一致造成的。发生闪烁有两个原因:一是由于在显示下一帧画面的时候,调用了repaint()方法;而repaint()方法被调用时,要清除整个背景,然后才调用paint()方法显示画面。在清除背景和绘制图像的短暂时间间隔内被用户看见的就是闪烁。另一个是由于paint()方法要进行复杂的计算,绘制每一帧花费的时间太长,图像中的各个像素值不能同时得到,使得动画的生成频率低于显示器的刷新频率,从而造成闪烁。可利用重载和双缓存技术解决这个问题。重载:当AWT接收到一个Applet的重绘请求时,它就调用update()方法清除Applet的背景,然后调用paint()方法。重载update()方法就可以将以前在paint()方法中的绘图代码包含在update()方法中,从而避免每次重绘时将整个区域清除。既然背景不再自动清除,Java程序员需要自己在update()中完成。双缓冲技术:主要原理是创建一幅后台图像,将每一帧画入图像,然后调用drawImage()方法将整个后台图像一次画到屏幕上去。这种方法的优点在于大部分绘制是离屏的。将离屏图像一次绘至屏幕上,比直接在屏幕上绘制要有效得多。在创建后台图像前,首先要通过调用createImage()方法生成合适的后台缓冲区,然后获得在缓冲区做图的环境(即Graphics类对象)。双缓存技术的缺点是当图像过大时,会占用内存很大的空间而影响程序的运行。实现较高的帧速度会产生平滑的动画,从而消除闪烁,因此,可在动画显示的每两帧之间,调用线程的sleep()方法休眠一个固定的时间。这样做的缺点是使用绝对的延迟时间会使延迟过长,即造成等待时间过长。

当需要动画速率不因硬件环境而发生改变时,为了保持恒定的帧速度(也就是恒定的显示频率),在线程的run()方法中可加入如下代码:

另一种方法是创建一个线程,用于提供一个严格的时间信号,控制动画定时刷新。

因为图像是逐帧载入屏幕的,所以当动画线程刚开始时,出现图像残缺等现象,这时可以使用MediaTracker或ImageOberver类对象进行图像跟踪,待图像全部载入后,再调用drawImage()方法将图像输出到屏幕上去。

而在不同硬件环境下,需要设计不同的动画优化方案。如在手机动画游戏等缓存过小的条件下设计程序,如采用双缓存技术显示动画,图像过大时会因占用过多内存,而使程序运行不稳定,这时就需要合理地设计和使用缓存。线程运行结束时应及时释放缓存,代码如下:

在Java程序运行中,采用的是自动回收内存的GC机制,而当内存泄露时,GC无法释放内存,即当程序中的对象申请了内存空间没有释放,而这些对象却是无用的,即程序以后不会再使用这些对象时,这些对象就可以判定为Java中的内存泄漏,这些对象不会自动被GC所回收,然而它却占用内存。可运行GC的函数System.gc()访问GC,根据Java语言规范定义,该函数虽然不保证GC一定会执行内存回收,但可在一定程度上调用GC防止内存泄露,所以,可在调用双缓存技术程序末尾加上语句System.gc()。不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低,那么需要调整GC的参数,让GC工作的速率与需要释放缓存的速率一致,Sun提供的HotSpot JVM就支持这一特性。

具体的动画编程,应根据具体软硬件环境结合程序要求,选择适合的优化方案。

摘要:Java动画编程在游戏软件开发、程序设计中应用广泛。针对不同环境下的Java动画编程的常用技术进行了分析,介绍了根据不同编程环境,消除动画闪烁及优化显示效果的技巧。

关键词:Java动画编程,缓存技术,游戏动画优化,GC

参考文献

[1]刘岩松.基于Java的动画速率精确控制.辽宁师专学报,2005,10.

基于Java的套接字编程 篇3

关键词:Java;网络编程;端口;TCP套接字;UDP 套接字

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)20-0104-02

Abstract: This paper introduces ports and sockets and other related concepts in the network programming, and introduces the network hosts how to communication to each other through the TCP socket and UDP socket, and how to programming to realize TCP Socket and UDP Socket.

Key words: Java; network programming; port; TCP Socket; UDP Socket

在网络编程中,经常需要在两台计算机之间进行通信,这就涉及怎么定位网络中的计算机和唯一地标识计算机上的进程。在Internet中使用的网络通信协议是TCP/IP协议,它是一种四层的体系结构,分为应用层、传输层、网际层和网络接口层。在Internet中用IP地址来唯一地标识一台网络中的计算机,那么怎么唯一地标识计算机中的进程呢?

端口是应用层和传输层之间的通信协议接口,端口可用来唯一地标识计算机上的进程。由于传输层有TCP和UDP两个协议,因此端口又可分为TCP端口和UDP端口,每台主机上最多可有65536个TCP端口和65536个UDP端口,也就是说在每台计算机最多可以区分65536个TCP进程和65536個UDP进程。

套接字Socket是网络主机的两个进程进行通信连接的端点,可以在指定计算机的某个空闲端口上创建套接字,那么网络主机可以通过套接字在网络中定位计算机及端口,并且进行数据的发送和接收。根据使用的传输协议,套接字又可以分为TCP套接字和UDP套接字。在网络编程中,套接字编程是比较常用的。本文介绍了网络主机利用TCP套接字和UDP套接字进行通信的流程,并介绍了在Java中是如何实现TCP套接字和UDP套接字编程的。

1 TCP Socket

TCP Socket 是基于TCP协议(传输控制协议)的套接字。TCP协议是面向连接的传输协议,在进行通信前必须先建立通信连接,它是一种可靠的传输协议,传输数据的质量比较高,适用于传输大量数据的场合,但是它的传输速率比较慢。在Java中,提供了java.net.ServerSocket和java.net.Socket等类来实现TCP套接字。

ServerSocket类用于服务器端代码中,它的作用是启动服务器端的TCP端口,并且监听该端口是否有连接请求,如果有连接请求,则接受连接请求,并且返回一个本地Socket对象用来与对方进行通信。

Socket类用于两台网络主机之间进行通信,在客户端代码和服务端代码中都需要Socket类的对象。在客户端代码中的Socket还负责向指定的服务器上的TCP端口发出连接请求,如果服务器接受了连接请求,则可使用Socket与对方进行通信。

网络主机使用TCP套接字的通信流程如图1所示:

服务端和客户端都可以向对方发送数据或者接收数据,发送数据和接收数据的过程可以是一个持续的过程,使用循环就可以实现这个持续的过程。当服务端需要处理多个客户的连接请求的时候,就需要用到多线程了,为每个客户单独创建一个套接字来处理客户的连接请求,并且进行数据的发送和接收。在javax.net包中还提供了增强版的SSLServerSocket和SSLSocket,用来构造安全的套接字对象。

2 UDP Socket

UDP Socket是使用UDP协议(用户数据报协议)的套接字。UDP协议是无连接的传输协议,在双方进行通信之前不需要事先建立连接,它提供的传输服务是简单的、不太可靠的,但是传输数据的速度比较快,适用于数据量比较少、对数据的实时性要求比较高的场合。

在Java中提供了java.net.DatagramSocket和java.net.DatagramPacket等类来实现UDP套接字。DatagramSocket类用来启动UDP端口,通过该端口进行数据的发送和接收;DatagramPacket用来创建通信时所发送和接收的数据报对象。

网络主机使用UDP套接字进行通信的流程如图2所示,每台网络主机均可进行数据报的发送和接收,可以使用多线程来实现数据报的同时收发,也可以用循环来实现持续地发送和接收数据报的过程。

3 结束语

文中探讨了Java中的套接字编程,阐述了TCP套接字和UDP套接字的基本工作流程、适用场合以及编程的基本步骤。在实际的应用中,应根据问题的数据量大小、对数据质量的要求、传输速率的要求等来考虑使用TCP套接字还是UDP套接字来进行主机的通信。

参考文献:

[1] 朱辉. Java网络程序设计[M]. 西安: 西安电子科技大学出版社, 2015.

[2] 戴歆. JAVA TCP/IP Socket 网络通信编程研究[J]. 电脑知识与技术, 2013(9).

Java编程思想读书笔记 篇4

第一章 对象导论

比起过程型语言编写的程序,用面向对象语言编写的程序更加简单、易于理解、可复用。《c++编程思想》里也有这一章,是一个抛砖引自己的玉的章节,不明白可以跳过,回头再看。

第二章 一切都是对象

java语言里面,一切都是对象,并且程序员是通过引用来操纵对象。一个简单的例子,非常轻松地让读者进入java的世界。需要注意的是java数据会储存在5个不同的地方:寄存器、堆栈、堆、常量存储、非ram存储,用new创建的一般对象都放在堆中,而特殊的基本对象放在堆栈中,如果想把基本对象也放在堆中,需要包装基本类型。

第三章 操作符

java中的操作符语法类似于c,所以学习起来一点困难也没有。要特别注意两个比较大的整数相加或者相乘的时候的溢出问题,用long或者biginteger解决这个问题。

第四章 控制执行流程

我想起《pointer on c》这本书第一章就有这一句话,本书适合那些希望迅速学习一门新语言而不是被“为什么if和for很重要”的弱智问题耽搁进度的读者。呵呵,这一章很不厌其烦地介绍了运算、操作符优先级、类型转换、选择循环等基本特性,有c或者c++编程经验的读者可以大概浏览一下。

第五章 初始化和清理

关于初始化:

1.初始化很重要,一定不要忘记。而且java编译器会很好的防止使用未初始化数据的意外,这是比c和c++更优的地方。

2.编译器初始化的顺序为:

a.类首次加载的时候,有关静态初始化的所有动作都会执行。

a1.类的加载包括首次创建该类型的对象,或者该类的静态方法/静态域首次被访问

a2.静态域的初始化在一切初始化之前,即静态变量散布在代码不同的地方,它们也会在任何方法(包括构造器)调用之前被初始化

b.当用new calssname()创建对象的时候,会在堆上开辟足够的存储空间,这块存储空间被清零,然后执行字段的初始化动作。(这里的字段初始化都是非静态的,因为静态的变量已经在a中执行完毕,而且静态变量存储在不同的地方,静态数据只占用一份存储空间)

c.执行构造器

关于清理

c++关于清理的部分包含很大不确定性。目前需要知道的事情是,正常情况下,我们是不需要调用finalize方法的,而且垃圾回收区会自动回收不再使用的对象,同时我们需要自己注意一些需要关闭的文件。

需要注意的是,用=对数组进行“赋值”的时候,实际上是引用的传递,就是说,二者指向同一堆。

第六章 访问权限控制

关于包

你应该有一个自己的域名,这样发布你的java程序的时候,就可以将你的包名设置为你的域名倒转。想要正确让包工作,要正确设置classpath,对于新手来说,这的确是一个挑战。我当初就难到了。

关于访问权限修饰词

值得注意的是,如果两个编译单元放在同一个目录下并且都没有设置包名的话,他们对于对方都是拥有包访问权限的。访问权限修饰词是修饰方法和数据,而不是类。类只有两种访问权限,包访问权限或public访问权限。默认为包访问权限。如果不希望其它任何人对该类拥有访问权限,可以把所有的构造器设置为private。但是有一个例外,可以通过该类自己的static成员内部创建(于是就有了工厂设计模式和单例设计模式)。

第七章 复用类

有三种方法复用类:组合,继承,代理。

组合即是在新的类里面放上已经定义的类的对象,然后通过调用它的方法来实现自己的功能。

继承是通过extends关键词继承某一父类,这样就能访问父类的所有public方法(因此为了继承,一般的规则是将父类的所有数据成员都指定为private,将所有的方法都指定为public)。子类的初始化需要注意的是,(当创建了一个子类的对象时,该对象包含一个基类的子对象)java会在子类的构造器中插入对基类默认构造器的调用。但是如果没有默认的基类构造器,或者想调用一个带参数的基类构造器,就必须用关键词super显式地编写调用基类构造器的语句,并且配上适当的参数列表。

代理很有意思,(我们姑且使用导出类和基类这样的字眼,但要清楚我们不是在讨论继承里面的关键词)在导出类里保存一个基类的对象,然后用自己的方法对该基类的种种方法进行包装。

如何决定使用哪种方法复用类呢?is-a就继承,has-a就用组合。而且,组合比继承总体上使用更广泛、代价更小。

向上转型

这个就牛逼了,第八章,第九章,第十章都与此密切相关。看完本书之后印象最深的就是向上转型了。

使用final的原因有很多种,一定要弄清楚为什么使用final,是由于设计还是效率。

final作用于数据的时候:final作用在基本对象比如int上,该值就成为不可改变的,一旦被初始化就无法再被更改,但是作用在普通的对象引用的时候,final使引用恒定不变,但是引用指向的对象是可变的。编译器需要我们确保final对象一定要被初始化,我们可以通过在构造器中初始化他们,以达到相对自由的效果(称为空白final,我认为这个名字容易让人误解)。java允许在参数列表中以声明的方式将参数指明为final,这一特性主要用来向匿名内部类传递数据(这很重要)。

final作用于方法的时候,说明作者想保持该方法在继承的过程中不被改变,并且不被覆盖。同时,被final修饰的方法会被关闭“动态绑定”,这样编译器就会为final方法调用生成“有限”有效的代码。之所以说有限,是因为随着编译器的牛逼,它生成的代码越来越有效。

final作用于类的时候,即是作者声明对该类的设计不允许任何继承。

学习得更深入一些,可能对以下事实感到有兴趣:java中所有的事物都是对象,每个类的编译代码都存在于电脑中的文件夹里(文件夹的层次根据反转域名得到),该文件只有在需要使用程序代码时才被加载。具体的说,就是“类在其任何static成员函数(包括构造函数)被访问时加载”。第八章 多态

多态的重要基本原理就是向上转型:继承允许将对象视为它自己本身的类型或其基类型加以处处理。

将一个方法调用和一个方法主题关联起来称为绑定,java中所有的方法都是后期绑定(除了static方法和final方法),所以我们可以编写只与基类打交道的程序代码,并且这些代码对所有的导出类都可以正确运行。

(为什么static不动态绑定:因为static方法的主要用法就是用类名.方法名这样的方式来调用,不存在“发送消息给某个对象,让对象判断自己怎么做”这样的情况。

为什么final不动态绑定:这是早期final的一种用法,由程序员指定某方法为final,意味着程序员明了动态绑定的机制,并且声明该方法不需要动态绑定,这样可以获得更好的性能。这种用法已经很少使用了。)

初始化的时候,导出类的构造函数会自动调用基类的默认构造函数,此过程一直递归到最基本的基类。如果需要调用有参数的构造函数就需要手动执行。反过来,如果需要进行清理工作(大部分时候我们都不需要),务必手动执行基类的清理工作先。比如继承链的每个类都实现dispose()方法,那么执行某个类的清理工作的时候,需要手动调用super.dispose()。不过此种情况下,务必在执行super.dispose()之前释放成员对象,清理顺序与执行顺序是相反的。

此外,构造器方面有更加复杂的调用机制,我们不用理它,只需要知道一条有效的准则“用尽可能简单的方法使对象进入正常状态,如果可以的话避免调用其它方法”。

java编译器能够允许向上多态,就是因为java的机制能保存对象的类型信息,即rtti,正因为这种机制,java编译器也允许向下转型,以获得扩展类的“扩展出”的方法。(另,扩展类“扩展”了方法的这种继承不是“纯继承”,这样做好不好?用户自己度量)。向下转型失败的话会抛出一个classcastexception。

虽然这一章都是在讲多态,但是多态并不总是解决问题最好的方案,它有可能使事情不必要地复杂起来,我们应该总是优先考虑更加灵活的组合。

第九章 接口

一种专门提供“接口”的类叫抽象类,若含有至少一个abstract方法,该类就必须被声明为abstract的。抽象方法没有方法体,派生类必须实现它,否则派生类也必须被生命为抽象的。

interface关键词使抽象的概念更进了一步:1.这个“类”完全抽象。2.一个类可以向上转型为多种interface。要让一个类遵循某个特定接口,需要使用implement关键字。

在这一章中出现了“策略设计模式”这个词。创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,被称为策略设计模式。

策略设计模式跟适配器设计模式联合使用可以提供非常强大的功能,比如我们遇到了无法更改的类(别人编写的),想要它满足我们的接口然后放到设计模式里面去(当然满足了接口之后的用法就不止如此了),就可以编写一个适配器,包装该类同时产生我所需要的接口。

使用抽象类和接口的两个原因是:1.在多重继承关系中(这真的很常见,看看java api就知道了),导出类可以被向上转型为每一个接口。2.防止客户端程序员创建该类的对象。那么我们该使用抽象类还是接口呢?事实上,如果知道某事物应该成为一个基类,那么第一选择应该是使它成为一个接口。

接口之间的继承能够形成很好的体系,更像我们的现实生活。但是要特别注意的是,在不同接口中使用相同的方法名通常会造成代码可读性的混乱,令人不快。

Java编程语言基础总结 篇5

2.Java包括编程语言和相关的技术。

3.Java主要用于开发,桌面应用程序和Internet应用程序。4.开发一个Java应用程序的基本步骤:编写源程序,编译程序和运行程序。源程序以.java为扩展名,编译后生成的文件以.class为扩展名。使用javac命令可以编译.java文件,使用java命令可以运行编译后生成的.class文件。

5.编写Java程序要符合Java编码规范,为程序编写注释可大大增加程序的阅读性。

6.MyEcplise是一个功能强大的集成开发环境(IDE)。它的各种窗口便于Java程序的开发,调试和管理。

第二章变量、数据类型和运算符

1.变量是一个数据存储空间的表示,它是存储数据的基本单元。变量的命名规则:

(1)必须以字母,“_”,“$”开头。(2)可以包括数字,但不能以数字开头(3)不能包括除“_”,“$”以外的特殊符号(4)不能使用Java语言关键字或者保留字(goto)

2.Java中数据类型分为基本数据类型和引用数据类型,基本数据类型有整型(int),双精度浮点型(double),字符型(char)和字符串(String)。3.变量要先声明并赋值,才能使用。4.Java提供各种类型的运算符,具体如下。

(1)赋值运算(=)(2)算术运算符(+,-,*,/,%)(3)关系运算符(>,>=,<,<=,==,!=)(4)条件运算符(条件?表达式1:表达式2)(5)逻辑运算符(&& , || ,!, & , |)&&(短路与)与&的区别:&&进行判断时,当第一个条件为假,则不需要判断第二个条件,结果为假。&进行判断时,即使第一个条件为假时,也需要判断完第二个条件才能给出结果为假。||(短路或)与|的区别:与上同理(5)位运算符(&, | , << , >> , >>>)5.数据类型转换是为了方便不同类型的数据之间进行运算

6.数据类型转换包括了自动类型转换和强制类型转换,自动类型转换需要满足类型兼容且目标类型大于源类型的条件

7.Java中使用boolean类型表示真假,boolean类型的两个值为true和false。

8.Java中的关系运算符可以用于来比较大小,高低,多少等,比较厚的结果是boolean类型。

9.Java提供Scanner类,可以实现从控制台获取键盘上输入的信息

第三章选择结构(一)Java中的if选择结构,包括以下形式

(1)基本的if选择结构:可以处理单一或组合条件的情况(2)if-else选择结构:可以处理简单的条件分支情况(3)多重if选择结构:可以处理连续区间的条件分支情况(4)嵌套if选择结构:可以处理复杂的条件分支情况

第四章选择结构(二)1.switch选择结构适用于进行等值判断

2.switch关键字后面小括号里表达式的值可以是int , short , byte , char , 枚举 , String(JDK1.7开始支持)

第五章循环结构(一)1.循环结构由循环结构和循环操作构成,只要满足循环条件,循环操作就会反复执行

2.使用循环结构解决问题问题的步骤:分析循环条件和循环操作,套用循环结构的语法写出代码,检查循环能否退出

3.while循环结构是先判断后执行,do-while是先执行,后判断。Do-while至少执行一次。

4.debug调试:设置断点,单步运行,观察变量

第六章循环结构(二)1.for循环结构的语法结构如下

for(表达式1:表达式2:表达式3){

} //循环体

表达式1:循环结构的初始部分,为循环变量赋初值 表达式2:循环结构的循环条件

表达式3:循环条件的迭代部分,通常用来修改循环变量的值 2.用break和continue语句控制流程

(1)break语句用于终止某个循环,程序跳转到循环体外的下一条语句。Break也可以在switch语句中使用

(2)continue语句用于跳出本次循环,进入下一次循环

(3)return可以结束当前方法的执行并退出,返回调用该方法的语句处

第七章数组

1.数组是可以在内存中连续存储多个元素的结构,数组中的所有元素必须属于相同的数据类型

2.数组中的元素通过数组的下标进行访问,数组的下标从0开始 3数组可用一个循环为元素赋值,或用一个循环输出数组中的元素信息

4.通过数组名.length可获得数组长度

5.利用Arrays.提供的sort()方法可以方便的对数组中的元素进行排序 6.二维数组实际上就是一个一维数组,他的每个元素又是一个一维数组。

第八章循环结构进阶

1.数组的输入排序,选择排序,冒泡排序

2.在二重循环中可以使用break、continue语句控制程序的执行 选择排序:

思路:每次循环得到最小值的下标,然后交换数据。如果交换的位置等于原来的位置,则不交换。插入排序:

java编程习题 篇6

1990年代中期以前,美国的计算机编程入门教育以Pascal为主。我的一位美国程序员朋友至今还怀念他与Pascal为伴的高中年代。到了1990年代中后期,由于ANSI C语言“纠正”了早期C语言的一些不适合编程教学的问题,因此成为很多美国高中和大学编程入门课的教学语言。1998年,美国指导编程教学的一个协会推荐将C++作为入门教学语言,在当时引起很大的反响,认为是编程教育方面的一个重要进步。但遗憾的是,C++非常复杂,而当时C++语言的教育体系又非常不成熟,因此很多地方的教学方法不得当,把学生迅速拖入无边无际的语言细节当中,引起了学生痛苦的抱怨。大约经过两三年不成功的实践之后,在本世纪初,美国计算机教育界普遍接受Java作为编程入门语言。此后在很短的时间里,Java迅速成为美国高中和大学里的首选编程教学语言,老师教得轻松,学生学得甜蜜,所以这个局面一直持续到现在。

而在中国,BASIC语言及其变体一直到1990年代中期都还是“算法语言”课程的主要教学内容,充分折射出当时中国计算机教学与工业应用之间的脱节。只是到了1990年代后期,C语言才确立了在中国工科计算机编程入门教育中的主流地位。到现在为止,大部分工科学生都“必修”“C程序设计语言”这门课程。不过事实上,根据我的了解,这门课程的总体教学质量相当糟糕,大部分学生可以说是满怀希望而来,两手空空而去。在这种情况下,中国高校计算机编程入门教育已经开始悄悄向Java过渡了。据我所知,有一些名校已经开始将Java设为编程入门课程,并且认为这是与国际接轨进步标志。

在我的朋友圈子里,大多数真正的一线开发者和技术领导者,对于将Java作为入门教学语言的“发展方向”都持质疑态度。他们中很多人目前主要的工作都集中在Java上,因此这种态度并非来自所谓语言宗教情绪,而是来自他们招聘和实际工作中的感受。他们发现,只学习Java、C#、VB等“现代”编程语言的学生,精于拿来主义,长于整合和快速开发,思维活跃,生产效率高,让他们来做直截了当的、有章可循的、非研究性和非创新性的工作比较合适,但是基础不扎实,对计算机系统的理解薄弱,处理细节和矛盾的能力不足,一旦他们熟悉的套路用不上,则缺少自主分析问题、解决问题的知识、能力和经验。

今天看到两位教授的“上书”,才知道原来他们也有同感。只不过这两位教授说的更直白,直接反对将Java作为入门编程语言,而是冒天下之大不韪,公然号召开历史倒车,要求退回到C、C++、Lisp和Ada去。

我是支持两位教授的。我认为,Java、C#、VB和其它虚拟机之上的语言都不适合作为专业程序员的入门教学语言。在中国还非常缺乏具有创新和独立解决问题的高水平程序员的局面下,我们应该认真做好的事情是努力提高C/C++的教学质量,而不是图快活转向Java。

教学语言的选择是至关重要的事情。作为大多数学生第一种需要认真学习理解的编程语

言,教学语言将会成为他们中间很多人的“编程母语”,深深地烙印在学生的思维方式中。这个编程母语要帮助学生破除计算机和软件的神秘感,建立对于程序的基本认识和对计算机模型的最初理解。在后续专业基础课和专业课程的学习中,这门编程语言应该作为主要工具贯穿始终,帮助学生认识计算机系统,掌握算法与数据结构技能,熟悉操作系统概念,理解编译原理知识,理解软件抽象及软件设计的基本思想,完成一定量的课程及课外项目实践,建立正确的软件开发实践习惯。不但如此,这种教学语言必须是工业界的主流语言,否则学生学非所用,学习动力无法保证。

按照这个标准来衡量,Java适合于作为主要的编程教学语言吗?我不这么认为。首先,我承认Java在教学上有一些优势,比如其开发环境和工具支持非常成熟,有助于培养学生正确的编程习惯;Java是当今第一工业主流语言,标准类库非常全面,可以迅速地开发具有实际用途的程序,有助于激发和保持学生的兴趣;而在数据结构、算法、编译原理的教学方面,Java也毫不落于下风,在软件抽象设计(面向对象)方面,Java还有着明显的优势;特别是在并行编程的教学方面,Java 1.5 concurrency包提供的优势是压倒性的。尽管有如上这些优势,但Java作为教学语言存在着一个致命的缺陷,即它是一个虚拟机语言,这一点就足以把它从教学语言的名单上去掉。

作为一个虚拟机语言,Java对开发者隔绝了下层的真实系统,从而构造了一个近乎完美的环境,在这个环境里,世界上只有一种机器,一个操作系统,内存是无限的,所有的机器都具有相同的字节顺序和一致的类型约定,为了设计的优美而牺牲速度永远是正义行为,从反射到运行时自动加载,从完备的容器类到统一字符编码,一大堆漂亮的功能都可以不费吹灰之力唾手而得。要是这个世界上每台计算机都是一个Java机器,每项编程任务都可以在这样一个近乎完美的环境中开发,那毫无以为,Java是最合适的编程教学语言。但是事实上呢?这样一个完美的环境是Java力量的源泉,但这却不是真实的世界。在真实世界里,我们可能面对非常原始的环境,苛刻的运行时限制,复杂多变的系统环境,令人窒息的细节魔鬼,要对付这些东西,需要开发者具有在应对复杂性,自己构造环境,在诸多限制条件下寻找解决方案的能力。而这种能力,被无数人无数次地证明是软件开发、特别是软件创新的核心能力。把Java作为教学语言,恰恰会导致这种核心能力的缺失。除此之外,如果耐心观察的话,不难发现,几乎在任何软件领域里的创新性成果都首先是由C/C++语言实现的,原因很简单,Java是站在C/C++基础之上的,只有C/C++先把大路趟开,Java才能够顺势而上。

相反,尽管C/C++语言作为教学语言有很多的不足,比如不同环境下开发模式差异大,细节繁多,开发效率低,容易犯错,测试和调试困难,学习者难以保持动力,等等,但是这些问题都可以解决。而C/C++的关键优点,是能够让学习者在真实的计算机抽象上、在大量的细节和矛盾中学会思考,学会解决问题,学会了解真实的系统,知轻重,明生死,从而建立核心能力。掌握了C/C++语言,再去学习和理解Java、C#、Python、Ruby和其它语言,就比较容易达到更高的境界。反之,如果习惯了舒舒服服躺在完美世界里当阔少,那就很难有勇气面对真实的世界。当然,很多开发者认为,现在更重要的能力是理解业务、整合现有资源的能力,而不是处理底层细节的技术。这种说法放在个人身上没有问题,但是不能成为整个编程教育的指导思想。我们需要各个层面上的人才,精通业务和设计的架构师固然很重要,但能够在底层作出创新成果的编程高手实际上更为稀缺和珍贵,很多时候也能够创造更大的价值。而且,更重要的是,一个精通系统知识的开发者在往上走的时候不会遇到大的障碍,而一个只知道拼装组合的“高级设计师”,往往连往下看的勇气都没有。

Java的另外一个问题,是其所倡导的繁琐设计风格,一个对象套一个对象,一个对象叠一个对象,概念之间彼此横七竖八地互相依赖,人为制造出一大堆貌似精美、实则累赘的所谓设计。这个问题我已经批评过多次,并且相信这股歪风一定会最终被人们抛弃,Java最终会归于质朴。但是在这一天到来之前,Java对于初学者来说,很可能蒙住他们的双眼,使他们看不到软件设计中最可贵的简单性和优美的统一,体会不到数据和程序的统一。在这一点上,C表现的非常好,而C++如果教学得体,可以做的更好。

当然,这并不是为现在的C/C++教学辩护。恰恰相反,从我了解的情况来看,目前普通高校的C/C++教学质量非常令人担忧。学生学不会,而且越学越没有兴趣,老师则感到教起来很棘手,迫于现实情况往往选择敷衍了事。反而是教Java,无论如何学生还能学到一点东西,对就业也有直接的帮助。至于学生的核心能力确实,发展后劲不足等问题,就让他们在现实工作中自己解决吧。坦率地说,这种想法也很有道理。不过,从教学角度来说,我认为老师们还是应该积极考虑如何提高C/C++的教学质量。毕竟学生阶段是十分宝贵的,基础不在这个时期夯实,将来想弥补,就算不是完全不可能,也将付出十倍的代价。本着对学生职业生涯的负责态度,还是应该帮助学生达到这个阶段应该达到的目标。在两位教授的公开信里,也充分表达出这个意思。

八人过河问题的Java编程实现 篇7

过河问题是一个非常有趣的智力游戏,许多学者都对这类问题进行了深入研究。王国全[1]对其中的商人过河问题进行了分析并用Java程序来解决此类问题。张念发等[2]将经典的商人过河问题进行了泛化讨论,并在此基础上着重分析了安全渡河问题的状态空间,建立了满足问题需求的渡河规则,研究了相应的控制策略,得出了求解路径的搜索规则和搜索策略,给出了基于状态空间搜索法的问题解决方案。然而,王国全和张念发等方案无法解决八人过河问题,该过河问题描述如下:现有一条河,总共有8个人要过河,他们分别是妈妈、爸爸、两个儿子、两个女儿,一位犯人和一位警察。现有一条小木船,该船一次最多只能搭载两个人;在这8人当中,只有爸爸、妈妈、警察会开船,即这个船上必须有爸爸、妈妈,警察3个中的一个,船才会开动。船过去无法自动回来。并且要避免以下3件事发生:(1)如果警察不在,犯人就会伤害一家6口;(2)如果爸爸不在,妈妈就会伤害儿子。(3)妈妈不在,爸爸会伤害女儿。应当如何过河?

此外,还有农夫过河问题:一位农夫带着一只羊、一只狼和一棵白菜,身处河南岸边。他要把这些东西全都运送到对岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜。请给出农夫将所有的东西运过河的方案。

其实,这两个问题类似,只要解决了其中一个问题,另外一个问题自然就会被解决。所以,重点讨论八人过河问题。

2问题分析

八人过河问题可以看成二元组节点<S1,S2>状态变化过程。其中S1,S2是集合,分别代表着河岸以及河对岸的人员集合。由于集合的元素不能重复,所以二个儿子可分别用儿子1,儿子2来表示。同理,二个女儿可以分别用女儿1,女儿2来表示。设坐船Boat的人员集合是C,在过河过程中,这些人通过坐小船在河两岸来回,二元组节点的值则必然发生改变。

所以,一次过河或返回策略可以用下面公式表示:

设Boat船上的人员集合是C。如果集合C中规定的人员过河时,则S1’=S1-C,S2’=C+S2;当集合C中规定的人员返回时,则S1’=S1+C,S2’=S2-C。而且新集合S1’、S2’应该遵循安全规则,即要避免以下3件事发生:(1)如果警察不在,犯人就会伤害一家六口;(2)如果爸爸不在,妈妈就会伤害儿子。(3)妈妈不在,爸爸会伤害女儿。

另外当由节点<S1,S2>变迁到新节点<S1’,S2'>后,则Boat的航行方向跟原来的航行方向相反。

在过河之前,此时二元组节点的初始值vfirst是<{爸爸,妈妈,儿子1,儿子2,女儿1,女儿2,警察,犯人},{}>;而所有人都过河了,则二元组变成了最终值VLast,即为<{},{爸爸,妈妈,儿子1,儿子2,女儿1,女儿2,警察,犯人}>。要得到过河方案,即要找到由开始二元组节点v_first,经过若干次过河或返回后,最后变迁到结束二元组节点VLast,便结束。待结束后,依次输出节点变迁过程中船Boat的行为(即船上人员集合过河或返回),就是过河方案。

而为了更有效地从一节点变迁到下一节点,采用有效回溯算法:即根据当前船的信息,为每一个节点保存过河或返回的所有有效的坐船人员候选集合,如果所选择的集合不是有效的,则从该节点的候选集合中删除掉该集合。例如,对于初始节点v_first,如果过河的话,该节点的坐船人员候选集合是{{爸爸,妈妈},{爸爸,儿子1},{爸爸,儿子2},{妈妈,女儿1},{妈妈,女儿2},{警察,犯人}}。如果选择{爸爸,妈妈}集合坐船过河,得到新节点<{儿子1,儿子2,女儿1,女儿2,警察,犯人},{爸爸,妈妈}>,随后,如果{爸爸,妈妈}返回,则又得到了初始节点vfirst;另外,如果爸爸或妈妈中的一人返回,得到的新节点不安全。所以,回溯到节点vfirst,并从节点vfirst的有效过河候选集合中删除掉集合{爸爸,妈妈}。然后,重新选择新的候选集合,并变迁到其他的节点,重复循环这种操作,直到得到的新节点时是结束节点VLast,就结束。在此算法中,利用栈来保存每个节点以及相应的坐船人员候选集合。八人过河问题的流程图如图1所示。其中图2是图1中处理候选集合list不为空情况的细化部分。

3编程实现

在程序中定义的类有:集合类CSet、船类Boat、安全规则类Rule、节点类Node、节点候选集合类Node Edges以及方案类Scheme。

3.1集合类CSet

该类提供了多种方法,主要提供了集合的加减运算以及产生子集等功能。

集合类CSet中的主要方法有:

方法public void Add(CSet s):当前集合加集合s,结果保存到当前集合中。

方法public void subtract(CSet s):当前集合减法集合s,结果保存到当前集合中。

方法public boolean Is Same Of Content(CSet s):比较当前集合与指定集合s的内容是否相同,如果相同,返回true,否则返回false.

方法public Hash Set<Hash Set<String>>get Sub Set Of Length(int start Length,int end Length)功能:得到当前集合的子集的集合,且子集中的元素(集合)的长度大于等于start Length,而小于等于end Len。例如,对于集合{a,b,c},如果start Length=2,end Len=3,则产生的集合是:{{a,b},{a,c},{b,c},{a,b,c}}。

方法public Hash Set<Hash Set<String>>get Sub Set()功能:得到当前集合的所有子集,对于集合{a,b,c},则产生的所有子集的集合是:{{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}}。

方法public Array List Get List Of Boat People Set(Boat boat,Rule rules[])功能:依据船boat的有关信息和安全规则rules,从当前集合中选出坐船人员集合的列表(在保证当前集合和船都安全的情况下)。其中,返回Array List类型值的元素是CSet类型。例如,如果河岸人员集合是{妈妈,女儿1,儿子2,爸爸,女儿2},而对岸人员集合是{犯人,警察,儿子1},若boat的方向是过河,则有效坐船人员集合的列表是:{爸爸,儿子2}-{爸爸,妈妈},注意,不能包括{妈妈,女儿1},{妈妈,女儿2};若boat的方向是返回,则坐船人员集合的列表则是:{警察,犯人}-{警察,儿子1},注意,不能包括{警察}。

方法boolean Is Safe(Rule r[])功能:依据安全规则(由数组r规定),判断当前集合set是否安全,如果安全则返回true,否则返回false。当前集合中存在害人者,和受害者,但没有相应的控制者时,这种情况就不安全。

3.2 Boat类

该类主要是对过河所需要的船进行了定义。有关船的信息包括:船方向、坐船人员集合、船载人数量以及规定的水手。

集合类CSet中的主要方法有:

方法public boolean Is Over Load()功能:判断船是否超载,如果超载返回true,否则返回false.

方法public void On Boat(CSet s)功能:指定坐船人员集合s坐船。

方法public CSet Off Boat()功能:船上人员下船,并返回下船人员集合。

方法public boolean Is Safe()功能:判断船是否安全:是否超载,以及是否存在指定水手人员。如果超载或者没有指定的水手人员,则返回false(船不安全);如果安全且存在指定水手人员则返回true(表示船安全).

3.3 Rule类

该类是是定义安全规则,规则控制者、害人者以及受害者集合。如果控制者不在现场的话,害人者与受害者在一起的话,则害人者会伤害受害者。例如,如果警察不在,犯人就会伤害一家6口,警察是控制者,犯人是害人者,而集合{爸爸,妈妈,儿子1,儿子2,女儿1,女儿2}是受害者集合。

3.4 Node类

该类是对河岸以及对岸人员集合,所用到的船以及两岸人员集合应该遵循的若干安全规则进行了定义。

Node类中有如下主要方法:

方法public Node get Next Node(CSet set)功能:依据节点中船信息和安全规则,从河岸或对岸的当前集合中选出坐船人集合的列表(在保证当前集合和船都安全的情况下),产生新节点并返回新节点。

方法public Array List Get List Of Boat People Set()功能:依据当前节点船的方向,得到合法的坐船人员集合列表。

方法public boolean Is Safe()功能:判断当前节点是否安全(即判断河岸以及对岸人员集合是否安全),如果安全则返回true,否则返回false。

方法public boolean Is Same Node Of Content(Node n)功能:当前节点是否与指定节点(n)内容(包括船的方向)相同时,内容相同返回true,否则返回false

方法public boolean Is Same Node Of Content1(Node n)功能:判断当前节点是否跟指定节点n的河岸以及河对岸人员是否是相等的。不包括船的方向。

3.5 Node Edges类

由于下面Scheme类的方法Deal With(),采用了有效回溯法,Node Edges类主要作用是为了保存节点的有效的坐船人员候选集合。

3.6 Scheme类

该类规则了过河游戏的开始节点和结束节点。其中方法Deal With()是得到过河方案的主要算法。方法Scheme1()解决了八人过河问题,而方法Scheme2()则是处理农夫过河问题。

Scheme类主要方法有:

方法public boolean Is Exist In Stack(Stack stack,Node node)功能:判断指定节点node是否与栈stack中节点内容相同,如果相同的话,则返回true,否则返回false。

方法public int Best Index In List(Array List list,int direction)功能:船过河时(即direction的值为Boat.PASSRIVER),从候选集合列表中随机选择一个元素的下标返回,船返回时(即direction的值为Boat.BACK),优先选择那些元素个数最小的下标返回。比如:对于列表{a,b}-{a,c}-{b,c}-{a}-{b,c},当船过河时,返回0到4范围内的随机值。当船返回时,则返回3值,因为集合{a}的元素个数最小。

方法public void Deal With()功能:得到过河方案,保持在栈stack中,然后输出栈中内容(即过河方案)。其具体情况如下:

方法public static void Scheme1()功能:得到八人过河游戏方案。

方法public static void Scheme2()功能:农夫过河问题。

3.7程序运行情况

在Scheme类中,方法scheme1()得到了八人过河方案,而scheme2()得到了农夫过河方案,运行Scheme类的main()方法,运行结果如下:

八人过河方案:

步骤(1):{犯人,警察}过河

步骤(2):{警察}返航

步骤(3):{警察,儿子1}过河

步骤(4):{犯人,警察}返航

步骤(5):{儿子2,爸爸}过河

步骤(6):{爸爸}返航

步骤(7):{妈妈,爸爸}过河

步骤(8):{妈妈}返航

步骤(9):{犯人,警察}过河

步骤(10):{爸爸}返航

步骤(11):{妈妈,爸爸}过河

步骤(12):{妈妈}返航

步骤(13):{妈妈,女儿2}过河

步骤(14):{犯人,警察}返航

步骤(15):{警察,女儿1}过河

步骤(16):{警察}返航

步骤(17):{犯人,警察}过河

一个农夫带着一只狼、一只羊和一棵白菜过河方案:

步骤(1):{农夫,羊}过河

步骤(2):{农夫}返航

步骤(3):{白菜,农夫}过河

步骤(4):{农夫,羊}返航

步骤(5):{农夫,狼}过河

步骤(6):{农夫}返航

步骤(7):{农夫,羊}过河

摘要:针对八人过河问题,设计了一种有效回溯算法,Java编程实现了八人过河的过河方案,同时,该算法亦可以得到农夫过河问题的过河方案,并给出有效的Java程序来解决此类过河问题。

关键词:八人过河问题,农夫过河问题,回溯法

参考文献

[1]王国全.商人过河问题的Java实现[J].电脑编程技巧与维护,2009,(05),25-27.

[2]张念发,张宪新,刘长征.基于状态空间搜索法的商人过河问题解决方案[J].电脑编程技巧与维护,2010,(18):36-38.

java编程习题 篇8

关键词:计算机软件;开发;JAVA编程语言

中图分类号:TP312.2 文献标识码:A 文章编号:1674-7712 (2014) 06-0000-01

计算机应用技术的发展推动了JAVA程序的开发应用。起初,JAVA语言被命名为OAK,主要用于家用小型电器的编程语言中,从而有效地解决了家用电器的控制问题,比如电视机、冰箱以及闹钟等。随着智能化技术的市场需求和发展,OAK在互联网的应用前景越来越广泛,因而JAVA语言逐渐代替OAK,成为一种单纯地面向对象的程序设计语言。

一、JAVA编程语言的特点分析

与传统的编程语言相比较,JAVA编程语言具有更加方便快捷的优势,同时在传统的编程运用上有了更新的发展。经过不断地发展和改进,JAVA编程语言能够兼容多种计算机种类的操作系统,还能够根据实际情况实现跨平台的操作。JAVA编程语言主要有以下特点:

(一)实用性

JAVA编程语言能够将系统中的内存空间进行智能化收集、处理,从而可以有效地保持系统运行的速度。同时,JAVA编程语言主要应用于网络及其分布式的环境中,能够拥有多个阶层的互锁保护功能,从而及时地避免黑客和病毒的侵入和破坏,保障计算机系统的安全。

相对于C语言,JAVA编程语言具有动态性,尤其是能够更好地适应不断变化的环境。即使程序库已经更新,JAVA编程语言也可以继续沿用之前的编译程序。

(二)广泛性

通常,互联网是由多个不同种类的机器所组合而成的。因此,如何能够使一个应用程序能够在多个机器上执行相关操作是编程语言设计的重点。JAVA编程语言中的编译器能够产生一种文件格式(Object File Format),具有结构中立的优点,进而能够在多个处理器中顺利地运行。作为一种跨平台的编程语言,JAVA能够轻松地将一个环境转移到另一个环境中。比如,用户能够在Web网站上灵活地下载和使用该应用程序,包括图像和HTML等。

(三)简易性

JAVA编程语言主要利用C++面向对象的相关概念[1]。JAVA程序能够自动地将输入的数据装入类中,类在实现程序的简易性中具有独特的优点。因此,程序设计人员只要将大部分精力用于对类和接口的科学设计和应用上。同时,JAVA编程语言还能够将一些不常用的能力进行自动地删除,以降低编程语言设计的复杂性,便于用户更好地掌握。在计算机软件的编写工作中,JAVA编程语言具有更加方便和快捷的优点。

(四)独立性

JAVA虚拟机是一种建立在硬件和操作系统之间的接口,可以顺利地解释JAVA二进制代码。JAVA编程语言将JAVA虚拟机视为一种独立的思想向导,将起初编译的中间码进行自动地校验,可以适应平台环境的特殊要求。简而言之,如果一套计算机系统能够运行JAVA虚拟机,那么该系统就可以实现相关的JAVA编程语言程序设计工作。

二、关于计算机软件开发的JAVA编程语言相关应用探究

JAVA编程语言在计算机软件的开发中得到了良好应用。本文主要探究的是JAVA编程语言在Internet和电子商务中的应用。

(一)Java相关技术在Internet中的应用

Internet中web服务器的发展为人们更加方便快捷地获取信息提供了良好途径。其中web服务器也称为WWW服务器,其主要功能是为用户提供一些网上信息浏览的相关服务。其中,Tomcat是一个免费的开源Serlvet容器[2]。作为Jakarta项目中的一个重点部分,Tomcat具有性能稳定、免费的优点,因而深受广大用户的欢迎。目前,Tomcat的最新版本是8.0。当计算机的配置正确时,Apache能够为HTML页面服务,同时也能够对HTML的相关页面进行处理,具有和IIS服务器相同的功能。

WWW服务器上所提供的浏览信息丰富多彩,不仅具有文本形式和语音形式,而且还具有影视、卡通动漫以及图像等。这些不同模式的信息资源可以在JAVA编程语言的设计下,进行组合、归纳和集成。同时,JAVA编程语言还可以在此基础上衍生出更多具有创意性的产品,比如影视作品和文学艺术等。Tomcat通过借助JAVA应用平台,能够安全地运行并且支持WEB的应用部署。尤其是在Tomcat在以系统管理员的身份运行时,JAVA程序运行能够获得用户系统的全部权限。也就是说,JAVA运行时能够获得所有系统文件夹中文件设置的权限。因此,JAVA可以采用代码的形式,将SDK中的文件API和文件夹中的文件进行合理地调用,不仅可以方便用于提取所需信息,而且还能够保障系统的安全。

(二)Java相关技术在电子商务系统的应用

电子商务系统中JAVA 相关技术扮演着重要的角色。尤其是随着现代电子商务的不断发展,JAVA相关技术的应用能够极大地提高工作效率。

例如,在电子商务的发展过程中,为了达到某种功能,JSP、servlet以及其他的相关资源会自动地组合成一个系统单元。JAVA作为一个理想的编程模型,能够极大地减少系统开发设计中的工作量,同时也可以方便进行后台和后期管理。其中HTML文件主要是以一种静态的形式出现,反应时间较快,但是不具有灵活性。因此,JAVA编程的应用能够对HTML语言进行科学设计,提供一种有效地动态机制[3]。用户只需要进行简单地操作,进行数据的确认,从而可以满足自身的信息需求。这种操作可以在JAVA应用平台上顺利完成。同时,JSP作为一种面向web服务器的相关技术,不需要用户任何的附件支持,其代码可以在编译后由JAVA虚拟机直接执行,从而为用户提供了一个基于JAVA的服务器解决方案。

三、结书语

综上所述,作为一种针对计算机网络开发的专业语言,JAVA编程语言具有一定的优点。互联网时代的到来,JAVA编程语言的设计更加科学化、人性化、合理化。JAVA编程语言在计算机软件的开发过程中得到了良好的应用,为提高计算机软件的开发水平发挥了重要作用。

参考文献:

[1]伍睿恩,基于计算机软件开发的JAVA编程语言分析[J].信息通信,2013(01):55.

[2]杨小琴,JAVA程序设计语言的一点体会[J].电脑知识与技术,2011(03):63.

上一篇:胡锦涛在第四轮中美战略与经济对话开幕式上的致辞下一篇:七年级思想品德老师教学工作总结