zhai2651173 发表于 2005-11-19 19:56

用C简单编写通讯录源代码(经典)申请加精

                                             通讯录源代码<br>/*10.3.2源程序*/<br>/******头文件(.h)***********/<br>#include "stdio.h"   /*I/O函数*/<br>#include "stdlib.h" /*标准库函数*/<br>#include "string.h"/*字符串函数*/<br>#include "ctype.h" /*字符操作函数*/<br>#define M 50  /*定义常数表示记录数*/<br>typedef struct /*定义数据结构*/<br>{<br>   char name[20]; /*姓名*/<br>   char units[30];  /*单位*/<br>   char tele[10];  /*电话*/<br>}ADDRESS;<br>/******以下是函数原型*******/<br>int enter(ADDRESS t[]); /*输入记录*/<br>void list(ADDRESS t[],int n); /*显示记录*/<br>void search(ADDRESS t[],int n); /*按姓名查找显示记录*/<br>int delete(ADDRESS t[],int n); /*删除记录*/<br>int  add(ADDRESS t[],int n); /*插入记录*/<br>void save(ADDRESS t[],int n); /*记录保存为文件*/<br>int load(ADDRESS t[]);  /*从文件中读记录*/<br>void display(ADDRESS t[]); /*按序号查找显示记录*/<br>void sort(ADDRESS t[],int n); /*按姓名排序*/<br>void qseek(ADDRESS t[],int n); /*快速查找记录*/<br>void copy();  /*文件复制*/<br>void print(ADDRESS temp); /*显示单条记录*/<br>int find(ADDRESS t[],int n,char *s) ; /*查找函数*/<br>int menu_select();  /*主菜单函数*/<br>/******主函数开始*******/<br>main()<br>{<br>   int i;<br>   ADDRESS adr[M];  /*定义结构体数组*/<br>   int length;  /*保存记录长度*/<br>   clrscr();  /*清屏*/<br>   for(;;)/*无限循环*/<br>   {<br>      switch(menu_select())   /*调用主菜单函数,返回值整数作开关语句的条件*/<br>      {<br>  case 0:length=enter(adr);break;/*输入记录*/<br>  case 1:list(adr,length);break; /*显示全部记录*/<br>  case 2:search(adr,length);break; /*查找记录*/<br>  case 3:length=delete(adr,length);break; /*删除记录*/<br>  case 4:length=add(adr,length);  break;   /*插入记录*/<br>  case 5:save(adr,length);break; /*保存文件*/<br>  case 6:length=load(adr); break; /*读文件*/<br>  case 7:display(adr);break;  /*按序号显示记录*/<br>  case 8:sort(adr,length);break; /*按姓名排序*/<br>  case 9:qseek(adr,length);break; /*快速查找记录*/<br>  case 10:copy();break; /*复制文件*/<br>  case 11:exit(0); /*如返回值为11则程序结束*/<br>      }<br>   }<br>}<br>/*菜单函数,函数返回值为整数,代表所选的菜单项*/<br>menu_select()<br>{<br>   char s[80];<br>   int c;<br>   gotoxy(1,25);/*将光标定为在第25行,第1列*/<br>   printf("press any key enter menu......\n");/*提示压任意键继续*/<br>   getch(); /*读入任意字符*/<br>   clrscr(); /*清屏*/<br>   gotoxy(1,1);<br>   printf("********************MENU*********************\n\n");<br>   printf("  0. Enter record\n");<br>   printf("  1. List the file\n");<br>   printf("  2. Search record on name\n");<br>   printf("  3. Delete a record\n");<br>   printf("  4. add record \n");<br>   printf("  5. Save the file\n");<br>   printf("  6. Load the file\n");<br>   printf("  7. display record on order\n");<br>   printf("         8. sort to make new file\n");<br>   printf("         9. Quick seek record\n");<br>   printf("  10. copy the file to new file\n");<br>   printf("         11. Quit\n");<br>   printf("***********************************************\n");<br>   do{<br>      printf("\n  Enter you choice(0~11):"); /*提示输入选项*/<br>      scanf("%s",s); /*输入选择项*/<br>      c=atoi(s); /*将输入的字符串转化为整型数*/<br>   }while(c&lt;0||c&gt;11); /*选择项不在0~11之间重输*/<br>   return c; /*返回选择项,主程序根据该数调用相应的函数*/<br>}<br>/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/<br>int  enter(ADDRESS t[])<br>{<br>   int i,n;<br>   char *s;<br>   clrscr(); /*清屏*/<br>   printf("\nplease input num \n"); /*提示信息*/<br>   scanf("%d",&amp;n); /*输入记录数*/<br>   printf("please input record \n"); /*提示输入记录*/<br>   printf("name             unit                     telephone\n");<br>   printf("------------------------------------------------\n");<br>   for(i=0;i&lt;n;i++)<br>   {<br>      scanf("%s%s%s",t[i].name,t[i].units,t[i].tele);  /*输入记录*/<br>      printf("----------------------------------------------\n");<br>   }<br>   return n;  /*返回记录条数*/<br>}<br>/*显示记录,参数为记录数组和记录条数*/<br>void list(ADDRESS t[],int n)<br>{<br>   int i;<br>   clrscr();<br>   printf("\n\n*******************ADDRESS******************\n");<br>   printf("name               unit                     telephone\n");<br>   printf("------------------------------------------------\n");<br>   for(i=0;i&lt;n;i++)<br>   printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);<br>   if((i+1)%10==0)   /*判断输出是否达到10条记录*/<br>   {<br>      printf("Press any key continue...\n"); /*提示信息*/<br>      getch();  /*压任意键继续*/<br>   }<br>   printf("************************end*******************\n");<br>}<br>/*查找记录*/<br>void search(ADDRESS t[],int n)<br>{<br>   char s[20];   /*保存待查找姓名字符串*/<br>   int i;   /*保存查找到结点的序号*/<br>   clrscr();   /*清屏*/<br>   printf("please search name\n");<br>   scanf("%s",s); /*输入待查找姓名*/<br>   i=find(t,n,s); /*调用find函数,得到一个整数*/<br>   if(i&gt;n-1)  /*如果整数i值大于n-1,说明没找到*/<br>      printf("not found\n");<br>   else<br>      print(t[i]);  /*找到,调用显示函数显示记录*/<br>}<br>/*显示指定的一条记录*/<br>void print(ADDRESS temp)<br>{<br>   clrscr();<br>   printf("\n\n********************************************\n");<br>   printf("name                unit                      telephone\n");<br>   printf("------------------------------------------------\n");<br>   printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);<br>   printf("**********************end***********************\n");<br>}<br>/*查找函数,参数为记录数组和记录条数以及姓名s */<br>int find(ADDRESS t[],int n,char *s)<br>{<br>   int i;<br>   for(i=0;i&lt;n;i++)/*从第一条记录开始,直到最后一条*/<br>   {<br>      if(strcmp(s,t[i].name)==0)  /*记录中的姓名和待比较的姓名是否相等*/<br>      return i;   /*相等,则返回该记录的下标号,程序提前结结束*/<br>   }<br>   return i;  /*返回i值*/<br>}<br>/*删除函数,参数为记录数组和记录条数*/<br>int delete(ADDRESS t[],int n)<br>{<br>   char s[20];  /*要删除记录的姓名*/<br>   int ch=0;<br>   int i,j;<br>   printf("please deleted name\n"); /*提示信息*/<br>   scanf("%s",s);/*输入姓名*/<br>   i=find(t,n,s); /*调用find函数*/<br>   if(i&gt;n-1)  /*如果i&gt;n-1超过了数组的长度*/<br>      printf("no found not deleted\n"); /*显示没找到要删除的记录*/<br>   else<br>   {<br>      print(t[i]); /*调用输出函数显示该条记录信息*/<br>      printf("Are you sure delete it(1/0)\n");  /*确认是否要删除*/<br>      scanf("%d",&amp;ch);  /*输入一个整数0或1*/<br>      if(ch==1)  /*如果确认删除整数为1*/<br>      {<br>  for(j=i+1;j&lt;n;j++)  /*删除该记录,实际后续记录前移*/<br>  {<br>     strcpy(t[j-1].name,t[j].name); /*将后一条记录的姓名拷贝到前一条*/<br>     strcpy(t[j-1].units,t[j].units); /*将后一条记录的单位拷贝到前一条*/<br>     strcpy(t[j-1].tele,t[j].tele); /*将后一条记录的电话拷贝到前一条*/<br>  }<br>  n--;  /*记录数减1*/<br>      }<br>   }<br>   return n;  /*返回记录数*/<br>}<br>/*插入记录函数,参数为结构体数组和记录数*/<br>int add(ADDRESS t[],int n)/*插入函数,参数为结构体数组和记录数*/<br>{<br>   ADDRESS temp;  /*新插入记录信息*/<br>   int i,j;<br>   char s[20]; /*确定插入在哪个记录之前*/<br>   printf("please input record\n");<br>   printf("************************************************\n");<br>   printf("name                unit                      telephone\n");<br>   printf("--------------------------------------------------\n");<br>   scanf("%s%s%s",temp.name,temp.units,temp.tele); /*输入插入信息*/<br>   printf("------------------------------------------------\n");<br>   printf("please input locate name \n");<br>   scanf("%s",s); /*输入插入位置的姓名*/<br>   i=find(t,n,s);  /*调用find,确定插入位置*/<br>   for(j=n-1;j&gt;=i;j--)   /*从最后一个结点开始向后移动一条*/<br>   {<br>      strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/<br>      strcpy(t[j+1].units,t[j].units); /*当前记录的单位拷贝到后一条*/<br>      strcpy(t[j+1].tele,t[j].tele); /*当前记录的电话拷贝到后一条*/<br>   }<br>   strcpy(t[i].name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/<br>   strcpy(t[i].units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/<br>   strcpy(t[i].tele,temp.tele); /*将新插入记录的电话拷贝到第i个位置*/<br>   n++;   /*记录数加1*/<br>   return n; /*返回记录数*/<br>}<br>/*保存函数,参数为结构体数组和记录数*/<br>void save(ADDRESS t[],int n)<br>{<br>   int i;<br>   FILE *fp;  /*指向文件的指针*/<br>   if((fp=fopen("record.txt","wb"))==NULL)  /*打开文件,并判断打开是否正常*/<br>   {<br>      printf("can not open file\n");/*没打开*/<br>      exit(1);  /*退出*/<br>   }<br>   printf("\nSaving file\n"); /*输出提示信息*/<br>   fprintf(fp,"%d",n);  /*将记录数写入文件*/<br>   fprintf(fp,"\r\n");  /*将换行符号写入文件*/<br>   for(i=0;i&lt;n;i++)<br>   {<br>      fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);/*格式写入记录*/<br>      fprintf(fp,"\r\n"); /*将换行符号写入文件*/<br>   }<br>   fclose(fp);/*关闭文件*/<br>   printf("****save success***\n"); /*显示保存成功*/<br>}<br>/*读入函数,参数为结构体数组*/<br>int load(ADDRESS t[])<br>{<br>   int i,n;<br>   FILE *fp; /*指向文件的指针*/<br>   if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/<br>   {<br>      printf("can not open file\n");  /*不能打开*/<br>      exit(1);  /*退出*/<br>   }<br>   fscanf(fp,"%d",&amp;n); /*读入记录数*/<br>   for(i=0;i&lt;n;i++)<br>      fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele); /*按格式读入记录*/<br>   fclose(fp);  /*关闭文件*/<br>   printf("You have success read data from file!!!\n"); /*显示保存成功*/<br>   return n; /*返回记录数*/<br>}<br>/*按序号显示记录函数*/<br>void display(ADDRESS t[])<br>{<br>   int id,n;<br>   FILE *fp; /*指向文件的指针*/<br>   if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/<br>   {<br>      printf("can not open file\n"); /*不能打开文件*/<br>      exit(1);  /*退出*/<br>   }<br>   printf("Enter order number...\n"); /*显示信息*/<br>   scanf("%d",&amp;id);  /*输入序号*/<br>   fscanf(fp,"%d",&amp;n); /*从文件读入记录数*/<br>   if(id&gt;=0&amp;&amp;id&lt;n) /*判断序号是否在记录范围内*/<br>   {<br>      fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/<br>      print(t[id]); /*调用输出函数显示该记录*/<br>      printf("\r\n");<br>   }<br>   else<br>      printf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/<br>   fclose(fp);  /*关闭文件*/<br>}<br>/*排序函数,参数为结构体数组和记录数*/<br>void sort(ADDRESS t[],int n)<br>{<br>   int i,j,flag;<br>   ADDRESS temp; /*临时变量做交换数据用*/<br>   for(i=0;i&lt;n;i++)<br>   {<br>      flag=0;  /*设标志判断是否发生过交换*/<br>      for(j=0;j&lt;n-1;j++)<br>      if((strcmp(t[j].name,t[j+1].name))&gt;0) /*比较大小*/<br>      {<br>  flag=1;<br>  strcpy(temp.name,t[j].name);  /*交换记录*/<br>  strcpy(temp.units,t[j].units);<br>  strcpy(temp.tele,t[j].tele);<br>  strcpy(t[j].name,t[j+1].name);<br>  strcpy(t[j].units,t[j+1].units);<br>  strcpy(t[j].tele,t[j+1].tele);<br>  strcpy(t[j+1].name,temp.name);<br>  strcpy(t[j+1].units,temp.units);<br>  strcpy(t[j+1].tele,temp.tele);<br>      }<br>      if(flag==0)break;  /*如果标志为0,说明没有发生过交换循环结束*/<br>   }<br>   printf("sort sucess!!!\n"); /*显示排序成功*/<br>}<br>/*快速查找,参数为结构体数组和记录数*/<br>void qseek(ADDRESS t[],int n)<br>{<br>   char s[20];<br>   int l,r,m;<br>   printf("\nPlease  sort before qseek!\n"); /*提示确认在查找之前,记录是否已排序*/<br>   printf("please enter  name for qseek\n"); /*提示输入*/<br>   scanf("%s",s); /*输入待查找的姓名*/<br>   l=0;r=n-1;  /*设置左边界与右边界的初值*/<br>   while(l&lt;=r) /*当左边界&lt;=右边界时*/<br>   {<br>      m=(l+r)/2; /*计算中间位置*/<br>      if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/<br>      {<br>  print(t[m]); /*如果相等,则调用print函数显示记录信息*/<br>  return ; /*返回*/<br>      }<br>      if(strcmp(t[m].name,s)&lt;0)  /*如果中间结点小*/<br>  l=m+1;  /*修改左边界*/<br>      else<br>  r=m-1; /*否则,中间结点大,修改右边界*/<br>   }<br>   if(l&gt;r)   /*如果左边界大于右边界时*/<br>      printf("not found\n"); /*显示没找到*/<br>}<br>/*复制文件*/<br>void copy()<br>{<br>   char outfile[20]; /*目标文件名*/<br>   int i,n;<br>   ADDRESS temp[M];  /*定义临时变量*/<br>   FILE *sfp,*tfp; /*定义指向文件的指针*/<br>   clrscr();/*清屏*/<br>   if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/<br>   {<br>      printf("can not open file\n"); /*显示不能打开文件信息*/<br>      exit(1); /*退出*/<br>   }<br>   printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/<br>   scanf("%s",outfile); /*输入目标文件名*/<br>   if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/<br>   {<br>      printf("can not open file\n"); /*显示不能打开文件信息*/<br>      exit(1); /*退出*/<br>   }<br>   fscanf(sfp,"%d",&amp;n); /*读出文件记录数*/<br>   fprintf(tfp,"%d",n);/*写入目标文件数*/<br>   fprintf(tfp,"\r\n"); /*写入换行符*/<br>   for(i=0;i&lt;n;i++)<br>   {<br>      fscanf(sfp,"%20s%30s%10s\n",temp[i].name,temp[i].units,<br>temp[i].tele); /*读入记录*/<br>      fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,<br>temp[i].units,temp[i].tele); /*写入记录*/<br>      fprintf(tfp,"\r\n"); /*写入换行符*/<br>   }<br>   fclose(sfp); /*关闭源文件*/<br>   fclose(tfp); /*关闭目标文件*/<br>   printf("you have success copy  file!!!\n"); /*显示复制成功*/<br>}<br><br>                       觉得好的顶下[em12][em12]
