A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小歪 中级黑马   /  2014-3-27 22:23  /  2935 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  实例小项目:投票系统

     

      刚看到这个运行结果时,第一感觉挺简单的,无非就是写个投票,谁票多就输出谁,担当看了题目要求就有些傻眼,不急我们一起慢慢往下看  :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对象即可完成所有功能。






评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

14 个回复

倒序浏览
好详细啊!赞赞。。。
回复 使用道具 举报
咯咯...边学边写
回复 使用道具 举报
写的很好,也很详细,可以学习学习
回复 使用道具 举报
谢谢鼓励,初学,会努力的
回复 使用道具 举报
写得很详细,学习一下!
回复 使用道具 举报
lz这是考试题还是只是简单的小实践?
回复 使用道具 举报
小歪 中级黑马 2014-6-17 21:08:53
8#
黑马_白马 发表于 2014-6-13 16:33
lz这是考试题还是只是简单的小实践?

随便写的,不是考试题
回复 使用道具 举报
小歪 发表于 2014-6-17 21:08
随便写的,不是考试题

楼主进黑马了吗
回复 使用道具 举报

没,去基础班了
回复 使用道具 举报
好详细 受教了
回复 使用道具 举报
运行了一下项目,成功了!赞一个!
回复 使用道具 举报
小歪 发表于 2014-6-19 14:53
没,去基础班了

哦哦,就是那个不要钱,只交点场地使用费的那啊???
环境怎么样?
氛围好不好?
回复 使用道具 举报
黑马_白马 发表于 2014-6-19 16:41
哦哦,就是那个不要钱,只交点场地使用费的那啊???
环境怎么样?
氛围好不好? ...

7月2号过去
回复 使用道具 举报
钟翠翠 发表于 2014-6-19 16:19
运行了一下项目,成功了!赞一个!

呵呵


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马