数据结构课程设计:源代码(C)客房信息管理系统

news2024/9/21 14:39:05

main.c

#include <unistd.h>
#include "SeqList.h"
#include "User.h"

int main()
{
    SL user;
    SLInit(&user);
	char ans = 0;
	printf("是否需要导入昨日续住客人的数据:y/n\n");
	scanf(" %c", &ans);
	if (ans == 'y')
	{
		LoadUser(&user);
	}else if(ans!='n')
    {
        printf("请重新输入y/n\n");
        scanf(" %c",&ans);
    }
    menu();
    printf("请输入选项:");
    int choice = 0;
    while (scanf("%d", &choice))
    {
        switch (choice)
        {
            case 1:
                userInfoGet(&user);
                break;
            case 2:
                find(&user);
                break;
            case 3:
                remedy(&user);
                break;
            case 4:
                deleteUser(&user);
                break;
            case 5:
                sortUser(&user);
                break;
            case 6:
                printUser(&user);
                if(user.size==0)
                {
                    printf("当前没有客人入住");
                } else{
                    printf("当前入住有%d位客人\n",user.size);
                }

                break;
            case 7:
                printf("当前入住有%d位客人\n剩余%d间房间\n",user.size,user.Max);
                break;
            case 8:
                destroyUser(&user);
                printf("谢谢使用");
                return 1;
            default:
                printf("请按照菜单重新输入:");
                break;
        }
        usleep(1000);
        menu();
        printf("请输入选项:");
    }
}

Seqlist.c


#include "SeqList.h"

//顺序表的初始化
void SLInit(SL* ps)
{
    assert(ps);//确保没有传入空指针
    ps->SeqList = NULL;
    ps->size = 0;
    ps->Max = 50;//初始化房间最大数量
    ps->capacity = 0;
}

//顺序表的销毁
void SLDestroy(SL* ps)
{
    assert(ps);

    if (ps->SeqList)
    {
        free(ps->SeqList);
    }

    ps->SeqList = NULL;
    ps->size = 0;
    ps->capacity = 0;
}

//顺序表的扩容
void SLCheckCapacity(SL* ps)
{
    assert(ps);

    SLDataType* temp = NULL;
    if (ps->size == ps->capacity)
    {
        int newCapacity = ps->capacity;
        temp = (SLDataType*)realloc(ps->SeqList, (newCapacity = (ps->capacity == 0) ? 4 : (ps->capacity * 2)) * sizeof(SLDataType));//扩容
        assert(temp);
        ps->SeqList = temp;
        ps->capacity = newCapacity;
        temp = NULL;
    }
}

//顺序表的尾部插入
//当顺序表有足够的空间插入时(包括有内容和顺序表为空)
void SLPushBack(SL* ps, SLDataType x)
{
    assert(ps);

    //顺序表的扩容
    SLCheckCapacity(ps);//确保SeqList指针不为空之后判断容量是否足够
    //当顺序表有足够的空间插入时(包括有内容和顺序表为空)
    ps->SeqList[ps->size] = x;
    ps->size++;
    ps->Max--;

}
//顺序表的指定位置删除
void SLErase(SL* ps, int pos)
{
    assert(ps);
    assert(0 <= pos && pos <= ps->size);//确保pos为有效位置

    for (int i = pos + 1; i < ps->size; i++)
    {
        ps->SeqList[i - 1] = ps->SeqList[i];
    }

    ps->size--;
    ps->Max++;
}

Seqlsit.h


#include "SeqList.h"

//顺序表的初始化
void SLInit(SL* ps)
{
    assert(ps);//确保没有传入空指针
    ps->SeqList = NULL;
    ps->size = 0;
    ps->Max = 50;//初始化房间最大数量
    ps->capacity = 0;
}

//顺序表的销毁
void SLDestroy(SL* ps)
{
    assert(ps);

    if (ps->SeqList)
    {
        free(ps->SeqList);
    }

    ps->SeqList = NULL;
    ps->size = 0;
    ps->capacity = 0;
}

//顺序表的扩容
void SLCheckCapacity(SL* ps)
{
    assert(ps);

    SLDataType* temp = NULL;
    if (ps->size == ps->capacity)
    {
        int newCapacity = ps->capacity;
        temp = (SLDataType*)realloc(ps->SeqList, (newCapacity = (ps->capacity == 0) ? 4 : (ps->capacity * 2)) * sizeof(SLDataType));//扩容
        assert(temp);
        ps->SeqList = temp;
        ps->capacity = newCapacity;
        temp = NULL;
    }
}

//顺序表的尾部插入
//当顺序表有足够的空间插入时(包括有内容和顺序表为空)
void SLPushBack(SL* ps, SLDataType x)
{
    assert(ps);

    //顺序表的扩容
    SLCheckCapacity(ps);//确保SeqList指针不为空之后判断容量是否足够
    //当顺序表有足够的空间插入时(包括有内容和顺序表为空)
    ps->SeqList[ps->size] = x;
    ps->size++;
    ps->Max--;

}
//顺序表的指定位置删除
void SLErase(SL* ps, int pos)
{
    assert(ps);
    assert(0 <= pos && pos <= ps->size);//确保pos为有效位置

    for (int i = pos + 1; i < ps->size; i++)
    {
        ps->SeqList[i - 1] = ps->SeqList[i];
    }

    ps->size--;
    ps->Max++;
}

user.c

#include <unistd.h>
#include "SeqList.h"
#include "User.h"

// 系统主菜单
void menu()
{

    usleep(500000);
	printf("*****************************\n");
	printf("******客房管理系统*******\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("*****************************\n");
}
//导入历史信息
void LoadUser(SL* user)
{
    FILE* pf = fopen("/Users/meiyouyu/Desktop/2/user.txt", "rb");
    if (pf == NULL)
    {
        perror("fopen error!\n");
        return;
    }
    User tmp;
    while (fread(&tmp, sizeof(User), 1, pf))
    {
        SLPushBack(user, tmp);
    }
    fclose(pf);
    printf("****成功导入历史入住数据****\n");
}
// 打印所有客人信息
void printUser(SL* user)
{
    for (int i = 0; i < user->size; i++)
    {
        printf("第%d名客人:", i + 1);
        printf("\t身份证:%ld", user->SeqList[i].id);
        printf("\t姓名:%s", user->SeqList[i].name);
        printf("\t性别:%s", user->SeqList[i].gender);
        printf("\t入住房间档位:%d", user->SeqList[i].level);
        printf("\t入住房间号:%d\n", user->SeqList[i].location);
    }

}
//按照房间号排序
int cmp_loc(const void* p1, const void* p2)
{
    return ((User *)p1)->location - ((User *)p2)->location;
}
// 打印排序后的内容
void printSortedUser(User* tmp, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("第%d名客人:", i + 1);
        printf("\t客人身份证:%ld", tmp[i].id);
        printf("\t姓名:%s", tmp[i].name);
        printf("\t性别:%s", tmp[i].gender);
        printf("\t入住房间价格:%d", tmp[i].level);
        printf("\t房间号:%d\n", tmp[i].location);
    }
}

//身份证去重
int repeat_id(User tmp,SL user)
{
    int i;
    for (i=0;i<user.size;i++)
    {
        if(tmp.id==user.SeqList[i].id)
        {
            return 0;
        }

    }
    return 1;
}

// 获取输入
void userInfoGet(SL* user)
{
	int num = 0;
    char a=0;
	printf("请输入入住用户个数:");
	scanf("%d", &num);
	for (int i = 0; i < num; i++)
	{
        User tmp;
		printf("请输入第%d个客人信息\n", i + 1);
		printf("请输入客人身份证:");
		scanf("%ld", &(tmp.id));
        while (!repeat_id(tmp,*user))
        {
            printf("身份证重复,请仔细检查重新输入\n");
            scanf("%ld", &(tmp.id));
        }
		printf("请输入客人姓名:");
		scanf("%s", tmp.name);
		printf("请输入客人性别:");
		scanf("%s", tmp.gender);
		printf("要查看已被入住的房间号吗?y/n\n");
        scanf(" %c",&a);
        if(a=='y')
        {
            printf("已经入住的有:\n");
            qsort(user->SeqList, user->size, sizeof(User), cmp_loc);
            printSortedUser(user->SeqList, user->size);
        } else if(a!='n')
        {
            printf("请重新输入y/n\n");
            scanf(" %c",&a);
        }
        printf("请输入客人想要入住的价格:1.199大床房,2.299双人床,3.999豪华大床房 : ");
		scanf("%d", &tmp.level);
        while (tmp.level!=999&&tmp.level!=299&&tmp.level!=199)
        {
            printf("\n输入价格格式错误,请重新输入:1.199大床房,2.299双人床,3.999豪华大床房 : ");
            scanf("%d", &tmp.level);
        }
        printf("请输入客人入住对应等级的房间号: ");
		scanf("%d", &tmp.location);
		SLPushBack(user, tmp);
        printf("入住成功\n");
	}
}

// 查找方式菜单
void menuForFind()
{
	printf("**************\n");
	printf("*1. 客人身份证\n");
	printf("*2. 客人姓名\n");
	printf("*3. 房间号\n");
	printf("*4. 退出查找\n");
	printf("**************\n");
}

// 按照身份证查找,返回在表中位置
int findBy_id(SL* user, long target)
{
	for (int i = 0; i < user->size; i++)
	{
		if (user->SeqList[i].id == target)
		{
			return i;// 返回对应位置下标
		}
	}
	return -1;
}
//按照房间号
int findBy_loc(SL* user, long loc)
{
	for (int i = 0; i < user->size; i++)
	{
		if (user->SeqList[i].location == loc)
		{
			return i;// 返回对应位置下标
		}
	}
	return -1;
}

// 按照名字查找
int findBy_name(SL* user, char* target)
{
	for (int i = 0; i < user->size; i++)
	{
		if (strcmp(user->SeqList[i].name, target) == 0)
		{
			return i;// 返回对应位置下标
		}
	}
	return -1;
}

// 选择删除——返回下标
int findUser(SL* user)
{
	int choice = 0;
	int pos ;
	menuForFind();
	printf("请选择查找方式:");
	while (scanf("%d", &choice))
	{
		switch (choice)
		{
		case 1:
		{
			long target = 0;
			printf("请输入需要查找的身份证id:");
			scanf("%ld", &target);
			pos = findBy_id(user, target);
			return pos;
		}
		case 2:
		{
			char name[50] = { 0 };
			printf("请输入需要查找的客人姓名:");
			scanf("%s", name);
			pos = findBy_name(user, name);
			return pos;
		}
		case 3:
        {
            long loc = 0;
            printf("请输入需要查找的身份证id:");
            scanf("%ld", &loc);
            pos = findBy_loc(user, loc);
            return pos;
        }
        case 4:
			return -1;
		default:
			menuForFind();
			printf("请重新按照菜单输入:\n");
			break;
		}
		menuForFind();
		printf("请选择查找方式:");
	}
	return -2;
}

// 查找身份证
void findnumber(SL* a, long id)
{
	int i = 0;
	while (i != a->size) 
	{
		if (id == a->SeqList[i].id) 
		{
            printf("\n身份证:%ld 姓名:%s 性别:%s  房间号:%d 房间价格:%d\n",
                a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);
            return;
		}
		i++;
	}
    printf("没有检索到对应信息的客人\n");


}
//查找房间号
void findlocation(SL* a, int location)
{
	int i = 0;
	while (i != a->size)
	{
		if (location == a->SeqList[i].location)
		{
            printf("身份证:%ld 姓名:%s 性别:%s  房间号:%d 房间价格:%d\n",
                   a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);
            return;
		}
		i++;
	}
    printf("没有检索到对应信息的客人\n");


}
// 查找姓名
void findname(SL* a, char* name)
        {
            int i = 0;
            while (i != a->size)
            {
                int j = 0;
                while (a->SeqList[i].name[j] == name[j] &&  name[j] != NULL)
                {
                    j++;
                }
                if (j == strlen(name))
                {
                    printf("用户信息\n身份证:%ld 姓名:%s 性别:%s  入住房间号:%d 房间价格:%d\n",
                        a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);
                    return;
                }
                i++;
            }
            printf("没有检索到对应信息的客人\n");
        }
// 查找
void find(SL* a)
{
	printf("请输入需要怎么查找 1.通过身份证查找 2.通过姓名查找 3.通过房间号查找:");
	int num = 0;
	scanf("%d", &num);
	if (num == 1) 
	{
		printf("请输入需要查找的身份证:");
		long id = 0;
		scanf("%ld", &id);
		findnumber(a, id);
	}
	else if(num==2)
	{
		printf("请输入需要查找的姓名:");
		char name[50];
		scanf(" %s", name);
		findname(a, name);
	} else if(num==3){
        printf("请输入需要查找的房间号:");
        int location;
        scanf(" %d", &location);
        findlocation(a,location);
    } else{
        printf("输入有误,请仔细检查选项\n");
        find(a);
    }
}

// 修改员工
void remedy(SL* a) 
{

    printUser(a);
    printf("请输入需要修改信息的人员身份证号:");
	long id = 0;
	scanf("%ld", &id);
	int i = 0;
	while (i != a->size) {
		if (id == a->SeqList[i].id) 
		{
			break;
		}
		i++;
	}
    if(i>=a->size)
    {
        printf("没有找到对应客人信息\n");
        return;
    }
	printf("输入需要修改的信息编号: 1.身份证 2.姓名 3.性别  4.房间号以及价格:");
	int num = 0;
	scanf("%d", &num);
	long id1 = 0;
	char name[50];
	char gender[10];
	int location;
    int level;
	switch (num) 
	{
	case 1:
		printf("请输入修改后身份证:");
		scanf("%ld", &id1);
		a->SeqList[i].id = id1; break;
	case 2:
		printf("请输入修改后姓名:");
		scanf(" %s", name);
		strcpy(a->SeqList[i].name, name); break;
	case 3:printf("请输入修改后性别:");
		scanf(" %s", gender);
		strcpy(a->SeqList[i].gender, gender); break;
	case 4:printf("请输入修改后的房间号和价格:");
		scanf(" %d", &location);
		scanf(" %d", &level);
            a->SeqList[i].location = location;
            a->SeqList[i].level = level;
            break;

    }
	printf("修改完成\n");
}

// 退房
void deleteUser(SL* user)
{
    char a=0;
	// 调用查找函数
	int pos = findUser(user);
    if(pos==0){
        return;
    }
	if (pos < -1)
	{
		printf("没有此用户,请仔细核对,或者用户已经办理退房\n");
        return;
	}
    printf("确定为身份证为%ld的客人办理退房吗?y/n\n",user->SeqList[pos].id);
    scanf(" %c",&a);
    if(a=='y')
    {
        SLErase(user, pos);
        printf("退房成功\n");
    }else{
        printf("返回主菜单");
    }


}

// 排序菜单
void menuForSort()
{
	printf("**************\n");
	printf("*1. 客人身份证\n");
	printf("*2. 客人姓名\n");
	printf("*3. 房间号\n");
	printf("*4. 房间价格\n");
	printf("*5. 退出排序\n");
	printf("**************\n");
}

// 按照身份证排序
int cmp_id(const void* p1, const void* p2)
{
	return ((User*)p1)->id - ((User*)p2)->id;
}
//等级排序
int cmp_lev(const void* p1, const void* p2)
{
    return ((User*)p1)->level- ((User*)p2)->level;
}


// 名字比较
int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((User*)p1)->name, ((User*)p2)->name);
}




// 排序主体
void sortUser(SL* user)
{
	int choice = 0;
	menuForSort();
	printf("请选择需要排序的字段:");
	while (scanf("%d", &choice))
	{
		switch (choice)
		{
		case 1:
			qsort(user->SeqList, user->size, sizeof(User), cmp_id);
			printSortedUser(user->SeqList, user->size);
			break;
		case 2:
			qsort(user->SeqList, user->size, sizeof(User), cmp_name);
            printSortedUser(user->SeqList, user->size);
			break;
        case 3:
            qsort(user->SeqList, user->size, sizeof(User), cmp_loc);
            printSortedUser(user->SeqList, user->size);
            break;
        case 4:
            qsort(user->SeqList, user->size, sizeof(User), cmp_lev);
                printSortedUser(user->SeqList, user->size);
                break;
		case 5:
			return;
		default:
			menuForSort();
			printf("请重新按照菜单输入:");
			break;
		}
		menuForSort();
		printf("请选择需要排序的字段:");
	}
}

// 向文件中写入数据
void writeIntoFile(SL* user)
{
	FILE* pf = fopen("/Users/meiyouyu/Desktop/2/user.txt", "wb");
	if (pf == NULL) 
	{
		perror("fopen error!\n"); 
		return;
	}
	//将通讯录数据写⼊⽂件
	for (int i = 0; i < user->size; i++)
	{
		fwrite(user->SeqList + i, sizeof(User), 1, pf);
	}
	fclose(pf);
	printf("数据保存成功!\n");
}

// 信息销毁函数
void destroyUser(SL* user)
{
	char ans = 0;
	printf("当前剩余客户是否需要续住:y/n\n");
	scanf(" %c", &ans);
	if (ans == 'y')
	{
		writeIntoFile(user);
	}else if(ans!='n')
    {
        printf("请重新输入y/n\n");
        scanf(" %c",&ans);
    }
	SLDestroy(user);
}

