黑马程序员——C语言基础---通讯录
2015-09-30 18:38
323 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
一、功能分析及实现步骤
0、初始化
/**
初始化方法,用于初始化数据
思路:
1)尝试性的读取文件
2)如果成功了,说明文件存在,则读取文件内容
3)不成功,说明文件不存在,
1)创建文件
2)写入联系人数量
*/
1、添加联系人
/**
* 添加联系人
思路:
1)提示用户输入姓名和电话号码
2)接收用户输入的内容
3)保存到联系人数组
4)写入到文件中*/
2、删除联系人
/**
*删除联系人的函数
思路:
1)让用户输入要删除的数据的编号
2)判断编号是否合法
3)让用户再次确认删除
4)开始删除数组元素
5)删除文件内容
*/
3、修改联系人
/**
*更新联系人信息
思路:
1)提示输入要修改的联系人编号
2)判断编号是否合法
3)让用户输入新的姓名、电话
4)让用户再次确认修改
5)开始修改用户信息
6)更新到文件中
*/
4、查看联系人
/**
*查看所有的联系人
思路:
1)先判断联系人是否为空
2)如果不为空,遍历数组,显示所有的联系人
*/
5、搜索联系人
/**
*根据联系人的姓名查找联系人
思路:
1)提示用户输入要查找的人的姓名
2)遍历联系人数组,查找有没有这个人
3)查找到了,把电话号码显示出来
4)没有查找到,提示没有这个联系人
*/
6、退出系统
二、界面、框架搭建
1、C语言《通讯录》界面框架搭建
/**
1、引入头文件
2、进行必要的宏定义
3、定义文件名称变量、联系人数组、联系人结构体
4、定义函数,并进行函数声明
5、编写循环控制程序
6、显示操作界面
7、根据编号执行不同的函数
*/
-------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、功能分析及实现步骤
0、初始化
/**
初始化方法,用于初始化数据
思路:
1)尝试性的读取文件
2)如果成功了,说明文件存在,则读取文件内容
3)不成功,说明文件不存在,
1)创建文件
2)写入联系人数量
*/
1、添加联系人
/**
* 添加联系人
思路:
1)提示用户输入姓名和电话号码
2)接收用户输入的内容
3)保存到联系人数组
4)写入到文件中*/
2、删除联系人
/**
*删除联系人的函数
思路:
1)让用户输入要删除的数据的编号
2)判断编号是否合法
3)让用户再次确认删除
4)开始删除数组元素
5)删除文件内容
*/
3、修改联系人
/**
*更新联系人信息
思路:
1)提示输入要修改的联系人编号
2)判断编号是否合法
3)让用户输入新的姓名、电话
4)让用户再次确认修改
5)开始修改用户信息
6)更新到文件中
*/
4、查看联系人
/**
*查看所有的联系人
思路:
1)先判断联系人是否为空
2)如果不为空,遍历数组,显示所有的联系人
*/
5、搜索联系人
/**
*根据联系人的姓名查找联系人
思路:
1)提示用户输入要查找的人的姓名
2)遍历联系人数组,查找有没有这个人
3)查找到了,把电话号码显示出来
4)没有查找到,提示没有这个联系人
*/
6、退出系统
二、界面、框架搭建
1、C语言《通讯录》界面框架搭建
/**
1、引入头文件
2、进行必要的宏定义
3、定义文件名称变量、联系人数组、联系人结构体
4、定义函数,并进行函数声明
5、编写循环控制程序
6、显示操作界面
7、根据编号执行不同的函数
*/
<span style="font-size:14px;">//头文件 #include <stdio.h> #include <string.h> //宏定义 #define NAMELEN 22 #define NUMLEN 12 #define N 100 //定义通讯录的容量 //********定义部分******** //定义联系人的结构体 typedef struct{ //联系人 char name[NAMELEN]; //电话号码 char telNum[NUMLEN]; }Person; //存储所有的联系人,联系人的数组 Person contacts ;//能够存储100个联系人 //定义联系人的个数 int totalContactCount = 0; //接收用户输入的编号 int fno; //定义数据文件保存数据 char *filePath = "telbook.date"; //********函数的声明部分********** int validateInput(int num,int min,int max); void writeFile(); void init(); void doAdd(); 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\n"); //提示用户选择一个序号 printf("请选择1-6之间的功能编号:\n"); scanf("%d",&fno); //判断编号是否合法 validateInput(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; } /** * 验证输入是否合法 * * @param num 待验证的数 * @param min 最小值 * @param max 最大值 * * @return 1 非法 0 正常 */ int validateInput(int num,int min,int max){ if (num < min || num > max) { printf("非法的输入!"); return 1; } return 0; } /** * 添加联系人 思路: 1、提示用户输入联系人姓名 2、接受联系人 3、提示用户输入电话号码 4、接受电话号码 5、确认添加 6、把联系人个数+1 7、把联系人信息吸入到文件中 */ void doAdd(){ printf("您选择的是添加联系人,请按提示操作:\n"); //提示用户输入联系人姓名 printf("请输入联系人姓名:(*注意联系人姓名中间不能有空格)\n"); //接受联系人 scanf("%s",contacts[totalContactCount].name); //提示用户输入电话号码 printf("请输入联系人电话:(*注意联系人号码中间不能有空格)\n"); //接受电话号码 scanf("%s",contacts[totalContactCount].telNum); //确认添加 int flag; printf("您确认要添加数据吗?1.确认 0.取消\n"); scanf("%d",&flag); if (flag) { //把联系人个数+1 totalContactCount++; //把联系人信息吸入到文件中 writeFile(); } } /** * 删除联系人 思路: 1、让用户输入要删除的数据的编号 2、判断编号是否合法 3、让用户再次确认删除 4、开始删除数组元素 1)删除的元素正好是数组的最后一个元素 需要让联系人个数-1 2)删除的元素不是数组的最后一个元素 需要移动元素 5、删除文件内容 */ void doDelete(){ printf("您选择的是删除联系人,请按提示操作:\n"); doList(); //让用户输入要删除的数据的编号 int no; printf("请输入要删除的联系人的编号:\n"); scanf("%d",&no); //判断编号是否合法 if (validateInput(no, 1, totalContactCount)) { return ; } //让用户再次确认删除 int flag; printf("删除联系人后,数据将无法恢复,您确认要删除该联系人吗?1.确认 0.取消\n"); scanf("%d",&flag); if (flag) { //开始删除数组元素 //删除的元素正好是数组的最后一个元素 if (no == totalContactCount) { //只需要让联系人个数-1 totalContactCount--; }else{ //删除的元素不是数组的最后一个元素 //需要移动元素 for (int i = no; i < totalContactCount; i++) { //元素的移动和覆盖 contacts[no - 1] = contacts[no]; } //联系人数量-1 totalContactCount--; } //同步联系人到文件中 writeFile(); } } /** * 修改联系人 思路 1、提示输入要修改的联系人编号 2、判断编号是否合法 3、让用户输入新的姓名的电话 4、让用户再次确认修改 5、开始修改用户信息 6、更新到文件中 */ void doUpdate(){ printf("您选择的是修改联系人,请按提示操作:\n"); doList(); //提示输入要修改的联系人编号 int no; printf("请输入要修改的联系人编号:\n"); scanf("%d",&no); //判断编号是否合法 if (validateInput(no, 1, totalContactCount)) { return ; } //让用户输入新的姓名的电话 char name1[NAMELEN]; char tel[NUMLEN]; //提示用户输入联系人姓名 printf("请输入新的联系人姓名:(*注意联系人姓名中间不能有空格)\n"); //接受联系人 scanf("%s",name1); //提示用户输入电话号码 printf("请输入新的联系人电话:(*注意联系人号码中间不能有空格)\n"); //接受电话号码 scanf("%s",tel); //让用户再次确认修改 int flag; printf("修改联系人后,信息将永久修改,您确认要修改该联系人吗?1.确认 0.取消\n"); scanf("%d",&flag); if (flag) { //更新数组信息 strcpy(contacts[no - 1].name, name1); strcpy(contacts[no - 1].telNum, tel); //同步联系人到文件中 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"); char name[NAMELEN]; //提示用户输入要查找的人的姓名 printf("请输入要查找的用户名:\n"); scanf("%s",name); int i; //遍历联系人数组,查找有没有这个人 for (i = 0; i < totalContactCount; i++) { //输入的姓名和contacts[i].name比较 if (strcmp(name, contacts[i].name) == 0) { //打印出来姓名对应的电话号码 printf("您搜索的联系人 %s 的电话号码是:%s\n",name,contacts[i].telNum); break;//循环要停止 } } //搜索不到,提示查找不到 if (i == totalContactCount) { printf("对不起,查无此人!\n"); } } /** 通讯录的初始化工作 1、尝试读取数据文件 2、如果读取成功,说明文件存在 如果存在,要读取联系人数据,保存到联系人数组 contacts 3、如果读取失败,说明我们是第一次使用通讯录 如果是第一次使用 1)创建联系人数据文件 2)把当前联系人的个数写入到文件中 totalContactCount */ v a3ca oid init(){ //定义文件名指针,并且打开文件 FILE *fp = fopen(filePath, "r"); if (fp != NULL) { //1、读取联系人的个数 fread(&totalContactCount, sizeof(totalContactCount), 1, fp); //2、读取每一个联系人 for (int i = 0; i < totalContactCount; i++) { //读取联系人数据到联系人数组中 fread(&contacts[i], sizeof(Person), 1, fp); } }else{ //创建文件 fp = fopen(filePath, "wb"); //写入联系人的个数 fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp); printf("通讯录文件创建成功~!\n"); } //关闭文件指针 fclose(fp); } /** * 写数据到文件中 思路: 1、以wb方式打开文件 2、先写联系人个数 3、写每个联系人数据 */ void writeFile(){ //以wb方式打开文件 FILE *fp = fopen(filePath, "wb"); if (fp != NULL) { //先写联系人个数 fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp); //写每个联系人数据 for (int i = 0; i < totalContactCount; i++) { //每次都写入一个数组元素 fwrite(&contacts[i], sizeof(Person), 1, fp); } printf("写文件数据更新成功!\n"); } fclose(fp); }</span>
-------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
相关文章推荐
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 在C语言中转换时间的基本方法介绍
- C语言进制转换代码分享