个人作业2-数组(续篇)

继上周的数组又提的进一步要求:     

      1.要求数组从文件读取。
      2.如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。
      3.另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。

设计思路:

       我觉着解决这个问题一定要分步实现,首先别管后面要先实现数组从文件中读取,刚开始对我来说这步就挺难的,因为完全忘了文件读取的方式,然后我就去网上查了一下如何从文件中读取数据,一开始我是自己往文件里写数据,后来就开始通过控制台输入写入文件然后在读取

      第二步就是实现写入文件用随机数的形式,而不是手动输入,

      第三步考虑各种异常使程序不崩,比如文件是否存在,输入产生的随机数个数时是否为纯数字,文件是否读取成功

      第四步就是随机产生正负数的问题,我想过很多方法,但是后来我从网上找了一个比较简便的,利用这个int aa=(int)(Math.pow(-1, a));/*表示-1的a次方*/    产生负1或者正1然后乘以随机数,这样就可以随机出现正负数

      第五步考虑大数的问题,

      最后就是套用上次的子数组求和了

https://vimsky.com/article/3417.html

http://www.cnblogs.com/unknownname/p/8823887.html

https://blog.csdn.net/qfikh/article/details/52832196

我觉得这几篇文章还有别人的博客园给了我一些启发,最后利用BigInteger num2=new BigInteger(String.valueOf(num));
        bw.write(String.valueOf(num2));//来保证运算精度不溢出

      源代码:

package array;

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.math.BigInteger;
import java.util.Scanner;

public class array {
public static void main(String[] args) {		
	writeFile();
	int datas[]=readFile();
	for( int i=0;i<datas.length;i++) {
		System.out.print(datas[i]+"   ");
	}
	int array[]=new int[datas.length];
	int array2[]=new int[datas.length];
	int n=datas.length;
	for(int i=0;i<n;i++) {
		array2[i]=0;
		array[i]=datas[i];
	}
	int max;
	for(int i=0;i<n;i++) {
		int sum=0;
		max=array[i];
		for(int j=i;j<n;j++) {
			sum=sum+array[j];				
		if(max<sum) {
			max=sum;
		}
		}
			array2[i]=max;	
			//System.out.println(max);
	}
	int k=array2[0];
	for(int i=0;i<n;i++) {
		if(array2[i]>k) {
			k=array2[i];
		}
	}
	System.out.println("最大值"+k);
} 
/* 写入txt文件*/
public static void writeFile() {
	
		File f=new File("E:\txt\array.txt");
		if(!f.exists()) {
			try {
				f.createNewFile();
				System.out.println("array.txt创建完成");
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
				System.out.println("array.txt创建失败");
			}			
		}
		FileWriter fw;
		try {
			fw = new FileWriter(f);
		
		BufferedWriter bw=new BufferedWriter(fw);	
		System.out.println("请输入随机数的个数");
		Scanner sc=new Scanner(System.in);
		int n=0;
		if(sc.hasNextInt()) {
			 n=sc.nextInt();
			System.out.println(n);
		}
		else {
			System.out.println("请输入正确的数字~!");
			System.exit(0);
		}/*
		hasNextInt()方法是判断控制台接收是否为数字,
		当你在控制台输入一个字符的时候,hasNextInt()判断你输入这个字符是不是数字,
		而不是接收值,当if判断通过之后执行接收,也就是你输入的那个字符,*/
		for(int i=0;i<n;i++) {
		int a=(int)(Math.random()*2+1);	
		int aa=(int)(Math.pow(-1, a));/*表示-1的a次方*/	
		int aaa=(int)(Math.random()*1000000000);
		int num=aa*aaa;
		BigInteger num2=new BigInteger(String.valueOf(num));
		bw.write(String.valueOf(num2));//保证运算精度不溢出
		bw.write(" ");	
	}
	bw.newLine();
	bw.close();
	fw.close();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
}
public static int[] readFile() {
	FileReader fr;
	try {
		fr = new FileReader("E:\txt\array.txt");
		BufferedReader br=new BufferedReader(fr);
		String line;
		String s="";
		while ((line = br.readLine()) != null) {
            // 一次读入一行数据		
           s=s+line;
        }
		String []data=s.split(" ");//按照空格分割字符串
		int [] datas=new int[data.length];
		for(int j=0;j<data.length;j++) {
			datas[j]=Integer.parseInt(data[j]);
		}
		
		return datas;
	} catch (IOException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
		System.out.println("读取文件失败");
		return null;
	}	
}
}

	

 截图:

个人反思:

感触很深,花了整整一下午加晚上去弄这些,时间特别长,中间想过要放弃去找别人的用一用就完了,后来好在我没有,很开心最后终于弄完了,虽然瑕疵还不少,但是我觉得我逐渐地正在学会用分步的思想去解决问题,我觉得这对我来说也是一大进步,以后的我首先不要轻言放弃,一定要自己去尝试才有效果。然后继续努力,你还差得很远。

原文地址:https://www.cnblogs.com/zzstdruan1707-4/p/10549258.html