黑马程序员技术交流社区
标题: (囧)实例小项目:投票系统 [打印本页]
作者: 小歪 时间: 2014-3-27 22:23
标题: (囧)实例小项目:投票系统
实例小项目:投票系统
刚看到这个运行结果时,第一感觉挺简单的,无非就是写个投票,谁票多就输出谁,担当看了题目要求就有些傻眼,不急我们一起慢慢往下看 :loveliness:
好了,那接下来让我们来看看项目要求吧...
编写一个投票程序,具体操作如下:
(1)功能描述:
有一个班级采用民主投票方法竞选班长,班长候选人共4位,每个人姓名及编号分别为:“张三 1;李四 2;王五 3;赵六 4”。投票者将每张选票上所填编号(1、2、3、4)循环输入电脑,输入数字0结束输入,然后将所有的候选名单得票情况显示出来,并显示最终当选班长者的信息。
(2)具体要求:
1、要求使用面向对象思想,编写学生类Student,将候选人姓名、编号和票数保存到类Student中,并实现相应的getXx()和setXxx()方法;
2、输入数据前,显示出各位候选人的编号及姓名(提示:建立一个候选人数组);
3、循环执行接受键盘输入的班长候选人编码,直到输入数字0,结束输入;
4、在接受每次输入的选票后要求验证该票是否有效,诺无效则此票作废等待继续输入;
5、输入结束后显示所有候选人得票情况,以及最终结果。
之所以傻眼,在于其要求面向对象编程思想来解决此题,而面向对象思想对于类集合理划分要求很高,简单说我们需要通过对类集的划分尽量减少主方法中的代码量,以下是我将其划分为4个类:学生信息类(Student)、数据输入类(InputData)、候选人类(Candidate)以及最后的 主方法类(Main)。
学生信息类:
- //定义Student类
- package VotePackage;
- public class Student implements Comparable<Student>{
- private int stuNo; //学生编号
- private String name; //学生姓名
- private int vote; //学生票数
-
- public Student(int stuNo,String name,int vote) //覆写带参构造方法
- {
- this.stuNo=stuNo;
- this.name=name;
- this.vote=vote;
- }
- public int compareTo(Student o) { //实现Comparable借口 ,排序功能
- if(this.vote<o.vote)
- {
- return 1;
- }
- else if(this.vote>o.vote)
- {
- return -1;
- }
- else
- {
- return 0;
- }
- }
- // 以下是对Student类的属性封装
- public int getStuNo(){
- return this.stuNo;
- }
- public void setStuNo(int stuNo){
- this.stuNo=stuNo;
- }
- public String getName(){
- return this.name;
- }
- public void setName(String name){
- this.name=name;
- }
- public int getVote(){
- return this.vote;
- }
- public void setVote(int vote){
- this.vote=vote;
- }
- }
复制代码 因为要对对象数组进行排序,所以设计Student类时实现了Comparable接口,并覆写了comparaTo( )方法,制定由大到小的排序规则。
数据输入类:
- <font size="3"> //定义输入数据类
- package VotePackage;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class InputData {
- private BufferedReader buf=null; //定义BufferedReader类对象,用于接受数据
- public InputData()
- {
- this.buf=new BufferedReader(new InputStreamReader(System.in)); //实例化键盘接收数据对象buf
- }
-
- public String getString(String info) //用于接受键盘得到的字符串,返回字符串
- {
- String temp=null;
- System.out.print(info);
- try {
- temp=buf.readLine();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return temp;
- }
-
- public int getInt(String info,String err) //用于判断的得到的字符串是否为int型数据,返回int型数据
- {
- int temp=0;
- String str=null;
- boolean flag=true;
- while(flag)
- {
- str=this.getString(info);
- if(str.matches("\\d+")) //正则判断其是否为整型数据
- {
- temp=Integer.parseInt(str);
- flag=false;
- }else{
- System.out.println(err);
- }
- }
- return temp;
- }
- }</font>
复制代码 此类用于输入数据,并判断其正确性。
候选人类:
- //定义竞选班长的候选人 类
- package VotePackage;
- public class Candidate {
- private Student stu[]={new Student(1,"张三",0),new Student(2,"李四",0),new Student(3,"王五",0),
- new Student(4,"赵六",0)}; //初始化候选人信息
- private boolean flag=true; //标志位,用于控制循环
- public Candidate(){
- this.print(); //先打印出候选人投票前信息
-
- while(flag)
- {
- this.vote(); //开始投票
- }
-
- this.print(); //打印出投票后信息
- this.getReasult(); //输出竞选后最终结果
- }
- public void vote()
- {
- InputData input=new InputData(); //初始化输入流
- int num=input.getInt("请输入班长候选人编号(数字0)结束:", "此选票无效,请输入正确的候选人编号!");
- //开始输入,并给予一定提示信息
- switch(num)
- {
- case 0: this.flag=false; break; //如果输入为0,改变标志位,用于退出循环
- case 1: this.stu[0].setVote(this.stu[0].getVote()+1); break; //如果为1,给编号为1的候选人票数+1
- case 2: this.stu[1].setVote(this.stu[1].getVote()+1); break; //同上
- case 3: this.stu[2].setVote(this.stu[2].getVote()+1); break; //同上
- case 4: this.stu[3].setVote(this.stu[3].getVote()+1); break; //同上
- default :
- System.out.println("此选票无效,请输入正确的候选人编号!");//如果为其他数据则输出提示信息
- }
- }
-
- public void print() //用于打印候选人票数信息
- {
- for(int i=0;i<stu.length;i++)
- {
- System.out.println(stu[i].getStuNo()+": "+stu[i].getName()+" 【"+stu[i].getVote()+"】");
- }
- }
-
- private void getReasult() //用于获得最终票数最多的候选人结果
- {
- java.util.Arrays.sort(this.stu);
- //Student是实现了 Comparable接口 ,所以可以直接使用Arrays中的sort()方法排序
-
- System.out.println("投票最终结果:"+stu[0].getName()+"同学,最后以"+stu[0].getVote()+"票当选班长!");
- //由于我们是由高到低进行排序,所以最高票数是stu[0]中的候选人
- }
- }
复制代码 可以发现在此类中定义了许多方法,并在构造方法中进行了调用,也正是因此为主方法类减少许多负担。
接下来是重点,通过以上类集的合理划分,让我们来看看主方法类的代码:
- package VotePackage;
- public class Main {
- public static void main(String args[])
- {
- new Candidate();
- }
- }
复制代码
没错,通过合理划分类集主方法只需实例化Candidate对象即可完成所有功能。
作者: 你好!默默 时间: 2014-3-27 22:36
好详细啊!赞赞。。。
作者: 小歪 时间: 2014-3-27 22:52
咯咯...边学边写
作者: 探花 时间: 2014-3-27 23:16
写的很好,也很详细,可以学习学习
作者: 小歪 时间: 2014-3-27 23:20
谢谢鼓励,初学,会努力的
作者: 李庆忠 时间: 2014-3-28 11:42
写得很详细,学习一下!
作者: 黑马_白马 时间: 2014-6-13 16:33
lz这是考试题还是只是简单的小实践?
作者: 小歪 时间: 2014-6-17 21:08
随便写的,不是考试题
作者: 黑马_白马 时间: 2014-6-18 18:18
楼主进黑马了吗
作者: 小歪 时间: 2014-6-19 14:53
没,去基础班了
作者: 钟翠翠 时间: 2014-6-19 16:06
好详细 受教了
作者: 钟翠翠 时间: 2014-6-19 16:19
运行了一下项目,成功了!赞一个!
作者: 黑马_白马 时间: 2014-6-19 16:41
哦哦,就是那个不要钱,只交点场地使用费的那啊???
环境怎么样?
氛围好不好?
作者: 小歪 时间: 2014-6-20 11:21
7月2号过去
作者: 小歪 时间: 2014-6-20 11:22
呵呵
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |