房屋租赁管理系统

  课程设计名称:房屋租赁管理系统

设计内容:设计一个房屋租赁管理系统,帮助管理房屋租赁事务。要求具有房屋项目管理和租赁信息管理的功能。其中房屋项目管理包括房屋项目增加、删除和修改等功能。租赁信息管理包括房屋租售登记表输入和房屋出租查询。
主要知识点
面向过程程序设计方法
界面制作,switch的应用
数组或链表的实现与应用
文件的读写

一.信息抽象
首先我们需要将这个房源进行抽象,这里我们有那个一个结构体来代表一个房源的信息,其中包含这个房源的所有信息,房源的编号,房源的位置,房源的大小,房源的楼层,房源的租金,然后使用typedef来简写这个结构体为House.
代码如下:
//定义房源的结构体
typedef struct House {
int number;//房源的编号
char location[30];//房源的位置
float size;//房源的大小
int high;//房源的楼层
float money;//房源的租金
}House;
有了记录房源信息的结构体,我们需要维护一个动态数组来存储所有房源的信息,其实维护一个动态数组就是维护另一个结构体,这个结构体体中个包含了这个数组的大小属性,这个数组的容量属性,然后还有一个存储这个房源信息的数组,这里同样是使用typedef来简写这个结构体.
代码如下:
//动态数组主要维护:这个这个结构体
typedef struct dynamicArry
{
House** pAddr; // 数组指针
int m_size; // 数组元素个数
int m_capacity; // 数组容量大小

}dynamicArry;

二.主函数大概描述
这里我们先看代码,然后在解释:
int main() {
dynamicArry* arr;
arr = input();
if (arr->m_size == -1) {
arr = init(20);
} while(1) {
int choose = start();
switch (choose)
{
case 0:
exit(0);
break;
case 1:
showAll(arr);
break;
case 2:
edit(arr);
break;
case 3:

		add(arr);
		break;
	case 4:
		find(arr);
		break;
	case 5:
		save(arr);
		break;
	case 6:
		delete(arr);
		break;
	}
}


return 0;

}

根据实验的要求可以从文件中输入信息刀内存中我这个设计了一个input函数来从文件中读取已经存储的信息;
然后我们设计了一个循环,可以使得程序可以循环的处理问题,在循环中,我们设计了一个start函数俩展示程序的主界面,然后根据用户不同的输入来使用不同的功能.
根据实验的要求可以查询信息,可以添加信息,可以删除信息,可以保存信息到文件中,我这里依次设计了showall函数和find函数来查,add函数来添加,delete函数来删除,exit函数俩进行修改,save函数来进行保存信息到文件中,同时我还而外设计了一个exit函数来进行退出程序.这些函数整齐的放在switch的代码块中,根据用户的输入来进行不同的功能.

三.主函数中方法的介绍

1.start函数
int start() {
//首先从文件中读取信息
int choose;
printf(“1>> 显示所有房源\n”);
printf(“2>> 修改房源信息\n”);
printf(“3>> 添加房源信息\n”);
printf(“4>> 查找房源信息\n”);
printf(“5>> 保存房源信息\n”);
printf(“6>> 删除房源信息\n”);
printf(“0>> 退出程序\n”);
printf(“请输入:”);
scanf(“%d”, &choose);
return choose;
}
函数主题就是打印不同功能对应的数字,然后用户输入数字,函数返回这个数字,根据case中的数字来调用不同功能的函数,同时也可以使用函数指针来调用,这里就不详细讲解了.
2.add函数
//实现房源的增加
dynamicArry* add(dynamicArry* array) {
House* house = (House*)malloc(sizeof(House));
int index = find(array);
if (index != -1) {
printf(“编号已存在\n”);
return array;
}
printf(“请输入房源的编号:”);
scanf(“%d”, &(house).number);
printf(“请输入房源的位置信息:”);
scanf(“%s”, &(house).location);
printf(“请输入房源的大小:”);
scanf(“%f”, &(house).size);
printf(“请输入房源的楼层:”);
scanf(“%d”, &(house).high);
printf(“请输入房源的租金:”);
scanf(“%f”, &(house).money);
int pos = array->m_size;
// 判断是否需要扩容
if (array->m_size == array->m_capacity)
{
// 1、新容量是原来的两倍
int newCapacity = array->m_capacity * 2;
// 2、开辟新空间
House
newAddr = (House
)malloc(sizeof(House
) * newCapacity);
if (newAddr == NULL)
return;
// 3、将原空间数据拷贝到新空间
memcpy(newAddr, array->pAddr, sizeof(House*) * array->m_capacity);
// 4、释放原来的空间
free(array->pAddr);
// 5、更新空间
array->pAddr = newAddr;
array->m_capacity = newCapacity;
}
// 将新数据插入
array->pAddr[pos] =house;
array->m_size += 1;
printf(“房源添加成功\n”);
return array;
}
用户输入需要添加的编号,然后调用find函数来判断房源编号是否存在,如果存在就直接返回,如果不存在用户可以输入新添加的房源的信息,在将其添加到动态数组中前需要判断此动态数组的容量情况,如果已满,则需要重新进行分配数组的大小,然后将房源信息添加到动态数组中,最后将动态数组的大小加一.

