黑马程序员技术交流社区

标题: c语言通讯录代码实现 [打印本页]

作者: 和夏一样狂热    时间: 2015-8-4 21:53
标题: c语言通讯录代码实现
/*
printf("**************************\n");
printf("****** 欢迎使用通讯录 ******\n");
printf("****** 1、添加联系人  ******\n");
printf("****** 2、删除联系人  ******\n");
printf("****** 3、修改联系人  ******\n");
printf("****** 4、查看所有联系人 ****\n");
printf("****** 5、搜索联系人  ******\n");
printf("****** 6、退出系统    ******\n");
printf("**************************\n\n");


//  Created by 小小罗 on 15/8/3.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#define NAMELEN 22  //结构体姓名的长度
#define NUMLEN 12   //结构体电话号码的长度
#define N 100


//    定义联系人的结构体
typedef   struct {
   
    char name[NAMELEN];//结构体姓名的长度
    char telnum[NUMLEN];//结构体电话号码的长度
}p;

p contacts[N];//定义变量存联系人   最多可存100个  存储所有联系人的数组

int totalcontactcount = 0;//定义联系人的个数   初始化为0

//定义变量  初始化为0      接收用户输入的编号
int fno = 0;



int validateinput(int num,int m,int n);//声明函数  判断用户输入的编号是否合法
void quit();                           //声明程序退出的函数
void init();                           //声明初始化函数
void writeFile();                      //声明doadd中 写入文件函数
void doAdd();                          //声明添加联系人函数
void doList();                         //声明显示所有联系人函数
void doDelate();                       //声明删除联系人函数
void doUpdate();                       //声明修改联系人函数
void doSearch();                       //声明搜索函数



int main(int argc, const char * argv[]) {
   
   

    //    初始化通讯录
    init();
    printf("通讯录初始化完成!\n");
   
   
    while (1) {
        printf("**************************\n");
        printf("****** 欢迎使用通讯录 ******\n");
        printf("****** 1、添加联系人  ******\n");
        printf("****** 2、删除联系人  ******\n");
        printf("****** 3、修改联系人  ******\n");
        printf("****** 4、查看所有联系人 ****\n");
        printf("****** 5、搜索联系人  ******\n");
        printf("****** 6、退出系统    ******\n");
        printf("**************************\n\n");
        //        提示用户输入编号 并接收

        printf("请选择1-6之间的功能编号!\n");
        scanf("%d",&fno);
        //判断编号是否合法
        validateinput(fno, 1, 6);
        

        
        //判断
        
        switch (fno) {
            case 1:
                doAdd(); //执行添加联系人
                break;
            case 2:
                doDelate();//执行删除联系人
                break;
            case 3:
                doUpdate();//执行修改联系人
                break;
            case 4:
                doList();//执行查看所有联系人
                break;
            case 5:
                doSearch();//执行搜索联系人
                break;
            case 6:
                quit();
                break;
}

    }
   
   
    return 0;
}

//定义一个函数  判断用户输入的联系人是否合法
int validateinput(int num,int m,int n){
   
    if (num < m || num > n) {
        printf("编号不合法,请重新输入编号!\n");
    }
    return 0;
}






void init(){
//
//    写入格式:         fwrite(变量地址,数据块的大小,块数,fp);
//    读取格式:         fread(变量的地址,数据块的大小,块数,fp)

    FILE *fp = fopen("telbook.data", "r");  //定义文件指针  并且打开文件
   
    if (fp != NULL) {  //如果不为空 打开成功
        
        fread(&totalcontactcount, sizeof(totalcontactcount), 1, fp);// 读取文件 即读取联系人的个数
//        遍历数组每一个元素  读取每一个联系人到联系人数组中
        for (int i = 0; i < totalcontactcount; i++) {
            
            fread(&contacts[i], sizeof(p), 1, fp);
            
        }
    }else{  //  如果文件不存在     则创建文件  创建通讯录
        fp = fopen("telbook.data", "wb");//
        
        fwrite(&totalcontactcount, sizeof(totalcontactcount), 1, fp);//写入联系人的个数
   
        printf("通讯录文件创建成功!\n");
    }

    fclose(fp);
}



void doAdd(){
//
    printf("你选择的是添加联系人,请按提示操作!\n");
//    1、提示用户输入联系人并接收
    printf("请输入联系人姓名:(*姓名之间不能有空格)\n");
    scanf("%s",contacts[totalcontactcount].name);
//    2、提示用户输入联系人电话号码并接收
    printf("请输入联系人电话号码:(*电话号码之间不能有空格)\n");
    scanf("%s",contacts[totalcontactcount].telnum);
//    3、再次询问确定是否添加
    int flag;
    printf("你确认要添加联系人吗?1.确认   0.取消 \n");
    scanf("%d",&flag);
    if (flag) {
        //    4、联系人个数+1
        totalcontactcount++;
    }

//    5、将联系人信息文件写入到文件中    定义写入函数writefile
    writeFile();
//
}






/**删除联系人
1、提示用户输入联系人编号   并接收保存
2、判断编号是否合法   编号不能大于联系人个数
3、再次确认是否删除
4、开始删除数组元素
1)删除的元素正好是数组的最后一个元素
只需让联系人个数减一
2)删除的元素不是数组的最后一个元素
需要移动元素
联系人个数减一

*/
void doDelate(){
   
    int no;
   
    printf("请输入要删除的联系人编号:\n");
   
    scanf("%d",&no);
   
    validateinput(no, 0, totalcontactcount);
   
    int flag;
   
    printf("删除联系人后,数据将无法恢复,你确定要删除吗?1.确定 0.取消\n");
   
    scanf("%d",&flag);
   
    if (flag) {
        
        if (no == totalcontactcount) {
            totalcontactcount--;//如果编号是最后一个   只需联系人减一就ok
        }else{
        for (int i = no; i < totalcontactcount; i++) {
                contacts[i-1] = contacts[i];//如果不是最后一个  那么需要移动元素并且覆盖  后面的覆盖的前面的
            }
            totalcontactcount--;//最后一个舍弃
        }
    }

    writeFile();


}


