C语言学生管理系统
的有关信息介绍如下:
#include #include #include #include #define max 20 typedef struct student //学生 { char sno[max]; // 学号 char sname[max]; //姓名 char sex[max]; //性别 char age[max]; //年龄 char depart[max]; //系 char classs[max]; //班 char grade[max]; //年级 struct student* next; } student; student* head; int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输 { char username[max],password[max]; printf("\n请输入用户名:"); scanf("%s",username); printf("\n请输入密码(最多15位):"); //开始以不回显且支持退格方式获取输入密码 int i=0; while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围 { if(password[i-1]=='\b')//对退格键的处理 { printf("%c%c%c",'\b','\0','\b'); i=i-2; } else printf("*"); } password[--i]='\0'; //已获取密码。验证用户身份 if(!strcmp(username,"zhang")&&!strcmp(password,"8147086")) { printf("\n登录成功!"); return 1; } else return 0; } void regist() { char ch; student *s,*ptr; //s用来建新结点,ptr用来暂存头结点 do { s=(student*)malloc(sizeof(student)); // 新建一个学生结点 printf("\n开始注册..."); //开始注册 printf("\n请输入该学生的学号:"); scanf("%s",s->sno); printf("\n请输入该学生的姓名:"); scanf("%s",s->sname); printf("\n请输入该学生的性别:"); scanf("%s",s->sex); printf("\n请输入该学生的年龄:"); scanf("%s",s->age); printf("\n请输入该学生的系:"); scanf("%s",s->depart); printf("\n请输入该学生所在的班:"); scanf("%s",s->classs); printf("\n请输入该学生所在的年级"); scanf("%s",s->grade); ptr=head; head=s;//将新结点插入队头 s->next=ptr; fflush(stdin); printf("\n请问是否继续注册?(Y/N)"); scanf("%c",&ch); }while(ch=='Y'||ch=='y'); return; } void ElePrint(char str[]) //输出单个元素 { if(str==NULL) exit(0); printf("%s",str); for(unsigned int i=0;i<12-strlen(str);i++) printf(" ");//为了对齐输出,需插入一些空格 return; } int LinePrint(student *ptr) //输出一行 { if(ptr==NULL) //检查传进来的指针 return 0; printf("\n"); ElePrint(ptr->sno); ElePrint(ptr->sname); ElePrint(ptr->age); ElePrint(ptr->sex); ElePrint(ptr->depart); ElePrint(ptr->classs); ElePrint(ptr->grade); return 1; } void print() //输出全部学生信息 { student *ptr=head; printf("\n学号 姓名 年龄 性别 系 班 年级 "); while(ptr) { LinePrint(ptr); ptr=ptr->next; } printf("\n"); return; } void search()//查询模块 { int method;//查询方式 char no[max],name[max],departm[max],clss[max],grades[max]; //用来接收查询关键字 while(1) { printf("\n请选择查询方式"); printf("\n1.按学号查询"); printf("\n2.按姓名查询"); printf("\n3.按所在系查询"); printf("\n4.按所在班级查询"); printf("\n5.按所在年级查询"); printf("\n6.打印全部学生信息"); printf("\n7.返回主菜单\n"); scanf("%d",&method); student *p=head,*temp; switch(method) { case 1: printf("\n请输入要查询的学号:"); scanf("%s",no); while(p) { if(!strcmp(p->sno,no)) break; else { temp=p; p=p->next; } } printf("\n学号 姓名 年龄 性别 系 班 年级 "); LinePrint(p); break; case 2: printf("\n请输入要查询的姓名:"); scanf("%s",name); printf("\n学号 姓名 年龄 性别 系 班 年级 "); while(p) { if(!strcmp(p->sname,name)) LinePrint(p); p=p->next; } break; case 3: printf("\n请输入学生所在的系:"); scanf("%s",departm); printf("\n学号 姓名 年龄 性别 系 班 年级 "); while(p) { if(!strcmp(p->depart,departm)) LinePrint(p); p=p->next; } break; case 4: printf("\n请输入学生所在的班:"); scanf("%s",clss); printf("\n请输入学生所在的年级:"); scanf("%s",grades); printf("\n学号 姓名 年龄 性别 系 班 年级 "); while(p) { if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades)) LinePrint(p); p=p->next; } break; case 5: printf("\n请输入学生所在的年级:"); scanf("%s",grades); printf("\n学号 姓名 年龄 性别 系 班 年级 "); while(p) { if(!strcmp(p->grade,grades)) LinePrint(p); p=p->next; } break; case 6: print(); break; case 7: return; default: printf("很抱歉,暂无此查询方式!"); break; } } } void modify()//修改学生信息 { char num[max]; student *p=head; printf("\n请输入要修改的学生的学号:"); scanf("%s",num); while(p) { if(!strcmp(p->sno,num)) break; else p=p->next; } if(p==NULL) { printf("\n错误:没有此学生的信息!\n"); return; } LinePrint(p); printf("\n请输入要修改的该学生的信息:"); printf("\n1.姓名"); printf("\n2.性别"); printf("\n3.年龄"); printf("\n4.所在的系"); printf("\n5.所在的班"); printf("\n6.所在的年级"); char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max]; int select; fflush(stdin); scanf("%d",&select); printf("\n请输入新的信息:"); switch(select) { case 1: scanf("%s",name1); strcpy(p->sname,name1); break; case 2: scanf("%s",sex1); strcpy(p->sex,sex1); break; case 3: scanf("%s",age1); strcpy(p->age,age1); break; case 4: scanf("%s",depart1); strcpy(p->depart,depart1); break; case 5: scanf("%s",class1); strcpy(p->classs,class1); break; case 6: scanf("%s",grade1); strcpy(p->grade,grade1); break; default: printf("\nError!"); break; } LinePrint(p); return; } void del()// 删除某学生的信息 { student *p=head,*temp=head,*s; char num1[max]; printf("\n请输入要删除的学生的学号:"); scanf("%s",num1); while(p)//查找该学生所在的结点 { if(!strcmp(p->sno,num1)) break; else { temp=p; p=p->next; } }//while if(!p) { printf("\n不存在此学生的信息."); return; } LinePrint(p);//输出该学生的信息 printf("\n请问真的要删除该学生的信息吗?(Y/N)"); char ch; fflush(stdin); scanf("%c",&ch); if(ch=='Y'||ch=='y') { s=p->next; temp->next=s; free(p); printf("\n已经删除该学生的信息."); } return; } void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现 { student *ptr,*s=head,*p; int count=0,count1; while(s)//统计链表结点个数 { count++; s=s->next; } for(int i=1;inext&&(count1--)) { if(strcmp(ptr->sno,ptr->next->sno)>0) { s=ptr->next; ptr->next=s->next; if(p==NULL) //ptr处于队头时 head=s; else p->next=s; s->next=ptr; p=s; } else { ptr=ptr->next; if(p==NULL) //ptr处于队头时 p=head; else p=p->next; } } } return; } void quit() { char ch; printf("\n真的要退出?(Y/N)"); fflush(stdin); scanf("%c",&ch); if(ch=='Y'||ch=='y') exit(0); return; } int main() { int option; printf("\nCopyright@2005 KongXinCai All rights reserved."); printf("\n欢迎使用学生信息管理系统!\n"); //登录模块 int icheck=0; while(icheck<3) { if(LogOn()==0) icheck++; else break; } if(icheck==3) { printf("\n连续登录三次不成功,退出!"); exit(0); } //系统界面 while(1) { printf("\n\n请选择需要的服务:"); printf("\n1.注册"); printf("\n2.查询"); printf("\n3.修改"); printf("\n4.删除"); printf("\n5.排序"); printf("\n7.求平均"); printf("\n6.退出\n"); scanf("%d",&option); switch(option) { case 1: regist(); break; case 2: search(); break; case 3: modify(); break; case 4: del(); break; case 5: sort(); break; case 6: quit(); break; } } return 0; }