黑马程序员技术交流社区

标题: (囧)实例小项目:投票系统 [打印本页]

作者: 小歪    时间: 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)。



学生信息类:

  1.                                                                                 //定义Student类

  2. package VotePackage;

  3. public class Student implements Comparable<Student>{

  4.         private int stuNo;        //学生编号
  5.         private String name;        //学生姓名       
  6.         private int vote;        //学生票数
  7.        
  8.         public Student(int stuNo,String name,int vote)  //覆写带参构造方法
  9.         {
  10.                 this.stuNo=stuNo;
  11.                 this.name=name;
  12.                 this.vote=vote;
  13.         }
  14.         public int compareTo(Student o) {  //实现Comparable借口 ,排序功能
  15.                 if(this.vote<o.vote)
  16.                 {
  17.                         return 1;
  18.                 }
  19.                 else if(this.vote>o.vote)
  20.                         {
  21.                                 return -1;
  22.                         }
  23.                         else
  24.                                 {
  25.                                         return 0;
  26.                                 }
  27.         }
  28.                                         //  以下是对Student类的属性封装        
  29.         public  int getStuNo(){
  30.                 return this.stuNo;
  31.         }
  32.         public void setStuNo(int stuNo){
  33.                 this.stuNo=stuNo;
  34.         }
  35.         public String getName(){
  36.                 return this.name;
  37.         }
  38.         public void setName(String name){
  39.                 this.name=name;
  40.         }
  41.         public int getVote(){
  42.                 return this.vote;
  43.         }
  44.         public void setVote(int vote){
  45.                 this.vote=vote;
  46.         }
  47. }
复制代码
因为要对对象数组进行排序,所以设计Student类时实现了Comparable接口,并覆写了comparaTo( )方法,制定由大到小的排序规则。


数据输入类:

  1. <font size="3">                                                                        //定义输入数据类
  2. package VotePackage;

  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;

  6. public class InputData {
  7.         private BufferedReader buf=null;   //定义BufferedReader类对象,用于接受数据
  8.         public InputData()
  9.         {
  10.                 this.buf=new BufferedReader(new InputStreamReader(System.in));  //实例化键盘接收数据对象buf
  11.         }
  12.        
  13.         public String getString(String info)   //用于接受键盘得到的字符串,返回字符串
  14.         {
  15.                 String temp=null;
  16.                 System.out.print(info);
  17.                 try {
  18.                         temp=buf.readLine();
  19.                 } catch (IOException e) {
  20.                         // TODO Auto-generated catch block
  21.                         e.printStackTrace();
  22.                 }
  23.                 return temp;
  24.         }
  25.        
  26.         public int getInt(String info,String err) //用于判断的得到的字符串是否为int型数据,返回int型数据
  27.         {
  28.                 int temp=0;
  29.                 String str=null;
  30.                 boolean flag=true;
  31.                 while(flag)
  32.                 {
  33.                         str=this.getString(info);
  34.                         if(str.matches("\\d+"))  //正则判断其是否为整型数据
  35.                         {
  36.                                 temp=Integer.parseInt(str);
  37.                                 flag=false;
  38.                         }else{
  39.                                 System.out.println(err);
  40.                         }
  41.                 }
  42.                 return temp;
  43.         }
  44. }</font>
复制代码
此类用于输入数据,并判断其正确性。

