1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库

一、控制显示多少位小数位

有些时候小数位数太多了,想保留多少位小数,这里介绍一种利用四舍五入保留想要的小数位数
Math.round四舍五入到整数位,所以把小数乘以整10或整百,在除以整10或整百,就得到想要的位数了

double a = 3.14159265359;
double weishu = 5;
double b = Math.pow(10,weishu);
a = Math.round(a*b)/b;


二、读txt和写txt模拟ATM数据库
在模拟ATM存取钱的时候,第二次运行就没有上一次的数据了,没有把信息储存到本地。在网上查了些txt
的读写。

经过理解之后,发现主要是以下步骤:
①载入txt的文件,主要代码是: File filename = new File("d:/bankinfo.txt")
②然后把文件放入文件输入流,再放入读取缓存,再用一行一行读取的方法,主要代码如下
BufferedReader reader = new BufferedReader(new FileReader(file));
String tempString = reader.readLine();
得到每一行的数据可以打印输出,也可以把这一行的数据用正则表达式拆分出自己想要的信息。
比如我这里就是把账户名,密码和余额放一起的。


写入的时候,是先全部读在缓存中,一行一行的读取,并一行一行的写入,到最后一行为空的时候,写入
新的数据。
主要代码如下:
String temp = br.readLine()
StringBuffer buf = buf.append(temp)


以上的代码都不是很懂,不会灵活运用,但是不妨碍根据自己的需求修改。
需求分析:
1、需要n组银行的账号,密码,余额。
2、输入账号和密码的时候匹配每一行txt的账户,密码,并得到余额。
3、存取钱的时候余额需要修改

设计思路:
1、账号用随机数生成银行卡后八位,随机生成6位数密码,随机生成10万以内的余额,并且保存到txt的
一行。
2、输入账号和密码后,读取txt的每一行,每一行取出后,根据正则表达式拆分成数组,存着账户余额密
码。依次遍历看是否匹配账户,如果匹配在看是否匹配密码。登录成功返回true,并且取出余额,还有此
行的行数,用于写数据
3、余额修改时,在写txt的时候,写到账户那一行,就把账户,密码,余额重写一次,其他行也重写一次
,其他不变

