某班级投票竞选班干部,班级学生人数为100人,每个学生只能投一票。
本任务要求,编程实现一个投票程序,每个学生只能投一次票,投票成功提示“感谢你的投票”,若重复投票,提示“请勿重复投票”。当投票总数达到100时或者主观结束投票时,同时统计投票学生人数和投票结果。
【实现思路】
(1)通过任务描述可知,需要定义一个参与投票的学生类Voter类,它具有姓名,最大投票数,当前投票总数,和投票意见。
(2)因为所有参与投票的学生都会改变同一个数据,即投票次数,一次把它定义成静态变量:private static int count;
(3)另外,为了防止学生重复投票,必须保存参与投票的学生信息,可采用一个集合来存放已经投票的学生对象。
private static Set<Voter> voters = new HashSet<Voter>();
(4)最后编写测试Voter类的投票和打印投票结果功能。
import java.util.HashSet;
import java.util.Set;
public class Voter {
// 属性的定义
private static final int MAX_COUNT = 100; // 最大投票数
private static int count; // 投票数
// 静态变量,存放已经投票的学生
private static Set<Voter> voters = new HashSet<Voter>();
private String name;
private String answer;
// 构造方法
public Voter(String name) {
this.name = name;
}
//无参构造方法
public Voter(){
count =0;
name="unknown";
answer ="unknown";
}
//name取值方法
public String getName() {
return name;
}
//answer取值方法
public String getAnswer() {
return answer;
}
//count取值方法
public int getCount(){
return count;
}
//answer赋值方法
public void setAnswer(String answer) {
this.answer = answer;
}
//name赋值方法
public void setName(String name) {
this.name = name;
}
//count赋值方法
public static void setCount(int count) {
Voter.count = count;
}
// 投票
public void voterFor(String answer) {
if (count == MAX_COUNT){
System.out.println("投票结束。");
return ;
}
if (voters.contains(this)){
System.out.println(name+",请勿重复投票。");
} else {
this.answer = answer;
count ++;
voters.add(this);
System.out.println(name+" 感谢你的投票。");
}
}
// 打印投票结果
public static void printVoterResult() {
System.out.println("当前投票数为:"+count);
System.out.println("参与投票的学生和结果如下:");
for (Voter voter: voters) {
System.out.println(voter.name+" 意见 "+voter.answer);
}
}
public static void main(String[] args) {
// 创建参与投票的学生对象
Voter tom = new Voter("Tom");
Voter jack = new Voter("Jack");
Voter mike = new Voter("Mike");
// 学生开始投票
tom.voterFor("是");
tom.voterFor("否");
jack.voterFor("是");
mike.voterFor("是");
// 打印投票结果
Voter.printVoterResult();
}
}
基于控制台的购书系统
(1)通过任务描述可知,该系统中必须包括3个实体类,类名及属性设置如下:
- 图书类(Book):库存数量(storage)图书单价(price)图书名称(name)图书编号(id)
- 订单项类(OrderItem):购买数量(num)
- 订单类(Order):订单项列表(items)订单总额(total)订单号(orderID)图书(book)
(2)由于购买图书时,需要选择图书的数量,所以需要在订单项类里定义获取图书对象以及图书数量的方法。
(3)由于需要指定订单项以及获取订单的订单列表、订单号、订单总额等信息,所以需要有订单列表、订单号、订单总额指定订单项等方法。
public class Book {
private int id; // 编号
private String name; // 书名
private double price; // 价格
private int storage; // 库存
// 有参构造
public Book(int id, String name, double price, int storage) {
this.id = id;
this.name = name;
this.price = price;
this.storage = storage;
}
//无参构造
public Book(){
id=0;
name ="unknown";
price=0;
storage=0;
}
// 获取书号
public int getId() {
return id;
}
// 获取书名
public String getName() {
return name;
}
// 获取价格
public double getPrice() {
return price;
}
// 获取库存
public int getStorage() {
return storage;
}
//书号赋值
public void setId(int id) {
this.id = id;
}
//书名赋值
public void setName(String name) {
this.name = name;
}
//价格赋值
public void setPrice(double price) {
this.price = price;
}
//库存赋值
public void setStorage(int storage) {
this.storage = storage;
}
}
public class Order {
private String orderId;
private OrderItem items[];
private double total;
// 有参构造
public Order(String orderId) {
this.orderId = orderId;
this.items = new OrderItem[3];
}
//无参构造
public Order(){
}
// 获取订单号
public String getOrderId() {
return orderId;
}
// 获取订单列表
public OrderItem[] getItems() {
return items;
}
// 获取订单总额
public double getTotal() {
calTotal();
return total;
}
//订单号赋值
public void setOrderId(String orderId) {
this.orderId = orderId;
}
//订单列表赋值
public void setItems(OrderItem[] items) {
this.items = items;
}
//订单总额赋值
public void setTotal(double total) {
this.total = total;
}
// 指定一个订单项
public void setItem(OrderItem item, int i) {
this.items[i] = item;
}
// 计算订单总额
public void calTotal() {
double total = 0;
for (int i = 0; i < items.length; i++) {
total += items[i].getNum() * items[i].getBook().getPrice();
}
this.total = total;
}
}
public class OrderItem {
private Book book;
private int num;
// 有参构造方法
public OrderItem(Book book, int num) {
this.book = book;
this.num = num;
}
//无参构造方法
public OrderItem(){
num=0;
}
// 获取图书对象
public Book getBook() {
return book;
}
// 获取订购图书数量
public int getNum() {
return num;
}
//图书对象赋值
public void setBook(Book book) {
this.book = book;
}
//订购图书数量赋值
public void setNum(int num) {
this.num = num;
}
}
import Book.Book;
import Book.Order;
import Book.OrderItem;
import java.util.Scanner;
public class PayBooks {
public static void main(String[] args) {
Book books[] = new Book[3];
//模拟从数据库中读取图书信息并输出
outBooks(books);
// 顾客购买图书
Order order = purchase(books);
// 输出订单信息
outOrder(order);
}
// 顾客购买图书
public static Order purchase(Book books[]) {
Order order = new Order("00001");
OrderItem item = null;
Scanner in = new Scanner(System.in);
for (int i = 0; i < 3; i ++) {
System.out.println("请输入图书编号选择图书:");
int cno = in.nextInt();
System.out.println("请输入购买图书数量:");
int pnum = in.nextInt();
item = new OrderItem(books[cno-1],pnum);
order.setItem(item, i);
System.out.println("请继续购买图书。");
}
in.close();
return order;
}
// 输出订单信息
public static void outOrder(Order order) {
System.out.println("\n\t图书订单");
System.out.println("图书订单号:"+order.getOrderId());
System.out.println("图书名称\t购买数量\t图书单价");
System.out.println("--------------------------------------");
OrderItem items[] = order.getItems();
for(int i = 0; i < items.length; i ++) {
System.out.println(items[i].getBook().getName()+"\t"+items[i].getNum(
)+"\t"+items[i].getBook().getPrice());
//System.out.println("\n");
}
System.out.println("---------------------------------------");
System.out.println("订单总额:\t\t"+order.getTotal());
}
// 模拟从数据库中读取图书信息并输出
public static void outBooks(Book books[]) {
books[0] = new Book(1,"Java教程",30.6,30);
books[1] = new Book(2,"JSP教程",42.1,40);
books[2] = new Book(3,"SSH架构",47.3,15);
System.out.println("\t图书列表");
System.out.println("图书编号\t图书名称\t\t图书单价\t库存数量");
System.out.println("---------------------------------------");
for (int i = 0; i < books.length; i ++) {
System.out.println(i+1+"\t"+books[i].getName()+"\t"+
books[i].getPrice()+"\t"+books[i].getStorage());
}
System.out.println("---------------------------------------");
}
}