[求助]通讯录问题
<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<=x;i++)<BR>{printf("\n");}<BR>for(j=0;j<=y;j++)<BR>{printf(" ");}<BR>}<BR>/*输入纪录*/<BR>int enter(ADDERSS t[])<BR>{int i,n;<BR>system("cls");//清屏<BR>printf("请输入记录数\n");<BR>cin>>n;<BR>printf("请依次输入名字,单位,号码\n");<BR>for(i=0;i<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<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<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>=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>n-1) /*如果i>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",&ch); /*输入一个整数0或1*/<BR> if(ch==1) /*如果确认删除整数为1*/<BR> {<BR> for(j=i+1;j<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<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",&n); /*读入记录数*/<BR> for(i=0;i<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",&id); /*输入序号*/<BR> fscanf(fp,"%d",&n); /*从文件读入记录数*/<BR> if(id>=0&&id<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<n;i++)<BR> {<BR> flag=0; /*设标志判断是否发生过交换*/<BR> for(j=0;j<n-1;j++)<BR> if((strcmp(t[j].name,t[j+1].name))>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<=r) /*当左边界<=右边界时*/<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)<0) /*如果中间结点小*/<BR> l=m+1; /*修改左边界*/<BR> else<BR> r=m-1; /*否则,中间结点大,修改右边界*/<BR> }<BR> if(l>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",&n); /*读出文件记录数*/<BR> fprintf(tfp,"%d",n);/*写入目标文件数*/<BR> fprintf(tfp,"\r\n"); /*写入换行符*/<BR> for(i=0;i<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<0||c>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> <P>上面程序在执行插入时会出错 </P>[IMG]http://photo.store.qq.com/http_imgload.cgi?/rurl2=ebef3249584eef1460ba730f955d8e5e7282930c9b98fa5e0980c889b27f7660485925522a46530d8e96efb6158ddc17b0f3ae3213cf1722f012a68c7559ed32d4f9f9ed4f94546730f10cf5f21b8856469e2b7b[/IMG] 各位高手帮帮忙<BR>
页:
[1]
