0%



1. *问题描述*

宿舍管理系统的设计,首先包含两个方面:一个是宿舍中学生的信息,一个是宿舍中管理人员的信息。学生信息包含学号、姓名、性别、公寓、宿舍、电话,管理人员包含id号、姓名、公寓、宿舍、电话。这两种信息的区别是身份不同,所以需要加一个身份区别。

除此之外,还需要进行一定的操作,给出交互反应:添加、删除、查找、修改等新信息,这些都可以设计响应的函数进行操作,并与数据库进行连接。

2. *需求分析*

(1)学生信息:每位学生的学号、姓名、性别、公寓、宿舍、电话、身份

(2)学生信息:每位学生的学号、姓名、性别、公寓、宿舍、电话、身份

(3)系统实现的功能安排

① 添加人员:添加学生和管理人员信息

② 显示人员信息:显示学生和管理人员信息

③ 删除人员信息:删除学生和管理人员信息

④ 修改人员信息:根据输入的id号,修改学生和管理人员的各种信息

⑤ 查找人员:根据输入的id号,查找相应的人员信息

⑥ 查找公寓:根据公寓号,查找对应的人员和管理人员信息

⑦ 退出程序

3. *概要设计*

3.1 数据结构设计

本宿舍管理系统主要采用链表结构类型存储学生信息、管理人员信息以及管理楼对应管理,并且,该宿舍管理系统与数据库建立连接,方便用户进行操作。

此外,根据宿舍的特点,采用多态技术,对学生和管理人员分别重写虚函数,便于使用。

3.2 创新点

(1)多态设计:学生和管理人员在数据库中是两个表,而在计算机中利用多态,同一在一种对象中,方便对对象进行操作

(2)连接数据库:根据数据库的相关函数,与数据库建立连接,调用数据库资源

(3)浏览人员信息:利用数据库,将所有的表中的数据都进行显示

(4)清空文件:利用相关的链表和SQL语言,将链表和数据库中所有信息清空

4. *模块设计*

4.1 模块设计

本系统包括链表模块和数据库模块

4.2 系统子程序及功能设计

(1) 主程序函数 int main() :调用各个函数进行操作

(2) 功能提示函数 void Show_Menu() :输出功能选项

(3) 退出系统函数 void exitSystem() :退出系统

(4) 添加函数 void Add() :添加学生或管理人员信息

(5) 显示人员函数 void Show():显示所有的学生和管理人员信息

(6) 删除人员函数 void Delete():删除相应的人员信息

(7) 修改人员函数 void Mod():根据输入的信息在链表和数据库中修改信息

(8) 查找人员函数 void Find():根据id号查找相应的人员数据

(9) 公寓人员函数 void Build():根据输入的公寓号查找所有的学生和管理人员

(10) 清空文件函数 void Clean():清空链表和数据库中的函数

4.3 函数及调用关系图

函数及调用关系图,如图1所示。

img

图1函数关系图

5. *详细设计*

介绍模块设计中各个函数的具体实现代码

(1) 主程序函数 int main()

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
int main()
{
// 实例化一个管理者对象
DormManager dm;

int choice = 0;
while (true)
{
// 调用展示菜单成员函数
dm.Show_Menu();
cout << "请输入您的选择:" << endl;
cin >> choice;

switch (choice)
{
case 0: //退出系统
dm.exitSystem();
break;
case 1: //添加人员
dm.Add();
break;
case 2: //显示人员
dm.Show();
break;
case 3: //删除人员
dm.Delete();
break;
case 4: //修改人员
dm.Mod();
break;
case 5: //查找人员
dm.Find();
break;
case 6: //公寓人员
dm.Build();
break;
case 7: //清空文件
dm.Clean();
break;
default:
system("cls"); //刷新屏幕
break;
}
}

system("pause");

return 0;
}

(2) 人员抽象基类 person.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
#include <iostream>
#include <string>
using namespace std;

