设计要求

问题描述

  纸质的通讯录系统已经不能满足大家的要求,容易丢失、查找困难等问题是纸质通讯录所不能克服的缺点。“学生通讯管理系统”是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行管理和分析的一种应用程序。

需求分析
  1. 输入数据建立通讯录
  2. 查询通讯录系统中满足要求的信息
  3. 插入新的通讯录信息
  4. 删除不需要的通讯录信息
  5. 查看所有通讯录信息

概要设计

主界面设计

  为了实现学生通讯录管理系统各功能的管理,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。本系统主控菜单运行界面如图所示。
主界面.png

存储结构设计

  本系统主要采用链表结构类型来表示存储在“学生通讯录管理系统”中的信息。其中,链表结点由四个分量构成;通讯录成员学号、通讯录成员姓名、通讯录成员电话号码、指向该结构体的指针。

系统功能设计

本系统设置了5个子功能菜单,5个子功能的设计描述如下。

  1. 建立通讯录系统。可以一次输入多个成员通讯录的信息,建立通讯录。
    主界面.png
  2. 插入通讯记录。每次可以插入一个成员通讯录的信息。如果要连续插入多个成员通讯录信息必须多次选择该功能。
    添加1.png
  3. 查询通讯记录。可以按两种方式查询所需要的通讯录成员记录,一是按学号查询,二是按姓名查询。
    查询.png
  4. 删除通讯记录。可以对通讯录中不再需要的信息进行删除。
    删除.png
  5. 显示通讯录系统。可以查看通讯录中所有的通讯录成员记录。
    显示.png

程序代码

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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

typedef struct student //定义学生结点
{
char name[20]; //姓名
int num; //学号
char phone[20]; //电话
struct student *next;
}stud;

void Menu() //菜单
{
printf("\n\n\n");
printf("***********************班级通讯录管理系统***********************\n\n");
printf(" 1.建立通讯录 \n\n");
printf(" 2.添加通讯录 \n\n");
printf(" 3.删除通讯录 \n\n");
printf(" 4.查询通讯录 \n\n");
printf(" 5.显示通讯录 \n\n");
printf(" 0.退出系统 \n\n");
printf("****************************************************************\n");
}

void Init(stud *H) //初始化
{
H->next=NULL;
}

void Input(stud *H) //输入
{
int n;
stud *p, *q;
p=H;
while(p->next)
{
p=p->next; //p指向链表的最后一个结点
}
while(true)
{
q=(stud *)malloc(sizeof(stud)); //申请空间
q->next = NULL;
printf("请输入学生信息:\n");
printf("姓名:"); scanf("%s", &q->name); printf("\n");
printf("学号:"); scanf("%d", &q->num); printf("\n");
printf("电话:"); scanf("%s", &q->phone); printf("\n");
p->next=q;
p=q;
// system("cls"); //清屏
printf("是否接着输入:1(继续)/0(结束)\n");
scanf("%d", &n);
if(n==0) break;
}
}

void Output(stud *H) //显示输出
{
// system("cls");
stud *p;
p = H->next;
if(!p)
{
printf("\n没有学生记录!!!\n");
return ;
}
printf("姓名 学号 电话\n");
while(p) //输出学生记录
{
printf("%s %d %s\n", p->name, p->num,p->phone);
p=p->next;
}
}

void Findm(stud *H) //查询姓名
{
// system("cls");
char str[20];
bool f=false;
stud *p;
p=H->next;
printf("请输入姓名:\n");
scanf("%s", str);
if(!p)
{
printf("没有符合条件的学生记录!\n");
return ;
}
printf("姓名 学号 电话\n");
while(p)
{
if(strcmp(str, p->name)==0) //找到了一条符合条件的记录
{
f=true;
printf("%s %d %s\n",
p->name, p->num,p->phone);
}
p=p->next;
}
if(!f)
{
printf("没有符合条件的学生记录!\n");
}

}

void Findh(stud *H) //查询学号
{
// system("cls");
char str;
bool f=false;
stud *p;
p=H->next;
printf("请输入学号:\n");
scanf("%d", str);
if(!p)
{
printf("没有符合条件的学生记录!\n");
return ;
}
printf("姓名 学号 电话\n");
while(p)
{
if(str==p->num) //找到了一条符合条件的记录
{
f=true;
printf("%s %d %s\n",
p->name, p->num, p->phone);
}
p=p->next;
}
if(!f)
{
printf("没有符合条件的学生记录!\n");
}
}

void Find(stud *H) //查询
{
int select;
// system("cls");
printf("*************************查询**************************************\n\n");
printf(" 1.按姓名 \n\n");
printf(" 2.按学号 \n\n");
printf(" 0.退出 \n\n");
printf("*******************************************************************\n\n");
while(true)
{
printf("请选择(0-2)");
scanf("%d",&select);
if(select>=0&&select<3) break;
}
switch(select)
{
// case 0: return 0; break;
case 1: Findm(H); break;
case 2: Findh(H); break;
}
}



void Del(stud *H)//删除学生信息
{
char str[20];
printf("\n请输入要删除记录的姓名:\n");
scanf("%s", str);
stud *p, *q;
p=H;
q=H->next;
bool flag=false;
while(q)
{
if(strcmp(q->name, str)==0)
{
flag=true;
p->next=q->next;
q=p->next;break;
}
p=q;
q=q->next;
}
printf("\n删除成功!!\n");
printf("\n\n删除成功后的学生通讯信息:\n");
Output(H);
}

void Add(stud *H) //添加学生信息
{
int n;
stud *p, *q;
p=H;
while(p->next) //p指向链表的最后一个结点
{
p=p->next;
}
while(true)
{
q=(stud *)malloc(sizeof(stud)); //申请空间
q->next = NULL;
printf("\n请输入添加学生的信息:\n");
printf("姓名:"); scanf("%s", &q->name); printf("\n");
printf("学号:"); scanf("%d", &q->num); printf("\n");
printf("电话:"); scanf("%s", &q->phone); printf("\n");
p->next=q;
p=q;
// system("cls"); //清屏
printf("是否继续添加:1(继续)/0(结束)\n");
scanf("%d", &n);
if(n==0) break;
}
printf("\n添加成功!\n");
printf("\n\n添加成功后的学生通讯信息:\n");
Output(H);
}

int main()
{
stud *H;
H = (stud *)malloc(sizeof(stud)); //注意,申请空间的时候最好是在主函数中申请
Init(H); //初始化,申请一个头结点
bool flag;
int select, m;
while(true)
{
Menu();
printf("请输入(0-5):\n");
flag=true;
while(flag)
{
flag=false;
scanf("%d", &select);
if(select<0 || select>5)
{
printf("输入不正确,请重新输入(0-5):\n");
flag=true;
}
}
switch(select)
{
case 0: return 0; break;
case 1: Input(H); break;
case 2: Add(H); break;
case 3: Del(H); break;
case 4: Find(H); break;
case 5: Output(H); break;
}
printf("\n请选择:1(继续)/0(结束)\n");
scanf("%d", &m);
if(m==0) return 0;
// system("cls"); //清屏
}
return 0;
}

微信公众号
微信公众号二维码.jpg