用c语言写一组代码,提供的功能有:学生的学号、姓名、各门课程成绩的录入、修改;计算每个学生的总分和平均分;按学号和姓名查询学生成绩;按学号或总分进行排序区,并给出名次;输出成绩总表;数据存盘和读取。
时间: 2024-03-20 09:43:18 浏览: 61
好的,以下是一个简单的实现。代码中使用了动态内存分配、文件读写等功能,请注意代码的复杂性和安全性。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct {
char id[10]; // 学号
char name[20]; // 姓名
float score[3]; // 各门课程成绩
float total_score; // 总分
float avg_score; // 平均分
} student;
// 定义全局变量
student *students; // 学生数组
int num_students = 0; // 学生人数
// 函数声明
void input_students(); // 录入学生信息
void modify_students(); // 修改学生信息
void calculate_score(); // 计算学生成绩
void search_by_id(); // 按学号查询学生信息
void search_by_name(); // 按姓名查询学生信息
void sort_by_id(); // 按学号排序
void sort_by_score(); // 按总分排序
void output_students(); // 输出成绩总表
void save_students(); // 数据存盘
void load_students(); // 数据读取
int main() {
// 加载数据
load_students();
// 显示菜单
int choice;
while (1) {
printf("1. 录入学生信息\n");
printf("2. 修改学生信息\n");
printf("3. 计算学生成绩\n");
printf("4. 按学号查询学生信息\n");
printf("5. 按姓名查询学生信息\n");
printf("6. 按学号排序\n");
printf("7. 按总分排序\n");
printf("8. 输出成绩总表\n");
printf("0. 退出程序\n");
printf("请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
input_students();
break;
case 2:
modify_students();
break;
case 3:
calculate_score();
break;
case 4:
search_by_id();
break;
case 5:
search_by_name();
break;
case 6:
sort_by_id();
break;
case 7:
sort_by_score();
break;
case 8:
output_students();
break;
case 0:
save_students(); // 保存数据
printf("程序已退出。\n");
return 0;
default:
printf("无效选项,请重新输入。\n");
break;
}
}
}
// 录入学生信息
void input_students() {
// 获取学生人数
int n;
printf("请输入学生人数:");
scanf("%d", &n);
// 分配内存
students = (student*) realloc(students, (num_students + n) * sizeof(student));
// 录入学生信息
for (int i = num_students; i < num_students + n; i++) {
student s;
printf("请输入第%d个学生的学号、姓名、各门课程成绩:", i + 1);
scanf("%s %s %f %f %f", s.id, s.name, &s.score[0], &s.score[1], &s.score[2]);
s.total_score = s.score[0] + s.score[1] + s.score[2];
s.avg_score = s.total_score / 3.0;
students[i] = s;
}
num_students += n;
printf("学生信息录入成功。\n");
}
// 修改学生信息
void modify_students() {
// 获取学生学号
char id[10];
printf("请输入要修改学生的学号:");
scanf("%s", id);
// 查找学生
int index = -1;
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
// 修改学生信息
if (index >= 0) {
student s;
printf("请输入新的学生信息(学号、姓名、各门课程成绩):");
scanf("%s %s %f %f %f", s.id, s.name, &s.score[0], &s.score[1], &s.score[2]);
s.total_score = s.score[0] + s.score[1] + s.score[2];
s.avg_score = s.total_score / 3.0;
students[index] = s;
printf("学生信息修改成功。\n");
} else {
printf("未找到该学生。\n");
}
}
// 计算学生成绩
void calculate_score() {
// 计算每个学生的总分和平均分
for (int i = 0; i < num_students; i++) {
students[i].total_score = students[i].score[0] + students[i].score[1] + students[i].score[2];
students[i].avg_score = students[i].total_score / 3.0;
}
printf("学生成绩计算完成。\n");
}
// 按学号查询学生信息
void search_by_id() {
// 获取学生学号
char id[10];
printf("请输入要查询学生的学号:");
scanf("%s", id);
// 查找学生
int index = -1;
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
// 输出学生信息
if (index >= 0) {
printf("学号:%s,姓名:%s,各门课程成绩:%f %f %f,总分:%f,平均分:%f\n",
students[index].id, students[index].name, students[index].score[0],
students[index].score[1], students[index].score[2], students[index].total_score,
students[index].avg_score);
} else {
printf("未找到该学生。\n");
}
}
// 按姓名查询学生信息
void search_by_name() {
// 获取学生姓名
char name[20];
printf("请输入要查询学生的姓名:");
scanf("%s", name);
// 查找学生
int count = 0;
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].name, name) == 0) {
printf("第%d个学生,学号:%s,姓名:%s,各门课程成绩:%f %f %f,总分:%f,平均分:%f\n",
i + 1, students[i].id, students[i].name, students[i].score[0],
students[i].score[1], students[i].score[2], students[i].total_score,
students[i].avg_score);
count++;
}
}
if (count == 0) {
printf("未找到该学生。\n");
}
}
// 按学号排序
void sort_by_id() {
// 冒泡排序
for (int i = 0; i < num_students - 1; i++) {
for (int j = 0; j < num_students - i - 1; j++) {
if (strcmp(students[j].id, students[j+1].id) > 0) {
student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
printf("学生信息按学号排序完成。\n");
}
// 按总分排序
void sort_by_score() {
// 冒泡排序
for (int i = 0; i < num_students - 1; i++) {
for (int j = 0; j < num_students - i - 1; j++) {
if (students[j].total_score < students[j+1].total_score) {
student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
// 输出排名信息
printf("学生成绩排名如下:\n");
for (int i = 0; i < num_students; i++) {
printf("第%d名,学号:%s,姓名:%s,总分:%f\n", i + 1, students[i].id,
students[i].name, students[i].total_score);
}
}
// 输出成绩总表
void output_students() {
// 输出表头
printf("学号\t姓名\t课程1\t课程2\t课程3\t总分\t平均分\n");
// 输出学生信息
for (int i = 0; i < num_students; i++) {
printf("%s\t%s\t%f\t%f\t%f\t%f\t%f\n", students[i].id, students[i].name,
students[i].score[0], students[i].score[1], students[i].score[2],
students[i].total_score, students[i].avg_score);
}
printf("学生信息输出完成。\n");
}
// 数据存盘
void save_students() {
FILE *fp = fopen("students.dat", "wb");
if (fp == NULL) {
printf("数据存储失败。\n");
return;
}
fwrite(&num_students, sizeof(int), 1, fp); // 存储学生人数
fwrite(students, sizeof(student), num_students, fp); // 存储学生信息
fclose(fp);
printf("数据存储成功。\n");
}
// 数据读取
void load_students() {
FILE *fp = fopen("students.dat", "rb");
if (fp == NULL) {
printf("未找到数据文件,新建空数据。\n");
return;
}
fread(&num_students, sizeof(int), 1, fp); // 读取学生人数
students = (student*) malloc(num_students * sizeof(student)); // 分配内存
fread(students, sizeof(student), num_students, fp); // 读取学生信息
fclose(fp);
printf("数据读取成功。\n");
}
```
阅读全文