3.find
int find(dynamicArry* array) {
int number;
printf(“请输入房源编号:”);
scanf(“%d”, &number);
House** houses = array->pAddr;
for (int i = 0; i < array->m_size; i++) {
if (houses[i]->number == number) {
printf(“编号:%d 位置:%s 大小:%f 楼层:%d 租金:%f\n”, array->pAddr[i]->number, array->pAddr[i]->location,
array->pAddr[i]->size, array->pAddr[i]->high, array->pAddr[i]->money);
return i;
}
}
printf(“没有此房源\n”);
return -1;
}
这个函数就是遍历一下动态数组中的信息,根据用户输入的房源的编号来进行比对已有房源的信息,如果存在就输出此房源的所有信息,并返回这个房源在动态数组中的下标位置,如果不存在的话就是返回-1,并且打印此房源不存在.
4.edit
/根据编号实现修改
int edit(dynamicArry* array) {
int index = find(array);
if (index == -1) {
return 0;
}
//创建一个结构体
House* house = (House*)malloc(sizeof(House));
printf(“请输入房源的编号:”);
scanf(“%d”, &(*house).number);
printf(“请输入房源的位置信息:”);
scanf(“%s”, &(*house).location);
printf(“请输入房源的大小:”);
scanf(“%f”, &(house).size);
printf(“请输入房源的楼层:”);
scanf(“%d”, &(house).high);
printf(“请输入房源的租金:”);
scanf(“%f”, &(house).money);
array->pAddr[index] = house;
return -1;
}
想要编辑先需要查找;
这个函数就是首先调用find函数来进行查找需要修改的房源是否是存在的,若果不存在就直接返回了,如果存在就根据房源的下标来进行修改,用户输入修改的信息,将其替换掉原有的房源.
5.showall
//显示所有房源
void showAll(dynamicArry
array) {
if (array->m_size == 0) {
printf(“房源为空\n”);
return;
}
for (int i = 0; i < array->m_size; i++) {
printf(“编号:%d 位置:%s 大小:%f 楼层:%d 租金:%f \n”, array->pAddr[i]->number, array->pAddr[i]->location,
array->pAddr[i]->size, array->pAddr[i]->high, array->pAddr[i]->money);
}
}
这个就是遍历动态数组中的所用信息,如果信息为空就打印房源为空,反之就使用for循环来遍历这个动态数组并打印出来.
6.delete
//实现删除功能
int delete(dynamicArry
array){
int index = find(array);//返回的是要删除房源的编号
if (index == -1) {
return 0;
}
//实现删除操作
for (int i = index; i m_size-index-1; i++) {
array->pAddr[i] = array->pAddr[i + 1];
}
//然后将数组的元素更新为减一
array->m_size -= 1;
printf(“删除房源信息成功\n”);
} //实现删除功能
int delete(dynamicArry
array){
int index = find(array);//返回的是要删除房源的编号
if (index == -1) {
return 0;
}
//实现删除操作
for (int i = index; i m_size-index-1; i++) {
array->pAddr[i] = array->pAddr[i + 1];
}
//然后将数组的元素更新为减一
array->m_size -= 1;
printf(“删除房源信息成功\n”);
}
和修改类似,先删除先查找;
首先调用find函数来看房源信息是否存在,不存在直接放回,如果存在的话就实现删除操作,由于find函数返回的是房源的下标,我们就需要将这个下标指向的地址依次换为自己的下一个,如图:

