------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
通讯录
//
//1.引入头文件
//2.必要的宏定义
//3.定义文件名称变量、联系人数组、联系人结构体
//4.定义函数,并进行函数声明
//5.编写循环控制程序
//6.显示操作界面
//7.根据编号执行不同的函数
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100 //通讯录容量
#define NAMELEN 20 //姓名长度
#define NUMLEN 15 //电话号码长度
//定义联系人的结构体
typedef struct{
char name[NAMELEN];
char number[NUMLEN];
}Person;
//定义全局变量
Person contacts[N];//存储所有的联系人数组
int count = 0; //联系人个数
int no;//接收用户输入的编号
char *path = "tellbook.data";
//****************函数声明****************
int isInvalid(int num,int min,int max);
void init();
void add();
void delete();
void update();
void list();
void search();
void display();
void writeFile();
int main(int argc, const char * argv[]) {
init();
printf("通讯录初始化完成!\n");
display();
return 0;
}
void display(){
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");
//提示用户输入
printf("请输入相应编号:\n");
scanf("%d",&no);
//判断输入是否合法
if(isInvalid(no,1,6)){
switch (no) {
case 1:
//添加功能
add();
break;
case 2:
//删除功能
delete();
break;
case 3:
//修改功能
update();
break;
case 4:
//查看功能
list();
break;
case 5:
//搜索功能
search();
break;
case 6:
//退出功能
printf("系统已退出!\n");
return;
break;
default:
break;
}
}
}
}
//判断用户输入是否合法
int isInvalid(int num,int min,int max){
if (num<min||num>max) {
printf("输入非法!!!\n");
return 0;
}else{
return 1;
}
}
/*添加联系人
1.提示用户输入姓名和电话号码
2.接收用户输入的内容
3.保存到联系人数组
4.写入到文件中
*/
void add(){
printf("您选择的是添加联系人:\n");
//提示用户输入姓名
printf("请输入联系人姓名:(*姓名中不能有空格)\n");
//接收姓名
scanf("%s",contacts[count].name);
//提示用户输入电话
printf("请输入联系人的电话:(*电话中不能有空格)\n");
//接收输入的电话
scanf("%s",contacts[count].number);
//再次确认
int flag;
printf("您确定要添加吗?1.确定 2.取消\n");
scanf("%d",&flag);
//确认添加
if(flag){
//联系人数量加1
count++;
//写入到文件
writeFile();
}
}
/*删除联系人
1.提示用户输入一个联系人编号
2.判断输入是否合法,不能大于联系人个数
3.提示用户再次确认删除
4.开始删除数组元素
1)删除的元素正好是数组的最后一个元素
让联系人的个数-1
2)要删除的元素不是数组的最后一个元素
移动数组元素
联系人个数-1
*/
void delete(){
printf("您选择的是删除联系人:\n");
list();
//1.提示用户输入一个联系人编号
int no;
printf("请输入要删除的联系人编号:\n");
scanf("%d",&no);
//2.判断输入是否合法,不能大于联系人个数
if (!(isInvalid(no, 1, count))) {
return;
}
//3.提示用户再次确认删除
int flag;
printf("删除后将无法恢复,你确定要删除吗?1.确定 2.取消\n");
scanf("%d",&flag);
if (flag) {
//4.开始删除数组元素
if (no == count) {
//1)删除的元素正好是数组的最后一个元素
//让联系人的个数-1
count--;
}else{
//2)要删除的元素不是数组的最后一个元素
//移动数组元素
//联系人个数-1
for (int i=no; i<count; i++) {
contacts[i-1] = contacts[i];
}
count--;
}
}
writeFile();
}
/*修改联系人
1.提示用户输入要修改的联系人编号
2.判断输入是否合法
3.输入新的用户名和新的电话号码
4.让用户再次确认修改
5.更新数组信息
6.写入到文件中
*/
void update(){
printf("您选择的是修改联系人信息:\n");
list();
//1.提示用户输入要修改的联系人编号
int no;
printf("请输入要删除的联系人编号:\n");
scanf("%d",&no);
//2.判断输入是否合法,不能大于联系人个数
if (!(isInvalid(no, 1, count))) {
return;
}
//3.输入新的用户名和新的电话号码
char name1[NAMELEN];
char tel[NUMLEN];
printf("请输入新的联系人姓名:(姓名中间不能有空格)\n");
scanf("%s",name1);
printf("请输入新的联系人电话:(电话中间不能有空格)\n");
scanf("%s",tel);
//4.让用户再次确认修改
int flag;
printf("确认修改吗?1.确认 2.取消\n");
scanf("%d",&flag);
if (flag) {
//5.更新数组信息
strcpy(contacts[no-1].name,name1);
strcpy(contacts[no-1].number, tel);
}
//6.写入到文件中
writeFile();
}
/*查看所有联系人
首先必须完成初始化工作
进行判断,如果count==0
提示进行添加
否则,打印所有联系人信息
*/
void list(){
printf("您选择的是查看所有联系人:\n");
//判断是否有联系人
if (count==0) {
printf("您的通讯录为空!请添加联系人!\n");
}else{
//输出格式
printf("编号\t 姓名\t 电话\t \n");
//输出所有联系人信息
for (int i=0; i<count; i++) {
printf("%d\t %s\t %s\t \n",i+1,contacts[i].name,contacts[i].number);
}
}
}
/*搜索联系人
1.提示用户输入要搜索的联系人姓名
2.按照姓名进行查找
1)输入的姓名和contacts[i].name比较
2)搜索不到
查找一遍,都没有这个名字,提示查不到
*/
void search(){
printf("您选择的是查询联系人:\n");
//1.提示用户输入联系人姓名
char name[NAMELEN];
printf("请输入要查找的联系人:\n");
scanf("%s",name);
//2.按照姓名进行查找
int i;
for (i=0; i<count; i++) {
if (strcmp(name, contacts[i].name)==0) {
//1)输入的姓名和contacts[i].name比较
printf("您要查找的联系人%s的电话号码为:%s\n",name,contacts[i].number);
break;
}
}
//2)搜索不到
//查找一遍,都没有这个名字,提示查不到
if (i == count) {
printf("查无此人!\n");
}
}
/*通讯录初始化
1.尝试读取数据文件
2.如果读取成功,说明文件存在。
如果存在,尧都区联系人数据,保存到联系人数组中
3.如果读取失败,说明我们是第一次使用通讯录
如果是第一次使用
1)创建联系人数据文件
2)把当前联系人的个数写到文件中
*/
void init(){
//定义文件指针,并打开文件
FILE *fp = fopen(path, "r");
//判断
if (fp!=NULL) {
//读取联系人的个数
fread(&count, sizeof(count), 1, fp);
//读取每一个联系人
for (int i=0; i<count; i++) {
fread(&contacts[i], sizeof(Person), 1, fp);
}
}else{
//创建文件
fp = fopen(path, "wb");
//写入联系人的个数
fwrite(&count, sizeof(count), 1, fp);
printf("通讯录文件创建成功!\n");
}
fclose(fp);
}
void writeFile(){
FILE *fp = fopen(path, "wb");
if (fp!=NULL) {
fwrite(&count, sizeof(count), 1, fp);
for (int i=0; i<count; i++) {
fwrite(&contacts[i], sizeof(Person), 1, fp);
}
printf("写入数据更新成功!\n");
}
fclose(fp);
}