A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yll 中级黑马   /  2015-12-11 18:49  /  1612 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

通讯录写好后 存好几个联系人和电话 结束程序 重新运行  上一次写的就少一个 而且多了 一行空白 能帮我看看 是写错了 还是Xcode别的什么原因~字数限制我只能分开发了~

*/

#include <stdio.h>
#include <string.h>
/******** 宏定义 ******/
#define N 100         //定义通讯录的容量
#define NAMELEN 22
#define NUMLEN 12

//*************** 定义部分 ********
//定义联系人的结构体
typedef struct{
    //联系人
    char name[NAMELEN];
//    电话号码
    char telNum[NUMLEN];
}Person;

//存储所有的联系人  的数组
Person contacts[N];//能够存储一百个联系人

//定义联系人的个数
int totalContactCount=0;
//接受用户输入的编号
int fno;
//定义数据文件保存的位置
char *filePath = "telbook.data";
//**************** 函数的声明部分**********
int validataInput(int num,int min,int max);
void init();
void doAdd();
void writeFile();
void doDelete();
void doUpdate();
void doList();
void doSearchByName();

int main(int argc, const char * argv[]) {
    /**
     1、引入头文件
     2、进行必要的宏定义
     3、定义文件名称变量、联系人数组、联系人结构体
     4、定义函数,并进行函数声明
     5、编写循环控制程序
     6、显示操作界面
     7、根据编号执行不同的函数
     */
   
    init();
    printf("通讯录初始化完成!\n");
   
    while (1) {
        
        printf("\n");
        //软件界面显示出来
        printf("********************************\n");
        printf("********  欢迎使用通讯录 *********\n");
        printf("********  1.添加联系人  *********\n");
        printf("********  2.删除联系人  **********\n");
        printf("********  3.修改联系人  **********\n");
        printf("********  4.查看所有联系人 *******\n");
        printf("********  5.搜索联系人  *********\n");
        printf("********  6.退出系统   **********\n");
        printf("********************************\n");
        
        //提示用户选择一个序号
        printf("请选择1-6之间的功能编号:\n");
        scanf("%d",&fno);
        
        //判断编号是否合法
        validataInput(fno, 1, 6);
        switch (fno) {
            case 1:
                //执行添加
                doAdd();
                break;
            case 2:
                //执行删除
                doDelete();
                break;
            case 3:
                //执行修改
                doUpdate();
                break;
            case 4:
                //执行显示所有联系人
                doList();
                break;
            case 5:
                //执行查找
                doSearchByName();
                break;
            case 6:
                //执行退出系统
                printf("系统长在退出...\n");
                printf("系统已经退出!\n");
                return 0;
                break;
            default:
                break;
        }
        
        
    }
   
   
   
    return 0;
}




//验证输入是否合法
int validataInput(int num,int min,int max){
   
    if (num<min||num>max) {
        printf("非法的输入!");
        return 1;
    }
    return 0;
}


4 个回复

倒序浏览
yll 中级黑马 2015-12-11 18:50:34
沙发
//添加联系人
/*思路
1提示用户输入联系人姓名
2接收联系人
3提示用户输入电话号码
4接收电话号码
5确认添加
6联系人个数+1
7把联系人信息写入到文件中
*/
void doAdd(){
   
    printf("您选择的是添加联系人,请按提示操作:\n");
//    1提示用户输入联系人姓名
    printf("请输入联系人的姓名:(*注意联系人姓名中间不能有空格)\n");
   
//    2接收联系人
    scanf("%s",contacts[totalContactCount].name);
//    3提示用户输入电话号码
    printf("请输入联系人电话,(*注意电话号码中间不要有空格)\n");
//    4接收电话号码
    scanf("%s",contacts[totalContactCount].telNum);
//    5确认添加
    int flag;
    printf("您确认要添加数据吗?1.确认 0.取消\n");
    scanf("%d",&flag);
    if (flag) {
//    6联系人个数+1
        totalContactCount++;
   
//    7把联系人信息写入到文件中
        writeFile();
        
        
    }
   
}

