日志文章

2006年12月13日 17:13:33

C语言通讯录

/*3. 源程序*/
/***dsdemo.c演示系统***/
#include<stdlib.h>
#include<graphics.h>
#define ESC 0x011b
#define ENTER 0x1c0d
#define DOWN 0x5000
#define UP 0x4800
#include "stdio.h"   /*I/O函数*/
#include "stdlib.h" /*标准库函数*/
#include "string.h"/*字符串函数*/
#include "ctype.h" /*字符操作函数*/
#define M 50 /*定义常数表示记录数*/
typedef struct /*定义数据结构*/
{
  char name[20]; /*姓名*/
  char units[30]; /*单位*/
  char tele[10]; /*电话*/
}ADDRESS;
struct Snow/*雪的一些参数*/
{
  int x;
  int y;
  int speed;/*雪花的速度*/
}snow[100];
struct Star/*星星的一些参数*/
{
  int x;
  int y;
  int color;
}star[200];
/******以下是函数原型*******/
int enter(ADDRESS t[]); /*输入记录*/
void list(ADDRESS t[],int n); /*显示记录*/
void search(ADDRESS t[],int n); /*按姓名查找显示记录*/
int delete(ADDRESS t[],int n); /*删除记录*/
int add(ADDRESS t[],int n); /*插入记录*/
void save(ADDRESS t[],int n); /*记录保存为文件*/
int load(ADDRESS t[]); /*从文件中读记录*/
void display(ADDRESS t[]); /*按序号查找显示记录*/
void sort(ADDRESS t[],int n); /*按姓名排序*/
void qseek(ADDRESS t[],int n); /*快速查找记录*/
void copy(); /*文件复制*/
void print(ADDRESS temp); /*显示单条记录*/
int find(ADDRESS t[],int n,char *s) ; /*查找函数*/
int menu_select(); /*主菜单函数*/
int key;/*按键变量*/
int keyx,keyy;/*选项键的坐标*/
int snownum=0;/*雪的个数*/
int size;/*保存区域的大小*/
int change=10;/*变颜色有关*/
void *save1,*save2;/*保存空间*/
void Copy(void);/*保存区域*/
void DrawSnow(void);/*具体实现*/
void Pr(void);/*输出字体*/
void Choose(void);/*选择演示内容*/
void DrawStar(void);/*最后的星星效果*/
void DrawBall(int x,int y,int color);/*画选择的球体*/
void Init(void);/*图形驱动*/
void Close(void);/*图形关闭*/
void main(void)
{
  Init();
  Copy();
  DrawSnow();/*雪花飘动*/
  Choose();/*选择演示内容*/
  DrawStar();/*结束画面*/
  Close();
  exit(0);
}
void Init(void)
{
  int gd=DETECT,gm;
  initgraph(&gd,&gm,"c:\\tc");
  cleardevice();
}
void Close(void)/*图形关闭*/
{
  getch();
  closegraph();
}
void Copy(void)/*保存区域*/
{
  setcolor(0);
  setfillstyle(SOLID_FILL,15);
  fillellipse(200,200,4,4);
  size=imagesize(196,196,204,204);/*定义保存图象区域大小*/
  save1=malloc(size);/*申请空间*/
  save2=malloc(size);
  getimage(196,196,204,204,save1);/*保存雪花*/
  getimage(96,96,104,104,save2); /*保存背景黑色*/
}
void Pr(void)/*在雪中输出文字*/
{
  settextstyle(0,0,1);
  if(change>=20&&change<=30||change>=50&&change<=60||
  change>=100&&change<=110)/*闪烁效果*/
    setcolor(YELLOW);
  else
    setcolor(BLACK);
  outtextxy(250,250,"anykey to continue");
  setcolor(change/10);/*变换颜色显示标题*/
  settextstyle(0,0,3);
  outtextxy(100,200,"Data Structure Demo");/*标题*/
}
/*显示雪花的具体过程*/
void DrawSnow(void)
{
  int i;
  int sx[62];
  randomize();
  for(i=0;i<62;i++) /*定义雪花的x坐标*/
    sx=(i+2)*10;
  cleardevice();
  while(!kbhit())
  {
    Pr();
    if(snownum!=100)/*生成新的雪花*/
    {
      snow[snownum].speed=2+random(5);/*速度随机定,但不小于2*/
      i=random(62);
      snow[snownum].x=sx;/*随机取x坐标*/
      snow[snownum].y=10-random(100);
    }
    for(i=0;i<snownum;i++)/*去雪*/
      putimage(snow.x,snow.y,save2,COPY_PUT);
    Pr(); /*显示标题*/
    if(snownum!=100)
      snownum++;
    setfillstyle(SOLID_FILL,15);/*画雪*/
    for(i=0;i<snownum;i++)
    {
      snow.y+=snow.speed;
      putimage(snow.x,snow.y,save1,COPY_PUT);
      if(snow.y>500)
        snow.y=10-random(200);
    }
    change++;
    if(change==140)/*颜色变化*/
      change=10;
  }
}
/*画选择的球体x和y为坐标,color为球的颜色*/
void DrawBall(int x,int y,int color)
{
  setcolor(0);
  setfillstyle(SOLID_FILL,color);
  fillellipse(x,y+10,10,10);
}
/*选择演示函数*/
void Choose(void)
{
  int yes;/*判断是否退出选项,1不退出0退出*/
  int oyes=1;
  int i;
  ADDRESS adr[M]; /*定义结构体数组*/
  int length; /*保存记录长度*/
  clrscr(); /*清屏*/
  /*for(;;)*//*无限循环*/
  while(oyes)
  {
    Init();
    cleardevice();
    yes=1;
    keyx=140;
    keyy=30;
    setcolor(11);
    rectangle(0,0,600,660);/*画边框线/
    setcolor(13);
    settextstyle(0,0,3);/*标题大一些*/
    outtextxy(10,10,"Data Structure Demo");
    settextstyle(0,0,2);/*其它选项小一些*/
    setcolor(RED);
    outtextxy(200,60,"Enter record");/*输入记录*/
    setcolor(BLUE);
    outtextxy(200,90," List the file");/*显示全部记录*/
    setcolor(GREEN);
    outtextxy(200,120,"Search record on name"); /*查找记录*/
    setcolor(YELLOW);
    outtextxy(200,150,"Delete a record"); /*删除记录*/
    setcolor(10);
    outtextxy(200,180,"add record");       /*插入记录*/
    setcolor(MAGENTA);
    outtextxy(200,210,"Save the file"); /*保存文件*/
    setcolor(RED);
    outtextxy(200,240,"Load the file");/*读文件*/
    setcolor(BLUE);
    outtextxy(200,270,"display record on order");/*按序号显示记录*/
    setcolor(GREEN);
    outtextxy(200,300,"sort to make new file"); /*按姓名排序*/
    setcolor(YELLOW);
    outtextxy(200,330,"Quick seek record"); /*快速查找记录*/
    setcolor(10);
    outtextxy(200,360,"copy the file to new file");       /*复制文件*/
    setcolor(WHITE);
    outtextxy(200,390,"exit");/*结束程序*/
    DrawBall(keyx,keyy,11);
    while(yes)
    /*选项的循环条件*/
    {
      key=bioskey(0);
      if(key==ESC)/*退出系统*/
        break;
      if(key==UP)/*上键盘操作*/
      {
        DrawBall(keyx,keyy,BLACK);/*先用黑色在原来位置去除球*/
        if(keyy!=60)
          keyy-=30;
        else
          keyy=390;
        DrawBall(keyx,keyy,11);/*新位置输出球*/
      }
      if(key==DOWN)/*下键盘操作*/
      {
        DrawBall(keyx,keyy,BLACK);/*先用黑色在原来位置去除球*/
        if(keyy!=390)
          keyy+=30;
        else
          keyy=60;
        DrawBall(keyx,keyy,11);/*新位置输出球*/
      }
      if(key==ENTER)/*确定键*/
      {
        switch(keyy)/*判断内容*/
        {
          case 60:getch();clrscr(); length=enter(adr);yes=0;break;/*调用*/
          case 90:getch();clrscr(); list(adr,length);yes=0;break;/*调用*/
          case 120:getch();clrscr();search(adr,length);yes=0;break;/*调用*/
          case 150:length=delete(adr,length);yes=0;break;/*调用*/
          case 180:length=add(adr,length);yes=0;break;/*调用*/
          case 210:save(adr,length);yes=0;break; /*调用*/
          case 240:length=load(adr);yes=0;break;/*调用*/
          case 270:display(adr);yes=0;break;/*调用*/
          case 300: sort(adr,length);yes=0;break;/*调用*/
          case 330:qseek(adr,length);yes=0;break;/*调用*/
          case 360:copy();yes=0;break;/*调用*/
          case 390: yes=0;oyes=0;/*exit选项*/
        }/*endswitch*/
      } /*endenter*/
    } /*endwhile*/
  } /*endwhile*/
}
/*结束画面*/
void DrawStar(void)
{
  int i;
  cleardevice();
  setcolor(GREEN);
  settextstyle(0,0,2);
  while(!kbhit())
  {
    for(i=0;i<200;i++)/*随机生成星星*/
    {
      star.x=random(640);
      star.y=random(480);
      star.color=random(13)+1;
    }
    for(i=0;i<200;i++)/*输出星星*/
    {
      putpixel(star.x,star.y,star.color);
      delay(100);
    }
    outtextxy(100,200,"Thank you for use this system");
    sleep(1);
    for(i=0;i<200;i++)/*去除星星*/
    {
      putpixel(star.x,star.y,0);
      delay(50);
    }
  }
}