候选人类:

  1.                                                               //定义竞选班长的候选人  类


  2. package VotePackage;

  3. public class Candidate {
  4.         private Student stu[]={new Student(1,"张三",0),new Student(2,"李四",0),new Student(3,"王五",0),
  5.                         new Student(4,"赵六",0)};     //初始化候选人信息
  6.         private boolean flag=true;  //标志位,用于控制循环
  7.         public Candidate(){
  8.                 this.print();   //先打印出候选人投票前信息
  9.                
  10.                 while(flag)
  11.                 {
  12.                         this.vote();    //开始投票
  13.                 }
  14.                
  15.                 this.print();       //打印出投票后信息
  16.                 this.getReasult();  //输出竞选后最终结果
  17.         }
  18.         public void vote()
  19.         {
  20.                 InputData input=new InputData();   //初始化输入流
  21.                 int num=input.getInt("请输入班长候选人编号(数字0)结束:", "此选票无效,请输入正确的候选人编号!");
  22.                 //开始输入,并给予一定提示信息
  23.                 switch(num)
  24.                 {
  25.                 case 0: this.flag=false;  break;   //如果输入为0,改变标志位,用于退出循环
  26.                 case 1: this.stu[0].setVote(this.stu[0].getVote()+1);  break;   //如果为1,给编号为1的候选人票数+1
  27.                 case 2: this.stu[1].setVote(this.stu[1].getVote()+1);  break;        //同上
  28.                 case 3: this.stu[2].setVote(this.stu[2].getVote()+1);  break;        //同上
  29.                 case 4: this.stu[3].setVote(this.stu[3].getVote()+1);  break;        //同上
  30.                 default :
  31.                                 System.out.println("此选票无效,请输入正确的候选人编号!");//如果为其他数据则输出提示信息
  32.                 }
  33.         }
  34.        
  35.         public void print()    //用于打印候选人票数信息
  36.         {
  37.                 for(int i=0;i<stu.length;i++)
  38.                 {
  39.                         System.out.println(stu[i].getStuNo()+": "+stu[i].getName()+" 【"+stu[i].getVote()+"】");
  40.                 }
  41.         }
  42.        
  43.         private void getReasult()  //用于获得最终票数最多的候选人结果
  44.         {
  45.                 java.util.Arrays.sort(this.stu);   
  46.                 //Student是实现了 Comparable接口 ,所以可以直接使用Arrays中的sort()方法排序
  47.                
  48.                 System.out.println("投票最终结果:"+stu[0].getName()+"同学,最后以"+stu[0].getVote()+"票当选班长!");
  49.                 //由于我们是由高到低进行排序,所以最高票数是stu[0]中的候选人
  50.         }
  51. }
复制代码
可以发现在此类中定义了许多方法,并在构造方法中进行了调用,也正是因此为主方法类减少许多负担。



接下来是重点,通过以上类集的合理划分,让我们来看看主方法类的代码:

  1. package VotePackage;

  2. public class Main {
  3.         public static void main(String args[])
  4.         {
  5.                 new Candidate();
  6.         }
  7. }
复制代码

没错,通过合理划分类集主方法只需实例化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-13 16:33
lz这是考试题还是只是简单的小实践?

随便写的,不是考试题
作者: 黑马_白马    时间: 2014-6-18 18:18
小歪 发表于 2014-6-17 21:08
随便写的,不是考试题

楼主进黑马了吗
作者: 小歪    时间: 2014-6-19 14:53
黑马_白马 发表于 2014-6-18 18:18
楼主进黑马了吗

没,去基础班了
作者: 钟翠翠    时间: 2014-6-19 16:06
好详细 受教了
作者: 钟翠翠    时间: 2014-6-19 16:19
运行了一下项目,成功了!赞一个!
作者: 黑马_白马    时间: 2014-6-19 16:41
小歪 发表于 2014-6-19 14:53
没,去基础班了

哦哦,就是那个不要钱,只交点场地使用费的那啊???
环境怎么样?
氛围好不好?
作者: 小歪    时间: 2014-6-20 11:21
黑马_白马 发表于 2014-6-19 16:41
哦哦,就是那个不要钱,只交点场地使用费的那啊???
环境怎么样?
氛围好不好? ...

7月2号过去
作者: 小歪    时间: 2014-6-20 11:22
钟翠翠 发表于 2014-6-19 16:19
运行了一下项目,成功了!赞一个!

呵呵







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2