#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> /*字符操作函数*/
#define M 50
typedef struct /*定义数据结构*/
{
char name[20];
char units[30];
char tele[15];
char sex[6];
}ADDRESS;
/*以下是函数原形*/
int enter(ADDRESS t[]); /*输入记录*/
void list(ADDRESS t[],int n); /*显示记录*/
void search(ADDRESS t[],int n);/*按姓名查找记录*/
int delet(ADDRESS t[],int n);/*删除记录*/
int add(ADDRESS t[],int n);/*插入记录*/
void modify(ADDRESS t[],int n);/*修改记录*/
void save(ADDRESS t[],int n);/*记录保存为文件*/
int load(ADDRESS t[], int n);/*从文件中读取记*/
int find(ADDRESS t[], int n, char *s);
void prin(ADDRESS temp);
void sort(ADDRESS t[],int n);/*按姓名排序*/
void copy();/*备份记录*/
int menu_select();/*主菜单函数*/
/***********主函数开始*************/
main() {
ADDRESS adr[M];
int length;
for(;;) {
switch(menu_select())/*调用主菜单函数,返回值为整数,作开关句的条件*/ {
case 0: length=enter(adr); break;/*输入记录*/
case 1: list(adr,length); break;/*显示全部记录*/
case 2: search(adr,length); break;/*查找记录*/
case 3: length= delet(adr,length); break;/*删除记录*/
case 4: length=add(adr, length); break;/*插入记录*/
case 5: modify(adr,length);break;/*修改记录*/
case 6: save(adr,length); break;/*保存文件*/
case 7: length=load(adr, length); break;/*读文件*/
case 8: sort(adr,length); break;/*按姓名排序*/
case 9: copy();
case 10: exit(0); /*如果返回值为11,则程序结束*/
}
}
}
menu_select() {
char s[80];
int c;
printf("*******************菜单****************************\n");
printf("|| 0.输入记录 ||\n");
printf("|| 1.所有联系人 ||\n");
printf("|| 2.查找联系人 ||\n");
printf("|| 3.删除联系人 ||\n");
printf("|| 4.新建联系 人 ||\n");
printf("|| 5.修改联系人 ||\n");
printf("|| 6.保存联系人 ||\n");
printf("|| 7.从文件读取联系人 ||\n");
printf("|| 8.按姓名排序 ||\n");
printf("|| 9.备份联系人 ||\n");
printf("|| 10.退出 ||\n");
printf("****************************************************\n");
do{
printf("\nEnter you choice(0-9):");
scanf("%s",s);
c=atoi(s);/*将输入的字符串转换为整形数组*/
}while(c<0 ||c>10);
return c;/*返回选择项,主程序根据该数调用相应的函数*/
}
int enter(ADDRESS t[]) /*输入记录,形参位结构体数组,函数值返回类型为整型,表示记录长度*/{
int i,n;
printf("\n please inputnum\n");
scanf("%d",&n);
printf("please inputrecord \n");
printf("name unit telephone sex\n");
printf("------------------------------------------------------------ \n");
for(i=0;i<n;i++)
scanf("%s%s%s%s",t[i].name,t[i].units,t[i].tele,t[i].sex);
printf("--------------------------------------------------------\n");
returnn;
}
void list(ADDRESS t[], int n) {
int i;
printf("\n\n**********************ADDRESS***********************\n");
printf("name unit telephone sex\n");
printf("-----------------------------------------------------------------\n");
for(i=0;i<n;i++)
printf("%-12s%-20s%-18s%-6s\n",t[i].name,t[i].units,t[i].tele,t[i].sex);
printf("**************************end****************************\n");
}
void search(ADDRESS t[], int n) {
char s[50];
int i;
int m;
printf("1.按姓名查找;2.按单位查找;3.按电话号码查找;请输入:");
scanf("%d",&m);
if(m==1){
printf("please searchname\n");
scanf("%s",s);
i=find(t,n,s);/*调用find函数,得到一个整数*/
if(i>n-1)
printf("notfound\n");/*如果整数i值大于n-1,说明没找到*/
else
prin(t[i]);/*找到,调用显示函数*/
}
if(m==2){
printf("please searchunits\n");
scanf("%s",s);
i=find(t,n,s);/*调用find函数,得到一个整数*/
if(i>n-1)
printf("notfound\n");/*如果整数i值大于n-1,说明没找到*/
else
prin(t[i]);/*找到,调用显示函数*/
}
if(m==3){
printf("please searchtele\n");
scanf("%s",s);
i=find(t,n,s);/*调用find函数,得到一个整数*/
if(i>n-1)
printf("notfound\n");/*如果整数i值大于n-1,说明没找到*/
else
prin(t[i]);/*找到,调用显示函数*/
}
}
void prin(ADDRESS temp) {
printf("\n\n***********************************************************\n");
printf("name unit telephone sex\n");
printf("----------------------------------------------------------------\n");
printf("%-20s%-30s%-15s%-6s",temp.name,temp.units,temp.tele,temp.sex);
printf("*****************************end*********************************\n");
}
int find(ADDRESS t[], int n, char *s)/*查找函数,参数为记录*/ {
int i;
for(i=0;i<n;i++) {
if(strcmp(s,t[i].name)==0||strcmp(s,t[i].units)==0||strcmp(s,t[i].tele)==0)
return i;/*相等,则返回该记录的下标号,程序提前结束*/
}
return i;/*返回i值*/
}
int delet(ADDRESS t[],int n) {
char s[20];/*要删除记录的名字*/
int ch=0;
int i,j;
printf("please deletedname\n");
scanf("%s",s);
i=find(t,n,s);
if(i>n-1)
printf("notfound not delete\n");
else {
prin(t[i]);
printf("Are yousure delete it(1(确定)/0(取消))\n");
scanf("%d",&ch);
if(ch==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);
strcpy(t[j-1].sex,t[j].sex);
}
n--;/*记录数减一*/
}
}
return n;
}
int add(ADDRESS t[], int n) {
ADDRESS temp;
int i,j;
char s[20];
printf("please inputrecord \n");
printf("**********************************************************************\n");
printf("name unit telephone sex\n");
printf("------------------------------------------------------------------------\n");
scanf("%s%s%s%s",temp.name,temp.units,temp.tele,temp.sex);
printf("-------------------------------------------------------------------------\n");
printf("please inputlocate 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[j+1].sex,t[j].sex);
}
strcpy(t[i].name,temp.name);/*将新插入记录拷贝到第i个位置*/
strcpy(t[i].units,temp.units);
strcpy(t[i].tele,temp.tele);
strcpy(t[i].sex,temp.sex);
n++;/*记录数加一*/
return n;
}
void modify(ADDRESS t[], int n) {
char s[20];
int i;
int m;
ADDRESS temp;
if(n<=0) {
printf("No telephonenumber record!\n");
return ;
}
printf("modify telephonebook record");
list(t,n);
scanf("%s",s);
i=find(t,n,s);
printf("1.修改姓名;2:修改单位;3:修改电话号码;4:修改性别,请选择:");
scanf("%d",&m);
if(i<=n-1) {
if(m==1){
printf("修改后的名字为:\n");
scanf("%20s",temp.name);
strcpy(t[i].name ,temp.name);
} else if(m==2) {
printf("修改后的单位为:\n");
scanf("%30s",temp.units);
strcpy(t[i].units,temp.units);
}
else if (m==3){
printf("修改后的电话号码为:\n");
scanf("%15s",temp.tele);
strcpy(t[i].tele, temp.tele);
} else {
printf("修改后的性别为:\n");
scanf("%6s",temp.sex);
strcpy(t[i].sex,temp.sex);
printf("*******************Modifysuccess!!!**********************\n");
}
}
else {
printf("No notfind!!");
}
return;
}
void save(ADDRESS t[], int n) {
int i;
FILE *fp;/*指向文件的指针*/
if((fp=fopen("record.txt","wb"))==NULL){
printf("can notopen file\n");
exit(1);/*退出*/
}
printf("\nSavingfile\n");
fprintf(fp,"%d",n);/*将记录数写入文件*/
fprintf(fp,"\r\n");/*将换行符号写入文件*/
for(i=0;i<n;i++) {
fprintf(fp,"%-20s%-30s%-15s%-6s",t[i].name,t[i].units,t[i].tele,t[i].sex);/*格式写入文件*/
fprintf(fp,"\r\n");/*将换行符号写入文件*/
}
fclose(fp);/*关闭文件*/
printf("*****************savesuccess!!*******************\n");
}
int load(ADDRESS t[], int n) /*读入函数,参数为结构体数组*/{
int i;
FILE *fp;/*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/ {
printf("can notopen file\n");/*不能打开*/
exit(1);/*退出*/
}
fscanf(fp,"%d",&n);/*读入记录数*/
for(i=0;i<n;i++)
fscanf(fp,"%20s%30s%15s%6s",t[i].name,t[i].units,t[i].tele,t[i].sex);/*按格式读入记录*/
fclose(fp);/*关闭文件*/
printf("you h**avesuccess read date from file!\n");
return n; /*返回记录数*/
}
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(temp.sex,t[j].sex);
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].sex,t[j+1].sex);
strcpy(t[j+1].name,temp.name);
strcpy(t[j+1].units,temp.units);
strcpy(t[j+1].tele,temp.tele);
strcpy(t[j+1].sex,temp.sex);
}
}
if(flag==0) break/*如果标志为0,说明没有发生过交换,循环结束*/;
}
printf("sortsuccess!!\n");/*显示排序成功*/
}
void copy() /*复制文件*/{
FILE *tfp,*sfp;/*定义指向文件的指针*/
char outfile[50];/*目标文件名*/
int i,n;
ADDRESS temp[M];/*定义临时变量*/
if((sfp=fopen("record.txt","rb"))==NULL)/*打开记录文件*/{
printf("Can notopen file!\n");
exit(1);
}
printf("Enter outfilename,for example c:\\f1\\te.txt:\n");
scanf("%s",outfile);
if((tfp=fopen(outfile,"wb"))==NULL){
printf("Can notopen file!");
exit(1);
}
fscanf(sfp,"%d",&n);/*读出文件记录数*/
fprintf(tfp,"%d",n);/*写入目标文件数*/
fprintf(tfp,"\r\n");/*写入换行符*/
for(i=0;i<n;i++) {
fscanf(sfp,"%20s%30s%15s%6s\n",temp[i].name,temp[i].units,temp[i].tele,temp[i].sex);
fprintf(tfp,"%-20s%-30s%-15s%-6s",temp[i].name,temp[i].units,temp[i].tele,temp[i].sex);
fprintf(tfp,"\r\n");
}
fclose(sfp);/*关闭源文件*/
fclose(tfp);/*关闭目标文件*/
printf("***You havesuccess copy file!!!***\n");
}