缺点:
此小程序只作于模仿,和真正的数据库差很多,txt也只作于存写数据。只是算txt读写的练习
源代码如下:

  1 package com.ATM;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.FileReader;
  6 import java.io.IOException;
  7 import java.util.Scanner;
  8 import java.io.FileNotFoundException;
  9 /**
 10  * 
 11  * @author YuanqiuChen
 12  * date 1.20-23
 13  *模拟一个简易ATM机
 14  *
 15  *
 16 要求:
 17 先做只有一个用户的:
 18 1、ATM运行之前,准备好一个账户名、账户对应的密码和账户对应的余额,
 19    并且规定,ATM机初始化时默认的剩余金额是15万,最大金额容量为20万,最大取款限额为10万。
 20 2、有一个欢迎界面
 21 3、用户输入账号和密码,并进行验证
 22    如果三次输入错误,则给出提示并退出系统
 23    如果输入正确则显示以下菜单
 24    1.查询余额  2.取款  3.存款  4.退出
 25    提示用户选择菜单
 26    如果用户输入1,则显示余额;
 27    如果用户输入2,则提示输入要取出的金额,
 28        如果金额等于0,相应提示;
 29        如果金额不是100的倍数,则给出相应提示;
 30        如果金额为负数,也提示;
 31        如果金额输入不合法(比如输入了特殊符号或者字母),也提示;
 32        如果输入的金额大于该用户的余额,也要提示,
 33        如果输入的金额超过ATM机中的剩余金额,也要提示。
 34    如果选择3,则显示存款界面,提示用户放入现金:
 35        如果输入的金额加上ATM机中剩余的金额超过了ATM机最大金额容量,则提示用户。
 36    如果选择4.则直接退出系统。
 37  *
 38  */
 39 public class ATM {
 40 
 41     public static void main(String[] args){
 42         
 43         ATMRunning people = new ATMRunning();
 44         people.welcome("中国银行");
 45         
 46         Card card1 = new Card();
 47         if(people.load(card1)){
 48             people.accountOperation(card1);
 49         }
 50         
 51                 
 52     }
 53 }
 54 
 55 class ATMRunning{
 56     
 57     private int localMoney = 150000;    //提款机本地现有钱数量
 58     private int get_Money_Already = 0;    //用户今天已经取钱数
 59     private final int MAX_LOCAL_MONEY = 200000;    //提款机本地最多存200000
 60     private final int MAX_GET_MONEY = 20000;    //这次取钱最多一共取10000元
 61     private final int MAX_GET_SIGLE_MONEY = 5000;//单次最多取5000
 62     
 63     ATMRunning(){
 64         
 65     }
 66     public double getLocalMoney() {
 67         return localMoney;
 68     }
 69 
 70     public void setLocalMoney(int localMoney) {
 71         this.localMoney = localMoney;
 72         
 73     }
 74     
 75     int lineNum = 0;                    //定义查到的账户的在文本数据
 76 
 77 库里边的行数
 78     
 79     public void welcome(String bankName){
 80         System.out.println("*************************************\n\n");
 81         System.out.println("********欢  迎  使  用   " + bankName + " ATM 机
 82 
 83 ********\n\n");
 84         System.out.println("*************************************\n");
 85         System.out.println("ATM机正在运行");
 86     }
 87     
 88     
 89     public boolean accountCheck(Card card1){
 90         Card[] data = new Card[10];
 91         for(int i = 0; i < 4; i++){
 92             data[i] = new Card();
 93         }        
 94         
 95         data[0].setAccount(1234);
 96         data[0].setPassword(123456);
 97         data[0].setMoney(31689.4);
 98         
 99         data[1].setAccount(1111);
100         data[1].setPassword(111111);
101         data[1].setMoney(310000);
102 
103         
104         File file = new File("d:/bankinfo.txt");
105         BufferedReader reader = null;
106         String str1 = null;
107         String[] str2 = new String[3];
108 
109         try {//以行为单位读取文件内容,一次读一整行
110             reader = new BufferedReader(new FileReader(file));
111             int i = 0;
112             while ((str1 = reader.readLine()) != null) {
113                 lineNum = i++;
114                 str2 = splitt(str1);
115                 if(card1.getAccount() == Double.parseDouble(str2[0])){
116                     if(card1.getPassword() == Double.parseDouble(str2
117 
118 [1])){
119                         card1.setMoney(Double.parseDouble(str2[2]));    
120 
121     //问题,card1变了,data还没有变
122                         return true;
123                     }
124                 }
125             }
126             reader.close();
127         } catch (FileNotFoundException e) {
128             e.printStackTrace();
129         } catch (IOException e) {
130             e.printStackTrace();
131         } finally {
132             if (reader != null) {
133                 try {
134                     reader.close();
135                 } catch (IOException e) {
136                     e.printStackTrace();
137                 }
138             }
139         }
140 
141         return false;
142     }
143 
144     
145     public String[] splitt(String str) {
146         String strr = str.trim();
147         String[] strnew = strr.split("[\\p{Space}]+");
148         return strnew;
149     }
150     
151     
152     public boolean load(Card card1) { //传进来一个新的空的card类型,用户输入对其赋值,然
153 
154 后和数据库进行比较,检测是否登录成功
155         
156         
157         long account_input , password_input;  
158         for(int i = 0; i < 3 ; i++){
159             Scanner scan = new Scanner(System.in);    //问题 这个放前边会(输入错
160 
161 误时)出错
162             System.out.println("请输入卡号:");
163             if(scan.hasNextLong()){                 //检测账号是
164 
165 否为int型,否则跳出当次
166                 account_input = scan.nextLong();
167                 card1.setAccount(account_input);
168             }else{
169                 if(i == 2 ){
170                     System.out.println("输入错误三次,已吞卡,请联系我行
171 
172 客服!");
173                     return false;
174                 }
175                 System.out.println("无效账号,请重输:");
176                 continue;
177             }
178             
179             System.out.println("请输入密码:");    //检测密码是否为int型,否则
180 
181 跳出当次
182             if(scan.hasNextInt()){
183                 password_input = scan.nextInt();
184                 card1.setPassword(password_input);
185             }else{
186                 if(i == 2 ){
187                     System.out.println("输入错误三次,已吞卡,请联系我行
188 
189 客服!");
190                     return false;
191                 }
192                 System.out.println("无效密码,请重输:");
193                 continue;
194             }
195             if(accountCheck(card1)){            //把用户输入的这个账
196 
197 号放入数据库进行比较,返回true或者false
198                 System.out.println("登录成功!\n");
199                 return true;
200             }else if(i == 2 ){
201                 System.out.println("输入错误三次,已吞卡,请联系我行客
202 
203 服!");
204                 return false;
205             }else{                
206                 System.out.println("账号或密码错误,请重输:");
207             }
208     
209         }
210         
211         return false;
212     }    
213     
214     public void accountOperation(Card card1){
215         Scanner scan = new Scanner(System.in);
216         while(true){
217             System.out.println("1、查询余额\n2、取款\n3、存款\n4、退出\n");
218             String input = scan.next();
219             if(input.equals("1")){
220                 balanceCheck(card1);
221                 continue;
222             }else if(input.equals("2")){
223                 getMoney(card1);
224                 balanceCheck(card1);
225             }else if(input.equals("3")){
226                 saveMoney(card1);
227             }else if(input.equals("4")){
228                 System.out.println("卡已退出");
229                 System.exit(0);
230             }else{
231                 continue;
232             }
233             
234         }        
235     }
236 
237     public void balanceCheck(Card card1){
238         System.out.println("余额为:"+ card1.getMoney() + "\n");
239     }
240     
241     public void getMoney(Card card1){
242         int get_Money = 0;        //用户取钱数
243         
244         Scanner scan = new Scanner(System.in);
245         System.out.println("请输入取款金额\n1、100元\n2、300元\n3、500元\n4、1000元
246 
247 \n5、2000元\n6、输入金额\n");
248         String input = scan.next();
249         
250         if(input.equals("1") || input.equals("2") || input.equals("3") || 
251 
252 input.equals("4") || input.equals("5") ){
253             double num = Double.parseDouble(input);
254             int num1 = (int)num;
255             switch(num1){
256             case 1 : get_Money = 100;break;
257             case 2 : get_Money = 300;break;
258             case 3 : get_Money = 500;break;
259             case 4 : get_Money = 1000;break;
260             case 5 : get_Money = 2000;break;
261             }
262 
263             if(card1.getMoney() < get_Money){
264                 System.out.println("余额不足");
265             }else if(get_Money_Already + get_Money > MAX_GET_MONEY){
266                 System.out.println("本机每天最多取" + MAX_GET_MONEY);
267             }else if(localMoney < get_Money){
268                 System.out.println("本机已无那么多钱");
269             }else{
270                 card1.setMoney((card1.getMoney()-get_Money));    //改变余额
271                 
272                 
273                 //在文本信息里写入余额变化
274                 WriteInfo write = new WriteInfo();
275                 try {
276                     write.creatTxtFile();
277                     write.writeTxtFile(lineNum,card1);   
278                 } catch (IOException e) {
279                     e.printStackTrace();
280                 }
281                 
282                 localMoney = (int)(localMoney - get_Money);        //
283 
284 变本机金额
285                 get_Money_Already += get_Money;
286                 System.out.println(get_Money + "元已出,请在规定时间取钱");
287                 System.out.println(get_Money_Already);
288             }
289 
290             
291             
292         }else if(input.equals("6") ){
293             System.out.println("请取钱输入金额:");
294             if(scan.hasNextDouble()){
295                 input = scan.next();
296                 get_Money = (int)(Double.parseDouble(input));
297 
298                 if(get_Money < 0){
299                     System.out.println("输入错误,请输入整百数");    //
300 
301 入的是负数等    
302                 }else if(get_Money_Already + get_Money > MAX_GET_MONEY){
303                     System.out.println("本机每天最多取" + 
304 
305 MAX_GET_MONEY);
306                 }else if(get_Money % 100 != 0){
307                     System.out.println("输入的不是整百数");    
308                 }else if(card1.getMoney() < get_Money){
309                     System.out.println("余额不足");
310                 }else if(get_Money > MAX_GET_SIGLE_MONEY){
311                     System.out.println("每次最多取" + 
312 
313 MAX_GET_SIGLE_MONEY);
314                 }else if(get_Money > localMoney){
315                     System.out.println("本机金额余量不足,请重新输入");
316                 }else{
317                     card1.setMoney((card1.getMoney()-get_Money));
318                     
319                     //把余额信息写入文本信息
320                     WriteInfo write = new WriteInfo();
321                     try {
322                         write.creatTxtFile();
323                         write.writeTxtFile(lineNum,card1);   
324                     } catch (IOException e) {
325                         e.printStackTrace();
326                     }
327                     
328                     localMoney = (int)(localMoney - get_Money);
329                     get_Money_Already += get_Money;
330                     System.out.println(get_Money_Already);
331                     System.out.println(get_Money + "元已出,请在规定时间
332 
333 取钱");
334                 }
335                 
336             }else{
337                 System.out.println("输入错误,请输入整百数");//输入的是字母
338 
339 或者其他字符
340             }    
341         }
342     }
343     
344     public void saveMoney(Card card1){
345         Scanner scan = new Scanner(System.in);
346         String input;
347         double save_Money = 0;
348         
349         System.out.println("请输入存钱金额:");
350         if(scan.hasNextDouble()){
351             input = scan.next();
352             save_Money = Double.parseDouble(input);
353             if(save_Money > 0){
354                 if(save_Money % 100 == 0){
355                     if(save_Money + localMoney <= MAX_LOCAL_MONEY){
356                         System.out.println("请将纸币整齐的放入存钱口
357 
358 ");
359                         //等待存钱,并且检测真假币
360                         card1.setMoney(card1.getMoney() + 
361 
362 save_Money);
363                         
364                         
365                         //把余额信息写入文本信息
366                         WriteInfo write = new WriteInfo();
367                         try {
368                             write.creatTxtFile();
369                             write.writeTxtFile(lineNum,card1);   
370                         } catch (IOException e) {
371                             e.printStackTrace();
372                         }
373                         
374                         
375                         localMoney = (int)(localMoney + save_Money);
376                         System.out.println("...   ...   ...");
377                         System.out.println("钱已存入!\n");
378                     }else{
379                         System.out.println("大于本机最大可收取存钱数
380 
381 ,请减小存钱数");
382                     }
383                 }else{
384                     System.out.println("本机只能存整百数");
385                 }
386             }else{
387                 System.out.println("存钱金额错误,请输入整百数");    //
388 
389 入的是负数等
390             }
391         }else{
392             System.out.println("输入错误,请输入整百数");//输入的是字母或者其他
393 
394 字符
395         }    
396     }
397 }
ATMmain
 1 package com.ATM;
 2 
 3 public class Card{
 4     private long account ;
 5     private long password ;
 6     private double money ;
 7     
 8     public Card(){
 9         
10     }
11     
12     
13     public long getAccount() {
14         return account;
15     }
16     public void setAccount(long account) {
17         this.account = account;
18     }
19     public long getPassword() {
20         return password;
21     }
22     public void setPassword(long password) {
23         this.password = password;
24     }
25     public double getMoney() {
26         return money;
27     }
28     public void setMoney(double money) {
29         this.money = money;
30     }
31     
32 }
class Card
  1 package com.ATM;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileNotFoundException;
  7 import java.io.FileOutputStream;
  8 import java.io.FileReader;
  9 import java.io.IOException;
 10 import java.io.InputStreamReader;
 11 import java.io.PrintWriter;
 12 
 13 public class WriteInfo {
 14     private static String filenameTemp = "d:/bankinfo.txt";
 15     
 16     public WriteInfo(){
 17         
 18     }
 19     
 20 //    public static void main(String[] args) {
 21 //        Card card1 = new Card();
 22 //        card1.setAccount(1234);
 23 //        card1.setPassword(123456);
 24 //        card1.setMoney(31689.4);
 25 //        
 26 //        WriteInfo write = new WriteInfo();
 27 //        try {
 28 //            write.creatTxtFile();
 29 //            write.writeTxtFile(3,card1);
 30 //            
 31 //        } catch (IOException e) {
 32 //            e.printStackTrace();
 33 //        }
 34 //    }
 35 
 36     
 37     //创建文件
 38     
 39     public static boolean creatTxtFile() throws IOException {
 40         boolean flag = false;
 41         File filename = new File(filenameTemp);
 42         if (!filename.exists()) {
 43             filename.createNewFile();
 44             flag = true;
 45         }
 46         return flag;
 47     }
 48 
 49     public static boolean writeTxtFile(int num,Card card1) throws IOException {
 50         // 先读取原有文件内容,然后进行写入操作
 51         boolean flag = false;
 52         String filein = card1.getAccount() + "\t" + card1.getPassword() + "\t" + 
 53 
 54 card1.getMoney();
 55 //        filein = "111111    111111    1000000";
 56         String temp = "";
 57 
 58         FileInputStream fis = null;
 59         InputStreamReader isr = null;
 60         BufferedReader br = null;
 61 
 62         FileOutputStream fos = null;
 63         PrintWriter pw = null;
 64         try {
 65             // 文件路径
 66             File file = new File(filenameTemp);
 67             // 将文件读入输入流
 68             fis = new FileInputStream(file);
 69             isr = new InputStreamReader(fis);
 70             br = new BufferedReader(isr);
 71             StringBuffer buf = new StringBuffer();
 72 
 73             // 保存该文件原有的内容
 74             for (int j = 0; (temp = br.readLine()) != null; j++) {
 75                 
 76                 
 77                 if(j != num){
 78                     buf = buf.append(temp);
 79                     buf = buf.append(System.getProperty("line.separator"));
 80                 }else{
 81                     temp = filein;
 82                     buf = buf.append(temp);
 83                     buf = buf.append(System.getProperty("line.separator"));
 84                 }
 85                 
 86                 // System.getProperty("line.separator")
 87                 // 行与行之间的分隔符 相当于“\n”
 88             }
 89 //            buf.append(filein);//写入
 90 
 91             fos = new FileOutputStream(file);
 92             pw = new PrintWriter(fos);
 93             pw.write(buf.toString().toCharArray());
 94             pw.flush();
 95             flag = true;
 96         } catch (IOException e1) {
 97             // TODO 自动生成 catch 块
 98             throw e1;
 99         } finally {
100             if (pw != null) {
101                 pw.close();
102             }
103             if (fos != null) {
104                 fos.close();
105             }
106             if (br != null) {
107                 br.close();
108             }
109             if (isr != null) {
110                 isr.close();
111             }
112             if (fis != null) {
113                 fis.close();
114             }
115         }
116         return flag;
117     }
118 
119 }
class WriteInfo

 

posted @ 2016-01-30 22:19  远秋  阅读(281)  评论(0编辑  收藏  举报