📄 student2.cpp
字号:
/*
程序修改说明:新增学生删除已选课程功能,
增添学生查看选课情况并生成.htm格式的课程表功能,
设标志位aflag来实现管理员中止选课或允许学生选课。
在课程表中新添上课教室,上课时间,上课周次三个数据项
程序修改时间:11.12
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
int saveflag=0;//保存标志位
int aflag=0;//允许选课标志位
char pd[20];//管理员密码
struct student
{
char name[20];
int xuehao;//学号必须唯一
int kecheng[5][2];//存储学生所选课程的编号和得分
char password[20];
char sex[4];
int phonum;//电话号码
};
struct kecheng
{
char croom[50];//上课教室
char ctime[50];//上课时间
char weeks[10];//上课周次
char teacherinfor[50];
char password[20];//密码不超过20位
char teacher[20];//任课教师名字
char kechengm[25];//存放课程名
int bianhao;//课程编号必须唯一,以便作为查询条件
int xfen[100][2];//存储选了这门课的学生的学号和得分
};
typedef struct snode
{
struct student data;
struct snode *next;
}Snode,*Slink;//建立学生链
typedef struct knode
{
struct kecheng data;
struct knode *next;
}Knode,*Klink;//建立课程链
int delkecheng(Klink kl,Slink sl);//删除课程
int addstudent(Slink sl);//增加学生
void save(Klink kl,Slink sl);
void welcome()
{
printf("*******************************************************************************\n");
printf("*************************欢迎试用宝宝学生成绩管理系统**************************\n");
printf("*******************************************************************************\n");
printf("****************************-----YYY农大学生信息管理系统模仿版*****************\n");
printf("*******************************************************************************\n");
printf("***************计算机科学与技术02级2班 YYYYYY*******************************\n");
printf("*********************************************************YYYYYYYY**************\n");
printf("*******************************************************************************\n");
}
void load()
{
printf("\n\n\t*************************************************************\n");
printf("\t*** ***\n");
printf("\t*** 身份选择: ***\n");
printf("\t*** (A)管理员 (T)教师 (S)学生 (Q)退出 ***\n");
printf("\t*** ***\n");
printf("\t*************************************************************\n");
}
void schoice()
{
printf(" \t* * * * * * * * * *学 生 登 录* * * * * * * * * * * * * * * * * *\n");
printf(" \t*\t * * * * * * * * * * * * * * * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * 1.查看课程 * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * 2.选修课程 * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * 3.修改自己的密码 * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * 4.修改个人信息 * *\n");
printf(" \t*\t * **** **** **** * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * 5.查看已选课程 * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * 6.删除已选课程 * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * 7.保存数据 * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * 0.退出系统 * *\n");
printf(" \t*\t * * *\n");
printf(" \t*\t * * * * * * * * * * * * * * *\n");
printf(" \t* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
}
void tchoice()
{
printf("\t\t**********************************************\n");
printf("\t\t************** 教 师 登 录 ******************\n");
printf("\t\t**********************************************\n");
printf("\t\t*************(1)修改学生成绩 ***************\n");
printf("\t\t************* ***************\n");
printf("\t\t*************(2)对学生成绩排序 ***************\n");
printf("\t\t************* ***************\n");
printf("\t\t*************(3)修改自己的密码 ***************\n");
printf("\t\t************* ***************\n");
printf("\t\t*************(4)修改个人信息 ***************\n");
printf("\t\t************* ***************\n");
printf("\t\t*************(5)查看个人信息 ***************\n");
printf("\t\t************* ***************\n");
printf("\t\t*************(6)保存修改信息 ***************\n");
printf("\t\t************* ***************\n");
printf("\t\t*************(0)退出系统 ***************\n");
printf("\t\t**********************************************\n");
}
void wrong()
{
printf("\n\n\t\t!!!!!!!!输入错误!!!!!!!!\n");
}
void pleasechoice()
{
printf("\n请输入你的选择:");
}
void pdwrong()
{
printf("\n\n\t\t!!!!!!!!密码错误!!!!!!!!\n");
}
void achoice()
{
printf("\n\t管理员登录:");
printf("\n\t**************************************************************\n");
printf("\t*******(1)增加课程 (2)删除课程 ********\n");
printf("\t******** ********\n");
printf("\t*******(3)增加学生 (4)删除学生 ********\n");
printf("\t******* ********\n");
printf("\t*******(5)修改学生基本资料 (6)修改教师基本资料 ********\n");
printf("\t******** ********\n");
printf("\t*******(7)查询学生资料 (8)查询教师资料 ********\n");
printf("\t******* ********\n");
printf("\t*******(9)保存已修改资料 (10)修改密码 ********\n");
printf("\t******* ********\n");
printf("\t*******(11)改变选课状态 (0)退出系统 ********\n");
printf("\t**************************************************************\n");
}
void exitx(Klink kl,Slink sl)
{ char sure[20];
printf("\n你确定要退出系统吗?(Y):");
scanf("%s",&sure);
getchar();
if((sure[0]!='Y'&&sure[0]!='y'&&sure[0]!=10)&&(strlen(sure)<2))//输入大于2这说明用户输入出错
{
return;
}
if(!saveflag)
{
printf("\n\t*************谢谢使用YY农大学生信息管理系统模仿版!**************\n");
exit(0);
}
else
{
char ch[20];
a:
printf("\n你已经修改了数据库的数据,是否保存数据?(Y/N):");
scanf("%s",&ch);
getchar();
if((ch[0]=='Y'||ch[0]=='y')&&(strlen(ch)<2))//输入大于2这说明用户输入出错
{
save(kl,sl);
printf("\n\t数据保存完毕!");
printf("\n\t*************谢谢使用YY农大学生信息管理系统模仿版!**************\n");
getchar();
getchar();
exit(0);
}
else if((strlen(ch)<2)&&(ch[0]=='N'||ch[0]=='n'))//输入大于2这说明用户输入出错
{
printf("\n\t*************谢谢使用Y农大学生信息管理系统模仿版!**************\n");
exit(0);
}
else
{
wrong();
goto a;
}
}
}
int adminload(char *pd)
{
printf("*******************************************************************************\n");
printf("********密码:");
char password[20];
scanf("%s",password);getchar();
if(!strcmp(password,pd))
return 1;//管理员登录成功代号为1
return 0;
}
Snode* findsnum(Slink sl,int num)//用学号查找学生返回找到的整个节点
{
Snode *temps;
temps=sl->next;
while(temps)//下一个指针不为空
{
if(temps->data.xuehao==num)
return temps;//返回找到的上一个节点,便于以后的删除操作
temps=temps->next;
}
return NULL;
}
Snode* findsname(Slink sl,char name[20])//用学生姓名查找学生返回找到的整个节点
{
Snode *temps;
temps=sl->next;
while(temps)
{
if(!strcmp(temps->data.name,name))
return temps;
temps=temps->next;
}
return NULL;
}
Knode* findtnum(Klink kl,int num)//查找教师,用教师的编号找返回整个节点
{
Knode *tempk;
tempk=kl->next;
while(tempk)
{
if(tempk->data.bianhao==num)
return tempk;//返回找到的上一个节点,便于以后的删除操作
tempk=tempk->next;
}
return NULL;
}
Knode* findtname(Klink kl,char name[20])//用教师姓名查找教师返回找到的整个节点
{
Knode *tempk;
tempk=kl->next;
while(tempk)
{
if(!strcmp(tempk->data.teacher,name))
return tempk;
tempk=tempk->next;
}
return NULL;
}
int addkecheng(Klink kl)//增加课程
{
int num;
Knode *k,*p,*kp;
printf("\n请输入课程编号(<0>回到上级菜单):");
scanf("%d",&num);getchar();
if(num==0)
return 0;
kp=findtnum(kl,num);
if(kp)//增加课程时检查课程存在否
{
printf("\n这门课已经存在,请输入其它的课程编号!\n");
}
else
{
k=(Knode*)malloc(sizeof(Knode));
printf("\n请输入课程名:");
scanf("%s",k->data.kechengm);
getchar();
printf("\n请输入任课教师姓名:");
scanf("%s",k->data.teacher);
getchar();
printf("\n请初始化任课教师密码:");
scanf("%s",k->data.password);
getchar();
printf("\n每周上课时间:");
gets(k->data.ctime);
//getchar();
printf("\n上课周次:");
gets(k->data.weeks);
//getchar();
printf("\n上课教室:");
gets(k->data.croom);
//getchar();
k->data.bianhao=num;
//scanf("%s",k->data.ctime);
strcpy(k->data.teacherinfor ,"\0");
for(int i=0;i<100;i++)
{
k->data.xfen[i][0]=0;k->data.xfen[i][1]=0;
}
p=kl;
while(p->next!=NULL)p=p->next;
k->next=NULL;
p->next=k;
p=k;
saveflag=1;
}
return 1;
}
int delkecheng(Klink kl,Slink sl)//删除课程
{
int num;int i=0,j=0;
knode *p,*kp;
snode *s;
printf("\n请输入课程编号(<0>回到上级菜单):");
scanf("%d",&num);
//getchar();
if(num==0)
return 0;
kp=findtnum(kl,num);
//kp=p->next;//真正的节点
if(kp)
{
i=0;
while(kp->data.xfen[i][0]&&(i<100))//取完所有的学号
{
j=0;//putchar('o');
s=findsnum(sl,kp->data.xfen[i][0]);
while((s->data.kecheng[j][0]!=kp->data.xfen[i][0])&&(j<5))//找到这门课
j++;
while((s->data.kecheng[j][0])&&(j<4))//逐个前移
{
s->data.kecheng[j][0]=s->data.kecheng[j+1][0];
s->data.kecheng[j][1]=s->data.kecheng[j+1][1];
j++;
}
s->data.kecheng[j][0]=0;//尾置0
s->data.kecheng[j][1]=0;
i++;
}
p=kl;
while(p->next!=kp)//找到前一节点
p=p->next;
p->next=kp->next;
free(kp);//释放节点
saveflag=1;
printf("\t\n=====该课程已经成功删除!======\n");//p->next=kp->next;free(kp);
return 1;
}//if
else
{
printf("\n\t\t\t======这门课不存在=======\n");return 1;
}
}
int addstudent(Slink sl)//增加学生
{
int num;
Snode *s,*p,*sp;
printf("\n请输入学生学号(<0>回到上级菜单):");
scanf("%d",&num);getchar();
if(num==0)
return 0;
sp=findsnum(sl,num);
if(sp)//查看这个学号是否已被分配
{
printf("\n\t已经有学生占有此学号!\n");
}
else
{
s=(Snode*)malloc(sizeof(Snode));
printf("\n请输入学生名:");
scanf("%s",s->data.name);
getchar();
printf("\n请初始化学生密码:");
scanf("%s",s->data.password);
getchar();
printf("\n请输入性别:");
scanf("%s",s->data.sex);
getchar();
s->data.xuehao=num;
s->data.phonum=0;
for(int i=0;i<5;i++)
{
s->data.kecheng[i][0]=0;s->data.kecheng[i][1]=0;
}
p=sl;
while(p->next!=NULL)p=p->next;
s->next=NULL;
p->next=s;
p=s;
saveflag=1;
}
return 1;
}
int delstudent(Klink kl,Slink sl)//删除学生
{
int num;int i=0,j=0;
Snode *p,*sp;
knode *k;
printf("\n请输入学生学号(<0>回到上级菜单):");
scanf("%d",&num);getchar();
if(num==0)
return 0;
sp=findsnum(sl,num);
//kp=p->next;//真正的节点
if(sp)
{
i=0;
while(sp->data.kecheng[i][0]&&(i<5))//取完所有的可能的课程号
{
j=0;
k=findtnum(kl,sp->data.kecheng[i][0]);
if(k)
{
while((k->data.xfen[j][0]!=sp->data.kecheng[i][0])&&(j<100))//在这门课中找到此学号并删除
j++;//putchar('s');
while((k->data.xfen[j][0])&&(j<100))//逐个前移
{
k->data.xfen[j][0]=k->data.xfen[j+1][0];
k->data.xfen[j][1]=k->data.xfen[j+1][1];
j++;
}
k->data.xfen[j][0]=0;//尾置零
k->data.xfen[j][1]=0;
}
i++;
}
p=sl;
while(p->next!=sp)//找到的节点
p=p->next;
p->next=sp->next;
free(sp);//释放节点
saveflag=1;
printf("\t\n=====这名学生资料已经成功删除!======\n");//p->next=kp->next;free(kp);
return 1;
}//if
else
{
printf("\n\t\t\t======这名学生不存在=======\n");return 1;
}
}
int mteacher(Klink kl)//修改教师资料
{
knode *k;int n;
printf("\n请输入教师编号(<0>回到上级菜单):");
scanf("%d",&n);
getchar();
if(!n)
return 0;
k=findtnum(kl,n);
if(!k)
{
printf("\n不存在这个编号!");
return 1;
}
printf("\n请输入教师姓名:");
scanf("%s",k->data.teacher);
getchar();
printf("\n请输入课程名:");
scanf("%s",k->data.kechengm);
getchar();
saveflag=1;
return 1;
}
int mstudent(Slink sl)//修改学生资料
{
snode *s;int n;
printf("\n请输入学生学号(<0>回到上级菜单):");
scanf("%d",&n);
getchar();
if(!n)
return 0;
s=findsnum(sl,n);
if(!s)
{
printf("\n不存在这个学号!");
return 1;
}
printf("\n请输入学生姓名:");
scanf("%s",s->data.name);
getchar();
printf("\n请输入性别:");
scanf("%s",s->data.sex);
getchar();
saveflag=1;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -