#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_STUDENTS 100
#define MAX_SUBJECTS 10
#define MAX_FILENAME 100
// 定义全局变量
struct student {
char num[20];
char name[20];
float scores[MAX_SUBJECTS];
float sum;
float avg;
};
struct student students[MAX_STUDENTS];
int n = 0; // 学生数目
int m = 0; // 科目数目
char subjects[MAX_SUBJECTS][20];
char filename[MAX_FILENAME] = "students.txt"; // 保存学生成绩数据的文件名
// 声明函数
void show_menu();
void add_record();
void list_record();
void del_record();
void modify_record();
void sort_by_sum(bool reverse);
void sort_by_num(bool reverse);
void search_record();
void write_to_file();
void read_from_file();
bool check_num(char *num);
// 主函数
int main()
{
// 初始化科目列表和学生数组
printf("请输入学生的数量: ");
scanf("%d", &n);
printf("请输入学科的数量: ");
scanf("%d", &m);
printf("请输入学科的名称:\n");
for (int i = 0; i < m; i++) {
scanf("%s", subjects[i]);
}
for(int j=0;j<n;j++){
printf("请输入学生学号: ");
scanf("%s", students[j].num);
printf("请输入学生姓名: ");
scanf("%s", students[j].name);
printf("请输入各科成绩:\n");
float sum = 0.0;
for (int i = 0; i < m; i++) {
printf("%s: ", subjects[i]);
scanf("%f", &students[j].scores[i]);
sum += students[j].scores[i];
}
students[j].sum = sum;
students[j].avg = sum / m;
printf("学生成绩录入成功!\n");
}
// 进入菜单循环
char choice[10];
while (true) {
show_menu();
printf("请输入您要进行的操作: ");
scanf("%s", choice);
if (strcmp(choice, "1") == 0) {
add_record();
} else if (strcmp(choice, "2") == 0) {
list_record();
} else if (strcmp(choice, "3") == 0) {
del_record();
} else if (strcmp(choice, "4") == 0) {
modify_record();
} else if (strcmp(choice, "5") == 0) {
search_record();
} else if (strcmp(choice, "6") == 0) {
sort_by_sum(true);
} else if (strcmp(choice, "7") == 0) {
sort_by_sum(false);
} else if (strcmp(choice, "8") == 0) {
sort_by_num(true);
} else if (strcmp(choice, "9") == 0) {
sort_by_num(false);
} else if (strcmp(choice, "W") == 0 || strcmp(choice, "w") == 0) {
write_to_file();
} else if (strcmp(choice, "R") == 0 || strcmp(choice, "r") == 0) {
read_from_file();
} else if (strcmp(choice, "0") == 0) {
break;
} else {
printf("输入的数据无效,请重新输入!\n");
}
printf("Press Enter to continue...\n");
getchar();
getchar();
}
return 0;
}
// 定义函数:显示菜单
void show_menu()
{
printf("\nManagement for Students' scores\n\n");
printf("1. Append record\n");
printf("2. List record\n");
printf("3. Delete record\n");
printf("4. Modify record\n");
printf("5. Search record\n");
printf("6. Sort in descending order by sum\n");
printf("7. Sort in ascending order by sum\n");
printf("8. Sort in descending order by num\n");
printf("9. Sort in ascending order by num\n");
printf("W. Write to a File\n");
printf("R. Read from a File\n");
printf("0.Exit\n");
}
// 定义函数:新增学生信息
void add_record()
{
while (true) {
printf("请输入学生学号: ");
scanf("%s", students[n].num);
if (check_num(students[n].num)) {
bool exists = false;
for (int i = 0; i < n; i++) {
if (strcmp(students[i].num, students[n].num) == 0) {
printf("该学号已存在,请重新输入!\n");
exists = true;
break;
}
}
if (!exists) {
break;
}
} else {
printf("输入的学号无效,请重新输入!\n");
}
}
printf("请输入学生姓名: ");
scanf("%s", students[n].name);
printf("请输入各科成绩:\n");
float sum = 0.0;
for (int i = 0; i < m; i++) {
printf("%s: ", subjects[i]);
scanf("%f", &students[n].scores[i]);
sum += students[n].scores[i];
}
students[n].sum = sum;
students[n].avg = sum / m;
printf("学生成绩录入成功!\n");
n++;
}
// 定义函数:显示学生信息
void list_record()
{
printf("学号\t姓名");
for (int i = 0; i < m; i++) {
printf("\t%s", subjects[i]);
}
printf("\t总分\t平均分\n");
for (int i = 0; i < n; i++) {
printf("%s\t%s", students[i].num, students[i].name);
for (int j = 0; j < m; j++) {
printf("\t%.1f", students[i].scores[j]);
}
printf("\t%.1f\t%.1f\n", students[i].sum, students[i].avg);
}
}
// 定义函数:删除学生信息
void del_record()
{
char num[20];
printf("请输入要删除的学生的学号: ");
scanf("%s", num);
bool found = false;
for (int i = 0; i < n; i++) {
if (strcmp(students[i].num, num) == 0) {
found = true;
for (int j = i; j < n - 1; j++) {
students[j] = students[j+1];
}
n--;
printf("学生成绩已删除!\n");
break;
}
}
if (!found) {
printf("该生信息不存在!\n");
}
}
// 定义函数:修改学生信息
void modify_record()
{
char num[20];
printf("请输入要修改的学生的学号: ");
scanf("%s", num);
bool found = false;
for (int i = 0; i < n; i++) {
if (strcmp(students[i].num, num) == 0) {
found = true;
printf("请输入新的学生姓名: ");
scanf("%s", students[i].name);
printf("请输入新的各科成绩:\n");
float sum = 0.0;
for (int j = 0; j < m; j++) {
printf("%s: ", subjects[j]);
scanf("%f", &students[i].scores[j]);
sum += students[i].scores[j];
}
students[i].sum = sum;
students[i].avg = sum / m;
printf("信息修改成功.\n");
break;
}
}
if (!found) {
printf("该生信息不存在.\n");
}
}
// 定义函数:按总分排序(为了减少函数量,将正序和倒序在一个函数中实现)
void sort_by_sum(bool reverse)
{
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if ((students[j].sum < students[j+1].sum && !reverse) || (students[j].sum > students[j+1].sum && reverse)) {
struct student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
printf("已成功按总分排列!\n");
}
// 定义函数:按学号排序(为了减少函数量,将正序和倒序在一个函数中实现)
void sort_by_num(bool reverse)
{
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if ((strcmp(students[j].num, students[j+1].num) > 0 && !reverse) || (strcmp(students[j].num, students[j+1].num) < 0 && reverse)) {
struct student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
printf("已成功按学号排列!\n");
}
// 定义函数:查询学生信息
void search_record()
{
char num[20];
printf("请输入要查询的学生学号: ");
scanf("%s", num);
bool found = false;
for (int i = 0; i < n; i++) {
if (strcmp(students[i].num, num) == 0) {
found = true;
printf("学号\t姓名");
for (int j = 0; j < m; j++) {
printf("\t%s", subjects[j]);
}
printf("\t总分\t平均分\n");
printf("%s\t%s", students[i].num, students[i].name);
for (int j = 0; j < m; j++) {
printf("\t%.1f", students[i].scores[j]);
}
printf("\t%.1f\t%.1f\n", students[i].sum, students[i].avg);
break;
}
}
if (!found) {
printf("该生信息不存在.\n");
}
}
// 定义函数:将学生成绩数据保存到文件中
void write_to_file()
{
FILE *fp = fopen(filename, "w");
if (fp == NULL) {
printf("文件打开失败.\n");
return;
}
fprintf(fp, "%d %d\n", n, m);
for (int i = 0; i < m; i++) {
fprintf(fp, "%s\n", subjects[i]);
}
for (int i = 0; i < n; i++) {
fprintf(fp, "%s %s", students[i].num, students[i].name);
for (int j = 0; j < m; j++) {
fprintf(fp, " %.1f", students[i].scores[j]);
}
fprintf(fp, " %.1f %.1f\n", students[i].sum, students[i].avg);
}
fclose(fp);
printf("信息已被成功写入文件!\n");
}
// 定义函数:从文件中读取学生成绩数据
void read_from_file()
{
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fscanf(fp, "%d %d", &n, &m);
for (int i = 0; i < m; i++) {
fscanf(fp, "%s", subjects[i]);
}
for (int i = 0; i < n; i++) {
fscanf(fp, "%s %s", students[i].num, students[i].name);
float sum = 0.0;
for (int j = 0; j < m; j++) {
fscanf(fp, "%f", &students[i].scores[j]);
sum += students[i].scores[j];
}
students[i].sum = sum;
students[i].avg = sum / m;
}
fclose(fp);
printf("成功从文件中读取信息!\n");
}
// 定义函数:检查学生学号是否合法
bool check_num(char *num)
{
if (strlen(num) == 0 || strlen(num) > 20) {
return false;
}
for (int i = 0; i < strlen(num); i++) {
if (!isdigit(num[i]) && !isalpha(num[i])) {
return false;
}
}
return true;
}
学生成绩管理系统
于 2023-06-05 20:38:35 首次发布