20172311 2017-2018-2 《程序设计与数据结构》第九周学习总结
教材学习内容总结
本周对异常和递归进行了学习
- 异常的处理方式有两种:一种是直接抛出,并从异常处终止程序;另一种是捕获并处理异常,从而使程序继续运行。
- 捕获和处理异常主要运用
try-catch
语句。 - 通过继承
Exception
类可以自定义一个新的异常 - 处理IO异常的常用方法是抛出异常。
- 对于某些问题,递归是最精炼和适当的解法,但对于其他问题,递归则不如迭代方法直接。
教材学习中的问题和解决过程
问题:什么是IO操作
- 问题一解决方案:通过上网查阅资料了解到: 所谓IO,也就是Input与Output的缩写 对于文件内容的操作主要分为两大类分别是:
1.字符流
2.字节流
其中,字符流有两个抽象类:Writer Reader
其对应子类FileWriter和FileReader可实现文件的读写操作
BufferedWriter和BufferedReader能够提供缓冲区功能
,用以提高效率
同样,字节流也有两个抽象类:InputStream OutputStream
其对应子类有FileInputStream和FileOutputStream实现文件读写
BufferedInputStream和BufferedOutputStream提供缓冲区功能。
- 字符流写入的例子:
import java.io.File; import java.io.FileWriter; import java.io.IOException; public class Demo { public static void main(String[] args ) { //创建要操作的文件路径和名称 //其中,File.separator表示系统相关的分隔符,Linux下为:/ Windows下为:\\ String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.txt"; //由于IO操作会抛出异常,因此在try语句块的外部定义FileWriter的引用 FileWriter w = null; try { //以path为路径创建一个新的FileWriter对象 //如果需要追加数据,而不是覆盖,则使用FileWriter(path,true)构造方法 w = new FileWriter(path); //将字符串写入到流中,\r\n表示换行想有好的 w.write("Nerxious is a good boy\r\n"); //如果想马上看到写入效果,则需要调用w.flush()方法 w.flush(); } catch (IOException e) { e.printStackTrace(); } finally { //如果前面发生异常,那么是无法产生w对象的 //因此要做出判断,以免发生空指针异常 if(w != null) { try { //关闭流资源,需要再次捕捉异常 w.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
- 字符流读取的实例:
import java.io.File; import java.io.FileReader; import java.io.IOException; public class Demo2 { public static void main(String[] args ) { String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.txt"; FileReader r = null; try { r = new FileReader(path); //方式一:读取单个字符的方式 //每读取一次,向下移动一个字符单位 int temp1 = r.read(); System.out.println((char)temp1); int temp2 = r.read(); System.out.println((char)temp2); //方式二:循环读取 //read()方法读到文件末尾会返回-1 /* while (true) { int temp = r.read(); if (temp == -1) { break; } System.out.print((char)temp); } */ //方式三:循环读取的简化操作 //单个字符读取,当temp不等于-1的时候打印字符 /*int temp = 0; while ((temp = r.read()) != -1) { System.out.print((char)temp); } */ //方式四:读入到字符数组 /* char[] buf = new char[1024]; int temp = r.read(buf); //将数组转化为字符串打印,后面参数的意思是 //如果字符数组未满,转化成字符串打印后尾部也许会出现其他字符 //因此,读取的字符有多少个,就转化多少为字符串 System.out.println(new String(buf,0,temp)); */ //方式五:读入到字符数组的优化 //由于有时候文件太大,无法确定需要定义的数组大小 //因此一般定义数组长度为1024,采用循环的方式读入 /* char[] buf = new char[1024]; int temp = 0; while((temp = r.read(buf)) != -1) { System.out.print(new String(buf,0,temp)); } */ } catch (IOException e) { e.printStackTrace(); } finally { if(r != null) { try { r.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
更多示例见参考资料:
代码调试中的问题和解决过程
问题1:做pp12.1时使用while
语句出现逻辑错误
- 错误的判断是否为回文的方法代码如下:
public static boolean Palindrome(String str1){ int left=0; int right=str1.length()-1; boolean result; while (str1.charAt(left) == str1.charAt(right) && left < right) { str1 = str1.substring(1, str1.length() - 1); Palindrome(str1); } if (left>=right) result=true; else result=false; return result; }
- 问题1解决方案:自己写的方法通过单步调试仍未找到解决方法 通过询问同学找到适用的方法代码如下:
public static boolean Palindrome(String str){ if(str.length()==1) return true ; else if(str.length()==2) { if(str.charAt(0)==str.charAt(str.length()-1)) return true ; else return false ; } else if(str.charAt(0)==str.charAt(str.length()-1)) return Palindrome(str.substring(1,str.length()-1)) ; else return false; }
问题2:做pp12.9时遇到较大麻烦,不知道怎样使用递归方法输出杨辉三角
问题2解决方案:
- 网上查阅资料找到一个生成10行杨辉三角的代码如下:
//递归输出杨辉三角public class Yanghuitriangle {public static int digui(int i,int j){if(j==0||j==i)return 1;elsereturn digui(i-1,j)+digui(i-1,j-1);}public static void main(String args[]){int tri[][];tri=new int[10][10];for(int i=0;i<10;i++)for(int j=0;j<=i;j++)tri[i][j]=digui(i,j);for(int i=0;i<10;i++){System.out.println();for(int n=10-i;n>=1;n--)System.out.print(" ");for(int j=0;j<=i;j++)System.out.print(tri[i][j]+" ");}}}
参考资料的链接:
- 修改后实现生成指定行数N的杨辉三角并可以输出第N行的代码如下:
import java.util.Scanner;public class Pascal { public static int digui(int i, int j) { if (j == 0 || j == i) return 1; else return digui(i - 1, j) + digui(i - 1, j - 1); } public static void main(String args[]) { Scanner scan = new Scanner(System.in); System.out.print("请输入杨辉三角的行数: "); int raw = scan.nextInt(); int tri[][] = new int[raw][raw]; for (int i = 0; i < raw; i++) for (int j = 0; j <= i; j++) tri[i][j] = digui(i, j); System.out.println("共有N行的杨辉三角为: "); for (int i = 0; i < raw; i++) { System.out.println(); for (int n = raw - i; n >= 1; n--) System.out.print(" "); for (int j = 0; j <= i; j++) System.out.print(+tri[i][j] + " "); } System.out.println(); System.out.println("共有N行的杨辉三角的第N行为: "); for (int j = 0; j < raw; j++) System.out.print(tri[(raw - 1)][j] + " "); } }
上周考试错题总结
错题1
理解:D: 异常不会被抛出到异常类中错题2
理解:不理解!原因如下: 这确实是按顺序输出的啊!!错题3
理解:如果字符串方法的参数引用字符串中超出字符串边界的位置,则会抛出StringIndexOutOfBoundsException。可以发生在charAt
方法中。错题4
理解:可以保存任何给定的对象以供将来使用。这种特性称为持久性,通过将对象的实例数据保存到文件中来实现这一点错题5
理解:System.err
是一个对象。错题6
错因:概念理解欠缺。- 错题7 理解:能使用
readLine()
方法说明文件已经有了,readLine()
方法用于返回字符串,该字符串等于文件中的下一个文本项;如果文件为空,则返回null 错题8
理解:PrintWriter
是专门为文件而设计的,因此有错误检查机制,而PrintStream
没有错题9
错因:笔误!!!!错题10
验证: 确实只是执行了第一个错误!
结对及互评
黄宇瑭小伙伴编码能力的提升很大,继续加油吧!!!
点评过的同学博客和代码
- 本周结对学习情况
结对学习内容
对四则运算的进一步讨论!对IO异常的处理及文件的写入!- 上周博客互评情况
感悟
坚持到底就是胜利!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 28/28 | 1/1 | 16/16 | |
第二周 | 710/738 | 1/2 | 20/36 | |
第三周 | 426/1164 | 1/3 | 16/52 | |
第四周 | 1068/2232 | 2/5 | 20/72 | |
第五周 | 604/2928 | 1/6 | 22/94 | |
第六周 | 609/3537 | 1/7 | 22/116 | |
第七周 | 599/4136 | 1/8 | 18/134 | |
第八周 | 1052/5188 | 3/11 | 20/154 | |
第九周 | 866/6054 | 1/12 | 20/174 |
计划学习时间:18小时
实际学习时间:20小时
改进情况:努力提前完成作业,留出更多时间扩展。