user.h

#pragma once

#include "SeqList.h"

typedef struct SeqList_dynamic SL;


typedef struct User
{
    long id;//身份证
    char name[50];//名字
    char gender[10];//性别
    int level;//入住房间价格
    int location;//入住房间号
}User;

// 程序菜单
void menu();

// 导入数据
void LoadUser(SL* employees);

// 初始化——输入
void userInfoGet(SL* employees);

// 查找方式菜单
void menuForFind();
// 查找——返回下标
int findUser(SL* user);
// 查找——显示对应客人信息
void find(SL* a);

// 修改信息
void remedy(SL* a);


// 删除员工信息
void deleteUser(SL* user);

// 排序菜单
void menuForSort();
// 按照指定内容排序
void sortUser(SL* user);
// 打印排序后的内容
void printSortedUser(User* tmp, int size);

// 向文件中写入数据
void writeIntoFile(SL* user);

// 销毁系统数据
void destroyUser(SL* user);

// 打印所有员工信息
void printUser(SL* user);

建立如图所示的结构就可以

user.txt打开是乱码是正常的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1935729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM(day2)经典垃圾收集器

经典垃圾收集器 Serial收集 使用一个处理器或一条收集线程去完成垃圾收集工作&#xff0c;更重要的是强调在它进行垃圾收集时&#xff0c;必须暂停其他所有工作线程&#xff0c;直到它收集结束。 ParNew收集器 ParNew 收集器除了支持多线程并行收集之外&#xff0c;其他与 …

C++写一个线程池

C写一个线程池 文章目录 C写一个线程池设计思路测试数据的实现任务类的实现线程池类的实现线程池构造函数线程池入口函数队列中取任务添加任务函数线程池终止函数 源码 之前用C语言写了一个线程池&#xff0c;详情请见&#xff1a; C语言写一个线程池 这次换成C了&#xff01;…

C#知识|账号管理系统-账号信息管理界面[1]:账号分类选择框、Panel面板设置

哈喽,你好啊,我是雷工! 前一节实现了多条件查询后端代码的编写, 接下来继续学习账号信息管理界面的功能编写,本节主要记录账号分类选择框和Panel的设置, 以下为学习笔记。 01 功能说明 本节实现以下功能: ①:账号分类选择框只能选择,无法自由输入; ②:账号分类框默认…

大语言模型与扩散模型的“爱恨情仇”:Kolors和Auraflow的技术解析

近年来&#xff0c;随着深度学习技术的发展&#xff0c;生成模型在多个领域取得了显著进展。特别是大语言模型&#xff08;LLM&#xff09;和扩散模型&#xff08;Diffusion Model&#xff09;这两类模型&#xff0c;在自然语言处理&#xff08;NLP&#xff09;和图像生成任务中…

找国内API,用哪家API平台?

随着人工智能技术的飞速发展&#xff0c;AI已经成为推动各行各业创新和转型的重要力量。在中国&#xff0c;API平台的发展尤为迅速&#xff0c;涌现出许多优秀的API服务提供商。这些平台不仅提供了丰富的API资源&#xff0c;还通过创新的技术和服务&#xff0c;帮助开发者和企业…

VXLAN到底强在哪?网络虚拟化的彻底突破?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 网络虚拟化作为一项关键技术&#xff0c;不仅提高了资源的利用效率&#xff0c;还增强了业务的敏捷性。然而&a…

gemini-pro-vision 看图说话

一、安装 pip install -U langchain-google-vertexai 二、设置访问权限 申请服务账号json格式key 三、完整代码 import gradio as gr import json import base64 from pathlib import Path import os import time import requests from fastapi import FastAPI, UploadFile,…

使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试》&#xff08;作者&#xff1a;尚雷&#xff09;&#xff0c…

独立游戏《星尘异变》UE5 C++程序开发日志5——实现物流系统

目录 一、进出口清单 二、路径计算 三、包裹 1.包裹的数据结构 2.包裹在场景中的运动 四、道路 1.道路的数据结构 2.道路的建造 3.道路的销毁 4.某个有道路连接的建筑被删除 作为一个工厂类模拟经营游戏&#xff0c;各个工厂之间的运输必不可少&#xff0c;本游戏采用的…

