当前位置: 首页 > news >正文

QT-模拟电梯上下楼

QT-模拟电梯上下楼

  • 一、演示效果
  • 二、核心程序
  • 三、下载链接


一、演示效果

在这里插入图片描述

二、核心程序

#include "ElevatorController.h"
#include <QGridLayout>
#include <QLabel>
#include <QGroupBox>
#include <QGridLayout>
#include <QPushButton>
#include <QDebug>
#include <QChar>
#include <QGuiApplication>
#include <QScreen>
#include <queue>ElevatorController::ElevatorController(Ui::MainWindow* u, int numElevators, int numFloors)
{// create/populate ui ComboBox elementsui = u;QStringList evs;for (int elevator = 1; elevator <= numElevators; ++elevator){evs << QString("Elevator: %1").arg(elevator);}ui->comboElevatorBox->addItems(evs);connect(ui->comboElevatorBox, qOverload<int>(&QComboBox::currentIndexChanged), this, &ElevatorController::elevatorSelected);evs.clear();for (int floorc = 1; floorc <= numFloors; ++floorc){evs << QString("Floor: %1").arg(floorc);}ui->comboFloorBox->addItems(evs);// buttons connectedconnect(ui->pushElevatorButton, &QPushButton::clicked, this, &ElevatorController::buttonElevatorSubmit);connect(ui->pushHelpButton, &QPushButton::clicked, this, &ElevatorController::buttonElevatorHelp);connect(ui->pushPlaceButton, &QPushButton::clicked, this, &ElevatorController::buttonPlaceOnFloor);connect(ui->pushMoveButton, &QPushButton::clicked, this, &ElevatorController::buttonMoveToElevator);connect(ui->pushAdd10FloorButton, &QPushButton::clicked, this, &ElevatorController::add10ToEachFloor);connect(ui->pushBuildingEmergencyButton, &QPushButton::clicked, this, &ElevatorController::triggerBuildingEmergency);connect(ui->pushEmergencyResetAllButton, &QPushButton::clicked, this, &ElevatorController::resetAllElevatorsEmergency);connect(ui->pushLeaveButton, &QPushButton::clicked, this, &ElevatorController::buttonLeaveElevator);// spin box buttons:connect(ui->spinBoxMove, qOverload<int>(&QSpinBox::valueChanged), this, &ElevatorController::moveComboBoxChange);connect(ui->spinBoxLeaveElevator, qOverload<int>(&QSpinBox::valueChanged), this, &ElevatorController::moveLeaveElevatorBoxChange);// combo box change:connect(ui->comboFloorBox, qOverload<int>(&QComboBox::currentIndexChanged), this, &ElevatorController::floorSelected);// keep in mind: "setWidget" and "setLayout" etc add to the ui tree, memory managed by Qt not Me :-)// widget to hold the grid layoutQWidget* elevatorWidget = new QWidget();ui->elevatorScrollArea->setWidget(elevatorWidget); // Set the content widget of the ElevatorController// QGridLayout* elevatorGridLayoutelevatorGridLayout = new QGridLayout(elevatorWidget);elevatorWidget->setLayout(elevatorGridLayout);// Add buttons or labels to the grid layout based on dimensionsfor (int floor = numFloors - 1; floor >= 0; floor--){for (int elevator = 1; elevator <= numElevators; ++elevator){// Create a QLabel for each positionQLabel* cube = new QLabel;cube->setText(" ");cube->setFixedSize(CUBE_SIZE, CUBE_SIZE);QString color = "gray";if(numFloors - floor - 1 == 0) // all ev's start at 0color = "red";cube->setStyleSheet(QString("background-color: %1").arg(color));// Add the widget to the grid layout at the specified positionelevatorGridLayout->addWidget(cube, floor, elevator);}Floor* flr = new Floor(floor + 1); // floor class is a part of the UI// Connect the signals from the Floor to the slots in the ElevatorControllerconnect(flr, &Floor::upButtonPressed, this, &ElevatorController::buttonPressedUp);connect(flr, &Floor::downButtonPressed, this, &ElevatorController::buttonPressedDown);// adds the floor at the start (far left)elevatorGridLayout->addWidget(flr, numFloors - floor - 1, 0);floors.push_back(flr);}// create elevatorsfor (int elevator = 1; elevator <= numElevators; ++elevator){Elevator* ev = new Elevator(elevator);elevators.push_back(ev);updateDisplays();// should be connecting slot in elevator to signals in elevator controllerconnect(this, &ElevatorController::resetEmergency, ev, &Elevator::resetEmergencyInElevator);connect(this, &ElevatorController::sendRequestToElevator, ev, &Elevator::pressButton);connect(this, &ElevatorController::helpButton, ev, &Elevator::helpButtonPressed);connect(this, &ElevatorController::moveElevatorToFloor, ev, &Elevator::moveTofloor);connect(this, &ElevatorController::removeElevatorPassengers, ev, &Elevator::removePassengers);connect(this, &ElevatorController::addElevatorPassengers, ev, &Elevator::addPassengers);connect(this, &ElevatorController::buildingEmergency, ev, &Elevator::emergency);connect(this, &ElevatorController::pressButton, ev, &Elevator::pressButton);connect(this, &ElevatorController::unpressButton, ev, &Elevator::unpressButton);connect(ev, &Elevator::floorChanged, this, &ElevatorController::elevatorFloorChanged);connect(ev, &Elevator::doorOpened, this, &ElevatorController::doorOpened);connect(ev, &Elevator::doorClosed, this, &ElevatorController::doorClosed);connect(ev, &Elevator::doorBlocked, this, &ElevatorController::doorBlocked);connect(ev, &Elevator::overloaded, this, &ElevatorController::overloaded);connect(ev, &Elevator::emergencyOnBoard, this, &ElevatorController::emergency);connect(ev, &Elevator::updateDisplays, this, &ElevatorController::updateDisplays);QThread* evThread = new QThread;ev->moveToThread(evThread);evThread->start();threads.push_back(evThread);}requestScanTimer = new QTimer(this);connect(requestScanTimer, &QTimer::timeout, this, &ElevatorController::scanRequestTree);requestScanTimer->start(SCAN_REQUEST_TREE_SECS);  // Scan backup request tree every 15 seconds, in case overflowqDebug() << "Elevator Controller Initialized";
}ElevatorController::~ElevatorController() // clean up floors
{for(int i = 0; i < floors.size(); i++)delete floors[i];requestScanTimer->stop();delete requestScanTimer;for(int i = 0; i < threads.size(); i++){threads[i]->quit();threads[i]->wait();delete threads[i];}
}// --- UI INPUT & CALLBACK FUNCS ---void ElevatorController::handleScreenResized(int w, int h)
{int bufferGap = 10;ui->elevatorScrollArea->resize(w - ui->InputTerminal->width() - 3*bufferGap, h - bufferGap*6);qDebug() << "Reinit scale -- uiWidth: " << w << " uiHeight: " << h;ui->InputTerminal->move(ui->elevatorScrollArea->x() + w - ui->InputTerminal->width() - 2*bufferGap, ui->InputTerminal->y());ui->InputTerminal->resize(ui->InputTerminal->width(), h - bufferGap*5);
}void ElevatorController::updateDisplays()
{int ev = ui->comboElevatorBox->currentText().remove(0, 10).toInt(); // stored from 0QString buttonList = "";const std::set<int>& blist = elevators[ev - 1]->getButtonsPressed();for(const int& a : blist){buttonList += QString::number(a) + " ";}ui->textBrowserButtonsPressed->setPlainText(buttonList);const int flr = ui->comboFloorBox->currentText().remove(0, 7).toInt();ui->passengerOnFloorNumber->display(floors[flr - 1]->peopleOnFloor());ui->passengerNumber->display(elevators[ev - 1]->numPassengers());
}void ElevatorController::buttonElevatorSubmit()
{// get the int values from the combo boxesint ev = ui->comboElevatorBox->currentText().remove(0, 10).toInt();int fb = ui->comboFloorBox->currentText().remove(0, 7).toInt();qDebug() << "BUTTON - elevator submit pressed elev: " << ev << " floor button: " << fb;if(elevators[ev - 1]->getButtonsPressed().count(fb) > 0)emit unpressButton(ev, fb);elseemit pressButton(ev, fb);
}void ElevatorController::buttonPlaceOnFloor()
{qDebug() << "BUTTON buttonPlaceOnFloor.... spawning ppl on floor";const int flr = ui->comboFloorBox->currentText().remove(0, 7).toInt() - 1;floors[flr]->addPeople(ui->spinBoxPlace->value());ui->passengerOnFloorNumber->display(floors[flr]->peopleOnFloor());ui->spinBoxPlace->setValue(0);
}void ElevatorController::buttonMoveToElevator()
{qDebug() << "BUTTON: buttonMoveToElevator.... moving ppl ";const int flr = ui->comboFloorBox->currentText().remove(0, 7).toInt();int evweak = ui->comboElevatorBox->currentText().remove(0, 10).toInt() - 1; // if this is on the same floor its usedElevator* availableEv = nullptr;Elevator* weakEv = nullptr;bool potentialEvPassed = false;if(elevators[evweak]->currentFloor() == flr) // soft lock the current elevatorweakEv = elevators[evweak];for(Elevator* ev : elevators) // unless theres one that makes more sense{if(ev->currentFloor() == flr && ev->currentState() == Elevator::DoorsOpen){availableEv = ev;if(weakEv == ev && weakEv != nullptr){availableEv = weakEv;break;}}}if(!availableEv)return;const int val = ui->spinBoxMove->value(); //usr inputui->spinBoxMove->setValue(0);floors[flr - 1]->removePeople(val);//    emit addElevatorPassengers(availableEv->getId(), flr, val);elevators[availableEv->getId() - 1]->addPassengers(availableEv->getId(), flr, val);// just set the combo box option to the one that people were put into automatically... for visibilityui->comboElevatorBox->setCurrentIndex(availableEv->getId() - 1);// update the floor on people displayupdateDisplays();
}void ElevatorController::buttonLeaveElevator()
{int ev = ui->comboElevatorBox->currentText().remove(0, 10).toInt();qDebug() << "BUTTON: buttonLeaveElevator.... moving ppl EV: " << ev << " FLR: " << elevators[ev - 1]->currentFloor();const int val = ui->spinBoxLeaveElevator->value(); //usr inputui->spinBoxLeaveElevator->setValue(0);emit removeElevatorPassengers(elevators[ev - 1]->getId(), elevators[ev - 1]->currentFloor(), val);floors[elevators[ev - 1]->currentFloor() - 1]->addPeople(val);// just set the combo box option to the one that people were put into automatically... for visibilityui->comboFloorBox->setCurrentIndex(elevators[ev - 1]->currentFloor() - 1);ui->passengerNumber->display(elevators[ev-1]->numPassengers());updateDisplays();const int flr = ui->comboFloorBox->currentText().remove(0, 7).toInt();if(elevators[ev - 1]->currentFloor() != flr)return;// update the floor on people displayui->passengerOnFloorNumber->display(floors[elevators[ev - 1]->currentFloor()]->peopleOnFloor());updateDisplays();controlMoveButtonActivated();
}void ElevatorController::add10ToEachFloor()
{qDebug() << "BUTTON add 10 To Each Floor.... spawning 10 ppl on each floor!";for(Floor* f : floors){f->addPeople(10);}const int flr = ui->comboFloorBox->currentText().remove(0, 7).toInt() - 1;ui->passengerOnFloorNumber->display(floors[flr]->peopleOnFloor());ui->spinBoxPlace->setValue(0);
}void ElevatorController::triggerBuildingEmergency()
{emit buildingEmergency(-1);
}void ElevatorController::buttonElevatorHelp()
{int ev = ui->comboElevatorBox->currentText().remove(0, 10).toInt();emit helpButton(ev);updateDisplays();
}void ElevatorController::resetAllElevatorsEmergency()
{emit resetEmergency(-1);updateDisplays();
}void ElevatorController::controlMoveButtonActivated(Elevator* availableEv)
{// we want to check if there is an elevator on the floor in door open state// & set the control button to active or not based on it//qDebug() << "BUTTON ACTIVATE: Activating/Deactivating the Move Button to allow moving ppl ";const int flr = ui->comboFloorBox->currentText().remove(0, 7).toInt();const int evNum = ui->comboElevatorBox->currentText().remove(0, 10).toInt();for(Elevator* ev : elevators){if(availableEv != nullptr)break;if(ev->currentFloor() == flr && ev->currentState() == Elevator::DoorsOpen || elevators[evNum - 1]->currentState() == Elevator::Overload)availableEv = ev;}if(elevators[evNum - 1]->currentState() == Elevator::DoorsOpen || elevators[evNum - 1]->currentState() == Elevator::Overload || elevators[evNum - 1]->currentState() == Elevator::Emergency)ui->pushLeaveButton->setEnabled(true);else if(ui->pushLeaveButton->isEnabled())ui->pushLeaveButton->setEnabled(false);if(availableEv != nullptr && flr == availableEv->currentFloor())ui->pushMoveButton->setEnabled(true);else if(ui->pushMoveButton->isEnabled())ui->pushMoveButton->setEnabled(false);
}void ElevatorController::elevatorSelected(int index)
{ui->passengerNumber->display(elevators[index]->numPassengers());updateDisplays();controlMoveButtonActivated(elevators[index]);qDebug()  << "COMBO BOX: Elevator selected. Elevator: " << index;
}void ElevatorController::floorSelected(int index)
{// update the segment display for passangersui->passengerOnFloorNumber->display(floors[index]->peopleOnFloor());qDebug()  << "COMBO BOX: Floor selected. Floor: " << index;ui->spinBoxMove->setValue(0); // wipe this since its different # pplcontrolMoveButtonActivated(); // potentially changes move buttons state
}void ElevatorController::moveComboBoxChange(int index)
{if(index > ui->passengerOnFloorNumber->value()){ui->spinBoxMove->setValue(ui->passengerOnFloorNumber->value());}
}void ElevatorController::moveLeaveElevatorBoxChange(int index)
{if(index > ui->passengerNumber->value()){ui->spinBoxLeaveElevator->setValue(ui->passengerNumber->value());}
}// --- UI UPDATE / EV SOCKET FUNCS ---void ElevatorController::elevatorFloorChanged(int floor, int ev, bool up)
{// each elevator emits this when the moved to new floorev -= 1;qDebug() << "EV signal: Elevator floor changed, floor: " << floor << " elevator: " << ev << " up dir: " << up;qDebug() << "(X, Y) : " << floor << ", " << (ev + 1);const int x = floors.size() - floor; // as the floors decrease, x increases (flr increase, x decrease)const int y = ev + 1;QLayoutItem* layoutItem = elevatorGridLayout->itemAtPosition(x, y); // check if we are looking at a valid evif (!layoutItem){qDebug() << "No layout item at this position.";return;}QWidget* widget = layoutItem->widget();if (!widget){qDebug() << "No widget at this position.";return;}const QMetaObject* metaObject = widget->metaObject();QString widgetType = QString::fromUtf8(metaObject->className());if (widgetType == "QLabel"){QLabel* square = qobject_cast<QLabel*>(widget);QLabel* squarePrev;squarePrev = qobject_cast<QLabel*>(elevatorGridLayout->itemAtPosition((x - 1 + floors.size()) % floors.size(), y)->widget());squarePrev->setStyleSheet(QString("background-color: gray;"));squarePrev = qobject_cast<QLabel*>(elevatorGridLayout->itemAtPosition((x + 1)%floors.size(), y)->widget());squarePrev->setStyleSheet(QString("background-color: gray;"));if(elevators[ev]->currentState() == Elevator::Emergency)square->setStyleSheet("background-color: yellow;");elsesquare->setStyleSheet("background-color: red;");}qDebug() << "Widget type: " << widgetType;
}void ElevatorController::doorOpened(int flr, int ev)
{// a door has openedqDebug()  << "EV signal: Door opened! Elevator: " << ev;const int x = floors.size() - flr; // as the floors decrease, x increases (flr increase, x decrease)const int y = ev;if (!elevatorGridLayout->itemAtPosition(x, y)){qDebug()  << "doorOpened(): No Item at position:  (" << x << ", " << y <<  ")";return;}QWidget* wdg = elevatorGridLayout->itemAtPosition(x, y)->widget();if(QString::fromUtf8(wdg->metaObject()->className()) != "QLabel"){qDebug()  << "doorOpened(): Item at position:  (" << x << ", " << y <<  ") " << "is a: " << QString::fromUtf8(wdg->metaObject()->className());return;}QLabel* squarePrev = qobject_cast<QLabel*>(wdg);squarePrev->setStyleSheet(QString("background-color: green;"));controlMoveButtonActivated(elevators[ev - 1]);updateDisplays();
}void ElevatorController::doorClosed(int flr, int ev)
{// a door has closedqDebug()  << "EV signal: Door closed!! Elevator: " << ev;const int x = floors.size() - flr; // as the floors decrease, x increases (flr increase, x decrease)const int y = ev;if (!elevatorGridLayout->itemAtPosition(x, y)){qDebug()  << "doorClosed(): No Item at position:  (" << x << ", " << y <<  ")";return;}QWidget* wdg = elevatorGridLayout->itemAtPosition(x, y)->widget();if(QString::fromUtf8(wdg->metaObject()->className()) != "QLabel"){qDebug()  << "doorClosed(): Item at position:  (" << x << ", " << y <<  ") " << "is a: " << QString::fromUtf8(wdg->metaObject()->className());return;}QLabel* squarePrev = qobject_cast<QLabel*>(wdg);squarePrev->setStyleSheet(QString("background-color: purple;"));
}void ElevatorController::doorBlocked(int flr, int ev)
{// a door has closedqDebug()  << "EV signal: Alert! Door blocked... reopening door... Elevator: " << ev;const int x = floors.size() - flr; // as the floors decrease, x increases (flr increase, x decrease)const int y = ev;if (!elevatorGridLayout->itemAtPosition(x, y)){qDebug()  << "doorBlocked(): No Item at position:  (" << x << ", " << y <<  ")";return;}QWidget* wdg = elevatorGridLayout->itemAtPosition(x, y)->widget();if(QString::fromUtf8(wdg->metaObject()->className()) != "QLabel"){qDebug()  << "doorBlocked(): Item at position:  (" << x << ", " << y <<  ") " << "is a: " << QString::fromUtf8(wdg->metaObject()->className());return;}QLabel* squarePrev = qobject_cast<QLabel*>(wdg);squarePrev->setStyleSheet(QString("background-color: blue;"));
}void ElevatorController::overloaded(int flr, int ev)
{// a door has closedqDebug()  << "EV signal: Elevator overloaded!! Elevator: " << ev;const int x = floors.size() - flr; // as the floors decrease, x increases (flr increase, x decrease)const int y = ev;if (!elevatorGridLayout->itemAtPosition(x, y)){qDebug()  << "doorClosed(): No Item at position:  (" << x << ", " << y <<  ")";return;}QWidget* wdg = elevatorGridLayout->itemAtPosition(x, y)->widget();if(QString::fromUtf8(wdg->metaObject()->className()) != "QLabel"){qDebug()  << "overloaded(): Item at position:  (" << x << ", " << y <<  ") " << "is a: " << QString::fromUtf8(wdg->metaObject()->className());return;}QLabel* squarePrev = qobject_cast<QLabel*>(wdg);squarePrev->setStyleSheet(QString("background-color: orange;"));
}void ElevatorController::emergency(int flr, int ev)
{// a door has closedqDebug()  << "EV signal: Elevator emergency!! Elevator: " << ev;if(flr != SAFE_FLOOR)return;QLayoutItem* layoutItem = elevatorGridLayout->itemAtPosition(floors.size() - SAFE_FLOOR, ev); // check if we are looking at a valid evif (!layoutItem){qDebug() << "No layout item at this position.";return;}QWidget* widget = layoutItem->widget();if (!widget){qDebug() << "No widget at this position.";return;}const QMetaObject* metaObject = widget->metaObject();QString widgetType = QString::fromUtf8(metaObject->className());if (widgetType == "QLabel"){QLabel* square = qobject_cast<QLabel*>(widget);if(elevators[ev - 1]->currentState() == Elevator::Idle)square->setStyleSheet(QString("background-color: red;"));elsesquare->setStyleSheet(QString("background-color: yellow;"));} qDebug() << "Widget type: " << widgetType;
}// --- EV REQUEST FUNCS ---void ElevatorController::buttonPressedUp(int floor)
{// an up button on a floor has been pressedqDebug()  << "Floor signal: Floor up button pressed: " << floor;handleFlrPressed(FloorDirection(floor, true));
}void ElevatorController::buttonPressedDown(int floor)
{// a down button on a floor has been pressedqDebug() << "Floor signal: Floor down button pressed: " << floor;handleFlrPressed(FloorDirection(floor, false));
}void ElevatorController::handleFlrPressed(FloorDirection fd)
{// maybe this had some use in some implementtation? ev->getNumFloorsReserved();Elevator* bestElevator = nullptr;Elevator* idleEv = nullptr; // lower priofor(Elevator* pEv : elevators){if(fd.up && pEv->lastDirMovingUp() && fd.num >= pEv->currentFloor()){bestElevator = pEv;break;}if(!fd.up && !pEv->lastDirMovingUp() && fd.num <= pEv->currentFloor()){bestElevator = pEv;break;}if(pEv->currentState() == Elevator::Idle)idleEv = pEv;}if(bestElevator)emit moveElevatorToFloor(bestElevator->getId(), fd.num);else if(idleEv)emit moveElevatorToFloor(idleEv->getId(), fd.num);elseearliestRequestTree.push(fd);
}void ElevatorController::scanRequestTree()
{// happen on a timer, scan request tree realloc elevators if freeif(AGGRESSIVE_LOGGING && !earliestRequestTree.empty())qDebug() << "scanRequestTree-> Request floor:  " << earliestRequestTree.top().num << " up: " << earliestRequestTree.top().up; // << i++;if (earliestRequestTree.empty()){return;}FloorDirection fd = earliestRequestTree.top();earliestRequestTree.pop();handleFlrPressed(FloorDirection(fd.num, fd.up));
}
xt

