IO练习--随机点名

2024-08-31 19:36
文章标签 练习 随机 io 点名

本文主要是介绍IO练习--随机点名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随机点名器1

需求:
有一个文件里面存储了班级同学的信息,每一个信息占一行。
格式为:张三-男-23
要求通过程序实现随机点名器。
运行效果:
第一次运行程序:随机同学姓名1(只显示名字)
第二次运行程序:随机同学姓名2(只显示名字)
第三次运行程序:随机同学姓名3(只显示名字) 

public class Tset {public static void main(String[] args) throws IOException {//把文件中的学生全部读取出来放到集合中ArrayList<String> list = new ArrayList<>();//使用缓冲流读,因为可以一次读取一行BufferedReader br = new BufferedReader(new FileReader("name.txt"));String info;while ((info = br.readLine()) != null) {list.add(info);}//随机选取一个元素并获取名字Collections.shuffle(list);String name = list.get(0).split("-")[0];//读取程序运行的次数FileInputStream fis = new FileInputStream("count.txt");int count = fis.read();count = count + 1;System.out.println("第" + (char)count +"次运行程序:" + name);//将程序的运行次数记录下来//当文件不存在时会先创建文件FileOutputStream fos = new FileOutputStream("count.txt");fos.write(count);}
}
随机点名器2--带概率的随机

需求:
一个文件里面存储了班级同学的信息,每一个学生信息占一行。
格式为:张三-男-23。
要求通过程序实现随机点名器
运行效果:
70%的概率随机到男生
30%的概率随机到女生
点击并拖拽以移动
总共随机100万次,统计结果,
注意观察:看生成男生和女生的比例是不是接近于7:3

public class Test02 {public static void main(String[] args) throws IOException {//首先把文件中的内容读取到集合中,男女分开存ArrayList<String> boyList = new ArrayList<>();ArrayList<String> girlList = new ArrayList<>();BufferedReader br = new BufferedReader(new FileReader("name.txt"));String info;while ((info = br.readLine()) != null) {String gender = info.split("-")[1];if (gender.equals("男")) {boyList.add(info);}if (gender.equals("女")) {girlList.add(info);}}//模拟概率ArrayList<Integer> plist = new ArrayList<>();Collections.addAll(plist, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0);int boyCount = 0;int girlCount = 0;//循环一百万次for (int i = 0; i < 1000000; i++) {Collections.shuffle(plist);int number = plist.get(0);if (number == 1) {Collections.shuffle(boyList);String boyInfo = boyList.get(0);boyCount++;} else {Collections.shuffle(girlList);String girlInfo = girlList.get(0);girlCount++;}}//统计概率double p1 = (double) boyCount / 1000000;double p2 = (double) girlCount / 1000000;System.out.println(p1);System.out.println(p2);}
}

输出结果:

随机点名器3

需求:
一个文件里面存储了班级同学的姓名,每一个姓名占一行。
要求通过程序实现随机点名器。
第三次必定是张三同学
运行效果:
第一次运行程序:随机同学姓名1第二次运行程序:随机同学姓名2
第三次运行程序:张三

由于读取返回的是字符所对应的ASCII码点,无法直接与整数1,2...进行比较。

当有一个char类型的字符c,想要判断字符内容是否为2时,可这样比较:c == '2'。

代码如下:

public class Test03 {public static void main(String[] args) throws IOException {//把文件中的学生全部读取出来放到集合中ArrayList<String> list = new ArrayList<>();//使用缓冲流读,因为可以一次读取一行BufferedReader br = new BufferedReader(new FileReader("name.txt"));String info;while ((info = br.readLine()) != null) {list.add(info);}//读取程序运行的次数FileInputStream fis = new FileInputStream("count.txt");int count = fis.read();if (count == '2') {count = count + 1;System.out.println("第" + (char)count +"次运行程序:张三");} else {//随机选取一个元素并获取名字Collections.shuffle(list);String name = list.get(0).split("-")[0];count = count + 1;System.out.println("第" + (char)count +"次运行程序:" + name);}//将程序的运行次数记录下来//当文件不存在时会先创建文件FileOutputStream fos = new FileOutputStream("count.txt");fos.write(count);}
}

运行结果: 

随机点名器4--随机不重复

需求:
一个文件里面存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随机点名器。
运行效果:
被点到的学生不会再被点到
如果班级中所有的学生都点完了,需要自动的重新开启第二轮点名
细节1:假设班级有10个学生,每一轮中每个人只能被点到一次,程序运行10次,第一轮结束;

细节2:第11次运行的时候,我们自己不需要手动操作本地文件,要求程序自动开始第二轮点名。

首先来实现第一轮点名的代码:

保证抽过的不会再被抽到,可以用remove方法实现。

注意:

remove方法有两个,分别是根据索引和根据内容删除,内容的话方法的返回结果是布尔类型,而索引会把删除的元素进行返回。

