这个实战项目是我的一个小学期任务,主要是让我们感受一下未来行业实际开发解决问题中编程的应用和实现,也是一个培养编程思维和用编程解决问题思维的一个很好的训练方式。

        那么话不多说,直接上题目:

        某写字楼物业管理公司管理着一栋3层的办公楼,每层分A、B两座,每座有5套房间。编写程序,输入楼层数、每层座数以及每座房间数,自动生成所有的房间及其编号。用户可以增加、删除、修改房间及其编号,设置每一个房间的住户及其电话号码。可以根据住户姓名查找其房间及编号,可以列出所有或指定楼层、座次、房间的住户信息。

       一、代码流程图:流程图可以在自己无法解决问题的时候给自己一个很好的帮助,不仅仅是框架上的,更是思维上的

物业管理信息系统架构 物业管理系统顺序图_开发语言

 二、解读题目要求

//某写字楼物业管理公司管理着一栋3层的办公楼,每层分A、B两座,每座有5套房间。
//编写程序,输入楼层数、每层座数以及每座房间数,自动生成所有的房间及其编号。
//用户可以增加、删除、修改房间及其编号,设置每一个房间的住户及其电话号码。
//可以根据住户姓名查找其房间及编号,可以列出所有或指定楼层、座次、房间的住户信息。

因此我构造了九个函数,用于实现以上的要求和功能。

三、根据流程图去编写代码

part 1、包含头文件

#include<iostream>
#include<stdlib.h>
using namespace std;

part 2、代码之结构体和结构体数组

//创建房间类
struct room
{	//用户名、电话、编号

public:
	string name, phoneNum;
	int ID;
	int Num;

};
struct room roomArray[3][2][10];

part 3、创建不同功能的函数(其中我把函数2放在4、5后面的原因是有关函数嵌套的问题处理)