// 人员抽象基类
class Person
{
public:
// 显示个人信息
virtual void showInfo() = 0;

int id; // 人员编号
string name; //人员姓名
string sex; // 人员性别
int building; // 人员公寓楼
string dorm; // 人员宿舍
string phone; // 人员电话
string status; //人员身份

};

(3) 学生类 class student

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include <iostream>
using namespace std;
#include "person.h"

// 学生类
class Student :public Person
{
public:
// 构造函数
Student(int id, string name, string sex, int building, string dorm, string phone);

// 显示个人信息
virtual void showInfo();

};

(4) 学生类实现 student.cpp

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
#include "student.h"

// 构造函数
Student::Student(int id, string name, string sex, int building, string dorm, string phone)
{
this->id = id;
this->name = name;
this->sex = sex;
this->building = building;
this->dorm = dorm;
this->phone = phone;
this->status = "学生";
}

// 显示个人信息
void Student::showInfo()
{
cout << "学生编号:" << this->id
<< "\t学生姓名:" << this->name
<< "\t学生性别:" << this->sex
<< "\t学生公寓:" << this->building
<< "\t学生宿舍:" << this->dorm
<< "\t学生电话:" << this->phone
<< endl;
}

(5) 管理人员类 manager.h

1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
#include "person.h"

// 管理人员类
class Manager : public Person
{
public:
// 构造函数
Manager(int id, string name, string sex, int building, string dorm, string phone);

// 显示个人信息
virtual void showInfo();
};

(6) 管理人员类实现 manager.cpp

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
#include "manager.h"

// 构造函数
Manager::Manager(int id, string name, string sex, int building, string dorm, string phone)
{
this->id = id;
this->name = name;
this->sex = sex;
this->building = building;
this->dorm = dorm;
this->phone = phone;
this->status = "管理人员";
}

// 显示个人信息
void Manager::showInfo()
{
cout << "舍管编号:" << this->id
<< "\t舍管姓名:" << this->name
<< "\t舍管性别:" << this->sex
<< "\t舍管公寓:" << this->building
<< "\t舍管宿舍:" << this->dorm
<< "\t舍管电话:" << this->phone
<< endl;
}

(7) 宿舍管理类 dormManager.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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma once
#include <iostream> // 包含输入输出流文件
using namespace std; // 使用标准命名空间
#include "person.h"
#include<Windows.h>
#include<WinSock.h>
#include<mysql.h>

class DormManager
{
public:
// 记录人员个数
int m_Num;

// 人员数组指针
Person** m_Array;

// 构造函数
DormManager();

// 展示菜单
void Show_Menu();

// 退出功能
void exitSystem();

// 添加人员
void Add();

// 显示人员
void Show();

// 删除人员
void Delete();

// 判断人员是否存在 存在返回索引值
int Exist(int id, string status);

//修改职工
void Mod();

// 查找职工
void Find();

// 公寓人员
void Build();

// 清空文件
void Clean();

// 析构函数
~DormManager();

};

(8) 宿舍管理类实现 dormManager.cpp

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
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
#include "dormManager.h"
#include "mysql.h"
#include <sstream>
#include <string.h>
#include "student.h"
#include "manager.h"
#include <mysql.h>
DormManager::DormManager()
{
// 初始化属性
this->m_Num = 0;
this->m_Array = NULL;
}

// 展示菜单
void DormManager::Show_Menu()
{
cout << "*******************************************************************" << endl;
cout << "************************ 欢迎使用宿舍管理系统 ****************" << endl;
cout << "**************************** 0.退出管理程序 *********************" << endl;
cout << "**************************** 1.增加人员信息 *********************" << endl;
cout << "**************************** 2.显示人员信息 *********************" << endl;
cout << "**************************** 3.删除人员信息 *********************" << endl;
cout << "**************************** 4.修改人员信息 *********************" << endl;
cout << "**************************** 5.查找人员信息 *********************" << endl;
cout << "**************************** 6.按照编号排序 *********************" << endl;
cout << "**************************** 7.清空所有文档 *********************" << endl;
cout << "*******************************************************************" << endl;
cout << endl;
}

