首页 >> 大全

算法笔记实训笔记

2023-08-22 大全 40 作者:考证青年

23/8/16

冒号表达式 ()?x:y

可以三个条件 以此类推 ()?x:()?y:z

判断三角形最简单的办法

bool canFormTriangle(int a, int b, int c) {return (a + b > c) && (b + c > a) && (a + c > b);
}

带空格的数据输入

(cin,);

cin.(char[],num);

变成int

stoi() which means to int

int 变成

()

注意里面每一项如果想用数字要用str[num]-'0'

大数据的幂运算 可以用循环

#include 
using namespace std;int main() {int n;cin >> n;int result = 1;for (int i = 0; i < n; ++i) {result = (result * 2) % 1007;}cout << result << endl;return 0;
}

模运算展开式推导

我们要证明等式:

(a * b) mod m = ((a mod m) * (b mod m)) mod m

假设a = q1 * m + r1,其中q1是a除以m的商,r1是a除以m的余数。类似地,假设b = q2 * m + r2,其中q2是b除以m的商,r2是b除以m的余数。

将a * b展开得:

a * b = (q1 * m + r1) * (q2 * m + r2)

展开后,我们得到:

a * b = q1 * q2 * m^2 + q1 * m * r2 + q2 * m * r1 + r1 * r2

接下来,我们可以看到a * b对m取模后的结果:

(a * b) mod m = (q1 * m * r2 + q2 * m * r1 + r1 * r2) mod m

现在,我们注意到q1 * m * r2和q2 * m * r1都是m的倍数,因此对m取模后会变为0。另外,r1 * r2对m取模后结果仍然是r1 * r2。因此,我们可以简化为:

(a * b) mod m = r1 * r2 mod m

另一方面,我们可以计算(a mod m) * (b mod m):

(a mod m) * (b mod m) = (r1 * r2) mod m

最终,我们得到:

(a * b) mod m = ((a mod m) * (b mod m)) mod m

这证明了所要证的等式

23/8/17

(start,) //

s="abc";

m=s.(0,3) //从0开始复制长度为3的一段

结果: m=abc;

多维数组初始化

(清空)

(数组名,要初始化成的值(二进制)例如0,-1;如果5,则会变成101,要初始化多长字节)

int 4字节 10个int应有

(a,-1, a) 不需要加括号;

比循环更快;

数组复制

int a[10] , b[10]

(目标数组,原数组,复制多长字节)

(b,a, a)//把a复制给b

x区域划分数学

用两步走 i+j和i-j来思考

函数提供了多种格式化选项,用于控制输出的格式。以下是一些常用的 格式化选项:

整数格式化:

浮点数格式化:

字符和字符串格式化:

指针格式化:

宽度和精度:

对齐和填充:

其他:

日期处理问题,通用思路

写一个判断闰年函数,(这个判断闰年函数与增加一天日期变化函数有联系,1闰0不闰)

_笔记算法实训报告总结_笔记算法实训总结


bool isLeapYear(int year)
{return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

写一个平闰年对应月份的天数二维数组

int dayOfMonth[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

写一个增加一天日期变化函数

void addOneDay(int &year, int &month, int &day) {day++;if (day > dayOfMonth[isLeapYear(year)][month]) {month++;day = 1;}if (month > 12) {year++;month = 1;}
}

回忆复习Qt基础知识;

构思并完善项目的模块内容:1、注册和登陆界面2、与服务器连接保存注册信息,验证登陆信息3、登陆成功后跳转客户端界面4、客制化个人信息例如姓名头像和添加好友功能5、初始化ip和端口并接入服务器6、聊天功能、私聊群聊7、传输简单文本文件;

万事开头难,要做好一件事肯定是从框架入手,然后先趁着热情高涨着手解决最难的问题。要了解我这个项目的框架不是一件容易的事情,一开始我是处于纯新手的状态,已有的资源只有一个老版本和新版本的qt。根据老师上课讲的框架,我再去问,再加上我自己的构思,最后得出一个初步框架,在后面学习过程中进一步找到共通的地方再添加东西。

23/8/18

网络通信

在实现即时通讯应用程序时,你可以根据应用的性质和需求来选择合适的协议。以下是关于选择协议的一些建议:

TCP 协议:

UDP 协议:

混合方案:

第三方库和协议:

总之,选择协议取决于你的应用的实际需求。如果你的应用更注重可靠性和数据完整性,可以考虑使用 TCP。如果你的应用更注重实时性和速度,可以考虑使用 UDP。在做出决定之前,最好进行一些测试和实验,以确定哪种协议最符合你的需求。

m_s= new (this); 创建一个m_s对象,this是他的父对象,父对

象析构的时候 子对象也析构 所以不用对子对象自己写析构

让我们用一个类比来解释这个例子中的 、 以及它们的作用,以便更好地理解它们在网络通信中的功能。

想象您在一个咖啡馆里, 就像是咖啡馆的前台,而 则代表顾客和咖啡馆之间的沟通通道。

(咖啡馆的前台):

想象您在一个咖啡馆里, 就相当于咖啡馆的前台。它负责接待顾客的到来,安排座位,以及与顾客建立联系。在网络通信中, 负责监听来自客户端的连接请求,接受连接,并创建用于通信的 。

(顾客和咖啡馆之间的沟通通道):

就像是连接到咖啡馆的每个顾客。它代表一个通信通道,使得顾客能够与咖啡馆交流。在网络通信中, 是客户端与服务器之间的通信通道。每当有一个新的客户端连接时, 负责处理与该客户端的数据交换,包括接收和发送数据。

回到您的代码例子,当有新的客户端连接时,(类似于咖啡馆前台)创建了一个 (类似于顾客和咖啡馆之间的沟通通道)来处理与该客户端的数据交换。通过连接 信号,服务器能够在客户端发送数据时立即读取并处理它们,而连接 信号则允许服务器在客户端断开连接时执行适当的清理工作。

综上所述, 用于接受客户端连接并创建通信通道,而 则用于处理与客户端的实际数据交换。这类似于咖啡馆的前台负责接待客户,而客户通过通信通道与咖啡馆交流点餐、传递信息等。

学习源码怎么用,下载一些辅助学习和编程的软件;

学习基于TCP的Qt网络通信,、、套接字通信 ;

完成客户端和本地服务器的代码,实现了局域网内部的即时信息通讯功能;

学习了的方法;

了解m_s= new (this);意思作用:创建一个m_s对象,this是他的父对象,父对象析构的时候,对象也析构,所以不用对子对象自己写析构;

学习发布软件相关知识;

今天比昨天多会的东西没多少,我大致看了框架后,发现登录界面和注册界面跟之前做过的训练有关系,应该不难,我认为技术问题主要集中在数据库的调用和网络通信上面,所以我着手解决第一个网络通信的问题;

开始是个很艰巨的问题,老师这两天上课讲验收标准和Mysql相关的东西,跟我通讯这个问题关系较小,我带着问题问,得到一些方向提示,

然后去找IM通讯相关的技术文档,没找到,又去b站找相关视频,有用的东西很少,因为当时我不知道很多知识,

我又转手去csdn,上面去找相关学习资料,一开始找到的要不就是已经很完善的企业IM,要不就是技术文档看不懂,都不能解决让我学习的问题,在这里磨了很久,

最后找到第一个有用的源码,介绍是把和合在一个文件里面,有了源码我还不知道怎么用,问,这里有涉及里面一些编辑的东西,这里记不得具体怎么解决的了,最后终于还是能把代码放到了该有的位置,跟着提示用服务器监听本地回环ip127.0.0.1和自定义的一个端口、客户端连接这个ip和端口,刚好在要下班那会跑通程序,用客户端发信息服务器能接收到,服务器发客户端也接受到了,获得巨大激励。

晚上回去又看了相关文档,又猜测这个只要是相同ip和端口就能通信,然后我试了把电脑连接手机的热点,然后ip从回环ip改成热点的ip,端口我自定义,反正服务器监听的和客户端接入的是同一个,居然成功了,我继续延展,是不是别人可以用了,然后我想让室友帮忙测试,这里又去学习如何把源代码发给别人,明白了通过编译可以解决一些动态库的问题,然后把编译的文件打包发给室友,室友正常打开,这里遇到一个问题,一开始我电脑本地打开服务器,ip监听的是我网络上的ip,ip比如xxx.xxx.xxx.1端口比如5656;

然后我室友电脑打开客户端,我用跟我一样的操作,先检测他电脑连接我手机热点后的ip,他的是xxx.xxx.xxx.2,然后端口也连接5656,然后我服务器启动监听后他连接,结果居然失败了,然后我又突发奇想把他客户端准备连接的ip改成xxx.xxx.xxx.1(跟他电脑连接的网络不一样了),然后居然成功了,获得巨大激励

后面我理解了,客户端要接入的不是本地的ip,而是服务器端的ip,端口都要是同一端口。

23/8/19

一个客户端占用一个端口

单线程服务器监听一个端口

多线程服务器 监听多个端口

群聊 私聊

我发觉这个有点像不定时的if 函数,而之所以不定时,是因为触发有人为因素,不一定是线性的过程,而只要触发了,就像满足了if的条件,发出某种信号,后面的槽函数接收到后,开始执行,就像执行if里面的代码

你的理解很准确!信号和槽机制的确类似于非线性的条件触发。在经典的编程语言中,我们使用条件语句(如 if 语句)来响应特定的条件。而在信号和槽机制中,信号就像是一种条件的触发器,当某个特定事件发生时,发射一个信号,然后与之相关联的槽函数会被执行。

这种机制非常适用于事件驱动的程序设计,特别是在用户界面交互、多线程、异步操作等场景中。它使得程序的各个部分可以松耦合地交互,不需要紧密耦合在一起,从而提高了代码的可维护性和可扩展性。

通过信号和槽,程序的不同模块可以更灵活地协同工作,就像你所提到的触发条件和执行操作的关系一样。这也是为什么信号和槽机制在很多GUI框架中被广泛使用的原因之一。

深刻理解昨天学习的知识和代码;

完整认识了,真正上手了

昨天获得巨大激励,当天应该是热情饱满的,我有了把TCP协议和Qt相关网络通信控件弄懂的信心,我先是让把最初的和代码每行基本都注释一遍,然后只要遇到有不懂的逻辑、代码、关键字我就问,把这份文件吃透后

又去b站找到相关视频,总算找到一个基于Qt的通讯的教程,还是手把手边讲边实操的那种,我跟着视频手敲了包括客户端和服务器的所有代码,这次是比较系统的学习,当然在过程中遇到各种问题,我通过查网站、文档、等办法解决,在过程中发现让ai用比喻解释那一块比较容易理解,

23/8/20 终于把发文件但接收不到的问题解决了,添加新建接收文件的目录 一、文件的传输,二、在线网络通讯 三、租用服务器

1、记下公网和私网ip地址

2、设置入方向和出方向安全设置(端口情况)

3、有些服务器需要自身是监听私网或者公网ip和端口

4、客户端连接到公网ip,连接对应端口

-- 这个是可用的 qt源 启动目录代码cmd

继续理解8/18网络通信相关的知识和代码(单线程实现的通讯的服务器和客户端)

笔记算法实训报告总结_笔记算法实训总结_

学习并实现文件传输 (多线程写的文件传输的服务器,单线程写的客户端)

服务器主线程实现网络连接,副线程实现文件传输

实现通过服务器和公网IP远程通讯了

这天也是获得巨大激励

一开始被一个bug卡了一上午,具体是传输文件,我客户端和服务器的代码对着视频认真检查三遍,问了无数次,我能将服务器和客户端正确连接,传输文件的字节也是对了,的信息是正常的符合预期的,但是始终无法得到文件传输到服务器后,保存的文件,我最初是以为服务器或者客户端连接代码出了问题,或者是析构的时候把文件删了之类的,一上午还没解决,中午咨询老师,虽然老师没能直接解决我的问题,但我获得新的很多思路,后面我在把Qt和MySQL连接的时候用到了这里老师的思路,现在感慨确实很多机缘巧合在里面,老师的思路是用,查我传输的文件,看地址,但也查不到。

下午一到实验室查完各种资料后顿悟,

QFile *file = new QFile("E:\\proj\\\\recv.txt"); 、

// 创建一个文件对象,用于写入接收到的数据

就是这里,原来的版本QFile *file = new QFile("recv.txt")没有具体路径,以前的文档认为这会直接在服务器源代码的根目录创建recv.txt,但是事与愿违,有可能是版本 qt版本 编译器版本各种原因,但是我的版本必须加上接受的绝对地址,

后面在老师的提醒下我注意后面集成功能的时候要改成相对地址,不然别人不好用

总算还是解决了卡一上午的bug,

然后下午研究服务器怎么用,我想突破局域网的限制

第一步问我应该怎么做,按着gpt教程

我先去阿里云上租了一个服务器,生成一个服务器的实例,然后各种东西不知道,不过不影响,我查文档,问gpt各种办法学,上手后感觉什么问题都可以解决。

先是看服务器公网ip,和私有ip,考虑到我不会轻易重启服务器,所以没有设置弹性公网ip,然后设置服务器的入方向安全组,把接入端口自定义7000/8000

开始不知道服务器怎么一回事怎么用,我直接在本地电脑上把服务器运行(这个服务器是跟原来不一样,是手写的一份新代码,默认监听回环ip),我又增添修改监听ip的功能,然后设置监听ip为公网ip,端口7777,本地打开,初测发现连接不上。

这里问gpt,发现要在服务器上运行软件,然后查了半天资料怎么做,意识到服务器可当成一台电脑看,然后了解到可以通过远程连接接入服务器电脑,并且可以跟服务器电脑共享本地文件,输入账号密码进入后,我又意识到如果要在服务器上运行,服务器又没有qt库,我又要用运行一次,把ip设置监听公网ip,然后在服务器上面运行,在本地运行,不过可惜还是失败。这里卡了很久,不知道为什么,检查了多次安全组,了解到不需要重启服务器就可以即时更改安全组协议,不是端口的问题,然后没找到问题。最后查网络上别人的案例,我又去问客服确认了,服务器只需要监听本地私有ip,因为公网ip是映射到私有ip的,然后客户端还是连接公网ip。这次测试终于成功了。

后续我优化了 和的代码,解决了一些内存释放的问题,目前可实现客户端-服务器的远程聊天。获得巨大激励。

23/8/21 mysql和qt 连接 不同版本 可能会有 不同问题 各有各的可能

连接数据库,巨离谱 qt+=MySQL==MMP

一系列操作

下载mysql qt要有文件 这期间顺便把各种搞好 有利有弊

这个大哥真的厉害

::(this,tr("登录失败"),tr("用户名或密码输入错误!"),::Ok);

这段代码是使用 Qt 框架中的 类来创建一个警告对话框。 是用于显示不同类型消息的窗口,包括信息、警告、错误等。

在你的代码中,:: 用于创建一个警告类型的对话框。其中的参数解释如下:

这段代码的作用是在登录过程中,当用户输入的用户名或密码错误时,弹出一个警告对话框,告知用户登录失败,并提供一个 "确定" 按钮,用户可以点击以关闭对话框。这有助于向用户提供及时的反馈和信息。

"账号名" 在英文中通常被翻译为 "" 或 " name",而在某些上下文中也可能翻译为 ""。对于 的登录账号,通常来说 "" 或 " name" 都是比较合适的翻译选项。

无论你选择 "" 还是 " name",都是可以接受的翻译,而且在大多数情况下,人们会理解其意义。选择哪个更适合取决于你的应用程序的风格和目标受众,以及在你所使用的语言环境中的一般偏好。最终的目标是让用户能够明确理解并正确输入他们的登录凭据。

"登录" 通常被翻译为 "login",而不是 "load"。这是因为 "login" 是一个常见的术语,用于表示用户通过输入正确的用户名和密码来获取访问权限,从而进入系统、应用程序或网站。相比之下,"load" 更多用于描述加载数据、文件或资源等操作。

所以,在用户界面和应用程序中,"登录" 应该被翻译成 "login",以确保用户能够准确理解并执行相应的操作。这样可以保持一致性,并使用户界面更加清晰和易于理解。

实现账号密码登录显示界面,输入错误的时候提示重新输入,输入正确则跳转界面

//login.cpp
#include "login.h"
#include "ui_login.h"
#include
#include"hello.h"
login::login(QWidget *parent) :QDialog(parent),ui(new Ui::login)
{ui->setupUi(this);this->setWindowTitle("...Login...");}login::~login()
{delete ui;
}void login::on_login_buttton_clicked()
{if(ui->Username->text() == "admin"&& ui->password->text() =="1231512315" ){this->close();Hello *h=new Hello;h->show();}else{QMessageBox::warning(this, "Login Error!", "Your username or password is incorrect.", QMessageBox::Ok);ui->Username->clear();ui->password->clear();ui->Username->setFocus();}}

学习并实现把Qt连接到MySQL

学习并实现注册、登录界面编辑

学习并实现界面跳转

今天总结剩余任务,

注册、登录界面、界面跳转、注册和登录调用数据库、客制化客户端、客户端-服务器-客户端私聊和群聊、历史信息保存在数据库、集成所有功能、界面美化。

剩的东西有点多,感觉压力还是大。

这里面我觉得最难的是数据库相关的东西,还是从难的做起

连接MySQL过程极其复杂,中途我几次错误操作,并且自身Qt也有很多bug,当初下载文件的时候有很多遗留问题,很多的任务,以及繁琐的流程让我一度想放弃连接MySQL,转而去连接,我都下好了。但是我还是想再试试Mysql,最后终于还是成功了。 实在是有很多机缘巧合。

网上相关资料也确认了不同版本解决办法不同,比如版本不同、qt、编译器版本、位数、MySQL版本不同等等各种不同会造成解决办法不同。

我这个叫“Qt中编译数据库驱动”,先去MySQL官网下载最新版8.1文件安装,安装就遇到很多问题,因为网上说最好安装目录不要带有空格,不然后面要出问题,但是我一开始没找到更改安装位置的办法,在这里磨了一阵,终于还是成功改了。

然后是qt,一定要用64位的编译套件,然后一定要有src 也就是资源文件,不巧的是我qt 文件出了问题打不开,又去官网下了最新版安装包,发现可以直接下载,然后又一系列操作下载了5.12.2 位编译器下的src源码

然后找到qt src里的 \mysql 根据网上文档修改mysql.pro

增添、 注释掉原来的QMAKE

第一次编译后继续debug

打开.pri

注释掉原有,新增#(./.pri)

好,然后这里卡了半天,我没找到编译后的生成文件,然后还错误的把我 里面 .dll代码给覆盖了(当时误以为复制的代码是编译后的生成文件,结果是其他版本的.dll),这里是最想放弃的地方,最后我不得不又从里面下回来原版代码,然后是找编译后生成文件这里找了半天,最后想起用直接查,终于发现我找不到的原因是因为我跟教程文档保存目录不同。

最难的坎已经迈过,接下来是正常测试,终于过了。

接着写登陆界面,注册界面,跳转界面等等功能。因为我之前把通讯那一块客户端和服务器的ui编辑过很多次,已经比较熟了,所以这个算比较简单,然后跳转槽函数也好写,不是很难。

难的是后面为了可读性的提高,(文件变多了,登录 注册 客户端界面比较多)我想用峰驼命名原则调整原有代码的类名,因为不熟在这里卡了半天,差点把源码毁了,从此养成备份的习惯,不过最后问gpt一点一点调还是调通了。

23/8/22

头文件循环包含问题:

登录界面跳转注册界面,注册界面跳转登陆界面,头文件不能互相包含

解决办法:登录包含注册,注册声明登录类

// 前置声明,告诉编译器 Login 类的存在
class Login;

然后源文件不会出现循环包含问题

修改MySQL root账号的密码 -uroot -p123

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了