/**
1.引入头文件
2.进行必要的宏定义
3.定义文件名称变量、联系人数组、联系人结构体
4.定义函数、并进行函数声明
5.编写循环控制程序
6.显示操作界面
7.根据编号执行不同的函数
*/
#include <stdio.h>
#include <string.h>
//进行宏定义
#define N100 //定义通讯录容量
#define NAMELEN 22 //定义姓名长度
#define NUMLEN 12 //定义号码长度
//**********定义部分**********
//定义联系人结构体
struct{
//联系人
char name[NAMELEN];
//电话号码
char telNum[NUMLEN];
}Person;
//存储所有的联系人、建立联系人数组
Person contacts[N]; //能够储存100个联系人
//定义联系人的个数
int totalContactCount=0;
//接收用户输入的编号
int fno;
//定义数据文件的保存位置
char *filepath = "telbook.data";
//******函数的声明部分******
void init()
int validateInput(int num,int min,int max);
void doADD()
void doDelete()
void Update()
void doList()
void doSearchByName()
void writeFile()
int main(int argc,const char*argv[]){
int flag=1;
init();
printf("初始化完成!\n");
while(flag){
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");
//提示用户选择一个序号
printf("请选择需要的操作编号\n");
scanf("%d,&fno");
//判断编号是否合法
validateInput(fno,1,6);
switch(fno){
case 1:
doADD() //执行添加
break;
case 2:doDelete()
//执行删除
break;
case 3:Update()
//执行修改
break;
case 4:doList()
//执行显示所有联系人
break;
case 5:doSearchByName()
//执行查找
break;
case 6:
//执行退出系统
printf("系统正在退出...\n");
printf("系统已退出!\n");
flag=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;
}
return0;
}
/**添加联系人
* 思路:
1)提示用户输入姓名和电话
2)接收用户输入的内容
3)保存到联系人 数组
4)写入到文件中
*/
void doADD(){
printf("您选择的是添加联系人\n");
//1.提示用户输入联系人的姓名
printf("请输入联系人姓名:(注意不可有空格键)\n");
//totalContactCount==0
//
scanf("%s",contacts[totalCtacyCount].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)开始删除数组元素
(1)删除的元素正好是数组的最后一个元素,只要让
联系人个数减一
(2)如果删除的元素不是最后一个元素,需要移动元
素,联系人数量减一
5)删除文件内容
*/
void doDelete(){
//1.提示用户输入一个联系人编号
int no;
printf("请输入要删除的联系人编号:\n");
scanf("%d",&no);
//2.判断编号是否合法,编号不能大于联系人个数
if(validateInput(no,1totalContactCount)){
return;
}
//3.提示用户再次确认删除
int flag;
printf("删除联系人后将无法恢复,是否确认?\n");
scanf("%d",&flag);
if(flag){
//4.开始删除数组元素
//1)删除的元素正好是数组的最后一个元素
if(no==totalContactCount){
totalContactCount--;
}
for(int i=no;i<totalContactCount;i++){
contacts[no-1]=contacts[no];
}
}
}
/**
* 修改联系人
1)提示输入要修改的联系人编号
2)判断编号是否合法
3)让用户输入新的姓名、电话
4)让用户再次确认修改
5)开始修改用户信息
6)更新到文件中
*/
void Update(){
printf("您选择的是修改联系人\n");
doList();
//1)提示输入要修改的联系人编号
int no;
printf("请输入要修改的联系人编号:\n");
scanf("%d",&no);
//2)判断编号是否合法,编号不能大于联系人个数
if(validateInput(no,1,totalContactCount))){
return;
}
//3)让用户输入新的姓名、电话
//contacts[n-1].name="xxxx";错误
char name1(NAMELEN);
char tel[NUMLEN];
printf("请输入联系人新的姓名:(中间不能有空格)\n");
scanf("%s",name1);
printf("请输入联系人新的电话:(中间不能有空格)\n");
scanf("%s",tel);
//4)让用户再次确认修改
int flag;
printf("确认后,将永久修改信息,是够确认?1.确认 0.
取消\n");
scanf("%d",&flag);
if(flag){
//5)开始修改用户信息
strcpy(contacts[no-1].name,name1);
strcpy(contacts[no-1].telNum,tel);
//6)更新到文件中
writeFile();
}
}
/** 显示联系人
* 思路:
1)先判断联系人是否为空
2)如果不为空,则遍历数组,显示所有的联系人
*/
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%d\t\n",i+1,contacts
[i].name,contacts[i].telNum);
}
}
}
/**
* 搜索联系人
思路:
1)提示用户输入要查找的人的姓名
2)遍历联系人数组,查找有没有这个人
3)查找到了,则把电话号码显示出来
*/ 4)查找不到,提示用户没有该联系人
void doSearchByName(){
printf("您选择的是搜索联系人\n");
//1)提示用户输入要查找的人的姓名
char name[NAMELEN];
printf("请输入要查找的联系人!\n");
scanf("%s",name);
//2)遍历联系人数组,查找有没有这个人
for(int i=0;i<totalContactCount;i++){
if(strcmp(name,contacts[i].name)==0){
printf("您搜索的联系人%s号码是:%s
\n",name,contacts[i].telNum);
break;
}
}
if(i==totalContactCount){
printf("对不起,查无此人!\n");
}
}
/**
初始化
1.尝试性的读取文件
2.如果成功了,则说明文件存在,则读取文件内容
3.如果不成功,说明文件不存在
1)创建联系人数据
2)把当前联系人的个数写入到文件中
totalContactCount=0
*/
void init(){
//定义文件指针,并打开文件
FILE *fp=fopen(filepath,"r");
if(fp!=NULL){
//读取联系人个数 4
fread(&totalContactCount,sizeof
(totalContactCount),1,fp);
//读取每一个联系人 34
for(int i=0;i<totalContactCount;i++){
//读取联系人数据到联系人数组中
fread("&contacts[i],sizeof(Person),1,fp");
}
}else{
fp=fopen(filepath,"wb");
fwrite();
printf();
}
fclose(fp);
}
/**
* 写数据到文件中
思路:
1.以wb方式打开文件
2.先写联系人个数
3.写每个联系人的数据
*/
void writeFile(){
//1.以wb方式打开文件
FILE *fp=fopen(filepath,"wb");
if(fp!=NULL){
//2.先写联系人个数
fwrite(&totalContactCount,sizeof
(totalContactCount),1,fp);
//3.写每个联系人数据
for(int i=0;i<totalContactCount;i++){
//每次都写入一个数组的元素
fwrite(&contact[i],sizeof(Person),1,fp);
}
printf("添加成功!\n");
}
fclose(fp);
}
|
|