C语言使用结构体实现简单通讯录
作者:玩的就是沧桑 发布时间:2023-05-30 02:27:27
标签:C语言,通讯录
C语言用结构体实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
代码实现:
头文件:
#ifndef __HEAD_H__ ////防止头文件被多次调用
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define PEOPLE_MAX 1000
#define NAME_LENTH 20
#define SEX_LENTH 5
#define AGE_LENTH 10
#define TEL_LENTH 15
#define ADDR_LENTH 50 //宏定义各个数据所需的大小,后续引用直接可以使用名称,或需修改时只用修改这里就可以了
struct People
{
char name[NAME_LENTH];
char sex[SEX_LENTH];
int age;
char tel[TEL_LENTH ];
char addr[ADDR_LENTH];
}; //定义人的信息结构体(包含各种信息)
struct Contact
{
struct People person[PEOPLE_MAX];
int user_count;
}; //定义通讯录结构体(包含人的信息的结构体和用户个数)
typedef struct Contact * pContact;
int add_contact(pContact pcon); //pContact是一个结构体指针类型,pcon是一个指向struct Contact的一个指针
int dele_contact(pContact pcon); //例如:typedef int * int 即 int *p ==> int p
int find_contact(pContact pcon);
int modify_contact(pContact pcon);
int show_contact(pContact pcon);
int clear_contact(pContact pcon);
void menu(); //函数的声明
#endif
各种函数实现:
#include"head.h"
int add_contact(pContact pcon)
{
if(pcon->user_count >= PEOPLE_MAX)
{
printf("contact is full!\n");
return -1;
}
else
{
printf("input name,please!\n");
scanf("%s",pcon->person[pcon->user_count].name);
printf("input sex,please!\n");
scanf("%s",pcon->person[pcon->user_count].sex);
printf("input age,please!\n");
scanf("%d",&pcon->person[pcon->user_count].age); //这里用%d输出int
printf("input tel,please!\n");
scanf("%s",pcon->person[pcon->user_count].tel);
printf("input addr,please!\n");
scanf("%s",pcon->person[pcon->user_count].addr);
(pcon->user_count)++;
}
return 0;
} //添加信息的实现
int dele_contact(pContact pcon)
{
int ret = find_contact(pcon); //调用查找函数并保存其值
if(ret != -1)
{
int i = 0;
i = ret; //这里要用另一个变量来保存输入的姓名
for(i = 0;i < pcon->user_count-1;i++)
{
pcon->person[i] = pcon->person[i+1]; //用后一个覆盖前边的,如果要删除的是最后一个不进行此步骤
}
pcon->user_count --; //直接减去最后一个即count--
}
return 0;
}
int find_contact(pContact pcon)
{
int i = 0;
char ret[NAME_LENTH]; //用另一个数组来保存name
printf("input name,please!\n");
scanf("%s",ret);
while(i <= pcon->user_count)
{
if(strcmp(ret,pcon->person[i].name)== 0) //比较输入的姓名和通讯录中已有的姓名
{
printf("name\tsex\tage\ttel\taddr\t\n");
printf("%s\t",pcon->person[i].name);
printf("%s\t",pcon->person[i].sex);
printf("%d\t",pcon->person[i].age);
printf("%s\t",pcon->person[i].tel);
printf("%s\t\n",pcon->person[i].addr);
return i;
}
i++;
}
printf("sorry,the name you find is not exist!\n");
return -1;
}
int modify_contact(pContact pcon) //修改函数,首先找到如要修改的姓名,然后重新输入
{
int ret = find_contact(pcon);
if(ret != -1)
{
printf("input name,please!\n");
scanf("%s",pcon->person[ret].name);
printf("input sex,please!\n");
scanf("%s",pcon->person[ret].sex);
printf("input age,please!\n");
scanf("%d",&(pcon->person[ret].age));
printf("input tel,please!\n");
scanf("%s",pcon->person[ret].tel);
printf("input addr,please!\n");
scanf("%s",pcon->person[ret].addr);
}
else
{
printf("sorry,the name you find is not exist!\n");
}
return 0;
}
int show_contact(pContact pcon)
{
int i = 0;
printf("name\tsex\tage\ttel\t\taddr\t\n"); //制表符来制作表头
for(i = 0;i < pcon->user_count;i++)
{
printf("%s\t",pcon->person[i].name);
printf("%s\t",pcon->person[i].sex);
printf("%d\t",pcon->person[i].age);
printf("%s\t",pcon->person[i].tel);
printf("%s\t\n",pcon->person[i].addr);
}
printf("\n");
return 0;
}
int clear_contact(pContact pcon)
{
pcon->user_count = 0 ;
return 0;
} //清除所有人,直接让成员个数变为0即可
void menu()
{
printf("-------contact---------\n");
printf(" 1.添加联系人信息 \n");
printf(" 2.删除指定联系人信息 \n");
printf(" 3.查找指定联系人信息 \n");
printf(" 4.修改指定联系人信息 \n");
printf(" 5.显示所有联系人信息 \n");
printf(" 6.清空所有联系人 \n");
printf(" 0.谢谢使用 \n");
printf("-------contact---------\n");
}
主函数:
#include"head.h"
int main()
{
int n=1;
struct Contact people; //调用通讯录结构体
people.user_count = 0; //初始化user_count
while(n)
{
menu();
printf("please input\n");
scanf("%d",&n);
switch(n)
{
case 1:
{
add_contact(&people);
break;
}
case 2:
{
dele_contact(&people);
break;
}
case 3:
{
find_contact(&people);
break;
}
case 4:
{
modify_contact(&people);
break;
}
case 5:
{
show_contact(&people);
break;
}
case 6:
{
clear_contact(&people);
break;
}
default:
{
return 0;
break;
} //switch case语句分支选择不同函数实现不同作用
}
}
return 0;
}
结果实现:
来源:http://blog.csdn.net/ret_skd/article/details/44923195