最后将数组的大小减一.
7.save
void save(dynamicArry* array) {
FILE* file = fopen(“D:\house.txt”, “wb”);

if (file == NULL) {
	fprintf(stderr, "Error opening file\n");
	return 1; // 退出程序,表示文件打开失败
}

if (file == NULL) {
	perror("文件打开错误");
	exit(1);
}

// 写入数字
fwrite(&array->m_size, sizeof(int), 1, file);
// 写入数组大小
fwrite(&array->m_capacity, sizeof(int), 1, file);
// 写入数组数据
for (int i = 0; i < array->m_size; ++i) {
	fwrite(array->pAddr[i], sizeof(House), 1, file);
}

fclose(file);

printf("Person data has been written to file\n");

return 0;

}
这个函数就是打开文件进行写入,首先写入的是数组的大小,然后是数组的容量,最后写入数组中的内容,也就是所有的房源信息.
8.input
dynamicArry* input() {
// 打开文件以便读取数据
FILE* file = fopen(“D:\house.txt”, “rb”);

if (file == NULL) {
	perror("文件打开错误");
	exit(1);
}

// 读取大小
int size;
fread(&size, sizeof(int), 1, file);

// 读取数组容量
int capacity;
fread(&capacity, sizeof(int), 1, file);

// 分配内存并读取数组数据
House** dataArray = (House**)malloc(capacity * sizeof(House*));
for (int i = 0; i < size; ++i) {
	dataArray[i] = (House*)malloc(sizeof(House));
	fread(dataArray[i], sizeof(House), 1, file);
}

fclose(file);

dynamicArry* array = (dynamicArry*)malloc(sizeof(dynamicArry));
array->pAddr = dataArray;
array->m_capacity = capacity;
array->m_size = size;

return array;

}
与save函数相反,我们是从文件中读取信息,首先读出动态数组的大小,然后读出动态数组的容量,根据容量来开辟需要的内存空间.然后在将信息读入到动态数组中.
9.库函数exit
使用它来结束程序.
10.init
dynamicArry* init(int capacity) {
dynamicArry * array = (dynamicArry*)malloc(sizeof(dynamicArry));
if (array == NULL)
{
printf(“开辟空间失败\n”);
return NULL;
}
array->pAddr = (House**)malloc(sizeof(House*) * capacity);
array->m_size = 0;
array->m_capacity = capacity;
return array;
}
这个函数是用来初始化动态数组的,根据传入的容量来开辟相应的空间.
11.最后我思考一下init函数和input函数之间的关系:
如果是第一个使用程序,此时还没有动态数组,我们此时需要调用init函数,但是如果我们已经存储了一定的信息到文件中,此时我们需要调用input函数俩进行写入信息到一个动态数组中,此时这两个数组不是同一个数组,所以我们需要判断什么时候调用init函数什么时候调用input函数,这里我在input函数中设置了size和capacity的初始值为-1,如果没有读取到信息的话,这两个值是不变的, 此时判断一下是否为-1,如果是,就使用init来进行初始化.
代码: dynamicArry* arr;
arr = input();
if (arr->m_size == -1) {
arr = init(20);
}

四.效果演示,下面是一个视屏,可以双击打开.

五.源码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int start() {
int choose;
printf(“1>> 显示所有房源\n”);
printf(“2>> 修改房源信息\n”);
printf(“3>> 添加房源信息\n”);
printf(“4>> 查找房源信息\n”);
printf(“5>> 保存房源信息\n”);
printf(“6>> 删除房源信息\n”);
printf(“0>> 退出程序\n”);
printf(“请输入:”);
scanf(“%d”, &choose);
return choose;

}
//定义房源的结构体
typedef struct House {
int number;//房源的编号
char location[30];//房源的位置
float size;//房源的大小
int high;//房源的楼层
float money;//房源的租金
}House;

