黑马程序员-----------C语言基础-----------C语言实战(C语言版通讯录)

来源:互联网 发布:翻译软件app 编辑:程序博客网 时间:2024/06/06 03:09
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:C语言《通讯录功能展示》
1,功能展示:
初始化界面:


二:《通讯录》用到的知识点
通讯录:

经典问题:
数组元素的删除


三:通讯录功能分析及实现步骤
0.初始化:

1.添加联系人:


2.删除联系人:


3.修改联系人:


4.查看联系人:

5.搜索联系人:


6.退出系统:
exit(0)或者return 0;


四:《通讯录》界面,框架搭建
1.C语言《通讯录》界面框架搭建
/**
1.引入头文件
2.进行必要的宏定义
3.定义文件名称变量,联系人数组,联系人结构体
4.定义函数,并进行函数声明
5.编写循环控制程序
6.显示操作界面
7.根据编号执行不同的函数
*/

代码实现:
#include <stdio.h>#include <string.h>//进行宏定义#define N 100//定义通讯录的容量#define NAMELEN 22//定义姓名长度#define NUMLEN 12//定义号码长度//***********定义部分****************//定义联系人结构体typedef struct{char name[NAMELEN];int telNum[NUMLEN];}Person; //存储所有联系人,联系人数组Person  contacts[N];//能够存储100个联系人//定义联系人个数int totalContactCount = 0;//接收用户输入的编号int fno;//定义数据文件保存的位置char *filePath = "telbook.data";//************** 函数的声明部分***********int validateInput(int num,int min,int max);void doAdd();void doDelete();void doUpdate();void doList();void doSearchByName();void init();void writeFile();int main(int argc,const char * argv[]){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;}//验证输入是否合法/*num 要验证的值* min最小值*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(){int flag;printf("你选择的是添加联系人,请按提示操作:\n");printf("请输入联系人姓名:(*注意联系人姓名中间不能有空格)\n");scanf("%s",contacts[totalContactCount].name);printf("请输入联系人电话:(*注意联系人电话中间不能有空格)\n");scanf("%s",contacts[totalContactCount].telNum);printf("您确认要添加数据吗?1.确认  0.取消\n");scanf("%d",&flag);if(flag){//联系人个数加1totalContactCount++;//把联系人写入文件中writeFile();}}/***删除联系人*思路:*1)让用户输入要删除的数据的编号*2)判断编号是否合法  编号不能大于联系人个数*3)让用户再次确认删除*4)开始删除数组元素*1)删除的元素正好是数组的最后一个元素*只需要让联系人个数-1*2)如果删除的元素不是数组的最后一个元素*需要移动元素*联系人数量-1*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){//如果flag为真,确认删除//开始删除数组元素if(no == totalContactCount){//1)如果删除元素正好是最后一个元素totalContactCount--;}else{//2)如果删除元素不是最后一个元素for(int i=no; i<totalContactCount; i++){contacts[no-1] = contacts[no];//元素的移动和覆盖}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(){int i;printf("显示所有联系人,联系人数据如下:\n");//判断通讯录是否为空if(totalContactCount == 0){printf("您的通信录还没有小伙伴,请添加小伙伴!\n");}else{//输出格式printf("编号\t 姓名\t 电话\t \n");//遍历联系人数组for(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++){//比较两个字符串是否相等  strcmp()  == 0if(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 = 0**/void init(){int i;//定义文件指针,并且打开文件FILE  *fp = fopen(filePath,"r");if(fp!=NULL){//第一步:读取联系人个数fread(&totalContactCount,sizeof(totalContactCount),1,fp);//第二步:读取每一个联系人for(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);}//写数据到文件中void writeFile(){int i;FILE *fp = fopen(filePath,"wb");if(fp!=NULL){//先写联系人个数fwrite(&totalContactCount,sizeof(totalContactCount),1,fp);//写每个联系人数据for(i=0;i<totalContactCount;i++){//每次都写入一个数组元素fwrite(&contacts[i],sizeof(Person),1,fp);}printf("写文件数据更新成功!");}}



0 0
原创粉丝点击