ITAT编程习题分析.docx

上传人:b****6 文档编号:3599959 上传时间:2022-11-24 格式:DOCX 页数:66 大小:479.96KB
下载 相关 举报
ITAT编程习题分析.docx_第1页
第1页 / 共66页
ITAT编程习题分析.docx_第2页
第2页 / 共66页
ITAT编程习题分析.docx_第3页
第3页 / 共66页
ITAT编程习题分析.docx_第4页
第4页 / 共66页
ITAT编程习题分析.docx_第5页
第5页 / 共66页
点击查看更多>>
下载资源
资源描述

ITAT编程习题分析.docx

《ITAT编程习题分析.docx》由会员分享,可在线阅读,更多相关《ITAT编程习题分析.docx(66页珍藏版)》请在冰豆网上搜索。

ITAT编程习题分析.docx

ITAT编程习题分析

习题分析

ITAT第二届:

1、编写一个Java程序要求:

开启一个文本文件,一次读取其内的一行文本。

令每一行形成一个String,并将读出的String对象置于LinkedList中。

请以相反次序印出LinkedList内的所有文本行。

问题分析:

1、需要IO流BufferedReader和FileReader类,通过IO流访问文本文件的每一行。

2、Java框架中的LinkedList对象存储每一行。

知道文本文件读完。

3、通过LinkedList类的listIterator(intsize)来实现遍历,通过hasPrevious()和previous()来实现逆序输出。

2、用LinkedList实现一个stack,实现其中的push(),top()和pop()方法;其中push()实现向栈中加入一个元素,top()实现得到栈的最顶元素,pop()实现删除最顶元素。

问题分析:

Stack的特征是:

先进后出;通过LinkedList类的addLast(obj)方法实现push()方法;通过getLast()方法实现top()方法,通过removeLast()实现pop()方法。

3、为Thread撰写两个子类,其中一个的run()在启动后取得第二个Threadobjectreference,然后调用wait()。

另一个子类的run()在过了数秒之后调用notifyAll(),唤醒第一个线程,使第一个线程可以印出消息。

问题分析:

1、ThreadSon和ThreadMain类实现Thread类。

2、通过启动ThreadMain类的线程来调用ThreadSon线性。

3、在ThreadSon类中定义ThreadMain类的对象main,通过对main对象的控制(锁旗标)实现运行ThreadSon后在运行ThreadMain类。

4、具体实现:

publicclassMainThreadextendsThread

{

publicvoidrun()

{

sonThreadson=newsonThread(this);//定义子线程的对象

son.start();//在主线程中调用子线程

System.out.println("主线程等待...");

synchronized(this)//如果获得子线程的锁旗标就等待

{

wait();

System.out.println("主线程启动...");

sleep(3000);

System.out.println("主线程休眠3秒后...");

}

System.out.println("主线程结束!

");

}

publicstaticvoidmain(String[]args)

{

MainThreadmain=newMainThread();

main.start();

}

}

classsonThreadextendsThread

{

MainThreadmain=null;//定义主线程的对象

publicsonThread(MainThreadmian)

{

this.main=mian;

}

publicvoidrun()

{

synchronized(this)//获得对象的锁旗标

{

System.out.println("子线程启动...");

sleep(3000);

System.out.println("子线程休眠3秒后...");

}

System.out.println("子线程结束!

");

synchronized(main)

{main.notify();}//唤醒主线程

}

}

4、用Linklist实现一个队列quene;实现put()方法向队列中加入一个元素,get()方法得到第一个元素,isEmpty()判断是否为空。

问题分析:

Queue的特征:

先进先出;put方法和get方法实现通过调用LinkedList类的addList()方法和getFirst()方法;isEmpty方法的实现调用LinkedList类的isEmpty方法。

5、撰写一个myStringclass,其中包含一个String对象,可于构造函数中通过引数来设定初值。

加入toString()和concatenate()。

后者会将String对象附加于你的内部字符串尾端。

请为myString()实现clone()。

撰写两个static函数,令它们都接收myStringreferencex引数并调用x.concatenate(“test”)。

但第二个函数会先调用clone()。

请测试这两个函数并展示其不同结果。

问题分析:

通过两个方法是先concatenate()和clone();通过对两个的调用和clone()方法,就会输出不同的结果。

在这个题中考察的是clone()方法;还要注意一个小知识点:

Stringstr=str.concat(“test”);String的concat方法将指定字符串连接到此字符串的结尾。

但只能将链接后的值赋值给其他字符串对象,不能赋值给str,即使赋值,但str的内容不会发生变化。

Stringstr+=”test”;表示字符串链接,链接后将最新的值赋值给str,因此str的值发生变化了。

此题的两个方法的实现:

publicstaticvoidMethod1(MyStringTestMyStr){

System.out.println(MyStr.concatenate("test"));}

publicstaticvoidMethod2(MyStringTestMyStr){MyStr.clone()).concatenate("test"));}

