微信投票-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)
【实验7-5】 微信投票
【任务介绍】
1.任务描述
如今微信聊天已经普及到几乎每一个人,在聊天中,经常会有人需要帮忙在某个APP中投票。本案例要求编写一个模拟微信投票的程序,通过在控制台输入指令,实现添加候选人、查看当前投票和投票的功能。每个功能的具体要求如下。
- 用户输入指令1代表”添加候选人”,可以在本地文件中添加被选举人。
- 用户输入指令2代表”查看当前投票”,将本地文件中的数据打印到控制台。
- 用户输入指令3 代表”投票”功能,在控制台输入被投票人的名字进行投票操作。
- 用户输入指令4代表”退出”操作。
2.运行结果
任务运行结果如图7-1所示。
图7-1 运行结果
运行过程中,本地D盘下会生成一个count.txt文件,打开后如图7-2所示。
图7-2 count.txt
【实现思路】
- 查看任务介绍和运行结果分析可知,此任务需要使用while循环实现控制台中操作指令的多次输入,使用switch语句根据控制台输入的操作指令来判断执行什么操作。
- 输入指令1时进行添加候选人操作,先从控制台获取输入的被投票人与起始票数并暂存,再判断是否已有count.txt文件存储数据,如果有直接在文件后追加新的数据,如果没有需要新建文件夹在存入数据。这里需要使用到StringBuffer的字符串拼接来实现存入count.txt文件的特定格式,例如:“姓名:票数,”,这样方便我们读取和修改票数。
- 输入指令2时查看当前投票,使用字符流读取count.txt文件并在控制台打印即可。
- 输入指令3时进行投票操作,从控制台输入被投票人姓名,投票成功后,被投票人的票数加一,先取出count.txt的内容存入String类型中,根据“,”拆分为String数组(editMessage),再获取控制类中输入的被投票人姓名,使用for循环判断是否存在此人的投票,如果存在,则取出此人的票数加一,最后将修改后的数据使用StringBuffer替换到String数组(editMessage)并覆盖原有的count.txt文件
- 输入指令4,直接退出系统,可以通过代码”System.exit(0);”实现。
【实现代码】
投票小功能的代码实现如文件7-1所示。
文件7-1 vote.java
- package chapter0705;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.FileWriter;
- import java.util.Scanner;
- public class vote {
- private static String message = "";
- public static void main(String[] args) throws Exception {
- Scanner sc = new Scanner(System.in);
- System.out.println("1:添加候选人 2:查看当前投票 3:投票 4:退出");
- while (true) {
- System.out.print("请输入操作指令:");
- int command = sc.nextInt();
- switch (command) {
- case 1:
- System.out.println("请输入需要被投票的人:");
- String name=sc.next();
- System.out.println("请输入"+name+"的起始票数:");
- int num=sc.nextInt();
- addvote(name,num);// 1:添加投票人
- break;
- case 2:
- String me = readvote();// 2:查看投票
- System.out.println(me);
- break;
- case 3:
- editvote();// 3:投票
- break;
- case 4:
- System.out.println("您已退出系统,谢谢使用!");
- System.exit(0);
- break;
- default:
- System.out.println("您输入的指令错误!");
- break;
- }
- }
- }
- /*
- * 查看投票
- */
- public static String readvote() throws Exception{
- FileInputStream in = new FileInputStream("D:\\count.txt");
- byte[] b = new byte[in.available()];
- in.read(b);
- message =new String(b);
- in.close();
- return message;
- }
- /*
- * 添加投票
- */
- public static void addvote(String name,int num) throws
- FileNotFoundException {
- String SEPARATE_FIELD = "\n";// 换行
- BufferedOutputStream out = null;
- StringBuffer sbf = new StringBuffer();// 拼接内容
- File file=new File("D:\\count.txt"); //判断文件是否存在
- try {
- // 当已存在count.txt文件,则在文件内容后追加
- if (file.canExecute()) {
- // 创建输出流,用于追加文件
- out = new BufferedOutputStream(new
- FileOutputStream("D:\\count.txt", true));
- } else {// 不存在当天文件,则新建文件
- // 创建输出流,用于保存文件
- out = new BufferedOutputStream(new
- FileOutputStream("D:\\count.txt"));
- }
- sbf.append(name).append(":");
- sbf.append(num).append(","+SEPARATE_FIELD);
- String str = sbf.toString();
- byte[] b = str.getBytes();
- for (int i = 0; i < b.length; i++) {
- out.write(b[i]);// 将内容写入本地文件
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (out != null)
- out.close();// 关闭输出流
- } catch (Exception e2) {
- e2.printStackTrace();
- }
- }
- }
- /*
- * 投票 将控制台输入的姓名的票数加一后保存
- */
- private static void editvote() throws Exception {
- FileWriter out = null;
- // 将count.txt文字根据“,”拆分成数组
- String[] editMessage = message.split(",");
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入要投票人的姓名");
- String inputMessage = sc.next();
- //for循环拆分后的数组
- for (int i = 0; i < editMessage.length; i++) {
- //当数组中有有包含输入的名字时
- if(editMessage[i].contains(inputMessage)) {
- //取出输入名字现在的票数
- String a =
- editMessage[i].substring(editMessage[i].indexOf(":")+1,
- editMessage[i].length());
- //将取出的票数强转为int类型
- int b = Integer.parseInt(a);
- //将票数+1
- b++;
- //new出一个StringBuffer用于后面的字符拼接
- StringBuffer sb = new StringBuffer();
- //取出原文件中的姓名和:
- String c=editMessage[i].substring(0,editMessage[i].indexOf(":")+1);
- //使用StringBuffer拼接姓名和选票
- sb.append(c);
- sb.append(b);
- sb.append(",");
- //将拼接后的字符强转为String类型
- String s = sb.toString();
- //修改好的字符替换原有的字符
- System.out.println("投票后的票数:");
- System.out.println(s);
- editMessage[i] = s;
- }
- }
- //editMessage是数组,我们需要将editMessage数组拼接为StringBuffer类型。
- StringBuffer sb1 = new StringBuffer();
- for (int i = 0; i < editMessage.length; i++) {
- sb1.append(editMessage[i]);
- }
- out = new FileWriter("D:\\count.txt");//覆盖原有文件
- //sb1是StringBuffer类型,需要使用toString()方法
- out.write(sb1.toString());// 写入暂存的内容
- out.close();
- }
- }
在文件7-1中,第十行代码创建了文件内容的全局变量。第14~40行代码是循环主体,用于循环接收用户的指令,当16行代码获取指令后,通过switch语句判断应该执行的操作,第45-52行代码是查看投票功能,第56-90行代码是添加投票功能,使用StringBuffer拼接字符串再存入本地文件。第94-139行代码是投票功能,先将count.txt的内容使用split方法拆分为数组,在循环查询出需要增加投票的人,将票数加一后暂存,再将修改好的字符替换原有的count.txt文件。
相关文章:

