编程实现: 某班级共有50名学生,本学期共有5门课程,分别是高等数学、大学物理、计算机基础、C语言程序设计和马克思主义原理。请定义结构体存储学生的姓名、性别、学号和5门课程的期末考试成绩。 要求: 1)学号格式为220101~220150,有序生成;姓名和性别请在主程序中给定。 2)请利用随机数生成5门课的期末考试成绩;各门课的成绩最大值不能超过100分,最小值高于40分。 3)查找功能1:用二分(折半)查找算法实现根据学号查找该学生的各个科目成绩,输出该学生的姓名、学号、各科目成绩以及平均成绩。 4)查找功能2:用线性查找算法实现查找各个科目大于90分和小于60分的成绩,并输出相应的学生的姓名、学号和该科目成绩。 5)排序功能:根据总成绩对学生成绩进行从高到低排序,并依次输出姓名、学号、各科目成绩以及总成绩。请指明用什么排序方法。
时间: 2024-03-31 10:35:50 浏览: 27
以下是C语言代码实现,其中二分查找采用递归方式实现,排序采用冒泡排序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_STUDENT_NUM 50
#define COURSE_NUM 5
// 学生信息结构体
struct student {
char name[20]; // 姓名
char gender; // 性别
int id; // 学号
int score[COURSE_NUM]; // 5门课的成绩
int total_score; // 总成绩
};
// 生成指定范围内的随机整数
int rand_int(int lower, int upper) {
return rand() % (upper - lower + 1) + lower;
}
// 生成学生学号
int generate_id(int index) {
return 220100 + index + 1;
}
// 初始化学生信息
void init_student(struct student *s, int index) {
strcpy(s->name, index % 2 == 0 ? "张三" : "李四");
s->gender = index % 2 == 0 ? 'M' : 'F';
s->id = generate_id(index);
for (int i = 0; i < COURSE_NUM; i++) {
s->score[i] = rand_int(50, 100);
}
s->total_score = 0;
for (int i = 0; i < COURSE_NUM; i++) {
s->total_score += s->score[i];
}
}
// 输出学生信息
void print_student(const struct student *s) {
printf("%-10s%-5c%-10d", s->name, s->gender, s->id);
for (int i = 0; i < COURSE_NUM; i++) {
printf("%-5d", s->score[i]);
}
printf("%-5d\n", s->total_score);
}
// 二分查找指定学号的学生
int binary_search(const struct student *students, int left, int right, int id) {
if (left > right) {
return -1; // 未找到
}
int mid = (left + right) / 2;
if (students[mid].id == id) {
return mid; // 找到了
}
else if (students[mid].id < id) {
return binary_search(students, mid + 1, right, id); // 在右半部分查找
}
else {
return binary_search(students, left, mid - 1, id); // 在左半部分查找
}
}
// 线性查找指定分数区间的学生
void linear_search(const struct student *students, int n, int lower, int upper) {
printf("大于90分或小于60分的学生成绩:\n");
printf("%-10s%-5s%-10s%-5s%-5s%-5s%-5s%-5s\n", "Name", "Sex", "ID", "Math", "Phys", "C", "Lang", "Total");
for (int i = 0; i < n; i++) {
for (int j = 0; j < COURSE_NUM; j++) {
if (students[i].score[j] < lower || students[i].score[j] > upper) {
print_student(&students[i]);
break;
}
}
}
}
// 冒泡排序
void bubble_sort(struct student *students, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (students[j].total_score < students[j + 1].total_score) {
struct student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
int main() {
srand(time(NULL));
// 初始化学生信息
struct student students[MAX_STUDENT_NUM];
for (int i = 0; i < MAX_STUDENT_NUM; i++) {
init_student(&students[i], i);
}
// 二分查找
int id_to_search = 220112;
int index = binary_search(students, 0, MAX_STUDENT_NUM - 1, id_to_search);
if (index < 0) {
printf("未找到学号为%d的学生\n", id_to_search);
}
else {
printf("学号为%d的学生信息如下:\n", id_to_search);
printf("%-10s%-5s%-10s%-5s%-5s%-5s%-5s%-5s\n", "Name", "Sex", "ID", "Math", "Phys", "C", "Lang", "Total");
print_student(&students[index]);
}
// 线性查找
linear_search(students, MAX_STUDENT_NUM, 90, 60);
// 排序
bubble_sort(students, MAX_STUDENT_NUM);
printf("按总成绩从高到低排序后的学生信息如下:\n");
printf("%-10s%-5s%-10s%-5s%-5s%-5s%-5s%-5s\n", "Name", "Sex", "ID", "Math", "Phys", "C", "Lang", "Total");
for (int i = 0; i < MAX_STUDENT_NUM; i++) {
print_student(&students[i]);
}
return 0;
}
```
注:代码中的二分查找和线性查找均为查找第一个符合条件的元素。如果要查找所有符合条件的元素,则需要在查找到符合条件的元素后继续向前/后查找。