三、下载链接

https://download.csdn.net/download/u013083044/88861542

相关文章:

QT-模拟电梯上下楼

QT-模拟电梯上下楼 一、演示效果二、核心程序三、下载链接 一、演示效果 二、核心程序 #include "ElevatorController.h" #include <QGridLayout> #include <QLabel> #include <QGroupBox> #include <QGridLayout> #include <QPushButto…...

基于springboot+vue的桂林旅游景点导游平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

设计模式四:适配器模式

1、适配器模式的理解 适配器模式可以理解为有两个现成的类Adaptee和Target&#xff0c;它们两个是不能动的&#xff0c;要求必须使用B这个类来实现一个功能&#xff0c;但是A的内容是能复用的&#xff0c;这个时候我们需要编写一个转换器 适配器模式 Adaptee&#xff1a;被适…...

【AI应用】SoraWebui——在线文生视频工具

SoraWebui 是一个开源项目&#xff0c;允许用户使用 OpenAI 的 Sora 模型使用文本在线生成视频&#xff0c;从而简化视频创建&#xff0c;并具有轻松的一键网站部署功能 在 Vercel 上部署 1. 克隆项目 git clone gitgithub.com:SoraWebui/SoraWebui.git 2. 安装依赖 cd So…...

电路设计(27)——交通信号灯的multisim仿真

