📄 menu.c
字号:
/*头文件*/
#include"stdio.h"
#include"dos.h"
#include"stdlib.h"
#include"conio.h"
/*宏替换*/
#define P 0X19
#define F 0X21
#define H 0X23
#define M 0X32
#define X 0X2D
#define ESC 0X01
#define LEFT 0X4B
#define RIGHT 0X4D
#define UP 0X48
#define DOWN 0X50
#define ENTER 0X1C
#define F1 0X3B
#define F4 0X3E
#define F10 0x44
#define LEN sizeof(struct student)
/*简单数据结构*/
struct student
{ unsigned long num;
float score;
struct student *next;
};
struct student *head=NULL;
char Mainmenu[3][7]={"File","Mana","Help"};
char Fmenu[3][5][7]={
{"Load","Quit","","",""},
{"Create","Insert","Delete","Find","Print"},
{"Help","Other","","",""}
};
int menulen[3]={2,5,2};
char buf[10*7*2],buf0[10*7*2];
int Quit=0;
/*函数说明*/
Frame();
Menu();
Sortmenu();
ShowFmenu();
Getkey();
Carryon();
Print();
Creat();
Find();
Del();
Insert();
Other();
Help();
Load();
/*主函数*/
main()
{
int i;
Menu();
Clr();
Help();/*帮助提示*/
getch();
Clr();
head=NULL;
do
{
i=Sortmenu();/*选择要执行的函数*/
Clr();
Carryon(i);/*执行该函数*/
}while(Quit!=1);
getch();
}
/*主菜单*/
Menu()
{
int i=0;
textbackground(BLUE);
clrscr();
window(1,1,80,1);
textbackground(WHITE);
textcolor(BLACK);
clrscr( );
for(i=0;i<3;i++)
cprintf("%s ",Mainmenu[i]);
window(1,1,80,25);
textbackground(BLUE);
}
/*画边框*/
Frame(int left,int top,int right ,int but)
{
int i,j;
gotoxy(left,top);
putch(0xda);
for(i=left+1;i<right;i++)putch(0xc4);/*输出'-'*/
putch(0xbf);
for(j=top+1;j<but;j++)
{
gotoxy(left,j);
putch(0xb3); /*输出'|'*/
gotoxy(right,j);
putch(0xb3);
}
gotoxy(left,but);
putch(0xc0);
for(i=left+1;i<right;i++)putch(0xc4);
putch(0xd9);
}
/*取得键值*/
int Getkey()
{
union REGS reg;
reg.h.ah=0;
int86(0x16,®,®);
return reg.h.ah;
}
/*下拉菜单*/
ShowFmenu(int m)
{
int i=0;
window(m*10+1,2,m*10+10,menulen[m]+3);
textbackground(WHITE);
clrscr();
textcolor(BLACK);
window(m*10+1,2,m*10+10,menulen[m]+4);
Frame(1,1,10,menulen[m]+2);
for(i=1;i<=menulen[m];i++)
{
gotoxy(2,i+1);
cprintf("%s",Fmenu[m][i-1]);
}
textbackground(BLACK);
textcolor(WHITE);
gotoxy(2,2);
cprintf("%s",Fmenu[m][0]);
gettext(m*10+1,2,m*10+10,menulen[m]+4,buf);
clrscr();
puttext(m*10+1,2,m*10+10,menulen[m]+4,buf);
window(1,1,80,25);
textbackground(BLUE);
}
/*************************判断选择那个执行菜单****************/
int Sortmenu()
{
/*flag:-1没有任何选择,0表示在主菜单上,1表示在下拉菜单上*,2表示已选择好执行函数*/
/*mm:-1选择不在任何一列上,0表示在第一个下拉菜单,1表示在第二个下拉菜单上,2类推*/
/*row:表示所在的行*/
int key=0,flag=-1;
int mm=-1,row=0;
while(flag!=2) {
if(flag==-1){
while(bioskey(1)==0);
key=Getkey();
switch(key){
case F10:flag=0;mm=0;row=1;
textbackground(BLACK);
textcolor(WHITE);
gotoxy(1,1);
cprintf("File");
textbackground(BLUE);
Clr();
gettext(mm*10+1,2,mm*10+10,8,buf0);
break;
case F:{
flag=1;mm=0;row=3;
textbackground(BLACK);
textcolor(WHITE);
gotoxy(mm*10+1,1);
cprintf("%s",Mainmenu[mm]);
Clr();
gettext(mm*10+1,2,mm*10+10,8,buf0);
ShowFmenu(mm);
break;
}
case M: {
flag=1;mm=1;row=3;
textbackground(BLACK);
textcolor(WHITE);
gotoxy(mm*10+1,1);
cprintf("%s",Mainmenu[mm]);
Clr();
gettext(mm*10+1,2,mm*10+10,8,buf0);
ShowFmenu(mm);
break;
}
case H: {
flag=1;mm=2;row=3;
textbackground(BLACK);
textcolor(WHITE);
gotoxy(mm*10+1,1);
cprintf("%s",Mainmenu[mm]);
Clr();
gettext(mm*10+1,2,mm*10+10,8,buf0);
ShowFmenu(mm);
break;
}
case P:mm=1;row=7;flag=2;return (mm*10+row);
case F4: Quit=1;mm=-1;row=0;return;
case ESC:Clr();break;
} /*结束switch语句*/
} /*end of while(flag==-1)*/
if(flag==0){ /*flag==0表示键在主菜单上 */
while(bioskey(1)==0);
key=Getkey();
switch(key)
{
case LEFT:
case RIGHT: flag=0;row=1;
textbackground(WHITE);
textcolor(BLACK);
gotoxy(mm*10+1,1);
cprintf("%s",Mainmenu[mm]);
if(key==LEFT)
mm=mm<=0?mm+3-1:mm-1;
else if(key==RIGHT)
mm=mm>=2?mm-3+1:mm+1;
textbackground(BLACK);
textcolor(WHITE);
gotoxy(mm*10+1,1);
cprintf("%s",Mainmenu[mm]);
break;
case ENTER:
case DOWN:row=3;
flag=1;
ShowFmenu(mm);
break;
case ESC:
Clr();
textbackground(WHITE);
textcolor(BLACK);
gotoxy(mm*10+1,1);
cprintf("%s",Mainmenu[mm]);
mm=-1;
row=0;
flag=-1;
break;
}
}
else
if(flag==1) /* flag==1 表示键在下拉菜单上*/
{ while(bioskey(1)==0);
key=Getkey();
switch(key)
{
case UP:
case DOWN:
textbackground(WHITE);
textcolor(BLACK);
gotoxy(mm*10+2,row);
cprintf("%s",Fmenu[mm][row-3]);
if(key==UP)
row=row<=3?row+menulen[mm]-1:row-1;
else if(key==DOWN)row=row>=menulen[mm]+2?row-menulen[mm]+1:row+1;
textbackground(BLACK);
textcolor(WHITE);
gotoxy(mm*10+2,row);
cprintf("%s",Fmenu[mm][row-3]);
break;
case LEFT:
case RIGHT:
textbackground(WHITE);
textcolor(BLACK);
gotoxy(mm*10+1,1);
cprintf("%s",Mainmenu[mm]);
puttext(mm*10+1,2,mm*10+10,8,buf0);
if(key==LEFT)
mm=mm<=0?mm+3-1:mm-1;
else
mm=mm>=2?mm-3+1:mm+1;
row=3;
ShowFmenu(mm);
break;
case ESC:
puttext(mm*10+1,2,mm*10+10,8,buf0);
textbackground(BLACK);
textcolor(WHITE);
gotoxy(mm*10+1,1);
cprintf("%s",Mainmenu[mm]);
flag=0;
row=1;
break;
case ENTER:flag=2;
clrscr();
Menu();
return (mm*10+row);
} /*结束switch*/
} /*结束if*/
}/*end of while(flag!=2) */
}
Carryon(int i)
{
int row,mm;
mm=i/10;
row=i%10;
switch(mm){
case 0:switch(row)
{
case 3:Load();break;
case 4: Quit=1;return;
}
break;
case 1:switch(row)
{
case 3:Creat();break;
case 4:Insert();break;
case 5:Del();break;
case 6:Find();break;
case 7:Print();break;
}
break;
case 2:switch(row)
{
case 3:Help(); break;
case 4:Other();break;
}
break;
}
}
Clr()
{
textbackground(BLUE);
textcolor(WHITE);
gettext(1,1,80,1,buf);
clrscr();
puttext(1,1,80,1,buf);
}
/*create the list*/
Creat()
{
struct student *p1,*p2;
unsigned long num;
float score;
int key;
char c;
head=NULL;
printf("\nCreate New information(Y/N)?");
while(bioskey(1)==0);
c=getchar();
if(c!='Y'&&c!='y')return;
printf("\nPlease Input Information Of Students:\n");
p1=p2=(struct student * )malloc(LEN);
if(p1==NULL){ printf("No buf!");return;}
printf("Number:");
scanf("%lu%*c",&num);
p1->num=num;
printf("Score:");
scanf("%f%*c",&score);
p1->score=score;
head=p1;
p2=p1;
printf("Continue?(Y/N):");
c=getchar();
if(c!='Y'&&c!='y'){p2->next=NULL;return;}
do
{
p1=(struct student*)malloc(LEN);
printf("\nPlease Input Information Of Students:\n");
cprintf("Number:");
scanf("%lu%*c",&(p1->num));
cprintf("Score:");
scanf("%f%*c",&(p1->score));
p2->next=p1;p2=p1;
printf("Continue?(Y/N):");
c=getchar();
}while(c=='Y'||c=='y');
p2->next=NULL;
/*for(p1=head;p1!=NULL;p1=p1->next)
printf("%lu,%f\n",p1->num,p1->score); */
}
/*insert in list*/
Insert()
{
struct student *p1, *p2;
char c;
for(p2=head;p2->next!=NULL;p2=p2->next);
do
{
p1=(struct student*)malloc(LEN);
printf("\nPlease Input Information Of Students to Insert:\n");
printf("Number:");
scanf("%lu%*c",&(p1->num));
printf("Score:");
scanf("%f%*c",&(p1->score));
if(head==NULL)
{
head=p1;
p2=p1;
p1->next=NULL;
}
else
{ p2->next=p1;
p2=p1;
}
printf("Continue?(Y/N):");
c=getchar();
}while(c=='Y'||c=='y');
p2->next=NULL;
}
/*delete a node*/
Del()
{
struct student *p1,*p2;
unsigned long num;
char c;;
if(head==NULL)
{
printf("\nList null!\n");
return;
}
p1=head;
do
{
printf("\nInput the Number to Delete:");
scanf("%lu%*c",&num);
while(p1->num!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->num)
{
if(p1==head)head=p1->next;
else p2->next=p1->next;
printf("\nDelete Student %lu Succeed!",num);
free(p1);
}
else
printf("\nStudent %lu Not been Found!\n",num);
printf("Continue?(Y/N):");
c=getchar();
}while(c=='Y'||c=='y');
}
/*find a node in the list*/
Find()
{
struct student *p1;
unsigned long num;
if(head==NULL)
{
printf("\n List null!\n");
return;
}
printf("\nInput the Number to Find:");
scanf("%lu",&num);
p1=head;
while(num!=p1->num&&p1->next!=NULL)p1=p1->next;
if(num==p1->num)
printf("\nFind!\nNum:%lu, Score=%5.2f\n",num,p1->score);
else
printf("\nStudent %lu not been Found!\n",num);
}
/*print the list*/
Print()
{
struct student *p;
int n=0;
for(p=head;p!=NULL;p=p->next,n++);
if(n==0)
{
Frame(30,8,50,12);
gotoxy(36,10);
printf("No Record!");
return;
}
printf("\nRecords Total: %d\n",n);
p=head;
printf("\nNum Score\n\n");
do
{ printf("%-15lu",p->num,p->score);
printf("%f\n",p->score);
p=p->next;
}while(p!=NULL);
}
Help()
{
Frame(20,6,60,16);
gotoxy(25,8);
printf("F1----HELP F10-----MENU");
gotoxy(25,10);
printf("F4----QUIT P------PRINT");
gotoxy(25,12);
printf("F-----FILE M-------MANA");
gotoxy(25,14);
printf("H-----HELP ESC---RETURN");
}
Load()
{
Frame(30,8,50,12);
gotoxy(36,10);
printf("No File!"); /*此模块可用于文件处理*/
}
Other()
{
Frame(30,8,50,12);
gotoxy(36,10);
printf("Other!"); /*此模块可添加其他功能*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -