个人作业1—数组续(文件)
题目要求:
要求数组从文件读取;如果输入的数组很大,并且有很多大的数字,就会产生比较大的结果(考虑一下数的溢出),请保证你的程序能正常输出;另外,如果输入问价你的参数有错误,这个程序应该能正常退出,并显示相应的错误信息,任何输入错误都不能导致你的程序崩溃。
设计思想:运用文件操作,先向文件中写入一些数字,再将其读取出来存入字符串中,将该字符串按空格拆分把数字存入数组中,再利用上次作业的代码进行求最大子数组的和。
遇到的问题:文件读取与写入操作不熟练,基本上可以说是忘了,重新复习了一遍这方面的内容,才成功将程序编写出来。
package test; import java.util.*; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Random; public class shuzu { private static String s; public static int max(int a[],int n) { int sum=0; int b=0; for(int i=0;i<n;i++)//由n个数组成的数组,若前m(m<n)个数的和为非正数,则从第m个数重新开始相加 { if(b<0) b=a[i]; else b+=a[i]; if(sum<b) sum=b; } return sum; } public static void main(String[] args) { Random random=new Random(); int k=0; File f1 = new File("F:\output.txt"); try { FileReader fr = new FileReader(f1); FileWriter fw=new FileWriter(f1); BufferedWriter bw =new BufferedWriter(fw); BufferedReader br = new BufferedReader(fr); if(f1.exists())System.out.println("文件存在"); else System.out.println("文件不存在"); for(int a=0;a<10000000;a++) { int rand=(int)Math.floor((random.nextDouble()*100000000.0)); bw.write(String.valueOf(rand)); bw.write(" ");//写入文件时,将数字用用空格隔开 } String l; String s=""; while((l=br.readLine())!=null){ s=s+l;//将读取的数据存入一个字符串中 } String []data=s.split(" ");//将字符串中的数字分离存入数组 int []b=new int [data.length]; for(int i=0;i<b.length;i++)//将读取的数据存入数组中 { b[i]=Integer.parseInt(data[i]); } for(int p=0;p<b.length;p++) { System.out.println(b[p]); } System.out.print("最大子数组和为:"); int t=b[0]; for(int i=0;i<b.length;i++) { if(b[i]<0) {k++;} } if(k==b.length)//判断数组中的数字是否全为负数 { for(int i=0;i<b.length;i++) { if(b[i]>t) { t=b[i]; } } System.out.println(t); } else System.out.println(max(b,b.length)); bw.close(); br.close(); }catch (IOException e) { e.printStackTrace(); } } }
截图:
(输出了1000万个8位数的数字)