1.功能要求 使用数字芯片设计一款交通信号灯&#xff0c;使得&#xff1a; 主干道的绿灯时间为60S&#xff0c;红灯时间为45S 次干道的红灯时间为60S&#xff0c;绿灯时间为45S 主、次干道&#xff0c;绿灯的最后5S内&#xff0c;黄灯闪烁 使用数码管显示各自的倒计时时间。 按…...

Python Sanic 异步 Web 框架

Sanic 是一个基于 Python 3.6 的异步 Web 框架&#xff0c;它使用了 Python 的 async/await 语法来实现高效的非阻塞 IO 操作。 Sanic 的主要作用是提供一个快速、轻量级的方式来构建异步 Web 服务&#xff0c;适用于处理大量并发请求的场景。 以下是一个简单的示例代码&…...

滚雪球学Java(70):深入理解Java中的PriorityQueue底层实现与源码分析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…...

李宏毅2023机器学习作业1--homework1

一、前期准备 下载训练数据和测试数据 # dropbox link !wget -O covid_train.csv https://www.dropbox.com/s/lmy1riadzoy0ahw/covid.train.csv?dl0 !wget -O covid_test.csv https://www.dropbox.com/s/zalbw42lu4nmhr2/covid.test.csv?dl0 导入包 # Numerical Operation…...

