设计题目:班级通讯录管理
简单描述:完成一个班级学生的通讯记录管理。学生基本信息包含姓名、电话号码、QQ号和宿舍号。
详细描述:对班上学生的通讯基本信息包含姓名、电话号码、QQ号和宿舍号,进行统一整理并可以按电话号码或姓名等查到学生个人基本通讯信息。可以显示所有的通讯记录,并对现有的通讯记录进行修改和增删等处理。
技术路线:通讯录数据以文本文件存放在文件中 2. 需要提供文件的输入输出等操作 3. 还需要保存记录已进行修改,删除,查找的操作 4. 另外提供键盘式选择菜单实现功能的选择
学生任务:完成基本要求,基本功能。设计的程序结构要合理。最后撰写文档。文档至少包括问题描述、数据结构、算法流程图、源代码、运行截图。
--------------------------------------------------------------------------------------------
开发者开发流程:
定义:完成一个班级学生的通讯记录管理。学生基本信息包含姓名、电话号码、QQ号和宿舍号。
需求:导入(文件fopen)、输入(从终端)、显示/输出(show)、保存(save)、查询(姓名、电话)、合并、处理查询结果(?)更新(?)、退出、删除、增加、
流图:如下
设计:
编程:
调试:
维护:
总结:完成了各类函数的声明和导入(init)、输入、选项格式等功能的实现。对设计的程序有了大体流程和需求分析,但好多知识点已经遗忘,自己和其他同学也渐渐有了差距,不努力不行。
2015年7月20日8:09:51第一天
1、开发者开发流程
生命周期:分为七个阶段
对问题的定义:大小、范围、规模等;
需求分析:开发的软件要实现的功能罗列(包括性能要求);
画数据流图:
进入设计:总体规划(划分模块、输入、输出等)、详细设计模块(写出算法,分步骤)
编程:
调试:测试过程(从小单元测试,到集成测试,到整个系统的运行)
维护阶段:时间最长
2、每个阶段要求有文档来支撑,内容可以建立自己班级的,可以增加其他的
用结构体里多设置几个成员,以包含更多信息
对结构体和数组的利用
3、过程中出现的知识盲点或不熟悉地方
1) 枚举类型 enum
为整数定义别名可以用预处理指令define,如:
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
所以,定义一种新的数据类型完成同样工作,即枚举类。
enum DAY
{
MON=1, TUE, WED, THU,FRI, SAT, SUN
};
(1)枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。。
(2)第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。
(3)可以人为设定枚举成员的值,从而自定义某个范围内的整数。
(4)类型定义以分号;结束。
在本程序中,使用了枚举来对不同选项的整数给别名。
Typedef enum operation{
…
}kLoginOperationStyle;
2) 避免重定义的#ifndef
ifndef 是if not define的缩写,条件指示符#ifndef的最主要目的是防止头文件的重复包含和编译。
/**********************************/
语句1 #ifndef 标识1
语句2 #define 标识1
语句3 #endif
语句4 ……
语句5 ……
该段代码意思是:如果标识1没有被定义,则重定义标识1,即执行语句2、语句3;如果标识1已经被定义,则直接跳过语句2、语句3,直接执行语句4、语句5、……
/***********************************/
备注:#ifndef 和#endif 要一起使用,如果丢失#endif,可能会报错。
千万不要忽略了头文件中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。在本程序中,在Constants.h文件中,自动添加了ifndef的部分。
3) 二重指针和函数的关系仍晕……
4) 文件和指针内存是否为空的检测代码
FILE*fp=fopen(kFilePath,”r”);
If(fp==NULL){
Printf(“error”);
Exit(EXIT_FAILURE);
}
tempPointer=(Student*)malloc(1*sizeof(Student));
if(tempPointer== NULL){
printf(“error”);
exit(EXIT_FAILURE);
}
if(feof(fp)!=0){
break;//正常读完
}
if(ferror(fp)!=0){
printf(“error!”);//错误
Exit(EXIT_FAILURE);
}
5) fread
函数原型fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
buffer用于接收数据的内存地址
size要读的每个数据项的字节数,单位是字节
count要读count个数据项,每个数据项size个字节.
stream输入流
如本程序中成功分配内存后一次while有一个fread(tempPointer+count,sizeof(Student),1,fp);
参考资料:
1、 枚举类型参考资料
http://blog.163.com/redhumor@126/blog/static/1955478420114333815940/
2、 避免重定义的#ifndef
http://baike.baidu.com/link?url=jSQiUsGWKf-aGadgChSUaGrkUD3fIlK6v1Aim1Sp3q1U63rmmVbMrSgs5_HtPXFzsuZa54UCgAD-VIQvt2-IUa