否Pag=Pag-1Pag=1Pag=Pag+1Pag=MaxPag=N
A否=退出
是
结束
1(7、另存为
开始
输入文
件名显示出
错
文件名是否合文件是否存在是否法
是
否
是否覆盖是否保存
是
是保存文件
结束
1(8、保存
开始
是否保存到默
认文件
是
保存文件否
结束
1(9、读取
开始
是否有记录未保存
提示是否保存到默认文件提示读取默认文件还是自定义文件
否输入Y/N
从默认文件读输入文件名取
是输入正确是否
文件名是否正确
读取默认文件
是否=Y
文件是否存在是
是保存到默认
文件
读取自定义文件
结束
1(10、查询
开始
提示没有记否是否有记录录
是
输入查询方
式,学号or
姓名
输入姓名,输入学号是按学号查询可模糊打印记录打印记录是否有记录是否有记录
是是是否要删除输入学号是是否要删除
是
学号在搜索列提示不在搜删除记录表中索列表中
是
提示删除成删除记录
功
结束
1(11、统计
开始
输入0<=menu<=7
Menu==13<=Menu<=5Menu==2Menu==0否否
是是是是按总分降序,搜索按第i科分数降序,打印各科平均分返回主界面前三名搜索前三名
打印搜索列表
1(12、退出
开始
是否有文件未是否确认退否保存出(Y/N)
是
提示是否保否输入I存(Y/N)
输入XI==Y||I==N
是
X==YI==Y是否
否
X==N保存否
退出返回主菜单退出返回主菜单
结束
另附源代码:
#include#include#include#include
#include#include
#include
#defineUser10//用户名最大宽度#definePassword10//密码最大宽度#defineHight24//控制台高度#defineWidth80//控制台宽度#defineDefaultUser"admin"//默认的用户名#defineDefaultPassword"123456"//默认的用户密码#defineStudentName20//学生姓名最大长度#defineOnePageNum8//一页显示信息条数#defineMARKLEN(Width-2-StudentName-8)/8//除学号和姓名外其他项目所占长度
#defineFILEADDR"data.txt"//默认文件名#defineFILE_NAME_NUM8//文件名长度
intWrongTimes=3;//允许登录输错密码次数intIsSaved=0;//记录是否保存,0为已保存intstudent_num=0;//学生实际人数
intmaxnum=0;//最大学号
intsys_year=0;//系统时间年
intsys_mon=0;//系统时间月
intsys_day=0;//系统时间日
typedefstructdel_node//存放缺漏的学号
{
intSno;
structdel_node*next;}del_Node,*del_list,*del_pointer;
typedefstructdate_node{
intYear;//年
intMonth;//月
intDay;//日
}m_date;
typedefstructstudent_node{
intSno;//学号
charName[20];//姓名
m_datebirthday;//生日
floatscore[5];//五门成绩:
语文,数学,英语,物理,化学}student_info;
typedefstructnode//学生信息的数据结构{
student_infodata;
structnode*next;//指向下一结点
}Node,*lklist,*pointer;
pointerp=NULL,q;//p为尾巴结点,用于添加q用于其他lklisthead=NULL;//学生数据头结点
del_listdel_head=NULL;//缺漏学号链表头结点del_pointerdel_last=NULL;//缺漏学号链表尾结点
/************************功能:
添加新的结点到链表中
参数:
lklisthead,链表头结点
lklist*last,链表尾结点指针
其他,学生结点信息
返回:
链表头结点
************************/lklistadd(lklisthead,lklist*last,student_infodata)
{
if(head==NULL)//如果链表为空
{
head=(Node*)malloc(sizeof(Node));
*last=head;
head->data.Sno=0;
head->next=NULL;
}
q=(Node*)malloc(sizeof(Node));
q->data=data;
if(q->data.Sno>maxnum)
maxnum=q->data.Sno;//记录最大学号
(*last)->next=q;
*last=q;
(*last)->next=NULL;
returnhead;
}
/************************功能:
添加缺漏的学号
参数:
lklisthead,链表头结点
lklist*last,链表尾结点指针
intsno学号
返回:
链表头结点
************************/del_listadd_del_sno(del_listhead,del_list*last,intsno)
{
del_pointerx;
if(head==NULL)//如果链表为空
{
head=(del_Node*)malloc(sizeof(del_Node));
head->Sno=0;
*last=head;
head->next=NULL;
}
x=(del_Node*)malloc(sizeof(del_Node));
x->Sno=sno;
head->Sno=head->Sno+1;
(*last)->next=x;
*last=x;
(*last)->next=NULL;
returnhead;
}
/************************功能:
清空链表结点
参数:
lklisthead,链表头结点
lklist*last,链表尾结点指针
返回:
无
************************/voiddel(lklisthead,lklist*last)
{
if(head==NULL||head->next==NULL)
return;
while(head->next)
{
q=head->next;
head->next=q->next;
free(q);
}
*last=head;
}
/************************功能:
清空缺漏学号链表结点
参数:
lklisthead,链表头结点
lklist*last,链表尾结点指针
返回:
无
************************/voiddel_del(del_listhead,del_list*last)
{
del_pointerx;
if(head==NULL||head->next==NULL)
return;
while(head->next)
{
x=head->next;
head->next=x->next;
free(x);
}
*last=head;
}
/************************功能:
删除缺漏学号链表第一个结点
参数:
lklisthead,链表头结点
lklist*last,链表尾结点指针
返回:
链表
************************/del_listdel_del_first(del_listhead,del_list*last)
{
if(head==NULL||head->next==NULL)
return;
del_pointerx=head->next;
if(x->next)
{
head->next=x->next;
}
else
{
*last=head;
head->next=NULL;
}
free(x);
head->Sno=head->Sno-1;
returnhead;
}
/************************功能:
复制链表
参数:
lklisthead,要复制的链表
lklist*copy_head,存放的头指针
lklist*copy_last,存放的尾指针
返回:
无
************************/voidcopy_link(lklisthead,lklist*copy_head,lklist*copy_last)
{
pointerx;
if(head==NULL||head->next==NULL)
return;
x=head;
while(x->next)
{
*copy_head=add(*copy_head,copy_last,x->next->data);
x=x->next;
}
}
/************************功能:
从输入流读取一个字符
返回:
返回该字符的ASCII码
************************/intgetch(void)
{
structtermiostm,tm_oid;
intfd=STDIN_FILENO,c;
if(tcgetattr(fd,&tm)<0)
return-1;
tm_oid=tm;
cfmakeraw(&tm);
if(tcsetattr(fd,TCSANOW,&tm)<0)
return-1;
c=fgetc(stdin);
if(tcsetattr(fd,TCSANOW,&tm_oid)<0)
return-1;
returnc;
}
/************************功能:
从输入流读取一个字符
返回:
返回该字符的ASCII码
************************/intmy_getch(){
inti=0;
intj=0;
do
{
i=getch();
if(i==27)
{
j=i;
continue;
}
elseif(i==91)
{
j=i;
continue;
}
elseif((i==65||i==66||i==67||i==68)&&j!
=0)
{
break;
}
elseif((i==49||i==50||i==51||i==52||i==53||i==54)&&j!
=0)
{
i=i-55;//为了防止和数字键的ASCII码重复,减去55
j=getch();
break;
}
elsebreak;
}
while
(1);
returni;
}
/************************
功能:
光标移动
参数:
y,第几行;x,第几列
返回:
无
************************/voidset_cursor(inty,intx){
charyxstr[30];
sprintf(yxstr,"echo-ne\"\\33[%d;%dH\"",y,x);
system(yxstr);
}
/*************************************
功能:
输入函数
参数:
charstr[],存放输入的内容;
intmax,输入的最大个数
intx,inty,输入的坐标
intsign,0为正常输入,1为密码输入,2为数字输入返回:
无
**************************************/
voidinput(charstr[],intmax,intx,inty,intsign)
{
intcount=0;//记录当前有效字符个数
inta=0;//获取ascii值
inti=0;
set_cursor(x,y);
do
{
a=my_getch();
if(a!
=13&&a!
=127&&count{
if(sign==2)
{
if(a>='0'&&a<='9')
{
str[count]=a;
printf("%c",a);
fflush(stdout);
count++;
}
}
else
{
str[count]=a;
if(sign==0)
printf("%c",a);
elseprintf("*");
fflush(stdout);
count++;
}
}
elseif(a==127)
{
count--;
if(count<0)
{
count=0;
set_cursor(x,y);
}
else
{
printf("\b\b");
fflush(stdout);
}
}
elseif(a==13&&count>=1)
{
str[count]='\0';
break;
}
}
while
(1);
}
/*************************************
功能:
获取系统时间
参数:
无
返回:
无
**************************************/
voidget_sys_date(){
time_ttimep;
structtm*p;
time(&timep);
p=gmtime(&timep);
sys_year=1900+p->tm_year;
sys_mon=1+p->tm_mon;
sys_day=p->tm_mday;}
/*************************************
功能:
打印文字
参数:
intx,行
inty,列
charstr[],文字内容
返回:
无
**************************************/
voidprint_words(intx,inty,charstr[])
{
set_cursor(x,y);
printf("%s",str);
fflush(stdout);
}
/*************************************
功能:
打印边框
参数:
introw,边框起始行坐标
inth,边框高度
返回:
无
**************************************/
voidprint_border(introw,inth){
inti=0;
print_words(row,1,"?
");
for(i=3;i{
printf("=");
fflush(stdout);
}
printf("?
");
fflush(stdout);
for(i=1;i{
print_words(row+i,1,"?
");
print_words(row+i,Width-1,"?
");
}
print_words(row+h-1,1,"?
");
for(i=3;i{
printf("=");
fflush(stdout);
}
printf("ByZH%04d-%02d-%02d",sys_year,sys_mon,sys_day);
fflush(stdout);
printf("===?
");
fflush(stdout);
//打印信息框
print_words(row+h-4,(Width-10)/2,"MessageBox");
set_cursor(row+h-4,3);
for(i=2;i<(Width-10)/2-1;i++)
{
printf("=");
fflush(stdout);
}
set_cursor(row+h-4,(Width-10)/2+10);
for(i=0;i<(Width-10)/2-1;i++)
{
printf("=");
fflush(stdout);
}
}
/*************************************
功能:
打印标题头
参数:
char*s_title,标题内容
introw,标题头起始行坐标
返回:
无
**************************************/
voidprint_title_head(char*s_title,introw)
{
intlen=strlen(s_title)+2;
intcol=(Width-len)/2;//计算居中位置
inti=0;
set_cursor(row,col+1);
for(i=0;i{
printf("*");
fflush(stdout);
}
set_cursor(row+1,col+1);
printf("*%s*",s_title);
fflush(stdout);
set_cursor(row+2,col+1);
for(i=0;i{
printf("*");
fflush(stdout);
}
}
/*************************************功能:
清空
参数:
intx,清空的行坐标
inty,清空的列坐标
intn,清空长度
返回:
无
***********