zoukankan      html  css  js  c++  java
  • 个人作业1-数组(续1)

    新情况:

      1.要求数组从文件读取。

      2.如果输入的数组很大,并且有很多大的数字,就会产生比较大的结果(考虑一下数的溢出),请保持你的程序正常输出。

      3.另外,如果输入文件的参数有错误,这个程序应该能正确退出,并显示相应的错误。任何输入错误都不能导致你的程序崩溃。

    设计思想:

           首先实现文件的输入输出,向文件输入时采取一行一个数的方式输入,这样在取值时可以比较简单,一行一行的取。考虑到数组大小的不确定性,采用容器list从文件中获取数据,同时还可以很好的解决数组过大问题。最后解决数的溢出问题,采用BigInteger解决。最后进行测试,解决一些意外导致的问题。

    出现的问题:

           1.在使用BigInteger时add()函数出错,数值无法相加。

      2.用list容器直接操作时出现了一些错误。

      3.每次重新进行操作时新增的内容会出现在旧的内容之下。

    解决方法:
      1.直接运用maxstart.add(y) 数值不变,所以我创了一个新的BigInteger变量v,让v=maxstart.add(y),发现可以得到相加的结果,之后我让maxstart=v,问题解决。

      2.直接使用list容器容易出错,所以我通过for循环将容器中的值一一赋到String数组中。

      3.我在程序的末尾加入了文件清空函数。

    package shuzuxu;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.math.BigInteger;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    import java.util.*;
    public class shuzu {
        public static void main(String[] args) throws Exception{
                    File f = new File("hello.txt");
                    judeFileExists(f);//判断文件是否存在
                    //用FileOutputSteam包装文件,并设置文件可追加
                    OutputStream out = new FileOutputStream(f,true);
                    Scanner in=new Scanner(System.in);
                    System.out.println("请输入产生随机数的数量:");
                    String nums;
                    int n;
                     while(true)//判断输入是否为整数
                    {
                          try
                          {
                           nums=in.next() ;
                           n=Integer.parseInt(nums) ;
                                   break ;
                          }
                          catch(Exception e)
                          {
                           System.out.println("只能输入整数") ;
                          }
                    }
                    for(int i=0;i<n;i++)
                    {
                        java.util.Random r=new java.util.Random();
                        String s=Integer.toString(r.nextInt());
                        out.write(s.getBytes()); //向文件中写入数据
                        out.write('
    '); // 
    表示换行
                        out.write('
    '); 
                    }
                    List list = new ArrayList();
                    BufferedReader bw = new BufferedReader(new FileReader(f));
                     String line = null;
                       //因为不知道有几行数据,所以先存入list集合中
                       while((line = bw.readLine()) != null){
                           list.add(line);
                       }
                       //bw.close();
                       int a=list.size();
                        String[] li=new String[a];
                       for(int i=0;i<list.size();i++)
                       {
                           li[i]=(String) list.get(i);
                           System.out.println(li[i]);
                       }
                       BigInteger maxsum = new BigInteger("0");
                       BigInteger maxstart = new BigInteger("0");//用于判断子数组是否小于0
                       BigInteger x = new BigInteger("0");
                        maxsum = new BigInteger(li[0]);
                        BigInteger y;
                        for(int i = 0;i < list.size();i++)
                        {
                            if (maxstart.compareTo(x)!=1) {//忽略掉和为负数和0的子数组
                                maxstart = new BigInteger(li[i]);
                            }else {
                                y= new BigInteger(li[i]);
                                BigInteger v=maxstart.add(y);
                                maxstart=v;
                            }
                            
                            if (maxsum.compareTo(maxstart)<0) {
                                maxsum = maxstart;
                            }
                        }
                        System.out.println("最大值为:" + maxsum);
                        FileWriter fileWriter =new FileWriter(f);
                        fileWriter.flush();
                        fileWriter.close();
                        String line1 = null;
                           if((line1 = bw.readLine()) == null){
                               System.out.println("文件清空成功");;
                           }
                        
                }
        public static void judeFileExists(File file) {//判断文件是否存在
            
                    if (file.exists()) {
                         System.out.println("file exists");
                     } else {
                       System.out.println("file not exists, create it ...");
                         try {
                             file.createNewFile();
                         } catch (IOException e) {
                             // TODO Auto-generated catch block
                             e.printStackTrace();
                         }
                     }
             }
    }

    结果截图:

    总结:

         目前测试的最大数组为500万,明显运行的非常慢,不过还可以运行,接下来的任务是尽可能优化程序。在第三点,我对输入的数组的数量进行了一次循环判断,如果输入的不是整数则重新输入,之后增加了一个判断文件是否存在的函数,在程序末尾加了判断文件是否为空的if语句,总之通过本次作业,我进行了依次小型的单元测试,也力争让程序变得更完善,之后我会继续修改,争取能变得更好。

  • 相关阅读:
    PLECS—晶闸管-第九周
    第五六周读书笔记
    PLEC-交流电机系统+笔记
    直流电机交流电机读书笔记-4
    PLECS—直流电机系统2
    自动化技术中的进给电气传动-读书笔记3
    文档保存
    TensorFlow安装教程(CPU版)
    团队项目开发日志--(第四篇)
    团队项目开发日志--(第三篇)
  • 原文地址:https://www.cnblogs.com/liujinxin123/p/10533709.html
Copyright © 2011-2022 走看看