⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 自己写的一个简易成绩管理系统,相当简单
💻 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,&reg,&reg);
    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 + -