//创建不同功能的函数
//1、输入楼层数、座数、房间数会显示出所有的房间编号
void ID_Show() {
	printf("请输入总楼层数,总座数和总房间数\n");
	int floor_num, zuo_num, room_num;
	cin >> floor_num >> zuo_num >> room_num;
	for ( int i = 0; i < 3; i++)
	{
		cout << endl;
		for (int j = 0; j < 2; j++) {
			cout << endl;
			for (int k = 0; k < room_num; k++)
			{
				printf("第%d层第%d座第%d号房间的编号为%d\n", i + 1, j + 1, k + 1, roomArray[i][j][k].ID);
			};
		};
	};
};
//4、在某层某座修改某房间编号
void Change_ID() {
	printf("请分别输入层数(1-3)、座数(A、B分别用1、2替代)、和房间数\n");
	int floor_num, zuo_num, room_num;
	cin >> floor_num >> zuo_num >> room_num;
	cout << "plaese input the ID\n" << endl;
	int in_ID;
	cin >> in_ID;
	roomArray[floor_num - 1][zuo_num - 1][room_num - 1].ID = in_ID;
	printf("修改完成,现在第%d层第%d第%d间的ID为:%d\n", floor_num, zuo_num, room_num, in_ID);
};
//5、设置某层某座某房间的用户名和电话号码
void Set_napho() {
	printf("请分别输入层数(1-3)、座数(A、B分别用1、2替代)、和房间数\n");
	int floor_num, zuo_num, room_num;
	cin >> floor_num >> zuo_num >> room_num;
	cout << "请分别输入此房间的用户名和电话号码(俩次输入之间用回车键隔开)\n" << endl;
	string in_name;
	string in_phoneNum;
	cin >> in_name >> in_phoneNum;
	roomArray[floor_num - 1][zuo_num - 1][room_num - 1].name = in_name;
	roomArray[floor_num - 1][zuo_num - 1][room_num - 1].phoneNum = in_phoneNum;
	printf("修改完成,现在第%d层第%d第%d间的", floor_num, zuo_num, room_num);
	cout << "name is" << in_name << ",phonenumber is" << in_phoneNum << endl;
};
//2、在某层某座增加多个房间(由于要调用Change_ID函数和Set_napho函数,所以将其放在Add_Room函数前面)
void Add_Room() {
	printf("请分别输入层数(1-3)、座数(A、B分别用1、2替代)\n");
	int floor_num, zuo_num;
	cin >> floor_num >> zuo_num;
	printf("请问您要增加几个房间?\n");
	int add_num;
	cin >> add_num;
	for (int j = 0; j < add_num; j++) {
		cout << "以下将设置新房间的编号" << endl;
		Change_ID();
		cout << "以下将设置新房间的用户姓名和电话" << endl ;
		Set_napho();
		printf("现在第%d层第%d座还剩下%d间房间\n", floor_num, zuo_num, 5 + j);
		printf("新增第%d间的房间编号为%d,", j + 1, roomArray[floor_num - 1][zuo_num - 1][5 + j].ID);
		cout << "姓名为" << roomArray[floor_num - 1][zuo_num - 1][5 + j].name << ",电话为" << roomArray[floor_num - 1][zuo_num - 1][5 + j].phoneNum << endl;
	}
	};
	//3、在某层某座删除多个房间
	void Delete_Room() {
		printf("请分别输入层数(1-3)、座数(A、B分别用1、2替代)\n");
		int floor_num, zuo_num;
		cin >> floor_num >> zuo_num;
		printf("请问您要删除几个房间?\n");
		int del_num;
		cin >> del_num;
		for (int i = 0; i < del_num; i++) {
			roomArray[floor_num - 1][zuo_num - 1][4 - i].name = "用户已删除";
			roomArray[floor_num - 1][zuo_num - 1][4 - i].ID = -1;
			roomArray[floor_num - 1][zuo_num - 1][4 - i].phoneNum = -1;
			printf("现在第%d层第%d座还剩下%d间房间\n", floor_num, zuo_num, 5 - i);
		}

	};
	
	
	//6、通过姓名查找房间编号
	void Find_ID() {
		printf("请输入所需要查找的姓名:\n");
		string in_name;
		cin >> in_name;
		int i, j, k;
		for (i = 0; i < 3; i++)
		{
			for (j = 0; j < 2; j++) {
				for (k = 0; k < 5; k++)
				{
					if (roomArray[i][j][k].name == in_name) {
						cout << "房间编号为:" << roomArray[i][j][k].ID << endl;
					}
				};
			};
		};

	};
	//7、列出所有住户信息
	void Show_All() {
		for (int i = 0; i < 3; i++)
		{
			cout<<endl;
			for (int j = 0; j < 2; j++) {
				//可以加个endl;
				cout<<endl;
				for (int k = 0; k < 5; k++)
				{
					printf("第%d层第%d座第%d号房间的", i + 1, j + 1, k + 1);
					cout << "name is" << roomArray[i][j][k].name << ",phonenumber is" << roomArray[i][j][k].name << endl;
				};
			};
		};
		cout << "所有用户信息已罗列完成" << endl;
	};


	//8、列出指定层、座、房间的用户信息
	void Show_This() {
		printf("请分别输入层数(1-3)、座数(A、B分别用1、2替代)、和房间数\n");
		int floor_num, zuo_num, room_num;
		cin >> floor_num >> zuo_num >> room_num;
		//如果未定义,有俩种方法:一是直接变成全局变量,另外一种是传入参数
		if (room_num > roomArray[floor_num - 1][zuo_num - 1][room_num - 1].Num) {
			cout << "查无此房" << endl;
		}
		else {
			cout << "name is:" << roomArray[floor_num - 1][zuo_num - 1][room_num - 1].name << endl;
			cout << "ID is:" << roomArray[floor_num - 1][zuo_num - 1][room_num - 1].ID << endl;
		}
	};


	//9、跳出整个系统
	void Exit_All() {
		printf("你确定要退出整个系统?(确定回复1,否定回复0)\n");
		int exit_0;
		cin >> exit_0;
		if (exit_0)
		{
			exit(0);
		}
		//怎么跳出一个函数
		//else 

	};

