C语言通讯录

来源:互联网 发布:查看图片软件哪个好 编辑:程序博客网 时间:2024/05/26 16:01


#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 100      // 通讯录容量 100#define NAMELEN 22 //姓名长度 考虑 \0 占用一个字节#define NUMLEN 12  // 11位电话号码 + 1个 \0  一共 12typedef struct c {// 联系人char name[NAMELEN];// 电话号码char phone[NUMLEN];} Person;Person contacts[N]; //能够存储 100个联系人int totalContactCount = 0;//接收用户输入的编号int fno;// 定义数据文件保存的位置char * filePath = "/Users/stone/Desktop/contacts.data";//****** 函数声明 ****************** stone ***int validateInput(int num, int min, int max);void doAdd();void doDelete();void doUpdate();void doShowAll();void doSearchByName();void init();void writeToFile();int main(int argc, const char * argv[]){init();printf("通讯录初始化完成\n");while (1) {printf("\n");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);// 判断编号是否合法if (validateInput(fno, 1, 6)) {printf("请重新输入正确的编号\n");continue;}switch (fno) {//添加case 1:doAdd();break;//删除case 2:doDelete();break;//修改case 3:doUpdate();break;//显示所有联系人case 4:doShowAll();break;//查找case 5:doSearchByName();break;//退出case 6:return 0;break;default:break;}}return 0;}void init(){FILE * 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 {//printf("open file failed!\n");fp = fopen(filePath, "wb");fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);printf("通讯录文件创建成功\n");}fclose(fp);}/**    添加联系人 */void doAdd(){printf("您选择的是添加联系人,请按提示操作:\n");printf("请输入联系人姓名:\n");scanf("%s", contacts[totalContactCount].name);printf("请输入联系人电话:\n");scanf("%s", contacts[totalContactCount].phone);int flag;printf("确认要添加数据吗? 1.确认 0.取消\n");scanf("%d", &flag);totalContactCount++;if (flag) {// 写入文件, totalContactCount +1writeToFile();}}void writeToFile(){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("写文件数据更新成功\n");}else {printf("open file failed\n");}fclose(fp);}/**    删除联系人 */void doDelete(){for (int i = 0; i < totalContactCount; i++) {printf("编号:%d\t 联系人:%s --- 电话:%s\n", i + 1, contacts[i].name, contacts[i].phone);}printf("您选择的是删除联系人,请按提示操作:\n");int no;printf("请输入要删除的联系人的编号:\n");scanf("%d", &no);if (validateInput(no, 1, totalContactCount)) {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--;}// 同步更新到文件中writeToFile();}}/**    修改联系人 */void doUpdate(){for (int i = 0; i < totalContactCount; i++) {printf("编号:%d\t 联系人:%s --- 电话:%s\n", i + 1, contacts[i].name, contacts[i].phone);}printf("您选择的是修改联系人,请按提示操作:\n");int no;printf("请输入要修改的联系人的编号:\n");scanf("%d", &no);if (validateInput(no, 1, totalContactCount)) {return;}//    contacts[no-1].name = "kkk"; contacts[no-1].name 是数组名, 是常量值 不能直接赋值...// 使用 strcpy函数char nameTemp[NAMELEN];char phoneTemp[NUMLEN];printf("请输入新联系人姓名:\n");scanf("%s", nameTemp);printf("请输入新联系人电话:\n");scanf("%s", phoneTemp);int flag;printf("确认要覆盖数据吗? 1.确认 0.取消\n");scanf("%d", &flag);if (flag) {// 写入文件strcpy(contacts[no - 1].name, nameTemp);strcpy(contacts[no - 1].phone, phoneTemp);writeToFile();}for (int i = 0; i < totalContactCount; i++) {printf("编号:%d\t 联系人:%s --- 电话:%s\n", i + 1, contacts[i].name, contacts[i].phone);}}/**    显示所有联系人 */void doShowAll(){printf("您选择的是显示所有联系人,联系人数据如下:\n");if (totalContactCount == 0) {printf("通讯录还没有联系人\n");}else {for (int i = 0; i < totalContactCount; i++) {printf("编号:%d\t 联系人:%s --- 电话:%s\n", i + 1, contacts[i].name, contacts[i].phone);}}}/** * 搜索联系人 */void doSearchByName(){printf("您选择的是搜索联系人,请按提示操作:\n");char name[NAMELEN];printf("请输入要查找的联系人\n");scanf("%s", name);int i;for (i = 0; i < totalContactCount; i++) {// strcmp 返回值 0 表示相等if (!strcmp(name, contacts[i].name)) {//找到了printf("编号:%d\t 联系人:%s --- 电话:%s\n", i + 1, contacts[i].name, contacts[i].phone);break;}}if (i == totalContactCount) {printf("查无此人\n");}}//判断 用户输入的num合法性int validateInput(int num, int min, int max){if (num < min || num > max) {printf("非法的输入\t");return 1;}return 0;}


0 0