学生成绩管理系统(附文档)
主要包含以下项目
账号信息:id,密码,身份信息.
学生信息:id,姓名,c语言成绩,英语成绩,数学成绩,总成绩.
采用二进制文本的形式储存
实现有以下功能:
添加学生(教师)账号信息
浏览所有学生信息
按照指定id查询信息
修改指定id信息
删除指定id信息
修改密码
重置系统
扩展功能:
排序浏览
学生和账号信息分别存放在不同的文件中
另附:c语言班费收支系统
实现方式都不一样,可供参考#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#define SUPERKEY 123456
typedef struct Class {
long long id;
char name[10];
int cScore;
int mathScore;
int englishScore;
int allScore;
struct Class *next;
} Class;
typedef struct Identity {
long long id;
long long key;
int identity; ///1表示教师,0表示学生;
struct Identity *next;
} Identity;
void Show(char*);
void Print(Class *s) { ///对内容进行输出
printf(" %-10lld %-13s%-13d%-13d%-13d%-5d\n",s->id,s->name,s->cScore,s->mathScore,s->englishScore,s->allScore);
};
void Init(); ///系统重置
void GotoTeacher(long long,long long,Identity*,Class*); ///教师端
void GotuStudent(long long,long long,Identity*,Class*); ///学生端
void Admin(void*); ///管理员界面
void LogIn(); ///登录端口
void GotoXY(int,int); ///移动光标到输入栏
long long KeyIn(); ///密文输入
int LoadInformation(long long,long long); ///加载账号信息;
void SaveFile(void *,char*); ///存文件
void *readFile(char*); ///读取文件
void Add(Class*,Identity*,char*); ///添加
void Change(long long,void*,char*); ///修改
void *Find(long long id,void *head,char*func); ///查找(*->next即为查找到的数据)
void ViewAll(Class *); ///查看所有
void Delete(long long,Class*,Identity*,char*); ///删除
void Sort(Class*); ///排序
int main() {
LogIn();
return 0;
}
long long KeyIn() { ///密文输入****
char key[20], c;
int i = 0;
memset(key,0,sizeof(key));
while ((c = getch())!='\r') {
if(c != 8) {
key[i++] = c;
printf("*");
} else {
printf("\b \b");
}
}
key[i] = 0;
return atoll(key);
}
void GotoXY(int x,int y) { ///定位光标位置到指定坐标
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos= {x,y};
SetConsoleCursorPosition(hOut,pos);
}
void LogIn() { ///登录界面
long long id;
long long key;
while(1) {
Show("Login");
GotoXY(13,3);
scanf("%lld",&id);
GotoXY(13,5);
key = KeyIn();
LoadInformation(id,key);
}
}
int LoadInformation(long long id,long long key) {
Identity *accont = (Identity*)readFile("ACC");
Class *student = (Class*)readFile("STU");
Identity *p = accont;
Show("Load");
while(p = p->next) {
if(p->id == id&&p->key == key) {
if(p->identity)
GotoTeacher(id,key,accont,student);
else
GotuStudent(id,key,accont,student);
return 0;
}
}
long long superKey;
system("cls");
printf("┌────────────────────────────────────┐\n");
printf("│账号密码错误!!! │\n");
printf("│请输入管理员密码: │\n");
printf("└────────────────────────────────────┘\n");
GotoXY(19,2);
superKey = KeyIn();
if(superKey == SUPERKEY)
Admin(accont);
else {
getchar();
printf("\n\n密码错误!");
Sleep(2000);
}
system("cls");
return 1;
}
void ViewAll(Class *head) {
Class *p = head;
Show("splitter");
while(p = p->next)
Print(p);
}
void ViewAllAcc(Identity*head) {
Identity *p = head;
Show("splitter");
while(p = p->next)
printf("%10lld%10d\n",p->id,p->key);
}
void Add(Class *student,Identity*accont,char*func) {
Identity *addAccont = (Identity*)malloc(sizeof(Identity));
printf("请输入你要添加的id:\n");
if(strcmp(func,"STU")==0) {
Class *add = (Class*)malloc(sizeof(Class));
scanf("%lld",&add->id);
if(((Identity*)Find(add->id,accont,"ACC"))->next) {
printf("此id已存在\n");
free(add);
free(addAccont);
return;
}
printf("请输入该生名字:\n");
scanf("%s",add->name);
printf("请输入c成绩,数学成绩,英语成绩(以空格隔开)\n");
scanf("%d%d%d",&add->cScore,&add->mathScore,&add->englishScore);
add->allScore = add->cScore+add->mathScore+add->englishScore;
addAccont->id = add->id;
addAccont->key = 123456;
addAccont->identity = 0;
add->next = student->next;
student->next = add;
SaveFile(student,"STU");
} else {
scanf("%lld",&addAccont->id);
if(((Identity*)Find(addAccont->id,accont,"ACC"))->next) {
printf("此id已存在\n");
free(addAccont);
return;
}
printf("请输入该账号的初始密码:\n");
addAccont->key = KeyIn();
addAccont->identity = 1;
}
addAccont->next = accont->next;
accont->next = addAccont;
SaveFile(accont,"ACC");
}
void Change(long long id,void *head,char* func) {
if(strcmp(func,"STU")==0) {
Class *Cur = ((Class*)Find(id,head,"STU"))->next;
if(Cur) {
printf("请按照姓名,c语言成绩,数学成绩,英语成绩的格式输入(以空格隔开)\n");
scanf("%s%d%d%d",Cur->name,&Cur->cScore,&Cur->mathScore,&Cur->englishScore);
Cur->allScore = Cur->cScore + Cur->englishScore + Cur->mathScore;
} else
printf("查无此人\n");
SaveFile(head,"STU");
} else {
Identity *Cur = ((Identity*)Find(id,head,"ACC"))->next;
printf("请输入新密码:\n");
Cur->key = KeyIn();
printf("\n");
SaveFile(head,"ACC");
}
}
void Delete(long long id,Class*student,Identity*accont,char*func) {
if(strcmp(func,"STU")==0) {
Class *p = Find(id,student,"STU");
if(p->next) {
Class *r = p->next;
p->next = r->next;
free(r);
} else {
printf("操作有误\n");
return;
}
SaveFile(student,"STU");
}
Identity *p = Find(id,accont,"ACC");
if(p->next) {
if(p->identity==0) {
Class *r = p->next;
p->next = r->next;
free(r);
}
} else {
printf("操作有误\n");
}
SaveFile(accont,"ACC");
printf("成功!!!\n");
}
void *Find(long long id,void *head,char *func) {
if(strcmp(func,"STU")==0) {
Class *p = (Class*)head;
while(p->next&&p->next->id !=id)
p = p->next;
return p;
} else {
Identity *p = (Identity*)head;
while(p->next&&p->next->id !=id)
p = p->next;
return p;
}
}
void *readFile(char*func) {
FILE* fp;
if(strcmp(func,"STU")==0) {
Class *head = (Class*)malloc(sizeof(Class));
Class *p,*r = head;
head->next = NULL;
fp = fopen("student.txt", "ab+");
while(1) {
p=(Class*)malloc(sizeof(Class));
if(fread(p,sizeof(Class)-sizeof(Class*),1,fp)) {
r->next = p;
r = p;
} else
break;
}
r->next = NULL;
return head;
} else {
Identity *head = (Identity*)malloc(sizeof(Identity));
Identity *p,*r = head;
head->next = NULL;
fp = fopen("accont.txt", "ab+");
while(1) {
p=(Identity*)malloc(sizeof(Identity));
if(fread(p,sizeof(Identity)-sizeof(Identity*),1,fp)) {
r->next = p;
r = p;
} else
break;
}
r->next = NULL;
return head;
}
}
void SaveFile(void *head,char*func) {
FILE *fp;
if(strcmp(func,"STU")==0) {
fp = fopen("student.txt","wb");
Class* p = (Class*)head;
while(p = p->next)
fwrite(p,sizeof(*p)-sizeof(Class*),1,fp);
} else {
fp = fopen("accont.txt","wb");
Identity* p = (Identity*)head;
while(p = p->next)
fwrite(p,sizeof(*p)-sizeof(Identity*),1,fp);
}
fclose(fp);
}
void GotuStudent(long long id,long long key,Identity* accont,Class*student) { ///学生端
int input;
while(1) {
Show("student");
scanf("%d",&input);
switch(input) {
case 1:
Show("splitter");
Print(((Class*)(Find(id,student,"STU")))->next);
break;
case 2:
Change(id,accont,"ACC");
break;
case 3:
return;
default:
printf("输入有误");
}
system("pause");
}
}
void GotoTeacher(long long id,long long key,Identity*accont,Class*student) { ///教师端
while(1) {
Show("teacher");
int input;
scanf("%d",&input);
switch(input) {
case 1:
Add(student,accont,"STU");
break;
case 2:
Sort(student);
ViewAll(student);
break;
case 3: {
long long findId;
printf("请输入查询的id:\n");
scanf("%lld",&findId);
Class* find = ((Class*)Find(findId,student,"STU"))->next;
if(find) {
Show("splitter");
Print(find);
} else
printf("查无此人\n");
break;
}
case 4: {
long long changeId;
printf("请输入修改的id:\n");
scanf("%lld",&changeId);
Change(changeId,student,"STU");
}
break;
case 5: {
long long deleteId;
printf("请输入要删除的id:\n");
scanf("%lld",&deleteId);
Delete(deleteId,student,accont,"STU");
break;
}
case 6:
Change(id,accont,"ACC");
break;
case 7:
return;
default:
printf("输入错误,请重新输入\n");
Sleep(1000);
}
system("pause");
}
}
void Admin(void *head) {
while(1) {
system("cls");
Show("Admin");
int input;
scanf("%d",&input);
switch(input) {
case 1:
Add(NULL,head,"ACC");
break;
case 2: {
long long deleteId;
printf("请输入要删除的id:\n");
scanf("%lld",&deleteId);
Delete(deleteId,NULL,head,"ACC");
break;
}
case 3:
return;
case 4:
Init();
break;
default:
printf("输入有误\n");
}
system("pause");
}
}
void Show(char *func) {
system("cls");
if(strcmp(func,"splitter")==0) { ///Splitter
printf(" id 姓名 c语言成绩 数学成绩 英语成绩 总分\n");
printf("==========================================================================\n");
} else if(strcmp(func,"teacher")==0) { ///Teacher;
printf("┌───────────────────────────────────┐\n");
printf("│ 学生成绩管理系统 │\n");
printf("│ 教师端 │\n");
printf("│───────────────────────────────────│\n");
printf("│ 添加学生信息 -->1 │\n");
printf("│ 浏览所有学生信息 -->2 │\n");
printf("│ 查询学生信息 -->3 │\n");
printf("│ 修改学生信息 -->4 │\n");
printf("│ 删除学生信息 -->5 │\n");
printf("│ 修改密码 -->6 │\n");
printf("│ 退出系统 -->7 │\n");
printf("└───────────────────────────────────┘\n");
} else if(strcmp(func,"student")==0) {
printf("┌────────────────────────────────────┐\n");
printf("│──────────学生成绩管理系统──────────│\n");
printf("│────────────────────────────────────│\n");
printf("│ 查询自己成绩信息 -->1 │\n");
printf("│ 修改密码 -->2 │\n");
printf("│ 退出系统 -->3 │\n");
printf("└────────────────────────────────────┘\n");
} else if(strcmp(func,"Login")==0) {
printf("┌────────────────────────────────────┐\n");
printf("│──────────学生成绩管理系统──────────│\n");
printf("│────────────────────────────────────│\n");
printf("│请输入账号: │\n");
printf("│────────────────────────────────────│\n");
printf("│请输入密码: │ \n");
printf("└────────────────────────────────────┘\n");
} else if(strcmp(func,"Admin")==0) {
printf("┌───────────────────────────────────┐\n");
printf("│ 学生成绩管理系统 │\n");
printf("│ 管理员端 │\n");
printf("│───────────────────────────────────│\n");
printf("│ 添加教师账号 -->1 │\n");
printf("│ 删除教师账号 -->2 │\n");
printf("│ 退出系统 -->3 │\n");
printf("│ 重置系统 -->4 │\n");
printf("└───────────────────────────────────┘\n");
} else { ///Load
char loadR[] = {">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"};
char loadL[] = {"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"};
const int leng = sizeof(loadR)/sizeof(char);
char *ploadR[leng+5],*ploadL[leng+5];
int i;
printf("\n\n");
for(i=0;i<leng;i++){
ploadR[i] = &loadR[i];
ploadL[i] = &loadL[i];
}
for(i=1;i <= leng; i++) {
printf("\r%50s Loading %3d%% %-50s",ploadL[leng-i],i*2,ploadR[leng-i]);
Sleep(40);
}
printf("\n");
}
}
void Init() { ///重置系统
printf("请注意,该操作将会清空系统内所有信息!\n");
Sleep(1000);
printf("1.执行\n2.不执行\n");
int flag;
scanf("%d",&flag);
if(flag==1) {
FILE *fin = fopen("student.txt","w");
FILE *fout = fopen("accont.txt","w");
fclose(fin);
fclose(fout);
printf("重置成功!\n");
Sleep(1000);
return;
} else if(flag==2)
return;
else
printf("输入有误,默认返回\n");
Sleep(1000);
return;
}
void Sort(Class* head) { ///冒泡,q,p为交换数据的前一个节点
Class* p = head,*q;
while(p->next){
q = p;
while(q = q->next){
if(q->next&& p->next->allScore > q->next->allScore){
Class *tmp = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = tmp;
}
}
p = p->next;
}
}

浙公网安备 33010602011771号