课程设计之通讯录(修改)

#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");

        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值