Mysql的SQL调优-面试

面试SQL优化的具体操作&#xff1a; 1、在表中建立索引&#xff0c;优先考虑where、group by使用到的字段。 2、尽量避免使用select *&#xff0c;返回无用的字段会降低查询效率。错误如下&#xff1a; SELECT * FROM table 优化方式&#xff1a;使用具体的字段代替 *&#xf…...

Unity 2021.3发布WebGL设置以及nginx的配置

使用unity2021.3发布webgl 使用Unity制作好项目之后建议进行代码清理&#xff0c;这样会即将不用的命名空间去除&#xff0c;不然一会在发布的时候有些命名空间webgl会报错。 平台转换 将平台设置为webgl 设置色彩空间压缩方式 Compression Format 设置为DisabledDecompre…...

【鸿蒙 HarmonyOS 4.0】数据持久化

一、数据持久化介绍 数据持久化是将内存数据(内存是临时的存储空间)&#xff0c;通过文件或数据库的形式保存在设备中。 HarmonyOS提供两种数据持久化方案&#xff1a; 1.1、用户首选项&#xff08;Preferences&#xff09;&#xff1a; 通常用于保存应用的配置信息。数据通…...

mysql mgr集群多主部署

一、前言 mgr多主集群是将集群中的所有节点都设为可写&#xff0c;减轻了单主节点的写压力&#xff0c;从而提高了mysql的写入性能 二、部署 基础部署与mgr集群单主部署一致&#xff0c;只是在创建mgr集群时有所不同 基础部署参考&#xff1a;mysql mgr集群部署-CSDN博客 设置…...

