通讯录结构体方法的实现 和VS中存在的一些问题的分析

实现一个通讯录;

通讯录可以用来存储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;
}

运行结果:

时间: 2024-12-12 00:55:35

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

结构体和它在链表中的使用

一.结构体 由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的. 1.1如何声明结构体呢? struct 结构体名  //结构体名字用作结构体类型的标志 {成员列表}; 比如: 1 struct student 2 { 3 int num; //2 4 char name[20]; //20 5 char sex; //1 6 int age; //2 7 float score; //4 8 char addr[30]; //30 9 }; 注意:声明只是指定了一

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

c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一.相同之处:结构体中可以包含函数:也可以定义public.private.protected数据成员:定义了结构体之后,可以用结构体名来创建对象.但C中的结构体不允许有函数:也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数. 二.不同之处

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

非常多次遇到这个struct的问题,今天在这里简单总结一下我的理解 一.struct在C 中的使用 1.单独使用struct定义结构体类型 struct Student { int id; int name; }stu1; struct Student stu2; stu1.id=1; stu2.id=2; 上面定义了一个结构体类型struct Student 和一个结构体类型变量stu1. 所以有两种定义结构体变量的方式: 一种是这就跟在结构体定义的后面(}之后),一种是用 struct  结

几种排序方法的实现(更新中)

插入排序: 1).直接插入排序: 假设当前排序到了第i个元素arr[i],则此时i左侧[0,i-1]已经有序,对于arr[i]来说,如果arr[i]>=arr[i-1],则不用排序,直接进入[i+1];否则要在左侧有序表中找到一个合适的位置j令arr[j]<=arr[i]<arr[j+1]. 每一趟插入排序,令当前有序表的长度增加1,直至有序长度等于数组长度. class Solution { public: void InsertSort(vector<int>&

如何在STL的map中使用结构体作为键值

这里首先给出容器map的原型: template < class Key, class T, class Compare = less<Key>, class Alloc = alloc> class map{ ... } 可以看到模板参数一共有四个,第一个就是Key,即键:第二个就是值:第四个就是空间配置器,默认使用alloc(随STL版本不同而不同).那么第三个是啥? 我们知道,map的底层数据结构,其实是树,更确切的说,是一个RB-tree(红黑树).RB-tree树在进行插

Foundation 框架中常用的结构体详解

Foundation 框架包含了很多开发常用的数据类型: Foundation中包含的数据类型: 结构体 枚举 类 要想使用 Foundation 中的数据类型,只要包含主头文件即可. #impot <Foundation/Foundation.h> 结构体: 我们常用的结构体有:NSRange.NSPoint (CGPint ).NSSize(CGSize).NSRect(CGRect) NSRange:是用来表示位置和范围的. 本质是: 1 typedef struct _NSRange

51CTO C开发频道中笔记之一(结构体和枚举)

(1)结构体和枚举是C++中的构造数据类型.构造数据类型是由基本数据类型按照一定的规则组合 在一起而构成的数据类型.枚举在C/C++中,是一个被命名的整型常数的集合. 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型. (2)结构体(struct)的使用 struct test {  float a;  int b; }; 上面的代码就定义了一个名为test的结构体,它的数据类型就是test

C语言中结构体在函数中的应用

一.结构体与函数参数结构体作函数参数可分为传值与传指针.1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下,由于涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响,所以这种方法基本不用.例如:typedef struct tagSTUDENT{char name[20];int age;}STUDENT; void fun(STUDENT stu){printf("stu.name=%s,stu.

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

转自:http://hnniyan123.blog.chinaunix.net/uid-29917301-id-4989879.html 在Linux2.6版本的内核中,我们经常可以看到下面的结构体的定义和初始化.这在以前的C语言书中是极少见到的.下面的一个结构体来自到Linux内核中的一部分.在这个结构体中我们可以看到有普通的整型变量,也有函数的指针. struct net_proto_family { int family; int (*create)(struct net *net, st