技能使用:

1
2
3
1. 数组
2. if语句、while语句、for语句
3. random()方法

任务描述:

1
2
3
4
5
6
7
任务描述:
设计一个随机点名系统。
要求:
(1)抽取数量任意定制
(2)屏幕显示学生班级和顺序号
*补充说明:
一共有4个班,每个班30人。

代码实现:

  • java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    package one_ten;
    /*
    任务描述:
    设计一个随机点名系统。
    要求:
    (1)抽取数量任意定制
    (2)屏幕显示学生班级和顺序号
    *补充说明:
    一共有4个班,每个班30人。
    */
    import java.util.Scanner;

    public class Random_student {
    public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    //输入抽取同学的个数
    System.out.println("请输入抽取同学的个数(最多抽取99位):");
    int count = scan.nextInt();
    scan.close();
    //创建两个数组分别储存班级和学生
    int[] student = new int[100];
    int[] classes = new int [100];
    //两个while语句的参数
    int i = 0;
    int j = 0;
    count --;

    while( i <= count) {
    //获得一个两位以内的随机数并存储在数组student里
    student[i] = (int)(Math.random()*100);
    //限制student的大小(小于30)
    if(student[i] >= 30 || student[i] == 0)
    i --;
    //i++补全循环条件
    i++;
    }
    while( j <= count) {
    //获得一个两位以内的随机数并存储在数组classes里
    classes[j] = (int)(Math.random()*10);
    //限制classes的大小(小于4且不等于0)
    if(classes[j] > 4 || classes[j] == 0)
    j --;
    //j++补全循环条件
    j++;
    }
    //整齐的输出数据
    for(int k = 0; k < i; k++) {
    if(student[k] >= 10) {
    if( (k + 1) < 10)
    System.out.println( "第0" + (k + 1) +"位同学的学号是:202030" + classes[k] + student[k] + " 班级:" + classes[k] + " 序号:" + student[k]);
    else
    System.out.println( "第" + (k + 1) +"位同学的学号是:202030" + classes[k] + student[k] + " 班级:" + classes[k] + " 序号:" + student[k]);
    }
    else {
    if( (k + 1) < 10)
    System.out.println( "第0" + (k + 1) +"位同学的学号是:202030" + classes[k] + "0" + student[k] + " 班级:" + classes[k] + " 序号:0" + student[k]);
    else
    System.out.println( "第" + (k + 1) +"位同学的学号是:202030" + classes[k] + "0" + student[k] + " 班级:" + classes[k] + " 序号:0" + student[k]);

    }
    }
    }
    }

  • 运行检测:

    1. 抽取8位同学

    2. 抽取10位同学

    3. 抽取99位同学

代码自评:

  • 缺点:

    没有将重复数据筛选剔除的逻辑,虽然有班级和序号双重保证,但当随机抽取的数量较大时,依旧会出现重复抽取同一位同学的情况。

  • 总结:

    只适合小规模随机抽取时使用,如果想要大规模随机抽取则需要添加重复数据的筛选剔除逻辑。

老师评价:

  1. 建议把同一个班的学生放在一起,并对抽到的学生按次序排序。
  2. 解决重复数据的问题。

Plus版本:

任务描述:

1
2
3
4
5
6
7
任务描述:
设计一个随机点名系统。
要求:
(1)抽取数量任意定制
(2)屏幕显示学生班级和顺序号
*补充说明:
一共有4个班,每个班30人。

代码逻辑解释:

1
2
3
4
5
6
7
8
9
10
11
(1)输入阶段:
输入抽取同学的个数。
(2)随机数获取阶段:
通过random方法获得两个数组的随机数数据,分别用来表示学生的班级信息和序号信息
(3)排除相同班级,相同次序的同学的数据
难点:相同班级不能排除,不同班级相同次序的同学的数据也不能排除
(4)排序阶段
通过起泡法排序将学生的序号信息进行从大到小排序,并对对应的班级信息做出相应的变化
(5)输出阶段
通过使用if语句使学生信息按照四个班分块输出;
通过使用if和for语句令输出信息变得更加整齐(这个用的代码最多,但都是复制粘贴,外加一些小改动。)

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import java.util.Scanner;

