———–android培训、java培训、java学习型技术博客、期待与您交流!————
一:系统需求
欢迎来到通讯录
* 1.增加联系人
* 2.删除联系人
* 3.修改联系人
* 4.查看联系人
* 5.搜索联系人
* 6.退出通讯录
显示界面如上所示,联系人的字段包括姓名,电话号码。
二:技术分析
可能用到的技术有:
1.宏定义
2.结构体
3.文件读写
要注意的地方:
1.函数声明
2.界面搭建
3.按编号执行函数
三:实现
//头文件
#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[N]; //
//联系人的个数
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 writeFile()
int main(){
init();
printf("初始化完成");
while(1){
printf("1增\n");
printf("2删\n");
printf("3改\n");
printf("4查\n");
printf("5搜\n");
printf("6退\n");
prinrf("请选择功能");
scanf{"%d",&fno};
//判断编号是否合法
int validateInput(fno,0,6);
switch (fno){
case 1:doAdd();break;
case 2:doDelete();break;
case 3:doUpdate();break;
case 4:doList();break;
case 5:doSearch();break;
case 6:return 0;break;
default :
break;
}
}
return 0;
}
//验证是否合法,1非法,0正常
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("增加联系人,请安提示操作");
//提示,接受,确认,联系人个数加1,写入文件
printf("输入联系人姓名:(*注意姓名中间不能有空格)");
scanf("%s",contacs[totalContactCount].name);
printf("电话号码");
scanf("%s",contacts[].tel);
int flag;
printf("1.去人2 。取消");
scanf("%d",&flag);
if(flag){
totalContactCount ++;
//写入到文件中
writeFile();
}
}
/**
删除联系人
1.提示用户输入一个联系人编号
2.判断编号是否合法 编号不能大雨联系人个数
3.提示用户在确认删除
4.开始删除联系人
1.删除的元素正好是数组的最后一个元素
只需要让联系人个数-1
2.如果删除的元素不是数组的最后一个元素
需要移动元素,联系人数量-1
5.同步更新到文件中
*/
void doDelete{}{
int no;
printf("请输入联系人编号:\n");
scanf("%d",&no);
if(validateInput(no,1,totalContactCount)){
return ;
}
int flag;
printf("删除联系人后,数据无法恢复,确认删除吗?")
scanf("%d",&flag);
if(flag){
if(no == totalContactCount){
totalContactCount--;
}else{
for(int i=no;i<totalContactCount;i++){
contacts[i-1]=contacts[i];
}
totalContactCount--;
}
writeFile();
}
}
/**
修改联系人
思路:
1.提示用户输入编号
2.验证编号是否合法
3.提示用户输入姓名和电话
4.提示用户确认修改
5.写入文件
*/
void doUpdate(){
int no;
printf("请输入编号");
scanf("%d",&no);
if( validateInput(no,1,totalContactCount)){
return;
}else{
char name1[NAMELEN];
char tel[NUMLEN];
printf("姓名");
scanf("%s",contacts[no-1].name);//错误, 常量赋值?
scanf("%s",name1);
printf("电话");
scanf("%s",tel);
strcpy(contacts[no-1].name,name1);
strcpy(contacts[no-1].telNum,tel);
}
writeFile();
}
/**
思路:系统已经完成初始化工作,如果文件存在则读取文件中的数据
1.判断 totalContactCount ==0;//没有联系人
2. 如果不等于0
开始遍历,输出联系人信息
*/
void doList(){
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.遍历contacts[i].name,比较
查找到相同,输出
没有查找到,提示
*/
void doSearchByName(){
char name[NAMELEN];
printf("姓名");
scanf("%s",name);
for(int i = 0; i<totalContactCount;i++){
if(strcmp(contacts[i].name,name)==0){
printf("%s\t %s\t",contacts[i].name,contacts.telNum);
ruturn;
}
}
printf("查找不到");
}
//初始化函数
/**1.尝试读取数据文件
2.如果读取成功,说明文件存在
如果存在,读取联系人数据,保存数组contacts
3.如果读取失败, 说明第一次用通讯录
创建联系人文件
把当前联系人的个数写入到文件中 totalContactCount =0;
*/
void 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.些每个联系人数据
4.关闭文件
*/
void writeFile(){
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("写文件数据更新成功!")
fclose(fp);
}
四:结果截图