Java练习题3

注:第一个是面向对象;

要求:

一个教学单位有假设有n个学生选课,老师要求将学生进行分组,并对每次作业进行小组展示,请按照要求分组并选出展示的主讲人

1)请将学生随机选择进行分组,每五个人一组,最后剩余不够五个自动归为一组。

2)对上面的分组随机进行选择1/5的小组;

3)从上面的选出的小组每个小组中随机选出一人作为主讲人。

面向对象实现:

package homework;

import java.util.ArrayList;
import java.util.Random;

//学生
public class Student {
	private int age;
	private String num;//学号

	public Student(int age) {
		this.age = age;
	}

	public Student(String num) {
		this.num = num;//学号
	}
	public String getnum() {
		return num;//取学号
	}
	
	public int getAge() {
		return age;
	}
}

//小组
 class Group{
	 private String num;//小组编号num
	 private ArrayList<Student> groups=new ArrayList<>();
	 
	 //方法
	 public Group(Student st) {
		 groups.add(st);//构造方法
	 }
	 
	 public Group(String num) {
		 this.num=num;//构造方法
	 }
	 
	 public String getnum() {
		 return num;//取小组编号
	 }
	 
	 public int getsize() {
		 return groups.size();//取小组人数
	 }
	 
	 public Student getstudent(int index) {
		 if(index<0||index>(getsize()-1)) {
			 System.out.println("输入有错误");
			 return null;
		 }else {
		 return groups.get(index);//取小组学生
		 }
	 }
	 
	 public Student removestudent(int index) {
		 if(index<0||index>(getsize()-1)) {
			 System.out.println("输入有错误");
			 return null;
		 }else {
		 return groups.remove(index);//取并移出小组
		 }
	 }
	 
	 public void addstudent(Student st) {
		 groups.add(st);//添加学生到小组
	 }	 
}
 
 
//教学单位
 class TeachUnit{
	 private ArrayList<Student> Student_list = new ArrayList<Student>();//一个教学单位一个学生列表
	 private ArrayList<Group> group_list=new ArrayList<Group>();//总小组列表
	 
     // 创建总学生列表,N为学生总数,num为学号前固定格式
	 public TeachUnit(int N,String num) {
		for (int i = 1; i <= N; i++) {
				Student_list.add(new Student(String.format(num+"%02d", i)));
		}
	 }
	 
	 
	// 创建分组,告诉要分成几人一组
	 public  void creategroup(int a) {
		Random rand=new Random();
	 	ArrayList<Group> group_list = new ArrayList<Group>();// group_list存储班级总小组
	 	int count=1;//小组编号
	 	int N=st_size();
	 	for (int i = 0; i < N; i += a) {
	 		Group group = new Group("第"+count+"组");
	 		int end = Math.min(i + a, N);// 为了人数不足a人时,剩下的凑一组
	 		for(int j=i;j<end;j++) {
	 			group.addstudent(Student_list.remove(rand.nextInt(st_size())));
	 		}
	 		group_list.add(group);
	 		count++;
	 	}
	 	this.group_list= group_list;
	 }
	 
	 	
	 	//抽组
	 public  Group selectgroup() {
	 	Random rand=new Random();
	 	return group_list.remove(rand.nextInt(groupsize()));
	 }
	 	
	 	//抽学生
	 public  Student selectstudent(Group group) {
	 	Random rand=new Random();
	 	return group.removestudent(rand.nextInt(group.getsize()));
	 }
	 	
	 public int st_size() {
	 	return Student_list.size();//返回学生人数
	 }
	 	
	 public int groupsize() {
	 	return group_list.size();//返回总组数
	 }
 }

 
