随缘更新数据结构作业-1C语言实现完整的学生程序管理系统/三个子系统
Posted skywalker767
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随缘更新数据结构作业-1C语言实现完整的学生程序管理系统/三个子系统相关的知识,希望对你有一定的参考价值。
老师让实现一个能有三个子系统的程序管理系统,决定记录下来过程,同时代码会同步更新在博客中,本篇代码转载请标明出处。
最后更新:2021/9/7 11:30
本篇还有许多功能未写好
目录
前言
先看要求,要有:学生系统,老师系统,管理员系统。这个跟以往的不同,传统的我觉得是从老师视角看,同时老师也有管理员权限,对学生的成绩,信息进行操作。现在类似于把权利细分,我们不妨先思考下,各个部分的职能应该是什么?
学生:
- 注册/登陆账号
- 修改自己的个人信息
- 查看自己的成绩(但是不能查看自己的排名)
老师
- 注册/登陆账号
- 修改自己的个人信息
- 修改学生的信息
- 可以对学生信息进行一些经典操作。
管理员
- 可以登陆账号,账号只能从后台文件中添加。
- 可以把个人账号设置为老师账号 (下面会有解释)
- 可以查看/修改所有账号信息
本篇代码的按照 C C C语言的逻辑/操作写,按照 C C C++ 11 11 11编译。
注:本人能力有限,权利可以更加细分,如:老师可以细分到是哪个班的老师,管理员可以拥有所有权限,而且可以写成可以分配给一些老师特殊的权限,但因篇幅有限,码力不足,同时也为了简介,笔者就不多写了 (懒就直说) 。
正篇
注册/登陆账号的实现
懒得写OVQ,改天吧,阿巴阿巴
源代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
const int NAME_LEN = 50;//名字的长度
const int PASSWORD_LEN = 100;//密码长度
const int ACCOUNT_LEN = 100;//账号长度
const int USER_MAXN = 5000;//账号个数
const int TEACHER_MAXN = 1000;//老师人数
const int STUDENT_MAXN = 1000;//学生总人数
const int ADMIN_MAXN = 1000;//管理员人数
struct User
char account[ACCOUNT_LEN];
char password[PASSWORD_LEN];
// 0 表示身份未定义/信息未定义
// 1 表示学生
// 2 表示老师
// 3 表示管理员
int type;
int number;//表示当前账号类型在该类型中的位置
user[USER_MAXN] , user_now;
struct Student
char name[NAME_LEN];//名字长度
int sex_idx; //0 男 , 1 女.
int chinese;
int math;
int english;
student[STUDENT_MAXN] , student_now;
struct Teacher
char name[NAME_LEN];
teacher[TEACHER_MAXN] , teacher_now;
struct Admin
admin[ADMIN_MAXN] , admin_now;
int user_num;//账户数量
int student_num;//学生数量
int teacher_num;//老师数量
int wrong_count;//容错次数
int check_account(char account[] , char password[]);
void Pretreatment();//初始化
void Pretreatment_user();
void Pretreatment_admin();
void Pretreatment_teacher();
void Pretreatment_student();
void main_menu();//菜单
void login();//登录
void _register();//注册
void save_user();//更新
void type0_menu();//没有更新过信息的
void type1_menu();//学生
void type2_menu();//老师
void type3_menu();//管理员
void student_inf();//学生信息更新
void teacher_inf();//老师信息更新
void teacher_menu();//老师菜单
void student_menu();//学生菜单
void save_student();//保存学生信息
void save_teacher();//保存老师信息
void deply_inf_student();//展示学生个人信息
void deply_sc_student();//展示学生分数
void change_stu_sc();//改变学生分数
void sort_menu();//排序菜单
void deplay_all();//列出当前排列的学生排名
void sort_sum();//按照总分排名
void sort_chinese();//按照语文排名
void sort_math();//按照数学排名
void sort_english();//按照英语排名
int main()
Pretreatment();
main_menu();
return 0;
void change_stu_sc()
printf("请输入学生编号:\\n");
int pos;
scanf("%d" , &pos);
printf("%s 同学当前的分数是(如果是-1,代表尚未更新):\\n" , student[pos].name);
printf("语文:%d\\t数学:%d\\t英语:%d\\n");
printf("请输入修改过过后的三个分数:");
scanf("%d %d %d" , &student[pos].chinese,&student[pos].math , &student[pos].english);
save_student();
Pretreatment();
void sort_menu()
void deplay_all()
void sort_sum()
void sort_chinese()
void sort_math()
void sort_english()
void login()
system("cls");
char input_account[ACCOUNT_LEN];
char input_password[PASSWORD_LEN];
printf("请输入账号:");
scanf("%s" , input_account);
printf("请输入密码:");
scanf("%s" , input_password);
if (check_account(input_account , input_password))
if (user_now.type == 0) type0_menu();
else if(user_now.type == 1) type1_menu();
else if(user_now.type == 2) type2_menu();
else if(user_now.type == 3) type3_menu();
else
wrong_count ++;
if (wrong_count == 3) exit(0);
printf("账号不存在或密码错误\\n");
printf("您还可以尝试: %d 次,持续错误将退出程序.\\n",3 - wrong_count);
printf("请重新输入\\n");
login();
void student_menu()
system("cls");
printf("欢迎您:%s 同学" , student_now.name);
puts("您可以选择:");
puts("1.查看个人信息");
puts("2.查看成绩");
int operation;
scanf("%d" , &operation);
switch(operation)
case 1:
deply_inf_student();
break;
case 2:
deply_sc_student();
break;
default:
printf("请输入合法的操作序号!");
student_menu();
break;
void deply_inf_student()
system("cls");
printf("姓名: %s\\n" , student_now.name);
printf("性别 : ");
if (!student_now.sex_idx) puts("男");
else puts("女");
void deply_sc_student()
system("cls");
if (student_now.chinese == -1) puts("老师尚未更新成绩");
else
printf("您的语文成绩:%d\\n" , student_now.chinese);
printf("您的数学成绩: %d\\n" , student_now.math);
printf("您的英语成绩: %d\\n" , student_now.english);
void teacher_menu()
system("cls");
printf("欢迎您:%s 老师" , teacher_now.name);
printf("您可以选择:\\n");
puts("1.更新学生成绩");
puts("2.将学生成绩排序");
puts("3.展示当前排列的学生成绩");
int operation;
scanf("%d" , &operation);
switch(operation)
case 1:
change_stu_sc();
break;
case 2:
sort_menu();
break;
case 3:
deplay_all();
break;
default:
printf("请输入合法的操作序号!");
teacher_menu();
break;
void student_inf()
system("cls");
printf("请输入姓名:");
scanf("%s" , student_now.name);
printf("请输入性别(0/男,1/女):");
scanf("%d" , &student_now.sex_idx);
student_now.chinese = -1;
student_now.math = -1;
student_now.english = -1;
student_num ++;
strcpy(student[student_num].name , student_now.name);
student[student_num].sex_idx = student_now.sex_idx;
student[student_num].chinese = student_now.chinese;
student[student_num].math = student_now.math;
student[student_num].english = student_now.english;
user_now.number = student_num;
user_now.type = 1;
for (int i = 1;i <= user_num;i ++)
if (!strcmp(user[i].account , user_now.account))
user[i].number = user_now.number;
user[i].type = user_now.type;
break;
save_user();
save_student();
Pretreatment();
printf("您已经更新个人信息,将在 3 秒后返回学生界面\\n");
Sleep(3000);
student_menu();
void teacher_inf()
printf("请输入姓名:");
scanf("%s" , teacher_now.name);
teacher_num ++;
strcpy(teacher[teacher_num].name , teacher_now.name);
user_now.number = teacher_num;
user_now.type = 2;
for (int i = 1;i <= user_num;i ++)
if (!strcmp(user[i].account , user_now.account))
user[i].number = user_now.number;
user[i].type = user_now.type;
break;
save_user();
save_teacher();
Pretreatment();
printf("您已经更新个人信息,将在 3 秒后返回老师界面\\n");
Sleep(3000);
teacher_menu();
void type0_menu()
printf("检测到您没有更新信息:\\n");
printf("您是老师,还是学生?\\n");
puts("1.学生");
puts("2.老师");
int operation;
scanf("%d" , &operation);
switch(operation)
case 1:
student_inf();
break;
case 2:
teacher_inf();
break;
default:
printf("请输入合法的操作序号!");
main_menu();
break;
void type1_menu()
int pos = user_now.number;
strcpy(student_now.name ,student[pos].name);
student_now.sex_idx = student[pos].sex_idx;
student_now.chinese = student[pos].chinese;
student_now.math = student[pos].math;
student_now.english = student[pos].english;
student_menu();
void type2_menu()
strcpy(teacher_now.name , teacher[user_now.number].name);
teacher_menu();
void type3_menu()
void main_menu()
system("cls");
puts("Welcome to Zsh'student_system'");
printf("1.登录\\n");
printf("2.注册\\n");
printf("3.退出\\n");
int operation;
printf("请输入操作:");
scanf("%d" , &operation);
switch(operation)
case 1:
login();
break;
case 2:
_register();
break;
case 3:
exit(0);
default:
printf("请输入合法的操作序号!");
main_menu();
break;
void Pretreatment_student()
FILE *fp_student = fopen("pretreatment_student.txt" , "r");
//载入所有学生
fscanf(fp_student , "%d" , &student_num);
for (int i = 1;i <= student_num;i ++)
fscanf(fp_student , "%s%d%d%d%d" , student[i].name , &student[i].sex_idx , &student[i].chinese , &student[i].math , &student[i].english);
fclose(fp_student);
void save_student()
FILE *fp_student = fopen("pretreatment_student.txt" , "w");
//载入所有学生
fprintf(fp_student , "%d\\n" 以上是关于随缘更新数据结构作业-1C语言实现完整的学生程序管理系统/三个子系统的主要内容,如果未能解决你的问题,请参考以下文章
ZZNUOJ_用C语言编写程序实现1180:成绩统计(结构体专题)(附完整源码)
ZZNUOJ_用C语言编写程序实现1192:删除记录(结构体专题)(附完整源码)
ZZNUOJ_用C语言编写程序实现1190:查询记录(结构体专题)(附完整源码)