        //一个班级里的10个学生ArrayList<String> list = new ArrayList<>();BufferedReader br = new BufferedReader(new FileReader("name_10.txt"));String info;while ((info = br.readLine()) != null) {list.add(info);}br.close();//随机选取一个元素并获取名字Collections.shuffle(list);String name = list.remove(0).split("-")[0];System.out.println(name);//更新文件中的名单BufferedWriter bw1 = new BufferedWriter(new FileWriter("name_10.txt"));for (String s : list) {bw1.write(s);bw1.newLine();}bw1.close();//将点到的人存到新的文件中BufferedWriter bw2 = new BufferedWriter(new FileWriter("callover.txt", true));bw2.write(name);bw2.newLine();bw2.close();

完整的代码:

当一轮点名结束时要恢复原来的名单。

public class Test04 {public static void main(String[] args) throws IOException {//首先读取文件中的内容ArrayList<String> list = readFile();//if (list.isEmpty())       {copyFile();list = readFile();String name = callOver(list);writeFile(name);} else {String name = callOver(list);writeFile(name);}}private static void writeFile(String name) throws IOException {//将点到的人存到新的文件中BufferedWriter bw2 = new BufferedWriter(new FileWriter("callover.txt", true));bw2.write(name);bw2.newLine();bw2.close();}private static String callOver(ArrayList<String> list) throws IOException {//随机选取一个元素并获取名字Collections.shuffle(list);String name = list.remove(0).split("-")[0];System.out.println(name);//更新文件中的名单BufferedWriter bw1 = new BufferedWriter(new FileWriter("name_10.txt"));for (String s : list) {bw1.write(s);bw1.newLine();}bw1.close();return name;}private static ArrayList<String> readFile() throws IOException {//一个班级里的10个学生ArrayList<String> list = new ArrayList<>();BufferedReader br = new BufferedReader(new FileReader("name_10.txt"));String info;while ((info = br.readLine()) != null) {list.add(info);}br.close();return list;}public static void copyFile() throws IOException {FileInputStream fis = new FileInputStream("callover.txt");FileOutputStream fos = new FileOutputStream("name_10.txt");int b;while ((b = fis.read()) != -1) {fos.write(b);}fos.close();fis.close();new File("callover.txt").delete();}
}

可以再修改一下: 

这篇关于IO练习--随机点名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124814

相关文章

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

AI学习指南深度学习篇-带动量的随机梯度下降法的基本原理

AI学习指南深度学习篇——带动量的随机梯度下降法的基本原理 引言 在深度学习中,优化算法被广泛应用于训练神经网络模型。随机梯度下降法(SGD)是最常用的优化算法之一,但单独使用SGD在收敛速度和稳定性方面存在一些问题。为了应对这些挑战,动量法应运而生。本文将详细介绍动量法的原理,包括动量的概念、指数加权移动平均、参数更新等内容,最后通过实际示例展示动量如何帮助SGD在参数更新过程中平稳地前进。