//调用方法选人 
class RandStudent {
	public static void main(String[] args) {
		// 给学生编号,用学号唯一的表示一名学生
		int N = 98;// 班级学生总人数
		
		TeachUnit unit=new TeachUnit(N,"4211461202");
		
		unit.creategroup(5);//5人一组
		
		int n=(int) Math.ceil(unit.groupsize()/5.0);//只抽1/5的小组
		
		System.out.println("被选中的组和对应主讲人有:");
		
		for(int i=0;i<n;i++) {
			Group group=unit.selectgroup();//抽组
			Student st=unit.selectstudent(group);//从这个组里抽学生
			System.out.println(group.getnum()+"的主讲人学号为:"+st.getnum());
		}
		
	}
}

面向过程:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int totalStudents = 35; // 假设有35个学生选课
        int groupSize = 5;

        // 创建学生列表
        List<Integer> students = new ArrayList<>();
        for (int i = 1; i <= totalStudents; i++) {
            students.add(i);
        }

        // 随机分组
        Collections.shuffle(students);
        List<List<Integer>> groups = new ArrayList<>();
        for (int i = 0; i < totalStudents; i += groupSize) {
            int end = Math.min(i + groupSize, totalStudents);
            groups.add(students.subList(i, end));
        }

        // 输出分组情况
        System.out.println("分组情况:");
        for (List<Integer> group : groups) {
            System.out.println(group);
        }

        // 随机选择1/5的小组
        Random random = new Random();
        int selectedGroupCount = groups.size() / 5;
        List<List<Integer>> selectedGroups = new ArrayList<>();
        for (int i = 0; i < selectedGroupCount; i++) {
            int selectedIndex = random.nextInt(groups.size());
            selectedGroups.add(groups.remove(selectedIndex));
        }

        // 输出被选中的小组
        System.out.println("\n被选中的小组:");
        for (List<Integer> group : selectedGroups) {
            System.out.println(group);
        }

        // 从选中的小组中随机选择主讲人
        System.out.println("\n主讲人:");
        for (List<Integer> group : selectedGroups) {
            int speaker = group.get(random.nextInt(group.size()));
            System.out.printf("小组 %s 的主讲人是: %d\n", group, speaker);
        }
    }
}

这个程序首先创建了一个学生列表,并为每个学生分配一个从1到totalStudents的唯一ID。接下来,使用Collections.shuffle()方法随机打乱学生列表,然后按照每5个学生一组的规则进行分组。分组后,程序从所有小组中随机选择1/5的小组,最后在每个选中的小组中随机选择一名主讲人。

方法2:

package test1;

import java.util.ArrayList;
import java.util.Random;

public class Class1 {
	int age;
	String num;// 学号

	public Class1(int age) {
		this.age = age;
	}

	public Class1(String num) {
		this.num = num;
	}

	public void print_name() {
		System.out.println(num);
	}
}

class rand_student {
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		// 给学生编号,用学号唯一的表示一名学生
		int N = 98;// 班级学生总人数
		// Student_list存储总学生
		ArrayList<Class1> Student_list = new ArrayList<Class1>();
		for (int i = 1; i < N + 1; i++) {
			if (i < 10) {
				Student_list.add(new Class1("421146120" + i));
			} else {
				Student_list.add(new Class1("42114612" + i));
			}
		}
		Random rand = new Random();
		// group_list存储班级总小组
		ArrayList<ArrayList<Class1>> group_list = new ArrayList<ArrayList<Class1>>();
		int count = 0;
		// gruop存储单个小组
		ArrayList<Class1> group = new ArrayList<Class1>();
		while (true) {
			if (count != 5) {// 确保5人一组
				group.add(Student_list.remove(rand.nextInt(N)));
				N -= 1;// 分好组的人从总学生里面去除
				count += 1;// count代表这个小组目前人数
			} else {// 上一个小组满人了,应该建立新的小组,如果甚于人数大于5,那么按照原方法建组,
				// 如果剩余人数小于等于5,那么剩余的直接一组
				if (N > 5) {
					count = 0;// 归零,重新计数
					group_list.add(new ArrayList<Class1>(group));// add一次代表一个小组
					group.clear();// 清空,重新建组
				} else {
					group_list.add(Student_list);// 剩下的学生直接一组
					break;// 全部学生都组好队伍了,退出while循环
				}
			}
		}

