您的位置:首页 > 编程语言 > C语言/C++

黑马程序员-c语言-通讯录的实现

2015-06-28 14:30 363 查看
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"> ------</span><a target=_blank target="_blank" href="http://www.itheima.com/" style="color: rgb(51, 102, 153); text-decoration: none; font-family: Arial; font-size: 14px; line-height: 26px;">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!</a><span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"> -------</span>
//
//  main.c
//  telNum
//
//  Created by leon on 15/6/27.
//  Copyright (c) 2015年 Leon. All rights reserved.
//

#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[100];

//定义联系人的个数
int totalContactCount=0;
//接受用户输入烦人编号
int fno;
//定义数据文件保存的位置
char *filePath="telbook.data";

/***************    函数的声明   ***************/
int validateInput(int num,int min, int max);
void init();
void doAdd();
void doDelete();
void doUpdate();
void doList();
void doSearchByName();
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;
}

}

}

int validateInput(int num,int min, int max){
if(num<min || num>max){
printf("非法的输入!");
return 1;
}

return 0;
}

//添加联系人
/*
思路:
1、提示用户输入姓名和电话号码
2、接受用户输入的内容
3、保存到联系人数组
4、写入到文件中

*/
void doAdd(){

printf("您选择的是添加联系人,请按提示操作:\n");

//  1、提示用户输入姓名
printf("请输入联系人姓名:(*注意联系人姓名中间不能有空格)\n");
//totalContactCount = 0
//  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、开始删除数组元素
5、删除文件内容
*/
void doDelete(){

printf("您选择的是删除联系人,请按提示操作:\n");
doList();

//  1、让用户输入要删除的数据的编号
int no;
printf("请输入要删除的联系人的编号:\n");
scanf("%d",&no);
//	2.判断编号再次是否合法(编号不能大于联系人个数)
if(validateInput(no,1,totalContactCount)){
return ;
}
//	3、让用户再次确认删除
int flag;
printf("删除联系人后,数据将无法恢复,你确认要删除吗?1.确认 0.取消\n");
scanf("%d",&flag);
if(flag){

//	4、开始删除数组元素
//	   1)删除的元素正好是数组的最后一个元素
if(no == totalContactCount){
totalContactCount--;
}else{

//	      只需要让联系人个数-1
//	   2)如果删除的元素不是数组的最后一个元素

for(int i=no;i<totalContactCount;i++){
//元素的移动覆盖
contacts[no-1] = contacts[no];
}
totalContactCount --;
}
//		  联系人数量-1
//	5、同步更新内容
printf("数据更新成功");
}
}

//修改联系人
/*
思路:
1、提示输入要修改的联系人编号
2、判断编号是否合法
3、请用户输入新的姓名、电话
4、请用户再次确认修改
5、开始修改用户信息
6、更新到文件中
*/
void doUpdate(){

printf("您选择的是联系修改人,请按提示操作:\n");
doList();

//  1、让用户输入要删除的数据的编号
int no;
printf("请输入要删除的联系人的编号:\n");
scanf("%d",&no);
//	2.判断编号再次是否合法(编号不能大于联系人个数)
if(validateInput(no,1,totalContactCount)){
return ;
}
//  3、请用户输入新的姓名、电话
char name1[NAMELEN];
char tel[NUMLEN];
printf("请输入新的姓名");
scanf("%s",name1);
printf("请输入新的电话\n");
scanf("%s",tel);

//  4、请用户再次确认修改
int flag;
printf("确认将永久修改信息,你确认修改吗?1.确定 0.取消\n");
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("您的通讯录为空,请添加联系人");

} 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、遍历联系人数组,查找有没有这个人
3、查找到了,把电话号码显示出来
4、没有查找到 ,提示没有这个联系人
*/
void doSearchByName(){

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

//	2、遍历联系人数组,查找有没有这个人
for(int i=0;i<totalContactCount;i++){
//1)输入的姓名和cintacts[i].name比较
if(strcmp(name,contacts[i].name)==0){
//2)打印出姓名相应的电话号码
printf("您搜索的联系人%s的电话号码是:%s\n",name,contacts[i].telNum);
break;//循环停止
}

//	3、没有查找到 ,提示没有这个联系人
if(i==totalContactCount){
printf("对不起,查无此人!\n");
}
}

}

//通讯录初始化
/*
1、尝试性读取数据文件
2、如果读取成功,说明文件存在
如果存在,要读取联系人数据,保存到联系人数组  contacts

3、如果读取失败,说明我们是第一次使用通讯录
如果是第一次使用
1)创建联系人数据文件
2)把当前联系人的个数写入到文件中 totalContactCount
*/
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[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(){
//1、 以wb方式打开文件

9f22
FILE *fp = fopen(filePath,"wb");
//  2、先写联系人个数
fwrite(&totalContactCount,sizeof(totalContactCount),1,fp);
//3、写每个联系人数据
for(int i=0;i<totalContactCount;i++){
//每次都写入一个数组的元素
fwrite(&contacts[i],sizeof(Person),1,fp);

}
printf("文件更新成功\n");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  通讯录