电话本管理系统

该系统是本人课程设计作业,因为时间关系,只用了两天多的时间编成。所以有很多地方没有得到增强。版本为1.0。现作以下升级。

增加NEW,OPEN版本。

提高输入容错。判断输入的对错。

时间关系,搜索功能为线性搜索,现增强如下:f_search:费氏查找法;btree:二叉树查找法;l_search:线性查找法;
r_search:递归折半查找法;zcsear:杂凑碰撞查找法;o_sear:插补查找加强法;
排序是冒泡法,现增强为:heaps:累堆排序;binary:二叉树排序;xieer:谢耳排序;sinsert:插入排序;quicks:快速排序;select:选择排序法;

有时间不仿试试。

/*-----------------------------------------------------------------------------------------------------*/

共享代码是这个编程世界的主题!

/*-----------------------------------------------------------------------------------------------------*/

/*------------------------------宏定义-------------------------------------*/

#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>

/*-----------------------------函数声明--------------------------------------*/
void Showms(int);           /*显示个数和页数*/
void SHOW(int,int );     /*显示记录*/
void Init();      /*初始化图形模式*/
void Drawwin(int,int,int,int,int);   /*画图*/
void Load();      /*初始化数据*/
void Paswrd();      /*输入密码*/
void Kernel();      /*核心算法*/
void Draw();      /*画图*/
void Win(int x,int y,int l,int w);   /*画3D*/
void HELP();      /*帮助函数*/
void EDIT();      /*编辑函数*/
void DELETE();      /*删除函数*/
int ADD();      /*添加函数*/
void SORT();      /*排序函数*/
void SEARCH();      /*搜索函数*/
void Loadfile();     /*初始化文件*/
void Savesm() ;      /*记录总数*/
void Quick( );      /*冒泡排序*/
int PAGEUP(int page,int);    /*翻页函数*/
int PAGEDM(int page,int );


#define Move printf("/n/n/n/n/n/n/n/n/n")  /*换行*/
#define ON 1      /*定义开关*/
#define OFF 0
/*-------------------------------定义热键----------------------------------*/
#define ESC 27
#define F2 60
#define A 97
#define S 115
#define O 111
#define H 104
#define E 101
#define D 100
#define Pageup 73
#define Pagedm  81
#define ALL 100      /*文件个数*/


char *red[]={"      A","D","E","S","o","H"};                    /*热键显示*/
char *f[]={"      Add","Delete","Edit","Search","Sort","Help"};   /*显示菜单*/
char *Hel[]={"ESC:             QUIT",                             /*Help内容*/
    "A  :              ADD",
    "D  :           DELETE",
    "E  :             EDIT",
    "S  :           SEARCH",
    "O  :             SORT",
    "H  :             HELP",
    "PAGEDOWN:            ",
    "PAGEUP:              ",
    "Fuction sort:        ",
    "     ESC:     restore"   };
typedef struct Telms                                       /*建立数组*/
{
 char name[15];
 char telnum[15];
 char Email[20];
 char workpl[30];

}Message;

int sum[1],pg=1;                                               /*文件个数*/
void *buffer,*buff;                                            /*记录画面指针*/

 


Message msg[ALL],msgtem[ALL];   /*msg为记录文件数组,msgtem为暂时记录排序数组*/

/*-------------------------------主函数---------------------------------*/
main()
{
 Paswrd();                                                   /*读入并检验密码*/
 Init();                                     &nb

bsp;               /*初始文件和界面*/
 Kernel();                                                   /*核心*/

}

/*-----------------------------初始化图形模式-----------------------------------*/
void Init()
{
 int driver=DETECT,mode,code;
 int i;

 registerbgidriver(EGAVGA_driver);                           /*初始化图形模式*/

 initgraph(&driver,&mode,"");

 code=graphresult();
 if(code!=grOk)
 {
  printf("/nGraphics System Error:%s/n",grapherrormsg(code));
  getch();
  exit(0);
 }

 Drawwin(100,100,439,250,ON);           /*画图*/
 Drawwin(120,120,399,210,OFF);
 Drawwin(350,150,150,150,ON);

 setcolor(DARKGRAY);
 settextstyle(0,0,8);
 outtextxy(145,179,"TBS");

 setcolor(RED);
 outtextxy(140,173,"TBS");

 setcolor(LIGHTBLUE);
 settextstyle(0,0,2);
 outtextxy(145,310,"Telephone Book System");
 setcolor(RED);
 settextstyle(0,0,1);
 outtextxy(260,245,"Version 1.0");
 setcolor(BLUE);
 settextstyle(0,0,1);
 outtextxy(360,175,"Foshan University");
 outtextxy(380,190,"03 Computer 2");
 outtextxy(387,205,"2003314241");
 outtextxy(380,220,"Liang Weijian");
 Load();                  /*初始化数据*/
 while(!kbhit());                                         /*按键退出*/
 closegraph();                /*关闭图形模式*/
}