猜你喜欢
- 持久层的那些事什么是 JDBCJDBC(JavaDataBase Connectivity)就是 Java 数据库连接, 说的直白点就是 使
- 学习大佬们开发安全小工具,打包jar解决错误: 找不到或无法加载主类 main1 Maven方式遇到报错”找不到或无法加载主类 main“解
- 背景由于项目是采用java编写的,微信包括微信支付大都是php相关,于是微信支付官方文档对java的支持就不是很友好,在网上找了很多文章,基
- 本文实例讲述了C#判断访问来源是否为搜索引擎链接的方法。分享给大家供大家参考。具体分析如下:这段代码通过获取UrlReferrer判断访客是
- 本文实例为大家分享了QT实现简单计算器功能的具体代码,供大家参考,具体内容如下效果图:新建工程,创建类MainWindow,基类是QMain
- 【1】首先我们定义一段假数据,这里以一个string为例字static void Main(string[] args){string da
- 前言Spring框架中的BeanFactory接口和FactoryBean接口因为名称相似,老是容易搞混淆,而且也是面试过程中经常会碰到的一
- 前言很多时候,当你以为掌握了事实真相的时间,如果你能再深入一点,你可能会发现另外一些真相。比如面向切面编程的最佳编程实践是AOP,AOP的主
- 前言枚举在java里也算个老生长谈的内容了,每当遇到一组需要类举的数据时我们都会自然而然地使用枚举类型:public enum Color
- 看门见山1.java中replace API:replace(char oldChar, char newChar):寓意为:返回一个新的字
- 1、synchronized的作用为了避免临界区的竞态条件发生,有多种手段可以达到目的。阻塞式的解决方案:synchronized,Lock
- 分页插件  MP中自带了分页插件的功能,只需要在配置类中进行简单的配置即可使用分页的相关功能。分页插件常
- 在C#中,@符号不仅可以加在字符串常量之前,使字符串不作转义之用,还可以加在变量名之前,使变量名与关键字不冲突,这种用法称为“逐字标识符”。
- Android 7.0系统在运行应用的时候,对权限做了诸多限制,normal, dangerous, signature, signatur
- 做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接的InputStream一次次读取的,读取到的不是需要转换的对象,而是要
- 在Android开发中,我们经常会用到对商家或者商品的评价,运用星星进行打分。然而在Android系统中自带的打分控件,RatingBar特
- 在平时的工作中,估计大多数都做过轮询调度的任务,比如定时轮询数据库同步,定时邮件通知等等。大家通过windows计划任务,windows服务
- 前言前段时间准备做一个视频,最后需要添加字幕,手动添加太麻烦了就想在网上找一个能自动提取字幕的软件或服务,确实是找到了,但是免费版基本上都有
- Unity中的PostProcessScene:深入解析与实用案例在Unity游戏开发中,我们经常需要对场景进行后处理,以实现更丰富的视觉效
- 自动编辑文本框(AutoCompleteTextView)继承自EditText,能够接受用户的输入编辑,但是有这自己的特色功能:输入一定的