个人作业--数组(续一)
实验要求:(在上次要求的基础上)
1.要求数组从文件读取。
2.如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。
3.另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。
设计思想:
因为要从文件中读取这就需要用到一些文件的相关知识了,我最开始做的就是先在文件中输入一个数组,以空格的形式将每个数分开,从文件中将其读出,先读入到一个字符串中,在根据空格将其分割开,并且,通过Integer.parseInt将字符串转换为int型然后在通过上次编写的求最大子数组的方法进行最大子数组的求值。下一步就是编写一个随机生成数的方法,产生规定数量的随机数。并将其写入到文件中。
遇到的问题及解决方法:
1.最开始在文件的读取之后对其进行分割,从String类型转化为int型时遇到了问题,首先根据空格划分的时候确实是将字符串为数组了,但是,除了第一个之外其他数组元素都含有一个空格,所以系统无法对其进行转化,之后通过查阅资料后,采用利用数字范围的方式将其解决(String[] rang = s.split("[^(-9--10-9)]");)这就使成功将文件中的元素转化为int型,并进行运算了。
2.在文件的写入阶段也遇到了问题,在由于我直接用的FileWriter进行写入,导致存入的数都是乱码,无法通过文件进行读取。后来通过请教同学学会使用BufferWriter,将成熟的随机数写入到了文件中。另外,在编写中的另一个问题就是随机值得问题,由于随机数的值都是大于1的,为了产生负数,我对两个随机数进行相减,实现了正负数的效果
3.第三步就是处理大数的问题了,由于最初都是用的int型的所以在输入百万级的数后就会出现溢出的状况,所以经过回来查阅相关资料都将int型改为了大数Biginteger型。
1 package test; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileWriter; 8 import java.io.IOException; 9 import java.io.InputStreamReader; 10 import java.math.BigInteger; 11 import java.util.Scanner; 12 13 public class shu1 { 14 static String s = ""; 15 static Scanner in = new Scanner(System.in); 16 17 public static void main(String[] args) throws IOException { 18 19 20 chansheng(); 21 read(); 22 23 //System.out.println(s); 24 String[] rang = s.split("[^(-9--10-9)]"); //按照数字的方式对读入的字符串进行划分,并存入到rang数组中 25 26 27 28 // int value = 0; 29 // int sum =0; 30 BigInteger value = new BigInteger("0"); 31 BigInteger sum = new BigInteger(String.valueOf(rang[0])); //将数组中的第一个值赋值给sum 32 33 //sum = Integer.parseInt(rang[0]); 34 for(int i = 0;i < rang.length;i++) 35 { 36 int a = value.compareTo(BigInteger.valueOf(0)); 37 if ( a == 0 || a == -1) { 38 //value = Integer.parseInt(rang[i]); //当用于记录的值小于等于0时就无需对其进行相加了,此时就等于下一个值 39 value = new BigInteger(String.valueOf(rang[i])); 40 }else { 41 value.add(new BigInteger(String.valueOf(rang[i]))); 42 //value += Integer.parseInt(rang[i]); //当value的值仍大于0时就继续相加 43 } 44 45 if (sum.compareTo(value) == -1) { //用sum等于子数组的最大值,若value的值大于sum的值,则将value赋值给sum 46 sum = value; 47 } 48 } 49 50 System.out.println("最大值为:" + sum); 51 52 53 54 55 } 56 //读取文件的方法 57 public static String read() throws IOException 58 { 59 60 FileInputStream fis = new FileInputStream("d:\\文件\\数组.txt"); 61 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 62 String temp = ""; 63 while((temp = br.readLine()) != null) 64 s = s + temp + "\n"; //将文件中的文章都存入字符串s中 65 66 fis.close();//关闭文件 67 br.close(); 68 return s; 69 } 70 71 //产生随机数,并将其写入到文件的操作 72 public static void chansheng() throws IOException 73 { 74 int n; 75 System.out.println("请输入计算的数据量"); 76 n = in.nextInt(); 77 File file1 = new File("d:\\文件\\数组.txt"); 78 FileWriter out = new FileWriter(file1); 79 BufferedWriter bw = new BufferedWriter(out); 80 for(int i = 0;i < n ; i++) 81 { 82 //int ran = (int)(Math.random()*10000000) - (int)(Math.random()*100000000); 83 int ran = (int)(Math.random()*10000000) - (int)(Math.random()*100000000); 84 BigInteger a = new BigInteger(String.valueOf(ran)); 85 //bw.write(String.valueOf(ran) + " "); 86 bw.write(String.valueOf(a) + " "); 87 } 88 bw.close(); 89 90 } 91 92 }
实验结果截图:
五百万条数据大约46.6M
总结:
经过本次实验,我深刻的意识到在程序在进行运算的过程中,保证数据的准确性是一个重点,由于数据精度以及范围的不同在进行数据计算的时候就会产生数据过大导致数据溢出,或者处理的数据量过大而导致程序直接卡死。根据这几次的上课,以及实验认识到了自己思维的局限,自己所处理的都是实验室类型的程序,缺乏对时间、空间以及实际问题的具体分析,其实程序中还存在着很大的问题。之后一定要尽可能的去多想一下实际问题,尽可能的完善自己的程序。
转载于:https://www.cnblogs.com/1gaoyu/p/10533791.html
个人作业--数组(续一)相关推荐
- 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业(续)(5~ 7)
感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 此答案仅供参考. 提交作业时需把 public class Homework_ ...
- 圆桌问题(数据结构作业+数组和链表)(1024程序员不容易,这次给源码)
文章目录 问题描述 输入说明 输出说明 输入范例 输出范例 题目分析 问题重点 思路分析 源码 事故现场 关于走路有点弄混了,分不清步数了 第一次提交 第二次提交 第三次提交 第四次提交 分析与总结 ...
- Java基础+流程控制+方法+数组【笔记含代码】
文章目录 什么是计算机 计算机硬件 计算机软件 DOS命令 计算机语言发展史 第一代语言 第二代语言 第三代语言 Java帝国的诞生 C & C++ 反抗 Java初生 Java发展 Java ...
- EHPC通过断点续算和自动伸缩在抢占式实例上实现低成本HPC计算
摘要: E-HPC 低成本计算方案 E-HPC作为阿里云上的云超算产品将HPCaaS公共云服务提供给客户,将公共云上资源弹性优势,高性能的优势,计算资源的多样性等优势提供给HPC用户,如果HPC用户追 ...
- Java数组初始化, 冒泡排序, 查找
文章目录 数组快速入门 数组的使用 使用方式1 动态初始化 使用方式2 动态初始化 使用方式3 静态初始化 数组使用注意事项和细节 数组赋值机制 数组翻转 数组扩容 排序的介绍 冒泡排序法 数组的查找 ...
- python qsub是啥意思_python – 使用qsub提交连续和独立作业的速度有多快?
这个问题与 pbs job no output when busy有关.即我提交的一些工作在PBS / Torque"忙"时不产生输出.我想,当一个接一个地提交许多工作时,它更加繁 ...
- slurm作业提交系统常用命令
常用术语 user:用户名 node:计算节点 core:cpu 核 job:作业 job step:作业步,单个作业可以有多个作业步 partition:分区,作业需在特定分区中运行 QOS:服务质 ...
- 常用Slurm作业投递及查询命令
1. 集群常用概念 job step: 作业步,单个作业可以有多个作业步 partition:分区,作业需要在特定分区中运行(理解为定义了队列,每个队列中包含不同节点) QOS:服务质量,可理解为用户 ...
- linux怎么用两个进程传值,关于linux:将变量脚本参数传递给另一个脚本,然后将qsub传递给程序...
在阅读了大量的bash脚本线程和帮助站点之后,我找不到一个有效的解决方案. 我想把一个变量参数'i'从一个脚本传递到另一个脚本$i,然后qsub它到一个程序"$1".在程序中,我从 ...
- 200804C阶段一变量生存期和结构体
目录 一.学习的知识点 作业 1.函数 函数间的数据传递 变量的生存期 内存中的存储区域包括 存储类别 2.结构体 结构体声明 结构体初始化 结构体赋值 二.上课没有听懂或者没有理解的地方 三.当天学 ...
最新文章
- c语言可视化_这些算法可视化网站助你轻松学算法
- 21个令程序员泪流满面的瞬间
- 海量数据中,寻找最小的k个数。
- Java 并发编程之 Callable 和 Future
- RHEL7 -- NetworkManager
- Dubbo2.7源码分析-如何发布服务
- 小米手机 更换app图标失败的解决方法
- iphone强制旋转屏幕_锁定iPhone屏幕旋转
- recyclerView多条目加载,点击动画事件
- Laravel 登录验证,md5验证,自定义验证,自定义表
- 【知识点2】最大公约数与最小公约数
- 华为服务器网卡驱动安装文件,服务器网卡驱动
- ultraedit破解版添加右键关联
- 面试题汇总:阿里、百度、京东、美团等
- 2019百度云智峰会重磅发布:全自研昆仑云服务器、智能来电小秘书
- 苹果测试充电速度软件,苹果iOS11.2第4个测试版 iPhoneX无线充电速度加快
- 虾皮本土店怎么回款?成都星志远
- 电机、 电源等多条电路的接线方法
- 大功率无刷电机驱动器设计(持续更新中)
- AI人才招聘:年薪最高近百万,独角兽公司招算法工程师
热门文章
- jquery 加载提示框
- UITableVIew与UICollectionView带动画删除cell时崩溃的处理
- 大学校讯通需求调研报告之精华
- for循环的使用—打印输出各种图形
- Oracle DBLINK 简单使用
- SqlServer性能检测之Sql语句排查
- 每天一道剑指offer-包含min函数的栈
- 专线服务器安全维护,服务器系统安全维护
- 联发科mtk手机处理器怎么样_【今日短讯】一加概念手机Concept One发布|苹果iPhone 9渲染图出炉|联发科5G处理器天玑800发布...
- 怎么查看ingress的规则_Prometheus PormQL语法及告警规则写法