c语言基于顺序表的学生成绩管理系统,一共有三个科目,每个科目学生成绩包含平时成绩和期末成绩,一共有六个功能,创建学生成绩记录,输入课程名称,和平时成绩占比放在一个全局变量中 ,保存数据到文件时 先保存课程名称和平时成绩占比再保存 那些成绩,读取文件数据时先把课程名称和平时成绩占比 读出并赋值给相应的全局变量,再读出那些成绩
时间: 2023-06-20 15:07:49 浏览: 102
今天给大家分享一个C语言环境下开发的学生成绩管理系统 这个系统原理很简单:成绩的录入,输出,修改,排序,删除等等
下面是基于顺序表的学生成绩管理系统的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SUBJECTS 3 // 最大科目数量
#define MAX_STUDENTS 50 // 最大学生数量
#define MAX_NAME_LEN 20 // 最大姓名长度
// 学生信息结构体
typedef struct {
char name[MAX_NAME_LEN]; // 学生姓名
float scores[MAX_SUBJECTS][2]; // 学生成绩(包括平时成绩和期末成绩)
} student;
// 全局变量
char subjects[MAX_SUBJECTS][MAX_NAME_LEN]; // 科目名称数组
float weights[MAX_SUBJECTS]; // 科目平时成绩占比数组
int student_count = 0; // 学生数量
student students[MAX_STUDENTS]; // 学生信息数组
// 函数声明
void create_student_record();
void input_subject_name();
void input_weights();
void input_scores();
void save_data();
void load_data();
void print_scores();
int main() {
int choice;
do {
printf("1. 创建学生成绩记录\n");
printf("2. 输入课程名称\n");
printf("3. 输入平时成绩占比\n");
printf("4. 输入学生成绩\n");
printf("5. 保存数据到文件\n");
printf("6. 从文件读取数据\n");
printf("0. 退出程序\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
create_student_record();
break;
case 2:
input_subject_name();
break;
case 3:
input_weights();
break;
case 4:
input_scores();
break;
case 5:
save_data();
break;
case 6:
load_data();
break;
case 0:
printf("程序已退出。\n");
break;
default:
printf("无效的操作。\n");
break;
}
} while (choice != 0);
return 0;
}
// 创建学生成绩记录
void create_student_record() {
if (student_count < MAX_STUDENTS) {
printf("请输入学生姓名:");
scanf("%s", students[student_count].name);
printf("已创建学生 %s 的记录。\n", students[student_count].name);
student_count++;
} else {
printf("学生数量已达到最大值,无法继续创建。\n");
}
}
// 输入课程名称
void input_subject_name() {
for (int i = 0; i < MAX_SUBJECTS; i++) {
printf("请输入第 %d 个科目名称:", i + 1);
scanf("%s", subjects[i]);
}
}
// 输入平时成绩占比
void input_weights() {
for (int i = 0; i < MAX_SUBJECTS; i++) {
printf("请输入科目 %s 的平时成绩占比(百分比):", subjects[i]);
scanf("%f", &weights[i]);
}
}
// 输入学生成绩
void input_scores() {
char name[MAX_NAME_LEN];
printf("请输入学生姓名:");
scanf("%s", name);
for (int i = 0; i < student_count; i++) {
if (strcmp(name, students[i].name) == 0) {
printf("请输入学生 %s 的成绩:\n", name);
for (int j = 0; j < MAX_SUBJECTS; j++) {
printf("%s(百分比 %.2f):平时成绩、期末成绩(用空格分隔):", subjects[j], weights[j]);
scanf("%f %f", &students[i].scores[j][0], &students[i].scores[j][1]);
}
printf("已输入学生 %s 的成绩。\n", name);
return;
}
}
printf("找不到学生 %s 的记录。\n", name);
}
// 保存数据到文件
void save_data() {
FILE *fp = fopen("scores.dat", "wb");
if (fp != NULL) {
// 先保存科目名称和平时成绩占比
fwrite(subjects, sizeof(subjects), 1, fp);
fwrite(weights, sizeof(weights), 1, fp);
// 再保存学生记录
fwrite(&student_count, sizeof(student_count), 1, fp);
fwrite(students, sizeof(student), student_count, fp);
fclose(fp);
printf("数据已保存到文件 scores.dat 中。\n");
} else {
printf("无法打开文件 scores.dat 进行保存。\n");
}
}
// 从文件读取数据
void load_data() {
FILE *fp = fopen("scores.dat", "rb");
if (fp != NULL) {
// 先读取科目名称和平时成绩占比
fread(subjects, sizeof(subjects), 1, fp);
fread(weights, sizeof(weights), 1, fp);
// 再读取学生记录
fread(&student_count, sizeof(student_count), 1, fp);
fread(students, sizeof(student), student_count, fp);
fclose(fp);
printf("已从文件 scores.dat 中读取数据。\n");
} else {
printf("无法打开文件 scores.dat 进行读取。\n");
}
}
// 输出学生成绩
void print_scores() {
for (int i = 0; i < student_count; i++) {
printf("%s:\n", students[i].name);
for (int j = 0; j < MAX_SUBJECTS; j++) {
float total_score = students[i].scores[j][0] * weights[j] + students[i].scores[j][1] * (1 - weights[j]);
printf("%s:%.2f\n", subjects[j], total_score);
}
}
}
```
这个程序中,我们使用了全局变量 `subjects` 和 `weights` 来保存科目名称和平时成绩占比。当用户输入学生成绩时,程序会根据学生姓名在 `students` 数组中查找对应的记录,并在循环中依次输入每个科目的成绩。保存数据到文件时,先保存科目名称和平时成绩占比,再保存学生记录。读取数据时,先读取科目名称和平时成绩占比,再读取学生记录。输出学生成绩时,我们根据保存的成绩和平时成绩占比计算每个科目的总成绩,并输出给用户。
阅读全文