实现一个通讯录;

通讯录能够用来存储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. MySQL 之 Index Condition Pushdown(ICP)

    简介 Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式. 当关闭ICP时,index 仅仅是data ...

  2. Java---ConcurrentHashMap分析

    这是第二次分析concurrentHashMap 先回顾一下 1.concurrentHashMap是在jdk1.5版本之后推出的,位于java.util.concurrent包中. 2.基于Hash ...

  3. Spring构造方法注入类型歧义

    在Spring框架中,当一个类包含多个构造函数带的参数相同,它总是会造成构造函数注入参数类型歧义的问题. 问题 让我们来看看这个客户 bean 实例.它包含两个构造方法,均接受3个不同的数据类型参数. ...

  4. struts2类型转化器详解(带例子)

    Struts2有两种类型转化器: 一种局部,一种全局. 如何实现: 第一步:定义转化器 第二部:注册转化器 下面做一个局部类型转化器的实例. 我们在上面一片日志说过有个变量date类型的.只有我们输入 ...

  5. MySQL系列:innodb源码分析之内存管理

    http://blog.csdn.net/yuanrxdu/article/details/40985363 http://book.2cto.com/201402/40307.html 从MySQL ...

  6. [Js插件]使用JqueryUI的弹出框做一个“炫”的登录页面

    引言 查看项目代码的时候,发现项目中用到JqueryUi的弹出框,可拖拽,可设置模式对话框,就想着使用它弄一个登录页面. 弹出框 在Jquery Ui官网可定制下载弹出框,下载和弹出框下载相关的js文 ...

  7. mysql_fetch_assoc 跟mysql_fetch_array 有什么区别?

    mysql_fetch_assoc 得到的是关联数组. Array ( [0] => Array ( [title] => 特价9.9包邮 EFOLAR/依芙拉 BB粉润腮红粉 饼 蘑菇 ...

  8. gitignore不起作用解决的方法

    前面有文章介绍了使用gitignore文件的方法,该文件表示过滤规则,可是对已经增加版本号库的文件不能生效,因此须要利用命令将想要忽略的文件从版本号库中删除,比方说.我们对androidproject ...

  9. Tomcat:基础安装和使用教程

    背景 此文记录了 Tomcat 的基本使用方法,主要为了强化记忆. 安装步骤 第一步:下载和安装 Java 下载地址:http://www.oracle.com/technetwork/java/ja ...

  10. Android学习之Http使用Post方式进行数据提交(普通数据和Json数据)

    转自:http://blog.csdn.net/wulianghuan/article/details/8626551 我们知道通过Get方式提交的数据是作为Url地址的一部分进行提交,而且对字节数的 ...