一:素数输出
1.实验要求:
(1)编写判断该数是否为素数的方法,并在主方法中对其进行调用。
(2)注意编程规范:程序开头部分的目的,作者以及日期;必要的空格与缩进,适当的注释等;
(3)实验报告中要求包括程序设计思想、程序流程图、源代码、运行结果截图、编译错误分析等内容。
2.实验内容
(1)计算并输出3~100之间的素数。
(2)编程满足下列要求:
1)按照每行5个输出;
2)输出任意两个整数之间的所有素数;
3)输入两个整数,输出这两个整数之间的最大的10个和最小的10个素数
3.程序设计思想:
首先要了解素数的定义在大于1的自然数中,不存在除了1和它本身的因数。了解定义后,就知道要用循环语句依次求余来判断。我采用在类外定义一个只有一个参数的函数,来实现判断这个参数是否为素数。任意两个整数之间的素数输出,我用for语句将他们分别定义为初始条件和结束条件,然后又定义了一个计数器,实现每行五个输出,最后的最大和最小素数,只用了一个动态数组Arraylist,正反输出就解决了
4.源代码:
1 package java课堂; 2 3 /*20173442 信1705-3 田昕可*/ 4 5 import java.util.*; 6 7 public class Zuoye2 { 8 9 10 11 12 13 public static void main(String[] args) { 14 15 // TODO 自动生成的方法存根 16 17 int i; 18 19 int n; 20 21 int m; 22 23 int c=0; 24 25 ArrayList list=new ArrayList();//定义动态数组 26 27 Scanner scan=new Scanner(System.in); 28 29 System.out.println("请输入两个数,计算他们中间的素数"); 30 31 n=scan.nextInt(); 32 33 m=scan.nextInt();//输入两个数 34 35 for(i=n;i<=m;i++) 36 37 { 38 39 if(func(i)==1) 40 41 { 42 43 System.out.print(i+" "); 44 45 list.add(i); 46 47 c++; 48 49 } 50 51 else 52 53 continue; 54 55 if(c%5==0) 56 57 { 58 59 System.out.print(" "); 60 61 } 62 63 64 65 } 66 67 System.out.print(" ");//换行,进行下一个操作 68 69 if(list.size()<10) 70 71 System.out.print("不足十个数"); 72 73 else 74 75 { 76 77 System.out.print("最小的十个素数 :"); 78 79 for(i=0;i<10;i++) 80 81 System.out.print(list.get(i)+" ");//输出最小的十个素 82 83 System.out.print(" ");//换行,进行下一个操作 84 85 System.out.print("最大的十个素数 :"); 86 87 for(i=list.size()-1;i>=list.size()-10;i--) 88 89 System.out.print(list.get(i)+" ");//输出最大的十个素数 90 91 } 92 93 94 95 } 96 97 98 99 public static int func(int n)//判断是否为素数的函数 100 101 { 102 103 int i; 104 105 boolean bl=true; 106 107 for(i=2;i<n;i++) 108 109 { 110 111 if(n%i==0) 112 113 bl=false; 114 115 } 116 117 if(bl==true) 118 119 return 1; 120 121 else 122 123 return 0; 124 125 } 126 127 128 129 }
反思思考:
第一次调试时,发现不能得到正常结果,最后返回来看代码发现,在输出最大的十个素数,进行动态数组从后往前操作时,初始值越界,没有考虑到数组下标的特殊性,通过修改解决了问题。
二:递归方法
1、 实验要求:
(1)必须用递归函数实现上述问题;
(2)注意编程规范:程序开头部分的目的,作者以及日期;必要的空格与缩进,适当的注释等;
(3)实验报告中要求包括程序设计思想、程序流程图、源代码、运行结果截图、编译错误分析等内容。
2、 实验内容
(1) 使用递归方式判断某个字串是否是回文( palindrome );
“回文”是指正着读、反着读都一样的句子。比如“我是谁是我”
使用递归算法检测回文的算法描述如下:
A single or zero-character string is a palindrome.
Any other string is a palindrome if the first and last characters are the same, and the string that remains, excepting those characters, is a palindrome.
3.程序设计思想:
判断字符串是否回文,第一反应是运用数组首位依次比较判断,但题目要求必须使用递归方法,那就放到类外函数体中递归使用。构造一个函数,参数为字符串首地址,初始值start,字符串的长度size。start为初始下标0,如果start>=size,说明只剩下了一个字符,一定回文,返回true,递归结束。如果满足,就依次首位判断,只要有一组不相等,就返回false。
4.源代码
1 package java课堂; 2 3 import java.util.*; 4 5 public class Huiwen { 6 7 8 9 public static boolean func(String str,int start,int size) 10 11 { 12 13 if(start>=size-1) 14 15 return true; 16 17 if(str.toCharArray()[start]!=str.toCharArray()[size-1]) 18 19 return false; 20 21 return func(str,start+1,size-1); 22 23 } 24 25 public static void main(String[] args) { 26 27 // TODO 自动生成的方法存根 28 29 Scanner scan=new Scanner(System.in); 30 31 String s; 32 33 System.out.println("请输入字符串 :"); 34 35 s=scan.nextLine(); 36 37 if(func(s,0,s.length())) 38 39 System.out.println("回文"); 40 41 else 42 43 System.out.println("不回文"); 44 45 } 46 47 48 49 }
5.运行截图
反思思考:
开始时不知道如何将字符串与下标相结合起来,后来问同学知道了toCharArray()函数,将字符串转化为字符数组,方便操作和比较
三: 统计分析
1.实验要求:
实验报告中要求包括程序设计思想、程序流程图、源代码、运行结果截图、编译错误分析等内容。
2、实验内容:
(1) 用户需求:英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《哈利波特》 中最常用的短语是什么,等等。
(2) 要求:输出单个文件中的前 N 个最常出现的英语单词,并将结果输入到文本文件中。
3.程序设计思想:
首先一定要创两个文件,一个为读入文件,一个为写入文件,并记录其路径。然后编写程序,从读入文件中读取数据,并存到字符串当中。后通过上网查询了解到字符串函数中有一项分割操作,将字符串又分割成一个一个的单词。计数的问题,我采用了创立动态数组,与字符串数组一一比较,如果存在一样的,跳过,不一样的就存入。最终通过循环,加入计数,就实现了统计。
4.源代码:
1 package java课堂; 2 3 4 5 import java.io.*; 6 7 import java.util.*; 8 9 import java.lang.*; 10 11 12 13 public class Zuoye1 { 14 15 16 17 public static void main(String[] args) { 18 19 try { 20 21 int i=0; 22 23 int j; 24 25 //从文件地址中读取内容到程序中 26 27 //1、建立连接 28 29 File file=new File("F:/java开发/wenben.txt"); 30 31 BufferedReader br=new BufferedReader(new FileReader(file)); 32 33 34 35 FileOutputStream out=new FileOutputStream("F:/java开发/jieguo.txt"); 36 37 PrintStream p=new PrintStream(out);//文件写入流 38 39 40 41 String s; 42 43 char []c=new char[200]; 44 45 s=br.readLine();//创建字符串,将文本文件中的文字存进去 46 47 System.out.println(s); 48 49 String []s1=s.split(" |,");//s1储存每一个单词 50 51 52 53 ArrayList list = new ArrayList();//动态数组 54 55 for(i=0;i<s1.length;i++) 56 57 { 58 59 if(!list.contains(s1[i])&&s1[i]!=" ") 60 61 list.add(s1[i]); 62 63 }//动态数组存储不重复的单词 64 65 for(i=0;i<list.size();i++) 66 67 { 68 69 int count=0; 70 71 for(j=0;j<s1.length;j++) 72 73 { 74 75 if(list.get(i).equals(s1[j])) 76 77 count++; 78 79 } 80 81 //System.out.println(list.get(i)+" "+count); 82 83 p.println(list.get(i)+" "+count); 84 85 }//计数 86 87 88 89 br.close(); 90 91 } catch (FileNotFoundException e) { 92 93 //系统强制解决的问题:文件没有找到 94 95 e.printStackTrace(); 96 97 } catch (IOException e) { 98 99 //文件读写异常 100 101 e.printStackTrace(); 102 103 } 104 105 106 107 } 108 109 110 111 }
反思思考:
对文件操作这块还是有很大的问题,在读入和写入的过程中耗费了太多的时间,还是基础功夫不够扎实。