作业2
作业要求:
-
第一版本程序Prog1: + 给定一个数组,实现数组元素求和;,具体要求:实现对一维数组(a[100])的所有元素相加运算。 + 数据准备:a)数组长度:100;b)数组数据来源:实验数据A列:1~100,CSV 格式则填充 前100个数据.
-
第二版本程序Prog2: + 改写成一个函数(函数名称为ArraySum),能实现任意长度数组所有元素求和; + 数据准备:a)数组长度:任意; b)数组数据来源:实验数据A列.
-
第三版本程序Prog3: + 将Prog2改写成能从文件中读取数据,实现任意长度数组,指定范围内元素相加。 + 数据准备:a)数组长度:任意; b)数组数据来源:从文件中读取.
-
依次将Prog1、Porg2、Prog3上传到Github。
-
发布一篇博客,介绍上述三个程序的实现过程。遇到的问题及如何解决的。
prog1:
第一版本的程序实际上是很简单的,因为没有要求从文件中读取,我们可以直接复制前100个元素(虽然用文件流更简单)。这题没什么好说的,太简单了。
prog2:
第二版本的程序也不是很难,只不过这次要求任意长度的数组,所以要先从控制台输入数组的长度,这里用Scanner类实现数组长度的输入。用文件流方式把A列前100个数取出,具体实现过程是按行读取数据,然后屏蔽掉B和C列,求和,输出。
prog3:
第三版程序我在一个地方卡了一个下午,就是文件的打开,当我把Excel文件里的数据粘贴复制进txt文件中时,然后再程序中使用时程序总是出错,而把要打开的文件换成csv格式时,就能成功。
程序的具体过程是这样的,我先要求用户输入任意的数组长度(不大于3*65535),再输入数组要求和的范围;
我把求和的过程分为三个部分:第一部分为范围小下标那一行,中间所有行,最后一行。各自分析,然后相加。最后打印出结果。
github账号:dxy123456
prog1:
package prog; import java.io.*; public class prog1 { public static void main(String[] args) { try{System.out.println("下面是数组100个元素的和:"); FileReader fr1=new FileReader("data.csv"); BufferedReader bf1=new BufferedReader(fr1); String str1 = null;String [] strI=null;int total=0,j=0,count=0; while(count<100&&(str1=bf1.readLine())!=null){ //将中间的数全相加 strI=str1.split(","); count++; j=Integer.parseInt(strI[0]); total+=j; } System.out.print("the 100 number sum is:"+total); fr1.close(); bf1.close(); }catch (Exception e){ e.printStackTrace();} } }
prog2:
package prog; import java.io.*; import java.util.Scanner; public class prog2 { public static void main(String[] args) { try{System.out.println("请输入数组的长度:"); Scanner in = new Scanner(System.in); int a = in.nextInt(); in.close(); FileReader fr1=new FileReader("data.csv"); BufferedReader bf1=new BufferedReader(fr1); String str1 = null;String [] strI=null;int total=0,j=0,count=0; while(count<a&&(str1=bf1.readLine())!=null){ //将中间的数全相加 strI=str1.split(","); count++; j=Integer.parseInt(strI[0]); total+=j; } System.out.print("the"+a+ "number sum is:"+total); fr1.close(); bf1.close(); }catch (Exception e){ e.printStackTrace();} } }
prog3:
package prog; import java.io.*; import java.util.*; /*已知数据在文件中的存储方式为每三个数为一行,共65536行*/ public class prog3{ public static void main(String[] args) { System.out.println("输入数组长度(默认起始位置从第一个数据开始开始):"); Scanner in = new Scanner(System.in); int a = in.nextInt(); System.out.println("下面将在数组的指定范围内求sum"); System.out.println("输入范围的起始值(假设第一个数据的起始位置为0):"); int b=in.nextInt(); System.out.println("输入范围的结束值:"); int c=in.nextInt(); in.close();int flage=0; try{ if(b<0||c>=a) { flage=1; System.out.println("超出范围!");throw new IOException(); } if(b>c) { flage=1; System.out.println("左范围大于右范围!");throw new IOException(); } }catch(Exception e){e.printStackTrace();} if(flage==0) D(a,b,c); } public static void D(int a,int b,int c) { try{ FileReader fr1=new FileReader("data.csv"); BufferedReader bf1=new BufferedReader(fr1); int count=0; String str1 = null;String [] strI=null;int total=0,j=0; while((b/3+1)>1&&(str1=bf1.readLine())!=null){//字符不等于空,找到要求数组的上一行! count++; if(b/3==count) break; } str1=bf1.readLine(); count++; //开始累加的起始行数 strI=str1.split(","); int f=b%3; if(c/3>b/3){ //防止指定范围只在第一行 for(;f<3;f++){ //将起始行元素相加 j=Integer.parseInt(strI[f]); System.out.print("前面"+j+"\n"); total+=j; } } else{ //如果范围只有一个或两个元素且靠近左边 for(;f<=(c%3);f++){ j=Integer.parseInt(strI[f]); System.out.print("前面"+j+"\n"); total+=j; } } if(b/3!=c/3){ while((c/3!=count)&&(str1=bf1.readLine())!=null){ //将中间的数全相加 strI=str1.split(",");count++; for(int i=0;i<3;i++){ j=Integer.parseInt(strI[i]); System.out.print("中间"+j+"\n"); total+=j; } } } str1=bf1.readLine(); strI=str1.split(","); int y=c%3; if(b/3!=c/3){ for(int s=0;s<=y;s++){ //将最后一行元素相加 j=Integer.parseInt(strI[s]); System.out.print("最后"+j+"\n"); total+=j; } } System.out.print("\n"+total); fr1.close(); bf1.close(); }catch (Exception e){ e.printStackTrace();} } }