// 退出功能
void DormManager::exitSystem()
{
cout << "欢迎下次使用" << endl;
system("pause");
exit(0);
}

// 添加人员
void DormManager::Add()
{
cout << "请输入添加职工数量:" << endl;
int addNum = 0; // 保存用户的输入数量
cin >> addNum;

if (addNum > 0)
{
// 计算添加新空间大小
int newSize = this->m_Num + addNum;

// 开辟新空间
Person** newSpace = new Person * [newSize];

// 将原来空间下数据,拷贝到新空间中
if (this->m_Array != NULL)
{
for (int i = 0; i < this->m_Num; i++)
{
newSpace[i] = this->m_Array[i];
}
}

// 批量添加新数据
for (int i = 0; i < addNum; i++)
{
int id;
string name;
string sex;
int building;
string dorm;
string phone;

DataBase* d = new DataBase;
d->Connect("localhost", "root", "13525681378.Ll", "dormitory_management_system", 3306);
Person* person = NULL;

int choice;
cout << "请输入该人员类别:" << endl;
cout << "1、学生" << endl;
cout << "2、管理人员" << endl;
cin >> choice;
if (choice == 1)
{
string status = "学生";
cout << "请输入第 " << i + 1 << "个新人员编号:" << endl;
cin >> id;
cout << "请输入第 " << i + 1 << "个新人员姓名:" << endl;
cin >> name;
cout << "请输入第 " << i + 1 << "个新人员性别:" << endl;
cin >> sex;
cout << "请输入第 " << i + 1 << "个新人员公寓:" << endl;
cin >> building;
cout << "请输入第 " << i + 1 << "个新人员宿舍:" << endl;
cin >> dorm;
cout << "请输入第 " << i + 1 << "个新职工电话:" << endl;
cin >> phone;

person = new Student(id, name, sex, building, dorm, phone); // 创建对象空间
string sql = "insert into student(id, name, sex, building, dorm, phone, status) values("
+ to_string(id) + ",'" + name + "','" + sex + "'," + to_string(building) + ",'" + dorm + "','" + phone + "','" + status + "')";
char query[150];
strcpy_s(query, sql.c_str());
d->Implement(query);
}
else
{
string status = "管理人员";
cout << "请输入第 " << i + 1 << "个新人员编号:" << endl;
cin >> id;
cout << "请输入第 " << i + 1 << "个新人员姓名:" << endl;
cin >> name;
cout << "请输入第 " << i + 1 << "个新人员性别:" << endl;
cin >> sex;
cout << "请输入第 " << i + 1 << "个新人员公寓:" << endl;
cin >> building;
cout << "请输入第 " << i + 1 << "个新人员宿舍:" << endl;
cin >> dorm;
cout << "请输入第 " << i + 1 << "个新职工电话:" << endl;
cin >> phone;

person = new Manager(id, name, sex, building, dorm, phone);
string sql = "insert into manager(id, name, sex, building, dorm, phone, status) values("
+ to_string(id) + ",'" + name + "','" + sex + "'," + to_string(building) + ",'" + dorm + "','" + phone + "','" + status + "')";
char query[150];
strcpy_s(query, sql.c_str());
d->Implement(query);

string sql2 = "insert into normal(Mid, Mbuilding) values(" + to_string(id) + "," + to_string(building) + ")";
char query2[150];
strcpy_s(query2, sql2.c_str());
d->Implement(query2);
}

// 将创建的人员放到数组中
newSpace[this->m_Num + i] = person;
}
// 释放原有空间
delete[] this->m_Array;

// 更改新空间指向
this->m_Array = newSpace;

// 更改新的人员数量
this->m_Num = newSize;


// 添加成功
cout << "成功添加" << addNum << "名新人员" << endl;
}
else
{
cout << "输入数据有误" << endl;
}

// 按任意键清屏
system("pause");
system("cls");
}