ITAT第三届

1、编写一个Java应用程序,计算并输出一维数组(9.8,12,45,67,23,1.98,2.55,45)中的最大值和最小值。

问题分析:

方法很多。

方法一:

通过循环实现输出最大值和最小值。

方法二:

通过把这些数存放到TreeSet中,输出第一个和最后一个就可以得到最大值和最小值。

方法三:

就是调用Java集合框架中Collections的max和min方法实现。

方法四:

通过Aarays类的Sort方法进行排序,然后输出第一个和最后一个就可以实现。

2、编写一个Java应用程序,该程序使用FileInputStream类,实现从磁盘读取本应用程序源代码文件,并将文件内容显示在屏幕上。

问题分析:

通过IO流中的类来实现从文件中读出,在屏幕上现实,具体实现:

FileInputStreamfis=newFileInputStream(file);BufferedReaderbr=newBufferedReader(newInputStreamReader(fis));通过把FileInputStream封装成InputStreamRead类,然后在封装成BufferedReader类。

通过BufferedReader类实现读的操作。

FileInputStream从文件系统中的某个文件中获得输入字节。

哪些文件可用取决于主机环境。

InputStreamReader是字节流通向字符流的桥梁:

它使用指定的charset读取字节并将其解码为字符。

它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

3、编写一个Java应用程序,利用RandomAccessFile类,把几个int型整数(1,2,3,4,5,6,7,8,9,10)写入到一个名字为tom.dat文件中,然后按相反顺序读出这些数据并显示在屏幕上。

(注意,一个int型数据占4个字节)问题分析:

1、通过RandomAccessFile类的writeInt()和ReadInt()实现把int整数写入到文件中,和从文件中读出。

2、通过length()或getFilePointer()和seek(long pos)实现逆序的输出。

Seek方法可以设置输输出的顺序。

具体代码如下:

RandomAccessFileraf=newRandomAccessFile(file,"rw");

for(inti=1;i<=10;i++){

raf.writeInt(i);

}

//longgetFilePointer()返回此文件中的当前偏移量。

longs=raf.getFilePointer();

for(inti=1;i<=10;i++){

raf.seek(s-i*4);

System.out.print(raf.readInt()+"");

}

4、编写一个Java应用程序,实现如下功能:

  1)判断两个字符串是否相同,s1=”youareastudent”,s2=”howareyou”;

  2)判断字符串”22030219851022024”的前缀、后缀是否和某个字符串”220302”相同;

  3)按字典顺序比较两个字符串”你”和”我”的大小关系;

  4)将数字型字符串”100”和”123.678”转换为数字;

5)将字符串”FEDCBA”存放到数组中,调用for循环读出数组数据显示在屏幕上。

问题分析:

通过调用String类的方法实现:

依次用到的方法有:

startsWith(str2),endsWith(str2)、compareTo(Str)、Integer.parseInt(str1)、charAt(i);

5、编写一个Java应用程序,对用户输入的任意一组字符如{1,3,4,7,2,1,1,5,2},输出其中出现次数最多且数值最大的字符,并显示其出现次数。

问题分析:

通过TreeMap对象来实现,对于已经包含在对象中就让其value加1;输出alue相同并且key最大的即可。

迭代输出输出次数最多,且最大的方法是:

通过迭代比较器key值,如果key比已经存在的key值大,通过比较其实value值,如果value的值比已经存在的值大,就交换其key和value的值,否则啥也不做。

其代码:

Iteratoritr=hmap.keySet().iterator();//对key值进行迭代

