//
// main.c
// C语言通讯录
//
// Created by heyuze on 15/8/28.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#include <stdio.h>
#include <string.h>
//定义宏
#define NAMELEN 22
#define NUMLEN 12
#define CONTACTNUM 100
#define FILEPATH "ContactsFile.data"
//定义结构体
typedef struct{
char contactName[NAMELEN];
char contactNum[NUMLEN];
} Person;
//声明变量
int fno;
int totalContactCount;
//声明联系人数组
Person contacts[CONTACTNUM];
//声明函数
void init();
void doAdd();
void doDelete();
void doList();
void doUpdate();
void doSelect();
void writeFile();
int checkNum(int num,int max,int min);
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\n");
printf("请输入1~6之间的功能编号:\n");
scanf("%d",&fno);
// 判断输入是否合法
checkNum(fno,6,1);
// 功能选择模块
switch (fno) {
case 1:
printf("您选择的是\"1、增加联系人\",正在操作中...\n");
doAdd();
break;
case 2:
printf("您选择的是\"2、删除联系人\",正在操作中...\n");
doDelete();
break;
case 3:
printf("您选择的是\"3、修改联系人\",正在操作中...\n");
doUpdate();
break;
case 4:
printf("您选择的是\"4、查看所有联系人\",正在操作中...\n");
doList();
break;
case 5:
printf("您选择的是\"5、查找联系人\",正在操作中...\n");
doSelect();
break;
case 6:
printf("退出系统中...\n");
printf("系统已成功退出!\n");
return 0;
break;
}
}
return 0;
}
//检查输入数字是否合法
int checkNum(int num,int max,int min){
if (num >max || num <min) {
printf("输入数字非法!\n\n");
return 1;
}
return 0;
}
//增加联系人
void doAdd(){
printf("请输入您要添加联系人的姓名:\n");
scanf("%s",contacts[totalContactCount].contactName);
printf("请输入您要添加联系人的手机号:\n");
scanf("%s",contacts[totalContactCount].contactNum);
int flag;
printf("是否确认添加联系人(1、确认;0、取消):\n");
scanf("%d",&flag);
if(flag){
totalContactCount++;
writeFile();
}
printf("写入文件成功!\n\n");
}
//删除联系人
void doDelete(){
doList();
int no;
printf("请输入您要删除的联系人编号:\n");
scanf("%d",&no);
if(checkNum(no, totalContactCount, 1)){
return ;
}
int flag;
printf("确认要删除该数据吗?确认请输入\"1\",取消请输入\"0\":\n");
scanf("%d",&flag);
if (flag) {
if (no ==totalContactCount) {
totalContactCount--;
}else{
for (int i=no; i<totalContactCount; i++) {
contacts[i-1]=contacts[i];
}
totalContactCount--;
}
printf("删除联系人成功!\n\n");
}
writeFile();
}
//修改联系人
void doUpdate(){
doList();
int no;
printf("请输入您要修改的联系人编号:\n");
scanf("%d",&no);
if (checkNum(no, totalContactCount, 1)) {
return;
}
char contactName1[NAMELEN];
char contactNum1[NUMLEN];
printf("请输入您要修改联系人的姓名:\n");
scanf("%s",contactName1);
printf("请输入您要修改联系人的号码:\n");
scanf("%s",contactNum1);
int flag;
printf("确认要修改该数据吗?确认请输入\"1\",取消请输入\"0\":\n");
scanf("%d",&flag);
if (flag) {
strcpy(contacts[no-1].contactName,contactName1);
strcpy(contacts[no-1].contactNum,contactNum1);
writeFile();
}
printf("数据修改成功!\n");
}
//查看所有联系人
void doList(){
if(totalContactCount==0){
printf("你的联系人还空无一人~\n\n");
}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].contactName,contacts[i].contactNum);
}
printf("\n");
}
}
//查找联系人
void doSelect(){
char name[NAMELEN];
printf("请输入您要搜索的联系人姓名:\n");
scanf("%s",name);
int i;
for (i=0; i<totalContactCount; i++) {
if (strcmp(name,contacts[i].contactName)) {
printf("姓名:%s,电话:%s\n\n",contacts[i].contactName,contacts[i].contactNum);
break;
}
}
if (i == totalContactCount) {
printf("对不起,没有找到该联系人!\n\n");
}
}
//系统初始化
void init(){
FILE *fp = NULL;
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);
}
//写入文件
void writeFile(){
FILE *fp = NULL;
fp = fopen(FILEPATH, "wb");
fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);
for (int i = 0; i<totalContactCount; i++) {
fwrite(&contacts[i], sizeof(Person), 1, fp);
}
fclose(fp);
}