黑马程序员技术交流社区

标题: C语言通讯录窍门 [打印本页]

作者: 郭启冰    时间: 2015-12-6 23:08
标题: C语言通讯录窍门
#include <stdio.h>
#include <string.h>

//宏定义列表
#define NAME_LEN 15
#define CONTACT_MAX 200


//函数声明列表
void drawMainUI();
void showAllList();
void addContact();
void writeToFile();
void deleteContact();
void editContact();
void searchContact();
void initContacts();


//联系人的结构体
typedef struct {
   
    char name[NAME_LEN]; //姓名
    int phone;    //电话号码
   
}Person;


//全局列表
Person contacts[CONTACT_MAX]; //通讯录数组(保存通讯录数据的)
int realCount = 0; //真实的记录数

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

    //读取数据
    initContacts();
   
    printf("欢迎使用传智通讯录v26期专版\n\n");
    //system("say 欢迎使用传智通讯录v26期专版");
   
    while (1) {
        
        drawMainUI();
        
        puts("请输入您要进行的操作(请输入序号)");
        //system("say 请输入您要进行的操作(请输入序号)");
        
        //接收用户输入选择序号
        int choose;
        scanf("%d",&choose);
        
        //判断用户输入,根据用户输入的数字做不同的功能
        
        switch (choose) {
               
                //添加功能
            case 1:
                addContact();
                break;
               
                //删除功能
            case 2:
                deleteContact();
                break;
               
                //修改功能
            case 3:
                editContact();
                break;
               
                //查看所有联系人功能
            case 4:
                showAllList(); //函数调用  函数名(参数列表)
                break;
               
                //搜索功能
            case 5:
                searchContact();
                break;
               
                //退出功能
            case 6:
                puts("请确认是否要退出,输入y退出,否则输入任意键返回");
                char answer;
                scanf(" %c",&answer); //%c前面一定要加空格,因为防止前面输入的回车被你用了

                //如果要退出
                if(answer == 'y'){
                    
                    return 0;//结束main函数就代表程序结束
                }
      
                break;
               
                //非法输入
            default:
               
                //在这里面写下面这一句话,可以防止死循环错误
                while (getchar() != '\n');
               
                printf("非法输入\n");
                break;
        }
   
    }
   
    return 0;
}

/**
*  初始化联系人数组(从文件读取数据)
*/
void initContacts(){
   
    //读取数据
    FILE *fp = fopen("contact.data", "r");
   
    if(fp){
        
        //读取数据,在读取之前,要先知道需要读取多少个元素
        //我怎么知道有多少个?是不是我要从一个地方知道啊?
        //应该把真实的个数存在硬盘里面,然后呢,我先读取出实际的个数,就行了
        
        //先读取实际的个数
        fread(&realCount, sizeof(realCount), 1, fp);
        
        //读取实际的元素,一共读取realCount个
        fread(contacts, sizeof(contacts[0]),realCount, fp);
        
        //关闭文件
        fclose(fp);
    }

}

/**
*  写入数据到文件
*/
void writeToFile(){
   
   
    //1.打开文件
    FILE *fp = fopen("contact.data", "w");
   
    if(fp){
        //2.操作文件(写入通讯录数据到文本)
        
        //要先写入实际的个数,方便我们读取的时候知道读取多少个
        fwrite(&realCount, sizeof(realCount), 1, fp);
        
        //再继续写通讯录真实保存的数据
        fwrite(contacts, sizeof(contacts[0]), realCount, fp);
        
        //3.关闭文件
        fclose(fp);
    }
}

/**
*  绘制主界面
*/
void drawMainUI(){
   
    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");
}

/**
*  显示联系人列表
*/
void showAllList(){
   
    //a.先要判断真实的人数是否等于0
    if( realCount == 0){
       //如果是则打印你通讯录记录为空
        puts("你丑到没朋友,赶紧去交几个朋友添加一下通讯录吧");
        return; //结束函数,因为没有记录的话就没必要执行下面的遍历语句
    }
   
    //b.循环遍历联系人数组,然后打印出每一个元素的值
    //注意:数组有多长,我就遍历多少次?
    //只要遍历实际个数次。因为只有实际个数才是真正存放记录的,其他都没有存
   
    puts("********显示联系人列表********");
   
    for(int i=0;i<realCount;i++){
        
        printf("%d:




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