使用C语言设计一个简单的学生成绩管理系统。设有学生成绩文件student.txt,每位学生成绩信息包含学号(num)、姓名(name)、性别(sex)、出生日期(birthday,包括年、月、日,分别表示为year,month,day)、3门功课的成绩(高数、C语言、大学物理)、总分和平均分。设计程序,要求从文件student.txt中读出学生成绩表,之后参对成绩表进行如下操作:(3)添加。可添加一条或多条记录。 (4)排序。分为两个方面,按学号递增排序和按总分递减排序。
时间: 2023-07-10 16:19:51 浏览: 209
以下是一个简单的学生成绩管理系统的C语言程序,它可以从student.txt文件中读取学生成绩表,并支持添加记录和按学号或总分排序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_STUDENTS 100 // 最大学生数量
#define MAX_NAME_LENGTH 20 // 最大姓名长度
#define FILENAME "student.txt" // 学生成绩文件名
// 定义学生结构体
typedef struct {
int num; // 学号
char name[MAX_NAME_LENGTH]; // 姓名
char sex; // 性别
int year, month, day; // 出生日期
double score[3]; // 三门功课成绩
double total_score; // 总分
double avg_score; // 平均分
} Student;
// 学生数组和数量
Student students[MAX_STUDENTS];
int num_students = 0;
// 函数声明
void read_students();
void print_students();
void add_student();
void sort_by_num();
void sort_by_total_score();
// 主函数
int main() {
// 读取学生成绩表
read_students();
// 打印学生成绩表
print_students();
// 添加记录
add_student();
// 按学号排序
sort_by_num();
print_students();
// 按总分排序
sort_by_total_score();
print_students();
return 0;
}
// 从文件中读取学生成绩表
void read_students() {
FILE *fp;
fp = fopen(FILENAME, "r");
if (fp == NULL) {
printf("无法打开文件\n");
exit(1);
}
while (!feof(fp)) {
Student student;
fscanf(fp, "%d %s %c %d %d %d %lf %lf %lf",
&student.num, student.name, &student.sex,
&student.year, &student.month, &student.day,
&student.score[0], &student.score[1], &student.score[2]);
student.total_score = student.score[0] + student.score[1] + student.score[2];
student.avg_score = student.total_score / 3.0;
students[num_students++] = student;
}
fclose(fp);
}
// 打印学生成绩表
void print_students() {
printf("学号\t姓名\t性别\t出生日期\t\t高数\tC语言\t大学物理\t总分\t平均分\n");
for (int i = 0; i < num_students; i++) {
printf("%d\t%s\t%c\t%d-%d-%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",
students[i].num, students[i].name, students[i].sex,
students[i].year, students[i].month, students[i].day,
students[i].score[0], students[i].score[1], students[i].score[2],
students[i].total_score, students[i].avg_score);
}
}
// 添加学生记录
void add_student() {
printf("请输入要添加的学生数量:");
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的信息:\n", i+1);
Student student;
printf("学号:");
scanf("%d", &student.num);
printf("姓名:");
scanf("%s", student.name);
printf("性别:");
scanf(" %c", &student.sex);
printf("出生日期(格式为yyyy-mm-dd):");
scanf("%d-%d-%d", &student.year, &student.month, &student.day);
printf("高数成绩:");
scanf("%lf", &student.score[0]);
printf("C语言成绩:");
scanf("%lf", &student.score[1]);
printf("大学物理成绩:");
scanf("%lf", &student.score[2]);
student.total_score = student.score[0] + student.score[1] + student.score[2];
student.avg_score = student.total_score / 3.0;
students[num_students++] = student;
}
}
// 按学号排序
void sort_by_num() {
for (int i = 0; i < num_students-1; i++) {
for (int j = 0; j < num_students-i-1; j++) {
if (students[j].num > students[j+1].num) {
Student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
}
// 按总分排序
void sort_by_total_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;
}
}
}
}
```
在这个程序中,我们首先定义了一个名为Student的结构体,它包含了学生的所有信息。然后,我们定义了一个数组students和一个变量num_students,用于存储所有学生的信息和学生数量。
read_students函数用于从student.txt文件中读取学生成绩表,并将每个学生的信息存储在students数组中。print_students函数用于打印学生成绩表。
add_student函数允许用户添加一个或多个学生记录。它要求用户输入学生的所有信息,并将新的学生记录添加到students数组中。
sort_by_num函数和sort_by_total_score函数分别用于按学号和总分排序学生成绩表。这里我们使用了冒泡排序算法,但您也可以使用其他排序算法。
最后,我们在主函数中按顺序调用这些函数,并打印排序后的学生成绩表。
阅读全文