微信投票-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)
【实验7-5】 微信投票 【任务介绍】 1.任务描述 如今微信聊天已经普及到几乎每一个人,在聊天中,经常会有人需要帮忙在某个APP中投票。本案例要求编写一个模拟微信投票的程序,通过在控制台输入指令,实现添加候选人、查看当前投票…...

duboo+zookeeper分布式架构入门
分布式 dubbo Zookeeper 分布式系统就是若干独立计算机的集合(并且这些计算机之间相互有关联,就像是一台计算机中的C盘F盘等),这些计算对于用户来说就是一个独立的系统。 zookeeper安装 下载地址:Index of /dist/z…...

黑盒测试用例设计方法-等价类划分法
目录 一、等价类的作用 二、等价类的分类 三、等价类的方法 四、等价类的原则 五、按照测试用例的完整性划分等价类 六、等价类步骤 七、案例 一、等价类的作用 为穷举测试设计测试点。 穷举:列出所有的可能情况,对其一一判断。 测试点&#x…...

4.OCR文本识别Connectionist Temporal Classification(CTC)算法
文章目录1.基础介绍2.Connectionist Temporal Classification(CTC)算法2.1 什么是Temporal Classification2.2 CTC问题描述2.2关于对齐2.3 前向后向算法2.4 推理时3.pytorch中的CTCLOSS参考资料欢迎访问个人网络日志🌹🌹知行空间🌹dz…...
误删了Ubuntu/Linux的一些默认用户目录怎么办?
用户目录:指位于 $HOME 下的一系列常用目录,例如 Documents,Downloads,Music,还有 Desktop等。本文不是讲如何恢复原有目录及其重要文件,适用于仅恢复目录功能一:仅恢复个别目录如误删了Desktop…...

ArXiv简介以及论文提交
arXiv网站简介 arXiv是一个收集物理学、数学、计算机科学、生物学与数理经济学的论文预印本的网站。其中arXiv发音同“archive”,因为“X”代表希腊字母 ,国际音标为[kai]。它于1991年8月14日成立,现由美国康奈尔大学维护。 ——维基百科 对…...
pytorch学习
目录如下: pytorch常用操作 pytorch 常用操作 pytorch 的 detach()函数 1. 什么是detach()函数 我们在将输出特征矩阵进行存储的时候,经常需要将torch.Tensor类型的数据转换成别的如numpy类型的数据,但是Tensor类型的数据是会自动计算梯度…...