【开源】JAVA+Vue.js实现医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…...

《图解设计模式》笔记(一)适应设计模式

图灵社区 - 图解设计模式 - 随书下载 评论区 雨帆 2017-01-11 16:14:04 对于设计模式&#xff0c;我个人认为&#xff0c;其实代码和设计原则才是最好的老师。理解了 SOLID&#xff0c;如何 SOLID&#xff0c;自然而然地就用起来设计模式了。Github 上有一个 tdd-training&…...

图文说明Linux云服务器如何更改实例镜像

一、应用场景举例 在学习Linux的vim时&#xff0c;我们难免要对vim进行一些配置&#xff0c;这里我们提供一个vim插件的安装包&#xff1a; curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o./install.sh && bash ./install.sh 但是此安装包…...

RabbitMQ学习整理————基于RabbitMQ实现RPC

基于RabbitMQ实现RPC 前言什么是RPCRabbitMQ如何实现RPCRPC简单示例通过Spring AMQP实现RPC 前言 这边参考了RabbitMQ的官网&#xff0c;想整理一篇关于RabbitMQ实现RPC调用的博客&#xff0c;打算把两种实现RPC调用的都整理一下&#xff0c;一个是使用官方提供的一个Java cli…...

Linux-基础知识(黑马学习笔记)

