实现一个通讯录;

通讯录能够用来存储1000个人的信息。每一个人的信息包含:

姓名、性别、年龄、电话、住址





功能例如以下:

1.  加入联系人信息

2.  删除指定联系人信息

3.  查找指定联系人信息

4.  改动指定联系人信息

5.  显示全部联系人信息

6.  清空全部联系人

模块化设计:

头文件 结构体和对应函数的定义,声明

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h> #define MAX 1000
#define NAME_LENGTH 20
#define SEX_LENGTH 5
#define AGE_LENGTH 3
#define TELE_LENGTH 20
#define ADDR_LENGTH 30 /*
结构体 用于储存通讯录人员信息
*/
struct ContactsUser
{
char name[NAME_LENGTH];
char sex[SEX_LENGTH];
/*
VS编译器下scanf_s对于长度有安全保护 因此採用字符数组保存年龄
*/
char age[AGE_LENGTH];
char tele[TELE_LENGTH];
char addr[ADDR_LENGTH];
}; /*
结构体 将上一个结构体装起来 同一时候创建变量记录人数
*/
struct Contacts
{
struct ContactsUser person[MAX];
int user_count;
}; typedef struct Contacts *pContacts; int add_contacts(pContacts pcon);//加入函数
int dele_contacts(pContacts pcon);//删除函数
int clear_contacts(pContacts pcon);//清空函数
int find_contacts(pContacts pcon);//查找函数
int modify_contacts(pContacts pcon);//改动函数
void show_contacts(pContacts pcon);//显示函数
void menu();//主菜单</span>
#include "contacts.h"  

/*
各个功能函数
*/ /*
菜单
*/
void menu()
{
printf(" Contacts \n");
printf("\n");
printf("1. Add the users_info \n");
printf("2. Delete the users_info \n");
printf("3. Clean all the users_info \n");
printf("4. Find the users_info \n");
printf("5. Modify the users_info\n");
printf("6. Show all the users_info\n");
printf("7. exit\n");
printf("\n"); } /*
查询实体函数 用于将输入的用户特征和储存进行比較(strcmp)
方便其它功能函数的调用
*/
int find_entry(pContacts pcon)
{
int i = 0;
char name[NAME_LENGTH];
printf("please input name:");
scanf_s("%s", name,NAME_LENGTH);
for (i = 0; i < pcon->user_count; i++)
{
if (strcmp(pcon->person[i].name, name) == 0) //输入和存储进行比較
{
return i;
}
}
return -1;
} /*
增添函数
*/
int add_contacts(pContacts pcon)
{
if (pcon->user_count == MAX)
{
printf("Telephone book is full!\n");
return -1;
}
else
{
printf("Please input name:");
/*
scanf_s安全函数 应该加入控制长度的參数
*/
scanf_s("%s", pcon->person[pcon->user_count].name, NAME_LENGTH);
/*
数组从下标为0到下标为user_count-1 ,则在user_count处操作
*/
printf("Please input sex:");
scanf_s("%s", pcon->person[pcon->user_count].sex, SEX_LENGTH);
printf("Please input age:");
scanf_s("%s", pcon->person[pcon->user_count].age, AGE_LENGTH);
printf("Please input tele:");
scanf_s("%s", pcon->person[pcon->user_count].tele,TELE_LENGTH);
printf("Please input addr:");
scanf_s("%s", pcon->person[pcon->user_count].addr, ADDR_LENGTH); pcon->user_count++;//加入结束 人员数目添加1
return 1;
} } /*
删除函数
*/
int dele_contacts(pContacts pcon)
{
int i = 0;
int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置 if (ret != -1)
{
for (i = ret; i < pcon->user_count - 1; i++)
{
pcon->person[i] = pcon->person[i + 1];
}
pcon->user_count--;
return 1;
}
else
{
printf("not exist!\n");
return -1;
}
} /*
清空函数
*/
int clear_contacts(pContacts pcon)
{
memset(pcon->person,0,MAX);
/*
memset函数 在一段内存中填充给定的值
是对较大结构体或数组清零的最快方法
*/
pcon->user_count = 0; //count 赋值0 进行清零 return 1;
} /*
查找函数
*/
int find_contacts(pContacts pcon)
{
int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置
if (ret != -1)
{
printf("name:%-5s", pcon->person[ret].name, NAME_LENGTH);
printf("sex:%-5s", pcon->person[ret].sex, SEX_LENGTH);
printf("age:%-5s", pcon->person[ret].age, AGE_LENGTH);
printf("tele:%-5s", pcon->person[ret].tele, TELE_LENGTH);
printf("addr:%-5s", pcon->person[ret].addr, ADDR_LENGTH);
return 1;
}
else
{
printf("not exist!\n");
return -1;
}
} /*
改动函数
*/
int modify_contacts(pContacts pcon)
{
int ret = find_entry(pcon);//定义ret 接收find_entry的返回位置
if (ret != -1)
{
printf("Please input name:");
scanf_s("%s", pcon->person[ret].name, NAME_LENGTH);
printf("Please input sex:");
scanf_s("%s", pcon->person[ret].sex, SEX_LENGTH);
printf("Please input age:");
scanf_s("%s", pcon->person[ret].age, AGE_LENGTH);
printf("Please input tele:");
scanf_s("%s", pcon->person[ret].tele, TELE_LENGTH);
printf("Please input addr:");
scanf_s("%s", pcon->person[ret].addr, ADDR_LENGTH);
return 1;
}
else
{
printf("not exist!\n");
return -1;
}
} /*
显示函数
*/
void show_contacts(pContacts pcon)
{
int i = 0;
printf("\tname\tsex\t\tage\t\ttele\t\t\taddr\n");
for (i = 0; i < pcon->user_count; i++)
{
printf("%10s\t", pcon->person[i].name);
printf("%5s\t", pcon->person[i].sex);
printf("%10s\t", pcon->person[i].age);
printf("%15s\t", pcon->person[i].tele);
printf("%20s\t", pcon->person[i].addr);
}
printf("\n");
}</span>
#include "contacts.h"  