/*-----------------------------3D界面------------------------------------------------*/
void Drawwin(int x,int y,int l,int w,int sta)
{

 setfillstyle(1,LIGHTGRAY);
 bar(x+1,y+1,x+l-1,y+w-1);


 setcolor((sta==ON)?WHITE:DARKGRAY);
 moveto(x,y+w);
 lineto(x,y);
 lineto(x+l,y);

 setcolor((sta==OFF)?WHITE:DARKGRAY);
 moveto(x,y+w);
 lineto(x+l,y+w);
 lineto(x+l,y);

}

/*-------------------------------文件读入-----------------------------------------*/
void Load()
{

 int i,tem=0;
 FILE* fp;

 setcolor(RED);
 outtextxy(365,265,"Load......");
 setfillstyle(1,GREEN);
 bar(351,280,498,290);

 if((fp=fopen("sum.dat","rb"))==NULL)    /*打开sum[0]文件,无,建立*/
 {
  fp=fopen("sum.dat","wb");
  sum[0]=0;
  fwrite(&sum,sizeof(sum[0]),1,fp);
  fp=fopen("sum.dat","rb");
 }
 fread(&sum[0],sizeof(sum),1,fp);
 fclose(fp);

 if((fp=fopen("TBS.dat","rb"))==NULL)    /*打开TBS文件,无,建立*/
 {
  fp=fopen("TBS.dat","wb");
  fp=fopen("TBS.dat","rb");
 }

 for(i=0;i<147;i++)
 {
  setfillstyle(1,LIGHTGREEN);
  bar(351,280,351+i,290);
  delay(1000+tem*100);
  if(tem<sum[0])
  {
   fread(&msg[tem],sizeof(msg),1,fp);  /*初始化数据*/
   tem++;
  }
  }
 fclose(fp);
 setfillstyle(1,LIGHTGRAY);
 bar(351,260,498,290);
 settextstyle(0,0,1);

 setcolor(RED);
 outtextxy(375,260,"Press any key!");
 while(!kbhit());

}
/*--------------------------------输入密码---------------------------------*/
void Paswrd()
{
 char *passwrd,*Right="handy";
 char temp[9];
 int i=0;

 Move;                    /*换行*/

 printf("                     Thank you for using this system!/n/n");
 passwrd=getpass("                      Input a password (Not show):");
 strcpy(temp,passwrd);

 while(1)
 {
  Move;

  if(strcmp(temp,Right)!=0)
  {
   i++;
   clrscr();
   Move;
   passwrd=getpass("                         Worry!Input again:");
   strcpy(temp,passwrd);
  }
  else
  {
   clrscr();
   break;
  }
  clrscr();
  if(i==3)
  {
   Move;
   printf("                    Sorry!You have enter three times password!/n");
   printf(" Press any key!");
   getch();
   exit(0);
  }


 }

}

/*-------------------------------核心算法----------------------------------*/
void Kernel()
{

 char Key;                  /*记录按键*/
 int page=1,i;
 FILE *fp;
 Draw();                   /*画图*/
 buffer=(void *)malloc(2*80*23);
 gettext(1,1,80,23,buffer);             /*记录画面*/
 buff=(void *)malloc(2*80*2);
 gettext(1,23,80,23,buff);
 if(sum[0]%19==0&&sum[0]!=0)            /*计算总页数*/
  pg=sum[0]/19;                /*刚好满页*/
 else
  pg=sum[0]/19+1;               /*不够一页,当一页*/

 SHOW(page,ON);                 /*显示信息,ON为msg,OFF为排序用的*/
 while(1)                   /*进入循环*/
 {
  SHOW(page,ON);
  Showms(page);


  while(!kbhit());                 /*获取按键*/
  Key=getch();

  switch(Key)
  {
   case A:page=ADD();break;
   case D:DELETE();break;
   case S:SEARCH();break;
   case O:SORT();break;
   case E:EDIT();break;
   case H:HELP();break;
   case Pageup:page=PAGEUP(page,ON);break;
   case Pagedm:page=PAGEDM(page,ON);break;
   case ESC:
    fp=fopen("TBS.dat","wb");
    for(i=0;i<sum[0];i++)
     fwrite(&msg[i],sizeof(Message),1,fp);
    fclose(fp);
    free(buffer);
    free(buff);
    clrscr();
    exit(0);
    break;
  }

  }


}