Java语言程序设计基础篇_编程练习题15.7(使用鼠标改变颜色)

15.7(使用鼠标改变颜色) 编写一个程序&#xff0c;显示一个圆的颜色&#xff0c;当按下鼠标键时颜色为黑色&#xff0c;释放鼠标时颜色为白色 代码展示&#xff1a;编程练习题15_7CircleColor.java package chapter_15;import javafx.application.Application; import javafx.…

STM32之八:IIC通信协议

目录 1. IIC协议简介 1.1 主从模式 1.2 2根通信线 2. IIC协议时序 2.1 起始条件和终止条件 2.2 发送一个字节 2.3 接收一个字节 2.4 应答信号 1. IIC协议简介 IIC协议是一个半双工、同步、一主多从、多主多从的串行通用数据总线。该通信模式需要2根线&#xff1a;SCL、…

数据监控电商平台价格心得分享

一、引言 在当今竞争激烈的电商环境中&#xff0c;价格是影响消费者购买决策的重要因素之一。对于电商从业者和商家来说&#xff0c;有效地监控电商平台的价格变动至关重要。通过数据监控&#xff0c;我们可以及时了解市场动态、调整策略&#xff0c;以保持竞争力并实现利润最大…

泰迪科技2024年高校(本科/职业院校)大数据实验室建设及大数据实训平台整体解决方案

高校大数据应用人才培养目标 大数据专业是面向信息技术行业&#xff0c;培养德智体美劳全面发展的大数据领域的高素质管理型专门人才&#xff0c;毕业生具备扎实的管理学、经济学、自然科学、技术应用、人文社科的基本理论, 系统深入的大数据管理专业知识和实践能力&#xff0c…

04 Git与远程仓库

第4章&#xff1a;Git与远程仓库 一、Gitee介绍及创建仓库 一&#xff09;获取远程仓库 ​ 使用在线的代码托管平台&#xff0c;如Gitee&#xff08;码云&#xff09;、GitHub等 ​ 自行搭建Git代码托管平台&#xff0c;如GitLab 二&#xff09;Gitee创建仓库 ​ gitee官…

四种垃圾收集算法详解(JVM)

一、标记清除 1、原理 从根集合节点进行扫描&#xff0c;标记出所有的存活对象&#xff0c;最后扫描整个内存空间并清除没有标记的对象&#xff08;即死亡对象) 标记后 &#xff08;黑色&#xff1a;可回收 | 灰色&#xff1a;存活对象 | 白色&#xff1a;未使用 &#xff0…

HarmonyOS鸿蒙- 跳转系统应用能力

一、通过弹窗点击设置跳转系统应用能力 1、 自定义弹窗效果图 2、 自定义弹窗代码 import { common, Want } from kit.AbilityKit; import { BusinessError } from kit.BasicServicesKit;export function alertDialog() {AlertDialog.show({title: ,message: 当前功能依赖定位…

算法力扣刷题记录 五十一【654.最大二叉树】

前言 二叉树篇&#xff0c;继续。 记录 五十一【654.最大二叉树】 一、题目阅读 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。…

【Linux】安装PHP扩展-Swoole

说明 本文档是在centos7.6的环境下&#xff0c;安装PHP7.4之后&#xff0c;安装对应的PHP扩展Swoole。 一、swoole简述 Swoole 是一个为 PHP 设计的高性能的异步并行网络通信引擎&#xff0c;它以扩展&#xff08;extension&#xff09;的形式存在&#xff0c;极大地提升了 …

Linux--YUM仓库部署及NFS共享存储

目录 一、YUM仓库服务 1.1 YUM介绍 1.2 yum 常用的命令 1.3 YUM 源的提供方式 1.3.1 配置本地 yum 源仓库 1.3.2 配置 ftp 源 1.3.3 配置http服务源 二、NFS 共享存储 2.1 NFS基本概述 2.2 为什么使用 NFS 共享存储 2.3 NFS 应用场景 2.4 NFS 实现原理 2.5 NFS文件…

【python学习】爬虫中常使用的urllib和requests库的的背景、定义、特点、功能、代码示例以及两者的区别

引言 urllib是Python标准库中的一个模块&#xff0c;它提供了一系列用于操作URL的功能 requests是一个Python第三方库&#xff0c;由Kenneth Reitz创建&#xff0c;用于简化HTTP客户端的编程 一、urllib的定义 urllib可以操作url&#xff0c;主要分为以下几个子模块&#xff1…