//动态数组主要维护:这个这个结构体
typedef struct dynamicArry
{
House** pAddr; // 数组指针
int m_size; // 数组元素个数
int m_capacity; // 数组容量大小

}dynamicArry;

/*1、开辟这个结构体大小空间
2、通过传入的容量大小,对pAddr进行空间开辟
3、对容量进行初始化,元素个数默认是0
*/

dynamicArry* init(int capacity) {
dynamicArry * array = (dynamicArry*)malloc(sizeof(dynamicArry));
if (array == NULL)
{
printf(“开辟空间失败\n”);
return NULL;
}
array->pAddr = (House**)malloc(sizeof(House*) * capacity);
array->m_size = 0;
array->m_capacity = capacity;
return array;
}

//实现房源的增加
dynamicArry* add(dynamicArry* array) {
House* house = (House*)malloc(sizeof(House));
int index = find(array);
if (index != -1) {
printf(“编号已存在\n”);
return array;
}
printf(“请输入房源的编号:”);
scanf(“%d”, &(house).number);
printf(“请输入房源的位置信息:”);
scanf(“%s”, &(house).location);
printf(“请输入房源的大小:”);
scanf(“%f”, &(house).size);
printf(“请输入房源的楼层:”);
scanf(“%d”, &(house).high);
printf(“请输入房源的租金:”);
scanf(“%f”, &(house).money);
int pos = array->m_size;
// 判断是否需要扩容
if (array->m_size == array->m_capacity)
{
// 1、新容量是原来的两倍
int newCapacity = array->m_capacity * 2;
// 2、开辟新空间
House
newAddr = (House
)malloc(sizeof(House
) * newCapacity);
if (newAddr == NULL)
return;
// 3、将原空间数据拷贝到新空间
memcpy(newAddr, array->pAddr, sizeof(House*) * array->m_capacity);
// 4、释放原来的空间
free(array->pAddr);
// 5、更新空间
array->pAddr = newAddr;
array->m_capacity = newCapacity;
}
// 将新数据插入
array->pAddr[pos] =house;
array->m_size += 1;
printf(“房源添加成功\n”);
return array;
}

//根据编号实现房源查找
int find(dynamicArry* array) {
int number;
printf(“请输入房源编号:”);
scanf(“%d”, &number);
House** houses = array->pAddr;
for (int i = 0; i < array->m_size; i++) {
if (houses[i]->number == number) {
printf(“编号:%d 位置:%s 大小:%f 楼层:%d 租金:%f\n”, array->pAddr[i]->number, array->pAddr[i]->location,
array->pAddr[i]->size, array->pAddr[i]->high, array->pAddr[i]->money);
return i;
}
}
printf(“没有此房源\n”);
return -1;
}

//根据编号实现修改
int edit(dynamicArry* array) {
int index = find(array);
if (index == -1) {
return 0;
}
//创建一个结构体
House* house = (House*)malloc(sizeof(House));
printf(“请输入房源的编号:”);
scanf(“%d”, &(*house).number);
printf(“请输入房源的位置信息:”);
scanf(“%s”, &(*house).location);
printf(“请输入房源的大小:”);
scanf(“%f”, &(*house).size);
printf(“请输入房源的楼层:”);
scanf(“%d”, &(*house).high);
printf(“请输入房源的租金:”);
scanf(“%f”, &(*house).money);
array->pAddr[index] = house;
return -1;
}

//显示所有房源
void showAll(dynamicArry* array) {
if (array->m_size == 0) {
printf(“房源为空\n”);
return;
}
for (int i = 0; i < array->m_size; i++) {
printf(“编号:%d 位置:%s 大小:%f 楼层:%d 租金:%f \n”, array->pAddr[i]->number, array->pAddr[i]->location,
array->pAddr[i]->size, array->pAddr[i]->high, array->pAddr[i]->money);
}
}