【OC】块初识
Block简介 Blocks是C语言的扩充功能。可以用一句话来表示Blocks的扩充功能:带有自动变量的匿名函数。 匿名函数 所谓匿名函数就是不带有名称的函数。C语言的标准不允许存在这样的函数。例: int func(int count);它声明了名称为func的函数。下面的源代…...

3-2 创建一个至少有两个PV组成的大小为20G的名为testvg的VG
文章目录1. 在vmware添加多块20G的硬盘,并创建分区2. 创建一个至少有两个PV组成的大小为20G的名为testvg的VG,要求PE大小为16M,而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录3. 新建用户archlinux,要求其家目录为/users/archlinu…...

【密码学】 一篇文章讲透数字证书
【密码学】 一篇文章讲透数字证书 数字证书介绍 数字证书是一种用于认证网络通信中参与者身份和加密通信的证书,人们可以在网上用它来识别对方的身份。 我们在上一篇博客中介绍了数字签名的作用和原理,数字签名可以防止消息被否认。有了公钥算法和数字签…...

Linux 操作系统原理 — 内存管理 — 虚拟地址空间(x86 64bit 系统)
目录 文章目录目录虚拟地址格式与内核页表(四级页表)虚拟地址格式与内核页表(四级页表) 在 x86 64bit 系统中,可以描述的最长地址空间为 2^64(16EB),远远超过了目前主流内存卡的规格…...
C语言深入知识——(2)指针的深入理解
1、字符指针 (1)字符指针的普通用法 char a A; char* pa &a;但是一般来说字符指针很少这么用……更多是拿来存储一个字符串 (2)字符串的两种存储以及区别 现在有了两种存储数组的方法 ①一个是使用char类型数组存储②另外…...

Git使用笔记
分支branch切换到另一个分支git checkout 你要切换到的分支的名字git checkout master将本地的这个分支branch1和gitee上的branch1进行合并(本地的branch1有的,gitee上branch1没有的增加上去)git merge branch1git merge 分支的名字查看本地是…...

数据库管理-第五十八期 倒腾PDB(20230226)
数据库管理 2023-02-26第五十八期 倒腾PDB1 克隆本地PDB2 没开归档总结第五十八期 倒腾PDB 其实本周过的不大好,连着两天熬夜,一次是割接一次是处理ADG备库的异常,其实本周有些内容是以前处理过的问题,到了周末还肚子痛。哎… 1…...

我看谁还敢说不懂git
文章目录一、Git介绍1.1、Git的作用1.2、Git的理念1.3、Git的特点1.4、Git对比SVN二、Git的概念2.1、Git基础概念三、Git的基本操作3.1、使用Git管理一个代码仓库的流程3.2、Git常用命令介绍四、Git状态的变化五、Git安装和配置5.1、Git的安装5.2、Git的配置六、Git的高级操作6…...
Scratch少儿编程案例-算法练习-实现加减乘除练习题
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

【离线数仓-9-数据仓库开发DWS层设计要点-1d/nd/td表设计】
离线数仓-9-数据仓库开发DWS层设计要点-1d/nd/td表设计离线数仓-9-数据仓库开发DWS层设计要点-1d/nd/td表设计一、DWS层设计要点二、DWS层设计分析 - 1d/nd1.DWS层设计一:不考虑用户维度2.DWS层设计二:考虑用户维度2.DWS层设计三 :考虑用户商…...

python网络数据获取
文章目录1网络爬虫2网络爬虫的类型2.1通用网络爬虫2.1.12.1.22.2聚焦网络爬虫2.2.1 基于内容评价的爬行策略2.2.2 基于链接结构的爬行策略2.2.3基于增强学习的爬行策略2.2.4基于语境图的爬行策略2.3增量式网络爬虫深层网页爬虫3网络爬虫基本架构3.1URL管理模块3.2网页下载模块3…...
[Datawhale][CS224W]图机器学习(六)
目录一、简介二、概述三、算法四、PageRank的缺点五、Python实现迭代法参考文献一、简介 PageRank,又称网页排名、谷歌左侧排名、PR,是Google公司所使用的对其搜索引擎搜索结果中的网页进行排名的一种算法。 佩奇排名本质上是一种以网页之间的超链接个…...

aws ecr 使用golang实现的简单镜像转换工具
https://pkg.go.dev/github.com/docker/docker/client#section-readme 通过golang实现一个简单的镜像下载工具 总体步骤 启动一台海外区域的ec2实例安装docker和awscli配置凭证访问国内ecr仓库编写web服务实现镜像转换和自动推送 安装docker和awscli sudo yum remove awsc…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...