C语言编程实现某班级共有50名学生,本学期共有5门课程,分别是高等数学、大学物理、计算机基础、C语言程序设计和马克思主义原理。请定义结构体存储学生的姓名、性别、学号和5门课程的期末考试成绩。 要求: 1)学号格式为220101~220150,有序生成;姓名和性别请在主程序中给定。 2)请利用随机数生成5门课的期末考试成绩;各门课的成绩最大值不能超过100分,最小值高于40分。 3)查找功能1:用二分(折半)查找算法实现根据学号查找该学生的各个科目成绩,输出该学生的姓名、学号、各科目成绩以及平均成绩。 4)查找功能2:用线性查找算法实现查找各个科目大于90分和小于60分的成绩,并输出相应的学生的姓名、学号和该科目成绩。 5)排序功能:根据总成绩对学生成绩进行从高到低排序,并依次输出姓名、学号、各科目成绩以及总成绩。请指明用什么排序方法。
时间: 2024-04-02 21:36:21 浏览: 106
好的,我会根据您的问题进行回答。以下是 C 语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define STUDENT_NUM 50
#define COURSE_NUM 5
#define START_NUM 220101
#define END_NUM 220150
#define SCORE_MAX 100
#define SCORE_MIN 40
// 定义学生结构体
struct student {
char name[20]; // 姓名
char sex; // 性别
int id; // 学号
int scores[COURSE_NUM]; // 5门课程的成绩
float total_score; // 总成绩
};
// 定义生成学生信息的函数
void generate_student_info(struct student students[]) {
// 定义变量
int i, j, id;
char name[20], sex;
// 初始化随机数种子
srand((unsigned) time(NULL));
// 循环生成学生信息
for (i = 0; i < STUDENT_NUM; i++) {
// 生成学号
id = START_NUM + i;
// 生成姓名和性别
printf("请输入第 %d 个学生的姓名和性别(例如:张三 M):", i+1);
scanf("%s %c", name, &sex);
strcpy(students[i].name, name);
students[i].sex = sex;
// 生成5门课程的成绩
for (j = 0; j < COURSE_NUM; j++) {
students[i].scores[j] = rand() % (SCORE_MAX - SCORE_MIN + 1) + SCORE_MIN;
}
// 初始化总成绩
students[i].total_score = 0;
// 计算总成绩
for (j = 0; j < COURSE_NUM; j++) {
students[i].total_score += students[i].scores[j];
}
}
}
// 定义二分查找函数
int binary_search(struct student students[], int id) {
// 定义变量
int left = 0, right = STUDENT_NUM - 1, mid;
// 循环查找
while (left <= right) {
mid = (left + right) / 2;
if (students[mid].id == id) {
return mid;
} else if (students[mid].id < id) {
left = mid + 1;
} else {
right = mid - 1;
}
}
// 没有找到
return -1;
}
// 定义线性查找函数
void linear_search(struct student students[], int flag) {
// 定义变量
int i, j;
// 循环查找
for (i = 0; i < STUDENT_NUM; i++) {
for (j = 0; j < COURSE_NUM; j++) {
if ((flag == 1 && students[i].scores[j] > 90) ||
(flag == 2 && students[i].scores[j] < 60)) {
printf("%s %d %d\n", students[i].name, students[i].id, students[i].scores[j]);
break;
}
}
}
}
// 定义排序函数
void sort(struct student students[]) {
// 定义变量
int i, j;
struct student temp;
// 冒泡排序
for (i = 0; i < STUDENT_NUM-1; i++) {
for (j = 0; j < STUDENT_NUM-1-i; j++) {
if (students[j].total_score < students[j+1].total_score) {
temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
}
// 定义主函数
int main() {
// 定义变量
int i, id, index, flag;
struct student students[STUDENT_NUM];
// 生成学生信息
generate_student_info(students);
// 根据学号查找学生信息
printf("请输入要查找的学生学号:");
scanf("%d", &id);
index = binary_search(students, id);
if (index == -1) {
printf("没有找到该学生!\n");
} else {
printf("姓名:%s\n", students[index].name);
printf("学号:%d\n", students[index].id);
printf("成绩:");
for (i = 0; i < COURSE_NUM; i++) {
printf("%d ", students[index].scores[i]);
}
printf("\n");
printf("平均成绩:%f\n", students[index].total_score / COURSE_NUM);
}
// 查找成绩大于90或小于60的学生信息
printf("请输入要查找的成绩类型(1-大于90分,2-小于60分):");
scanf("%d", &flag);
printf("学生信息:\n");
linear_search(students, flag);
// 根据总成绩排序并输出学生信息
sort(students);
printf("学生排名:\n");
for (i = 0; i < STUDENT_NUM; i++) {
printf("%s %d ", students[i].name, students[i].id);
printf("%d %d %d %d %d ", students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3], students[i].scores[4]);
printf("%f\n", students[i].total_score);
}
return 0;
}
```
这里使用了二分查找算法来查找学号,使用了线性查找算法来查找成绩大于90或小于60的学生信息,使用了冒泡排序算法来根据总成绩排序。
阅读全文