/**
* 删除联系人
1提示用户输入联系人编号
2判断编号是否合法 编号不能大于联系人个数
3如果变法合法的话 提示用户在此确认删除
4开始删除数组元素
    1)删除的元素正好是数组的最后以歌元素
      只需要让联系人个数  减1
    2)如果删除的元素不是数组的最后一个元素
     需要移动元素
    联系人数量 -1
5同步更新到文件中

*/
void doDelete(){
   
    printf("您选择的是删除联系人,请按提示操作:\n");
// 删除前先调用一下打印看看 要删除哪些
    doList();
   
//    1提示用户输入联系人编号
    int no;
    printf("请输入要删除的联系人编号:\n");
    scanf("%d",&no);
//    2判断编号是否合法 编号不能大于联系人个数
    if (validataInput(no, 1, totalContactCount)) {
        return;
    }
//    3如果变法合法的话 提示用户在此确认删除
    int flag;
    printf("删除联系人后,数据将无法恢复,您确认要删除吗?1.确认 0.取消\n");
    scanf("%d",&flag);
    if (flag) {
        
   
//    4开始删除数组元素
//    1)删除的元素正好是数组的最后以歌元素
//    只需要让联系人个数  减1
        
        if (no==totalContactCount) {
            totalContactCount--;
        }else{
        
//    2)如果删除的元素不是数组的最后一个元素
//    需要移动元素
//    联系人数量 -1
        
            for (int i=no; i<totalContactCount; i++) {
//                元素的移动和覆盖
                contacts[no-1]=contacts[no];
            }
            
            totalContactCount--;
            
            
        }
        
//    5同步更新到文件中
        writeFile();
    }
   
   
}
回复 使用道具 举报
yll 中级黑马 2015-12-11 18:52:10
藤椅
//修改联系人
/*
1提示用户输入修改的信息编号
2验证编号是否合法
3输入新的用户名和新的电话号码
4让用户再次query修改
5更新新的用户名和电话 更新数据信息
6写入到文件中

*/
void doUpdate(){
   
    printf("您选择的是修改联系人,请按提示操作:\n");
    doList();
//    1提示用户输入修改的信息编号
   
    int no;
    printf("请输入要修改的联系人编号:\n");
    scanf("%d",&no);
    //    2判断编号是否合法 编号不能大于联系人个数
    if (validataInput(no, 1, totalContactCount)) {
        return;
    }
//    3输入新的用户名和新的电话号码
        char name1[NAMELEN];
        char tel[NUMLEN];
        printf("请输入联系人新的姓名:(*注意联系人姓名中间不能有空格)\n");
        scanf("%s",name1);
        printf("请输入联系人新的电话:(*注意联系人电话中间不能有空格)\n");
        scanf("%s",tel);
//    4让用户再次确认修改
        int flag;
        printf("确认修改吗?1.确认 0.取消\n");
        scanf("%d",&flag);
        if (flag) {
            
        
//    5更新新的用户名和电话 更新数据信息
            strcpy(contacts[no-1].name, name1);
            strcpy(contacts[no-1].telNum, tel);
            
//    6写入到文件中
            writeFile();
        }
        
}

//显示所有联系人
//前提  系统已经完成了初始化工作(如果文件存在则读取文件中的所有数据)
//1 首先 做一个判断
//   totalContactCount==0 表示没有联系人
//2如果不等于0  开始遍历并且输出联系人的信息
void doList(){
   
    printf("显示所有联系人,联系人数据如下:\n");
   
//    判断通讯录是否为空
    if (totalContactCount==0) {
        printf("您的通讯录 还没有小伙伴~请添加小伙伴!\n");
    }else{
        
//        输出格式
        printf("编号\t 姓名\t 电话\t \n");
        
//        遍历联系人数组
        
        for (int i=0; i<totalContactCount; i++) {
            
            
            printf("%d\t %s\t %s\t \n",i+1,contacts[i].name,contacts[i].telNum);
        }
    }
   
}

//搜索联系人
/*
1提示用户输入要搜索的联系人姓名
2按照姓名进行查找(遍历)
    1)输入的姓名和contacts[i].name比较
    2)搜索不到
         遍历一遍  都没有这个名称 提示查找不到


*/
void doSearchByName(){
   
    printf("您选择的是搜索联系人,请按提示操作:\n");
//    1提示用户输入要搜索的联系人姓名
    char name[NAMELEN];
    printf("请输入要查找的联系人:\n");
    scanf("%s",name);

//    2按照姓名进行查找(遍历)
    int i;
    for (i=0; i<totalContactCount; i++) {
        //    1)输入的姓名和contacts[i].name比较
//        比较两个字符串是否相等  strcmp()==0
        if (strcmp(name, contacts[i].name)==0) {
//            打印出姓名对应的电话号码
            printf("您搜索的联系人%s 电话号码是%s\n",name,contacts[i].telNum);
            break;//循环要停止
        }
    }
   
   

//    2)搜索不到
//    遍历一遍  都没有这个名称 提示查找不到
    if (i==totalContactCount) {
        printf("对不起 差无此人!\n");
    }
   
   
}
回复 使用道具 举报
yll 中级黑马 2015-12-11 18:59:35
板凳
//0 初始化
//
//1)尝试性的读取文件
//2)如果成功了,说明文件存在,则读取文件内容
//   如果存在,要读取联系人数据,保存到联系人数组contacts
//3)不成功,说明文件不存在,
//   读取失败 说明我们第一次使用通讯录
//     3.1 创建联系人数据文件
//     3.2 把当前联系人的个数 写入到文件中 totalContactCount =0
//1)创建文件
//2)写入联系人数量


void init(){
   
//    定义文件指针,并且打开文件
    FILE *fp = fopen(filePath, "r");
   
    if (fp!=NULL) {
        
//        第一步:读取联系人的个数
        fread(&totalContactCount, sizeof(totalContactCount), 1, fp);
        
//        第二步:读取每一个联系人
        for (int i=0; i<totalContactCount; i++) {
            
//            读取联系人数据到联系人数组中
            fread(&contacts, sizeof(Person), i, fp);
        }
        
        
    }else{
        
//        创建文件
        fp =fopen(filePath, "wb");
//        写入联系人的个数
        fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);
        
        printf("通讯录文件创建成功~!\n");
        
    }
   
   
//    关闭文件指针
    fclose(fp);
}


//写数据到文件中
//1以wb方式打开文件
//2先写联系人个数
//3写每个联系人数据
void writeFile(){
   
    FILE *fp=fopen(filePath, "wb");
   
    if (fp!=NULL) {
        fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);
        
        
        for (int i=0; i<totalContactCount; i++) {
            fwrite(&contacts, sizeof(Person), 1, fp);
            
        }
        
        printf("写文件数据更新成功!\n");
    }
   
    fclose(fp);
}

11.png (30.4 KB, 下载次数: 74)

11.png

12.png (31.43 KB, 下载次数: 17)

12.png
回复 使用道具 举报
yll 中级黑马 2015-12-13 09:37:33
报纸
0.0没有人理我么~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马