c语言开发手机通讯录

时间:2021-12-16 06:52:24

c语言开发手机通讯录

//

//  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(&current, 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(&current, 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