c语言学生要求填写4个不同的专业编码,第一次志愿学校要求先按专业编码录取,如果专业人数招满后,再按学生成绩依次录取。第二次录取学校在成绩减5分的基础上,与第一次志愿的要求一样,这个有关代码举例
时间: 2024-02-05 20:03:57 浏览: 30
假设有如下的专业编码和对应的人数限制:
| 专业编码 | 人数限制 |
| -------- | -------- |
| 1001 | 50 |
| 1002 | 30 |
| 1003 | 20 |
| 1004 | 40 |
那么,可以先定义一个结构体 `Major` 来存储每个专业的信息:
```c
typedef struct {
int code; // 专业编码
int limit; // 人数限制
int count; // 已录取人数
} Major;
```
然后,定义一个数组 `majors` 来存储所有的专业信息:
```c
Major majors[] = {
{1001, 50, 0},
{1002, 30, 0},
{1003, 20, 0},
{1004, 40, 0},
};
```
接下来,可以用一个循环来让学生填写志愿:
```c
int choices[4]; // 保存 4 个专业编码
for (int i = 0; i < 4; i++) {
printf("请输入第 %d 个专业编码:", i+1);
scanf("%d", &choices[i]);
}
```
然后,按照第一次录取的要求,先按照专业编码录取,如果专业人数招满后,再按照学生成绩依次录取。假设有一个学生结构体 `Student`,其中包含学生的姓名和成绩:
```c
typedef struct {
char name[20];
int score;
} Student;
```
那么,可以定义一个数组 `students` 来存储所有的学生信息:
```c
Student students[] = {
{"张三", 80},
{"李四", 90},
{"王五", 85},
{"赵六", 75},
{"钱七", 95},
{"孙八", 70},
{"周九", 87},
{"吴十", 92},
{"郑一", 78},
{"冯二", 89},
};
int n = sizeof(students) / sizeof(Student); // 学生人数
```
接下来,可以按照第一次录取的要求,先按照专业编码录取,如果专业人数招满后,再按照学生成绩依次录取:
```c
for (int i = 0; i < 4; i++) {
int code = choices[i]; // 当前志愿的专业编码
for (int j = 0; j < n; j++) {
if (students[j].score < 60) { // 不及格的学生跳过
continue;
}
for (int k = 0; k < 4; k++) {
if (majors[k].code == code) {
if (majors[k].count < majors[k].limit) { // 专业人数未满,直接录取
printf("%s 被录取到专业 %d\n", students[j].name, code);
majors[k].count++;
break; // 跳出循环,继续录取下一个志愿
} else { // 专业人数已满,按照成绩顺序录取
for (int m = j; m < n; m++) {
if (students[m].score < 60) { // 不及格的学生跳过
continue;
}
if (majors[k].count < majors[k].limit) { // 仍未满员,录取该学生
printf("%s 被录取到专业 %d(按成绩顺序录取)\n", students[m].name, code);
majors[k].count++;
break; // 跳出循环,继续录取下一个志愿
}
}
break; // 跳出循环,继续录取下一个志愿
}
}
}
}
}
```
至此,第一次录取结束。接下来,按照第二次录取的要求,在成绩减 5 分的基础上,按照第一次录取的要求录取:
```c
for (int i = 0; i < 4; i++) {
int code = choices[i]; // 当前志愿的专业编码
for (int j = 0; j < n; j++) {
if (students[j].score - 5 < 60) { // 不及格的学生跳过
continue;
}
for (int k = 0; k < 4; k++) {
if (majors[k].code == code) {
if (majors[k].count < majors[k].limit) { // 专业人数未满,直接录取
printf("%s 被录取到专业 %d\n", students[j].name, code);
majors[k].count++;
break; // 跳出循环,继续录取下一个志愿
} else { // 专业人数已满,按照成绩顺序录取
for (int m = j; m < n; m++) {
if (students[m].score - 5 < 60) { // 不及格的学生跳过
continue;
}
if (majors[k].count < majors[k].limit) { // 仍未满员,录取该学生
printf("%s 被录取到专业 %d(按成绩顺序录取)\n", students[m].name, code);
majors[k].count++;
break; // 跳出循环,继续录取下一个志愿
}
}
break; // 跳出循环,继续录取下一个志愿
}
}
}
}
}
```
完整代码如下: