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命令行操作命令详细介绍 ...
随机推荐
- 番茄工作法和Bullet Journal笔记法
番茄工作法是一套时间管理方法,Bullet journal是一套笔记记录的方法,最近通过学习这2个方法来管理自己的时间,让自己战胜拖延症. 番茄工作法 番茄工作法的整体思路就是将时间分割成一个个小时间 ...
- git命令学习用
- 关于Json处理的两个实例
<script> var value1="{\"layer_datum\":{\"holdId\":\"dcdm\", ...
- Android开发中的ANR问题如何避免?
在Android中, Activity Manager 和 Window Manager system services 会监控每个程序的运行,当程序出现如下三种种情况的时候就会弹出ANR的提示对话框 ...
- explain分析查询
参考以下文章,在此非常感谢原作者 explain分析查询
- eclipse安卓模拟器窗口大小调整
引自百度经验的链接: http://jingyan.baidu.com/article/3aed632e18c7e97011809161.html
- java语法学习问题总结
No.1:EnumTest No.2:Addition 在此程序中,学习了将文本框调用出来,文本框输入的数据都是String类型,所以用于计算时需要先进行转型,然后计算. No.3:TestDoubl ...
- Qt 中使用vector
新建Empty qmake project,包含如下两个文件: .pro文件 SOURCES += \ main.cpp QT += core CONFIG += c++11 // 支持C++11 . ...
- YII2.0上传文件
针对于YII2.0官方手册来说,我稍微修改了一些内容具体的就是把model层里定义的uoload方法在controller方法里合并了 创建模型 namespace app\models; use y ...
- LPEG
local lpeg = require "lpeg" function f0() end; function f1() return "a" en ...