// 显示人员
void DormManager::Show()
{
DataBase* d = new DataBase;
d->Connect("localhost", "root", "13525681378.Ll", "dormitory_management_system", 3306);
if (d->Query("student"))
{
cout << "学生信息显示成功" << endl;
}
else
{
cout << "学生信息显示失败" << endl;
}
if (d->Query("manager"))
{
cout << "管理人员信息显示成功" << endl;
}
else
{
cout << "管理人员信息显示失败" << endl;
}

// 按任意键清屏
system("pause");
system("cls");
}

// 判断人员是否存在 存在返回索引值
int DormManager::Exist(int id, string status)
{
int index = -1;

for (int i = 0; i < this->m_Num; i++)
{
if (this->m_Array[i]->id = id && this->m_Array[i]->status == status)
{
// 找到职工
index = i;
break;
}
}
return index;

}

// 删除人员
void DormManager::Delete()
{
cout << "删除的人员是:" << endl;
cout << "1、学生" << endl;
cout << "2、宿舍管理人员" << endl;
int choice;
cin >> choice;

// 连接数据库
DataBase* d = new DataBase;
d->Connect("localhost", "root", "13525681378.Ll", "dormitory_management_system", 3306);
if (choice == 1) // 学生
{
cout << "请输入删除人员的id号:" << endl;
int id = 0;
cin >> id;
int index = this->Exist(id, "学生");
if (index != -1)
{
// 说明职工存在,并且删除掉index位置的职工
for (int i = index; i < this->m_Num - 1; i++)
{
// 数据前移
this->m_Array[i] = this->m_Array[i + 1];
}
this->m_Num--; // 更新数组中记录人员个数
string sql = "delete from student where id = '" + to_string(id) + "'";
char del[150];
strcpy_s(del, sql.c_str());
d->Implement(del);
cout << "学生删除成功" << endl;
}
else
{
cout << "学生删除失败" << endl;
}

}
else // 管理人员
{
cout << "请输入删除人员的id号:" << endl;
int id = 0;
cin >> id;
int index = this->Exist(id, "管理人员");
if (index != -1)
{
// 说明职工存在,并且删除掉index位置的职工
for (int i = index; i < this->m_Num - 1; i++)
{
// 数据前移
this->m_Array[i] = this->m_Array[i + 1];
}
this->m_Num--; // 更新数组中记录人员个数
string sql = "delete from manager where id = '" + to_string(id) + "'";
char del[150];
strcpy_s(del, sql.c_str());
d->Implement(del);
string sql2 = "delete from normal where Mid = '" + to_string(id) + "'";
char del2[150];
strcpy_s(del2, sql.c_str());
d->Implement(del2);
cout << "学生删除成功" << endl;
}
else
{
cout << "学生删除失败" << endl;
}
}
}

// 查找职工
void DormManager::Find()
{
cout << "请输入查找人员的编号" << endl;
int newId;
cin >> newId;

// 连接数据库
DataBase* d = new DataBase;
d->Connect("localhost", "root", "13525681378.Ll", "dormitory_management_system", 3306);

string sql = "select * from student where id =" + to_string(newId);
string sql2 = "select * from manager where id =" + to_string(newId);
char find[150];
char find2[150];
strcpy_s(find, sql.c_str());
strcpy_s(find2, sql2.c_str());
d->Implement(find);
d->Implement(find2);


}

