首先,要写一个管理系统必须要先搭出一个框架来,即明确自己要实现哪些功能,将每个功能都写陈一个函数,然后再去编写实现各个功能的函数,最后再思考各个函数之间的相互调用。如果没有先搭好框架,而是直接一上手就去写代码的话,写着写着就会有种无从下手的感觉,就像你要做一道编程题目一样,首先要做的肯定是去读题目,看题目想要让我们干什么,然后才会去写代码。
其次,最好是实现一个功能就测试一个,因为这样比较方便调试,出现bug的时候自己先思考,然后再去查找对应的知识点,一定要自己多思考,这样才会使自己的理解和记忆更加深刻
最后,在写管理系统的时候会出现很多bug,在解决完之后会有很大收获。
#define MAX 20
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#include
#include
#include
#include
#include
#include
typedef struct student {
char xuehao[9] ;
char name[MAX] ;
int total ;
char Advanced[4] ;
char C_language_programming[4] ;
char English[4] ;
float average ;
}Item ;
typedef struct node1 {
Item student ;
struct node1 * next ;
}Node_student;
typedef Node_student * Linklist_student ;
typedef struct account_password {
char account [9] ;
char password [MAX] ;
} AAP ;
typedef struct node2 {
AAP account_password ;
struct node2 * next ;
} Node_aap ;
typedef Node_aap * Linklist_aap ;
Linklist_student chuangjian () ; //学生链表的创建
void entering1 (Linklist_student) ; //学生信息导出
Linklist_student export1 () ; //学生信息导入
void entering2(Linklist_aap, int) ; //账号信息导出
Linklist_aap export2(int) ; //账号信息导入
void add1(Linklist_student) ; //增加学生信息
void del1(Linklist_student) ; //删除学生信息
void change1(Linklist_student) ; //修改学生信息
void add2(Linklist_aap) ; //增加账号信息
void del2(Linklist_aap) ; //删除账号信息
int change2(Linklist_aap, const char *) ; //密码修改
void find2(Linklist_aap) ; //查找账号信息
void password_change() ; //管理员密码修改
void find1(Linklist_student) ; //查找学生信息
void Performance_analysis(Linklist_student) ; //成绩分析
int Print2(Linklist_aap) ; //打印账号信息
void sort () ; //对学生链表进行排序
void Print1() ; //打印学生信息
void Print3() ; //打印某个账号信息
void show() ; //系统界面
void manager_interface() ; //管理员登录界面
void manager_login() ; //管理员登录(密码验证)
void manager_power() ; //管理员权限
void student_interface() ; //学生登录界面
void register1 () ; //用户注册
void login (int) ; //用户登录(账号密码验证)
void student_power (const char *) ; //学生用户权限界面
void teacher_register () ; //教师用户注册
void teacher_power() ; //教师用户权限
void password_input(char * p) ; //密码输入
void student_handle() ; //学生账号信息管理
void teacher_handle() ; //教师账号信息管理
char * s_gets(char * p, int n) ; //获取字符串
#include "head.h"
void password_input (char * p) { //密码输入
int i = 0 ;
while (i<19) {
char ch ;
ch = getch() ;
if (ch == '\n' || ch == '\r') {
p[i] = '\0' ;
break ;
}
else if (ch == '\b'){
if (i>0) {
printf("\b \b") ;
p[--i] = '\0' ;
}
}
else {
p[i++] = ch ;
putchar('*') ;
}
}
fflush(stdin) ;
p[19] = '\0' ;
}
void register1 () { //账号注册
system("cls") ;
AAP * aap1 = (AAP *) malloc (sizeof(AAP)) ;
AAP * aap2 = (AAP *) malloc (sizeof(AAP)) ;
FILE * fp = fopen("student_cAp.txt", "at+") ;
if (fp==NULL) {
printf("\n\t打开文件失败\n") ;
puts("\n\t请键入任意键退出!") ;
getch() ;
exit(1) ;
}
printf("\n\n\n\t请输入用户名(8位学号):") ;
scanf("%s", aap1->account) ;
fflush(stdin) ;
while (!feof(fp)) {
fscanf(fp, "%s %s\n", aap2->account, aap2->password) ;
if (strcmp(aap1->account, aap2->account) == 0) {
puts("\t该用户已存在!请重新注册或登录!") ;
printf("\t请键入任意键返回注册界面!") ;
getch() ;
fclose(fp) ;
free(aap1) ;
free(aap2) ;
student_interface() ;
}
}
printf("\n\t密码:\n\t") ;
password_input (aap1->password) ;
printf("\n\t请在输入一遍进行确认:\n\t") ;
password_input(aap2->password) ;
if (strcmp(aap1->password, aap2->password)) {
puts("\n\t两次输入不一致!请重新进行注册!") ;
student_interface() ;
}
fprintf(fp, "%s %s\n", aap1->account, aap1->password) ;
fclose(fp) ;
free(aap1) ;
free(aap2) ;
student_interface() ;
}
void login (int n) { //登录验证
system("cls") ;
AAP * aap1 = (AAP *) malloc(sizeof(AAP)) ;
AAP * aap2 = (AAP *) malloc(sizeof(AAP)) ;
FILE * fp ;
if (n==2) {
fp = fopen("teacher_cAp.txt", "rt") ;
if (fp==NULL) {
printf("\n\t打开文件失败\n") ;
puts("\n\n\n\t请键入任意键退出!") ;
getch() ;
exit(1) ;
}
printf("\n\t账号:") ;
}
else {
fp = fopen("student_cAp.txt", "rt") ;
if (fp==NULL) {
printf("\n\t打开文件失败\n") ;
puts("\n\n\n\t请键入任意键退出!") ;
getch() ;
exit(1) ;
}
printf("\n\n\n\t账号(8位学号):") ;
}
scanf("%s", aap1->account) ;
fflush(stdin) ;
while (!feof(fp)) {
fscanf(fp, "%s %s\n", aap2->account, aap2->password) ;
if (strcmp(aap1->account, aap2->account)==0) {
printf("\n\t密码:") ;
for (int i=0; i<3; i++) {
password_input (aap1->password) ;
if (strcmp(aap1->password, aap2->password)==0) {
puts ("登录成功!") ;
if (n==1)
student_power(aap1->account) ;
else
teacher_power(aap1->account) ;
}
else
printf("\n\t密码错误!请重新输入(您还有%d次机会):\n\t", 2-i) ;
}
printf("\t您已经输错三次,系统将强制退出!\n");
exit(1) ;
}
}
fclose (fp) ;
printf ("\t该用户不存在!请键入任意字符退出\n") ;
getch () ;
exit (1) ;
}
void student_interface () { //学生界面
system ("cls") ;
printf ("\n\n\n\n\n\n\t\t\t\t\t 欢迎进入学生系统\n") ;
printf ("\t\t\t\t\t *******************\n") ;
printf ("\t\t\t\t\t 1.注册 \n\t\t\t\t\t 2.登录\n") ;
printf ("\t\t\t\t\t 3.返回上一层\n\t\t\t\t\t 0.退出\n") ;
printf ("\t\t\t\t\t *******************\n") ;
printf ("\t\t\t\t\t 请选择你要进行的操作:\n\t\t\t\t\t ") ;
int x ;
fflush (stdin) ;
do {
scanf ("%d", &x) ;
fflush (stdin) ;
switch (x) {
case 1 :
register1 (1) ;
break ;
case 2 :
login (1) ;
break ;
case 3 :
show () ;
break ;
case 0 :
entering1(head) ;
entering2(aap_s, 1) ;
entering2(aap_t, 2) ;
printf ("\n\t\t\t\t\t 您选择了退出!") ;
sleep (1) ;
printf ("\n\t\t\t\t\t 正在退出...") ;
sleep (1) ;
printf ("\n\t\t\t\t\t 已退出\n") ;
exit(0) ;
default :
printf ("\t输入有误, 请重新输入:\n\t") ;
printf("请键入任意键重新进行选择!") ;
getch() ;
}
student_interface() ;
}
while (x != 0) ;
}
void student_power(const char * p) { //学生功能
system("cls") ;
puts("\n\n\n\n\n\n\t\t\t\t\t 请选择你要进行的功能:") ;
puts("\t\t\t\t\t ****************************") ;
puts("\t\t\t\t\t 1.查询个人成绩") ;
puts("\t\t\t\t\t 2.查询全班成绩") ;
puts("\t\t\t\t\t 3.成绩分析") ;
puts("\t\t\t\t\t 4.修改密码") ;
puts("\t\t\t\t\t 5.返回上一层") ;
puts("\t\t\t\t\t 0.退出") ;
puts("\t\t\t\t\t ****************************") ;
printf("\t\t\t\t\t ") ;
int x ;
do {
Linklist_student q = head->next ;
scanf("%d", &x) ;
fflush(stdin) ;
if (x == 1 || x == 2) {
system("cls") ;
sort() ;
}
int count = 1 ;
switch (x) {
case 1 :
while (q && strcmp(p, q->student.xuehao) != 0) {
count ++ ;
q = q->next ;
}
if (q) {
printf("\n\n\n\t排名\t\t\t学号\t\t\t姓名\t\t高数\t\tc语言\t\t大英\t\t总分\t\t平均分\n") ;
printf("\t%d\t\t\t%s\t\t%s\t\t%d\t\t%d\t\t%d\t\t%d\t\t%.1f\n", count, q->student.xuehao, q->student.name,
atoi(q->student.Advanced), atoi(q->student.C_language_programming), atoi(q->student.English), q->student.total,
q->student.average) ;
}
else {
puts("\t\t\t\t\t\t 抱歉, 找不到该学生!") ;
puts("\t\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
student_power(p) ;
}
printf("\t请键入任意键返回上一层\n") ;
getch() ;
break ;
case 2 :
Print1() ;
break ;
case 3 :
Performance_analysis(head) ;
break ;
case 4 :
if (change2(aap_s, p)) {
entering2(aap_s, 1) ;
student_interface() ;
}
break ;
case 5 :
student_interface() ;
break ;
case 0 :
entering1(head) ;
puts("\t\t\t\t\t 您选择了退出!") ;
sleep(1) ;
puts("\t\t\t\t\t 正在退出...") ;
sleep(1) ;
puts("\t\t\t\t\t 已退出\n") ;
exit (0) ;
default :
puts("\t\t\t\t\t 输入错误, 请重新选择:") ;
printf("\t\t\t\t\t 请键入任意键重新进行选择:") ;
getch() ;
}
student_power(p) ;
}
while (x != 0) ;
}
void entering1(Linklist_student phead) { //学生信息导出
Linklist_student p = phead->next ;
FILE * fp = fopen("student_message.txt", "w+") ;
if (fp != NULL) {
while (p) {
fprintf(fp, "%s %s %s %s %s %d %.1f\n", p->student.name, p->student.xuehao, p->student.Advanced,
p->student.C_language_programming, p->student.English, p->student.total, p->student.average) ;
p = p->next ;
}}
fclose(fp) ;
}
Linklist_student export1 () { //学生信息导入
changdu = 0 ;
Linklist_student phead, p, q ;
phead = (Linklist_student) malloc (sizeof(Node_student)) ;
phead->next = NULL ;
p = phead ;
FILE * fp = fopen("student_message.txt", "rt") ;
if (fgetc(fp)==EOF)
;
else {
rewind(fp) ;
while (!feof(fp)) {
q = (Linklist_student) malloc (sizeof(Node_student)) ;
fscanf(fp, "%s %s %s %s %s %d %f\n", q->student.name, q->student.xuehao, q->student.Advanced,
q->student.C_language_programming, q->student.English, &q->student.total, &q->student.average) ;
changdu ++ ;
p->next = q ;
p = q ;
}
q->next = NULL ;
}
fclose(fp) ;
return phead ;
}
void entering2(Linklist_aap phead, int n) { //账号信息导出
Linklist_aap p = phead->next ;
FILE * fp ;
if (n == 1)
fp = fopen("student_cAp.txt", "w+") ;
else
fp = fopen("teacher_cAp.txt", "w+") ;
while (p) {
fprintf(fp, "%s %s\n", p->account_password.account, p->account_password.password) ;
p = p->next ;
}
fclose(fp) ;
}
Linklist_aap export2 (int n) { //账号信息导入
Linklist_aap phead, p, q ;
phead = (Linklist_aap) malloc (sizeof(Node_aap)) ;
phead->next = NULL ;
p = phead ;
FILE * fp ;
if (n == 1)
fp = fopen("student_cAp.txt", "rt") ;
else
fp = fopen("teacher_cAp.txt", "rt") ;
if (fgetc(fp)==EOF)
;
else {
rewind(fp) ;
while (!feof(fp)) {
q = (Linklist_aap) malloc (sizeof(Node_aap)) ;
fscanf(fp, "%s %s\n", q->account_password.account, q->account_password.password) ;
p->next = q ;
p = q ;
}
q->next = NULL ;
}
fclose(fp) ;
return phead ;
}
Linklist_student chuangjian() { //学生信息链表的创建
system("cls") ;
Linklist_student phead, pnew, pend ;
phead = (Linklist_student) malloc(sizeof(Node_student)) ;
pend = phead ;
phead->next = NULL ;
char xuehao[9] ;
printf("\n\n\n\t请输入学生学号(8位)[输入非负数结束录入]:") ;
changdu = 0 ;
while (s_gets(xuehao, 9) && atoi(xuehao)>0) {
changdu ++ ;
pnew = (Linklist_student) malloc(sizeof(Node_student)) ;
pnew->next = NULL ;
pend->next = pnew ;
strncpy(pnew->student.xuehao, xuehao, 9) ;
printf("\n\t请输入该生姓名:") ;
s_gets(pnew->student.name, MAX) ;
printf("\n\t请输入该生高数成绩:") ;
s_gets(pnew->student.Advanced, 4) ;
printf("\n\t请输入该生c语言成绩:") ;
s_gets(pnew->student.C_language_programming, 4) ;
printf("\n\t请输入该生大英成绩:") ;
s_gets(pnew->student.English, 4) ;
printf("\n\t请输入下一个学生学号(8位)[输入非负数结束录入]:") ;
pnew->student.total = atoi(pnew->student.Advanced) + atoi(pnew->student.C_language_programming) + atoi(pnew->student.English) ;
pnew->student.average = pnew->student.total / 3.0 ;
pend = pnew ;
}
return phead ;
}
void add1 (Linklist_student phead) { //添加学生信息
system("cls") ;
Linklist_student p = phead, pnew ;
char xuehao[9] ;
printf("\n\n\n\t请输入要添加的学生学号:") ;
s_gets(xuehao, 9) ;
while (p->next)
p = p->next ;
pnew = (Linklist_student) malloc (sizeof(Node_student)) ;
if (pnew == NULL)
puts("\t添加失败!") ;
else {
strcpy(pnew->student.xuehao, xuehao) ;
printf("\n\t请输入该生姓名:") ;
s_gets(pnew->student.name, MAX) ;
printf("\n\t请输入该生高数成绩:") ;
s_gets(pnew->student.Advanced, 4) ;
printf("\n\t请输入该生c语言成绩:") ;
s_gets(pnew->student.C_language_programming, 4) ;
printf("\n\t请输入该生大英成绩:") ;
s_gets(pnew->student.English, 4) ;
pnew->student.total = atoi(pnew->student.Advanced) + atoi(pnew->student.C_language_programming) + atoi(pnew->student.English) ;
pnew->student.average = pnew->student.total / 3.0 ;
p->next = pnew ;
pnew->next = NULL ;
}
printf("\n\t请键入任意字符退出\n") ;
getch() ;
}
void del1 (Linklist_student phead) { //删除学生信息
system("cls") ;
Linklist_student q = phead->next, p = phead->next ;
char xuehao[9] ;
printf("\n\n\n\t请输入要删除的学号:") ;
s_gets(xuehao, 10) ;
while (q && strcmp(q->student.xuehao, xuehao) != 0) {
p = q ;
q = q->next ;
}
if (q == NULL)
puts("\t输入错误, 未找到该生!") ;
else {
if (q == phead->next)
phead->next = q->next ;
else
p->next = q->next ;
puts("\t已删除!") ;
free(q) ;
}
printf("\t请键入任意字符退出\n") ;
getch() ;
}
void change1 (Linklist_student phead) { //修改学生信息
system("cls") ;
Linklist_student p = phead->next ;
char xuehao[9] ;
printf("\n\n\n\t请输入要修改的学生学号:") ;
s_gets(xuehao, 9) ;
while (p && strcmp(p->student.xuehao, xuehao) != 0)
p = p->next ;
if (p == NULL)
puts("\t输入错误, 为找到该生!") ;
else {
printf("\n\t\t\t1.姓名 \t\t\t2.高数成绩") ;
printf("\n\t\t\t3.c语言成绩\t\t\t4.大英成绩\n") ;
printf("\t\t\t5.学号\n") ;
printf("\n\t请输入要修改的内容:") ;
int x ;
scanf("%d", &x) ;
fflush(stdin) ;
switch (x) {
case 1 :
printf("\n\t请输入修改后的学生姓名:") ;
s_gets (p->student.name, MAX) ;
break ;
case 2 :
printf("\n\t请输入修改后的高数成绩:") ;
s_gets(p->student.Advanced, 4) ;
break ;
case 3 :
printf("\n\t请输入修改后的c语言成绩:") ;
s_gets(p->student.C_language_programming, 4) ;
break ;
case 4 :
printf("\n\t请输入修改后的大英成绩:") ;
s_gets(p->student.English, 4) ;
break ;
case 5 :
printf("\n\t请输入修改后的学号:") ;
s_gets(p->student.xuehao, 9) ;
break ;
}
p->student.total = atoi(p->student.Advanced) + atoi(p->student.C_language_programming) + atoi(p->student.English) ;
p->student.average = p->student.total / 3.0 ;
}
printf("\t请键入任意键退出\n") ;
getch() ;
}
void find1 (const Linklist_student phead) { //查找学生信息
system("cls") ;
Linklist_student p = phead->next ;
char xuehao[9] ;
printf("\n\n\n\t请输入要查找的学生学号:") ; ;
s_gets(xuehao, 9) ;
sort() ;
int count = 1 ;
while (p && strcmp(xuehao, p->student.xuehao) != 0) {
count ++ ;
p = p->next ;
}
if (p == NULL)
puts("\n\t输入错误, 未找到该生!") ;
else {
printf("\n\t排名\t\t\t学号\t\t\t姓名\t\t高数\t\tc语言\t\t大英\t\t总分\t\t平均分\n") ;
printf("\t%d\t\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%.1f\n", count, p->student.xuehao, p->student.name,
p->student.Advanced, p->student.C_language_programming, p->student.English, p->student.total,
p->student.average) ;
}
printf("\n\t请键入任意键退出\n") ;
getch() ;
}
void swap (Linklist_student a, Linklist_student b) { //交换结点数据域
Item r = a->student ;
a->student = b->student ;
b->student = r ;
}
void sort () { //学生信息链表的排序
system("cls") ;
puts("\n\n\n\n\n\n\t\t\t\t\t\t 请选择以什么顺序输出学生成绩:") ;
puts("\t\t\t\t\t\t ****************************") ;
puts("\t\t\t\t\t\t\t 1.总分") ;
puts("\t\t\t\t\t\t\t 2.高数") ;
puts("\t\t\t\t\t\t\t 3.大英") ;
puts("\t\t\t\t\t\t\t 4.c语言") ;
puts("\t\t\t\t\t\t\t 5.学号") ;
puts("\t\t\t\t\t\t ****************************") ;
printf("\t\t\t\t\t\t ") ;
int n ;
scanf("%d", &n) ;
fflush(stdin) ;
Linklist_student q = head->next ;
int flag = 1 ;
for (int i=0; i&& flag; i++) {
q = head->next ;
flag = 0 ;
for (; q->next != NULL; q = q->next)
if (n<1 || n>6) {
puts("输入错误, 请重新输入:") ;
sort() ;
break ;
}
else if (n==1 && q->student.total < q->next->student.total) {
flag = 1 ;
swap(q, q->next) ;
}
else if (n==2 && strcmp(q->student.Advanced, q->next->student.Advanced)<0) {
flag = 1 ;
swap(q, q->next) ;
}
else if (n==3 && strcmp(q->student.English, q->next->student.English)<0) {
flag = 1 ;
swap(q, q->next) ;
}
else if (n==4 && strcmp(q->student.C_language_programming, q->next->student.C_language_programming)<0) {
flag = 1 ;
swap(q, q->next) ;
}
else if (n==5 && strcmp(q->student.xuehao, q->next->student.xuehao)>0) {
flag = 1 ;
swap(q, q->next) ;
}
}
}
void Performance_analysis (Linklist_student phead) { //学生成绩分析
system("cls") ;
Linklist_student p = phead->next ;
if (p && phead) {
int c1, c2, c3, m1, m2, m3, y1, y2, y3 ;
int gs_max, dy_max, cyy_max ;
int gs_min, dy_min, cyy_min ;
int sum_gs, sum_dy, sum_cyy ;
float aver_gs, aver_dy, aver_cyy ;
gs_max = gs_min = atoi(p->student.Advanced) ;
dy_max = dy_min = atoi(p->student.English) ;
cyy_max = cyy_min = atoi(p->student.C_language_programming) ;
sum_gs = sum_dy = sum_cyy = 0 ;
aver_gs = aver_dy = aver_cyy = 0 ;
c1 = c2 = c3 = 0 ;
m1 = m2 = m3 = 0 ;
y1 = y2 = y3 = 0 ;
while (p) {
sum_gs += atoi(p->student.Advanced) ;
sum_dy += atoi(p->student.English) ;
sum_cyy += atoi(p->student.C_language_programming) ;
if (gs_maxstudent.Advanced))
gs_max = atoi(p->student.Advanced) ;
if (gs_min>atoi(p->student.Advanced))
gs_min = atoi(p->student.Advanced) ;
if (dy_max>atoi(p->student.English))
dy_max = atoi(p->student.English) ;
if (dy_min>atoi(p->student.English)) ;
dy_min = atoi(p->student.English) ;
if (cyy_maxstudent.C_language_programming))
cyy_max = atoi(p->student.C_language_programming) ;
if (cyy_min>atoi(p->student.C_language_programming))
cyy_min = atoi(p->student.C_language_programming) ;
if (atoi(p->student.C_language_programming)>=60) {
c2 ++ ;
if (atoi(p->student.C_language_programming)>=85)
c3 ++ ;
}
else c1 ++ ;
if (atoi(p->student.Advanced)>=60) {
m2 ++ ;
if (atoi(p->student.Advanced)>=85)
m3 ++ ;
}
else m1 ++ ;
if (atoi(p->student.English)>=60) {
y2 ++ ;
if (atoi(p->student.English)>=85)
y3 ++ ;
}
else y1 ++ ;
p = p->next ;
}
aver_gs = sum_gs / (changdu + 0.0) ;
aver_dy = sum_dy / (changdu + 0.0) ;
aver_cyy = sum_cyy / (changdu + 0.0) ;
printf("\n\n\n\n\n\n\t\t\t 及格人数\t 优秀人数\t 不及格人数\t 最高分\t 最低分\t 平均分\n\n") ;
printf("\t\t高数\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%.1f\n\n", m2, m3, m1, gs_max, gs_min, aver_gs) ;
printf("\t\tc语言\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%.1f\n\n", c2, c3, c1, cyy_max, cyy_min, aver_cyy) ;
printf("\t\t大英\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%.1f\n\n", y2, y3, y1, dy_max, dy_min, aver_dy) ;
}
else
puts("\n\n\n\n\n\n\t\t\t 无学生信息!") ;
printf("\t\t请键入任意键返回上一层!") ;
getch() ;
}
void Print1 () { //打印学生信息
system("cls") ;
Linklist_student p = head->next ;
int n = 1 ;
if (p == NULL || head == NULL)
printf("\n\n\n\t无学生信息!\n") ;
else {
printf("\n\n\n\n\t排名\t\t\t学号\t\t\t姓名\t\t高数\t\tc语言\t\t大英\t\t总分\t\t平均分\n") ;
while (p) {
printf("\t%d\t\t\t%s\t\t%s\t\t%d\t\t%d\t\t%d\t\t%d\t\t%.1f\n", n++, p->student.xuehao, p->student.name,
atoi(p->student.Advanced), atoi(p->student.C_language_programming), atoi(p->student.English), p->student.total,
p->student.average) ;
p = p->next ;
}
}
printf("\t请键入任意键返回上一层\n") ;
getch() ;
}
int change2(Linklist_aap phead, const char * q) { //密码修改
Linklist_aap p = phead->next ;
while (p && strcmp(p->account_password.account, q) != 0)
p = p->next ;
if (p == NULL) {
puts("\t\t\t\t\t 输入错误, 未找到该账号!") ;
puts("\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
return 0 ;
}
else {
char a[20], b[20] ;
printf("\t\t\t\t\t 请输入原密码:\n\t\t\t\t\t ") ;
password_input(a) ;
if (strcmp(a, p->account_password.password)==0) {
puts("\n\t\t\t\t\t 请输入修改后的密码:") ;
printf("\t\t\t\t\t ") ;
password_input(a) ;
puts("\n\t\t\t\t\t 请再输入一遍以确认:") ;
printf("\t\t\t\t\t ") ;
password_input(b) ;
if (strcmp(a, b) != 0) {
puts("\n\t\t\t\t\t 两次输入不一致!\n\t\t\t\t\t 请键入任意键返回上一层!") ;
return 0 ;
}
else {
puts("\n\t\t\t\t\t 修改成功!") ;
strcpy(p->account_password.password, a) ;
puts("\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
return 1 ;
}
}
else {
puts("\n\t\t\t\t\t 原密码错误!\n\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
return 0 ;
}
}
}
void del2(Linklist_aap phead) { //账号信息删除
Linklist_aap q = phead->next, p = phead->next ;
char account[9] ;
printf("请输入要删除的账号:") ;
s_gets(account, 10) ;
while (q && strcmp(q->account_password.account, account) != 0) {
p = q ;
q = q->next ;
}
if (q == NULL)
puts("输入错误, 未找到该账号!") ;
else {
if (q == phead->next)
phead->next = q->next ;
else
p->next = q->next ;
puts("已删除!") ;
free(q) ;
}
printf("请键入任意字符退出\n") ;
getch() ;
}
void add2(Linklist_aap phead) { //添加账号信息
Linklist_aap p = phead, q ;
while (p->next)
p = p->next ;
printf("\t\t\t\t\t 请输入要添加的账号:\n\t\t\t\t\t ") ;
char a[9], b[MAX], c[MAX] ;
s_gets(a, 9) ;
printf("\n\t\t\t\t\t 请输入密码:\n\t\t\t\t\t ") ;
password_input(b) ;
printf("\n\t\t\t\t\t 请再输入一遍密码进行确认:\n\t\t\t\t\t ") ;
password_input(c) ;
if (strcmp(b, c)) {
puts("\n\t\t\t\t\t 两次输入不一致!") ;
puts("\n\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
}
else {
q = (Linklist_aap) malloc(sizeof(Node_aap)) ;
strcpy(q->account_password.account, a) ;
strcpy(q->account_password.password, b) ;
p->next = q ;
q->next = NULL ;
puts("\n\t\t\t\t\t 注册成功!") ;
puts("\n\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
}
}
int Print2 (Linklist_aap phead) { //打印账号信息
Linklist_aap p = phead->next ;
if (phead == NULL || p == NULL) {
puts("\t\t\t\t\t 无账号信息!") ;
if (phead)
return 1 ;
else
return 0 ;
}
else {
while (p) {
printf("\t\t\t\t\t 账号\t\t密码\n") ;
printf("\t\t\t\t\t %s\t\t%s\n", p->account_password.account, p->account_password.password) ;
p = p->next ;
}
return 0 ;
}
}
void Print3(Linklist_aap phead) { //打印要查找的账号信息
char a[9] ;
printf("\t\t\t\t\t 请输入要查找的账号:\n") ;
s_gets(a, 9) ;
Linklist_aap p = phead -> next ;
while (p && strcmp(a, p->account_password.account) != 0)
p = p->next ;
if (p==NULL)
printf("\t\t\t\t\t 输入错误, 未找到该账号!\n") ;
else
printf("\t\t\t\t\t 账号:%s\n密码:%s\n", p->account_password.account, p->account_password.password) ;
printf("\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
}
void manager_interface() { //管理员端
manager_login() ;
manager_power() ;
}
void manager_login () { //管理员登录验证
system("cls") ;
char a[MAX], b[MAX] ;
FILE * fp = fopen("manager_cAp.txt", "rt") ;
fscanf(fp, "%s\n", b) ;
int j ;
for(j=0; j<3; j++) {
putchar('\n') ;
int i = 0 ;
printf("\t 请输入密码:") ;
while (i<19) {
char ch ;
ch = getch() ;
if (ch == '\n' || ch == '\r') {
a[i] = '\0' ;
break ;
}
else if (ch == '\b') {
printf("\b \b") ;
if (i>0)
a[--i] = '\0' ;
}
else {
a[i++] = ch ;
putchar('*') ;
}
}
a[19] = '\0' ;
if (strcmp(b, a) == 0) {
manager_power() ;
break ;
}
}
if (j==3)
puts("\n您已经输错三次!系统将强制退出!") ;
exit(1) ;
}
void manager_power () { //管理员功能
system("cls") ;
puts("\n\n\n\n\n\n\t\t\t\t\t欢迎进入管理员界面") ;
puts("\t\t\t\t ****************************") ;
puts("\t\t\t\t\t1.管理学生账号信息") ;
puts("\t\t\t\t\t2.管理教师账号信息") ;
puts("\t\t\t\t\t3.修改密码") ;
puts("\t\t\t\t\t4.返回上一层") ;
puts("\t\t\t\t\t0.退出") ;
puts("\t\t\t\t ****************************") ;
int x ;
printf("\t\t\t\t\t请输入你要进行的操作:\n\t\t\t\t\t") ;
do {
scanf("%d", &x) ;
fflush(stdin) ;
switch (x) {
case 1 :
student_handle() ;
break ;
case 2 :
teacher_handle() ;
break ;
case 3 :
password_change() ;
manager_interface() ;
break ;
case 4 :
show() ;
case 0 :
printf ("\n\t\t\t\t\t您选择了退出!") ;
sleep (1) ;
printf ("\n\t\t\t\t\t正在退出...") ;
sleep (1) ;
printf ("\n\t\t\t\t\t已退出\n") ;
exit(0) ;
default :
printf("\n\t\t\t\t\t输入错误, 请重新输入:\n\t\t\t\t\t") ;
printf("请键入任意键重新进行选择!") ;
getch() ;
}
manager_power() ;
}
while (x != 0) ;
}
void password_change() { //管理员密码修改
char a[MAX], b[MAX] ;
printf("\n\n\n\n\n\n\t\t\t\t\t请输入修改后的密码:\n\t\t\t\t\t") ;
password_input(a) ;
printf("\n\n\t\t\t\t\t请再输入一遍已确认:\n\t\t\t\t\t") ;
password_input(b) ;
FILE * fp = fopen("manager_cAp.txt", "wt") ;
if (strcmp(a, b) != 0)
puts("\n\t\t\t\t\t两次输入不一致!") ;
else {
puts("修改成功!") ;
fprintf(fp, "%s\n", a) ;
}
fclose(fp) ;
}
void student_handle() { //对学生的操作
system ("cls") ;
puts ("\n\n\n\n\n\n\t\t\t\t\t **************************") ;
puts("\t\t\t\t\t 1.修改学生账号") ;
puts("\t\t\t\t\t 2.删除学生账号") ;
puts("\t\t\t\t\t 3.查找学生账号") ;
puts("\t\t\t\t\t 4.添加学生账号") ;
puts("\t\t\t\t\t 5.返回上一层") ;
puts("\t\t\t\t\t 0.退出") ;
puts ("\t\t\t\t\t **************************") ;
printf ("\t\t\t\t\t 请选择你要进行的操作:\n\t\t\t\t\t ") ;
int x ;
do {
scanf("%d", &x) ;
int y ;
fflush(stdin) ;
if (x!=0 && x!=4 && x!=5)
y = Print2(aap_s) ;
if (y) {
switch (x) {
case 1 :
printf("\t\t\t\t\t 请输入你要修改的账号:") ;
printf("\n\t\t\t\t\t ") ;
char a[9] ;
s_gets(a, 9) ;
change2(aap_s, a) ;
entering2(aap_s, 1) ;
break ;
case 2 :
del2(aap_s) ;
break ;
case 3 :
Print3(aap_s) ;
break ;
case 4 :
add2(aap_s) ;
entering2(aap_s, 1) ;
break ;
case 5 :
manager_power() ;
break ;
case 0 :
entering1(head) ;
printf("\n\t\t\t\t\t 您选择了退出!") ;
sleep(1) ;
printf("\n\t\t\t\t\t 正在退出...") ;
sleep(1) ;
printf("\n\t\t\t\t\t 已退出\n") ;
exit (0) ;
default :
printf ("\t\t\t\t\t 输入有误, 请重新输入:\n");
printf("\t\t\t\t\t 请键入任意键重新进行选择!") ;
getch() ;
}
}
else {
printf("\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
}
student_handle() ;
}
while (x != 0) ;
}
void teacher_handle() { //对教师的操作
system ("cls") ;
puts ("\n\n\n\n\n\n\t\t\t\t\t **************************") ;
puts("\t\t\t\t\t\t 1.修改教师账号") ;
puts("\t\t\t\t\t\t 2.删除教师账号") ;
puts("\t\t\t\t\t\t 3.查找教师账号") ;
puts("\t\t\t\t\t\t 4.添加教师账号") ;
puts("\t\t\t\t\t\t 5.返回上一层") ;
puts("\t\t\t\t\t\t 0.退出") ;
puts ("\t\t\t\t\t **************************") ;
printf ("\t\t\t\t\t 请选择你要进行的操作:\n\t\t\t\t\t ") ;
int x ;
do {
scanf("%d", &x) ;
fflush(stdin) ;
int y ;
if (x!=0 && x!=4 && x!=5)
y = Print2(aap_t) ;
if (y) {
switch (x) {
case 1 :
printf("\t\t\t\t\t 请输入你要修改的账号:") ;
char a[9] ;
s_gets(a, 9) ;
change2(aap_t, a) ;
entering2(aap_t, 2) ;
break ;
case 2 :
del2(aap_t) ;
break ;
case 3 :
Print3(aap_t) ;
break ;
case 4 :
add2(aap_t) ;
entering2(aap_t, 2) ;
break ;
case 5 :
manager_power() ;
break ;
case 0 :
entering1(head) ;
printf("\n\t\t\t\t\t 您选择了退出!") ;
sleep(1) ;
printf("\n\t\t\t\t\t 正在退出...") ;
sleep(1) ;
printf("\n\t\t\t\t\t 已退出\n") ;
exit (0) ;
default :
printf ("\t\t\t\t\t 输入有误, 请重新输入:\n");
printf("\t\t\t\t\t 请键入任意键重新进行选择!") ;
getch() ;
}
}
else {
printf("\t\t\t\t\t 请键入任意键返回上一层!") ;
getch() ;
}
teacher_handle() ;
}
while (x != 0) ;
}
void teacher_power (const char * p) { //教师功能
system ("cls") ;
puts ("\n\n\n\n\n\n\t\t\t\t\t **************************") ;
puts ("\t\t\t\t\t 1.学生信息录入") ;
puts ("\t\t\t\t\t 2.增添学生信息") ;
puts ("\t\t\t\t\t 3.删除学生信息") ;
puts ("\t\t\t\t\t 4.修改学生信息") ;
puts ("\t\t\t\t\t 5.查找学生信息") ;
puts ("\t\t\t\t\t 6.打印学生信息") ;
puts ("\t\t\t\t\t 7.成绩分析") ;
puts ("\t\t\t\t\t 8.修改密码") ;
puts ("\t\t\t\t\t 9.返回上一层") ;
puts ("\t\t\t\t\t 0.退出") ;
puts ("\t\t\t\t\t **************************") ;
printf ("\n\t\t\t\t\t 请选择你要进行的操作:\n\t\t\t\t\t ") ;
int x ;
do {
scanf ("%d", &x) ;
fflush (stdin) ;
switch (x) {
case 1 :
head = chuangjian () ;
break ;
case 2 :
add1 (head) ;
break ;
case 3 :
del1 (head) ;
break ;
case 4 :
change1 (head) ;
break ;
case 5 :
find1 (head) ;
break ;
case 6 :
sort() ;
Print1 () ;
break ;
case 7 :
Performance_analysis(head) ;
break ;
case 8 :
if (change2(aap_t, p)) {
entering2(aap_t, 2) ;
show() ;
}
break ;
case 9 :
show() ;
break ;
case 0 :
entering1(head) ;
printf("\n\t\t\t\t\t 您选择了退出!") ;
sleep(1) ;
printf("\n\t\t\t\t\t 正在退出...") ;
sleep(1) ;
printf("\n\t\t\t\t\t 已退出\n") ;
exit (0) ;
default :
printf ("\t\t\t\t\t输入有误, 请重新输入:\n");
printf("请键入任意键重新进行选择!") ;
getch() ;
}
teacher_power(p) ;
}
while (x != 0) ;
}
void show () { //系统界面
system("cls") ;
printf("\n\n\n\n\n\n\t\t\t\t\t 欢迎进入yjh728的学生管理系统\n") ;
printf("\t\t\t\t\t ****************************\n") ;
printf("\t\t\t\t\t 1.学生登录 \n\t\t\t\t\t 2.教师登录\n") ;
printf("\t\t\t\t\t 3.管理员登录 \n\t\t\t\t\t 0.退出\n") ;
printf("\t\t\t\t\t ****************************\n") ;
printf("\t\t\t\t\t 请选择身份进行登录\n\t\t\t\t\t ") ;
int x ;
fflush(stdin) ;
do {
scanf("%d", &x) ;
fflush(stdin) ;
switch (x) {
case 1 :
student_interface () ;
break ;
case 2 :
login(2) ;
break ;
case 3 :
manager_interface () ;
break ;
case 0 :
entering1(head) ;
entering2(aap_s, 1) ;
entering2(aap_t, 2) ;
printf("\n\t\t\t\t\t 您选择了退出!") ;
sleep(1) ;
printf("\n\t\t\t\t\t 正在退出...") ;
sleep(1) ;
printf("\n\t\t\t\t\t 已退出\n") ;
exit (0) ;
default :
printf("\t\t\t\t\t 输入错误, 请重新选择!\n") ;
printf("\t\t\t\t\t 请键入任意键重新进行选择!") ;
getch() ;
}
show() ;
}
while (x != 0) ;
}
char * s_gets (char * p, int n) { //字符串输入及处理
char * q, * find ;
q = fgets(p, n, stdin) ;
if (q) {
find = strchr(p, '\n') ;
if (find)
* find = '\0' ;
else
while (getchar() != '\n')
continue ;
}
return q ;
}
#include "head.h"
Linklist_student head = NULL ; //学生信息链表
Linklist_aap aap_s = NULL ; //学生账号信息链表
Linklist_aap aap_t = NULL ; //教师账号信息链表
int changdu = 0 ;
int main()
{
head = export1() ; //学生信息从文件导入链表
aap_s = export2(1) ; //学生账号导入链表
aap_t = export2(2) ; //教师账号导入链表
show() ; //学生管理系统界面
return 0 ;
}
第一次写这么长的代码,确实挺累的,但收获也不小,但是还有还不够完善,比如密码加密未完成,还有这个系统只能管理一个班级,若要实现多个班级的成绩管理就不嗯呢该完成了……
最后的最后,这是我的第一篇博客,希望对浏览的人能有所帮助,也希望之后的自己能变得更好,加油!