void save(dynamicArry* array) {
FILE* file = fopen(“D:\house.txt”, “wb”);

if (file == NULL) {
	fprintf(stderr, "Error opening file\n");
	return 1; // 退出程序,表示文件打开失败
}

if (file == NULL) {
	perror("文件打开错误");
	exit(1);
}

// 写入数字
fwrite(&array->m_size, sizeof(int), 1, file);
// 写入数组大小
fwrite(&array->m_capacity, sizeof(int), 1, file);
// 写入数组数据
for (int i = 0; i < array->m_size; ++i) {
	fwrite(array->pAddr[i], sizeof(House), 1, file);
}

fclose(file);

printf("Person data has been written to file\n");

return 0;

}

dynamicArry* input() {
// 打开文件以便读取数据
FILE* file = fopen(“D:\house.txt”, “rb”);

if (file == NULL) {
	perror("文件打开错误");
	exit(1);
}

// 读取大小
int size=-1;
fread(&size, sizeof(int), 1, file);

// 读取数组容量
int capacity=-1;
fread(&capacity, sizeof(int), 1, file);

if (size == -1) {
	fclose(file);
	return NULL;
}
// 分配内存并读取数组数据
House** dataArray = (House**)malloc(capacity * sizeof(House*));
for (int i = 0; i < size; ++i) {
	dataArray[i] = (House*)malloc(sizeof(House));
	fread(dataArray[i], sizeof(House), 1, file);
}

fclose(file);

dynamicArry* array = (dynamicArry*)malloc(sizeof(dynamicArry));
array->pAddr = dataArray;
array->m_capacity = capacity;
array->m_size = size;

return array;

}

//实现删除功能
int delete(dynamicArry* array){
int index = find(array);//返回的是要删除房源的编号
if (index == -1) {
return 0;
}
//实现删除操作
for (int i = index; i m_size-index-1; i++) {
array->pAddr[i] = array->pAddr[i + 1];
}
//然后将数组的元素更新为减一
array->m_size -= 1;
printf(“删除房源信息成功\n”);
}
int main() {
dynamicArry* arr;
arr = input();
if (arr==NULL) {
arr = init(20);
}

while(1) {
int choose = start();
switch (choose)
	{
	case 0:
		 exit(0);
		break;
	case 1:
		showAll(arr);
		break;
	case 2:
		edit(arr);
		break;
	case 3:
	
		add(arr);
		break;
	case 4:
		find(arr);
		break;
	case 5:
		save(arr);
		break;
	case 6:
		delete(arr);
		break;
	}
}


return 0;

}

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java房屋租赁出租管理系统是一款基于Java语言开发的房屋租赁管理软件,旨在提供便捷的房屋出租和租赁管理功能。该系统包括租客信息管理、房屋信息管理、租金管理、合同管理等模块。 首先,租客信息管理模块主要用于记录和管理租客的个人信息,包括姓名、联系方式、租房期限等。管理员可以通过该模块实时查看租客的租房状态、欠款情况等,并进行相应的操作,如新增租客、修改租客信息、删除租客等。 其次,房屋信息管理模块用于记录和管理房屋的基本信息,包括房屋位置、面积、租金等。管理员可以通过该模块查看各个房屋的出租情况,对空置房屋进行上架操作,对即将到期的合同提前续租或下架房屋等。 租金管理模块是对租客租金支付情况的记录和管理,管理员可以通过该模块查看租客的租金缴纳情况,提醒逾期未缴租金的租客等。 合同管理模块用于记录和管理租赁合同的签订和终止情况。管理员可以通过该模块创建新的租赁合同,记录合同的起止日期、租金支付方式等信息,并可以在合同到期前提醒租客续租或办理退房手续。 此外,该系统还提供了一些其他功能,如用户权限管理模块,用于管理各个用户的系统访问权限;数据统计模块,可对租赁收入、合同签订情况等数据进行统计和分析,为房屋租赁管理提供数据支持。 附带文档是为了更好地使用和了解系统。文档中包含了系统的详细功能介绍、使用方法、操作流程等,用户可以根据文档进行操作,以提高系统的使用效率和准确性。文档还可能包含一些技术架构和实现细节的说明,方便用户进行二次开发和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值