黑马程序员技术交流社区
标题:
C语言通讯录窍门
[打印本页]
作者:
郭启冰
时间:
2015-12-6 23:08
标题:
C语言通讯录窍门
#include <stdio.h>
#include <string.h>
//宏定义列表
#define NAME_LEN 15
#define CONTACT_MAX 200
//函数声明列表
void drawMainUI();
void showAllList();
void addContact();
void writeToFile();
void deleteContact();
void editContact();
void searchContact();
void initContacts();
//联系人的结构体
typedef struct {
char name[NAME_LEN]; //姓名
int phone; //电话号码
}Person;
//全局列表
Person contacts[CONTACT_MAX]; //通讯录数组(保存通讯录数据的)
int realCount = 0; //真实的记录数
int main(int argc, const char * argv[]) {
//读取数据
initContacts();
printf("欢迎使用传智通讯录v26期专版\n\n");
//system("say 欢迎使用传智通讯录v26期专版");
while (1) {
drawMainUI();
puts("请输入您要进行的操作(请输入序号)");
//system("say 请输入您要进行的操作(请输入序号)");
//接收用户输入选择序号
int choose;
scanf("%d",&choose);
//判断用户输入,根据用户输入的数字做不同的功能
switch (choose) {
//添加功能
case 1:
addContact();
break;
//删除功能
case 2:
deleteContact();
break;
//修改功能
case 3:
editContact();
break;
//查看所有联系人功能
case 4:
showAllList(); //函数调用 函数名(参数列表)
break;
//搜索功能
case 5:
searchContact();
break;
//退出功能
case 6:
puts("请确认是否要退出,输入y退出,否则输入任意键返回");
char answer;
scanf(" %c",&answer); //%c前面一定要加空格,因为防止前面输入的回车被你用了
//如果要退出
if(answer == 'y'){
return 0;//结束main函数就代表程序结束
}
break;
//非法输入
default:
//在这里面写下面这一句话,可以防止死循环错误
while (getchar() != '\n');
printf("非法输入\n");
break;
}
}
return 0;
}
/**
* 初始化联系人数组(从文件读取数据)
*/
void initContacts(){
//读取数据
FILE *fp = fopen("contact.data", "r");
if(fp){
//读取数据,在读取之前,要先知道需要读取多少个元素
//我怎么知道有多少个?是不是我要从一个地方知道啊?
//应该把真实的个数存在硬盘里面,然后呢,我先读取出实际的个数,就行了
//先读取实际的个数
fread(&realCount, sizeof(realCount), 1, fp);
//读取实际的元素,一共读取realCount个
fread(contacts, sizeof(contacts[0]),realCount, fp);
//关闭文件
fclose(fp);
}
}
/**
* 写入数据到文件
*/
void writeToFile(){
//1.打开文件
FILE *fp = fopen("contact.data", "w");
if(fp){
//2.操作文件(写入通讯录数据到文本)
//要先写入实际的个数,方便我们读取的时候知道读取多少个
fwrite(&realCount, sizeof(realCount), 1, fp);
//再继续写通讯录真实保存的数据
fwrite(contacts, sizeof(contacts[0]), realCount, fp);
//3.关闭文件
fclose(fp);
}
}
/**
* 绘制主界面
*/
void drawMainUI(){
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");
}
/**
* 显示联系人列表
*/
void showAllList(){
//a.先要判断真实的人数是否等于0
if( realCount == 0){
//如果是则打印你通讯录记录为空
puts("你丑到没朋友,赶紧去交几个朋友添加一下通讯录吧");
return; //结束函数,因为没有记录的话就没必要执行下面的遍历语句
}
//b.循环遍历联系人数组,然后打印出每一个元素的值
//注意:数组有多长,我就遍历多少次?
//只要遍历实际个数次。因为只有实际个数才是真正存放记录的,其他都没有存
puts("********显示联系人列表********");
for(int i=0;i<realCount;i++){
printf("%d:
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2