/*----------------------------文本模式下的画面----------------------------*/
void Draw()
{
 int x,y,i,l;
 textmode(C80);
   textbackground(BLACK);
 window(1,1,80,23);
 textbackground(WHITE);
 window(1,24,80,24);
 clrscr();


 for(i=0;i<6;i++)
 {
  x=wherex();
  y=wherey();

  textcolor(BLACK);
  cprintf("%s",f[i]);
  l=strlen(f[i]);
  gotoxy(x,y);
  textcolor(RED);
  if(i==4)
  {
   gotoxy(x+1,y);
   cprintf("%s",red[i]);
  }
  else
   cprintf("%s",red[i]);
  x=x+l+8;
  gotoxy(x,y);
 }
 textbackground(BLACK);
 window(1,1,80,23);
 Win(1,1,78,21);

 textcolor(YELLOW);
 gotoxy(7,2);
 cprintf("Name");
 gotoxy(22,2);
 cprintf("Telphone");
 gotoxy(43,2);
 cprintf("QQ");
 gotoxy(60,2);
 cprintf("Workplace");
 textcolor(WHITE);


}
/*---------------------------文本模式下的作图-------------------------------*/
void Win(int x,int y,int l,int w)
{
 int i,j;
 gotoxy(x,y);
 putch(213);
 for(j=0;j<2;j++)
 {
  for(i=0;i<15;i++)       putch(205);
  putch(209);
 }
 for(i=0;i<20;i++) putch(205);
 putch(209);
 for(i=0;i<25;i++) putch(205);
 putch(184);

 for(i=0;i<20;i++)
 {
  gotoxy(x,y+1+i);
  putch(179);
  gotoxy(17,y+1+i);
  putch(179);
  gotoxy(33,y+1+i);
  putch(179);
  gotoxy(54,y+1+i);
  putch(179);
  gotoxy(x+l+1,y+1+i);
  putch(179);
 }

 gotoxy(x,y+w);
 putch(192);
 for(j=0;j<2;j++)
 {
  for(i=0;i<15;i++)       putch(196);
  putch(193);
 }
 for(i=0;i<20;i++) putch(196);
 putch(193);
 for(i=0;i<25;i++) putch(196);
   putch(217);
 textcolor(WHITE);
}

/*--------------------------------显示帮助信息-----------------------------*/
void HELP()
{
 void *buf;
 int i;

 buf=(void *)malloc(2*80*24);
 gettext(1,1,80,23,buf);
 puttext(1,1,80,23,buffer);

 textcolor(YELLOW);
 textbackground(BLUE);
 for(i=0;i<11;i++)
 {
  gotoxy(27,7+i);
  cprintf("%s",Hel[i]);
 }

 while(!kbhit());
 textbackground(BLACK);

 puttext(1,1,80,23,buf);
 textcolor(WHITE);

 free(buf);

}

/*----------------------------------修改函数------------------------------*/
void EDIT()
{
 char name[20];
 Message t[1];
 FILE* fp=fopen("TBS.dat","wb");
 int i,find=0,num=0;

   gotoxy(1,23);
 delline();
 cprintf("Name:");                                             /*读取要编辑的名字*/
 cscanf("%s",&name);                                           /*比较文件*/
 for(i=0;i<sum[0];i++)
 {
  if(strcmp(name,msg[i].name)==0)
  {                                                          /*找到 find=1*/
   find=1;                                                 /*num记录位置*/
   num=i;
  }
 }
 puttext(1,23,80,23,buff);
 if(find!=1)
 {
  gotoxy(1,23);
  delline();
  cprintf("Not found");
  while(!kbhit() );
 }
 else
 {
  gotoxy(1,23);                                              /*重新输入*/
  cprintf("New name:");
  cscanf("%s",t[0].name);
  delline();

  cprintf("Telphoto number:");
  cscanf("%s",t[0].telnum);
  delline();

  cprintf("QQ:");
  cscanf("%s",t[0].Email);
  delline();

  cprintf("Work place:");
  cscanf("%s",t[0].workpl);
  delline();

  strcpy(msg[num].name,t[0].name);                          /*复制*/
  strcpy(msg[num].telnum,t[0].telnum);
  strcpy(msg[num].workpl,t[0].workpl);
  strcpy(msg[num].Email,t[0].Email);

  for(i=0;i<sum[0];i++)                                     /*写入文件*/
  fwrite(&msg[i],sizeof(Message),1,fp);
  fclose(fp);
  cprintf("success!");
  while(!kbhit());
  SHOW(1,ON);
 }

}