硬件和软件 我们所熟知的计算机是由&#xff1a;硬件和软件组成。 硬件&#xff1a;计算机系统中电子&#xff0c;机械和光电元件等组成的各种物理装置的总称。 软件&#xff1a;是用户和计算机硬件之间的接口和桥梁&#xff0c;用户通过软件与计算机进行交流。 而操作系统…...

SpringBoot项目启动报java.nio.charset.MalformedInputException Input length = 1解决方案

报错详情 SpringBoot启动报错java.nio.charset.MalformedInputException: Input length 1 报错原因 出现这个的原因&#xff0c;就是解析yml文件时&#xff0c;中文字符集不是utf-8的原因&#xff0c;这是maven在项目编译时&#xff0c;默认字符集编码是GBK。 解决方式 检…...

【Unity2019.4.35f1】配置JDK、NDK、SDK、Gradle

目录 JDK NDK SDK 环境变量 Gradle JDK JDK&#xff1a;jdk-1.8版本Java Downloads | Oracle 下载要登录&#xff0c;搜索JDK下载公用账号&#xff1a;Oracle官网 JDK下载 注册登录公共账号和密码_oracle下载账号-CSDN博客 路径&#xff1a;C:\Program Files\Java\jd…...

MySQL中的高级查询

通过条件查询可以查询到符合条件的数据&#xff0c;但如同要实现对字段的值进行计算、根据一个或多个字段对查询结果进行分组等操作时&#xff0c;就需要使用更高级的查询&#xff0c;MySQL提供了聚合函数、分组查询、排序查询、限量查询、内置函数以实现更复杂的查询需求。接下…...

