本文实例为大家分享了C语言实现通讯录程序的具体代码,供大家参考,具体内容如下
设计要求:
可以存放1000个人的信息,每个人的信息包括姓名、年龄、性别、电话、住址
通讯录功能包括:
1.增加联系人
2.删除指定联系人
3.查找指定联系人
4.修改指定联系人
5.显示所有联系人
6.退出通讯录
思路分析:
首先我们需要创建3个文件,分别是源文件(test.c)、通讯录文件(contact.c)、通讯录头文件(contact.h),其中头文件用来包含头文件、声名信息、结构体、创建全局变量以及宏。
我们一步一步完成这个程序:
1.在源程序中写一个菜单函数menu()以及联合体Option,当然这个时候还没有引头文件,不可以运行。菜单函数menu()中清楚的标明每个数字对应的功能,分别是 1.增加联系人 2.删除指定联系人 3.查找指定联系人 4.修改指定联系人 5.显示所有联系人 0.退出通讯录。在联合体中相应的成员对应数字0~5。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
void menu() { printf ( "\n" ); printf ( "**************************************\n" ); printf ( "****** 1. add 2. del ******\n" ); printf ( "****** 3. search 4.modify ******\n" ); printf ( "****** 5. show 0. exit ******\n" ); printf ( "**************************************\n" ); } enum Option { EXIT, //0 ADD, //1 DEL, //2 SEARCH, //3 MODIFY, //4 SHOW //5 }; |
2.写主函数main(),定义input代表要输入的数,在do while循环中首先调用菜单函数menu(),然后请你输入一个数字,再用switch语句对应相应的功能,在之前我们说过联合体的成员就代表数字0~5,所以case ADD == case case 1,以此类推。相应的选择对应相应功能的函数,如果你选了1,则进入case ADD,然后调用AddContact(),传参&con,当然这个函数要在后面进行创建。con是什么也在后面解释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
int main() { int input = 0; struct Contact con; //创建一个通讯录 InitContact(&con); //初始化通讯录 do { menu(); printf ( "请选择:" ); scanf ( "%d" , &input); switch (input) { case ADD: AddContact(&con); break ; case DEL: DelContact(&con); break ; case SEARCH: SearchContact(&con); break ; case MODIFY: ModifyContact(&con); break ; case SHOW: ShowContact(&con); break ; case EXIT: printf ( "退出通讯录\n" ); break ; default : printf ( "选择错误\n" ); break ; } } while (input); return 0; } |
3.创建头文件contact.h,定义结构体类型struct PeoInfo和struct Contact。前者是一个人的信息,创建了他的结构体类型变量代表创建了一个人的信息;后者是一个通讯录的数据,创建一个struct Contact类型的变量包括一个存放1000个数据的struct PeoInfo类型数组data[],再定义一个sz用来计算存放人数。当然我们看到数组中的符号是#define定义的宏,用来替换那些数字。之前看到的con是创建的一个struct Contact类型变量,并且将他初始化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#define NAME_MAX 30 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #define MAX 1000 struct PeoInfo { char name[NAME_MAX]; //姓名 int age; //年龄 char sex[SEX_MAX]; //性别 char tele[TELE_MAX]; //电话 char addr[ADDR_MAX]; //住址 }; struct Contact { struct PeoInfo data[MAX]; //1000个人的数据存放在data数组中 int sz; //通讯录中当前有效元素个数 }; |
4.引用头文件,并声明函数。至此,contact.h就写完了,因为这个头文件已经引用了接下来需要用到的#include <stdio.h>和#include <string.h>,所以直接在test.c中引用#include "contact.h"就可以。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#define NAME_MAX 30 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #define MAX 1000 #include <stdio.h> #include <string.h> struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }; struct Contact { struct PeoInfo data[MAX]; //1000个人的数据存放在data数组中 int sz; //通讯录中当前有效元素个数 }; void AddContact( struct Contact* pc); //增加联系人 void DelContact( struct Contact* pc); //删除指定联系人 void SearchContact( struct Contact* pc); //查找指定联系人 void ModifyContact( struct Contact* pc); //修改指定联系人 void ShowContact( struct Contact* pc); //显示所有联系人 |
5.写contact.c也就是通讯录的具体实现。首先引头文件#include "contact.h",然后写初始化函数InitContact()。用一个结构体指针接受(1000个容量)。将sz赋值为0,数组全部成员赋值为0,用到memset函数,头文件#include <string>我们之前已经引过了。
1
2
3
4
5
6
7
|
#include "contact.h" void InitContact( struct Contact* pc) { pc->sz = 0; //默认没有信息 memset (pc->data, 0, sizeof (pc->data)); } |
6.接下来写各个功能的函数:
AddContact()增加联系人,输入信息至指针指向的数组的第sz位的相应成员。sz初始为0,刚好对应数组第0位。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
void AddContact(struct Contact* pc) { if (pc->sz == MAX) { printf("通讯录已满,无法添加信息\n"); } else { printf("请输入名字:"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址:"); scanf("%s", pc->data[pc->sz].addr); printf("添加成功\n"); pc->sz++; } } |
DelContact()删除指定联系人,如果sz不为0,说明通讯录中有信息,可以进行删除。输入名字后需进行查找,这里通过写一个遍历查找姓名函数FindContactByName()进行查找,其中使用库函数strcmp(字符串比较函数),如果相等则返回数组下标pos,然后在DelContact()从第pos位开始循环,将后一位的值赋给前一位,代表删除成功,然后sz--。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
int FindContactByName(const struct Contact* pc, const char* name) { int i = 0; for (i = 0; i < pc- >sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; } void DelContact(struct Contact* pc) { if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } char name[NAME_MAX] = { 0 }; printf("请输入要删除人的名字:"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("指定的联系人不存在\n"); } else { //删除 int j = 0; for (j = pos; j < pc- >sz-1; j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; printf("删除成功\n"); } } |
SearchContact()查找指定联系人,直接调用FindContactByName(),找到后打印信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void SearchContact( const struct Contact* pc) { char name[NAME_MAX] = { 0 }; printf ( "请输入要查找人名字:" ); scanf ( "%s" , name); int pos = FindContactByName(pc, name); if (pos == -1) { printf ( "查无此人\n" ); } else { printf ( "%15s\t%5s\t%8s\t%15s\t%30s\n" , "name" , "age" , "sex" , "tele" , "addr" ); printf ( "%15s\t%5d\t%8s\t%15s\t%30s\n" , pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } } |
ModifyContac()修改指定联系人,使用FindContactByName()查找,如果存在的话返回数组下标pos,然后输入新的信息覆盖到指针指向下标为pos的数组data的相应成员。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
void ModifyContact( struct Contact* pc) { char name[NAME_MAX] = { 0 }; printf ( "请输入要修改人的名字:" ); scanf ( "%s" , name); int pos = FindContactByName(pc, name); if (pos == -1) { printf ( "要修改的人不存在\n" ); } else { printf ( "请输入新的名字:" ); scanf ( "%s" , pc->data[pos].name); printf ( "请输入新的年龄:" ); scanf ( "%d" , &(pc->data[pos].age)); printf ( "请输入新的性别:" ); scanf ( "%s" , pc->data[pos].sex); printf ( "请输入新的电话:" ); scanf ( "%s" , pc->data[pos].tele); printf ( "请输入新的住址:" ); scanf ( "%s" , pc->data[pos].addr); printf ( "修改成功" ); } } |
ShowContact()显示所有联系人,进入函数先打印一行表头,用“\t”分隔开,然后用for循环打印每一个人的数据,直到第sz个人停下来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
void ShowContact( struct Contact* pc) { int i = 0; printf ( "%15s\t%5s\t%8s\t%15s\t%30s\n" , "name" , "age" , "sex" , "tele" , "addr" ); for (i = 0; i < pc->sz; i++) { printf ( "%15s\t%5d\t%8s\t%15s\t%30s\n" , pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } |
写到这里就已经全部完成了通讯录程序的制作,下面展示所有的代码:
test.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#include "contact.h" void menu() { printf ( "\n" ); printf ( "**************************************\n" ); printf ( "****** 1. add 2. del ******\n" ); printf ( "****** 3. search 4.modify ******\n" ); printf ( "****** 5. show 0. exit ******\n" ); printf ( "**************************************\n" ); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW }; int main() { int input = 0; struct Contact con; //创建一个通讯录 InitContact(&con); //初始化通讯录 do { menu(); printf ( "请选择:" ); scanf ( "%d" , &input); switch (input) { case ADD: AddContact(&con); break ; case DEL: DelContact(&con); break ; case SEARCH: SearchContact(&con); break ; case MODIFY: ModifyContact(&con); break ; case SHOW: ShowContact(&con); break ; case EXIT: printf ( "退出通讯录\n" ); break ; default : printf ( "选择错误\n" ); break ; } } while (input); return 0; } |
contact.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#include "contact.h" void InitContact( struct Contact* pc) { pc->sz = 0; //默认没有信息 memset (pc->data, 0, sizeof (pc->data)); } void AddContact( struct Contact* pc) { if (pc->sz == MAX) { printf ( "通讯录已满,无法添加信息\n" ); } else { printf ( "请输入名字:" ); scanf ( "%s" , pc->data[pc->sz].name); printf ( "请输入年龄:" ); scanf ( "%d" , &(pc->data[pc->sz].age)); printf ( "请输入性别:" ); scanf ( "%s" , pc->data[pc->sz].sex); printf ( "请输入电话:" ); scanf ( "%s" , pc->data[pc->sz].tele); printf ( "请输入住址:" ); scanf ( "%s" , pc->data[pc->sz].addr); printf ( "添加成功\n" ); pc->sz++; } } int FindContactByName( const struct Contact* pc, const char * name) { int i = 0; for (i = 0; i < pc->sz; i++) { if ( strcmp (pc->data[i].name, name) == 0) { return i; } } return -1; } void DelContact( struct Contact* pc) { if (pc->sz == 0) { printf ( "通讯录为空,无法删除\n" ); return ; } char name[NAME_MAX] = { 0 }; printf ( "请输入要删除人的名字:" ); scanf ( "%s" , name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf ( "指定的联系人不存在\n" ); } else { //删除 int j = 0; for (j = pos; j < pc->sz-1; j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; printf ( "删除成功\n" ); } } void SearchContact( const struct Contact* pc) { char name[NAME_MAX] = { 0 }; printf ( "请输入要查找人名字:" ); scanf ( "%s" , name); int pos = FindContactByName(pc, name); if (pos == -1) { printf ( "查无此人\n" ); } else { printf ( "%15s\t%5s\t%8s\t%15s\t%30s\n" , "name" , "age" , "sex" , "tele" , "addr" ); printf ( "%15s\t%5d\t%8s\t%15s\t%30s\n" , pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } } void ModifyContact( struct Contact* pc) { char name[NAME_MAX] = { 0 }; printf ( "请输入要修改人的名字:" ); scanf ( "%s" , name); int pos = FindContactByName(pc, name); if (pos == -1) { printf ( "要修改的人不存在\n" ); } else { printf ( "请输入新的名字:" ); scanf ( "%s" , pc->data[pos].name); printf ( "请输入新的年龄:" ); scanf ( "%d" , &(pc->data[pos].age)); printf ( "请输入新的性别:" ); scanf ( "%s" , pc->data[pos].sex); printf ( "请输入新的电话:" ); scanf ( "%s" , pc->data[pos].tele); printf ( "请输入新的住址:" ); scanf ( "%s" , pc->data[pos].addr); printf ( "修改成功" ); } } void ShowContact( struct Contact* pc) { int i = 0; printf ( "%15s\t%5s\t%8s\t%15s\t%30s\n" , "name" , "age" , "sex" , "tele" , "addr" ); for (i = 0; i < pc->sz; i++) { printf ( "%15s\t%5d\t%8s\t%15s\t%30s\n" , pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } |
contact.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#define NAME_MAX 30 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #define MAX 1000 #include <stdio.h> #include <string.h> struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }; struct Contact { struct PeoInfo data[MAX]; //1000个人的数据存放在data数组中 int sz; //通讯录中当前有效元素个数 }; void AddContact( struct Contact* pc); //增加联系人 void DelContact( struct Contact* pc); //删除指定联系人 void SearchContact( struct Contact* pc); //查找指定联系人 void ModifyContact( struct Contact* pc); //修改指定联系人 void ShowContact( struct Contact* pc); //显示所有联系人 |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/m0_59063052/article/details/120652902