Java案例分析

【实验7-5】 微信投票

2024-10-25 12 0

简介 1.任务描述 如今微信聊天已经普及到几乎每一个人,在聊天中,经常会有人需要帮忙在某个APP中投票。本案例要求编写一个模拟微信投票的程序,通过在控制台输入指令,实现添加候选人、查看当前投票和投票的功能。每个功能的具体要求如下。 (1) 用户输入指令1代表”添加候选人”,可以在本地文件中添加被选举人。 (2) 用户输入指令2代表”查看当前投票”,将本地文件中的数据打印到控制台。 (3) 用户输入指令3 代表”投票”功能,在控制台输入被投票人的名字进...

【实验7-5  微信投票

【任务介绍】

  1.任务描述

如今微信聊天已经普及到几乎每一个人,在聊天中,经常会有人需要帮忙在某个APP中投票。本案例要求编写一个模拟微信投票的程序,通过在控制台输入指令,实现添加候选人、查看当前投票和投票的功能。每个功能的具体要求如下。

(1)     用户输入指令1代表添加候选人,可以在本地文件中添加被选举人。

(2)     用户输入指令2代表查看当前投票,将本地文件中的数据打印到控制台。

(3)     用户输入指令3 代表投票功能,在控制台输入被投票人的名字进行投票操作。

(4)     用户输入指令4代表退出操作。

2.运行结果

任务运行结果如图7-1所示。

upfile

7-1 运行结果

运行过程中,本地D盘下会生成一个count.txt文件,打开后如图7-2所示。

【任务目标】

l  学会分析投票小功能任务实现的逻辑思路。

l  能够独立完成投票小功能程序的源代码编写、编译以及运行。

l  能够利用字符流操作本地的方法。

l  掌握StringBuffer和数组的使用。

【实现思路】

(1)     查看任务介绍和运行结果分析可知,此任务需要使用while循环实现控制台中操作指令的多次输入,使用switch语句根据控制台输入的操作指令来判断执行什么操作。

(2)     输入指令1时进行添加候选人操作,先从控制台获取输入的被投票人与起始票数并暂存,再判断是否已有count.txt文件存储数据,如果有直接在文件后追加新的数据,如果没有需要新建文件夹在存入数据。这里需要使用到StringBuffer的字符串拼接来实现存入count.txt文件的特定格式,例如:“姓名:票数,”,这样方便我们读取和修改票数。

(3)     输入指令2时查看当前投票,使用字符流读取count.txt文件并在控制台打印即可。

(4)     输入指令3时进行投票操作,从控制台输入被投票人姓名,投票成功后,被投票人的票数加一,先取出count.txt的内容存入String类型中,根据“,”拆分为String数组(editMessage),再获取控制类中输入的被投票人姓名,使用for循环判断是否存在此人的投票,如果存在,则取出此人的票数加一,最后将修改后的数据使用StringBuffer替换到String数组(editMessage)并覆盖原有的count.txt文件

(5)     输入指令4,直接退出系统,可以通过代码”System.exit0;”实现。

【实现代码】

投票小功能的代码实现如文件7-1所示。