新手友好:在快马平台上通过实践快速掌握trea核心概念

作为一个刚接触trea技术的新手&#xff0c;我最近在InsCode(快马)平台上找到了特别适合入门的学习方式。这个平台最让我惊喜的是&#xff0c;不需要从零开始搭建环境&#xff0c;就能直接动手实践trea的核心概念。 理解trea的基本原理 刚开始接触trea时&#xff0c;最困惑的就…...

3步零代码实现Python应用无缝迁移:Python for Android跨平台转换指南

3步零代码实现Python应用无缝迁移&#xff1a;Python for Android跨平台转换指南 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android 问题诊断篇&#xff1a;Pyth…...

让屏幕标注像在纸上写字一样自然:gInk 三分钟上手指南

让屏幕标注像在纸上写字一样自然&#xff1a;gInk 三分钟上手指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 你是否曾经在线上会议中&#xff0c;想快速圈出PPT的重…...

想了解欧拉好猫参数?这篇文章给你详细答案!

在当今新能源汽车市场蓬勃发展的背景下&#xff0c;欧拉好猫凭借其独特的魅力&#xff0c;在众多车型中脱颖而出&#xff0c;吸引了众多消费者的目光。以下将对欧拉好猫的相关参数及技术亮点进行详细解析。外观设计与尺寸欧拉好猫采用复古未来主义的设计风格&#xff0c;圆润的…...