Stringstr=(String)itr.next();//把第一个key付给str

inttimes=hmap.get(str);//把第一alue付给times

while(itr.hasNext())//迭代循环

{

Stringtemp=(String)itr.next();

//如果temp>str

if(pareTo(temp)<0)//比较下一个的key和str的大小

{

intn=hmap.get(temp);//得到此key的次数

{

if(times<=n)//temp的次数大于或等于str的次数

{//交换

str=temp;

times=n;

}

}

}

}

6、编写一个Java应用程序,使用Java的输入输出流技术将Input.txt的内容逐行读出,每读出一行就顺序为其添加行号(从1开始,逐行递增)并写入到另一个文本文件Output.txt中。

问题分析:

通过读出文本的每一行,然后在写进文本时,在前面加如“n+"、"+”即可实现,每一次循环,n++即可,用的的流是BufferedReader、BufferedWriter、FileReader、FileWriter这四个类。

7、编写一个Java应用程序,使用RandomAccessFile流统计Hello.txt中的单词,要求如下:

(1)计算全文中共出现了多少个单词(重复的单词只计算一次);

(2)统计出有多少个单词只出现了一次;(3)统计并显示出每个单词出现的频率,并将这些单词按出现频率高低顺序显示在一个TextArea中。

问题分析:

首先通过IO流中的类实现输出每一行,然后在通过StringTolennl类实现对字符串的分割,分成一个的单词。

通过把每一个单词添加到TreeMap中,如果此单词已经在TreeMap中,就让其alue加1;依次循环,直到把所有的单词添加到TtreeMap中。

通过输出TreeMap的个数实现统计一共有多少个单词。

通过对TreeMap进行对Value进行迭代,当其值等于1就让其加1,就可以实现统计多少个单词只出现一次。

通过TreeMap类的对象进行对alue进行迭代,输出让频率大小输出,但是TreeMap对value进行迭代时,是无须的,所有必须实现这样:

//此类是按对象的值进行排序的

classVluesDownimplementsComparator

{

publicintcompare(Objecto1,Objecto2)

{

Entryobj1=(Entry)o1;

Entryobj2=(Entry)o2;

returnobj2.getValue()-obj1.getValue();

}

}

迭代输出:

Listlist=newLinkedList(tmap.entrySet());

//根据指定比较器产生的顺序对指定列表进行排序

Collections.sort(list,newVluesDown());

Iteratoritr=list.iterator();

while(itr.hasNext())

{

Entryentry=(Entry)itr.next();

bw.write(entry.getKey()+"\t\t");

bw.write(entry.getValue()+"");

bw.newLine();

}

bw.close();

8、编写一个Java应用程序,当用户在输入对话框中输入两个日期后(日期格式为YYYYMMDD,如1999年1月12日应输入为19990112),程序将判断两个日期的先后顺序,以及两个日期之间的间隔天数(例如1999年1月1日和1999年1月2日之间的间隔是1天)。

问题分析:

通过GregorianCalendar类的进行初始化日期,通过调用该类的父类Calendar的方法得到该日期一共有多少天。

其代码如下:

GregorianCalendardate;

GregorianCalendardate1=newGregorianCalendar(1988,01,02);

GregorianCalendardate2=newGregorianCalendar(1989,01,02);

//得到此日期的天数

intdatetime1=(int)(date1.getTimeInMillis()/(1000*60*60*24));

//得到此日期的天数

intdatetime2=(int)(date2.getTimeInMillis()/(1000*60*60*24));

通过比较datetime1和datetime2的差值,就可以实现此题的功能。