		// 开始抽组抽人
		int group_num = group_list.size();// 总组数,
		int n = (int) Math.ceil(group_num / 5.0), j = 0;// 选出1/5的小组
		ArrayList<Integer> group_rand_ago = new ArrayList<Integer>();
		while (j != n) {
			int group_rand = rand.nextInt(group_num);// 新生成要抽到的组
			if (group_rand_ago.contains(group_rand)) {// 防止抽到相同小组
				continue;
			} else {
				int student_rand = rand.nextInt(group_list.get(group_rand).size());//此小组人数
				System.out.print("抽到的小组为:" + (group_rand + 1) + "组 " + "第" + (student_rand + 1) + "个学生为主讲人 " + "学号为:");
				System.out.println(group_list.get(group_rand).get(student_rand).num);
				j++;
			}
			group_rand_ago.add(group_rand);// 上一次被抽到的组
		}
	}
}

方法3:

package homework;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

//学生
public class Student {
	int age;
	String num;// 学号

	public Student(int age) {
		this.age = age;
	}

	public Student(String num) {
		this.num = num;
	}
}

//选主讲人
class rand_Student {
	public static void main(String[] args) {
		// 给学生编号,用学号唯一的表示一名学生
		int N = 98;// 班级学生总人数
		// 将班级学生编号(学号)
		ArrayList<Student> studentlist=teach_unit.Studentlist(N,"4211461202");
		
		//将学生分组
		ArrayList<ArrayList<Student>> grouplist=teach_unit.creategroup(studentlist, 5);
		
		//抽一些小组出来
		int n=(int) Math.ceil(grouplist.size()/5.0);//只抽1/5的小组
		System.out.println("被选中的小组有:");
		List<ArrayList<Student>> selectgroup=teach_unit.selectgroup(grouplist, n);
		for(int i=0;i<n;i++) {
			System.out.println("第"+(i+1)+"个组为:"+selectgroup.get(i));
		}
		
		//再从这些组里面分别选出一名主讲人
		for(int i=0;i<n;i++) {
			
			System.out.print("第"+(i+1)+"个组的主讲人为:"+teach_unit.selectstudent(selectgroup.get(i), 1));
		    System.out.println(" 其学号是:"+teach_unit.selectstudent(selectgroup.get(i), 1).get(0).num);
		}
	}
}

//教学单位
class teach_unit{
	// 创建总学生列表,N为学生总数,num为学号前固定格式
	public static ArrayList<Student> Studentlist(int N,String num) {
		ArrayList<Student> Student_list = new ArrayList<Student>();
		for (int i = 1; i <= N; i++) {
			Student_list.add(new Student(String.format(num+"%02d", i)));
		}
		return Student_list;// Student_list存储总学生

	}

	// 创建分组,属于学生列表,并告诉要分成几人一组
	public static ArrayList<ArrayList<Student>> creategroup(ArrayList<Student> studentlist, int a) {
		Collections.shuffle(studentlist);// 打乱学生列表

		// group_list存储班级总小组
		ArrayList<ArrayList<Student>> group_list = new ArrayList<ArrayList<Student>>();

		for (int i = 0; i < studentlist.size(); i += a) {
			int end = Math.min(i + 5, studentlist.size());// 为了人数不足a人时,剩下的凑一组
			group_list.add(new ArrayList<Student>(studentlist.subList(i, end)));
		}

		return group_list;
	}

	// 先从group_list随机抽a组
	public static List<ArrayList<Student>> selectgroup(ArrayList<ArrayList<Student>> group_list, int a) {
		Collections.shuffle(group_list);// 打乱小组列表
		return group_list.subList(0, a);
	}

	// 在从被抽中的组里面选a个人出来
	public static List<Student> selectstudent(ArrayList<Student> list, int a) {
		Collections.shuffle(list);
		return list.subList(0, a);
	}
}

猜你喜欢

转载自blog.csdn.net/m0_62526778/article/details/129988763