在李家华程序的基础上,增加了 随机抽查的功能,具体见代码。好久没有写程序了,只是简单的一个小功能,也花了近2个多小时,查了网络上的一些资料才完成。
/** * 程序功能:简单的签到程序图形界面化,能够保存签到后的结果 * 作者:李家华 * 时间:2014.03.14 * QQ:*********联系博客 * 修改:丁又专,2014.03.18,修改了字体、随机数等 */ import java.awt.BorderLayout; import java.awt.Font; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Enumeration; import java.util.Iterator; import java.util.Scanner; import javax.swing.*; public class RegisterApp { static int count2 = 0; static int count = 0; static String namel[][]; static JLabel nameText =new JLabel(); static String inname,outname; static int numCheck = 0; //随机抽查学生人数 static int[] randArray; //随机抽查学生序号 static int aAbsent=0; static JLabel outlab =new JLabel(); /**生成随机数组 * 输出:数值在[a,b]的数组,元素个数为num * 输入:随机数的范围为[a,b],需要生成的随机数个数为num */ public static int[] createRandom(int a, int b, int num){ //用集合HashSet来存储随机数,利用集合Set的特性——无重复元素 java.util.HashSet<Integer> set1 = new java.util.HashSet<Integer>(); int[] randArray = new int[num]; java.util.Random r=new java.util.Random(); while(set1.size()<num){ set1.add(r.nextInt(b-a+1)+a); //生成[a,b]之间均匀分布的随机数 } //使用Iterator遍历Set中的所有元素,赋值到randArray数组中 Iterator<Integer> it2 = set1.iterator(); int i=0; while(it2.hasNext()){ randArray[i++] = (Integer)it2.next(); } Arrays.sort(randArray); //对数组元素进行排序 return randArray; } public static void main(String[] args) throws FileNotFoundException { //(a)运用图形界面知识,做出简单界面 JFrame frame = new JFrame("课堂签到程序"); JLabel nameLab =new JLabel("请输入名字:"); JButton yes =new JButton("到"); JButton no =new JButton("缺席"); JButton end =new JButton("统计"); JPanel pan1=new JPanel(); JPanel pan2=new JPanel(); pan1.add(nameLab); pan1.add(nameText); pan2.add(yes); pan2.add(no); pan2.add(end); frame.setLayout(new BorderLayout(3,3));//使用BorderLayout布局 frame.add(pan1,BorderLayout.NORTH); frame.add(pan2,BorderLayout.CENTER); frame.add(outlab,BorderLayout.SOUTH); frame.pack(); frame.setSize(500,200); //使窗体居中 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; frame.setLocation(width / 2-100 , height / 2-100); //设置字体参数 nameText.setFont(new Font("", Font.BOLD, 22)); // 设置文字的字体及大小 outlab.setFont(new Font("", Font.BOLD, 22)); //窗体可视化 frame.setVisible(true); /*(b)根据老师给出的签到程序RegisterApp.java,加以利用,使用命令行参数加载名单到nameText的标签上, 利用数组 存储学生学号,名字和输入流 Scanner类等知识 */ if (args.length != 3) { System.out.println("参数输入不对"); System.out.println("使用方法(示例):java RegisterApp 名单文件名称 班级名称 点名人数"); System.exit(0); } inname = args[0]; outname = args[1]; numCheck = Integer.parseInt(args[2]); File filein = new File(inname); Scanner fin = new Scanner(filein); Scanner fin1 = new Scanner(filein); while (fin.hasNext()) { String str = fin.nextLine(); if(!str.isEmpty()){ //考虑到文本的最后一行可能为空行的情况 count++; } } fin.close(); namel = new String[count][2]; for (int a = 0; a < count; a++) { namel[a][0] = fin1.nextLine(); } fin1.close(); //数组初始化,开始时全部名单标记为2 for(int a = 0; a < count; a++){ namel[count2][1] = "2"; } //根据学生人数,产生相应的随机数组 randArray = createRandom(0,count,numCheck); nameText.setText(namel[randArray[0]][0]); //(c)通过按钮事件,读取名单,老师可以开始点名,最终统计把结果记录以文档输出 yes.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (e.getActionCommand().equals("到") && count2 < numCheck) { namel[randArray[count2]][1] = "1"; count2++; if(count2<numCheck){ nameText.setText(namel[randArray[count2]][0]); }else{ //抽查结束 nameText.setText("签到结束……"); } } } }); no.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("缺席") && count2 < numCheck) { namel[randArray[count2]][1] = "0"; count2++; aAbsent++; if(count2<numCheck){ nameText.setText(namel[randArray[count2]][0]); }else{ nameText.setText("签到结束……"); } } } }); end.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("统计") && count2 == numCheck) { //System.out.println(000000); File fileout = new File(outname+"--"+00+ ".txt"); try { PrintWriter fout = new PrintWriter(fileout); for (int a = 0; a < numCheck; a++) { String s = namel[randArray[a]][0] + " " + namel[randArray[a]][1]; fout.println(s); } fout.close(); outlab.setText("考勤结束:"+"抽查人数为"+numCheck+"人"+"一共有"+aAbsent+"个同学缺席"); } catch (IOException e3) { // TODO Auto-generated catch block e3.printStackTrace(); } } } }); } }
数据文件下载:wl131
1. 把RegisterApp.java ,wl131.txt 两个文件放在同一个目录(如果在DOS环境下运行的话),假设放在 d:/demo 下
2. cd 到上目录
3. 编译该程序 javac RegisterApp.java
4. 运行该程序 java RegisterApp wl131.txt wl131 10 (wl131.txt:表示名单文件为wl131.txt, wl131:表示班级名称,10:表示抽查10人)
【实现】实现随机点名的签到程序,布布扣,bubuko.com
原文:http://blog.csdn.net/dyz1982/article/details/21420391