学生学分管理系统
-
说明
需要在代码同一级目录下添加administrator.txt(存储管理员用户名与密码),point_table.txt(存储所有加分项名称与分值),student.txt(存储所有学生基本信息),credit.txt(存储所有加分信息:加分学生学号与加分项名称),存储方式如下所示:
-
administrator.txt
john john12345
jason jason875981
lilly lilly228751
-
point_table.txt
国际级竞赛一等奖 5
国际级竞赛二等奖 4
国际级竞赛三等奖 3
国家级竞赛一等奖 4
国家级竞赛二等奖 3
国家级竞赛三等奖 2
省部级竞赛一等奖 3
省部级竞赛二等奖 2
省部级竞赛三等奖 1
学校级竞赛一等奖 2
学校级竞赛二等奖 1
学校级竞赛三等奖 0.5
班长 1.5
学习委员 1
副班长 0.1
国家级三好学生 20
省级三好学生 10
市级三好学生 7
校级三好学生 5
年级三好学生 2
-
student.txt
张一 1 19 计科 20170001
张二 1 19 计科 20170002
张三 0 18 网安 20170003
张四 0 19 计科 20170004
张五 1 18 物联网 20170005
张六 0 18 网安 20170006
-
credit.txt
20170001 国际级竞赛一等奖
20170002 国际级竞赛二等奖
20170002 市级三好学生
20170002 学校级竞赛一等奖
20170003 省部级竞赛二等奖
20170004 省级三好学生
20170004 班长
20170005 国家级三好学生
20170005 省级三好学生
20170006 市级三好学生
-
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct admin{
char name[50];
char pass[50];
struct admin * next;
}admin;
typedef struct point{
char name[50];
float score;
struct point *next;
}point;
typedef struct record{
char name[50];
struct record * next;
}record;
typedef struct student{
char name[50];
int sex;
int age;
char major[50];
char number[50];
float score;
record * head;
struct student * next;
}student;
void read_admin(admin **head) {
char name[50],pass[50];
admin * cur;
FILE *fp = fopen("administrator.txt","r");
if(fp == NULL) {
*head = NULL;
printf(":: 文件administrator.txt 不存在!\n");
return;
}
while(fscanf(fp, "%s %s",name,pass) != EOF) {
if(*head == NULL) {
*head = (admin*)malloc(sizeof(admin));
strcpy((*head) -> name, name);
strcpy((*head) -> pass, pass);
(*head) -> next = NULL;
cur = *head;
}else{
cur -> next = (admin*)malloc(sizeof(admin));
strcpy(cur -> next -> name,name);
strcpy(cur -> next -> pass,pass);
cur -> next -> next = NULL;
cur = cur -> next;
}
}
}
void read_point(point **add) {
char name[50];
float score;
point * cur;
FILE *fp = fopen("point_table.txt","r");
if(fp == NULL) {
*add = NULL;
printf(":: 文件point_table.txt 不存在!\n");
return;
}
while(fscanf(fp, "%s %f",name, &score) != EOF) {
if(*add == NULL) {
*add = (point*)malloc(sizeof(point));
strcpy((*add) -> name, name);
(*add) -> score = score;
(*add) -> next = NULL;
cur = *add;
}else{
cur -> next = (point*)malloc(sizeof(point));
strcpy(cur -> next -> name,name);
cur -> next -> score = score;
cur -> next -> next = NULL;
cur = cur -> next;
}
}
}
void print_admin(admin *head) {
printf("用户名\t密码\n");
while(head != NULL) {
printf("%s\t%s\n",head -> name,head -> pass);
head= head->next;
}
}
int check_admin(admin *head, char name[],char pass[]) {
int exist = 0;
int pass_ok = 0;
while(head != NULL) {
if(strcmp(head -> name, name) == 0) {
exist = 1;
if(strcmp(head -> pass, pass) == 0) {
pass_ok = 1;
}
break;
}
head = head->next;
}
if(exist == 0) return -1;
else if(pass_ok == 0) return 0;
else return 1;
}
void read_student(student **head) {
FILE *fp = fopen("student.txt","r");
if(fp == NULL) {
*head = NULL;
printf(":: 文件student.txt 不存在!\n");
return;
}
char name[50];
char number[50];
char major[50];
int sex,age;
student *cur;
while(fscanf(fp, "%s %d %d %s %s",name, &sex, &age, major, number) != EOF) {
if(*head == NULL) {
*head = (student *) malloc(sizeof(student));
strcpy((*head) -> name,name);
strcpy((*head) -> major,major);
strcpy((*head) -> number,number);
(*head) -> sex = sex;
(*head) -> age = age;
(*head) -> next = NULL;
(*head) -> head = NULL;
(*head) -> score = 0;
cur = *head;
}else{
cur -> next = (student *)malloc(sizeof(student));
strcpy(cur -> next -> name, name);
strcpy(cur -> next -> major, major);
strcpy(cur -> next -> number, number);
cur -> next -> sex = sex;
cur -> next -> age = age;
cur -> next -> head = NULL;
cur -> next -> next = NULL;
cur -> next -> score = 0;
cur = cur -> next;
}
}
}
float get_add_score(point *add, char name[]) {
while(add != NULL) {
if(strcmp(add -> name, name) ==0) return add -> score;
add = add -> next;
}
return 0;
}
void print_student_point_list(student *stu, point *add) {
if(stu -> head == NULL) {
printf(":: 无加分项!\n");
}else{
record *cur = stu -> head;
printf("名称\t分值\n");
while(cur != NULL) {
printf("%s\t%.1f\n",cur -> name, get_add_score(add, cur -> name));
cur = cur->next;
}
printf("\n");
}
}
void print_student(student *stu, point *add){
printf("姓名\t学号\t\t性别\t年龄\t专业\t学分\n");
printf("%s\t%s\t%s\t%d\t%s\t%.1f\n", stu -> name, stu -> number, stu -> sex ==0?"男":"女", stu ->age,stu->major,stu->score);
printf("\n具体加分项信息:\n");
print_student_point_list(stu, add);
}
void print_all_student(student *stu){
printf("姓名\t学号\t\t性别\t年龄\t专业\t学分\n");
while(stu != NULL) {
printf("%s\t%s\t%s\t%d\t%s\t%.1f\n", stu -> name, stu -> number, stu -> sex ==0?"男":"女", stu ->age,stu->major,stu->score);
stu = stu -> next;
}
}
int print_score_list(point *add) {
printf("序号\t加分名称\t分值\n");
int index =0;
while(add!=NULL) {
printf("%d\t%s\t%.1f\n",index++,add->name,add->score);
add = add -> next;
}
printf("\n");
return index;
}
point * get_point(point *add,int index) {
int i = 0;
point *res=add;
while(i<index) {
res =res->next;
i++;
}
return res;
}
student * find_student(student *head, char number[]) {
while(head != NULL) {
if(strcmp(head -> number, number) == 0) break;
head = head -> next;
}
return head;
}
void add_credit(student * stu, point * add,char name[]) {
record *r = stu -> head, *cur = NULL;
if(r == NULL) {
stu -> head = (record *)malloc(sizeof(record));
strcpy(stu -> head -> name, name);
stu -> head -> next = NULL;
stu -> score += get_add_score(add, name);
cur = stu -> head;
}else{
while(r -> next !=NULL) {
r = r -> next;
}
r -> next = (record *)malloc(sizeof(record));
strcpy(r -> next -> name, name);
r -> next -> next = NULL;
stu -> score += get_add_score(add, name);
}
}
void read_credit(student *head, point * add) {
FILE *fp = fopen("credit.txt", "r");
if(fp == NULL) {
printf(":: 文件credict.txt 不存在!\n");
return;
}
char number[50];
char name[50];
while(fscanf(fp, "%s %s",number, name) != EOF) {
student *cur = find_student(head, number);
add_credit(cur, add, name);
}
}
void input(student **stu, point **add) {
printf("**************** 信息录入 ******************\n");
printf("************* 1. 从文件录入 *****************\n");
printf("************* 2. 从键盘录入 *****************\n");
printf("*******************************************\n");
int opt;
printf("-> 请输入您的选择: ");
scanf("%d",&opt);
if(opt == 1) {
read_point(add);
read_student(stu);
read_credit(*stu,*add);
print_all_student(*stu);
}else if(opt == 2) {
printf("************** 键盘信息录入 ********************\n");
printf("************ 1. 录入同学信息 *******************\n");
printf("************ 2. 录入学分信息 *******************\n");
printf("**********************************************\n");
printf("-> 请输入您的选择: ");
int opt1;
scanf("%d",&opt1);
if(opt1==1) {
student *tmp = (student *)malloc(sizeof(student));
printf("-> 请输入姓名: ");
scanf("%s",tmp->name);
printf("-> 请输入学号: ");
scanf("%s",tmp->number);
printf("-> 请输入性别(0代表男生,1代表女生): ");
scanf("%d",&tmp->sex);
printf("-> 请输入年龄: ");
scanf("%d",&tmp->age);
printf("-> 请输入专业: ");
scanf("%s",tmp->major);
tmp -> score = 0;
tmp -> head = NULL;
tmp -> next = NULL;
if(*stu == NULL) {
*stu = tmp;
}else{
student *cur = (*stu);
while(cur -> next != NULL) cur = cur -> next;
cur -> next = tmp;
}
printf(":: 添加成功!\n");
}else if(opt1 == 2) {
int n =print_score_list(*add);
char number[50];
printf("-> 请输入学号: ");
scanf("%s",number);
student *cur = find_student(*stu, number);
if(cur == NULL) {
printf(":: 无此学生!\n");
}else{
int index;
print_student(cur, *add);
printf("-> 请输入加分项ID: ");
scanf("%d",&index);
if(index>=0&&index<n){
point *res=get_point(*add,index);
add_credit(cur, *add, res->name);
printf(":: 添加成功!\n");
}else{
printf(":: 加分项ID应大于等于0小于%d\n",n);
}
}
}else{
printf("输入有误!\n");
}
}else{
printf(":: 输入有误!\n");
}
}
void search(student *stu, point *add) {
printf("********************* 信息查询 **********************\n");
printf("******************* 1. 个人信息查询 ******************\n");
printf("******************* 2. 专业信息查询 ******************\n");
printf("****************************************************\n");
int opt;
printf("-> 请输入您的选择: ");
scanf("%d",&opt);
if(opt == 1) {
char number[50];
printf("-> 请输入学号: ");
scanf("%s",number);
student *cur = find_student(stu, number);
if(cur == NULL) {
printf(":: 无此学生!\n");
}else{
print_student(cur,add);
}
} else if(opt == 2) {
char major[50];
printf("-> 请输入专业名称: ");
scanf("%s",major);
student s[10005];
int tot = 0,i,j;
student *head = stu;
while(head != NULL) {
if(strcmp(head -> major, major) == 0) {
s[++tot] = *head;
}
head = head -> next;
}
for(i=1;i<=tot;i++) {
for(j=i+1;j<=tot;j++) {
if(s[i].score < s[j].score) {
student tmp =s[i];
s[i] = s[j];
s[j] = tmp;
}
}
}
printf("姓名\t学号\t\t性别\t年龄\t专业\t学分\n");
for(i=1;i<=tot;i++) {
printf("%s\t%s\t%s\t%d\t%s\t%.1f\n", s[i].name, s[i].number, s[i].sex ==0?"男":"女", s[i].age, s[i].major, s[i].score);
}
}else{
printf(":: 输入有误!\n");
}
}
void modify(student *stu, point *add) {
printf("********************* 个人信息修改 **********************\n");
char number[50];
printf("-> 请输入待修改学生学号: ");
scanf("%s",number);
student *cur = find_student(stu, number);
if(cur == NULL) {
printf(":: 无此学生!\n");
}else{
int ok = 1;
printf("-> 确认修改 %s 同学信息?(0表示取消修改,1确认): ",cur->name);
scanf("%d",&ok);
if(ok==0) {
printf(":: 成功取消修改!\n");
}
else{
printf("-> 请重新输入姓名: ");
scanf("%s",cur->name);
printf("-> 请重新输入学号: ");
scanf("%s",cur->number);
printf("-> 请重新输入性别(0代表男生,1代表女生): ");
scanf("%d",&cur->sex);
printf("-> 请重新输入年龄: ");
scanf("%d",&cur->age);
printf("-> 请重新输入专业: ");
scanf("%s",cur->major);
printf(":: 修改成功!\n");
}
}
}
void dele(student **stu,point **add) {
printf("********************* 信息删除 **********************\n");
printf("******************* 1. 个人信息删除 ******************\n");
printf("******************* 2. 学分信息删除 ******************\n");
printf("****************************************************\n");
int opt,i,j;
printf("-> 请输入您的选择: ");
scanf("%d",&opt);
if(opt == 1) {
char number[50];
printf("-> 请输入学号: ");
scanf("%s",number);
student *cur = *stu;
if(cur == NULL) {
printf(":: 无此学生!\n");
}else{
if(strcmp(cur -> number, number) == 0) {
int ok = 1;
printf("-> 确认删除 %s 同学信息?(0表示取消删除,1确认): ",cur->name);
scanf("%d",&ok);
if(ok==0) {
printf(":: 成功取消删除!\n");
}
else{
*stu = cur->next;
printf(":: 删除成功!\n");
print_all_student(*stu);
free(cur);
}
return;
}
while(cur -> next !=NULL) {
if(strcmp(cur -> next -> number, number) == 0) break;
cur = cur -> next;
}
if(cur->next==NULL) {
printf(":: 无此学生!\n");
}else{
int ok = 1;
printf("-> 确认删除 %s 同学信息?(0表示取消删除,1确认): ",cur-> next -> name);
scanf("%d",&ok);
if(ok==0) {
printf(":: 成功取消删除!\n");
}
else{
cur -> next = cur -> next -> next;
printf(":: 删除成功!\n");
print_all_student(*stu);
}
}
}
} else if(opt == 2) {
char number[50];
printf("-> 请输入学号: ");
scanf("%s",number);
student *cur = find_student(*stu, number);
if(cur == NULL) {
printf(":: 无此学生!\n");
}else{
record *head = cur -> head;
print_student_point_list(cur, *add);
printf("-> 请输入奖项名称: ");
char name[50];
scanf("%s",name);
if(strcmp(head -> name, name) == 0) {
int ok = 1;
printf("-> 确认删除?(0表示取消删除,1确认): ");
scanf("%d",&ok);
if(ok==0) {
printf(":: 成功取消删除!\n");
}
else{
cur -> head = cur -> head -> next;
cur -> score -= get_add_score(*add, head -> name);
printf(":: 删除成功!\n");
print_student_point_list(cur, *add);
}
}
while(head -> next != NULL) {
if(strcmp(head -> next -> name,name) == 0) {
break;
}
}
if(head -> next == NULL) {
printf(":: 无此加分项!\n");
}else{
int ok = 1;
printf("-> 确认删除?(0表示取消删除,1确认): ");
scanf("%d",&ok);
if(ok==0) {
printf(":: 成功取消删除!\n");
}
else{
cur -> score -= get_add_score(*add, head -> next -> name);
head -> next = head -> next -> next;
printf(":: 删除成功!\n");
print_student_point_list(cur, *add);
}
}
}
}else{
printf(":: 输入有误!\n");
}
}
void save_data(student *stu) {
FILE *fp_stu = fopen("student.txt", "w");
FILE *fp_cre = fopen("credit.txt", "w");
while(stu != NULL) {
fprintf(fp_stu, "%s %d %d %s %s\n", stu -> name, stu -> sex ,stu -> age, stu -> major, stu -> number);
record *r = stu -> head;
while(r != NULL) {
fprintf(fp_cre, "%s %s\n", stu -> number, r -> name);
r = r -> next;
}
stu = stu -> next;
}
printf(":: 保存成功!\n");
fclose(fp_stu);
fclose(fp_cre);
}
int main() {
student *students = NULL;
point *add = NULL;
admin *admi = NULL;
char input_name[50];
char input_password[50];
read_admin(&admi);
if(admi != NULL) {
printf("-> 请输入用户名: ");
scanf("%s",input_name);
printf("-> 请输入密码: ");
scanf("%s",input_password);
int check = check_admin(admi,input_name,input_password);
if(check == -1) return printf(":: 用户名称不存在!\n"),0;
else if(check == 0) return printf(":: 密码错误!\n"), 0;
else printf(":: 登陆成功!\n");
}
while(1) {
printf("********************************* 大学学分管理系统 ***********************************\n");
printf("********************************* 1. 信息录入 ***********************************\n");
printf("********************************* 2. 信息查询 ***********************************\n");
printf("********************************* 3. 信息修改 ***********************************\n");
printf("********************************* 4. 信息删除 ***********************************\n");
printf("********************************* 5. 保存信息 ***********************************\n");
printf("********************************* 6. 安全退出 ***********************************\n");
printf("***********************************************************************************\n\n");
printf("-> 请输入您的选择: ");
int opt;
scanf("%d",&opt);
if(opt == 1) {
input(&students, &add);
getchar();
getchar();
}else if(opt == 2) {
search(students,add);
getchar();
getchar();
}else if(opt == 3) {
modify(students,add);
getchar();
getchar();
}else if(opt == 4) {
dele(&students,&add);
getchar();
getchar();
}else if(opt == 5){
save_data(students);
getchar();
getchar();
}else if(opt == 6){
save_data(students);
break;
}else{
printf(":: 输入有误!\n");
}
}
}