/**修改联系人
1.提示用户输入要修改的联系人编号
2.验证编号是否合法
3.输入新的联系人和电话  保存到数组中
4.再次确认是否要修改
5.更新数组
6.写入文件
*/
void doUpdate(){
    int no;
    printf("请输入要修改的联系人编号:\n");
    scanf("%d",&no);
    validateinput(no, 0, totalcontactcount);//判断编号是否合法
    char name1[NAMELEN];//定义新的数组
    char tel[NUMLEN];
   
    printf("请输入新的联系人姓名:(*注意联系人姓名中间不能有空格)\n");
    scanf("%s",name1);
   
    printf("请输入新的联系人电话:(*注意联系人电话中间不能有空格)\n");
    scanf("%s",tel);        //接收新的联系人姓名和电话保存到新的数组中
    int flag;
    printf("你确定要修改联系人么?1.确定  0.取消");
    scanf("%d",&flag);
    if (flag) {
        strcpy(contacts[no-1].name, name1);
        strcpy(contacts[no-1].telnum, tel);
        //后面的覆盖前面的   导入#include <string.h>
    }
        writeFile();//再次写入
}


/**搜索联系人通过姓名
1.提示用户输入姓名
2.保存
3.按照姓名进行查找(遍历)   判断姓名是否相等   
比较两个字符串是否相等   strcmp(  ,   ) == 0


*/


void doSearch(){
    char name[NAMELEN];
    printf("请输入要搜索的联系人姓名:\n");
    scanf("%s",name);
    int i;
    for ( i = 0; i < totalcontactcount; i++) {
        
    if (strcmp(name, contacts[i].name) == 0) {
        printf("你搜索的联系人%s的电话号码是:%s\n",name,contacts[i].telnum);
        break;
    }
            }
   
    if (i == totalcontactcount) {
        printf("查无此人\n");

    }
   
   
   
}



/**查看所有联系人
前提:系统已经完成了初始化工作(如果文件存在则读取文件中所有的数据)

首先做一个判断
联系人totalcontactcount是否为0;若为0   通讯录没有人

若不为0   遍历联系人数组

*/
void doList(){
   
    printf("显示所有联系人,联系人数据如下:\n");
   
    if (totalcontactcount == 0) {
        printf("你的通讯录还没有小伙伴,请添加小伙伴!\n");
    }else{
        
        
        //    循环遍历出所有联系人
        printf("编号:\t姓名:\t电话:\n");
        for (int i = 0; i < totalcontactcount; i++){
            printf("%02d\t%s\t%s\n",i+1,contacts[i].name,contacts[i].telnum);
        }
    }
}



//退出
void quit(){
    printf("系统正在推出......\n");
    printf("系统已退出\n\n");
}


//重新写入数据到文件中


void writeFile(){
   
    FILE *fp = fopen("telbook.data", "wb");//以wb方式打开文件
    if (fp != NULL) {
        fwrite(&totalcontactcount, sizeof(totalcontactcount), 1, fp);
    }//先写联系人个数
   
    for (int i = 0; i < totalcontactcount; i++) {
        fwrite(&contacts[i], sizeof(p), 1, fp);
    }//再写每个联系人的数据   每次都写入一个数组的元素
   
    printf("写入文件成功!\n\n");
   
    fclose(fp);
   
}




















作者: 何时归来看花开    时间: 2015-8-4 21:58
很不错哦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2