第十四周阅读程序(1):cerr流对象

本文深入探讨了二次方程的求根原理,并通过C++代码实现了解二次方程的方法。重点介绍了标准错误流cerr的使用,以及如何处理方程系数为零的情况。同时,详细阐述了计算判别式并根据其值判断实根是否存在,进而计算实根的过程。
代码:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    float a,b,c,disc;
    cout<<"please input a,b,c:";
    cin>>a>>b>>c;
    if (a==0)
        cerr<<"a is equal to zero,error!"<<endl;
    else if ((disc=b*b-4*a*c)<0)
        cerr<<"disc=b*b-4*a*c<0"<<endl;
    else
    {
        cout<<"x1="<<(-b+sqrt(disc))/(2*a)<<endl;
        cout<<"x2="<<(-b-sqrt(disc))/(2*a)<<endl;
    }
    return 0;
}


运行结果:

 

学习心得:
cerr流对象是标准错误流,cerr流中的信息只能在显示器输出。

//服务器 #include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <thread> #include <map> #include <mutex> #include <sstream> #include <fstream> #include <set> #include <windows.h> #pragma comment(lib, "ws2_32.lib") #define PORT 8888 #define BUFFER_SIZE 1024 // 控制台句柄 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // 设置颜色 void setColor(int color) { SetConsoleTextAttribute(hConsole, color); } void resetColor() { SetConsoleTextAttribute(hConsole, 7); } // 敏感词集合和互斥锁 std::set<std::string> sensitiveWords; std::mutex wordMutex; // 客户端连接信息 std::map<SOCKET, std::string> clientSockets; // socket -> username std::map<std::string, SOCKET> usernameToSocket; // username -> socket std::mutex clientMutex; // 获取客户端 IP 地址 std::string getClientIP(SOCKET sock) { sockaddr_in addr; int addrLen = sizeof(addr); if (getpeername(sock, (sockaddr*)&addr, &addrLen) == 0) { const char* ip = inet_ntoa(addr.sin_addr); return std::string(ip ? ip : "未知IP"); } return "未知IP"; } // 广播消息(替换敏感词) void broadcastMessage(const std::string& sender, const std::string& message, SOCKET excludeSocket = INVALID_SOCKET) { std::lock_guard<std::mutex> lock(clientMutex); std::string fullMsg = "[" + sender + "] " + message; setColor(11); std::cout << fullMsg << std::endl; resetColor(); for (const auto& pair : clientSockets) { if (pair.first != excludeSocket) { send(pair.first, fullMsg.c_str(), fullMsg.size() + 1, 0); } } } // 检查用户名是否合法 bool isValidUsername(const std::string& username) { if (username.empty()) { return false; } // 检查是否重复 std::lock_guard<std::mutex> lockClient(clientMutex); if (usernameToSocket.find(username) != usernameToSocket.end()) { return false; } return true; } // 踢出用户 void kickUser(const std::string& username) { std::lock_guard<std::mutex> lock(clientMutex); auto it = usernameToSocket.find(username); if (it != usernameToSocket.end()) { SOCKET sock = it->second; std::string msg = "[系统消息] 你已被管理员踢出聊天室"; send(sock, msg.c_str(), msg.size() + 1, 0); setColor(12); std::cout << "[踢出] 用户 " << username << " 被管理员踢出" << std::endl; resetColor(); broadcastMessage("系统消息", username + " 被管理员踢出聊天室"); usernameToSocket.erase(username); clientSockets.erase(sock); closesocket(sock); } else { setColor(12); std::cout << "[错误] 用户 " << username << " 不存在或已离线" << std::endl; resetColor(); } } // 查看在线用户 void listUsers() { std::lock_guard<std::mutex> lock(clientMutex); setColor(11); std::cout << "[在线用户] 当前在线用户列表:" << std::endl; resetColor(); for (const auto& pair : clientSockets) { setColor(10); std::cout << " - " << pair.second << " (" << getClientIP(pair.first) << ")" << std::endl; resetColor(); } } // 客户端处理线程 DWORD WINAPI handleClient(LPVOID lpParam) { SOCKET clientSocket = (SOCKET)lpParam; char buffer[BUFFER_SIZE]; // 接收用户名 int bytes = recv(clientSocket, buffer, BUFFER_SIZE, 0); if (bytes <= 0) { setColor(12); std::cerr << "[错误] 无法接收用户名" << std::endl; resetColor(); closesocket(clientSocket); return 0; } std::string username(buffer); // 验证用户名是否合法 if (!isValidUsername(username)) { std::string errorMsg; if (username.empty()) { errorMsg = "[错误] 用户名不能为空,请重新连接并输入用户名"; } else { errorMsg = "[错误] 用户名非法(可能重复),请重新连接并使用其他用户名"; } send(clientSocket, errorMsg.c_str(), errorMsg.size() + 1, 0); closesocket(clientSocket); return 0; } // 存储用户名 { std::lock_guard<std::mutex> lock(clientMutex); clientSockets[clientSocket] = username; usernameToSocket[username] = clientSocket; } setColor(10); std::cout << "[连接] 用户 " << username << " (" << getClientIP(clientSocket) << ") 已加入游戏" << std::endl; resetColor(); broadcastMessage("系统消息", username + " 加入了聊天室。"); // 循环接收消息 while ((bytes = recv(clientSocket, buffer, BUFFER_SIZE, 0)) > 0) { buffer[bytes] = '\0'; // 确保字符串结尾 std::string msg(buffer); // 先显示完整消息 setColor(11); std::cout << "[" << username << "] " << msg << std::endl; resetColor(); broadcastMessage(username, msg, clientSocket); ZeroMemory(buffer, BUFFER_SIZE); } // 客户端断开连接 { std::lock_guard<std::mutex> lock(clientMutex); usernameToSocket.erase(username); clientSockets.erase(clientSocket); } setColor(10); std::cout << "[断开] 用户 " << username << " (" << getClientIP(clientSocket) << ") 离开了游戏" << std::endl; resetColor(); broadcastMessage("系统消息", username + " 离开了游戏。"); closesocket(clientSocket); return 0; } // 接收新连接线程 DWORD WINAPI listenForConnections(LPVOID lpParam) { SOCKET serverSocket = (SOCKET)lpParam; while (true) { SOCKET clientSocket = accept(serverSocket, NULL, NULL); if (clientSocket == INVALID_SOCKET) { setColor(12); std::cerr << "[错误] accept 失败" << std::endl; resetColor(); continue; } setColor(14); std::cout << "[新连接] 客户端已连接" << std::endl; resetColor(); CreateThread(NULL, 0, handleClient, (LPVOID)clientSocket, 0, NULL); } return 0; } // 控制台输入处理线程 DWORD WINAPI handleConsoleInput(LPVOID lpParam) { std::string input; while (std::getline(std::cin, input)) { if (input.empty()) continue; if (input == "/list") { listUsers(); } else if (input.find("/kick") == 0) { std::istringstream iss(input); std::string cmd, username; iss >> cmd >> username; if (!username.empty()) { kickUser(username); } else { setColor(14); std::cout << "[命令] 用法: /kick <用户名>" << std::endl; resetColor(); } } else if (input == "/exit") { setColor(12); std::cout << "[关闭] 服务器即将关闭..." << std::endl; resetColor(); exit(0); } else { setColor(14); std::cout << "[命令] 未知命令: " << input << std::endl; resetColor(); } } return 0; } int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { setColor(12); std::cerr << "[错误] WSAStartup 失败" << std::endl; resetColor(); return 1; } SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == INVALID_SOCKET) { setColor(12); std::cerr << "[错误] 创建 socket 失败" << std::endl; resetColor(); WSACleanup(); return 1; } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = INADDR_ANY; serverAddr.sin_port = htons(PORT); if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { setColor(12); std::cerr << "[错误] 绑定失败" << std::endl; resetColor(); closesocket(serverSocket); WSACleanup(); return 1; } if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) { setColor(12); std::cerr << "[错误] 监听失败" << std::endl; resetColor(); closesocket(serverSocket); WSACleanup(); return 1; } setColor(11); std::cout << "[启动] 服务器已启动,正在监听端口 " << PORT << "..." << std::endl; resetColor(); CreateThread(NULL, 0, listenForConnections, (LPVOID)serverSocket, 0, NULL); CreateThread(NULL, 0, handleConsoleInput, NULL, 0, NULL); // 主线程等待 while (true) { Sleep(1000); } closesocket(serverSocket); WSACleanup(); return 0; } //客户端 #include <iostream> #include <winsock2.h> #include <windows.h> // Sleep(), SetConsoleTextAttribute #include <thread> #include <string> #pragma comment(lib, "ws2_32.lib") #define PORT 8888 #define BUFFER_SIZE 1024 SOCKET clientSocket; // 定义控制台句柄 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // 设置控制台颜色函数 void setSystemMessageColor() { SetConsoleTextAttribute(hConsole, 11); // 蓝绿色 } void setUserMessageColor() { SetConsoleTextAttribute(hConsole, 10); // 亮绿色 } void setDefaultColor() { SetConsoleTextAttribute(hConsole, 7); // 默认白灰色 } void setInputPromptColor() { SetConsoleTextAttribute(hConsole, 15); // 亮白色 } // 接收消息线程函数 DWORD WINAPI ReceiveMessages(LPVOID lpParam) { char buffer[BUFFER_SIZE]; while (true) { ZeroMemory(buffer, BUFFER_SIZE); int bytes = recv(clientSocket, buffer, BUFFER_SIZE, 0); if (bytes <= 0) { setDefaultColor(); std::cout << "[断开] 服务器已断开连接" << std::endl; closesocket(clientSocket); WSACleanup(); Sleep(2000); // 等待2秒后退出 exit(0); } std::string message(buffer); /* // 判断消息类型并设置颜色 if (message.find("[系统消息]") == 0) { setSystemMessageColor(); } else if (message.size() > 2 && message[0] == '[') { size_t endBracket = message.find(']'); if (endBracket != std::string::npos && endBracket < message.size() - 1) { std::string prefix = message.substr(0, endBracket + 1); if (prefix != "[系统消息]") { setUserMessageColor(); } } } else { setUserMessageColor(); // 无前缀的消息也作为用户消息处理 } */ std::cout << message << std::endl; } return 0; } // 主函数 int main() { WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { std::cerr << "[错误] 无法初始化 Winsock" << std::endl; return 1; } clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == INVALID_SOCKET) { std::cerr << "[错误] 无法创建 socket" << std::endl; WSACleanup(); return 1; } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = inet_addr("192.168.1.5"); if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { int error = WSAGetLastError(); if (error == WSAEADDRNOTAVAIL) { std::cerr << "[错误] IP地址无效,请检查IP是否正确。" << std::endl; } else if (error == WSAECONNREFUSED) { std::cerr << "[错误] 服务器未启动或拒绝连接,请确认服务器正在运行。" << std::endl; } else { std::cerr << "[错误] 连接服务器失败,错误代码:" << error << std::endl; } closesocket(clientSocket); WSACleanup(); Sleep(2000); return 1; } std::string username; std::cout << "请输入用户名: "; std::cin >> username; send(clientSocket, username.c_str(), username.size() + 1, 0); // 发送用户名 // 创建接收消息的线程 HANDLE hThread = CreateThread(NULL, 0, ReceiveMessages, NULL, 0, NULL); if (hThread == NULL) { std::cerr << "[错误] 创建线程失败" << std::endl; closesocket(clientSocket); WSACleanup(); return 1; } // 设置输入提示 setInputPromptColor(); std::cout << ">> "; setDefaultColor(); std::string message; while (std::getline(std::cin, message)) { if (message.empty()) continue; send(clientSocket, message.c_str(), message.size() + 1, 0); setInputPromptColor(); std::cout << ">> "; setDefaultColor(); } CloseHandle(hThread); closesocket(clientSocket); WSACleanup(); return 0; } 基于此程序,把它改成一个匹配制游戏,新用户连接后,服务器向客户端发送欢迎界面,得到答复后将该用户加入匹配队列,当队列里有两人时,弹出两人,新建一个房间线程(两人对战),游戏逻辑空着不写,进程结束后将两人返回欢迎界面。
09-22
考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值