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(¤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
c语言开发手机通讯录的更多相关文章
- Android 个人手机通讯录开发
一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 1. 界面展示 2. ...
- 开源前夕先给大家欣赏一下我用C语言开发的云贴吧 网站自动兼容-移动、手机、PC自动兼容云贴吧
开源前夕先给大家欣赏一下我用C语言开发的移动.手机.PC自动兼容云贴吧 - 涨知识属马超懒散,属虎太倔强.十二生肖全了!-转自云寻觅贴吧 转: 涨知识属马超懒散,属虎太倔强.十二生肖全了! -转自云寻 ...
- 开源前夕先给大家赞赏一下我用C语言开发的云贴吧 站点自己主动兼容-移动、手机、PC自己主动兼容云贴吧
开源前夕先给大家赞赏一下我用C语言开发的移动.手机.PC自己主动兼容云贴吧 - 涨知识属马超懒散,属虎太倔强.十二生肖全了!-转自云寻觅贴吧 转: 涨知识属马超懒散,属虎太倔强.十二生肖全了! -转自 ...
- Android程序设计-简单手机通讯录
在微信中,手机QQ中你会发现软件读取手机通讯录这个功能,这个功能使得软件更好的与手机联系人绑定,从而达到分享,拨打电话,读取用户信息等操作.下面我们将通过一个demo实现这个功能 首先我们看一下效果图 ...
- 【Android Demo】简单手机通讯录
Android 系统给我们提供了访问通讯录的接口,通过接口获取通讯录信息.Adapter 与 View 的连接主要依靠 getView 这个方法返回我们需要的自定义 view. ListView 是 ...
- PhoneGap开发手机程序入门教程
用PhoneGap开发手机移动程序 1. 什么是PhoneGap PhoneGap是一个自由开放源码的开发工具和框架,允许利用HTML + JavaScript + CSS的强大功能在多个手机 ...
- 基于Java语言开发jt808、jt809技术文章精华索引
很多技术开发人员喜欢追逐最新的技术,如Node.js, go等语言,这些语言只是解决了某一个方面,如只是擅长异步高并发等等,却在企业管理后台开发方面提供的支持非常不够,造成项目团队技术选项失败,开发后 ...
- iOS之多语言开发
前要:iOS多语言开发,可以分为两种 系统设置,通过在手机设置中切换语言,进而改变app中语言: app中手动切换,用户在app中,手动选择语言,进行切换. 一.添加需要的语言 不管使用哪种方法,都需 ...
- Go语言开发
Go语言圣经(中文版) Go编程语言规范 搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇 Go开发工具 Go命令行操作命令详细介绍 ...
随机推荐
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)
利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...
- 有哪些 PHP 调试技巧?
我目前遇到的最让我称赞的debug方式是:xdebug的 xdebug_start_trace(); /* 业务代码 */ xdebug_stop_trace(); 他解决了我长久以来一个代码调试问题 ...
- Python mix-in 组合 ~ 将类组合起来 .
在一个池塘中有10个乌龟 1 条鱼 . class Turtle: def __init__(self,x): # 在生命对象的时候 说明对象的 数量 . (还是一个对象 . 数量只是该对象的一个属性 ...
- python3爬虫初探(二)之requests
关于请求网页,不得不提requests这个库,这是爬虫经常用到的一个第三方库,用pip安装即可. requests用法很多,这里只写一些基础的,其他高级功能可参考官方文档. import reques ...
- HDOJ-三部曲一(搜索、数学)-1008-Prime Path
Prime Path Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total S ...
- two Sum ---- LeetCode 001
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...
- Mac OS X中配置Apache
我使用的Mac OS X版本是10.8.2,Mac自带了Apache环境. 启动Apache 设置虚拟主机 启动Apache 打开“终端(terminal)”,输入 sudo apachectl -v ...
- 20145210 《Java程序设计》第07周学习总结
教材学习内容总结 第十二章 Lambda 12.1 认识Lambda语法 •Lambda 教材的引入循序渐近.深入浅出 •如果使用JDK8的话,可以使用Lambda特性去除重复的信息,例: Compa ...
- Android PermissionChecker 权限全面详细分析和解决方案
原文: http://www.2cto.com/kf/201512/455888.html http://blog.csdn.net/yangqingqo/article/details/483711 ...