/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/
int enter(ADDRESS t[])
{
  int i,n;
  char *s;
  clrscr(); /*清屏*/
  printf("\nplease input num \n"); /*提示信息*/
  scanf("%d",&n); /*输入记录数*/
  printf("please input record \n"); /*提示输入记录*/
  printf("name         unit               telephone\n");
  printf("------------------------------------------------\n");
  for(i=0;i<n;i++)
  {
    scanf("%s%s%s",t.name,t.units,t.tele); /*输入记录*/
    printf("----------------------------------------------\n");
  }
  return n; /*返回记录条数*/
}
/*显示记录,参数为记录数组和记录条数*/
void list(ADDRESS t[],int n)
{
  int i;
  clrscr();
  printf("\n\n*******************ADDRESS******************\n");
  printf("name           unit               telephone\n");
  printf("------------------------------------------------\n");
  for(i=0;i<n;i++)
  printf("%-20s%-30s%-10s\n",t.name,t.units,t.tele);
  if((i+1)%10==0)   /*判断输出是否达到10条记录*/
  {
    printf("Press any key continue...\n"); /*提示信息*/
    getch(); /*压任意键继续*/
  }
  printf("************************end*******************\n");
}
/*查找记录*/
void search(ADDRESS t[],int n)
{
  char s[20];   /*保存待查找姓名字符串*/
  int i;   /*保存查找到结点的序号*/
  clrscr();   /*清屏*/
  printf("please search name\n");
  scanf("%s",s); /*输入待查找姓名*/
  i=find(t,n,s); /*调用find函数,得到一个整数*/
  if(i>n-1) /*如果整数i值大于n-1,说明没找到*/
    printf("not found\n");
  else
    print(t); /*找到,调用显示函数显示记录*/
}
/*显示指定的一条记录*/
void print(ADDRESS temp)
{
  clrscr();
  printf("\n\n********************************************\n");
  printf("name           unit               telephone\n");
  printf("------------------------------------------------\n");
  printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);
  printf("**********************end***********************\n");
}
/*查找函数,参数为记录数组和记录条数以及姓名s */
int find(ADDRESS t[],int n,char *s)
{
  int i;
  for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/
  {
    if(strcmp(s,t.name)==0) /*记录中的姓名和待比较的姓名是否相等*/
    return i;   /*相等,则返回该记录的下标号,程序提前结结束*/
  }
  return i; /*返回i值*/
}
/*删除函数,参数为记录数组和记录条数*/
int delete(ADDRESS t[],int n)
{
  char s[20]; /*要删除记录的姓名*/
  int ch=0;
  int i,j;
  printf("please deleted name\n"); /*提示信息*/
  scanf("%s",s);/*输入姓名*/
  i=find(t,n,s); /*调用find函数*/
  if(i>n-1) /*如果i>n-1超过了数组的长度*/
    printf("no found not deleted\n"); /*显示没找到要删除的记录*/
  else
  {
    print(t); /*调用输出函数显示该条记录信息*/
    printf("Are you sure delete it(1/0)\n"); /*确认是否要删除*/
    scanf("%d",&ch); /*输入一个整数0或1*/
    if(ch==1) /*如果确认删除整数为1*/
    {
      for(j=i+1;j<n;j++) /*删除该记录,实际后续记录前移*/
      {
        strcpy(t[j-1].name,t[j].name); /*将后一条记录的姓名拷贝到前一条*/
        strcpy(t[j-1].units,t[j].units); /*将后一条记录的单位拷贝到前一条*/
        strcpy(t[j-1].tele,t[j].tele); /*将后一条记录的电话拷贝到前一条*/
      }
      n--; /*记录数减1*/
    }
  }
  return n; /*返回记录数*/
}
/*插入记录函数,参数为结构体数组和记录数*/
int add(ADDRESS t[],int n)/*插入函数,参数为结构体数组和记录数*/
{
  ADDRESS temp; /*新插入记录信息*/
  int i,j;
  char s[20]; /*确定插入在哪个记录之前*/
  printf("please input record\n");
  printf("************************************************\n");
  printf("name           unit               telephone\n");
  printf("--------------------------------------------------\n");
  scanf("%s%s%s",temp.name,temp.units,temp.tele); /*输入插入信息*/
  printf("------------------------------------------------\n");
  printf("please input locate name \n");
  scanf("%s",s); /*输入插入位置的姓名*/
  i=find(t,n,s); /*调用find,确定插入位置*/
  for(j=n-1;j>=i;j--)   /*从最后一个结点开始向后移动一条*/
  {
    strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/
    strcpy(t[j+1].units,t[j].units); /*当前记录的单位拷贝到后一条*/
    strcpy(t[j+1].tele,t[j].tele); /*当前记录的电话拷贝到后一条*/
  }
  strcpy(t.name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/
  strcpy(t.units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/
  strcpy(t.tele,temp.tele); /*将新插入记录的电话拷贝到第i个位置*/
  n++;   /*记录数加1*/
  return n; /*返回记录数*/
}
/*保存函数,参数为结构体数组和记录数*/
void save(ADDRESS t[],int n)
{
  int i;
  FILE *fp; /*指向文件的指针*/
  if((fp=fopen("record.txt","wb"))==NULL) /*打开文件,并判断打开是否正常*/
  {
    printf("can not open file\n");/*没打开*/
    exit(1); /*退出*/
  }
  printf("\nSaving file\n"); /*输出提示信息*/
  fprintf(fp,"%d",n); /*将记录数写入文件*/
  fprintf(fp,"\r\n"); /*将换行符号写入文件*/
  for(i=0;i<n;i++)
  {
    fprintf(fp,"%-20s%-30s%-10s",t.name,t.units,t.tele);/*格式写入记录*/
    fprintf(fp,"\r\n"); /*将换行符号写入文件*/
  }
  fclose(fp);/*关闭文件*/
  printf("****save success***\n"); /*显示保存成功*/
}
/*读入函数,参数为结构体数组*/
int load(ADDRESS t[])
{
  int i,n;
  FILE *fp; /*指向文件的指针*/
  if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/
  {
    printf("can not open file\n"); /*不能打开*/
    exit(1); /*退出*/
  }
  fscanf(fp,"%d",&n); /*读入记录数*/
  for(i=0;i<n;i++)
    fscanf(fp,"%20s%30s%10s",t.name,t.units,t.tele); /*按格式读入记录*/
  fclose(fp); /*关闭文件*/
  printf("You have success read data from file!!!\n"); /*显示保存成功*/
  return n; /*返回记录数*/
}
/*按序号显示记录函数*/
void display(ADDRESS t[])
{
  int id,n;
  FILE *fp; /*指向文件的指针*/
  if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/
  {
    printf("can not open file\n"); /*不能打开文件*/
    exit(1); /*退出*/
  }
  printf("Enter order number...\n"); /*显示信息*/
  scanf("%d",&id); /*输入序号*/
  fscanf(fp,"%d",&n); /*从文件读入记录数*/
  if(id>=0&&id<n) /*判断序号是否在记录范围内*/
  {
    fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/
    print(t[id]); /*调用输出函数显示该记录*/
    printf("\r\n");
  }
  else
    printf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/
  fclose(fp); /*关闭文件*/
}
/*排序函数,参数为结构体数组和记录数*/
void sort(ADDRESS t[],int n)
{
  int i,j,flag;
  ADDRESS temp; /*临时变量做交换数据用*/
  for(i=0;i<n;i++)
  {
    flag=0; /*设标志判断是否发生过交换*/
    for(j=0;j<n-1;j++)
    if((strcmp(t[j].name,t[j+1].name))>0) /*比较大小*/
    {
      flag=1;
      strcpy(temp.name,t[j].name); /*交换记录*/
      strcpy(temp.units,t[j].units);
      strcpy(temp.tele,t[j].tele);
      strcpy(t[j].name,t[j+1].name);
      strcpy(t[j].units,t[j+1].units);
      strcpy(t[j].tele,t[j+1].tele);
      strcpy(t[j+1].name,temp.name);
      strcpy(t[j+1].units,temp.units);
      strcpy(t[j+1].tele,temp.tele);
    }
    if(flag==0)break; /*如果标志为0,说明没有发生过交换循环结束*/
  }
  printf("sort sucess!!!\n"); /*显示排序成功*/
}
/*快速查找,参数为结构体数组和记录数*/
void qseek(ADDRESS t[],int n)
{
  char s[20];
  int l,r,m;
  printf("\nPlease sort before qseek!\n"); /*提示确认在查找之前,记录是否已排序*/
  printf("please enter name for qseek\n"); /*提示输入*/
  scanf("%s",s); /*输入待查找的姓名*/
  l=0;r=n-1; /*设置左边界与右边界的初值*/
  while(l<=r) /*当左边界<=右边界时*/
  {
    m=(l+r)/2; /*计算中间位置*/
    if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/
    {
      print(t[m]); /*如果相等,则调用print函数显示记录信息*/
      return ; /*返回*/
    }
    if(strcmp(t[m].name,s)<0) /*如果中间结点小*/
      l=m+1; /*修改左边界*/
    else
      r=m-1; /*否则,中间结点大,修改右边界*/
  }
  if(l>r)   /*如果左边界大于右边界时*/
    printf("not found\n"); /*显示没找到*/
}
/*复制文件*/
void copy()
{
  char outfile[20]; /*目标文件名*/
  int i,n;
  ADDRESS temp[M]; /*定义临时变量*/
  FILE *sfp,*tfp; /*定义指向文件的指针*/
  clrscr();/*清屏*/
  if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/
  {
    printf("can not open file\n"); /*显示不能打开文件信息*/
    exit(1); /*退出*/
  }
  printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/
  scanf("%s",outfile); /*输入目标文件名*/
  if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/
  {
    printf("can not open file\n"); /*显示不能打开文件信息*/
    exit(1); /*退出*/
  }
  fscanf(sfp,"%d",&n); /*读出文件记录数*/
  fprintf(tfp,"%d",n);/*写入目标文件数*/
  fprintf(tfp,"\r\n"); /*写入换行符*/
  for(i=0;i<n;i++)
  {
    fscanf(sfp,"%20s%30s%10s\n",temp.name,temp.units,
    temp.tele); /*读入记录*/
    fprintf(tfp,"%-20s%-30s%-10s\n",temp.name,
    temp.units,temp.tele); /*写入记录*/
    fprintf(tfp,"\r\n"); /*写入换行符*/
  }
  fclose(sfp); /*关闭源文件*/
  fclose(tfp); /*关闭目标文件*/
  printf("you have success copy file!!!\n"); /*显示复制成功*/
}

类别: C语言方面 |  评论(1) |  浏览(2960) |  收藏
1楼 [匿名]D 2008年07月04日 16:12:05 Says:
DDDDDDD
发表评论
看不清楚,换一张