9、编写一个Java应用程序,对于给定的一个字符串的集合,格式如:

 {aaabbbccc},{bbbddd},{eeefff},{ggg},{dddhhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出:

{aaabbbcccdddhhh},{eeefff},{ggg}  

(1)分析问题,描述你解决这个问题的思路、处理流程,以及算法复杂度。

(2)编程实现题目要求的集合合并。

(3)描述可能的改进(改进的方向如效果,算法复杂度,性能等等)。

问题分析:

1、通过把上面六个的字符串集合添加到LinkedList类的对象中,先把第一个字符串集合分割后都添加到TreeMap对象tmap中,然后对LinkedList迭代,迭代从第二个位置开始,对于每次循环,把得到的字符串进行分割,对于此循环,设置一个标识符,只要对于此次分割的单词在list1中出现,就把此分割的所有单词添加到tmap中。

这样就可以实现两个集合的合并。

对于所有分割后的单词都没有在tamp中出现,就把此字符串集合添加到list2中。

当一轮循环后,需要判断list2中的集合是否有交集。

如果有的话再次进行上面的循环。

2、对于上面分割字符判断是否有交集,可以形成一个方法,类型为boolean,如果两个此集合和tmap有交集,就返回true,否则就返回false,通过在上个方法中调用此方法就可以判断。

3、也可以把此字符串和tmap的字符串进行拆分在添加到tmap中。

4、对于list2集合的判断,也可以写个方法,对于此list2的判断,返回值是boolean,同样在上个主方法中进行判断。

具体实现代码如下:

publicclassCollectionJava

{

LinkedListst;//存储没有交集的集合

LinkedListlist;

publicvoidFun(LinkedListllist)

{

TreeSetset;//存储有交集的集合

set=newTreeSet();

LinkedListte=newLinkedList();

Iteratorlitr=llist.iterator();

while(litr.hasNext())

{

Stringstr=(String)litr.next();

StringTokenizertoken=newStringTokenizer(str);

if(set.isEmpty())//开始为空时

{

while(token.hasMoreTokens())

set.add(token.nextToken());

}else

{

if(Contin(set,str))//set集合是包含str字符串某个元素

{

while(token.hasMoreTokens())

set.add(token.nextToken());

}else

te.add(str);//通过set来屏蔽相同的

}

}

list.add(set);//最后把set对象添加到list对象中

if(Contin2(te))//如果st对象的交集不为空,继续调用Fun()函数

{

st.clear();//在移除te

Fun(te);

}

else

st=te;

}

//set对象是否含有str字符串的某个元素

publicbooleanContin(TreeSetset,Stringstr)

{

booleanflag=false;

StringTokenizertoken=newStringTokenizer(str,"");

while(token.hasMoreTokens())

{

if(set.contains(token.nextToken()))

flag=true;

}

returnflag;

}

//判断list对象的交集是否为空

publicbooleanContin2(LinkedListlist)

{

TreeSetet=newTreeSet();

intn=0;

booleanflag=false;

Iteratorlit=list.iterator();

while(lit.hasNext())

{

Stringstr=(String)lit.next();

StringTokenizertoken=newStringTokenizer(str,"[]");

while(token.hasMoreTokens())

{

n++;

et.add(token.nextToken()+"");

}

}

if(et.size()==n)

flag=false;

else

flag=true;

returnflag;

}

10、在下图中的九个点上,空出中间的点,其余的点上任意填入数字1至8;1的位置保持·不动,然后移动其余的数字,使1到8顺时针从小到大排列。

移动的规则是:

只能将数字沿线移向空白的点。

请将制作好的源文件保存为“t2.java”。

(本题共60分,要求1占20分,要求2占40分)

要求:

(1)分析问题,并描述你的算法设计思想。

(2)编程显示数字移动过程。

问题分析:

1、通过ArrayList类的对象可以实现,

通过把1~8的数字添加到ArrayList类的对象中alist中,

然后在把他们对顺序打乱,通过Collections的

Shuffle(alist)的静态方法。

并且索引为0的位置保存着0,通过第一位实现图中的中间位置。

2、通过查找1的位置,找到之后,通过调整,把1放在索引为1的位置,1后的数字依次放在索引为1的后面,对于1前面的数依次放在最后元素的后面,类似与一个循环队列。

3、开始进行移动,通过查找n(2~8),判断n是否在n-1的位置,如果不在,需要进行移动,移动的规则如下:

先把n移近索引为0的位置,然后把n-1的索引位置x到n的索引位置y进行移动,把从索引为x的位置上元素移动到索引为y的位置上,依次类推,知道移动到n-1位置,然后把索引为0的位置元素移动到索引为n-1的位置,然后把索引为0的位置重新置为0。

具体代码如下:

publicclassT2{

LinkedListalist;

//初始化实现把1——8随即的放入图中那个,中间的位置相当于数组的索引0

pub

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1