/*-----------------------------删除函数-----------------------------------*/
void DELETE()
{

 FILE *fp;
 char name[20];
 int i,num=0,find=0;

 gotoxy(1,23);
 delline();
 cprintf("Name:");
 cscanf("%s",&name);                                        /*读取要删除的名字*/

 for(i=0;i<sum[0];i++)
 {                                                          /*搜索*/
  if(strcmp(name,msg[i].name)==0)
  {
   find=1;
   num=i;
   break;
  }
 }

 if(find!=1)
 {
  gotoxy(1,23);
  delline();
  cprintf("Not found");
  while(!kbhit() );
 }
 else
 if(num==sum[0]&&sum[0]>0)
 {
  sum[0]--;
 }
 else
 {

  for(i=num;i<sum[0];i++)                                 /*写入文件*/
  {
   strcpy(msg[i].name,msg[i+1].name);
   strcpy(msg[i].telnum,msg[i+1].telnum);
   strcpy(msg[i].workpl,msg[i+1].workpl);
   strcpy(msg[i].Email,msg[i+1].Email);
  }
  sum[0]--;
 }
 fp=fopen("TBS.dat","wb");
 for(i=0;i<sum[0];i++)
  fwrite(&msg[i],sizeof(Message),1,fp);
 fclose(fp);
 Savesm();
 SHOW(1,ON);
}
/*---------------------------------添加函数-------------------------------*/
int ADD()
{
 FILE* fp;
 int i;

 Message t[1];


 puttext(1,23,80,23,buff);

 gotoxy(1,23);                                               /*读取信息*/
 cprintf("New name:");
 cscanf("%s",t[0].name);
 delline();

P> cprintf("Telphoto number:");
 cscanf("%s",t[0].telnum);
 delline();

 cprintf("QQ:");
 cscanf("%s",t[0].Email);
 delline();

 cprintf("Work place:");
 cscanf("%s",t[0].workpl);
 delline();
 sum[0]++;
 strcpy(msg[sum[0]-1].name,t[0].name);
 strcpy(msg[sum[0]-1].Email,t[0].Email);
 strcpy(msg[sum[0]-1].workpl,t[0].workpl);
 strcpy(msg[sum[0]-1].telnum,t[0].telnum);

 fp=fopen("TBS.dat","wb");
 for(i=0;i<sum[0];i++)
  fwrite(&msg[i],sizeof(Message),1,fp);
 fclose(fp);
 Savesm();
 cprintf("Success!");
 while(!kbhit());
 puttext(1,1,80,23,buffer);
 if(sum[0]%19==0&&sum[0]!=0)
  pg=sum[0]/19;
 else
  pg=sum[0]/19+1;

 return pg;
}

/*----------------------------排序函数-----------------------------------*/
void SORT()
{
 int Key,i,p=1;
 FILE *fp=fopen("TBS.dat","rb");
 for(i=0;i<sum[0];i++)
  fread(&msgtem[i],sizeof(Message),1,fp);              /*更新信息,写入msgtem*/
 fclose(fp);

 Quick();                                                /*排序*/
 while(1)
 {
  SHOW(p,OFF);
  Showms(p);
  while(!kbhit());
  Key=getch();
  switch(Key)
  {
   case Pageup:p=PAGEUP(p,OFF);break;
   case Pagedm:p=PAGEDM(p,OFF);break;
   case ESC:goto AA;
  }
 }
 AA:;
}

/*----------------------------搜索函数-----------------------------------*/
void SEARCH()
{
  char name[20];
   int i,find=0,num=0;
 FILE* fp=fopen("TBS.dat","rb");

 for(i=0;i<sum[0];i++)
  fread(&msg[i],sizeof(Message),1,fp);
 fclose(fp);

 fp=fopen("sum.dat","rb");
 fread(&sum[0],sizeof(Message),1,fp);
 fclose(fp);

 gotoxy(1,23);
 delline();
 cprintf("Name or Telphone:");
 cscanf("%s",&name);
 for(i=0;i<sum[0];i++)
 {
  if(strcmp(name,msg[i].name)==0||strcmp(name,msg[i].telnum)==0)
  {
   find=1;
   num=i;
   break;
  }
 }

 if(find!=1)
 {
  gotoxy(1,23);
  delline();
  cprintf("Not found");
  while(!kbhit() );
 }
 else
 {
  gotoxy(1,23);
  delline();
  cprintf("Result:");
  cprintf("    %s",msg[num].name);
  cprintf("       %s",msg[num].telnum);
  cprintf("       %s",msg[num].Email);
  cprintf("       %s",msg[num].workpl);
  while(!kbhit());
 }
}

 

