//
// main.c
// 手机通讯录
//
// Created by Kevin-Dfg on 16/4/19.
// Copyright © 2016年 Kevin-Dfg. All rights reserved.
//
#include <stdio.h>
#include <string.h>
// =====================变量的定义==================================
//定义宏 去描述 联系人名字数组和联系人号码数组的长度
#define NAME_LEN 30
#define NUM_LEN 30
//定义一个宏 去描述联系人列表最多可以放多少个联系人
#define MAX_LEN 1000
#define MYFILENAME "day12.txt"
//描述联系人的信息 --》 结构体
struct Person{
//联系人的姓名
char name[NAME_LEN];
//联系人的号码
char num[NUM_LEN];
};
//多个联系人信息 --》 批量的联系人信息--》 结构体数组去描述整个联系人列表信息 定义一个足够长的数组 去保存我们想要存的联系人信息
struct Person peoples[MAX_LEN];
//创建一个变量 描述当前数组中 有多少个联系人
int current = 0;
// ======================函数的声明=================================
//初始化数据
void init();
//添加联系人
void addP();
//删除联系人
void delP();
我的github: https://github.com/Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C
//修改联系人
void updP();
//展示联系人
void showP();
//搜索联系人
void searchP();
//展示功能列表
void showTitle();
//写入文件操作
void writToFile();
/*
1.调用初始化函数
2.写循环 将 展示功能 放入循环中
3. 提示用户输入序号 表示要执行哪个功能
4。接收用户的输入
5.根据序号进行选择执行那些功能 调用对应的函数
**/
int main(int argc, const char * argv[]) {
//主逻辑
init();
while (1) {
//展示功能项
showTitle();
//给用户提示 请输入功能项的序号
printf("请输入对应功能的序号 : ");
//接收用户的输入
int user = 0;
scanf("%d",&user);
//做简单的判断 去容错
if (user <1 || user> 6) {
printf("没有此功能 别闹 \n");
return 0;
}
//假如用户输入的是 6
if (user == 6) {
printf("选择了 退出系统 \n");
return 0;
}
//判断用户的输入 选择不同的功能
switch (user) {
case 1:
printf("选了 1 添加联系人操作 \n");
addP();
break;
case 2:
printf("选了 2 删除联系人操作 \n");
delP();
break;
case 3:
printf("选了 3 修改联系人操作 \n");
updP();
break;
case 4:
printf("选了 4 展示联系人操作 \n");
showP();
break;
case 5:
printf("选了 5 搜索联系人操作 \n");
searchP();
break;
default:
break;
}
}
return 0;
}
// ===================函数的实现====================================
//初始化数据
//把文件中的数据 读取出来 存入到 内存中的结构体数组中
void init(){
//1.引入头文件
//2.定义文件指针 并打开文件
FILE *fp = fopen(MYFILENAME, "r");
if(fp != NULL){
//3.操作文件
//读取数据 到内存中
//把文件中存多少条数据 取出
fread(¤t, sizeof(int), 1, fp);
//根据存了多少条数据 进行读取操作
for (int i = 0; i < current; i++) {
fread(&peoples[i], sizeof(struct Person), 1, fp);
}
printf("读取完毕 \n");
}else{
// 没有上一次 ---> 第一次使用
//printf("");
}
//4.关闭文件
fclose(fp );
printf("初始化完毕 \n");
}
//添加联系人
//1.提示 输入联系人名字
//2.接收联系人名字
//3.提示 输入联系人号码
//4.接收联系人号码
//5.确定添加吗
//6.接受用户的选择
//7.根据用户的选择做出添加操作
//7.1 添加到内存中的联系人数组中
//7.2 current 进行自增1
//7.3 将联系人信息写入到文件
void addP(){
//1.提示 输入联系人名字
printf("请输入联系人的名字 :(注意请不要输入空格 )\n");
//2.接收联系人名字
char name[NAME_LEN];
scanf("%s",name);
//3.提示 输入联系人号码
printf("请输入联系人号码:(注意请不要输入空格)\n");
//4.接收联系人号码
char num[NUM_LEN];
scanf("%s",num);
//5.确定添加吗
printf("确定添加吗? 1(确定) , 0(取消) : ");
//6.接受用户的选择
int user = 0;
scanf("%d",&user);
//7.根据用户的选择做出添加操作
if (user) {
//7.1 添加到内存中的联系人数组中
strcpy(peoples[current].name, name);
strcpy(peoples[current].num, num);
//7.2 current 进行自增1
current++;
//7.3 将联系人信息写入到文件
//调用 写入文件操作
writToFile();
}
printf("添加联系人完毕 !\n");
}
//删除联系人
//思路: 让用户输入序号 来确定要删除那个联系人 删除数组中这个指定联系人的信息 同时 更新文件
//1.展示联系人列表
//2.提示用户输入序号
//3.接收这个序号
//4.简单容错
//5.提示用户是否确定删除
//6.接收用户的选择
//7.根据用户的选择执行 删除数组元素的操作
//8.更新文件
void delP(){
//1.展示联系人列表
showP();
//2.提示用户输入序号
printf("请输入要删除的联系人的序号 : \n");
//3.接收这个序号
int ser = -1;
scanf("%d",&ser);
//4.简单容错
if (ser <0 || ser >= current) {
printf("没有该序号 功能执行完毕 \n");
return;
}
//5.提示用户是否确定删除
printf("是否确定删除 1(确定) 0(取消)\n");
//6.接收用户的选择
int flag = 0;
scanf("%d",&flag);
if (flag == 1) {
//7.根据用户的选择执行 删除数组元素的操作
//7.1 假如用户输入的是 最后一个元素的时候 此时删除数组最后一个元素 数组长度--
// if (ser == current-1) {
// current--;
// }else{
// //7.2 如果删除的不是最后一个元素的时候 移动后续的元素 数组长度--
// for (int i = ser; i< current; i++) {
// peoples[i] = peoples[i+1];
// }
// current--;
//
// }
//
if (ser < current) {
for (int i = ser; i< current-1; i++) {
peoples[i] = peoples[i+1];
}
}
current--;
//8.更新文件
writToFile();
}
printf("删除联系人完毕 !\n");
}
//修改联系人
//思路 : 让用户输入新联系人信息 拿着这个新联系人信息 根据用户输入的 序号 去修改 联系人数组中指定的位置 并更新文件
void updP(){
//1.展示联系人列表
showP();
//2.请输入要修改的联系人的 序号
printf("请输入联系人的序号 ");
//3.接收这个序号
int serial = -1;
scanf("%d",&serial);
//简单容错
if (serial <0 || serial>=current) {
printf("无此人 \n");
return;
}
//4.提示用户输入新的名字
printf("请输入联系人的新名字:(请不要带空格)\n");
//5.接收这个新的名字
char name[NAME_LEN];
scanf("%s",name);
//6.提示用户输入新的电话号
printf("请输入联系人的新号码:(请不要输入空格)\n");
//7.接收新的电话号
char num[NUM_LEN];
scanf("%s",num);
//是否确认修改
printf("确定修改吗 ? 1(确定) 0(取消) \n");
int flag = 0 ;
scanf("%d",&flag);
if (flag ==1 ) {
//8.根据用户输入的序号找到数组的指定位置 进行修改
strcpy(peoples[serial].name, name);
strcpy(peoples[serial].num, num);
//9.更新文件
writToFile();
}
printf("修改联系人完毕 !\n");
showP();
}
//展示联系人
//1.提示执行展示联系人操作
//2.打印表头
//3.遍历联系人列表 ---> 结构体数组
void showP(){
//1.提示执行展示联系人操作
printf("执行展示联系人操作\n");
//2.打印表头
printf("序号\t\t\t\t姓名\t\t\t\t号码\t\t\t\t\t\n");
//3.遍历联系人列表 ---> 结构体数组
for (int i = 0; i < current; i++) {
printf("%d\t\t\t\t%s\t\t\t\t%s\n",i,peoples[i].name,peoples[i].num);
}
printf("展示联系人完毕 !\n");
}
//搜索联系人
//让用户输入联系人的名字 拿着这个名字遍历 联系人数组 一旦找到跟名字一样的 打印联系人的号码. 如果没有找到说没有改联系人
//1.给用户提示 输入联系人的名字
//2.接收用户输入的名字
//3.遍历结构体数组 查找是否有该名字 如果有 打印联系人的号码
//4.如果没有 给一个提示
void searchP(){
//1.给用户提示 输入联系人的名字
printf("请输入联系人的名字:(名字请不到带空格 )\n");
//2.接收用户输入的名字
char name[NAME_LEN];
scanf("%s",name);
//3.遍历结构体数组 查找是否有该名字 如果有 打印联系人的号码
for (int i = 0; i < current; i++) {
//判断用户输入的名字 与我们联系人的名字是否一样
if(strcmp(name, peoples[i].name) == 0){
printf("%s的 电话号码是 %s \n",name,peoples[i].num);
return;
}
}
printf("没有找到 \n");
//4.如果没有 给一个提示
printf("搜索联系人完毕 !\n");
}
//展示功能列表
void showTitle(){
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 writToFile(){
//1.引入头文件
//2.定义文件指针 并 打开文件
FILE *fp = fopen(MYFILENAME, "w+");
if (fp != NULL) {
//3.操作文件
//把数组中所有的数据都写入到文件中保持文件的完整性 .
fwrite(¤t, sizeof(int), 1, fp);
//遍历
for (int i = 0; i < current; i++) {
fwrite(&peoples[i], sizeof(struct Person), 1, fp);
}
}else{
printf("文件打开失败 \n");
}
//4.关闭文件
fclose(fp);
printf("写入文件 \n");
}
我的github:https://github.com/Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C