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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭启冰 中级黑马   /  2015-12-7 23:46  /  591 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

先准备数据模型:

        我们通讯录的每条记录:有姓名和电话,也就是说姓名和电话组成一条记录

        姓名和电话要合在一起才能表示一条数据,而且姓名和电话不是同类型,所以我们用结构体变量表示通讯录信息

        又因为为了方便以后更改姓名的长度,所以最好把姓名这个数组的长度做成宏,然后以后如果要修改姓名的长度,直接改宏就可以了


        通讯录只有1条记录吗??并不是,通讯录有好多条记录,一条记录是一个结构体变量,那么多条记录,就是结构体数组,那么这个结构体数组就是保存通讯录的所有数据

        所以我们要准备一个结构体数组,但是这个数组长度呢??

        通讯录最大容量,比如说200,比如说500,所以数组的长度要么是200,要么是500

        那么为了我们方便修改,把长度定义为宏

        因为这个数组可能很多函数都要用到,所以我们定义全局的

        比如说,你的通讯录最大容量是200,那么你的通讯真实数目是真的时刻保持200吗?

        所以我们还有一个真实的通讯录人数

                15 / 200:也就是说你总共保存200个,但是真实保存了15个


        我们是不是需要一个变量来保存这个真实的人数?所以用int变量代表真实的记录数,因为真实记录数从0开始的(因为一开始就没有通讯录信息,所以是0开始)



代码阶段:

        1.先打印出界面
            a.因为可能要多次画界面,并且又因为画界面也是一个独立的功能,所以我们可以封装成函数


        2.接收用户输入
            直接写在main里就行了


        3.根据用户输入做判断,每个分支都是不同的功能


        4.因为我们的程序是一个不断绘制主界面以及不断提醒用户输入的程序,那么应该用一个死循环来控制(从绘制界面开始到switch分支的结束)


        5.因为退出最容易写(就是return 0就可以结束main函数,结束main函数就代表程序结束),所以我们先写退出
                    a.先提示用户是否确定退出
                    b.接收用户的输入
                    c.判断用户输入的是不是y
                        如果是y
                            退出
        


因为是独立的功能:以下模块都可以封装成函数


查看联系人模块:
        a.先要判断真实的人数是否等于0
                如果是则打印你通讯录记录为空

        b.循环遍历联系人数组,然后打印出每一个元素的值
                注意:数组有多长,我就遍历多少次?
                        只要遍历实际个数次。因为只有实际个数才是真正存放记录的,其他都没有存


添加联系人模块:

        a.提示用户输入姓名
        b.接收用户的姓名
        c.提示用户输入电话
        d.接收用户输入的电话

        e.提示用户添加成功

        这些数据添加到哪去??添加到数组里去,实际长度+1


数据的持久化

注意:我们现在发现每次添加完的数据,一退出,再运行就没了,根本原因是因为数据都在内存里面,程序一退出内存就被回收了,也就是数据就没有了,所以我们应该把数据写入到硬盘里(文件流的写入),写入到硬盘里面哪怕程序退出了,我硬盘的文件还存在

    写一个函数完成写入数据到文件

            1.打开文件
            2.写入数据到文件

            因为读取的时候要用到实际长度,所以我们先写入实际长度到文件
                fwrite(&实际长度的变量,4,1,文件指针);

            然后才写保存联系人的数组,因为数组才是保存我们联系人的,但是写几个??写实际长度个
                fwrite(数组,一块一个结构体占用的字节,实际长度个,文件指针);

            3.关闭文件


        注意:写文件时的相对路径是相对于程序所在的目录(Products)


  因为你只是把数据写好了,但是你有读吗?没有读

    所以我们还需要读取文件

        什么时候读取?
            程序一启动就要读取,所以写在main函数一开始的地方

        a.打开文件
        b.读取文件
            先要读取实际保存的人数 (那样的话,才能够让我们知道该读取几个联系人内容到数组)
                fread(保存实际人数的变量地址,4,1,文件指针);

            读取实际的联系人记录
                fread(数组,联系人记录的字节数,实际的人数,文件指针);

        c.关闭文件



删除联系人:
        分析:联系人存在数组里面,那么删除联系人就意味着删除数组的某一个元素

        那么怎样删除数组中的某一个元素呢?

        分情况:
            删除的元素是最后一个元素,这是最简单的,直接把实际的人数-1就行了
                因为每次遍历都是只循环实际的人数次,哪怕是写入到文件也只是写入实际的人数块数

            
            要删除的元素不是最后一个元素怎么办
                就是从要删除的元素开始,它后面的每一个元素都往前进1位,实际的人数-1就行了


        0.判断是否已经存在联系人数据,如果不存在则返回
        a.先打印所有的联系人列表,以供用户选择
        b.接收用户选择要删除的序号
        c.合法性判断,判断条件:如果小于1 或者大于真实长度 就是非法的,就让它循环不断的输入(因为不知道要输入多少次才输入正确,所以用死循环)

        d.如果进到这一步,代表输入的序号正确了,然后我们就删除联系人数组中的某个元素就行了

        e.立即保存到文件



修改联系人:
        a.要判断是否已经存在联系人数据,不存在则返回
        b.显示联系人列表,以供用户选择
        c.接收用户选择要修改的序号
        d.合法性判断,判断条件:如果小于1 或者大于真实长度 就是非法的,就让它循环不断的输入(因为不知道要输入多少次才输入正确,所以用死循环)

        e.如果到这一步,代表输入序号正确,然后修改数组中某个元素,先找到这个元素
                        怎么找?用户输入的序号-1就是这个元素的下标

           让这个元素重新被赋值,其实就是直接让用户输入,然后把输入的值赋值给这个元素


查找联系人:
        a.提示用户输入要查找的联系人姓名
        b.接收用户输入的姓名
        c.循环遍历联系人数组,遍历实际的个数次
                把当前遍历的元素的姓名 与 用户输入的姓名 进行比较

                   tip: strcmp(字符串1,字符串2) == 0 代表相等

                    如果相等:
                        打印这个人的电话号码
                        因为找到了,所以没必要往后面循环了,所以break结束循环


        d.当循环全部结束都还没有找到的话,就代表没有这个人,就提示查无此人


收尾:
    读取数据是独立的功能,因此也可以封装成函数
*/

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马