编程论坛's Archiver

xh471199134 发表于 2007-11-18 21:32

[求助]通讯录问题

<P>#include "dos.h"<BR>#include "iostream.h"<BR>#include "conio.h"<BR>#include "iostream.h"<BR>#include "stdio.h"   /*I/O函数*/<BR>#include "stdlib.h" /*标准库函数*/<BR>#include "string.h"/*字符串函数*/<BR>#include "ctype.h" /*字符操作函数*/<BR>#define M 200 <BR> typedef struct<BR> {<BR> char name[20];//名字<BR> char num[20];//号码<BR> char unit[30];//工作单位<BR> }ADDERSS;<BR> void gotoxy(int x,int y)//光标置位函数(x列y行)<BR>{<BR>int i,j;<BR>for(i=0;i&lt;=x;i++)<BR>{printf("\n");}<BR>for(j=0;j&lt;=y;j++)<BR>{printf(" ");}<BR>}<BR>/*输入纪录*/<BR>int enter(ADDERSS t[])<BR>{int i,n;<BR>system("cls");//清屏<BR>printf("请输入记录数\n");<BR>cin&gt;&gt;n;<BR>printf("请依次输入名字,单位,号码\n");<BR>for(i=0;i&lt;n;i++)<BR>{<BR> scanf("%s%s%s",t[i].name,t[i].unit,t[i].num);<BR>printf("*********************************\n");<BR>}<BR>return n;<BR>}<BR>void list(ADDERSS t[],int n)<BR>{int i;<BR>system("cls");<BR>printf("*************ADDERSS*****************\n");<BR>printf("名字          单位               号码\n");<BR>printf("------------------------------------\n");<BR>for(i=0;i&lt;n;i++)<BR>printf("%-20s%-30s%-20s\n",t[i].name,t[i].unit,t[i].num);<BR>if(i%10==0)<BR>{printf("按任意键继续");<BR>getch();<BR>}<BR>printf("**************the end****************\n");<BR>system("pause");</P>
<P>}<BR>int find(ADDERSS 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>void print(ADDERSS temp)<BR>{<BR>   system("cls");<BR>   printf("\n\n************************************************\n");<BR>   printf("名字                单位                        电话\n");<BR>   printf("----------------------------------------------------\n");<BR>   printf("%-20s%-30s%-20s\n",temp.name,temp.unit,temp.num);<BR>   printf("**********************end***********************\n");<BR>   system("pause");<BR>}<BR>void search(ADDERSS t[],int n)<BR>{char s[20];<BR>int i;<BR>system("cls");<BR>printf("请输入待查找名字\n");<BR>scanf("%s",s);<BR>i=find(t,n,s);<BR>if(i&gt;=n)<BR>printf("找不到该文件");<BR>else<BR>print(t[i]);<BR>}<BR>int deletes(ADDERSS t[],int n)<BR>{<BR>   char s[20];  /*要删除记录的姓名*/<BR>   int ch=0;<BR>   int i,j;<BR>   printf("请输入要删除记录的姓名\n"); /*提示信息*/<BR>   scanf("%s",s);/*输入姓名*/<BR>   i=find(t,n,s); /*调用find函数*/<BR>   if(i&gt;n-1)  /*如果i&gt;n-1超过了数组的长度*/<BR>      printf("没找到要删除的记录\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].unit,t[j].unit); /*将后一条记录的单位拷贝到前一条*/<BR>     strcpy(t[j-1].num,t[j].num); /*将后一条记录的电话拷贝到前一条*/<BR>  }<BR>  n--;  /*记录数减1*/<BR>      }<BR>   }<BR>   return n;  /*返回记录数*/<BR>}</P>
<P>/*插入记录函数,参数为结构体数组和记录数*/<BR>int add(ADDERSS t[],int n)/*插入函数,参数为结构体数组和记录数*/<BR>{<BR>   ADDERSS temp; /*新插入记录信息*/<BR>   system("cls");<BR>   printf("请插入记录\n");<BR>   printf("请依次输入名字,工作单位,电话:\n");<BR>   scanf("%s%s%s",temp.name,temp.unit,temp.num); /*输入插入信息*/<BR>   strcpy(t[n+1].name,temp.name); /*将新插入记录的姓名拷贝到第n+1个位置*/<BR>   strcpy(t[n+1].unit,temp.unit); /*将新插入记录的单位拷贝到第n+1个位置*/<BR>   strcpy(t[n+1].num,temp.num); /*将新插入记录的电话拷贝到第n+1个位置*/<BR>   n++;   /*记录数加1*/<BR>   return n; /*返回记录数*/<BR>}<BR>/*保存函数,参数为结构体数组和记录数*/<BR>void save(ADDERSS t[],int n)<BR>{<BR>   int i;<BR>   FILE *fp;  /*指向文件的指针*/<BR>   if((fp=fopen("record.txt","wb"))==NULL)  /*打开文件,并判断打开是否正常*/<BR>   {<BR>      printf("无法打开文件\n");/*没打开*/<BR>      exit(1);  /*退出*/<BR>   }<BR>   printf("\n保存文件.......\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].unit,t[i].num);/*格式写入记录*/<BR>      fprintf(fp,"\r\n"); /*将换行符号写入文件*/<BR>   }<BR>   fclose(fp);/*关闭文件*/<BR>   printf("保存成功!!!\n"); /*显示保存成功*/<BR>   system("pause");<BR>   getch();<BR>}<BR>/*读入函数,参数为结构体数组*/<BR>int load(ADDERSS t[])<BR>{<BR>   int i,n;<BR>   FILE *fp; /*指向文件的指针*/<BR>   if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/<BR>   {<BR>      printf("不能打开文件\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].unit,t[i].num); /*按格式读入记录*/<BR>   fclose(fp);  /*关闭文件*/<BR>   printf("你已经成功地从文件中读取了数据!!!\n"); /*显示保存成功*/<BR>   return n; /*返回记录数*/<BR>   system("pause");<BR>}<BR>/*按序号显示记录函数*/<BR>void display(ADDERSS t[])<BR>{<BR>   int id,n;<BR>   FILE *fp; /*指向文件的指针*/<BR>   if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/<BR>   {<BR>      printf("不能打开文件\n"); /*不能打开文件*/<BR>      exit(1);  /*退出*/<BR>   }<BR>   printf("输入序号...\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(ADDERSS),1); /*移动文件指针到该记录位置*/<BR>      print(t[id]); /*调用输出函数显示该记录*/<BR>      printf("\r\n");<BR>   }<BR>   else<BR>      printf(" 序号%d不合理!!!\n ",id); /*如果序号不合理显示信息*/<BR>   fclose(fp);  /*关闭文件*/<BR>   system("pause");<BR>}<BR>/*排序函数,参数为结构体数组和记录数*/<BR>void sort(ADDERSS t[],int n)<BR>{<BR>   int i,j,flag;<BR>   ADDERSS temp; /*临时变量做交换数据用*/<BR>   system("cls");<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.unit,t[j].unit);<BR>  strcpy(temp.num,t[j].num);<BR>  strcpy(t[j].name,t[j+1].name);<BR>  strcpy(t[j].unit,t[j+1].unit);<BR>  strcpy(t[j].num,t[j+1].num);<BR>  strcpy(t[j+1].name,temp.name);<BR>  strcpy(t[j+1].unit,temp.unit);<BR>  strcpy(t[j+1].num,temp.num) ;<BR>      }<BR>      if(flag==0)break;  /*如果标志为0,说明没有发生过交换循环结束*/<BR>   }<BR>   printf("排序成功!!!\n");/*显示排序成功*/<BR>   system("pause");<BR>}<BR>/*快速查找,参数为结构体数组和记录数*/<BR>void qseek(ADDERSS t[],int n)<BR>{<BR>   char s[20];<BR>   int l,r,m;<BR>   system("cls");<BR>   printf("函数在查找之前已排序\n");/*提示确认在查找之前,记录是否已排序*/<BR>   printf("请输入要查找的名字\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>   system("pause");<BR>}<BR>/*复制文件*/<BR>void copy()<BR>{<BR>   char outfile[20]; /*目标文件名*/<BR>   int i,n;<BR>   ADDERSS temp[M];  /*定义临时变量*/<BR>   FILE *sfp,*tfp; /*定义指向文件的指针*/<BR>   system("cls");/*清屏*/<BR>   if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/<BR>   {<BR>      printf("can not open file\n"); /*显示不能打开文件信息*/<BR>      exit(1); /*退出*/<BR>   }<BR>   printf("请输入文件的路径名,如 c:\\f1\\te.txt:\n"); /*提示信息*/<BR>   scanf("%s",outfile); /*输入目标文件名*/<BR>   if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/<BR>   {<BR>      printf("不能打开文件\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++)</P>
<P>   {<BR>      fscanf(sfp,"%20s%30s%10s\n",temp[i].name,temp[i].unit,<BR> temp[i].num); /*读入记录*/<BR>      fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,<BR> temp[i].unit,temp[i].num); /*写入记录*/<BR>      fprintf(tfp,"\r\n"); /*写入换行符*/<BR>   }<BR>   fclose(sfp); /*关闭源文件*/<BR>   fclose(tfp); /*关闭目标文件*/<BR>   printf("复制成功!!!\n"); /*显示复制成功*/<BR>   system("pause");<BR>}<BR>int menu_select()<BR>{<BR>   char s[80];<BR>   int c;<BR>   system("cls"); /*清屏*/<BR>   gotoxy(5,1);<BR>   printf("******************菜单(容量200)**************\n\n");<BR>   printf("  0. 输入记录\n");<BR>   printf("  1. 显示记录函数\n");<BR>   printf("  2. 按名字查找记录\n");<BR>   printf("  3. 删除一个记录\n");<BR>   printf("  4. 增加一个记录 \n");<BR>   printf("  5. 保存该文件\n");<BR>   printf("  6. 读入函数\n");<BR>   printf("  7. 按序号显示记录函数\n");<BR>   printf("         8. 排序函数\n");<BR>   printf("         9. 快速查找\n");<BR>   printf("         10. 复制文件\n");<BR>   printf("         11. 退出\n");<BR>   gotoxy(5,1);<BR>   printf("*********************************************\n");<BR>   do{<BR>      printf("\n 输入选项(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>void main()<BR>{<BR>   ADDERSS adr[M];  /*定义结构体数组*/<BR>   int length;  /*保存记录长度*/<BR>   system("cls");  /*清屏*/<BR>   for(;;)/*无限循环*/<BR>   {<BR>      switch(menu_select())   /*调用主菜单函数,返回值整数作开关语句的条件*/<BR>      {<BR>  case 0:length=enter(adr);<BR>      list(adr,length); <BR>      break;/*输入记录*/<BR>  case 1:list(adr,length);<BR>      break; /*显示全部记录*/<BR>  case 2:search(adr,length);<BR>      break; /*查找记录*/<BR>  case 3:length=deletes(adr,length);<BR>      list(adr,length);<BR>      break;/*删除记录*/<BR>  case 4:length=add(adr,length);<BR>      list(adr,length);<BR>    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>小弟先谢各位大哥大姐了</P>

xh471199134 发表于 2007-11-18 21:39

<P>上面程序在执行插入时会出错 </P>[IMG]http://photo.store.qq.com/http_imgload.cgi?/rurl2=ebef3249584eef1460ba730f955d8e5e7282930c9b98fa5e0980c889b27f7660485925522a46530d8e96efb6158ddc17b0f3ae3213cf1722f012a68c7559ed32d4f9f9ed4f94546730f10cf5f21b8856469e2b7b[/IMG]

xh471199134 发表于 2007-11-18 21:40

各位高手帮帮忙<BR>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.