【MySQL】MySQL基础知识总结
MySQL前言数据库概念
数据库就是按照数据结构来组织、存储和管理数据,建立在计算存储设备上的仓库。可以看成是电子化的文件柜,也就是存储电子 文件的处所,用户可以对文件中的数据进行进行新增、查询、更新、删除等操作。
为什么要使用数据库?随着,应用程序的功能越来越复杂,数据量越来越大,如何管理这些数据就成了一个 大问题。
读写文件的并解析出数据需要大量重复代码
从成千上万的数据中快速查询出指定数据需要复杂的逻辑
数据缺乏安全感
如果每个应用程序都各自写自己的读写数据代码,一方面效率低,容易出错,另一方面,每个应用程序访问数据的接口都不同,数据难以复用。
所以
数据库作为一种转门管理数据的软件就出现了。应用程序不需要自己管理数据,而是通过数据库软件提供的接口来读写数据。至于数据本身如何存储到文件,那是数据库软件的事情, 应用程序自己并不关心。
这样一来,编写应用程序的时候,数据读写的功能就被大大地简化了。
MySql简介
MySql作为一种开源的轻量级数据库(关系型数据库),在开源数据库中比较流行,由于小巧安装方便快捷,经常会用于互联网公司, 维护也比较方便。因为开源,使用上比较 ...
【MySQL】C/C++链接MySQL数据库
VS2019链接
1.找到这个文件夹
拿到这两个路径,库文件路径,和头文件路径
C:\Program Files\MySQL\MySQL Server 8.0\lib
C:\Program Files\MySQL\MySQL Server 8.0\include
2.打开vs2019
新建项目,解决方案改成x64。打开项目属性。
将头文件目录放到这里面。
3.添加库文件路径到库目录
4.将mysql安装文件夹中lib目录中的libmysql.lib文件添加到依赖项中。
5.把mysql安装目录中lib文件夹中的libmysql.dll文件复制到c:\windows\system32下
6.编写代码开始连接
示例:
12345678910111213141516171819202122232425262728293031323334353637#include<stdio.h>#include<mysql.h>int main(void){ MYSQL mysql;//数据库句柄 MYSQL_RES* res;//查询结果集 MYSQL ...
学习记录1
最近的这半个月,通过与老师和学长交流以及学习理解别人写的代码让我接触到了一些新鲜的事物,比如cmake,linux下C++项目的运行,vscode等软件在Centos7环境下的安装与运行,以及网络协议等相关知识。
网络部分我感觉其实它并不难,不过我最近还不能深入的去学,因为我想的MFC,MySQL,还没有学完,同时我发现这套体系课的内容貌似不是很细节,但其实这并不是重点,我一直认同一句话,想深入细致的学习一块内容,只凭一本书,一套视频,肯定是不够的。
vim和cmake是个有趣的东西,尤其是vim,linux下的开发,vim可少不了,通过纯键盘的操作,确实比鼠标加键盘的效率要高(虽然我只会两个指令,而且都是现学的。还没有具体的学习vim的骚操作。)而cmake我理解它就是个可以跨平台的编译工具(我更愿意叫它为生成可执行文件的工具,它自己并不会编译代码,而是去调用对应的编译器来对代码进行编译。),使得我们编译项目方便了不少,将相关的编译操作指令,都包含在CMakeLists.txt这个文件中。
目前来看,我的大概学 ...
【网络编程】简单的服务端客户端实现
网络编程
有些图片来源——https://blog.csdn.net/TT_love9527
其他图片来源未知,侵删。
OSI模型
发送方在一层一层的打包,接受方,一层一层解包,拿到数据。
我们要做的只是使用打包好的API函数,传递参数即可。
TCP/IP模型可以理解为OSI七层模型的简化版本。
对比:
收发过程可以想象成收发快递。
每层只做它应该做的事,其余的它都不知道。
上层调用下层服务。
经典的分层模型。
双方遵守协议的内容,正确完成通信。
网络套接字编程对比
TCP套接字
无论客户端还是服务端在发送的时候都多发送1个长度,字符串结束符。
TCP套接字服务端123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include<WinSock2.h>#include <iostream>#pragma comment(lib,"ws2_32.lib")int main(v ...
【MFC】MFC基础篇(1)
MFC基础篇以C++类的形式对WINDOWS API进行封装。
MFC框架理论关键类CWinApp:MFC应用程序抽象,管理DocumentTemplate。
CFrameWnd: 框架窗口,负责创建应用主窗口,含标题栏,菜单栏,工具栏,状态栏等 。
CView: 负责展示应用数据,View其实是一个没有边框的窗口, 客户区 。
CDocument: 负责存储应用数据 。
CDocTemplate:DocumentTemplate: 隐藏Boss, 负责管理MainFrame,View和Document。
窗口与窗口对象关系:
每个窗口对象都包含一个窗口
窗口对象使用Create方法创建窗口,在Create方法个中将窗口对象与窗口绑定
窗口对象的与窗口的生命周期不同,并不同生共死。(menu.Detach()将对象与它绑定在窗口的这一块区域分离(分离窗口对象和窗口))
afx微软mfx小组。
消息映射把消息ID和相应函数关联起来。 当这种消息发送出来后,对应的函数就会触发。
12345BEGIN_MESSAGE_MAP(CMFCApplicationView, CView) ON_ ...
【Win32】初识Win32编程
相关视频——链接
Windows编程应用程序分类
控制台程序Console
DOS程序,本身没有窗口,通过Windows DOS窗口执行。(DOS是操作系统预留的)
窗口程序
拥有自己的窗口,可以与用户交互。
库程序
存放代码、数据的程序、执行文件可以从中取出代码执行和获取数据
静态库程序:扩展名LIB,在编译链接程序时,将代码放入到执行文件中。
动态库程序:扩展名DLL,在执行文件时从中获取代码 。
静态库中的代码是直接嵌入到你的项目中,而动态库中的内容是通过地址来找到。
静态库程序无法执行,也就是说它最终生成的文件无法进入内存。
动态库程序有入口函数,可以执行。但是它不能独立运行。谁调动态库里面的东西,它就依附于谁。
应用程序对比
入口函数
控制台程序-main
窗口程序-WinMain
动态库程序-DllMain
静态库程序-无入口函数
文件存在方式
控制台程序、窗口程序-EXE文件
动态库程序-DLL文件
静态库程序-LIB文件
编译工具
编译器CL.EXE,将源代码编译成目标代码.obj。
链接器LINK.EXE,将目标代码、库链接生成最终文件。 ...
【算法】查找算法
查找算法查找的定义
查找:又称检索或查询,是指在查找表中找出满足一定条件的结点或记录对应的操作。
查找表:在计算机中,是指被查找的数据对象是由同一个类型的记录构成的集合,如顺序表、链表、二叉树和哈希表等。
查找效率:查找算法中的基本运算是通过记录的关键字与给定值进行比较,所以查找的效率通常取决于比较所花的时间,而时间取决于比较的次数。通常以关键字与给定值进行比较的记录个数的平均值来计算。
查找操作及分类
操作:
查找某个“特定的”数据元素是否成存在在查找表里。
某个“特定的”数据元素的各种属性。
在查找表中插入一个数据元素。
从查找表中删除某个数据元素。
分类:
若对查找表只进行(1)或(2)两种操作,则称此类查找表为静态查找表。
若在查找的过程中同时插入查找表中存在的数据元素,或者从查找表中删除已经存在的某个数据元素,则称次类查找表为动态查找表。
数组和索引
索引把线性表分为若干块,每一块中的元素存储顺序是任意的,但是块与块之间必须按关键字大小顺序排列。即前一块中的最大关键字值小于后一块中的最小关键字值。
分块以后,为了快速定义块,还需要建立一个索引表,索引表中 ...
不同指针的偏移量不同
这里的偏移量我指的是对应指针+几,地址所偏移的长度。
【算法】七大排序算法(汇总)
选择排序
冒泡排序
插入排序
归并排序
希尔排序
快速排序
【算法】快速排序
快速排序排序流程:
每次选区第一个的数为基准数
然后将大于和小于基准的元素分别置于基准数两边
继续分别对基准数两侧未排序的数据使用分治法进行细分处理(分而治之),直至整个序列有序。
如下图所示:
代码实现:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#include<iostream>using namespace std;void print(int* arr, int len){ for (int i = 0; i < len; i++) { cout << arr[i] << " "; } cout << endl;}int parttion(int arr[], int low, int high){ int i = low;// ...
【算法】希尔排序
希尔排序插入排序的缺点
插入排序虽好,但在有些情况下是有很多缺点的,比如:
14,18,20,36,1,2
除了最后的两个元素,其他的已经有序了,而这两个几乎要移动前面所有的元素。
引出希尔排序
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。它与插入排序的不同之处在于,它会优化比较距离较远的元素。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有的元素被分成1组,实际上等同于执行一次插入排序,算法终止。
(就是拆开分组进行排序,排完之后再合并在一起再排序一遍。如下图所示。
希尔排序的基本步骤:
选择增量:gap = length / 2,缩小增量:gap = gap /2 ;
增加序列:用序列表示增量的选择,{n/2,(n/2)/2,…1}
先将整个待排序的序列分割成若干子序列分别进行直接插入排序,具体算法描述:
选择一个增量序列t1,t2,……,tk,其中ti> ...
【算法】归并排序
归并排序
当两组数据已经有序,我们可以通过以下方式让两组数据快速排序。
依次从两组数据中取前面最小的元素放到新的数组中,然后再把新数组中有序的数据拷贝到原数组,完成排序。这就是归并思想。
代码实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include<iostream>using namespace std;void mergeAdd(int* arr,int left,int mid,int right){ int temp[64] = { 0 }; int i = left;//指向左边数组最小的元素位置 int j = mid;//指向右边数最小的元素位置 int k = 0;//临时数组下标 while (i < mid && j <= right) { if (arr[i] < arr[j]) { temp[k++] ...
【算法】插入排序
插入排序实现原理
插入排序的工作原理是通过构建有序序列,对于未排序的数据,在已排序的序列中从后向前扫描,找到相应的位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描的过程中,需要反复把已排序的元素逐步向后挪位,为最新的元素提供插入空间。
排序流程
1.从第一个元素开始,该元素可以认为已经被排序。
2.取出下一个元素,在已经排序的元素序列中从后向前扫描。
3.如果该元素(已经排序)大于新元素,该元素移到下一位置。
重复步骤3,直到找到已排序的元素小于或等于新元素的位置。
4.将新元素插入到该位置。
重复2~4。
类似于玩斗地主时,给你发完牌,理牌的过程。
代码实现
12345678910111213141516171819//先取出第一个元素,已经有序了,从后面元素开始一个一个往里面插。void InsertSort(int* arr, int len){ int preIndex = 0;//前一个结点的下标 int cur ...
【算法】冒泡排序
冒泡排序排序流程
通过重复地遍历排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复的地进行直到没有再需要交换,也就是或该数列已经排序完成。这个算法的名字由来是因为越小(大)的元素会经由交换慢慢的像泡泡一样“浮”到数列的顶端,故而得名。
代码实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#include<iostream>using namespace std;void print(int* arr, int len){ for (int i = 0; i < len; i++) { cout << arr[i] << " "; } cout << endl;}void swap(int& a, int& ...
【算法】选择排序
选择排序实现流程
一串无序排列的数,选出最大(小)的数,与最后一个数交换位置,再在前面(除去选出的这个最大的数)选出一个最大的数与倒数第二个数交换,重复这个过程。
代码实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778#include<iostream>using namespace std;void swap(int& a, int& b){ int temp = 0; temp = a; a = b; b = temp;}void print(int* arr, int len){ for (int i = 0; i < len; i++) { cout << arr[i] << " "; } cout ...
【算法】分支定界算法
分支定界算法概念
分支定界(branch and bound)算法是一种在问题的解空间上搜索问题的解的方法。但与回溯算法不同,分支定界算法采用广度优先或最小耗费优先的方法搜索解空间树。并且,在分支定界算法中,每一个活结点只有一次机会称为扩展结点。
利用分支定界算法对问题的解空间树进行搜索,它的搜索策略是:
产生当前扩展结点的所有孩子结点。
在产生的孩子结点中,抛弃那些不可能产生可行解(或)最优解的结点。
将其余的孩子结点加入活结点表。
从活结点表中选择下一个活结点作为新的扩展结点。
如此循环,直到找到问题的可行解(最优解)或活结点表为空。
从活结点表中选择下一个活结点作为新的扩展结点,根据选择的方式不同,分支定界算法通常可以分为两种形式。
FIFO(First In First Out) 分支定界算法:按照先进先出原则选择下一个活结点作为扩展结点,即从活结点表中取出结点的顺序与加入结点的顺序相同。
最小耗费或最大收益分支定界算法:在这种情况下,每个结点都有一个耗费或收益。假如要查找一个具有最小耗费的解,那么要选择的下一个扩展结点就是活结点表中具有最小耗费的活结点,假 ...
【算法】贪心算法
贪心算法概念解释
贪婪算法(贪心算法)是指在对问题求解的时候,每一步选择都采用最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。
贪心算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。
贪心算法并没有固定的解发框架,算法的关键是贪心策略的选择,根据不用问题选择不同的策略。
基本思路
建立数学模型描述问题
把求解的问题分为若干个子问题
对每一个子问题求解,得到子问题的局部最优解
把子问题对应的局部最优解合成原来整个问题的一个近似最优解。
例题:
《钱币找零问题》
假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0,c1,c2,c3,c4,c5,c6张。现在要用这些钱来支付K元,最少要用多少张纸币?
解题思路:
用贪心算法的思想,每一步都用能用的最大纸币即可。
代码实现:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#inclu ...
【算法】回溯法
回溯法 回溯的基本原理
在问题的解空间中,按深度优先遍历策略,从根节点出发搜索解空间树。算法搜索至解空间 的任意一个节点时,先判断该节点是否包含问题的解。如果确定不包含,跳过对以该节点为根的 子树的搜索,逐层向其祖先节点回溯,否则进入该子树,继续深度优先搜索。
回溯法解问题的所有解时,必须回溯到根节点,且根节点的所有子树都被搜索后才结束。
回溯法解问题的一个解时,只要搜索到问题的一个解就可结束。
回溯的基本步骤
定义问题的解空间(我理解的解空间就是目标问题的内容,或者说是目标问题解的集合。)
确定易于搜索的解空间结构
以深度优先搜索的策略搜索解空间,并在搜索过程中尽可能避免无效搜索
例题
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了 矩阵的某一格,那么该路径不能再次进入该格子。例如在下面的 3×4 的矩阵中包含一条字符串 “bfce”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符串“abfb”的路径,因为 字符串的第一个字符 b 占据了矩 ...
【算法】动态规划算法
动态规划算法例:
走楼梯,可以一次上一阶,也可以,一次上两阶,根据楼梯的阶数来判断有几种上楼梯的方法。
分析:
f(1) = 1; 1种
f(2) = 2; 2种
f(3) = f(1) + f(2);3种
f(4) = f(3) + f(2) ;5种
…
依次类推
代码如下:
123456789101112131415161718192021222324252627#include<iostream>using namespace std;int WalkCount(int n){ //可以一次走一阶台阶,也可以一次走两阶台阶 if (n < 0) { return 0; } if (n == 1) { return 1; } if (n == 2) { return 2; } else { return WalkCount(n-1)+WalkCount(n-2); }}int main(void){ cout << WalkC ...
【单链表】一元多项式求和(C++)
要求&&实现流程
代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163#include<iostream>using namespace std;typedef struct LinkNode{ int cofe;//系数 int exp;/ ...