/*
主函数
*/
int main()
{ int input = 1; //定义一个输入 初始化
struct Contacts user;
user.user_count = 0;//为user_count进行初始化 menu(); while (input)
{
printf("\n enter you choice(0-7):\n");
scanf_s("%d", &input);
switch (input) //switch-case 使用不同的功能函数
{
case 1:
add_contacts(&user);
break;
case 2:
dele_contacts(&user);
break;
case 3:
clear_contacts(&user);
break;
case 4:
find_contacts(&user);
break;
case 5:
modify_contacts(&user);
break;
case 6:
show_contacts(&user);
break;
case 7:
printf("Thanks for use!\n");
break;
default:
printf("input error!\n");
break;
}
} return 0;
}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSXJlYW5fTGF1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSXJlYW5fTGF1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

通讯录结构体方法的实现 和VS中存在的一些问题的分析的更多相关文章

  1. C语言中的结构体和C++中的结构体以及C++中类的区别

    c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一. ...

  2. C语言 结构体数组保存到二进制文件中

    在项目中我定义了一个结构体数组,头文件如下: C/C++ code   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  3. FFmpeg 结构体学习(八):FFMPEG中重要结构体之间的关系

    FFMPEG中结构体很多.最关键的结构体可以分成以下几类: 解协议(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议 ...

  4. struct结构体在c和c++中的差别

    非常多次遇到这个struct的问题,今天在这里简单总结一下我的理解 一.struct在C 中的使用 1.单独使用struct定义结构体类型 struct Student { int id; int n ...

  5. C语言的结构体,枚举类型在程序中的作用

    http://www.xue63.com/xueask-1221-12212854.html 结构和枚举类型从程序实现的角度来说,是用更接近自然语言的方式来表达数据.比如说实现2维空间的点,你可以使用 ...

  6. C语言结构体在内存中的存储情况探究------内存对齐

    条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类 ...

  7. Go语言中结构体的使用-第2部分OOP

    1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...

  8. c++中的结构体:声明 定义 初始化

    什么是结构体? 之前的学习中我们知道了数组是一个容器,而且是存放固定大小数据的容器,而且存放的元素的数据类型必须要一致. 比如数据库中有这样的一条记录学号 性别 年龄 成绩 地址应该怎样存放 结构体: ...

  9. Linux2.6 内核中结构体初始化(转载)

    转自:http://hnniyan123.blog.chinaunix.net/uid-29917301-id-4989879.html 在Linux2.6版本的内核中,我们经常可以看到下面的结构体的 ...

随机推荐

  1. [转]Android:异步处理之AsyncTask的应用(二)

    2014-11-07     既然UI老人家都这么忙了,我们这些开发者肯定不能不识趣的去添乱阻塞UI线程什么的,否则UI界面万一停止响应了呢——这不是招骂的节奏么?!所以我们知道用Handler+Th ...

  2. Codeforces Beta Round #5 D. Follow Traffic Rules 物理

    D. Follow Traffic Rules 题目连接: http://www.codeforces.com/contest/5/problem/D Description Everybody kn ...

  3. iOS开发经验总结——基础工程

    iOS开发经验总结--依赖库 这篇博客,我想说一下开发中经常遇到的一个问题,虚拟个场景描述一下的话,应该是这样的. 项目经理:今天我们正式开始一个新项目,iOSer你负责把苹果端的APP完成,有没有问 ...

  4. Linux下同一网段内的IP中两台主机通信不经过路由器(ARP)(转)

    答案一:同一网段A与B通信,不需要路由器介入. A直接广播ARP request 到广播域,B处于同一广播域,可以接收到ARP request,B用单播方式直接告诉A自己的MAC B 地址.A收到B的 ...

  5. <摘录>Gson对Java嵌套对象和JSON字符串之间的转换

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ...

  6. 一些WPF中的滤镜特效——Effect Library

    WPF支持类似PhotoShop的滤镜功能,称之为Effect.在.Net 4.0中,WPF就废弃了对BitMapEffect的支持,转向使用支持GPU加速的Effect类,例如,我们可以使用如下代码 ...

  7. hdu 2176 取石子游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=2176 提示:尼姆博弈,异或 #include <iostream> #include <cst ...

  8. WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态

    WPF判断命令(Command)是否能够执行是通过ICommand.CanExecute事件,在实际程序中路由命令一般是通过CommandBinding来使命令得到实际操作代码,但是这个CanExec ...

  9. Power Desginer系列02【转载】

    在概念模型中主要有以下几个操作和设置的对象:实体(Entity).实体属性 (Attribute).实体标识(Identifiers).关系(Relationship).继承(Inheritance) ...

  10. ansible安装文档

    一.系统环境 [root@ansible ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@ansible ~]# uname ...