[align=right][color=#000066][此贴子已经被作者于2005-11-20 15:46:02编辑过][/color][/align]

baidu 发表于 2005-11-19 20:04

[em01]

baidu 发表于 2005-11-19 20:06

[em01]

yuki 发表于 2005-11-19 20:10

<DIV class=quote><B>以下是引用<U>baidu</U>在2005-11-19 20:06:00的发言:</B><BR>[em01]</DIV>
<P>你是knocker吧!上次帮我测试N!阶乘谢谢啦,那张帖子我没找到,今天看见了你顺便在这里说一声了。<BR><BR>好了,我对楼主的帖子也在这里顺便说几句。<BR>楼主的程序有个特点就是避免使用指针与动态内存分配,想必这些知识比较缺乏,好好把书看看,指针才是C语言的精髓。</P>[em01]

baidu 发表于 2005-11-19 20:22

上次你改过以后的程序50次运行时间是10秒左右。PII 233

yuki 发表于 2005-11-19 20:24

<DIV class=quote><B>以下是引用<U>baidu</U>在2005-11-19 20:22:00的发言:</B><BR>上次你改过以后的程序50次运行时间是10秒左右。PII 233</DIV>
<p>谢谢你,看来还是得改进

baidu 发表于 2005-11-19 20:29

<P>我的blog上有个N!,比你们俩的要快一点,但是,现在最快的算法10000!也只要0。06秒[em03]</P>
<P> 我研究这个算法,目前也只做到在我的PII 233上10000!跑个2秒多一点,差得很远啊</P>[em06]

yuki 发表于 2005-11-19 20:30

恩谢谢,我去看看

zhai2651173 发表于 2005-11-20 09:40

[em02][em02][em02]

zhai2651173 发表于 2005-11-20 10:03

<P>都讲到哪里去了...没里没头的</P>

zhai2651173 发表于 2005-11-20 10:05

真晕.....[em12][em12][em17]

xxhh1362 发表于 2006-8-24 22:16

<P>昏!<BR>太复杂了啊!!!!!!<BR></P>

静儿 发表于 2006-8-25 05:30

<P>哇,简直就是天书[em03]</P>

xcljun 发表于 2006-9-12 17:13

楼主,你的这个不能运行啊?我用Turbo C 不能运行,而且。。。而且有很多错误,可我怎么找都找不到错误拉。郁闷坏了  。如果看到此帖告诉我为什么呢[em13][em28]

Starlove 发表于 2007-7-9 22:29

恩<BR>好,对我很有启发<BR>[em01][em01][em01]<BR>坚决顶ing

okinglin 发表于 2008-6-27 01:03

ding

qxde01 发表于 2008-7-2 13:58

回复 3# baidu 的帖子

ha哦

cmgycmgy22 发表于 2008-7-2 19:56

先收藏了再慢慢研究

页: [1]

编程论坛