Phi-3-mini-4k-instruct-gguf免配置环境:开箱即用的Web UI,开发者5分钟上手

Phi-3-mini-4k-instruct-gguf免配置环境&#xff1a;开箱即用的Web UI&#xff0c;开发者5分钟上手 1. 认识Phi-3-mini-4k-instruct-gguf Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本。这个模型特别适合处理问答、文本改写、摘要整理和简短创…...

智能制造企业数字化转型智慧工厂建设方案:涵盖研发、供应、生产、销售、服务五大核心环节的智慧工厂建设路径

该方案围绕研发、供应、生产、销售、服务全价值链&#xff0c;融合AI、大数据、5G等技术&#xff0c;通过智能优化、智慧供应链、智能质检、数字孪生及精准营销等模块&#xff0c;构建全链路智慧工厂&#xff0c;实现降本增效与制造企业全面数字化转型。 该方案以“研发—供应…...

百度网盘提取码智能方案:从繁琐搜索到效率革命的技术跃迁

百度网盘提取码智能方案&#xff1a;从繁琐搜索到效率革命的技术跃迁 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 问题诊断&#xff1a;资源获取的现代困境 时间成本的指数级浪费 传统提取码查找流程涉及多平台切换、关键…...

RAG集成:如何让你的企业知识库成为AI的“长期记忆”

核心命题&#xff1a;AI没有记忆&#xff0c;但你的知识库可以成为它的“外脑”。RAG&#xff08;检索增强生成&#xff09;是GEO的终极形态&#xff1a;让企业私有数据成为AI生成答案的唯一信源。引言&#xff1a;老陈的新困境——当AI“看见”了你的店&#xff0c;却“看不见…...

选AI面试软件,为何一定要看中防作弊、可解释、全场景?

想象一下&#xff1a;你花了半个月筛选简历&#xff0c;终于确定了100个面试候选人&#xff0c;却发现一半人在用AI生成器写答案、用提词器念稿&#xff0c;甚至找人替考&#xff1b;好不容易拿到AI评分&#xff0c;却看不懂分数怎么来的&#xff0c;候选人质疑时你根本没法解释…...

手机号码智能定位系统:从技术原理到行业实践

手机号码智能定位系统&#xff1a;从技术原理到行业实践 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors/lo/lo…...