/*----------------------------显示电话本信息---------------------------------*/
void SHOW(int page,int sta)
{

 int i,pages=0,n,n1,j=0;
   FILE* fp=fopen("TBS.dat","rb");
   for(i=0;i<sum[0];i++)
  fread(&msg[i],sizeof(Message),1,fp);
   fclose(fp);


 n=sum[0]%19;                                        /*该页行数*/
 pages=sum[0]/19+1;                    /*页数*/
 puttext(1,1,80,23,buffer);
 textcolor(WHITE);
 if(n==0&&sum[0]!=0)
 {
  n=19;
  pages--;
 }

 if(pg==1)
 {
  i=0;
  n1=n;
 }
 else
 if(page<pg)
 {
  i=(page-1)*19;
  n1=(page-1)*19+19;
 }
 else
 if(page==pg)
 {
  i=(page-1)*19;
  n1=(page-1)*19+n;
 }

 if(sta==ON)                                           /*ON为文件内容,off为排序后的内容*/
 {
  if(sum[0]!=0)
  for(;i<n1;i++)
  {
   gotoxy(2,3+j);
   cprintf("%s",msg[i].name);
   gotoxy(18,3+j);
   cprintf("%s",msg[i].telnum);
   gotoxy(34,3+j);
   cprintf("%s",msg[i].Email);
   gotoxy(55,3+j);
   cprintf("%s",msg[i].workpl);
   j++;
  }
 }
 else
 {
  if(sum[0]!=0)
   for(;i<n1;i++)
   {
    gotoxy(2,3+j);
    cprintf("%s",msgtem[i].name);
    gotoxy(18,3+j);
    cprintf("%s",msgtem[i].telnum);
    gotoxy(34,3+j);
    cprintf("%s",msgtem[i].Email);
    gotoxy(55,3+j);
    cprintf("%s",msgtem[i].workpl);
j++;
   }
 }

}
/*----------------显示信息-----------------*/
void Showms(int apg)
{

 if(sum[0]%19==0&&sum[0]!=0)
  pg=sum[0]/19;
 else
  pg=sum[0]/19+1;

 gotoxy(1,23);
 cprintf("Total:%d     Page :%d/%d   ",sum[0],apg,pg);
}
/*------------------------------记录sum-------------------------------------*/
void Savesm()
{
 FILE* fp;
 fp=fopen("sum.dat","wb");
 fwrite(&sum[0],sizeof(sum),1,fp);
 fclose(fp);
}
/*-------------------------------冒泡排序------------------------------------*/
void Quick()
{
 int i,j;
 char name[20];
 Message tem[1];

 for(j=0;j<sum[0]-1;j++)
  for(i=0;i<sum[0]-1-j;i++)
  {
   if(strcmp(msgtem[i].name,msgtem[i+1].name)>0)
   {
    strcpy(tem[0].name,msgtem[i].name);
    strcpy(tem[0].telnum,msgtem[i].telnum);
    strcpy(tem[0].Email,msgtem[i].Email);
    strcpy(tem[0].workpl,msgtem[i].workpl);

    strcpy(msgtem[i].name,msgtem[i+1].name);
    strcpy(msgtem[i].telnum,msgtem[i+1].telnum);
    strcpy(msgtem[i].Email,msgtem[i+1].Email);
    strcpy(msgtem[i].workpl,msgtem[i+1].workpl);

    strcpy(msgtem[i+1].name,tem[0].name);
    strcpy(msgtem[i+1].telnum,tem[0].telnum);
    strcpy(msgtem[i+1].Email,tem[0].Email);
    strcpy(msgtem[i+1].workpl,tem[0].workpl);
   }
  }
}

/*-----------------------------------向下翻屏------------------------------------------*/


int PAGEUP(int page,int sta)
{
 int n=page;
 if(pg==page)
  goto AA;
 else
 {
  page++;
  n++;
 }
 puttext(1,1,80,23,buffer);
 AA:SHOW(n,sta);
 return page;

}

/*-----------------------------------向上翻屏-----------------------------------------*/
int PAGEDM(int page,int sta)
{
 int n=page;
 if(page==1)
  goto AA;
 else
 {
  page--;
  n--;
 }
 puttext(1,1,80,23,buffer);
 AA:SHOW(n,sta);
 return page;
}

           

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值