//

//  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

c语言开发手机通讯录的更多相关文章

  1. Android 个人手机通讯录开发

    一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 1. 界面展示                2. ...

  2. 开源前夕先给大家欣赏一下我用C语言开发的云贴吧 网站自动兼容-移动、手机、PC自动兼容云贴吧

    开源前夕先给大家欣赏一下我用C语言开发的移动.手机.PC自动兼容云贴吧 - 涨知识属马超懒散,属虎太倔强.十二生肖全了!-转自云寻觅贴吧 转: 涨知识属马超懒散,属虎太倔强.十二生肖全了! -转自云寻 ...

  3. 开源前夕先给大家赞赏一下我用C语言开发的云贴吧 站点自己主动兼容-移动、手机、PC自己主动兼容云贴吧

    开源前夕先给大家赞赏一下我用C语言开发的移动.手机.PC自己主动兼容云贴吧 - 涨知识属马超懒散,属虎太倔强.十二生肖全了!-转自云寻觅贴吧 转: 涨知识属马超懒散,属虎太倔强.十二生肖全了! -转自 ...

  4. Android程序设计-简单手机通讯录

    在微信中,手机QQ中你会发现软件读取手机通讯录这个功能,这个功能使得软件更好的与手机联系人绑定,从而达到分享,拨打电话,读取用户信息等操作.下面我们将通过一个demo实现这个功能 首先我们看一下效果图 ...

  5. 【Android Demo】简单手机通讯录

    Android 系统给我们提供了访问通讯录的接口,通过接口获取通讯录信息.Adapter 与 View 的连接主要依靠 getView 这个方法返回我们需要的自定义 view. ListView 是 ...

  6. PhoneGap开发手机程序入门教程

    用PhoneGap开发手机移动程序 1.     什么是PhoneGap PhoneGap是一个自由开放源码的开发工具和框架,允许利用HTML + JavaScript + CSS的强大功能在多个手机 ...

  7. 基于Java语言开发jt808、jt809技术文章精华索引

    很多技术开发人员喜欢追逐最新的技术,如Node.js, go等语言,这些语言只是解决了某一个方面,如只是擅长异步高并发等等,却在企业管理后台开发方面提供的支持非常不够,造成项目团队技术选项失败,开发后 ...

  8. iOS之多语言开发

    前要:iOS多语言开发,可以分为两种 系统设置,通过在手机设置中切换语言,进而改变app中语言: app中手动切换,用户在app中,手动选择语言,进行切换. 一.添加需要的语言 不管使用哪种方法,都需 ...

  9. Go语言开发

    Go语言圣经(中文版)     Go编程语言规范 搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇           Go开发工具 Go命令行操作命令详细介绍 ...

随机推荐

  1. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)

    利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...

  2. 有哪些 PHP 调试技巧?

    我目前遇到的最让我称赞的debug方式是:xdebug的 xdebug_start_trace(); /* 业务代码 */ xdebug_stop_trace(); 他解决了我长久以来一个代码调试问题 ...

  3. Python mix-in 组合 ~ 将类组合起来 .

    在一个池塘中有10个乌龟 1 条鱼 . class Turtle: def __init__(self,x): # 在生命对象的时候 说明对象的 数量 . (还是一个对象 . 数量只是该对象的一个属性 ...

  4. python3爬虫初探(二)之requests

    关于请求网页,不得不提requests这个库,这是爬虫经常用到的一个第三方库,用pip安装即可. requests用法很多,这里只写一些基础的,其他高级功能可参考官方文档. import reques ...

  5. HDOJ-三部曲一(搜索、数学)-1008-Prime Path

    Prime Path Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total S ...

  6. two Sum ---- LeetCode 001

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  7. Android系统在新进程中启动自定义服务过程(startService)的原理分析

    在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...

  8. Mac OS X中配置Apache

    我使用的Mac OS X版本是10.8.2,Mac自带了Apache环境. 启动Apache 设置虚拟主机 启动Apache 打开“终端(terminal)”,输入 sudo apachectl -v ...

  9. 20145210 《Java程序设计》第07周学习总结

    教材学习内容总结 第十二章 Lambda 12.1 认识Lambda语法 •Lambda 教材的引入循序渐近.深入浅出 •如果使用JDK8的话,可以使用Lambda特性去除重复的信息,例: Compa ...

  10. Android PermissionChecker 权限全面详细分析和解决方案

    原文: http://www.2cto.com/kf/201512/455888.html http://blog.csdn.net/yangqingqo/article/details/483711 ...