part 4、主函数(其实如果要尽善尽美满足封装的思想,可以把菜单栏也封装成一个函数)

int main()
	{


		//创建一个三维含所有房间信息(结构体数组)
			//struct room roomArray[3][2][10];
				// (因为是数组都是数字表示,但是输入的时候会输入AB所以之后要进行输入数据AB后要转换为1、2等)
				//还有就是之后要对房间数量进行修改,所以最后的第三维数字需要扩大化,比如就输个10吧
			//初始化结构体数组
		int i, j, k;
		for (i = 0; i < 3; i++)
		{
			for (j = 0; j < 2; j++) {
				for (k = 0; k < 5; k++)
				{
					roomArray[i][j][k].ID = (i + 1) * 100 + (j + 1) * 10 + k + 1;
					roomArray[i][j][k].name = "张三";
					roomArray[i][j][k].Num = k + 1;
				};
			};
		};
		//使用while(1)无限循环包裹显示主菜单和switch转换
		while (1) {
			//显示主菜单(分别用1、2.。。。9列出所需要使用的功能)
			printf("\n\n欢迎使用物业管理系统,您要实现以下哪个功能?(输入数字即可)\n");
			printf("1、输入楼层数、座数、房间数会显示出所有的房间编号\n");
			printf("2、在某层某座增加一个房间\n");
			printf("3、在某层某座删除一个房间\n");
			printf("4、在某层某座修改某房间编号\n");
			printf("5、设置某层某座某房间的用户名和电话号码\n");
			printf("6、通过姓名查找房间编号\n");
			printf("7、列出所有住户信息(初始化名字为张三)\n");
			printf("8、列出指定层、座、房间的用户信息\n");
			printf("9、跳出整个系统\n\n");
			int in_num;
			cin >> in_num;
			//使用swtich去接收主菜单里传过来的数据,并导入不同的函数模块里面
			switch (in_num)
			{//函数运行完就会执行下一个语句,不需要在函数里面使用退出函数语句
			case 1:ID_Show(); break;
			case 2:Add_Room(); break;
			case 3:Delete_Room(); break;
			case 4:Change_ID(); break;
			case 5:Set_napho(); break;
			case 6:Find_ID(); break;
			case 7:Show_All(); break;
			case 8:Show_This(); break;
			case 9:Exit_All(); break;

			default:
				break;
			}
		}

	}

part 5、归纳总结

        这段代码呢,没有用到多么高深多么复杂的编程思路,就是一些简简单单的函数、一些简简单单的思路,都能看懂,以后掌握了数据结构/算法等一些关于队列、链表的知识的话,写起来就会简单很多,效率也会大大提升。

        我在写这个程序的时候也遇到了许多奇奇怪怪的小问题,可以做一做总结,记录一下自己的成长。

     问题与讨论:

  1. 对题目要求的抽丝剥茧,让题目概述变成我将要实现的一项项功能。
  2. 对整体代码结构框架的选择,对于此类实际问题型项目,对象化和封装思想起到了很大的作用
  3. 对于全局变量的设定,刚开始的时候,因为创建的结构体数组放置于主函数里面,导致构造的函数无法使用主函数里面的数组,因此,考虑之后,我将结构体数组放置在头文件下面便变成了全局变量,可以正常使用
  4. 函数嵌套调用出错,刚开始的时候,位于前面的构造函数调用后面构造的函数,导致,调用失败,因此我将需要被调用的函数放置在调用它的函数前面,功能正常运行
  5. 字符串(名字和电话)输出乱码,因为printf()的自身原因,输出时出现乱码,后来改用cout输出字符串类型数据便不再输出乱码