//修改职工
void DormManager::Mod()
{
// 连接数据库
DataBase* d = new DataBase;
d->Connect("localhost", "root", "13525681378.Ll", "dormitory_management_system", 3306);

cout << "请输入修改人员的身份" << endl;
cout << "1、学生" << endl;
cout << "2、管理人员" << endl;
int choice;
cin >> choice;

if (choice == 1) // 学生
{
cout << "请输入修改学生的编号:" << endl;
int id;
cin >> id;

int ret = this->Exist(id, "学生");
if (ret != -1)
{
// 查找到编号的学生
delete this->m_Array[ret];

int newId = 0;
string newName = "";
string newSex = "";
int newBuilding = 0;
string newDorm = "";
string newPhone = "";
cout << "查到:" << id << "号学生,请输入新学生号:";
cin >> newId;
cout << "请输入新的姓名:";
cin >> newName;
cout << "请输入新的性别:";
cin >> newSex;
cout << "请输入新的公寓:";
cin >> newBuilding;
cout << "请输入新的宿舍:";
cin >> newDorm;
cout << "请输入新的电话:";
cin >> newPhone;

Person* person = NULL;
person = new Student(newId, newName, newSex, newBuilding, newDorm, newPhone);

// 更新数据到数组中
this->m_Array[ret] = person;

string sql = "update student set id = " + to_string(newId) + ",name = '"+ newName + "', sex = '"+ newSex + "', building = "+to_string(newBuilding)+", dorm = '"+newDorm + "', phone = '"+newPhone +"' where id = " +to_string(id)+"";
char update[150];
strcpy_s(update, sql.c_str());
d->Implement(update);

cout << "修改成功" << endl;

}
else
{
cout << "找不到对应的数据,修改失败" << endl;
}
}
else if (choice == 2) // 管理人员
{
cout << "请输入修改管理人员的编号:" << endl;
int id;
cin >> id;

int ret = this->Exist(id, "管理人员");
if (ret != -1)
{
// 查找到编号的管理人员
delete this->m_Array[ret];

int newId = 0;
string newName = "";
string newSex = "";
int newBuilding = 0;
string newDorm = "";
string newPhone = "";
cout << "查到:" << id << "号管理人员,请输入新id号:";
cin >> newId;
cout << "请输入新的姓名:";
cin >> newName;
cout << "请输入新的性别:";
cin >> newSex;
cout << "请输入新的公寓:";
cin >> newBuilding;
cout << "请输入新的宿舍:";
cin >> newDorm;
cout << "请输入新的电话:";
cin >> newPhone;

Person* person = NULL;
person = new Manager(newId, newName, newSex, newBuilding, newDorm, newPhone);

// 更新数据到数组中
this->m_Array[ret] = person;

string sql = "update manager set id = " + to_string(newId) + ",name = '" + newName + "', sex = '" + newSex + "', building = " + to_string(newBuilding) + ", dorm = '" + newDorm + "', phone = '" + newPhone + "' where id = " + to_string(id) + ";";
char update[150];
strcpy_s(update, sql.c_str());
d->Implement(update);

string sql2 = "update normal set Mid = " + to_string(newId) + "', building = " + to_string(newBuilding) + "' where Mid = " + to_string(id) + ";";
char update2[150];
strcpy_s(update2, sql.c_str());
d->Implement(update2);

cout << "修改成功" << endl;

}
else
{
cout << "找不到对应的数据,修改失败" << endl;
}
}
}

// 清空文件
void DormManager::Clean()
{
cout << "确定清空?" << endl;
cout << "1、确定" << endl;
cout << "2、返回" << endl;

int select = 0;
cin >> select;

if (select == 1)
{
// 连接数据库
DataBase* d = new DataBase;
d->Connect("localhost", "root", "13525681378.Ll", "dormitory_management_system", 3306);

string sql = "delete from student";
string sql2 = "delete from manager";
string sql3 = "delete from normal";
char empty[150];
char empty2[150];
char empty3[150];
strcpy_s(empty, sql.c_str());
strcpy_s(empty2, sql2.c_str());
strcpy_s(empty3, sql3.c_str());
if (d->Implement(empty) && d->Implement(empty2) && d->Implement(empty3))
{
cout << "数据库清空成功" << endl;
}

if (this->m_Array != NULL)
{
// 删除堆区的每个职工对象
for (int i = 0; i < m_Num; i++)
{
delete this->m_Array[i];
this->m_Array[i] = NULL;
}

// 删除堆区数组指针
delete[] this->m_Array;
this->m_Array = NULL;
this->m_Num = 0;
}

}
system("pause");
system("cls");
}
// 公寓人员
void DormManager::Build()
{
cout << "请输入想要查询的公寓楼号:" << endl;
int select = 0;
cin >> select;
int index = -1;

cout << select << "公寓的所有人员如下:" << endl;
for (int i = 0; i < this->m_Num; i++)
{
if (this->m_Array[i]->building == select && this->m_Array [i]->status == "学生")
{
this->m_Array[i]->showInfo();
}
}
for (int i = 0; i < this->m_Num; i++)
{
if (this->m_Array[i]->building == select && this->m_Array[i]->status == "管理人员")
{
this->m_Array[i]->showInfo();
}
}

}