文件7-1  vote.java

 1   package chapter0705;

 2   import java.io.BufferedOutputStream;

 3   import java.io.File;

 4   import java.io.FileInputStream;

 5   import java.io.FileNotFoundException;

 6   import java.io.FileOutputStream;

 7   import java.io.FileWriter;

 8   import java.util.Scanner;

 9   public class vote {

 10          private static String message = "";

 11          public static void main(String[] args) throws Exception {

 12              Scanner sc = new Scanner(System.in);

 13              System.out.println("1:添加候选人 2:查看当前投票  3:投票  4:退出");

 14                  while (true) {

 15                      System.out.print("请输入操作指令:");

 16                      int command = sc.nextInt();

 17                      switch (command) {

 18                      case 1:

 19                         System.out.println("请输入需要被投票的人:");

 20                         String name=sc.next();

 21                         System.out.println("请输入"+name+"的起始票数:");

 22                         int num=sc.nextInt();

 23                         addvote(name,num);// 1:添加投票人

 24                         break;

 25                      case 2:

 26                         String me = readvote();// 2:查看投票

 27                         System.out.println(me);

 28                         break;

 29                      case 3:

 30                         editvote();// 3:投票

 31                         break;

 32                      case 4:

 33                         System.out.println("您已退出系统,谢谢使用!");

 34                         System.exit(0);

 35                         break;

 36                      default:

 37                         System.out.println("您输入的指令错误!");

 38                         break;

 39                      }

 40                  }

 41          }

 42          /*

 43           * 查看投票

 44           */

 45          public static String readvote() throws Exception{

 46              FileInputStream in = new FileInputStream("D:\\count.txt");

 47              byte[] b = new byte[in.available()];

 48              in.read(b);

 49              message =new String(b);

 50              in.close();

 51              return message;

 52          }

 53          /*

 54           * 添加投票

 55           */

 56          public static void addvote(String name,int num) throws

 57                   FileNotFoundException {

 58              String SEPARATE_FIELD = "\n";// 换行

 59              BufferedOutputStream out = null;

 60              StringBuffer sbf = new StringBuffer();// 拼接内容

 61              File file=new File("D:\\count.txt");   //判断文件是否存在

 62              try {

 63                    // 当已存在count.txt文件,则在文件内容后追加

 64                  if (file.canExecute()) {

 65                      // 创建输出流,用于追加文件

 66                      out = new BufferedOutputStream(new

 67                               FileOutputStream("D:\\count.txt", true));

 68                  } else {// 不存在当天文件,则新建文件

 69                      // 创建输出流,用于保存文件

 70                      out = new BufferedOutputStream(new

 71                                FileOutputStream("D:\\count.txt"));

 72                  }

 73                  sbf.append(name).append(":");

 74                  sbf.append(num).append(","+SEPARATE_FIELD);

 75                  String str = sbf.toString();

 76                  byte[] b = str.getBytes();

 77                  for (int i = 0; i < b.length; i++) {

 78                      out.write(b[i]);// 将内容写入本地文件

 79                  }

 80              } catch (Exception e) {

 81                  e.printStackTrace();

 82              } finally {

 83                  try {

 84                      if (out != null)

 85                         out.close();// 关闭输出流

 86                  } catch (Exception e2) {

 87                      e2.printStackTrace();

 88                  }

 89              }

 90          }

 91          /*

 92           * 投票 将控制台输入的姓名的票数加一后保存

 93           */

 94          private static void editvote() throws Exception {

 95              FileWriter out = null;

 96                // count.txt文字根据“,”拆分成数组

 97              String[] editMessage = message.split(",");

 98              Scanner sc = new Scanner(System.in);

 99              System.out.println("请输入要投票人的姓名");

 100             String inputMessage = sc.next();

 101              //for循环拆分后的数组

 102             for (int i = 0; i < editMessage.length; i++) {

 103                   //当数组中有有包含输入的名字时  

 104                 if(editMessage[i].contains(inputMessage)) {  

 105                     //取出输入名字现在的票数

 106             String a  =

 107                    editMessage[i].substring(editMessage[i].indexOf(":")+1,

 108                    editMessage[i].length());

 109                     //将取出的票数强转为int类型

 110                     int b = Integer.parseInt(a);

 111                     //将票数+1

 112                     b++;

 113                     //new出一个StringBuffer用于后面的字符拼接

 114                     StringBuffer sb = new StringBuffer();

 115                     //取出原文件中的姓名和:

 116     String c=editMessage[i].substring(0,editMessage[i].indexOf(":")+1);

 117                     //使用StringBuffer拼接姓名和选票

 118                     sb.append(c);

 119                     sb.append(b);

 120                     sb.append(",");

 121                     //将拼接后的字符强转为String类型

 122                     String s = sb.toString();

 123                     //修改好的字符替换原有的字符

 124                     System.out.println("投票后的票数:");

 125                     System.out.println(s);

 126                     editMessage[i] = s;

 127                 }

 128             }

 129     //editMessage是数组,我们需要将editMessage数组拼接为StringBuffer类型。

 130             StringBuffer sb1 = new StringBuffer();

 131             for (int i = 0; i < editMessage.length; i++) {

 132                 sb1.append(editMessage[i]);

 133             }

 134             out = new FileWriter("D:\\count.txt");//覆盖原有文件

 135             //sb1StringBuffer类型,需要使用toString()方法

 136             out.write(sb1.toString());// 写入暂存的内容

 137             out.close();

 138         }

 139     }

在文件7-1中,第十行代码创建了文件内容的全局变量。第14~40行代码是循环主体,用于循环接收用户的指令,当16行代码获取指令后,通过switch语句判断应该执行的操作,第45-52行代码是查看投票功能,第56-90行代码是添加投票功能,使用StringBuffer拼接字符串再存入本地文件。第94-139行代码是投票功能,先将count.txt的内容使用split方法拆分为数组,在循环查询出需要增加投票的人,将票数加一后暂存,再将修改好的字符替换原有的count.txt文件。


点赞 0

文章评论

欢迎您:

阿文博客

人生的价值,并不是用时间,而是用深度量去衡量的。——列夫·托尔斯泰

69 文章 1879 浏览 0 评论