编程实现: 某班级共有50名学生,本学期共有5门课程,分别是高等数学、大学物理、计算机基础、C语言程序设计和马克思主义原理。请定义结构体存储学生的姓名、性别、学号和5门课程的期末考试成绩。 要求: 1)学号格式为220101~220150,有序生成;姓名和性别请在主程序中给定。 2)请利用随机数生成5门课的期末考试成绩;各门课的成绩最大值不能超过100分,最小值高于40分。 3)查找功能1:用二分(折半)查找算法实现根据学号查找该学生的各个科目成绩,输出该学生的姓名、学号、各科目成绩以及平均成绩。 4)查找功能2:用线性查找算法实现查找各个科目大于90分和小于60分的成绩,并输出相应的学生的姓名、学号和该科目成绩。 5)排序功能:根据总成绩对学生成绩进行从高到低排序,并依次输出姓名、学号、各科目成绩以及总成绩。请指明用什么排序方法。
时间: 2024-04-03 21:36:18 浏览: 391
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define COURSE_NUM 5 // 课程数量
#define STUDENT_NUM 50 // 学生数量
typedef struct {
char name[20]; // 学生姓名
char sex[5]; // 学生性别
int id; // 学生学号
int scores[COURSE_NUM]; // 学生5门课程的期末考试成绩
int total_score; // 学生总成绩
} Student;
// 生成学号
int generate_id() {
static int id = 220100; // 初始学号
return id++;
}
// 生成随机分数
int generate_score() {
return rand() % 61 + 40; // 分数范围为40~100分
}
// 初始化学生信息
void init_student(Student* stu) {
strcpy(stu->name, "张三"); // 此处姓名和性别均为固定值,可以根据需要修改
strcpy(stu->sex, "男");
stu->id = generate_id();
for (int i = 0; i < COURSE_NUM; i++) {
stu->scores[i] = generate_score();
stu->total_score += stu->scores[i];
}
}
// 输出学生信息
void print_student(const Student* stu) {
printf("姓名:%s,学号:%d,性别:%s,数学:%d,物理:%d,计算机基础:%d,C语言:%d,马原:%d,总成绩:%d\n",
stu->name, stu->id, stu->sex, stu->scores[0], stu->scores[1], stu->scores[2], stu->scores[3], stu->scores[4], stu->total_score);
}
// 二分查找
int binary_search(const Student* stu_arr, int len, int id) {
int left = 0;
int right = len - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (stu_arr[mid].id == id) {
return mid;
} else if (stu_arr[mid].id < id) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 没有找到
}
// 根据学号查找学生
void search_by_id(const Student* stu_arr, int len) {
int id;
printf("请输入学号:");
scanf("%d", &id);
int index = binary_search(stu_arr, len, id);
if (index == -1) {
printf("没有找到该学生!\n");
} else {
print_student(&stu_arr[index]);
}
}
// 线性查找
void linear_search(const Student* stu_arr, int len) {
printf("大于90分的学生:\n");
for (int i = 0; i < len; i++) {
for (int j = 0; j < COURSE_NUM; j++) {
if (stu_arr[i].scores[j] > 90) {
printf("姓名:%s,学号:%d,科目:%d,成绩:%d\n",
stu_arr[i].name, stu_arr[i].id, j + 1, stu_arr[i].scores[j]);
}
}
}
printf("小于60分的学生:\n");
for (int i = 0; i < len; i++) {
for (int j = 0; j < COURSE_NUM; j++) {
if (stu_arr[i].scores[j] < 60) {
printf("姓名:%s,学号:%d,科目:%d,成绩:%d\n",
stu_arr[i].name, stu_arr[i].id, j + 1, stu_arr[i].scores[j]);
}
}
}
}
// 总成绩比较函数(用于排序)
int cmp(const void* a, const void* b) {
const Student* sa = (const Student*)a;
const Student* sb = (const Student*)b;
return sb->total_score - sa->total_score;
}
// 根据总成绩排序
void sort_by_total_score(Student* stu_arr, int len) {
qsort(stu_arr, len, sizeof(Student), cmp);
printf("按总成绩排序:\n");
for (int i = 0; i < len; i++) {
print_student(&stu_arr[i]);
}
}
int main() {
srand((unsigned int)time(NULL)); // 初始化随机数种子
// 初始化学生信息
Student stu_arr[STUDENT_NUM];
for (int i = 0; i < STUDENT_NUM; i++) {
init_student(&stu_arr[i]);
}
// 查找功能1:二分查找
search_by_id(stu_arr, STUDENT_NUM);
// 查找功能2:线性查找
linear_search(stu_arr, STUDENT_NUM);
// 排序功能:根据总成绩排序(使用快速排序)
sort_by_total_score(stu_arr, STUDENT_NUM);
return 0;
}
```
本程序使用了二分查找和快速排序算法。其中,二分查找用于根据学号查找学生信息,快速排序用于根据总成绩排序学生信息。在初始化学生信息时,学号会按照有序的方式生成。在生成随机数时,为了保证各门课的成绩最小值高于40分,所以使用了`rand() % 61 + 40`的方式生成40~100之间的随机数。
阅读全文