DormManager::~DormManager()
{
if (this->m_Array != NULL)
{
for (int i = 0; i < this->m_Num; i++)
{
if (this->m_Array[i] != NULL)
{
delete this->m_Array[i];
}
}
delete[] this->m_Array;
this->m_Array = NULL;
}
}

(9) 数据库连接类 mysql.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
34
#pragma once
#ifndef MY_SQL_H
#define MY_SQL_H

#include<iostream>
#include<Windows.h>
#include<WinSock.h>
#include<mysql.h>

class DataBase
{
public:
DataBase();
~DataBase();
//连接数据库 参数为ip 用户名 密码 数据库名 端口
bool Connect(const char* ip, const char* name, const char* cypher, const char* database_name, const int port);
//获取表内的字段数
int GetTableField(const char* table_name);
//查询表 参数为表名
bool Query(const char* table_name);
//自由执行指令
bool Implement(const char* sentence);


private:
bool _state;//连接状态 true为已连接
MYSQL* _mysql;//mysql连接
MYSQL_FIELD* _fd;//字段列数组
char _field[32][32];//存字段名二维数组
MYSQL_RES* _res;//这个结构代表返回行的一个查询结果集
MYSQL_ROW _column;//一个行数据的类型安全(type-safe)的表示,表示数据行的列
char _query[150];//查询语句
};
#endif // !MY_SQL_H

(10) 数据库连接类实现 mysql.cpp

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
#include "mysql.h"

DataBase::DataBase()
{
_state = false;
_mysql = new MYSQL;
_fd = nullptr;
memset(_field, NULL, sizeof(_field));
_res = nullptr;
_column = nullptr;
memset(_query, NULL, sizeof(_query));
}

DataBase::~DataBase()
{
}

bool DataBase::Connect(const char* ip, const char* name, const char* cypher, const char* database_name, const int port)
{
if (true == _state)
{
printf("Database connected\n");
return false;
}
//初始化mysql
mysql_init(_mysql);
//返回false则连接失败,返回true则连接成功
if (!(mysql_real_connect(_mysql, ip, name, cypher, database_name, port, NULL, 0))) //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去
{
printf("Error connecting to database:%s\n", mysql_error(_mysql));
return false;
}
else
{
_state = true;
printf("Connected succeed\n\n");
return true;
}
return true;
}

int DataBase::GetTableField(const char* table_name)
{
if (false == _state)
{
printf("Database not connected\n");
return -1;
}
//查询内容
sprintf_s(_query, "desc %s", table_name); //desc 语句获取字段数
//设置编码格式(SET NAMES GBK也行),否则cmd下中文乱码
mysql_query(_mysql, "set names gbk");
//返回0 查询成功,返回1查询失败
if (mysql_query(_mysql, _query)) //执行SQL语句
{
printf("Query failed (%s)\n", mysql_error(_mysql));
return false;
}
//获取结果集
if (!(_res = mysql_store_result(_mysql))) //获得sql语句结束后返回的结果集
{
printf("Couldn't get result from %s\n", mysql_error(_mysql));
return false;
}
//数据行数即为字段个数
return mysql_affected_rows(_mysql);
}