public class Random_student {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//输入阶段:
//输入抽取同学的个数
System.out.println("请输入抽取同学的个数(最多抽取80位):");
int count = scan.nextInt();
scan.close();
//创建两个数组分别储存班级和学生
int[] student = new int[200];
int[] classes = new int [200];
//两个while语句的参数
int i = 0;
int j = 0;
count --;
//定义一个布尔类型的变量来辅助完成相同数据的筛选提出
boolean flag = false;

//随机数获取阶段
while( j <= count) {
//获得一个两位以内的随机数并存储在数组classes里
classes[j] = (int)(Math.random()*10);
//限制classes的大小(小于4且不等于0)
if(classes[j] > 4 || classes[j] == 0)
j --;
//j++补全循环条件
j++;
}
while( i <= count) {
//获得一个两位以内的随机数并存储在数组student里
student[i] = (int)(Math.random()*100);
//限制student的大小(小于30)
//排除相同班级相同序号的学生数据
for(int p = 0; p < i; p++) {
if(student[p] == student[i] && classes[p] == classes[i]) {
flag = true;
}
}
if(student[i] >= 30 || student[i] == 0 || flag)
i --;
//i++补全循环条件
i++;
flag = false;//吐槽:如果没有这一步会死循环
}
//排序阶段:
//对student[]进行从小到大排序,并对classes[]进行相应的变换
int length = i;//student[]和classes[]的长度
for(int m = 0 ; m < length - 1; m++) {
//循环(length-1)次
for(int n = 0; n < length - 1 - m; n ++) {
if(student[n] > student[n+1]) {
//将小的student[]前移一位
int temp1 = student[n];
student[n] = student[n+1];
student[n+1] = temp1;
//将classes[]同步变换
int temp2 = classes[n];
classes[n] = classes[n+1];
classes[n+1] = temp2;
}
}
}

//输出阶段:
//整齐的输出数据
//整齐输出1班抽中的学生的数据
int count1 = 1;//定义1班学生的总体序号
for(int k1 = 0; k1 < i; k1++) {
//使学生的学号和班级序号对齐
if(classes[k1] == 1){
if(student[k1] >= 10) {
//使抽取学生的总体序号对齐
if( count1 < 10)
System.out.println( "第0" + count1 +"位同学的学号是:202030" + classes[k1] + student[k1] + " 班级:" + classes[k1] + " 序号:" + student[k1]);
else
System.out.println( "第" + count1 +"位同学的学号是:202030" + classes[k1] + student[k1] + " 班级:" + classes[k1] + " 序号:" + student[k1]);
}
else {
//使抽取学生的总体序号对齐
if( count1 < 10)
System.out.println( "第0" + count1 +"位同学的学号是:202030" + classes[k1] + "0" + student[k1] + " 班级:" + classes[k1] + " 序号:0" + student[k1]);
else
System.out.println( "第" + count1 +"位同学的学号是:202030" + classes[k1] + "0" + student[k1] + " 班级:" + classes[k1] + " 序号:0" + student[k1]);

}
count1 ++;
}
}
System.out.println("1班抽中了 " + (count1 - 1) + "位同学");
//整齐输出2班抽中的学生的数据
int count2 = count1;
for(int k2 = 0; k2 < i; k2++) {
//使学生的学号和班级序号对齐
if(classes[k2] == 2){
if(student[k2] >= 10) {
//使抽取学生的总体序号对齐
if( count2 < 10)
System.out.println( "第0" + count2 +"位同学的学号是:202030" + classes[k2] + student[k2] + " 班级:" + classes[k2] + " 序号:" + student[k2]);
else
System.out.println( "第" + count2 +"位同学的学号是:202030" + classes[k2] + student[k2] + " 班级:" + classes[k2] + " 序号:" + student[k2]);
}
else {
//使抽取学生的总体序号对齐
if( count2 < 10)
System.out.println( "第0" + count2 +"位同学的学号是:202030" + classes[k2] + "0" + student[k2] + " 班级:" + classes[k2] + " 序号:0" + student[k2]);
else
System.out.println( "第" + count2 +"位同学的学号是:202030" + classes[k2] + "0" + student[k2] + " 班级:" + classes[k2] + " 序号:0" + student[k2]);
}
count2 ++;
}
}
System.out.println("2班抽中了 " + (count2 - count1) + "位同学");
//整齐输出3班抽中的学生的数据
int count3 = count2;
for(int k3 = 0; k3 < i; k3++) {
//使学生的学号和班级序号对齐
if(classes[k3] == 3){
if(student[k3] >= 10) {
//使抽取学生的总体序号对齐
if( count3 < 10)
System.out.println( "第0" + count3 +"位同学的学号是:202030" + classes[k3] + student[k3] + " 班级:" + classes[k3] + " 序号:" + student[k3]);
else
System.out.println( "第" + count3 +"位同学的学号是:202030" + classes[k3] + student[k3] + " 班级:" + classes[k3] + " 序号:" + student[k3]);
}
else {
//使抽取学生的总体序号对齐
if( count3 < 10)
System.out.println( "第0" + count3 +"位同学的学号是:202030" + classes[k3] + "0" + student[k3] + " 班级:" + classes[k3] + " 序号:0" + student[k3]);
else
System.out.println( "第" + count3 +"位同学的学号是:202030" + classes[k3] + "0" + student[k3] + " 班级:" + classes[k3] + " 序号:0" + student[k3]);
}
count3 ++;
}
}
System.out.println("3班抽中了 " + (count3 - count2) + "位同学");
//整齐输出4班抽中的学生的数据
int count4 = count3;
for(int k4 = 0; k4 < i; k4++) {
//使学生的学号和班级序号对齐
if(classes[k4] == 4){
if(student[k4] >= 10) {
//使抽取学生的总体序号对齐
if( count4 < 10)
System.out.println( "第0" + count4 +"位同学的学号是:202030" + classes[k4] + student[k4] + " 班级:" + classes[k4] + " 序号:" + student[k4]);
else
System.out.println( "第" + count4 +"位同学的学号是:202030" + classes[k4] + student[k4] + " 班级:" + classes[k4] + " 序号:" + student[k4]);
}
else {
//使抽取学生的总体序号对齐
if( count4 < 10)
System.out.println( "第0" + count4 +"位同学的学号是:202030" + classes[k4] + "0" + student[k4] + " 班级:" + classes[k4] + " 序号:0" + student[k4]);
else
System.out.println( "第" + count4 +"位同学的学号是:202030" + classes[k4] + "0" + student[k4] + " 班级:" + classes[k4] + " 序号:0" + student[k4]);
}
count4 ++;
}
}
System.out.println("4班抽中了 " + (count4 - count3) + "位同学");
}
}

运行检测:

代码自评:

Plus版本相比于原版增添了三个功能:

  1. 避免重复抽取同一位同学

    Plus版本新增了剔除相同班级、相同序号的数据的逻辑。

  2. 数据分块输出

    Plus版本可以将输出的数据以班级为依据分四块分别输出。

  3. 数据分块排序

    Plus版本可以将相同班级的学生以序号为依据,从小到大排序并输出。

    总体来说,Plus版本已经具备了一个随机点名小程序的基本功能,除了运行效率不高以外已经没有其他明显的缺点了。

总结(瞎扯两句):

Plus版编写完后的总体感受:太麻烦了,太长了。

只是多了三个功能,但Plus版本相比于原版代码长度增加了2倍,代码量是原版的足足三倍。

但是也没什么办法,只用最基本的流程控制和数组去写程序确实没办法过于简洁,这个问题只有学了面向对象的知识后才能轻松的解决。

总而言之,就是赶紧学面向对象吧,现在连新手村还没出呢!