/*
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");
// Created by 小小罗 on 15/8/3.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#include <stdio.h>
#include <string.h>
#define NAMELEN 22 //结构体姓名的长度
#define NUMLEN 12 //结构体电话号码的长度
#define N 100
// 定义联系人的结构体
typedef struct {
char name[NAMELEN];//结构体姓名的长度
char telnum[NUMLEN];//结构体电话号码的长度
}p;
p contacts[N];//定义变量存联系人 最多可存100个 存储所有联系人的数组
int totalcontactcount = 0;//定义联系人的个数 初始化为0
//定义变量 初始化为0 接收用户输入的编号
int fno = 0;
int validateinput(int num,int m,int n);//声明函数 判断用户输入的编号是否合法
void quit(); //声明程序退出的函数
void init(); //声明初始化函数
void writeFile(); //声明doadd中 写入文件函数
void doAdd(); //声明添加联系人函数
void doList(); //声明显示所有联系人函数
void doDelate(); //声明删除联系人函数
void doUpdate(); //声明修改联系人函数
void doSearch(); //声明搜索函数
int main(int argc, const char * argv[]) {
// 初始化通讯录
init();
printf("通讯录初始化完成!\n");
while (1) {
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:
doDelate();//执行删除联系人
break;
case 3:
doUpdate();//执行修改联系人
break;
case 4:
doList();//执行查看所有联系人
break;
case 5:
doSearch();//执行搜索联系人
break;
case 6:
quit();
break;
}
}
return 0;
}
//定义一个函数 判断用户输入的联系人是否合法
int validateinput(int num,int m,int n){
if (num < m || num > n) {
printf("编号不合法,请重新输入编号!\n");
}
return 0;
}
void init(){
//
// 写入格式: fwrite(变量地址,数据块的大小,块数,fp);
// 读取格式: fread(变量的地址,数据块的大小,块数,fp)
FILE *fp = fopen("telbook.data", "r"); //定义文件指针 并且打开文件
if (fp != NULL) { //如果不为空 打开成功
fread(&totalcontactcount, sizeof(totalcontactcount), 1, fp);// 读取文件 即读取联系人的个数
// 遍历数组每一个元素 读取每一个联系人到联系人数组中
for (int i = 0; i < totalcontactcount; i++) {
fread(&contacts[i], sizeof(p), 1, fp);
}
}else{ // 如果文件不存在 则创建文件 创建通讯录
fp = fopen("telbook.data", "wb");//
fwrite(&totalcontactcount, sizeof(totalcontactcount), 1, fp);//写入联系人的个数
printf("通讯录文件创建成功!\n");
}
fclose(fp);
}
void doAdd(){
//
printf("你选择的是添加联系人,请按提示操作!\n");
// 1、提示用户输入联系人并接收
printf("请输入联系人姓名:(*姓名之间不能有空格)\n");
scanf("%s",contacts[totalcontactcount].name);
// 2、提示用户输入联系人电话号码并接收
printf("请输入联系人电话号码:(*电话号码之间不能有空格)\n");
scanf("%s",contacts[totalcontactcount].telnum);
// 3、再次询问确定是否添加
int flag;
printf("你确认要添加联系人吗?1.确认 0.取消 \n");
scanf("%d",&flag);
if (flag) {
// 4、联系人个数+1
totalcontactcount++;
}
// 5、将联系人信息文件写入到文件中 定义写入函数writefile
writeFile();
//
}
/**删除联系人
1、提示用户输入联系人编号 并接收保存
2、判断编号是否合法 编号不能大于联系人个数
3、再次确认是否删除
4、开始删除数组元素
1)删除的元素正好是数组的最后一个元素
只需让联系人个数减一
2)删除的元素不是数组的最后一个元素
需要移动元素
联系人个数减一
*/
void doDelate(){
int no;
printf("请输入要删除的联系人编号:\n");
scanf("%d",&no);
validateinput(no, 0, totalcontactcount);
int flag;
printf("删除联系人后,数据将无法恢复,你确定要删除吗?1.确定 0.取消\n");
scanf("%d",&flag);
if (flag) {
if (no == totalcontactcount) {
totalcontactcount--;//如果编号是最后一个 只需联系人减一就ok
}else{
for (int i = no; i < totalcontactcount; i++) {
contacts[i-1] = contacts[i];//如果不是最后一个 那么需要移动元素并且覆盖 后面的覆盖的前面的
}
totalcontactcount--;//最后一个舍弃
}
}
writeFile();
}
/**修改联系人
1.提示用户输入要修改的联系人编号
2.验证编号是否合法
3.输入新的联系人和电话 保存到数组中
4.再次确认是否要修改
5.更新数组
6.写入文件
*/
void doUpdate(){
int no;
printf("请输入要修改的联系人编号:\n");
scanf("%d",&no);
validateinput(no, 0, totalcontactcount);//判断编号是否合法
char name1[NAMELEN];//定义新的数组
char tel[NUMLEN];
printf("请输入新的联系人姓名:(*注意联系人姓名中间不能有空格)\n");
scanf("%s",name1);
printf("请输入新的联系人电话:(*注意联系人电话中间不能有空格)\n");
scanf("%s",tel); //接收新的联系人姓名和电话保存到新的数组中
int flag;
printf("你确定要修改联系人么?1.确定 0.取消");
scanf("%d",&flag);
if (flag) {
strcpy(contacts[no-1].name, name1);
strcpy(contacts[no-1].telnum, tel);
//后面的覆盖前面的 导入#include <string.h>
}
writeFile();//再次写入
}
/**搜索联系人通过姓名
1.提示用户输入姓名
2.保存
3.按照姓名进行查找(遍历) 判断姓名是否相等
比较两个字符串是否相等 strcmp( , ) == 0
*/
void doSearch(){
char name[NAMELEN];
printf("请输入要搜索的联系人姓名:\n");
scanf("%s",name);
int i;
for ( 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");
}
}
/**查看所有联系人
前提:系统已经完成了初始化工作(如果文件存在则读取文件中所有的数据)
首先做一个判断
联系人totalcontactcount是否为0;若为0 通讯录没有人
若不为0 遍历联系人数组
*/
void doList(){
printf("显示所有联系人,联系人数据如下:\n");
if (totalcontactcount == 0) {
printf("你的通讯录还没有小伙伴,请添加小伙伴!\n");
}else{
// 循环遍历出所有联系人
printf("编号:\t姓名:\t电话:\n");
for (int i = 0; i < totalcontactcount; i++){
printf("%02d\t%s\t%s\n",i+1,contacts[i].name,contacts[i].telnum);
}
}
}
//退出
void quit(){
printf("系统正在推出......\n");
printf("系统已退出\n\n");
}
//重新写入数据到文件中
void writeFile(){
FILE *fp = fopen("telbook.data", "wb");//以wb方式打开文件
if (fp != NULL) {
fwrite(&totalcontactcount, sizeof(totalcontactcount), 1, fp);
}//先写联系人个数
for (int i = 0; i < totalcontactcount; i++) {
fwrite(&contacts[i], sizeof(p), 1, fp);
}//再写每个联系人的数据 每次都写入一个数组的元素
printf("写入文件成功!\n\n");
fclose(fp);
}
|