bool DataBase::Query(const char* table_name)
{
if (false == _state)
{
printf("Database not connected\n");
return false;
}
//获取字段数
int field = GetTableField(table_name);
//查询内容
sprintf_s(_query, "select * from %s", table_name); //执行查询语句
//设置编码格式(SET NAMES GBK也行),否则cmd下中文乱码
mysql_query(_mysql, "set names gbk");
//返回0 查询成功,返回1查询失败
if (mysql_query(_mysql, _query)) //执行SQL语句
{
printf("Query failed (%s)\n", mysql_error(_mysql));
return false;
}
else
{
printf("query success\n");
}
//获取结果集
if (!(_res = mysql_store_result(_mysql))) //获得sql语句结束后返回的结果集
{
printf("Couldn't get result from %s\n", mysql_error(_mysql));
return false;
}
//打印数据行数
printf("number of dataline returned: %lld\n", mysql_affected_rows(_mysql));
//获取字段的信息
char* str_field[32]; //定义一个字符串数组存储字段信息
for (int i = 0; i < field; i++) //在已知字段数量的情况下获取字段名
{
str_field[i] = mysql_fetch_field(_res)->name;
}
for (int i = 0; i < field; i++) //打印字段
{
printf("%10s\t", str_field[i]);
}
printf("\n");
//打印获取的数据
while (_column = mysql_fetch_row(_res)) //在已知字段数量情况下,获取并打印下一行
{
for (int i = 0; i < field; i++)
{
printf("%10s\t", _column[i]); //column是列数组
}
printf("\n");
}
return true;
}

bool DataBase::Implement(const char* sentence)
{
if (false == _state)
{
printf("Database not connected\n");
return false;
}
//查询内容
sprintf_s(_query, "%s", sentence); //desc 语句获取字段数
//设置编码格式(SET NAMES GBK也行),否则cmd下中文乱码
mysql_query(_mysql, "set names gbk");
mysql_query(_mysql, _query);

//执行SQL语句
if (mysql_query(_mysql, _query))
{
printf("Query failed (%s)\n", mysql_error(_mysql));
return false;
}

return true;
}

6. *测试分析*

(1) 主程序main()
运行程序后,窗口自动运行主程序结果如图2所示。

img

图2主程序图

(2) 添加函数 Add()
进入窗口页面后,输入“1”,程序,如图3所示。

img

图3 添加图

(3) 显示人员函数 dm.Show()
进入系统后,输入“2”,进入查看人员信息的页面,如图4所示。
img

图4 显示图

(4) 删除人员函数 dm.Delete()
进入窗口后,输入“3”,进入删除界面,然后输入1或2,分别进入学生删除和管理人员删除页面,再输入id号,删除信息。如图5所示。
img

图5 删除人员图

(5) 修改函数 dm.Delete()
进入窗口后,输入“4”,进入修改窗口。输入所需要修改的id数,然后输入应修改的id,姓名,性别,公寓,宿舍,电话。如图6所示。

    ![img](C++(十二)-课设-宿舍管理系统/wps7.jpg)

图6 修改信息图

(6) 查找函数dm.Find()
主程序页面,输入“5”,输入想要查询的id号,输出所有学生或管理人员信息。如图7所示。

img

图7 查找信息图

(7) 公寓查询函数 dm.FindHeader()
进行选择页面,输入“6”,再输入相应的公寓号,输入所有信息。如图8所示。

img

图8 公寓查询图

(8)清空文档函数 dm.Clear()

进入选择页面,输入“7”,再输入“确定”或“不确定”,进行相应的操作。如图9所示。

img

图9清空文件图

7. *用户手册*

(1)首先进入页面,看到功能选项目录

(2)输入“1”,添加相应的学生或管理人员信息

(3)输入“2”,根据数据库原理显示所有数据

(4)输入“3”,输入相应的id号,进行删除人员操作

(5)输入“4”,输入修改人员的id号,再输入修改后的各种新信息,操作

(6)输入“5”,输入相应的id号,查找对应的相关信息

(7)输入“6”,输入“确定”或“返回”,进行清空或返回操作

(8)输入“0”,退出该宿舍管理系统。

-------------本文结束感谢您的阅读-------------