通讯录(静态);
一个能够实现增加、查找、修改、删除、按姓名排序、
打印所有联系人 清空所有联系人这些功能的通讯录
联系人:
姓名、年龄、性别、地址、电话
1.头文件:
#pragma once
#include<string.h>
#include<stdlib.h>
#define MAX_CONACT 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_PHONE 12
#define MAX_ADDR 50
typedef struct person
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char phone[MAX_PHONE];
char addr[MAX_ADDR];
}person;
typedef struct Contact
{
person data[MAX_CONACT];
int sz;
}Conact,*pConact;
void init_conact(pConact pc);
void add(pConact pc);
void display(pConact pc);
int search(pConact pc);
void change(pConact pc);
void sort(pConact pc);
void del(pConact pc);
int find(pConact pc);
void clear(pConact pc);
2.测试部分:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include"conact.h"
void menu()
{
printf("***********************************\n");
printf("*******1.添加******2.删除**********\n");
printf("*******3.查找******4.修改**********\n");
printf("*******5.显示所有**6.清除所有******\n");
printf("*******7.排序******0.退出**********\n");
printf("***********************************\n");
}
enum option
{
EXIT,
ADD,
DEL,
SEARCH,
CHANGE,
DISPLAY,
CLEAR,
SORT
};
int main()
{
int input = 0;
Conact my_cont;
init_conact(&my_cont);
do
{
menu();
printf("请选择:>\n");
scanf("%d",&input);
switch(input)
{
case EXIT:
printf("退出程序!");
exit(0);
case DEL:
del(&my_cont);
break;
case DISPLAY:
display(&my_cont);
break;
case SEARCH:
search(&my_cont);
break;
case CHANGE:
change(&my_cont);
break;
case SORT:
sort(&my_cont);
break;
case ADD:
add(&my_cont);
break;
case CLEAR:
clear(&my_cont);
break;
default:
printf("输入错误!\n");
break;
}
}while(input);
return 0;
}
3.通讯录实现部分:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"conact.h"
int find(pConact pc,char name[])
{
int i = 0;
for(i=0;i<pc->sz;i++)
{
if(strcmp(name,pc->data[i].name)==0)
{
printf("%2s%10s%5d%12s%20s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].phone,
pc->data[i].addr);
return i;
}
}
return -1;
}
void init_conact(pConact pc)
{
memset(pc->data,0,sizeof(pc->data));
pc->sz=0;
}
void add(pConact pc)
{
if((pc->sz)>MAX_CONACT)
{
printf("这个电话博已经满了!\n");
/*return;*/
}
printf("请输入你要添加联系人的姓名:>\n");
scanf("%s",pc->data[pc->sz].name);
printf("性别:>\n");
scanf("%s",pc->data[pc->sz].sex);
printf("年龄:>\n");
scanf("%d",&pc->data[pc->sz].age);
printf("电话:>\n");
scanf("%s",pc->data[pc->sz].phone);
printf("地址:>\n");
scanf("%s",pc->data[pc->sz].addr);
pc->sz++;
printf("添加成功!\n");
}
void display(pConact pc)
{
int i = 0;
printf("%2s%15s%10s%12s%10s\n","姓名","性别","年龄","电话号","地址");
for(i=0;i<pc->sz;i++)
{
printf("%2s%10s%5d%12s%20s\n",pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].phone,
pc->data[i].addr);
}
}
int search(pConact pc)
{
char name[MAX_NAME];
int i = 0;
printf("请输入联系人姓名:>\n");
scanf("%s",name);
// find(pc,name);
i=find(pc,name);
if(i==-1)
printf("没有此联系人!\n");
return i;
}
void change(pConact pc)
{
int i =search(pc);
if((0<=i)&&(i<(pc->sz)))
{
printf("请重新输入联系人的姓名:>\n");
scanf("%s",pc->data[i].name);
printf("性别:>\n");
scanf("%s",pc->data[i].sex);
printf("年龄:>\n");
scanf("%d",&pc->data[i].age);
printf("电话:>\n");
scanf("%s",pc->data[i].phone);
printf("地址:>\n");
scanf("%s",pc->data[i].addr);
printf("修改成功并保存!\n");
}
else
printf("没有此联系人!\n");
}
void sort(pConact pc)
{
int i = 0;
person temp;
for(i=0;i<pc->sz-1;i++)
{
if(strcmp(pc->data[i].name,pc->data[i+1].name)>0)
{
strcpy(temp.name,pc->data[i].name);
strcpy(temp.sex,pc->data[i].sex);
temp.age=pc->data[i].age;
strcpy(temp.phone,pc->data[i].phone);
strcpy(temp.addr,pc->data[i].addr);
strcpy(pc->data[i].name,pc->data[i+1].name);
strcpy(pc->data[i].sex,pc->data[i+1].sex);
pc->data[i].age=pc->data[i+1].age;
strcpy(pc->data[i].phone,pc->data[i+1].phone);
strcpy(pc->data[i].addr,pc->data[i+1].addr);
strcpy(pc->data[i+1].name,temp.name);
strcpy(pc->data[i+1].sex,temp.sex);
pc->data[i+1].age=temp.age;
strcpy(pc->data[i+1].phone,temp.phone);
strcpy(pc->data[i+1].addr,temp.addr);
}
}
printf("排序成功!\n");
}
void del(pConact pc)
{
char name[MAX_NAME];
int i = 0;
printf("请输入要删除的联系人:>\n");
scanf("%s",name);
i=find(pc,name);
for(i;i<pc->sz-1;i++)
{
strcpy(pc->data[i].name,pc->data[i+1].name);
strcpy(pc->data[i].sex,pc->data[i+1].sex);
pc->data[i].age=pc->data[i+1].age;
strcpy(pc->data[i].phone,pc->data[i+1].phone);
strcpy(pc->data[i].addr,pc->data[i+1].addr);
}
pc->sz--;
printf("删除成功!\n");
}
void clear(pConact pc)
{
pc->sz=0;
}
写完这个真的不容易,写一些单个程序还将就,而写这种程序刚开始对于一个菜鸟来说是很难的,但黄天不负有心人,在这一段时间对C语言的学习之后,我终于完成了这个程序,最大收获是:
凡事贵在坚持,相信自己也能写出好的代码,只不过是时间的事而已!!!!
动态通讯录
上次写的是一个静态的,这下就可以更新了,虽然代码很拙劣,但至少有第一次独立完成,那么接下来再写这种代码就会有第二次、第三次、、,而且我想肯定会一次比一次写得好,而且越来越容易。
下面来看一下代码
1.test.c测试部分:
#include<stdio.h>
#include"conact.h"
void menu()
{
printf("**********************************\n");
printf("**********1.添加******2.修改******\n");
printf("**********3.查找******4.删除******\n");
printf("**********5.打印******6.排序******\n");
printf("**********7.清空所有**8.退出******\n");
printf("**********************************\n");
}
enum option//用枚举来列出菜单选项
{
ZEO,//因为选项是1~8,没有0所以把枚举里第一个元素用非选项的"东西"占掉!!
ADD,
CHANGE,
SEARCH,
DEL,
DISPLAY,
SORT,
CLEAR,
EXIT
};
int main()
{
int input=0;
conact my_cont;
init_conact(&my_cont);
do
{
menu();
printf("请选择:>\n");
scanf("%d",&input);
switch(input)
{
case ADD:
add(&my_cont);
break;
case CHANGE:
change(&my_cont);
break;
case DEL:
del(&my_cont);
break;
case SEARCH:
search(&my_cont);
break;
case SORT:
sort(&my_cont);
break;
case DISPLAY:
display(&my_cont);
break;
case CLEAR:
clear(&my_cont);
break;
case EXIT:
exit(1);
break;
default:
printf("请重新选择:>\n");
break;
}
}while(input);
my_free(&my_cont);//在conact.c开辟的空间在程序结束的时候释放。
return 0;
}
3.conact.h头文件:
#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define NAME_MAX 10
#define SEX_MAX 4
#define PHONE_MAX 12
#define ADDR_MAX 20
#define PEOPLE_MAX 1
typedef struct people
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char phone[PHONE_MAX];
char addr[ADDR_MAX];
}people;
typedef struct conact
{
people *head;
int c_number;
int count;
}conact,*pcont;
void init_conact(pcont pc);
void my_free(pcont pc);
void add(pcont pc);
void change(pcont pc);
int search(pcont pc);
void del(pcont pc);
void display(pcont pc);
void sort(pcont pc);
void clear(pcont pc);
3.conact.c实现通讯录:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"conact.h"
int find(pcont pc,char name[])
{
int i = 0;
for(i=0;i<pc->count;i++)
{
if(strcmp(pc->head[i].name,name)==0)
return i;
}
return -1;
}
void init_conact(pcont pc)
{
people* p=NULL;
pc->c_number=PEOPLE_MAX;
pc->count=0;
p=(people*)malloc((pc->c_number)*sizeof(people));//初始化先开辟c_number个people*.pleople*是个结构体指针类型。
if(p==NULL)//p==NULL是内存开辟失败的判断条件
{
printf("没有内存!\n");
}
else//如果不满足上述条件,则说明开辟空间成功
{
pc->head=p;
pc->count=0;
}
}
void my_free(pcont pc)
{
free(pc->head);//是放开辟的空间,并赋以空指针。
pc->head=NULL;
}
void add(pcont pc)
{
int i = pc->count;
people *p=NULL;
if(pc->count==pc->c_number)
{
p=(people*)realloc(pc->head,(pc->count+1)*sizeof(people));
//pc->c_number=pc->count+1;
if(p==NULL)
{
printf("没有空间了!\n");
return;
}
pc->head=p;
}
printf("请输入姓名、性别、年龄、电话、地址:>\n");
printf("请输入姓名:>\n");
scanf("%s",pc->head[i].name);
printf("性别:>\n");
scanf("%s",pc->head[i].sex);
printf("年龄:>\n");
scanf("%d",&(pc->head[i].age));
printf("电话:>\n");
scanf("%s",pc->head[i].phone);
printf("地址:>\n");
scanf("%s",pc->head[i].addr);
pc->count++;
printf("添加成功!\n");
}
void change(pcont pc)
{
int i = 0;
//search(pc);
i=search(pc);
if(i>=0&&i<(pc->count))
{
printf("请重新输入姓名:>\n");
scanf("%s",pc->head[i].name);
printf("性别:>\n");
scanf("%s",pc->head[i].sex);
printf("年龄:>\n");
scanf("%d",&(pc->head[i].age));
printf("电话:>\n");
scanf("%s",pc->head[i].phone);
printf("地址:>\n");
scanf("%s",pc->head[i].addr);
printf("修改成功!\n");
}
else
printf("没有此联系人!\n");
}
int search(pcont pc)
{
char name[NAME_MAX];
int i = 0;
printf("请输入姓名:>\n");
scanf("%s",name);
find(pc,name);
i=find(pc,name);
if(i>=0&&i<(pc->count))
{
printf("%5s%10s%10s%14s%20s\n","姓名","性别","年龄","电话","地址");
printf("%10s %5s %4d %13s %30s\n",
pc->head[i].name,
pc->head[i].sex,
pc->head[i].age,
pc->head[i].phone,
pc->head[i].addr);
return i;
}
else
return i;
}
void del(pcont pc)
{
int i = 0;
//search(pc);
i=search(pc);
if(pc->count==0)
printf("这个电话博为空!\n");
if(i==-1)
printf("此联系人不存在!\n");
else
{
for(i;i<pc->count-1;i++)
{
strcpy(pc->head[i].name,pc->head[i+1].name);
strcpy(pc->head[i].sex,pc->head[i+1].sex);
pc->head[i].age=pc->head[i+1].age;
strcpy(pc->head[i].phone,pc->head[i+1].phone);
strcpy(pc->head[i].addr,pc->head[i+1].addr);
}
pc->count--;
printf("删除成功!\n");
}
}
void display(pcont pc)
{
int i = 0;
printf("%5s%10s%10s%14s%20s\n","姓名","性别","年龄","电话","地址");
for(i=0;i<pc->count;i++)
{
printf("%10s%5s%4d%14s%20s\n",
pc->head[i].name,
pc->head[i].sex,
pc->head[i].age,
pc->head[i].phone,
pc->head[i].addr
);
}
}
void sort(pcont pc)
{
int i = 0;
people temp;
for(i=0;i<pc->count-1;i++)
{
if(strcmp(pc->head[i].name,pc->head[i+1].name)>0)
{
strcpy(temp.name,pc->head[i].name);
strcpy(temp.sex,pc->head[i].sex);
temp.age=pc->head[i].age;
strcpy(temp.phone,pc->head[i].phone);
strcpy(temp.addr,pc->head[i].addr);
strcpy(pc->head[i].name,pc->head[i+1].name);
strcpy(pc->head[i].sex,pc->head[i+1].sex);
pc->head[i].age=pc->head[i+1].age;
strcpy(pc->head[i].phone,pc->head[i+1].phone);
strcpy(pc->head[i].addr,pc->head[i+1].addr);
strcpy(pc->head[i+1].name,temp.name);
strcpy(pc->head[i+1].sex,temp.sex);
pc->head[i+1].age=temp.age;
strcpy(pc->head[i+1].phone,temp.phone);
strcpy(pc->head[i+1].addr,temp.addr);
}
}
printf("排序成功!\n");
}
void clear(pcont pc)
{
pc->count=0;
printf("清除成功!\n");
}
运行结果截图: