算法
冒號表達式 (condition)?x:y
可以三個條件 以此類推 (condition1)?x:(condition2)?y:z
判斷三角形最簡單的辦法
?bool canFormTriangle(int a, int b, int c) { ? ? ?return (a + b > c) && (b + c > a) && (a + c > b); ?}
帶空格的數(shù)據(jù)輸入
?#include <string> ?getline(cin,string); ?#include<iostream> ?cin.getline(char[],num);
數(shù)據(jù)類型轉(zhuǎn)換
string變成int
?#include<string> ?? ?stoi() which means string to int
int 變成string
#include<string> to_string() 注意string里面每一項如果想用數(shù)字要用str[num]-'0'
大數(shù)據(jù)的冪運算
可以用循環(huán)
#include <iostream> 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; }
模運算展開式推導(dǎo)
我們要證明等式:
(a * b) mod m = ((a mod m) * (b mod m)) mod m
假設(shè) a = q1 * m + r1,其中 q1 是 a 除以 m 的商,r1 是 a 除以 m 的余數(shù)。類似地,假設(shè) b = q2 * m + r2,其中 q2 是 b 除以 m 的商,r2 是 b 除以 m 的余數(shù)。
將 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 取模后的結(jié)果:
(a * b) mod m = (q1 * m * r2 + q2 * m * r1 + r1 * r2) mod m
現(xiàn)在,我們注意到 q1 * m * r2 和 q2 * m * r1 都是 m 的倍數(shù),因此對 m 取模后會變?yōu)?0。另外,r1 * r2 對 m 取模后結(jié)果仍然是 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
這證明了所要證的等式
復(fù)制字符串的一部分
substr(start,length) //字符串 string s="abc"; string m=s.substr(0,3) //從0開始復(fù)制長度為3的一段 //結(jié)果: m=abc;
多維數(shù)組初始化
<cstring> memset(清空)
memset(數(shù)組名,要初始化成的值(二進制)例如0,-1;如果5,則會變成101,要初始化多長字節(jié))
int 4字節(jié) 10個int應(yīng)有40bite
memset(a,-1,sizeof a) sizeof不需要加括號;
memset比循環(huán)更快;
數(shù)組復(fù)制
int a[10] , b[10]
memcopy(目標數(shù)組,原數(shù)組,復(fù)制多長字節(jié))
memcopy(b,a,sizeof a)//把a復(fù)制給b
printf的格式化輸出
printf
函數(shù)提供了多種格式化選項,用于控制輸出的格式。以下是一些常用的printf
格式化選項:
整數(shù)格式化:
%d
:有符號十進制整數(shù)。
%u
:無符號十進制整數(shù)。
%o
:無符號八進制整數(shù)。
%x
或%X
:無符號十六進制整數(shù)(小寫或大寫字母)。浮點數(shù)格式化:
%f
:浮點數(shù)。
%e
或%E
:以指數(shù)形式表示的浮點數(shù)(小寫或大寫字母)。
%g
或%G
:根據(jù)值的大小選擇%f
或%e
格式。字符和字符串格式化:
%c
:字符。
%s
:字符串。指針格式化:
%p
:指針的值。寬度和精度:
%nd
:最小寬度為 n 的整數(shù),用空格填充。
%.nf
:浮點數(shù)保留 n 位小數(shù)。
%m.nf
:最小寬度為 m,浮點數(shù)保留 n 位小數(shù),自動補齊空格。對齊和填充:
%Ns
:右對齊,最小寬度為 N 的字符串,不足部分用空格填充。
%-Ns
:左對齊,最小寬度為 N 的字符串,不足部分用空格填充。
%0Nd
:右對齊,最小寬度為 N 的整數(shù),不足部分用零填充。其他:
%%:輸出百分號。
日期處理
寫一個判斷閏年函數(shù)
(這個判斷閏年函數(shù)與增加一天日期變化函數(shù)有聯(lián)系,1閏0不閏)
bool isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); }
寫一個平閏年對應(yīng)月份的天數(shù)二維數(shù)組
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} };
寫一個增加一天日期變化函數(shù)
void addOneDay(int &year, int &month, int &day) { day++; if (day > dayOfMonth[isLeapYear(year)][month]) { month++; day = 1; } if (month > 12) { year++; month = 1; } }
進制轉(zhuǎn)換
####
10進制轉(zhuǎn)換成p進制
例如要變的初始數(shù)為10進制的num,輔助數(shù)base,目標進制是s
int num , base = 1; int result = 0; // 用于存儲結(jié)果 while (num != 0) { result += num % 10 * base; // 將當前位的值乘以進制數(shù),累加到結(jié)果中 num /= 10; // 去掉當前位 base *= s; // 更新進制數(shù) }
從個位開始,個位乘以base,十位乘以s2,百位乘以s3,以此類推最后累加起來
####
p進制轉(zhuǎn)換成10進制
連續(xù)讀入的一次debug
while(cin>>m[num])
{
num++;
}
區(qū)別于
while(cin>>m[num++])
{
}
前者判斷輸入完再num++,而后者無論輸入成功與否都會num++;
cmp函數(shù)編寫 return a < b ,
快速排序 傳入數(shù)組,左右邊界,初始化索引指針在左右邊界外,,初始化隨機參照值,do 指針往中間靠 while左邊索引的東西大于參照物,右邊索引的東西小于參照物 ,交換兩個索引,迭代左邊和右邊 注意下標
sort(str,str+n,sortmethod)
查找數(shù)字 字母 統(tǒng)計出現(xiàn)次數(shù) (哈希表)
可以建立哈希表 字母可以將其-‘a(chǎn)’
因為要將統(tǒng)計的東西按順序輸出,所以先建立哈希表按順序輸出,最后按順序查找輸出即可
數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)
-
數(shù)據(jù):對客觀事物的符號表示 ------圖像、聲音等
-
數(shù)據(jù)元素:數(shù)據(jù)的基本單位 ----學(xué)生的信息記錄
-
數(shù)據(jù)項(最小):構(gòu)成數(shù)據(jù)元素的不可分割的最小單位 ------學(xué)號、姓名、性別等
-
數(shù)據(jù)對象:具有相同性質(zhì)的數(shù)據(jù)元素的集合
-
數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)元素的集合):相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合
-
邏輯結(jié)構(gòu)
-
存儲結(jié)構(gòu)
-
數(shù)據(jù)的運算
數(shù)據(jù)結(jié)構(gòu)分三種:邏輯結(jié)構(gòu) 、存儲結(jié)構(gòu)、數(shù)據(jù)的運算
1、邏輯結(jié)構(gòu)
線性結(jié)構(gòu)
-
線性表(一般線性表、棧、隊列、串、數(shù)組) 一對一
非線性結(jié)構(gòu)
-
集合
-
樹形結(jié)構(gòu) ------- 一對多
-
圖形結(jié)構(gòu)或網(wǎng)狀結(jié)構(gòu) ------- 多對多
如果分成兩種,那就是線性結(jié)構(gòu)和非線性結(jié)構(gòu)
2、存儲結(jié)構(gòu)(可以稱之為物理結(jié)構(gòu))
-
順序存儲 邏輯上相鄰的元素存儲再物理位置也相鄰的存儲單元中
-
鏈式存儲 借助指示元素存儲地址的指針
-
索引存儲 建立索引表 索引項(關(guān)鍵字 地址)
-
散列存儲 (哈希存儲 )
$$
?
關(guān)鍵字\mathop{\longrightarrow}^{散列函數(shù)}存儲地址
$$
一般題目中出現(xiàn)
-
順序
-
鏈
-
索引
-
哈希
跟存儲結(jié)構(gòu)有關(guān)
而有序表指的是有序的線性表,僅僅是一種邏輯結(jié)構(gòu),對有序的線性表進行存儲的時候既可以用線性存儲也可以用鏈式存儲
3、算法
算法是對特定問題求解步驟的一種描述
-
有窮性 有窮步驟 有窮時間
-
確定性
-
可行性
-
輸入 一個算法有零個或多個輸入
-
輸出 一個算法有一個或多個輸出
通常設(shè)計一個好的算法應(yīng)考慮達到以下目標
-
正確性
-
可讀性
-
健壯性
-
效率與低存儲量需求
算法效率的度量是通過時間復(fù)雜度和空間復(fù)雜度來描述的
頻度 該語句在算法中被重復(fù)執(zhí)行的次數(shù)
算法中所有語句的頻度之和 T(n)=O(f(n)) f(n)指的是基本運算的頻度 O()指的是數(shù)量級
例如O(2n)=n
寫時間復(fù)雜度的時候 不要忘記了大O
順序表
1、線性表類型定義
線性表:具有相同數(shù)據(jù)類型的n(n≥0)個數(shù)據(jù)元素的有限序列
L=(a1,a2,...,ai,ai+1 ....,an)
除第一個元素外,每個元素有且僅有一個直接前驅(qū)
除最后一個元素外,每個元素有且僅有一個直接后繼
其中 3、4、5、6較為重要
2、順序表的結(jié)構(gòu)
順序表:順序存儲的線性表
數(shù)組下標 0-》1-》...-》i-1
順序表 a1-》a2-》...-》ai
內(nèi)存地址 LOC(A)-》LOC(A)+sizeof(ElemType)-》...-》LOC(A)+sizeof(ElemType)*(i-1)
線性表的順序儲存類型描述為
#define MaxSize 50 typedef struct{ //靜態(tài)分配 Elemtype data[MaxSize]; int length; }SqList;
#define InitSize 100 typedef struct{ //動態(tài)分配 ElemType *data; int MaxSize,length; }SeqList; L.data=(ElemType*)malloc(sizeof(Elemtype)*InitSize); //開辟一塊更大的存儲空間,用以替換原來的存儲空間
順序表的特點:
-
順序表最主要的特點是隨機存取,即通過首地址和元素序號可在時間O(1)內(nèi)找到指定的元素
-
順序表的存儲密度高,每個結(jié)點只存儲數(shù)據(jù)元素
-
順序表邏輯上相鄰的元素物理上也相鄰,所以插入和刪除操作需要移動大量元素
鏈表是沒有隨機存取這個特點的?。?!
順序表的實現(xiàn)
1、插入操作
16-48-09-63往右移一位,再用50把原先16所在的位置覆蓋
舉一反三
要在第i個位置插入值為e
i (1 ≤ i ≤ L.length+1)
bool ListInsert(SqList &L, int i , ElemType e) { if(i<1||i>L.length+1) { retun false; } for(int j-L.length;j>=i;j--) { L.data[j]=L.data[j-1]; //這一步是要求的關(guān)鍵 把后面的用前面的覆蓋 } L.data[i-1]=e;//for循環(huán)把空間騰出來了之后,可以將e賦值到所需的位置,第i-1就是數(shù)組的下標,合理 L.length++;//因為插入了一個數(shù),所以總的長度會加一,合理 return true; }
考慮時間 復(fù)雜度
最好的情況插入(在最后的下一位)不需要移動,為0 ,在末尾,移動一次,以此類推 ,最壞的情況,在第一個位置插入,需要移動所有的元素,也就是移動n次
0+1+2+...+n=n(n+1)/2
因為0到n有n+1個元素 ,所以用n(n+1)/2除以n+1
得到移動結(jié)點的平均次數(shù) n/2 ,平均時間復(fù)雜度就為 O(n)
第i個位置,前面有i-1個元素,我們要移動第i+1到n的所有元素,往后一位,
這個需要移動的次數(shù)是 n-(i-1)
比如 5個數(shù) 插入第3個位置 ,前面有兩個單位,后面有 3、4、5三個
要移動n- (i-1)次=3
2、刪除操作
bool ListDelete(SqList &L, int i ,Elemtype &e) { //先判斷i是否合法 if(i<1||i>L.length) return false; e=L.data[i-1]; for(int j=i;j<L.length;j++) L.data[j-1]=L.data[j]; L.length--; return true; //邊界問題先不管,思路是 先把要刪除的值保存在e里面,在從刪除的位置開始,依次把后面的值賦值到前面去即可 }
3、按值查找操作
在順序表L中查找第一個元素值等于e的元素,并返回其位序
int LocateElem(SqList L,ElemType e) { int i; for(i=0;i<L.length;i++) if(L.data[i]==e) return i+1; return 0; }
4、按位查找操作
int Getelem(Sqlist L, int i) { if(i<1||i>L.length) return 0; return L.data[i-1]; }
5、合并有序的順序表算法
將兩個有序順序表A,B合并為一個有序順序表C,并用函數(shù)返回結(jié)果順序表
算法思想:首先,按順序不斷取下兩個順序表表頭較小的結(jié)點存入心得順序表中。然后,看哪個表還有剩余,將剩下的部分添加到新的順序表后面
bool Merge(SqList A,SqList B,SqList &C) { if(A.length+B.length>C.MaxSize) return false; int i=0,j=0,k=0;//分別對應(yīng) A、B、C的數(shù)組下標,最后k可以表示C的長度 while(i<A.length&&j<B.length) { if( (A.data[i]<=B.daata[j])) C.data[k++]=A.data[i++]; else C.data[k++]=B.data[j++]; } while(i<A.length) C.data[k++]=A.data[i++]; while(j<B.length) C.data[k++]=B.data[j++]; C.length=k; return true; }
鏈表
1、單鏈表的結(jié)構(gòu)
單鏈表:鏈式存儲的線性表
帶頭節(jié)點方便運算的實現(xiàn);
如果不帶頭結(jié)點,則需要將第一個結(jié)點和后繼節(jié)點分類
鏈式存儲 存儲地址不一定是連續(xù)的
補充:如果線性表采取順序存儲則一定是連續(xù)的
2、單鏈表的實現(xiàn)(操作)
1、按序號查找結(jié)點值
時間復(fù)雜度O(n)
2、按值查找表結(jié)點
時間復(fù)雜度O(n)
平均時間復(fù)雜度
查找第一個需要1次,第二個需要兩次,第三個需要三次
第n個需要n次,一共需要(n+1)n/2;
有n個數(shù),所以要除以n,最后得到(n+1)/2 平均時間復(fù)雜度
插入結(jié)點操作
后插操作(一般是把新結(jié)點插在一個已知結(jié)點的后面)
bi如將值為x的新結(jié)點插入到單鏈表的第i個位置上;
(實際上是插在第i-1個結(jié)點的后續(xù)位置,故稱之為后插操作)
這幾章第一步都是要判斷檢索標記是否合法,嚴謹
假設(shè)b為第i個結(jié)點,a為第i-1個結(jié)點,在插入前先判斷第i個位置是否合法
不合法就return NULL
先找到第i-1個結(jié)點,用之前按位查找的辦法
前插操作?
在不清楚某一個點前面位置的情況該如何處理呢?
單鏈表只能直接檢索到后續(xù)結(jié)點,所以這里要轉(zhuǎn)換思路。聯(lián)系后插操作
先實現(xiàn)后操作后,再將后插的結(jié)點與前一個結(jié)點交換數(shù)據(jù),即可實現(xiàn)“前插操作”
例題
先把前驅(qū)結(jié)點的下一個結(jié)點賦給 插入結(jié)點
畫個圖就好理解
4、刪除結(jié)點操作
多種寫法
p->next=q->next;
free(q) 這樣q不就被邊緣化了?
3、雙鏈表
雙鏈表中有兩個指針
prior 和next,分別指向前驅(qū)結(jié)點和后繼節(jié)點,多開空間,但是不得不說有點方便?
雙鏈表的定義
例題:
雙鏈表的插入操作
有點意思,跟單鏈表不同,單鏈表插入只需要改后繼節(jié)點,或者交換兩節(jié)點
但雙鏈表要更換后繼結(jié)點和前驅(qū)結(jié)點,相當于多一個操作
并且第一行和第二行必須在第四行之前,
都是要先把第i-1個結(jié)點的后繼結(jié)點賦給插入結(jié)點的后繼結(jié)點
最后再改i-1個結(jié)點的后繼結(jié)點
相當于改已有數(shù)據(jù)前 確保其被保存了?。?/strong> 后繼先賦
雙鏈表的刪除操作
確保前驅(qū)結(jié)點和后繼結(jié)點都進行過操作即可
4、循環(huán)鏈表
最大的特點就是,最后一個結(jié)點的后繼結(jié)點是頭節(jié)點
循環(huán)單鏈表
每個結(jié)點都有后繼結(jié)點;其判斷為空的 條件不再是后繼結(jié)點為NULL
循環(huán)雙鏈表
同理
概念例題
判斷為空例題
循環(huán)鏈表性質(zhì)題:
不能說鏈式存儲和順序存儲哪個好哪個差,每個都有其適用的場景
線性表中插入和刪除數(shù)據(jù)需要移動大量的數(shù)據(jù),所以是不便于插入和刪除的
而鏈式表只需要改變兩個指針,后繼結(jié)點即可,所以鏈式表是便于插入和刪除的
棧和隊列
1、棧的基本概念
棧:只允許在一端進行插入或刪除操作的線性表 (后進先出LIFO)
2、棧的儲存結(jié)構(gòu)
3、隊列的基本概念
4、隊列的存儲結(jié)構(gòu)
串
樹和二叉樹
1、樹的基本概念
樹:n(n \geq 0)個結(jié)點的有限集
樹是遞歸定義的
有空樹的概念
根節(jié)點:A
除了根節(jié)點,所有結(jié)點都有唯一的前驅(qū)結(jié)點
對每個結(jié)點有0到任意個后繼的結(jié)點
概念例題:
基本術(shù)語
1、祖先、雙親、孩子:A、B、E都是K的祖先,E是 K的雙親,K是E的孩子
2、結(jié)點的度:該結(jié)點的孩子個數(shù) 。比如A結(jié)點度數(shù)為3,D結(jié)點度數(shù)為3,F(xiàn)結(jié)點度數(shù)為0
樹的度: 樹中結(jié)點的最大度數(shù),這棵樹的度為3
3、分支結(jié)點(非終端結(jié)點):度大于0的結(jié)點(有孩子的)
葉子結(jié)點(終端結(jié)點):度數(shù)為0的結(jié)點
兄弟:有相同雙親的結(jié)點 例如K和L
4、深度、高度,都是這個樹最大的層數(shù),這個樹的深度和高度都是4,不過深度是從高往低,高度是從低往高
5、有序樹、無序樹 對于這顆樹的各子樹,從左到右是有次序的,稱之為有序樹 ,否則是無序樹,這里是有序樹
6、路徑、路徑長度
有向邊,比如A到K A-B-E-K 有幾條邊路徑長度就是多少,這里是3
樹的性質(zhì):
1、樹中的結(jié)點數(shù)等于所有結(jié)點的度數(shù)和+1(所有結(jié)點孩子個數(shù)和+根節(jié)點) 合 理
2、度為m的樹中第i層上至多有m^{(i-1)}個結(jié)點
1 1
2 m
3 m^2
3、高度為h的m叉樹至多有(m^{h}-1)/(m-1)個結(jié)點
(m叉樹其實表示每個結(jié)點都有m個后繼結(jié)點)
1+m+m^2+...+m^{h-1}
4、具有n個結(jié)點的m叉樹的最小高度為[log_{m}(n(m-1)+1]
根據(jù)(m^{h}-1)/(m-1)=n推導(dǎo)得來
概念例題
套公式
2、二叉樹
3、二叉樹的遍歷(必考、解答)
4、樹和森林
5、二叉排序樹
6、哈夫曼樹
圖
圖的應(yīng)用
查找
排序
aaa我真的不知道這個數(shù)據(jù)結(jié)構(gòu)為什么講得這么粗糙?。?/h3>
樹型結(jié)構(gòu)和圖結(jié)構(gòu)的基本區(qū)別就是“每個結(jié)點是否僅僅從屬一個直接上級”。而線性結(jié)構(gòu)和樹型結(jié)構(gòu)的基本區(qū)別是“每個結(jié)點是否僅僅有一個直接后繼”。
$$
線性 -(后繼) -樹型 -(上級)-圖
$$
四種基本存儲映射方法:順序、鏈接、索引、散列
順序存儲結(jié)構(gòu)稱為緊湊存儲結(jié)構(gòu),其緊湊性是指它的存儲空間除了存儲有用數(shù)據(jù)外,沒有用于存儲其他附加的信息
利用指針,在結(jié)點的存儲結(jié)構(gòu)中附加指針字段稱為鏈接法。兩個結(jié)點的邏輯后繼關(guān)系可以用指針的指向來表達
對于經(jīng)常增刪結(jié)點的復(fù)雜數(shù)據(jù)結(jié)構(gòu),順序存儲往往會遇到困難,鏈接方法結(jié)合new動態(tài)存儲為這些復(fù)雜問題提供了解決方法
索引方法是要建造一個由整數(shù)域Z映射到存儲地址域D的函數(shù)Y:ZàD,把結(jié)點的整數(shù)索引值 z∈Z映射到結(jié)點的存儲地址 d∈D 。它稱為索引函數(shù),一般而言它并不象數(shù)組那樣,是簡單的線性函數(shù)。
索引方法在程序設(shè)計中是一種經(jīng)常使用的方法,其主要原因是對于非順序的存儲結(jié)構(gòu)來說,使用索引表是快速地由整數(shù)索引值找到其對應(yīng)數(shù)據(jù)結(jié)點的唯一方法
隊列
不能操作中間,只能操作兩頭 head tail (先進先出First In First Out ,FIFO原則)
解密碼
#include <cstdio> int main() { int q[102] = {0, 6, 3, 1, 7, 5, 8, 9, 2, 4}, head, tail; int i; // 初始化隊列 head = 1; tail = 10; // 隊列中已經(jīng)有9個元素了,tail指向隊尾的后-一個位置 while (head < tail) // 當隊列不為空的時候執(zhí)行循環(huán) // 打印隊首并將隊首出隊 { printf("8d", q[head]); head++; // 先將新隊首的數(shù)添加到隊尾 q[tail] = q[head]; tail++; // 再將隊首出隊 head++; } return 0; }
棧
插入和刪除只能在一邊 ,后進先出(LIFO),即最后插入的元素會最先被取出
判斷回文數(shù) 用棧的思想
#include <stdio.h> #include <string.h> int main() { char a[101], s[101]; int i, len, mid, next, top; gets(a); // 讀入- 行字符串 len = strlen(a); // 求字符串的長度 mid = len / 2 - 1; // 求字符串的中點 top = 0; // 棧的初始化 // 將mid前的字符依次入棧 for (i = 0; i <= mid; i++) s[++top] = a[i]; // 判斷字符串的長度是奇數(shù)還是偶數(shù),并找出需要進行字符匹配的起始下標 if (len % 2 == 0) next = mid + 1; else next = mid + 2; // 開始匹配 for (i = next; i <= len - 1; i++) { if (a[i] != s[top]) break; top--; } // 如果top的值為0,則說明棧內(nèi)所有的字符都被一-匹配了 if (top == 0) printf("YES"); else printf("NO"); return 0; }
隊列+棧的綜合運用
紙牌游戲 跑火車
#include <stdio.h> struct queue // 先用一個結(jié)構(gòu)體來實現(xiàn)隊列 隊列儲存手牌 { int data[1000]; // head 與tail 都是索引數(shù) int head; int tail; }; struct stack // 再用一個結(jié)構(gòu)體來實現(xiàn)棧 公共牌堆 棧存放公共牌堆 { int data[10]; int top; }; int main() { struct queue q1, q2; struct stack s; int book[10]; int i, t; // 初始化隊列 q1.head = 1; q1.tail = 1; q2.head = 1; q2.tail = 1; // 初始化棧 s.top = 0; // 初始化標記數(shù)組,標記已經(jīng)在桌上的牌 for (int i = 1; i <= 9; i++) { book[i] = 0; } // 一次插6個數(shù) // A的六張牌 for (int i = 1; i <= 6; i++) { scanf("%d", &q1.data[q1.tail]); q1.tail++; } // B的六張牌 for (int i = 1; i <= 6; i++) { scanf("%d", &q2.data[q2.tail]); q2.tail++; } while (q1.head < q1.tail && q2.head < q2.tail) { t = q1.data[q1.head]; // A出牌 // 判斷A當前打出的牌是否能贏?! if (book[t] == 0) // 表明桌上沒有牌面為t的牌 { // 沒有贏牌 q1.head++; // A已經(jīng)打出一張牌,所以將手牌出隊 s.top++; s.data[s.top] = t; // 將打出的手牌放在公共牌堆 入棧 book[t] = 1; // 標記桌上現(xiàn)在已有的牌面為t的牌 } else { // A此輪可以贏牌 q1.head++; // A已經(jīng)打出手牌,所以還是要將手牌出隊 q1.data[q1.tail] = t; // 緊接著把打出的牌放到手中牌的末尾 q1.tail++; while (s.data[s.top] != t) // 將公共牌堆中能贏A的牌出棧,并放入手牌的隊尾 { book[s.data[s.top]] = 0; // 取消標記 q1.data[q1.tail] = s.data[s.top]; // 依次進入隊尾 q1.tail++; s.top--; // 棧少了牌,棧頂-1 } } t = q2.data[q2.head]; // B 出牌 類似的 if (book[t] == 0) // 表明桌上沒有牌面為t的牌 { // 沒有贏牌 q2.head++; // B已經(jīng)打出一張牌,所以將手牌出隊 s.top++; s.data[s.top] = t; // 將打出的手牌放在公共牌堆 入棧 book[t] = 1; // 標記桌上現(xiàn)在已有的牌面為t的牌 } else { // B此輪可以贏牌 q2.head++; // B已經(jīng)打出手牌,所以還是要將手牌出隊 q2.data[q2.tail] = t; // 緊接著把打出的牌放到手中牌的末尾 q2.tail++; while (s.data[s.top] != t) // 將公共牌堆中能贏A的牌出棧,并放入手牌的隊尾 { book[s.data[s.top]] = 0; // 取消標記 q2.data[q2.tail] = s.data[s.top]; // 依次進入隊尾 q2.tail++; s.top--; // 棧少了牌,棧頂-1 } } } if (q2.head == q2.tail) { printf("A-win\n"); printf("A's Card Are:"); for (int i = q1.head; i <= q1.tail - 1; i++) { printf(" %d", q1.data[i]); } if (s.top > 0) { printf("Left Cards Are:"); for (int i = 1; i <= s.top; i++) { printf(" %d", s.data[i]); } } else { printf("\n No Left Card"); } } return 0; }
線性表(包括鏈表、順序表) 任何地方都可以操作
順序表和鏈表都是線性表的一種實現(xiàn)方式,它們之間存在一些區(qū)別。
定義:順序表是按照元素在內(nèi)存中的存儲順序進行訪問的線性表,而鏈表是由一系列節(jié)點組成的線性表,每個節(jié)點包含一個數(shù)據(jù)域和一個指針域,用于指向下一個節(jié)點。
存儲方式:順序表通常使用數(shù)組來存儲元素,而鏈表則使用指針來鏈接各個節(jié)點。
插入和刪除操作:順序表的插入和刪除操作可以在任意位置進行,時間復(fù)雜度為O(n),而鏈表的插入和刪除操作需要遍歷鏈表,時間復(fù)雜度為O(n)。但是,鏈表可以通過跳轉(zhuǎn)指針等技術(shù)來實現(xiàn)O(1)時間復(fù)雜度的插入和刪除操作。
查找操作:順序表的查找操作可以在任意位置進行,時間復(fù)雜度為O(n),而鏈表的查找操作需要從頭節(jié)點開始遍歷鏈表,最壞情況下時間復(fù)雜度為O(n)。但是,鏈表可以通過哈希表等技術(shù)來實現(xiàn)O(1)時間復(fù)雜度的查找操作。
空間利用率:順序表的空間利用率較高,因為它只需要存儲元素本身,而不需要額外的空間來存儲指針。而鏈表的空間利用率較低,因為它需要額外的空間來存儲指針。
另外(順序表一旦生成,它的空間是無法釋放的。因為順序表通常使用數(shù)組來存儲元素,而數(shù)組的大小是固定的,一旦創(chuàng)建就不能更改。如果需要釋放順序表占用的空間,可以通過將數(shù)組中的所有元素置為0或者刪除整個數(shù)組來實現(xiàn)。但是這樣做會導(dǎo)致數(shù)據(jù)的丟失,因此在實際應(yīng)用中需要謹慎處理。
相比之下,鏈表是一種動態(tài)的數(shù)據(jù)結(jié)構(gòu),它可以在運行時動態(tài)地分配和釋放內(nèi)存空間。因此,鏈表的空間利用率更高,但也更容易出現(xiàn)內(nèi)存泄漏等問題。在使用鏈表時需要注意及時釋放不再使用的節(jié)點所占用的內(nèi)存空間,以避免內(nèi)存泄漏的發(fā)生。)
鏈表算法的關(guān)鍵要點:新增結(jié)點先連接到原來鏈表目的地后,在從鏈表某個結(jié)點連回新增結(jié)點?!
鏈表
遞歸是調(diào)用自己 迭代是循環(huán)
lists 線性表
鏈表多開空間來開一個指針
queues 隊列
棧 stacks
棧和隊列都是線性表的特殊形式
數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)是計算機科學(xué)和編程領(lǐng)域的基礎(chǔ)之一。以下是一個合理的學(xué)習(xí)順序,以及一些可能的重難點,供您參考:
-
數(shù)組 (Arrays):
-
學(xué)習(xí)如何聲明、初始化和訪問數(shù)組。
-
理解數(shù)組的時間復(fù)雜度和空間復(fù)雜度。
-
理解多維數(shù)組和數(shù)組的應(yīng)用場景。
-
-
鏈表 (Linked Lists):
-
理解單鏈表、雙鏈表和循環(huán)鏈表的概念。
-
學(xué)習(xí)插入、刪除和搜索鏈表中的元素。
-
掌握鏈表的時間復(fù)雜度和空間復(fù)雜度。
-
-
棧 (Stacks) 和隊列 (Queues):
-
了解棧的特性(LIFO)和隊列的特性(FIFO)。
-
學(xué)習(xí)如何使用棧和隊列解決問題,例如括號匹配、表達式求值等。
-
理解遞歸與棧的關(guān)系。
-
-
樹 (Trees):
-
學(xué)習(xí)二叉樹和二叉搜索樹 (BST) 的概念。
-
掌握樹的遍歷算法,包括前序、中序和后序遍歷。
-
理解平衡二叉樹 (AVL) 和紅黑樹 (Red-Black Tree) 的平衡性質(zhì)。
-
-
圖 (Graphs):
-
了解圖的基本概念,包括節(jié)點、邊、有向圖和無向圖。
-
學(xué)習(xí)圖的表示方式,如鄰接矩陣和鄰接表。
-
掌握圖的遍歷算法,如深度優(yōu)先搜索 (DFS) 和廣度優(yōu)先搜索 (BFS)。
-
理解拓撲排序和最短路徑算法(Dijkstra、Bellman-Ford)。
-
-
散列表 (Hash Tables):
-
學(xué)習(xí)散列函數(shù)的作用和設(shè)計。
-
理解碰撞解決方法,如鏈表法和開放地址法。
-
掌握散列表的時間復(fù)雜度分析。
-
-
堆 (Heaps) 和優(yōu)先隊列 (Priority Queues):
-
了解堆的性質(zhì),如最小堆和最大堆。
-
學(xué)習(xí)堆排序算法。
-
掌握優(yōu)先隊列的應(yīng)用,如最小優(yōu)先隊列和最大優(yōu)先隊列。
-
-
高級數(shù)據(jù)結(jié)構(gòu):
-
學(xué)習(xí)樹的高級變種,如B樹、紅黑樹、Trie樹等。
-
了解哈夫曼樹和最小生成樹算法(Prim和Kruskal)。
-
掌握高級數(shù)據(jù)結(jié)構(gòu)的應(yīng)用場景。
-
-
動態(tài)規(guī)劃 (Dynamic Programming):
-
學(xué)習(xí)動態(tài)規(guī)劃的基本思想。
-
解決經(jīng)典問題,如斐波那契數(shù)列、最長公共子序列等。
-
理解動態(tài)規(guī)劃的時間復(fù)雜度和空間復(fù)雜度。
-
-
高級算法和數(shù)據(jù)結(jié)構(gòu):
-
學(xué)習(xí)字符串匹配算法,如KMP和Boyer-Moore。
-
掌握圖算法,如最大流算法和最小割算法。
-
了解分治算法、貪心算法和回溯算法。
-
難點通常在于對特定數(shù)據(jù)結(jié)構(gòu)和算法的理解和實現(xiàn),以及對它們的復(fù)雜度分析。動態(tài)規(guī)劃、高級圖算法和高級數(shù)據(jù)結(jié)構(gòu)可能會更具挑戰(zhàn)性。建議您在學(xué)習(xí)過程中多做練習(xí)和實際項目,以鞏固所學(xué)知識。不要忘記查閱相關(guān)的文檔和教材,以便更深入地理解這些概念和技術(shù)。
樹
滿二叉樹:
只要有內(nèi)部節(jié)點,就是兩個 分支結(jié)點+1=葉結(jié)點=內(nèi)部結(jié)點+1
分支結(jié)點=內(nèi)部結(jié)點
完全二叉樹:
盡量從左往右滿的
二叉樹 編碼 很重要
散列
桶思想
一 一 匹配 間隔匹配 等等思路
計算機系統(tǒng)
深入理解計算機系統(tǒng) 從底到高 第一注意抽象 第二不要把硬件軟件對立而談
計算機系統(tǒng):重要的事情:只要給不同計算機足夠時間,理論上都可以實現(xiàn)相同的事情;計算機將自然語言通過自上到下七個層次轉(zhuǎn)換成計算機能理解的東西
從上而下是 問題 算法 程序 isa指令集 微結(jié)構(gòu) 邏輯電路(晶體管) 器件
學(xué)習(xí)路徑是從下往上 從硬件到軟件 從器件到程序以上就不講了
補碼
的主要特點是,正數(shù)的補碼表示與其二進制表示相同,而負數(shù)的補碼表示通過將正數(shù)的補碼按位取反,然后加 1 來得到。這種表示方法使得在計算機硬件中可以使用相同的加法器來執(zhí)行正數(shù)和負數(shù)的加法,從而簡化了運算。
無符號乘法
也簡單,部分乘然后按位相加 移位相加,最后的積為A和Q
n位二進制范圍
有符號 表示 2^(n-1) 到 (2^(n-1))-1
00=0 01=1 10=-2 11=-1
000=0 001=1 010=2 011=3 100=-4 101=-1 110=-2 111=-3
三碼
-
原碼(Sign-and-Magnitude):
-
最高位表示符號,0表示正數(shù),1表示負數(shù)。
-
其余位表示數(shù)值的絕對值。
-
例如,+5的原碼是00000101,-5的原碼是10000101。
-
-
反碼(Ones' Complement representation):
-
最高位表示符號,0表示正數(shù),1表示負數(shù)。
-
正數(shù)的反碼與原碼相同。
-
負數(shù)的反碼是對其絕對值的每一位取反。
-
例如,+5的反碼是00000101,-5的反碼是11111010。
-
-
補碼(Two's Complement representation):
-
最高位表示符號,0表示正數(shù),1表示負數(shù)。
-
正數(shù)的補碼與原碼相同。
-
負數(shù)的補碼是對其絕對值的每一位取反,然后加1。
-
例如,+5的補碼是00000101,-5的補碼是11111011。u
-
區(qū)別:
-
原碼、反碼和補碼都有符號位,但它們對負數(shù)的表示方法不同。
-
反碼和補碼都可以表示0,而原碼有兩個不同的表示,+0和-0。
-
補碼是最常用的有符號整數(shù)表示法,因為它在加法和減法操作中更方便,負數(shù)的補碼可以通過取反和加1來獲得,這使得加法和減法的實現(xiàn)更為簡單。
在計算機中,通常使用補碼來表示有符號整數(shù),因為它在算術(shù)運算中更加方便和一致。反碼和原碼雖然有其理論上的意義,但在實際計算中較少使用。
易:將十進制數(shù)轉(zhuǎn)換成n位二進制某碼形式
難:將n位二進制某碼轉(zhuǎn)換回十進制
操作術(shù)語
AND 交
OR 并
NOT按位取反
XOR異或(相同0,不同1)
小數(shù) 二進制?
101000.101=40.625
$$
2^{ - 1} 2^{-2} 2^{-3}這樣算
$$
并非所有小數(shù)都能轉(zhuǎn)換成二進制
IEEE原則表示一個float數(shù) 使用二進制
先把一個十進制數(shù)轉(zhuǎn)換成二進制數(shù)
再把這種二進制數(shù)用科學(xué)計數(shù)法形式表示
最后把科學(xué)計數(shù)法表示的二進制數(shù)轉(zhuǎn)化成IEEE原則float儲存在計算機里
$$
符號位+(0/1) 指數(shù)位(8位 數(shù)據(jù)-二進制的127(0111|1111)為實際指數(shù)) +尾數(shù)位
$$
例如120.5 轉(zhuǎn)化成(無符號)111 1000.1 -》 1.111000x2^6
符號位0
八位指數(shù)部分要加上0111|1111,也就是用2進制的6(0000|0110)來加 127 = 1000|0101
最后尾數(shù)部分照著寫 1110 0000 0000 0000 0000 000 共23位
1+8+23 =32位
ans=0 1000 0101 1110 0000 0000 0000 0000 000
32位IEEE浮點數(shù)的8位指數(shù)位不能全為0也不能全為1,規(guī)定的
指數(shù)位能表示的范圍是(無符號的情況下是1-254) -127后變成 -126-127
用于表示-127的0000 0000被用來表示subnormal number了,
而用于表示128的1111 1111被用來表示non-number了.
所以實際上32位浮點數(shù)的指數(shù)部分只能取到只能取到[-126, 127]
指數(shù)部分全為1 兩種情況 尾數(shù)全為0 == 正無窮 尾數(shù)不全為0== NaN 不是一個數(shù)
十六進制
最高位0-7為正數(shù) 8-f為負數(shù) 為什么
有些是0x開頭 有些是x開頭?
不區(qū)分大小寫
以上第二章總結(jié):
整數(shù)表示 有符號 無符號 原碼 反碼 補碼
IEEE 32位浮點數(shù) 有個問題 不能表示0附近很小的數(shù)
浮點數(shù)加減容易產(chǎn)生誤差 因為需要小數(shù)點對齊?
表達漢字的辦法!!
區(qū)位碼的十六進制表示+2020H=國標碼(交換碼)
國標碼+8080H=機內(nèi)碼
當時保留了ascii碼的前幾個字符 所以加上了2020H
國標碼又加上3473H的原因:將高位賦1??
第三章:邏輯電路
晶體管 我們專業(yè)最底層
金屬氧化物半導(dǎo)體 MOS
晶體管越多
LC-3
一般pMOS接高電壓 nMOS接地
MOS管 有n型 n型(高壓導(dǎo)通) 和p型(無壓導(dǎo)通)
p型有一個圈 表示反
n型是高電壓連接,低電壓斷開
p型相反
邏輯電路里 2.9v左右視為高電壓 為1
低電壓視為0
接地是0
構(gòu)建邏輯門電路
實現(xiàn)邏輯函數(shù)的CMOS電路稱為“邏輯門電路”
邏輯門的前提是CMOS電路??! 要同時包含nMOS和pMOS
#
非門
換個思路
其實改變晶體管不就是改變二進制的00 01 10 11 ,然后再把結(jié)果轉(zhuǎn)化成需要的東西
或非門
或門
比較復(fù)雜 ,機器通過或非門和非門連接以達到效果
或非門的輸出連接到非門的輸入
與非門
并聯(lián)
與門
同理 與非門+非門
與門與或門的轉(zhuǎn)化
在輸入端加反
以后的簡化表示法
與門是子彈(有平的部分) 或門是箭頭
運算后還應(yīng)有儲存
3.1-3.2 3.4-3.9
3.13 .15 .23 .25
匯編語言與編譯器有關(guān) 不同編譯器的語法有區(qū)別
組合邏輯電路
譯碼器
輸出有且僅有一個為1,可以通過結(jié)果反推輸入
結(jié)果單一 ,但可通過出結(jié)果的位置定不同情況的輸入
多路復(fù)用器(用于選擇)
包含與門和或門
根據(jù)不同輸入定結(jié)果,輸入是多變的,輸出也是多變的
$$
N個選擇線,2^n個輸入,1個輸出,輸入用AND,輸出用OR
$$
-
全加器
包含與門和或門
從真值表入手
儲存單元
R-S鎖存器
門控D鎖存器
寄存器
時序邏輯電路
Q
1111 1111 八位 二進制既可以表示-127也可以表示-0嗎?
原碼-127 反碼-0 補碼-1
數(shù)據(jù)庫MYSQL
整體難點
3章關(guān)系模型
5關(guān)系數(shù)據(jù)庫標準語言SQL
7關(guān)系數(shù)據(jù)庫理論
8數(shù)據(jù)庫系統(tǒng)的設(shè)計
第一章
重點
基本概念;數(shù)據(jù)庫、DBMS(database management system)
NOSQL和NewSQL都是數(shù)據(jù)庫的類型,但是它們有一些區(qū)別。NOSQL是泛指非關(guān)系型數(shù)據(jù)庫,主要代表有MongoDB、Redis、CouchDB等。而NewSQL則是一種新方式的關(guān)系數(shù)據(jù)庫,意在整合RDBMS所提供的ACID事務(wù)特性(即原子性、一致性、隔離性和可持久性),以及NoSQL提供的橫向可擴展性 。
云數(shù)據(jù)庫是一種基于云計算技術(shù)的數(shù)據(jù)庫服務(wù),它可以提供更高效、更可靠、更安全的數(shù)據(jù)處理和管理服務(wù)。
因此,NOSQL NewSQL 云數(shù)據(jù)庫都屬于云數(shù)據(jù)庫的一種類型。
數(shù)據(jù)庫系統(tǒng)的三級模式結(jié)構(gòu)
外模式 (用戶級數(shù)據(jù)庫) 局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述
模式(概念級數(shù)據(jù)庫)全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述
內(nèi)模式(物理級數(shù)據(jù)庫)數(shù)據(jù)物理結(jié)構(gòu)和儲存結(jié)構(gòu)的描述
名詞解釋
Database (DB):長期存儲在計算機內(nèi)、有組織的、統(tǒng)一管理的相關(guān)數(shù)據(jù)的集合。
數(shù)據(jù)庫管理系統(tǒng):DataBase Management System (DBMS)是位于用戶與操作系統(tǒng)之問的一層數(shù)據(jù)管理軟件.
數(shù)據(jù)庫系統(tǒng) (DataBase System):是采用數(shù)據(jù)庫技術(shù)的計算機系統(tǒng)。
DBA 數(shù)據(jù)庫管理員 DataBase Adminisrator
外模式(External Schema)也稱子模式或用戶模式,是把現(xiàn)實世界中的信息按照不同用戶的觀點抽象為多個邏輯數(shù)據(jù)結(jié)構(gòu),每個邏輯結(jié)構(gòu)稱為一個視圖,描述了每個用戶關(guān)心的數(shù)據(jù),即數(shù)據(jù)庫用戶看見和使用的局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述。
?模式(Schema)也稱概念模式或邏輯模式,它是數(shù)據(jù)庫中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述。
內(nèi)模式(Internal Schema)也稱存儲模式,它是數(shù)據(jù)物理結(jié)構(gòu)和存儲結(jié)構(gòu)的描述。
外模式到模式的映射:定義了該外模式與模式之間的對應(yīng)關(guān)系。當模式改變時,由數(shù)據(jù)庫管理系統(tǒng)對各個外模式/模式的映射作相應(yīng)改變,可以使外模式保持不變,從而應(yīng)用程序不必修改,保證了數(shù)據(jù)的邏輯獨立性.
模式到內(nèi)模式的映射:定義了數(shù)據(jù)全局邏輯結(jié)構(gòu)與存儲結(jié)構(gòu)之問的對應(yīng)關(guān)系。當數(shù)據(jù)庫的存儲結(jié)構(gòu)改變了,由數(shù)據(jù)庫管理系統(tǒng)對模式/內(nèi)模式映射作相應(yīng)改變,可以使模式保持不變,從而保證了數(shù)據(jù)的物理獨立性。
使用數(shù)據(jù)庫系統(tǒng)的好處
可以高效且條理分明地存儲數(shù)據(jù),使人們能夠更加迅速和方便地管理數(shù)據(jù)。數(shù)據(jù)庫可結(jié)構(gòu)化存儲大量的數(shù)據(jù)信息,方便用戶進行有效的檢索和訪問 。此外,數(shù)據(jù)庫可有效地保持數(shù)據(jù)信息的一致性、完整性,降低數(shù)據(jù)冗余,使得儲存數(shù)據(jù)所占用的空間較少。
數(shù)據(jù)管理技術(shù)的發(fā)展過程
人工管理數(shù)據(jù)階段、文件管理數(shù)據(jù)階段和數(shù)據(jù)庫管理階段 .
在人工管理階段,數(shù)據(jù)主要存儲在紙帶、磁帶等介質(zhì)上,或者直接通過手工來記錄。
文件系統(tǒng)是一種將數(shù)據(jù)組織成文件的方式,每個文件都有自己的元數(shù)據(jù)和地址空間。文件系統(tǒng)提供了一種獨立于應(yīng)用程序的數(shù)據(jù)訪問方式,但是由于文件系統(tǒng)不支持多用戶同時訪問同一個文件,因此它不能滿足多個用戶對同一組數(shù)據(jù)進行訪問的需求。
數(shù)據(jù)庫管理系統(tǒng)(DBMS)是一種專門用于管理數(shù)據(jù)庫的軟件系統(tǒng)。DBMS提供了一種統(tǒng)一的數(shù)據(jù)訪問方式,使得多個用戶可以同時訪問同一個數(shù)據(jù)庫中的數(shù)據(jù)。DBMS還提供了一定程度的并發(fā)控制機制,以保證多個用戶之間不會發(fā)生沖突。DBMS是現(xiàn)代企業(yè)信息化建設(shè)中不可或缺的一部分 。
文件系統(tǒng)的缺點
1)松散包裝,關(guān)系映射中沒有ACID(原子性,一致性,隔離性,持久性)操作,這意味著無法保證數(shù)據(jù)的完整性和一致性;
2)安全性低,由于文件可以保存在用戶應(yīng)該提供寫入權(quán)限的文件夾中,因此很容易出現(xiàn)安全問題并引發(fā)麻煩,例如黑客攻擊;
3)不適合大規(guī)模數(shù)據(jù)存儲 。
在數(shù)據(jù)庫系統(tǒng)階段,數(shù)據(jù)管理的特點
數(shù)據(jù)結(jié)構(gòu)化:采用復(fù)雜的數(shù)據(jù)模型表示數(shù)據(jù)結(jié)構(gòu),使得不同數(shù)據(jù)之間的聯(lián)系得以表示和描述。
數(shù)據(jù)獨立性:數(shù)據(jù)獨立性較高,數(shù)據(jù)結(jié)構(gòu)分為用戶的局部邏輯結(jié)構(gòu)、整體邏輯結(jié)構(gòu)和物理結(jié)構(gòu)三級,使得應(yīng)用程序與數(shù)據(jù)之間的耦合度降低。
數(shù)據(jù)共享性:數(shù)據(jù)庫系統(tǒng)為用戶提供方便的用戶接口,可以使用查詢語言、終端命令或程序方式操作數(shù)據(jù),使得不同用戶能夠共享數(shù)據(jù)。
數(shù)據(jù)控制功能:數(shù)據(jù)庫系統(tǒng)提供數(shù)據(jù)控制功能,包括數(shù)據(jù)庫的恢復(fù)、并發(fā)控制、數(shù)據(jù)完整性和數(shù)據(jù)安全性,以保證數(shù)據(jù)庫中數(shù)據(jù)是安全的、正確的和可靠的。
靈活的數(shù)據(jù)操作:對數(shù)據(jù)的操作不一定以記錄為單位,還可以數(shù)據(jù)項為單位,增加了系統(tǒng)的靈活性。
總的來說,數(shù)據(jù)庫系統(tǒng)階段的數(shù)據(jù)管理具有結(jié)構(gòu)化、獨立性、共享性、控制功能和靈活性等特點。
文件系統(tǒng)和數(shù)據(jù)庫系統(tǒng)的聯(lián)系和區(qū)別
文件系統(tǒng)和數(shù)據(jù)庫系統(tǒng)都是用來管理數(shù)據(jù)的技術(shù),但是它們的應(yīng)用場景和使用方法都有所不同。
文件系統(tǒng)以文件為單位存儲數(shù)據(jù),而數(shù)據(jù)庫系統(tǒng)以記錄和字段為單位存儲數(shù)據(jù);
文件系統(tǒng)中的程序和數(shù)據(jù)有一定的聯(lián)系,而數(shù)據(jù)庫系統(tǒng)中的程序和數(shù)據(jù)分離;
文件系統(tǒng)用操作系統(tǒng)中的存取方法對數(shù)據(jù)進行管理,而數(shù)據(jù)庫系統(tǒng)用DBMS統(tǒng)一管理和控制數(shù)據(jù);文件系統(tǒng)實現(xiàn)以文件為單位的數(shù)據(jù)共享,而數(shù)據(jù)庫系統(tǒng)實現(xiàn)以記錄和字段為單位的數(shù)據(jù)共享 。
數(shù)據(jù)的物理獨立性
是指用戶的應(yīng)用程序與存儲在磁盤上的數(shù)據(jù)庫中數(shù)據(jù)是相互獨立的。當數(shù)據(jù)的物理存儲改變了,應(yīng)用程序不用改變。而數(shù)據(jù)的邏輯獨立性是指應(yīng)用程序與邏輯結(jié)構(gòu)相互獨立,邏輯結(jié)構(gòu)改變,應(yīng)用程序不用變 。
數(shù)據(jù)庫的三級模式結(jié)構(gòu)
是指數(shù)據(jù)庫系統(tǒng)是由外模式、模式和內(nèi)模式三級抽象模式構(gòu)成,這是數(shù)據(jù)庫系統(tǒng)的體系結(jié)構(gòu)或總結(jié)構(gòu)。其中,模式是數(shù)據(jù)庫中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,外模式是用戶能夠看見和使用的局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,內(nèi)模式是數(shù)據(jù)在數(shù)據(jù)庫內(nèi)部的表示方式 。
該結(jié)構(gòu)的好處
是可以使得用戶不必關(guān)心數(shù)據(jù)庫內(nèi)部的實現(xiàn)細節(jié),而只需要關(guān)注其所使用的數(shù)據(jù)即可。同時,該結(jié)構(gòu)也有利于保護數(shù)據(jù)庫的安全性,因為用戶可以針對不同層次的模式設(shè)置不同的訪問權(quán)限 。
數(shù)據(jù)庫系統(tǒng)的應(yīng)用架構(gòu)
有很多種,其中比較常見的有:單用戶結(jié)構(gòu)、主從式結(jié)構(gòu)、分布式結(jié)構(gòu)、客戶-服務(wù)器、瀏覽器應(yīng)用服務(wù)器/數(shù)據(jù)庫服務(wù)器等。
數(shù)據(jù)庫管理系統(tǒng)(DBMS)的主要功能
包括:1) 數(shù)據(jù)定義,提供數(shù)據(jù)定義語言DDL,供用戶定義數(shù)據(jù)庫的三級模式結(jié)構(gòu)、兩級映像以及完整性約束和保密限制等約束;2) 數(shù)據(jù)操縱,提供數(shù)據(jù)操作語言DML,供用戶實現(xiàn)對數(shù)據(jù)的追加、刪除、更新、查詢等操作;3) 數(shù)據(jù)庫的運行管理,包括多用戶環(huán)境下的并發(fā)控制、安全性檢查和存取限制控制、完整性檢查和執(zhí)行、運行日志的組織管理、事務(wù)的管理和自動恢復(fù),即保證事務(wù)的原子性 。
常用的數(shù)據(jù)庫管理系統(tǒng)
Oracle MySQL SQLite 高斯開源
第二章:信息的三種世界與數(shù)據(jù)模型
第三章:關(guān)系模型
-
超鍵(SuperKey):在一個關(guān)系中,可唯一地標識元組的一個屬性或?qū)傩约稀?/p>
-
候選鍵 (Candidate Key):能唯一標識一個關(guān)系的元組而又不含有多余的屬性的一個屬性或?qū)傩约稀?/p>
-
如果關(guān)系的全部屬性構(gòu)成關(guān)系的候選鍵,則稱為全鍵(All-Key)。
-
構(gòu)成候選鍵的諸屬性稱為主屬性(Prime Attribute)。
-
不包含在任意候選鍵中的屬性稱為非主屬性(Non-Prime Attribute)。
-
主鍵 (Primary Key/PK):有時一個關(guān)系中有多個侯選鍵,此時可以選擇一個作為插入,刪除或檢索元組的操作變量。被選用的候選鍵稱為主鍵。每一個關(guān)系都有一個并且只有一個主鍵。
-
外鍵(Foreign Key/FK):是指關(guān)系R中的屬性A不是關(guān)系R的主鍵,但A是另一個關(guān)系S的主鍵,則屬性A就是關(guān)系R的外鍵。其中R是參照關(guān)系,S是被參照關(guān)系。
-
外鍵在關(guān)系R中的取值有兩種可能:或為空值,或必須是被參照關(guān)系S中已有的屬性值。
-
外鍵值是否允許為空值,主要依賴于應(yīng)用環(huán)境的語義。
-
唯一鍵(UNIQUE KEY ):屬性取值為唯一的,但可以存空值
候選鍵一定是超鍵
外鍵
第一范式:關(guān)系數(shù)據(jù)庫中表的每一列(分量)都是不可分割的基本數(shù)據(jù)項(原子性),同一列中不能有多個值,即關(guān)系模型不允許含有多值屬性,并且屬性的類型必須是簡單類型
關(guān)系模型
選擇運算
$$
\sigma
$$
###
往往能選出一行 如下例子
投影運算
$$
\pi
$$
這個又能選出一列
連接運算
自然連接要注意! 表示兩者共有的屬性都要相等
分析過程:
先判斷有幾個屬性,相加列數(shù)即可,注意B同時出現(xiàn)再R和S,要用R.B和S.B進行區(qū)分
第一個R與S (C<E)的連接運算 找到C<E的運算即可 (笛卡爾積)
第二個R與S(R.B=S.B)的連接運算,找到對應(yīng)相等的即可
第三個 由于兩者共有元素位B 所以跟第二個一樣,自然運算同樣也是笛卡爾積 注意了
總結(jié):
$$
\pi是查找信息(最后返回的目標),\sigma是判斷的目標
$$
公式解釋
$$
\pi_{要查的對象}(\sigma_{要判斷屬性的條件,比如pid='p01'}(表的范圍))
$$
某個元素的象集,就是含有這個元素 的其他元素組成的集合 例如這里ABC的a1的象集,{(b1,c2),(b2,c3),(b2,c1)}
每一步運算盡量保證唯一性,
因為多余的屬性會造成干擾,
如果直接將products自然連接orders后再自然連接customers 會導(dǎo)致city成為除了id之外的第二限制,即最終得到的結(jié)果除了cid相同,city也是相同的,這是多余的條件
寫作這種類型的思路:
關(guān)鍵信息 :沒有 產(chǎn)品p02 顧客編號 姓名
所有的顧客的cid和cname 用投影暫存 ;
$$
\pi_{cid,cname}(Customers)-\pi_{cid,cname}(\sigma_{pid='p02'}(Orders\infty Customers))
$$
思路(找共同點 然后求同存異 ) 被除數(shù)很重要 既要瞻前又要顧后
拓展的關(guān)系代數(shù)運算
運用
練習(xí):外連接 左外連接 右外連接 有幾個 10個 D
第四章:MYSQL上機
第四章重難點
##
創(chuàng)建數(shù)據(jù)庫
利用圖形可視化工具 新建即可
利用SQL語句 --在文件里 create database name;
快捷鍵:ctrl+enter==啟動
備份數(shù)據(jù)庫
用可視化工具
用 data export
用SQL語言
轉(zhuǎn)到mysqldump.exe所在文件夾 打開后
cmd
mysqldump -u root -p mysqlname >path
數(shù)據(jù)庫的導(dǎo)入
圖形化工具
data import
sql語言
mysql -u root -p databasename< path
MySQL的管理工具
1-5、DBCBA
MySQL的組件結(jié)構(gòu)
連接層、Server層和引擎層
連接層
連接器
Server層
查詢緩存
分析器
優(yōu)化器
執(zhí)行器
###
引擎層
第五章 關(guān)系數(shù)據(jù)庫標準語言——SQL
第五章重點:
-
SQL的數(shù)據(jù)查詢
-
視圖、索引
-
SQL的數(shù)據(jù)控制功能
-
存儲過程
-
函數(shù)
難點:
-
關(guān)系除法轉(zhuǎn)換為SQL
SQL概述
windows中,關(guān)鍵字是不區(qū)分大小寫的,而在LINUX系統(tǒng)中是要區(qū)分的
數(shù)據(jù)查詢:SELECT
數(shù)據(jù)定義:CREATE,DROP,ALTER
數(shù)據(jù)操縱:INSERT,UPDATAE,DELETE
數(shù)據(jù)控制:GRANT,REMOVE
SQL語言的基本概念
1、數(shù)據(jù)類型
(1)系統(tǒng)數(shù)據(jù)類型
-
定點類型
-
浮點類型
-
位值類型
-
日期和時間類型
-
字符串類型
-
enum類型
-
SET類型
2、表達式
3、運算符
<=>MySQL特有的,相當于等號, 與一般的等號區(qū)別在,這個<=>可以讓空值與空值作比較
SQL中是三值邏輯 ,除了真假還有第三值unknown
在SQL語言中,邏輯真值除了真和假,還有第三個值unknown,因此這種邏輯體系被稱為三值邏輯。在三值邏輯中,NULL表示缺失的值或遺漏的未知數(shù)據(jù),不是某種具體類型的值。數(shù)據(jù)表中的NULL值表示該值所處的字段為空,值為NULL的字段沒有值。
4、SQL語法規(guī)則與規(guī)定
SQL的數(shù)據(jù)定義功能
SQL的數(shù)據(jù)定義語句主要包括
-
創(chuàng)建數(shù)據(jù)庫
-
創(chuàng)建表
-
創(chuàng)建視圖
-
創(chuàng)建索引
數(shù)據(jù)庫的創(chuàng)建和刪除
1、數(shù)據(jù)庫的創(chuàng)建
create database 數(shù)據(jù)庫名字
2、數(shù)據(jù)庫的刪除
drop datebase 數(shù)據(jù)庫名字
3、數(shù)據(jù)庫的還原
基本表的創(chuàng)建、修改、刪除
1、基本表的創(chuàng)建
#創(chuàng)建顧客表 create table customers{ cid nvarchar(255) not null primary key, cname nvarcharr(255), city nvarchar(255), [discnt]float, check([discnt]>0), }
#創(chuàng)建產(chǎn)品表 create table products{ pid nvarchar(255)not null, pname nvarchar(255), city nvarchar(255), quantity float, [price]float, primary key (pid), }
#創(chuàng)建代理商表agents create table agents{ aid nvarchar(255)not null, aname nvarchar(255), city nvarchar(255), [percent]float, primary key (aid), }
表的分類
創(chuàng)建表
基本操作
創(chuàng)建表的示例:
復(fù)制表
基本表結(jié)構(gòu)的修改
添加列
刪除列
表更名:
刪除約束
基本表的刪除
練習(xí)題:
選D
選B
SQL的數(shù)據(jù)查詢功能
簡單查詢
select * from customers; #表示查詢customers里面所有的數(shù)據(jù)
消除取值重復(fù)的行
加“distinct” 使得查詢的值是唯一的,去重
查詢需要計算的一步
totalqty==total quantity合計
先乘法后累加
常用的查詢條件
單個條件查詢
將關(guān)系代數(shù)表達成SQL語句
確定范圍
取等是BETWEEN MIN AND MAX
不取等是 NOT BETWEEN MIN AND MAX(但是是取兩邊?。。。?/p>
如果想不取等且取到中間,就用where 和 and 兩個判斷條件 爽
用where 連接條件
三值邏輯
這里值得一提的是,當city=NULL的時候,where not ()里面的返回值為空,不會包含進去,無論是where還是where not
多個條件查詢
抽象
AND運算
1>0>NULL
OR運算符
模糊查詢(有點類似瀏覽器檢索里的星號,這里是百分號)
%是0-任意個 類似于瀏覽器的‘*’檢索
_下劃線 是單個字符
轉(zhuǎn)義字符
有特殊字符的查詢肯定就有轉(zhuǎn)義字符 類似cpp
WHERE cname NOT LIKE '__\%% ';
第一個\%表示“%本身”,第二個“%”表示0-任意個數(shù)的字符
模糊搜索的代價
需要耗費更長的時間
\textcolor{yellow}{空值的處理}
用sql特有 <=> 來查詢NULL
聚合函數(shù)(關(guān)鍵字的運用)
*表示最長,這個有6行,count city表示數(shù)city數(shù)量,這個有5行
distinct city表示不同的city distinct 獨特的 關(guān)鍵字 之前用到過 有3行
Homework&備忘
備份 、加載數(shù)據(jù)庫的時候 語法 <“space” 這里想象有個箭在弦上,有個箭桿
$$
\pi_{Rname,Rno,Bno}(Reader\infin Borrow)\div \pi_{Bno}(\sigma_{Rno='R01'}(Reader\infin Borrow))
$$
$$
\pi_{Bno,Btitle,Bauthor,Bprice}(\sigma_{'數(shù)據(jù)庫'\subset Btitle}(Book)\cup \sigma_{price<50}(Book))
$$
概率論
全概率公式
給一個事件B,然后有很多個事件A1、A2、...、Ai來劃分全集。求P(B)。
可以用該公式,將P(B)轉(zhuǎn)化為在Ai下的條件概率,累加起來
貝葉斯公式
$$
P(A_{k}|B)={P(A_{k}B )\over P(B)}={P(A_k)P(B|A_k)\over \sum \limits_{i=1}^{n}P(A_i)P(B|A_i) } k=1,2,..,n={P(A_{k}B)\over \sum \limits_{i=1}^{n}P(A_{i}B)}k=1,2,...,n
$$
基本性質(zhì)和公式
德摩根律 長短杠、開口向都互換
$$
\eqalign{ & {\rm{P(}}\overline {{\rm{AB}}} {\rm{) = P(}}\overline A \cup \overline B {\rm{)}} \cr & {\rm{P(}}\overline {{\rm{A}} \cup {\rm{B}}} {\rm{) = P(}}\overline A \cap \overline B {\rm{)}} \cr}
$$
逆事件概率公式
$$
P(A) = 1 - P(\overline A )
$$
乘法公式
$$
p(ab)=p(a)*p(b|a)
$$
Addition formula
$$
P(A \cup B) = P(A) + P(B) - P(A \cap B)
$$
減法公式(事件差《概率差) 很合理
$$
P(A-B)=P(A)-P(AB)
$$
全概率公式--將復(fù)雜事件的概率求解問題轉(zhuǎn)化
貝葉斯公式(逆概率公式):意義:在已知一些先驗條件下,對一個新事件的后驗概率進行求解
集合概率 典 兩船??看a頭,甲x停1h ,乙y停2h,問晝夜兩船停靠沖突的概率
思路:0-24h構(gòu)建平面直角坐標系,第一象限正方形,0《x-y《1 或者 0《y-x《2; 幾何面積
重要問題
概率為0推不到事件是不可能的(打靶) 但不可能事件可推概率0
$$
P(AB)=0 \Leftarrow AB=\emptyset右推左可,左推右不行
$$
可以推的(用逆事件概率公式和德摩根律進行變形)
$$
P(AB)=0 \Rightarrow{\rm{P(}}\overline {{\rm{AB}}} {\rm{) = 1}}\Rightarrow{\rm{P(}}\overline {\rm{A}} \cup \overline {\rm{B}} {\rm{) = 1}}
$$
同樣 概率為1推不到事件是全集 但全集可推概率1
$$
{\rm{P(AB) = 1}} \Leftarrow {\rm{AB = }}\Omega右推左可,左推右不行
$$
標有1-n的球放入1-n的盒子,要保證所有盒子與球都沒有對上號,問概率?
總事件n! 結(jié)果是錯位排 如何數(shù)????????? 窮舉比較麻煩, 第二個盒子與第一個有關(guān),第三個又與前兩個有關(guān),所以不好做,于是轉(zhuǎn)換
假設(shè)Ai代表i號球的結(jié)果i=1,2......,n;(這是很重要的思路) 因為可以簡化運算
這個包含加法原理 性質(zhì) 德摩根律
思路和算法都不錯
##
常用公式
$$
P(A\overline B)=P(A)-P(AB)
$$
對于很多題都是把概率展開
概率的獨立性
定義
多個事件的獨立性
”至少有兩臺“
有三種表達方式
1、至少用并號表示,把所有兩個的不一樣的并起來A1A2并A1A3....
2、窮舉,全加起來 2個的 3個的 4個的
3、對立事件
事件內(nèi)部用交的符號
$$
P( \mathop ∩ \limits_{i=1}^{100}A_i)
$$
數(shù)學(xué)計算用大寫的pi
獨立重復(fù)實驗
隨機有放回地抽取3次==三重伯努利實驗
作業(yè)有一道題跟這個類似
先用全概率公式得到抽一件是損壞的概率,然后再根據(jù)獨立重復(fù)實驗,二項分布公式
系統(tǒng)可靠性問題
串并聯(lián) 串聯(lián) 并聯(lián) 有種重要思想:將未知轉(zhuǎn)換成已知
第二章 一維隨機變量及其分布
一、隨機變量及其分布函數(shù)的概念,性質(zhì)及其應(yīng)用
2、分布函數(shù)的概念及其性質(zhì)
F(x)必是某個x的分布函數(shù)的充要條件
分布函數(shù)的基礎(chǔ)例題:
第一步、等差數(shù)列 歸一性 d!=0
第二步,定義式,必寫,且范圍要注意
第三步,得到分布函數(shù)
(根據(jù)這個結(jié)果驗證性地解釋眾多性質(zhì))
$$
1、F(x)單調(diào)不減\\ 2、F(x)右連續(xù),F(xiàn)(a+0)=F(a)\\ 3、F(-\infin)=0,F(+\infin)=1
$$
3、分布概率的應(yīng)用——求概率
$$
P\{X≤a\}=F(a);\\ P\{X<a\}=F(a-0);這個需要理解\\ P\{X=a\}=F(a)-F(a-0);
$$
解釋:
1、互斥事件和的概率=概率的和
2、定義
3、理解
不取等就是取到左極限
二、常見的兩類隨機變量——離散型隨機變量和連續(xù)型隨機變量
1、離散型隨機變量機器概率分布
$$
$$
用互斥事件 事件來推概率
$$
(X\leq b ) = (a<X\leq b) + (X\leq a)
$$
$$
P\{a<X\leq b\}=P\{X\leq b\}-P\{X\leq a \}=F(b)-F(a)
$$
概率密度函數(shù)小f(x)一定是連續(xù) 但是大F(x)連續(xù)型隨機變量的分布函數(shù)不一定連續(xù)
f(x)可積,高等數(shù)學(xué)知識
1640
2、連續(xù)性隨機變量及其概率密度
三、常見的隨機變量分布類型
1、離散型
2、連續(xù)性
四、一維隨機變量函數(shù)的分布
1、概念
2、隨機變量函數(shù)的分布
數(shù)學(xué)實驗MATLAB
matlab作圖
繪制二維折線圖:
x = linspace(0, 2*pi, 100); % 生成 x 值范圍 y = sin(x); % 計算 y 值 plot(x, y, 'b-', 'LineWidth', 2); % 繪制藍色實線圖 xlabel('X軸標簽'); ylabel('Y軸標簽'); title('折線圖標題'); grid on; % 顯示網(wǎng)格繪制散點圖:
x = randn(100, 1); % 生成隨機 x 值 y = randn(100, 1); % 生成隨機 y 值 scatter(x, y, 'r', 'filled'); % 繪制紅色填充的散點圖 xlabel('X軸標簽'); ylabel('Y軸標簽'); title('散點圖標題'); grid on; % 顯示網(wǎng)格繪制柱狀圖:
x = categorical({'A', 'B', 'C', 'D'}); % 類別標簽 y = [10, 25, 15, 30]; % 高度 bar(x, y, 'FaceColor', 'm'); % 繪制品紅色柱狀圖 xlabel('X軸標簽'); ylabel('Y軸標簽'); title('柱狀圖標題'); grid on; % 顯示網(wǎng)格
繪制餅圖:
labels = {'A', 'B', 'C', 'D'}; % 數(shù)據(jù)標簽 sizes = [15, 30, 20, 35]; % 數(shù)據(jù)比例 explode = [0.1, 0, 0, 0]; % 引爆扇區(qū) pie(sizes, explode, labels); % 繪制餅圖 title('餅圖標題');繪制熱圖:
data = rand(10, 10); % 隨機數(shù)據(jù) imagesc(data); % 繪制熱圖 colorbar; % 添加顏色條 xlabel('X軸標簽'); ylabel('Y軸標簽'); title('熱圖標題');
解方程
一元三次方程求根公式 配方法
一元四次方程? 更加復(fù)雜
solve 解方程
dsolve 求解微分方程
求解非限定方程 和非限定方程組
作圖法
一元五次方程 求實根
line
ezplot 符號函數(shù)作圖?
axis可以用來限定圖例的大小
點迭代法求解方程
1、點迭代法的方程可以有無窮個
2、并非每個序列都收斂
3、如何修正序列 使其變得可以收斂 并且收斂地快
% 初始猜測值 x0 = 0.5; % 迭代函數(shù) g = @(x) cos(x); % 迭代次數(shù) maxIterations = 100; % 容忍誤差 tolerance = 1e-6; % 迭代過程 for i = 1:maxIterations x1 = g(x0); % 計算下一次近似解 % 檢查是否滿足收斂條件 if abs(x1 - x0) < tolerance disp(['迭代收斂到解: x = ', num2str(x1)]); break; end x0 = x1; % 更新近似解 end if i == maxIterations disp('達到最大迭代次數(shù)但未達到收斂條件'); end
% 初始猜測值 x0 = 1.0; % 迭代函數(shù) g = @(x) 2 * log(x^3 - x); % 迭代次數(shù) maxIterations = 100; % 容忍誤差 tolerance = 1e-6; % 迭代過程 for i = 1:maxIterations x1 = g(x0); % 計算下一次近似解 % 檢查是否滿足收斂條件 if abs(x1 - x0) < tolerance disp(['迭代收斂到解: x = ', num2str(x1)]); break; end x0 = x1; % 更新近似解 end if i == maxIterations disp('達到最大迭代次數(shù)但未達到收斂條件'); end
插值
一維插值(interp1)
1、最鄰近插值,就是四舍五入 1.014變成1.01
(改進)
函數(shù)值取二者的中點:1.014約等于(1.01+1.02)/2 (這里還存在假設(shè):原函數(shù)關(guān)系是線性的)
一般問題默認知道的信息越多,決策的精確度越高,部分情況不是這樣。
插值感覺跟擬合預(yù)測有點像S
2、分段線性插值,唯一的 ,相鄰兩點連成直線(這是一個分段函數(shù))
每一段的方程都可寫出(但是實際情況不可以寫這么多函數(shù),也沒有論文這樣做)
實踐中強調(diào)插值方法
(但這個表達式就不寫出了,論文中)
3、二維插值
interp2
求解微分方程
精確解 一階微分方程 dsolve
1、歐拉法
##
思路:連續(xù)問題離散化
引入自變量點列
$$
\{ x_n\}\rightarrow\{y_n\}
$$
$$
x\in [a,b] 將[a,b]等間隔劃分,步長為h
$$
$$
在x_0<x_1<x_2<...<x_n<...上求y(x_n)的近似值y_n通常取等步長h,即x_n=x_0+n*h 或x_n=x_{n-1}+h(n=1,2...)
$$
差商代替微商,delta->0時成立
算法比較:
1、理論分析 復(fù)雜度(與數(shù)值分析有關(guān))
2、算法復(fù)雜度 算力分析 將其提高一定高度 (利用測試庫)
一些常見的改進思路(取區(qū)間中點、減少步長、將不同算法的結(jié)果取平均值)
如果一味地改小步長,會導(dǎo)致收斂速度變慢,無法達到要求
向前歐拉公式和向后歐拉公式只有線性地收斂速度 過于慢了
2、龍格=庫塔法
用泰勒公式設(shè)計的
3、微分方程圖解法
函數(shù)曲線圖 (t,x)(t, y)
把 x 、y關(guān)聯(lián)在一起叫做相圖(x,y) 研究微分方程動力學(xué)、生態(tài)系統(tǒng) 之類的
高階微分方程
matlab里 高階微分方程必須等價地轉(zhuǎn)換成一階微分方程組
(不一定必須?)ode45
洛倫茲模型作相圖
插值
擬合
近似關(guān)系
求解非齊次線性方程組
數(shù)學(xué)建模
這個肯定跟數(shù)值分析離不開關(guān)系
馬原
《德意志意識形態(tài)》
首次系統(tǒng)闡明了歷史唯物主義的基本觀點
《共產(chǎn)黨宣言》
標志馬克思主義的公開問世
第一節(jié):世界的多樣性及物質(zhì)的統(tǒng)一性
事物的普遍聯(lián)系和變化發(fā)展
唯物辯證法是認識世界和改造世界的根本方法
世界多樣性與物質(zhì)統(tǒng)一性
1、物質(zhì)及其存在方式
1、世界觀及哲學(xué)的基本問題
2、物質(zhì)及物質(zhì)觀
3、物質(zhì)的存在方式。
2、物質(zhì)與意識的辯證關(guān)系
1、物質(zhì)決定意識、
2、意識對物質(zhì)的反作用
3、主觀能動性和客觀規(guī)律性的統(tǒng)一
4、意識與人工智能;
3、世界的物質(zhì)統(tǒng)一性
1、世界統(tǒng)一于物質(zhì)
2、人類社會本質(zhì)上是物質(zhì)
3、人的意識統(tǒng)一于物質(zhì)。
英語
"只 rather than“
雜項
改用戶名
在注冊表里面改了后
在user文件把名字再改一次 注意環(huán)境變量
開一個新賬號改
瀏覽器檢索技巧
減號
減號搜索,是想搜索的信息減去不想搜索的信息
格式:A -B(A和減號之間有空格)
雙引號
雙引號搜索法,搜索結(jié)果必須出現(xiàn)連續(xù)的文本A
格式:"A"(雙引號為英文狀態(tài))
星號
通配符——可代替任何文字
一般可以用來搜只記得一部分的成語、詩句,或者是一些描述廣泛的東西
格式:A * B
不必回首困倦
不同年齡追求的東西不同
markdown希臘字母
markdown 數(shù)學(xué)符號 :Markdown之數(shù)學(xué)符號 - 簡書 (jianshu.com)
MYSQL workbench 備份和導(dǎo)入的時候 會創(chuàng)建臨時文件,user文件內(nèi)不能有中文路徑
QT項目
23/7/17
回憶復(fù)習(xí)Qt基礎(chǔ)知識;
構(gòu)思并完善項目的模塊內(nèi)容:1、注冊和登陸界面2、與服務(wù)器連接保存注冊信息,驗證登陸信息3、登陸成功后跳轉(zhuǎn)客戶端界面4、客制化個人信息例如姓名頭像和添加好友功能5、初始化ip和端口并接入服務(wù)器6、聊天功能、私聊群聊7、傳輸簡單文本文件;
萬事開頭難,要做好一件事肯定是從框架入手,然后先趁著熱情高漲著手解決最難的問題。要了解我這個項目的框架不是一件容易的事情,一開始我是處于純新手的狀態(tài),已有的資源只有一個老版本和新版本的qt。根據(jù)老師上課講的框架,我再去問chatgpt,再加上我自己的構(gòu)思,最后得出一個初步框架,在后面學(xué)習(xí)過程中進一步找到共通的地方再添加?xùn)|西。
23/8/18
網(wǎng)絡(luò)通信
在實現(xiàn)即時通訊應(yīng)用程序時,你可以根據(jù)應(yīng)用的性質(zhì)和需求來選擇合適的協(xié)議。以下是關(guān)于選擇協(xié)議的一些建議:
TCP 協(xié)議:
適用場景:如果你的即時通訊應(yīng)用程序需要可靠的數(shù)據(jù)傳輸,確保消息的有序性和完整性,那么 TCP 協(xié)議可能是一個不錯的選擇。適用于需要確保消息不丟失和亂序的場景。
優(yōu)勢:提供可靠的數(shù)據(jù)傳輸,自動處理丟包、重發(fā)和順序問題。
注意:由于 TCP 的連接建立和關(guān)閉過程可能會引入一些延遲,對于特別強調(diào)實時性的應(yīng)用,可能需要額外的優(yōu)化。
UDP 協(xié)議:
適用場景:如果你的即時通訊應(yīng)用程序更注重實時性,允許一些消息的丟失或亂序,那么 UDP 協(xié)議可能更合適。適用于需要快速傳遞數(shù)據(jù)的實時應(yīng)用。
優(yōu)勢:速度較快,沒有連接建立和關(guān)閉過程,適用于實時性要求較高的場景。
注意:由于 UDP 不提供可靠性保證,你需要在應(yīng)用層處理消息的丟失和亂序問題。
混合方案:
你也可以在應(yīng)用程序中結(jié)合使用 TCP 和 UDP。例如,可以使用 TCP 來處理登錄、賬號管理等穩(wěn)定性較高的部分,而使用 UDP 來進行實時聊天消息的傳遞。
第三方庫和協(xié)議:
除了直接使用 TCP 或 UDP,還可以考慮使用一些專門用于即時通訊的第三方庫和協(xié)議,如 WebSocket、XMPP(Jabber)、MQTT 等。這些協(xié)議可能在實現(xiàn)即時通訊功能方面提供更多便利和性能優(yōu)化。
總之,選擇協(xié)議取決于你的應(yīng)用的實際需求。如果你的應(yīng)用更注重可靠性和數(shù)據(jù)完整性,可以考慮使用 TCP。如果你的應(yīng)用更注重實時性和速度,可以考慮使用 UDP。在做出決定之前,最好進行一些測試和實驗,以確定哪種協(xié)議最符合你的需求。
m_s= new QTcpServer(this); 創(chuàng)建一個m_s對象,this是他的父對象,父對
象析構(gòu)的時候 子對象也析構(gòu) 所以不用對子對象自己寫析構(gòu)
讓我們用一個類比來解釋這個例子中的
QTcpServer
、QTcpSocket
以及它們的作用,以便更好地理解它們在網(wǎng)絡(luò)通信中的功能。想象您在一個咖啡館里,
QTcpServer
就像是咖啡館的前臺,而QTcpSocket
則代表顧客和咖啡館之間的溝通通道。
QTcpServer(咖啡館的前臺):
想象您在一個咖啡館里,
QTcpServer
就相當于咖啡館的前臺。它負責(zé)接待顧客的到來,安排座位,以及與顧客建立聯(lián)系。在網(wǎng)絡(luò)通信中,QTcpServer
負責(zé)監(jiān)聽來自客戶端的連接請求,接受連接,并創(chuàng)建用于通信的QTcpSocket
。QTcpSocket(顧客和咖啡館之間的溝通通道):
QTcpSocket
就像是連接到咖啡館的每個顧客。它代表一個通信通道,使得顧客能夠與咖啡館交流。在網(wǎng)絡(luò)通信中,QTcpSocket
是客戶端與服務(wù)器之間的通信通道。每當有一個新的客戶端連接時,QTcpSocket
負責(zé)處理與該客戶端的數(shù)據(jù)交換,包括接收和發(fā)送數(shù)據(jù)。回到您的代碼例子,當有新的客戶端連接時,
QTcpServer
(類似于咖啡館前臺)創(chuàng)建了一個QTcpSocket
(類似于顧客和咖啡館之間的溝通通道)來處理與該客戶端的數(shù)據(jù)交換。通過連接readyRead
信號,服務(wù)器能夠在客戶端發(fā)送數(shù)據(jù)時立即讀取并處理它們,而連接disconnected
信號則允許服務(wù)器在客戶端斷開連接時執(zhí)行適當?shù)那謇砉ぷ鳌?/p>綜上所述,
QTcpServer
用于接受客戶端連接并創(chuàng)建通信通道,而QTcpSocket
則用于處理與客戶端的實際數(shù)據(jù)交換。這類似于咖啡館的前臺負責(zé)接待客戶,而客戶通過通信通道與咖啡館交流點餐、傳遞信息等。
學(xué)習(xí)源碼怎么用,下載一些輔助學(xué)習(xí)和編程的軟件;
學(xué)習(xí)基于TCP的Qt網(wǎng)絡(luò)通信,QTcpServer、QTcpSocket、套接字通信 socket;
完成客戶端client和本地服務(wù)器server的代碼,實現(xiàn)了局域網(wǎng)內(nèi)部的即時信息通訊功能;
學(xué)習(xí)了VMwareWorkstationPro的方法;
了解m_s= new QTcpServer(this);意思作用:創(chuàng)建一個m_s對象,this是他的父對象,父對象析構(gòu)的時候,對象也析構(gòu),所以不用對子對象自己寫析構(gòu);
學(xué)習(xí)發(fā)布軟件相關(guān)知識;
今天比昨天多會的東西沒多少,我大致看了框架后,發(fā)現(xiàn)登錄界面和注冊界面跟之前做過的訓(xùn)練有關(guān)系,應(yīng)該不難,我認為技術(shù)問題主要集中在數(shù)據(jù)庫的調(diào)用和網(wǎng)絡(luò)通信上面,所以我著手解決第一個網(wǎng)絡(luò)通信的問題;
開始是個很艱巨的問題,老師這兩天上課講驗收標準和Mysql相關(guān)的東西,跟我通訊這個問題關(guān)系較小,我?guī)е鴨栴}問chatgpt,得到一些方向提示,
然后去找IM通訊相關(guān)的技術(shù)文檔,沒找到,又去b站找相關(guān)視頻,有用的東西很少,因為當時我不知道很多知識,
我又轉(zhuǎn)手去csdn,github上面去找相關(guān)學(xué)習(xí)資料,一開始找到的要不就是已經(jīng)很完善的企業(yè)IM,要不就是技術(shù)文檔看不懂,都不能解決讓我學(xué)習(xí)的問題,在這里磨了很久,
最后找到第一個有用的源碼,介紹是把server和client合在一個文件里面,有了源碼我還不知道怎么用,問chatgpt,這里有涉及QtDesigner里面一些編輯的東西,這里記不得具體怎么解決的了,最后終于還是能把代碼放到了該有的位置,跟著提示用服務(wù)器監(jiān)聽本地回環(huán)ip127.0.0.1和自定義的一個端口、客戶端連接這個ip和端口,剛好在要下班那會跑通程序,用客戶端發(fā)信息服務(wù)器能接收到,服務(wù)器發(fā)客戶端也接受到了,獲得巨大激勵。
晚上回去又看了相關(guān)文檔,又猜測這個只要是相同ip和端口就能通信,然后我試了把電腦連接手機的熱點,然后ip從回環(huán)ip改成熱點的ip,端口我自定義,反正服務(wù)器監(jiān)聽的和客戶端接入的是同一個,居然成功了,我繼續(xù)延展,是不是別人可以用了,然后我想讓室友幫忙測試,這里又去學(xué)習(xí)如何把源代碼發(fā)給別人,明白了通過static編譯可以解決一些動態(tài)庫的問題,然后把static編譯的文件打包發(fā)給室友,室友正常打開,這里遇到一個問題,一開始我電腦本地打開服務(wù)器,ip監(jiān)聽的是我網(wǎng)絡(luò)上的ip,ip比如xxx.xxx.xxx.1端口比如5656;
然后我室友電腦打開client客戶端,我用跟我一樣的操作,先檢測他電腦連接我手機熱點后的ip,他的是xxx.xxx.xxx.2,然后端口也連接5656,然后我服務(wù)器啟動監(jiān)聽后他連接,結(jié)果居然失敗了,然后我又突發(fā)奇想把他客戶端準備連接的ip改成xxx.xxx.xxx.1(跟他電腦連接的網(wǎng)絡(luò)不一樣了),然后居然成功了,獲得巨大激勵
后面我理解了,客戶端要接入的不是本地的ip,而是服務(wù)器端的ip,端口都要是同一端口。
23/8/19
一個客戶端占用一個端口
單線程服務(wù)器監(jiān)聽一個端口
多線程服務(wù)器 監(jiān)聽多個端口
群聊 私聊
connect我發(fā)覺這個有點像不定時的if 函數(shù),而之所以不定時,是因為觸發(fā)有人為因素,不一定是線性的過程,而只要觸發(fā)了,就像滿足了if的條件,發(fā)出某種信號,后面的槽函數(shù)接收到后,開始執(zhí)行,就像執(zhí)行if里面的代碼
你的理解很準確!信號和槽機制的確類似于非線性的條件觸發(fā)。在經(jīng)典的編程語言中,我們使用條件語句(如
if
語句)來響應(yīng)特定的條件。而在信號和槽機制中,信號就像是一種條件的觸發(fā)器,當某個特定事件發(fā)生時,發(fā)射一個信號,然后與之相關(guān)聯(lián)的槽函數(shù)會被執(zhí)行。這種機制非常適用于事件驅(qū)動的程序設(shè)計,特別是在用戶界面交互、多線程、異步操作等場景中。它使得程序的各個部分可以松耦合地交互,不需要緊密耦合在一起,從而提高了代碼的可維護性和可擴展性。
通過信號和槽,程序的不同模塊可以更靈活地協(xié)同工作,就像你所提到的觸發(fā)條件和執(zhí)行操作的關(guān)系一樣。這也是為什么信號和槽機制在很多GUI框架中被廣泛使用的原因之一。
深刻理解昨天學(xué)習(xí)的知識和代碼;
完整認識了connect,真正上手了
昨天獲得巨大激勵,當天應(yīng)該是熱情飽滿的,我有了把TCP協(xié)議和Qt相關(guān)網(wǎng)絡(luò)通信控件弄懂的信心,我先是讓chatgpt把最初的server和client代碼每行基本都注釋一遍,然后只要遇到有不懂的邏輯、代碼、關(guān)鍵字我就問chatgpt,把這份文件吃透后
又去b站找到相關(guān)視頻,總算找到一個基于Qt的通訊的教程,還是手把手邊講邊實操的那種,我跟著視頻手敲了包括客戶端和服務(wù)器的所有代碼,這次是比較系統(tǒng)的學(xué)習(xí),當然在過程中遇到各種問題,我通過查網(wǎng)站、文檔、chatgpt等辦法解決,在過程中發(fā)現(xiàn)讓ai用比喻解釋socket那一塊比較容易理解,
23/8/20
終于把發(fā)文件但接收不到的問題解決了,添加新建接收文件的目錄
一、文件的傳輸,二、在線網(wǎng)絡(luò)通訊
三、租用服務(wù)器
1、記下公網(wǎng)和私網(wǎng)ip地址
2、設(shè)置入方向和出方向安全設(shè)置(端口情況)
3、有些服務(wù)器需要自身是監(jiān)聽私網(wǎng)或者公網(wǎng)ip和端口
4、客戶端連接到公網(wǎng)ip,連接對應(yīng)端口
--mirror Index of /qtproject/這個是可用的 qt源 啟動目錄代碼cmd
繼續(xù)理解8/18網(wǎng)絡(luò)通信相關(guān)的知識和代碼(單線程實現(xiàn)的通訊的服務(wù)器和客戶端)
學(xué)習(xí)并實現(xiàn)文件傳輸 (多線程寫的文件傳輸?shù)姆?wù)器,單線程寫的客戶端)
服務(wù)器主線程實現(xiàn)網(wǎng)絡(luò)連接,副線程實現(xiàn)文件傳輸
實現(xiàn)通過服務(wù)器和公網(wǎng)IP遠程通訊了
這天也是獲得巨大激勵
一開始被一個bug卡了一上午,具體是傳輸文件,我客戶端和服務(wù)器的代碼對著視頻認真檢查三遍,chatgpt問了無數(shù)次,我能將服務(wù)器和客戶端正確連接,傳輸文件的字節(jié)也是對了,QDebug的信息是正常的符合預(yù)期的,但是始終無法得到文件傳輸?shù)椒?wù)器后,保存的文件,我最初是以為服務(wù)器或者客戶端連接代碼出了問題,或者是析構(gòu)的時候把文件刪了之類的,一上午還沒解決,中午咨詢老師,雖然老師沒能直接解決我的問題,但我獲得新的很多思路,后面我在把Qt和MySQL連接的時候用到了這里老師的思路,現(xiàn)在感慨確實很多機緣巧合在里面,老師的思路是用everthing,查我傳輸?shù)奈募?,看地址,但也查不到?/p>
下午一到實驗室查完各種資料后頓悟,
QFile *file = new QFile("E:\proj\sendFileServer\recv.txt"); 、
// 創(chuàng)建一個文件對象,用于寫入接收到的數(shù)據(jù)
就是這里,原來的版本QFile *file = new QFile("recv.txt")沒有具體路徑,以前的文檔認為這會直接在服務(wù)器源代碼的根目錄創(chuàng)建recv.txt,但是事與愿違,有可能是windows版本 qt版本 編譯器版本各種原因,但是我的版本必須加上接受的絕對地址,
后面在老師的提醒下我注意后面集成功能的時候要改成相對地址,不然別人不好用
總算還是解決了卡一上午的bug,
然后下午研究服務(wù)器怎么用,我想突破局域網(wǎng)的限制
第一步問chatgpt我應(yīng)該怎么做,按著gpt教程
我先去阿里云上租了一個服務(wù)器,生成一個服務(wù)器的實例,然后各種東西不知道,不過不影響,我查文檔,問gpt各種辦法學(xué),上手后感覺什么問題都可以解決。
先是看服務(wù)器公網(wǎng)ip,和私有ip,考慮到我不會輕易重啟服務(wù)器,所以沒有設(shè)置彈性公網(wǎng)ip,然后設(shè)置服務(wù)器的入方向安全組,把接入端口自定義7000/8000
開始不知道服務(wù)器怎么一回事怎么用,我直接在本地電腦上把服務(wù)器運行(這個服務(wù)器是跟原來不一樣,是手寫的一份新代碼,默認監(jiān)聽回環(huán)ip),我又增添修改監(jiān)聽ip的功能,然后設(shè)置監(jiān)聽ip為公網(wǎng)ip,端口7777,本地打開client,初測發(fā)現(xiàn)連接不上。
這里問gpt,發(fā)現(xiàn)要在服務(wù)器上運行server軟件,然后查了半天資料怎么做,意識到服務(wù)器可當成一臺電腦看,然后了解到可以通過遠程連接接入服務(wù)器電腦,并且可以跟服務(wù)器電腦共享本地文件,輸入賬號密碼進入后,我又意識到如果要在服務(wù)器上運行server,服務(wù)器又沒有qt庫,我又要用static運行一次server,把ip設(shè)置監(jiān)聽公網(wǎng)ip,然后在服務(wù)器上面運行server,在本地運行client,不過可惜還是失敗。這里卡了很久,不知道為什么,檢查了多次安全組,了解到不需要重啟服務(wù)器就可以即時更改安全組協(xié)議,不是端口的問題,然后沒找到問題。最后查網(wǎng)絡(luò)上別人的案例,我又去問客服確認了,服務(wù)器只需要監(jiān)聽本地私有ip,因為公網(wǎng)ip是映射到私有ip的,然后客戶端還是連接公網(wǎng)ip。這次測試終于成功了。
后續(xù)我優(yōu)化了server 和client的代碼,解決了一些內(nèi)存釋放的問題,目前可實現(xiàn)客戶端-服務(wù)器的遠程聊天。獲得巨大激勵。
23/8/21
mysql和qt 連接 不同版本 可能會有 不同問題 各有各的可能
連接數(shù)據(jù)庫,巨離譜 qt+=MySQL==MMP
一系列操作
下載mysql qt要有source文件 這期間順便把各種maintenanceTool搞好 有利有弊
www.subingwen.com 這個大哥真的厲害
QMessageBox::warning(this,tr("登錄失敗"),tr("用戶名或密碼輸入錯誤!"),QMessageBox::Ok);
這段代碼是使用 Qt 框架中的
QMessageBox
類來創(chuàng)建一個警告對話框。QMessageBox
是用于顯示不同類型消息的窗口,包括信息、警告、錯誤等。在你的代碼中,
QMessageBox::warning
用于創(chuàng)建一個警告類型的對話框。其中的參數(shù)解釋如下:
this
: 這是指向當前窗口或父窗口的指針,用于將警告對話框與特定窗口關(guān)聯(lián)。通常,這個參數(shù)會是你當前的主窗口。
tr("登錄失敗")
: 這是警告對話框的標題。tr
是 Qt 的國際化翻譯函數(shù),用于支持多語言應(yīng)用程序。這個函數(shù)會將包含在其中的文本翻譯為適當?shù)恼Z言。
tr("用戶名或密碼輸入錯誤!")
: 這是顯示在警告對話框中的具體警告信息。同樣,這里使用tr
函數(shù)將文本進行國際化翻譯。
QMessageBox::Ok
: 這是一個按鈕選項,它指定在警告對話框中顯示的按鈕。在這個情況下,它是一個 "確定" 按鈕,表示用戶可以點擊它來關(guān)閉對話框。這段代碼的作用是在登錄過程中,當用戶輸入的用戶名或密碼錯誤時,彈出一個警告對話框,告知用戶登錄失敗,并提供一個 "確定" 按鈕,用戶可以點擊以關(guān)閉對話框。這有助于向用戶提供及時的反饋和信息。
"賬號名" 在英文中通常被翻譯為 "username" 或 "account name",而在某些上下文中也可能翻譯為 "account"。對于 QQ 的登錄賬號,通常來說 "username" 或 "account name" 都是比較合適的翻譯選項。
"Username": 這是一個普遍用于表示登錄憑據(jù)的術(shù)語,特別是在網(wǎng)站、應(yīng)用程序和系統(tǒng)中。"Username" 指的是用戶在注冊或創(chuàng)建賬號時所選擇的唯一名稱,通常用于登錄和身份驗證。在技術(shù)上,"username" 通常比 "account" 更精確地描述了用戶登錄憑據(jù)的性質(zhì)。
"Account name": "Account name" 也是一種常見的翻譯,特別是在一些應(yīng)用程序或系統(tǒng)中。"Account name" 強調(diào)了這個名稱是用于賬戶的身份標識。
無論你選擇 "username" 還是 "account name",都是可以接受的翻譯,而且在大多數(shù)情況下,人們會理解其意義。選擇哪個更適合取決于你的應(yīng)用程序的風(fēng)格和目標受眾,以及在你所使用的語言環(huán)境中的一般偏好。最終的目標是讓用戶能夠明確理解并正確輸入他們的登錄憑據(jù)。
"登錄" 通常被翻譯為 "login",而不是 "load"。這是因為 "login" 是一個常見的術(shù)語,用于表示用戶通過輸入正確的用戶名和密碼來獲取訪問權(quán)限,從而進入系統(tǒng)、應(yīng)用程序或網(wǎng)站。相比之下,"load" 更多用于描述加載數(shù)據(jù)、文件或資源等操作。
所以,在用戶界面和應(yīng)用程序中,"登錄" 應(yīng)該被翻譯成 "login",以確保用戶能夠準確理解并執(zhí)行相應(yīng)的操作。這樣可以保持一致性,并使用戶界面更加清晰和易于理解。
實現(xiàn)賬號密碼登錄顯示界面,輸入錯誤的時候提示重新輸入,輸入正確則跳轉(zhuǎn)界面
//login.cpp #include "login.h" #include "ui_login.h" #include<QMessageBox> #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(); } }
學(xué)習(xí)并實現(xiàn)把Qt連接到MySQL
學(xué)習(xí)并實現(xiàn)注冊、登錄界面編輯
學(xué)習(xí)并實現(xiàn)界面跳轉(zhuǎn)
今天總結(jié)剩余任務(wù),
注冊、登錄界面、界面跳轉(zhuǎn)、注冊和登錄調(diào)用數(shù)據(jù)庫、客制化客戶端、客戶端-服務(wù)器-客戶端私聊和群聊、歷史信息保存在數(shù)據(jù)庫、集成所有功能、界面美化。
剩的東西有點多,感覺壓力還是大。
這里面我覺得最難的是數(shù)據(jù)庫相關(guān)的東西,還是從難的做起
連接MySQL過程極其復(fù)雜,中途我?guī)状五e誤操作,并且自身Qt也有很多bug,當初下載文件的時候有很多遺留問題,很多的任務(wù),以及繁瑣的流程讓我一度想放棄連接MySQL,轉(zhuǎn)而去連接SQlite,我SQlite都下好了。但是我還是想再試試Mysql,最后終于還是成功了。 實在是有很多機緣巧合。
網(wǎng)上相關(guān)資料也確認了不同版本解決辦法不同,比如windows版本不同、qt、編譯器版本、位數(shù)、MySQL版本不同等等各種不同會造成解決辦法不同。
我這個叫“Qt中編譯數(shù)據(jù)庫驅(qū)動”,先去MySQL官網(wǎng)下載最新版8.1文件安裝,安裝就遇到很多問題,因為網(wǎng)上說最好安裝目錄不要帶有空格,不然后面要出問題,但是我一開始沒找到更改安裝位置的辦法,在這里磨了一陣,終于還是成功改了。
然后是qt,一定要用64位的編譯套件,然后一定要有src 也就是sources資源文件,不巧的是我qt Maintenance文件出了問題打不開,又去官網(wǎng)下了最新版安裝包,發(fā)現(xiàn)可以直接下載Maintenance,然后又一系列操作下載了5.12.2 MinGW64位編譯器下的src源碼
然后everything找到qt src里的sqldrivers \mysql 根據(jù)網(wǎng)上文檔修改mysql.pro
增添INCLUDEPATH、INCLUDEPATH 注釋掉原來的QMAKE
第一次編譯后繼續(xù)debug
打開qsqldriverbase.pri
注釋掉原有include,新增#include(./configure.pri)
好,然后這里卡了半天,我沒找到編譯后的生成文件,然后還錯誤的把我MinGW64 里面 qsqlmysq.dll代碼給覆蓋了(當時誤以為復(fù)制的代碼是編譯后的生成文件,結(jié)果是其他版本的qsqlmysq.dll),這里是最想放棄的地方,最后我不得不又從qMaintence里面下回來原版代碼,然后是找編譯后生成文件這里找了半天,最后想起用everything直接查,終于發(fā)現(xiàn)我找不到的原因是因為我跟教程文檔保存目錄不同。
最難的坎已經(jīng)邁過,接下來是正常測試,終于過了。
接著寫登陸界面,注冊界面,跳轉(zhuǎn)界面等等功能。因為我之前把通訊那一塊客戶端和服務(wù)器的ui編輯過很多次,QtDesigner已經(jīng)比較熟了,所以這個算比較簡單,然后跳轉(zhuǎn)槽函數(shù)也好寫,不是很難。
難的是后面為了可讀性的提高,(文件變多了,登錄 注冊 客戶端界面比較多)我想用峰駝命名原則調(diào)整原有代碼的類名,因為不熟在這里卡了半天,差點把源碼毀了,從此養(yǎng)成備份的習(xí)慣,不過最后問gpt一點一點調(diào)還是調(diào)通了。
23/8/22
頭文件循環(huán)包含問題:
登錄界面跳轉(zhuǎn)注冊界面,注冊界面跳轉(zhuǎn)登陸界面,頭文件不能互相包含
解決辦法:登錄包含注冊,注冊聲明登錄類
// 前置聲明,告訴編譯器 Login 類的存在 class Login;
然后源文件不會出現(xiàn)循環(huán)包含問題
修改MySQL root賬號的密碼 mysqladmin -uroot -p123 password 123456
在mysql中 調(diào)用儲存的信息
#include <QSqlDatabase> #include <QSqlQuery> #include<QSqlError> void Login::on_login_clicked() { QString inputUsername = ui->username->text(); QString inputPassword = ui->password->text(); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("UserRegistrationDB"); db.setUserName("root"); db.setPassword("12315"); if (db.open()) { QSqlQuery query; query.prepare("SELECT * FROM users WHERE username = :username AND password = :password"); query.bindValue(":username", inputUsername); query.bindValue(":password", inputPassword); if (query.exec() && query.next()) { // 登陸成功 QMessageBox::information(this, "登陸成功", "歡迎回來!"); c = new Client; c->show(); this->close(); } else { // 登陸失敗 QMessageBox::warning(this, "登陸失敗", "賬號或密碼錯誤!", QMessageBox::Ok); ui->password->clear(); ui->password->setFocus(); } db.close(); } else { qDebug() << "Database error:" << db.lastError().text(); } }
今天實現(xiàn)了注冊,登陸系統(tǒng)的邏輯完善,并成功將qt與本地MySQL連接,可以保存、讀取信息
#include <QSqlDatabase> 這個用來連接數(shù)據(jù)庫
#include <QSqlQuery>這個用來查找、注入數(shù)據(jù)
#include <QSqlError>這個用在調(diào)試的時候報告信息
巨大問題得到解決,ui h cpp文件重命名,包括類名 要考慮ui 和ui主窗口的重命名?。。?/p>
一定要注意指針初始化的問題,如果沒有初始化 相當于沒有定義,即使是判斷!s也會出錯
# 授權(quán)所有主機都可以通過root用戶,密碼123456,進行訪問數(shù)據(jù)庫 # 123456:給新增權(quán)限用戶設(shè)置的密碼 # %:代表所有主機,也可以具體到主機ip地址 # ① 適用于 MySQL 8.0之前的版本,可以直接授權(quán) grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option; # ② 適用于 MySQL 8.0之后的版本,需要先創(chuàng)建一個用戶,再進行授權(quán)【推薦方式②】 create user root@'%' identified by '123456'; grant all privileges on *.* to root@'%' with grant option; # 刷新權(quán)限,這一句很重要,使修改生效,如果沒有寫,則還是不能進行遠程連接。這句表示從mysql數(shù)據(jù)庫的grant表中重新加載權(quán)限數(shù)據(jù),因為MySQL把權(quán)限都放在了cache中,所以,做完修改后需要重新加載。 flush privileges; ################################################################################# # 如果只允許授權(quán)某主機連接到mysql服務(wù)器 # 123456:給新增權(quán)限用戶設(shè)置的密碼 # %:代表所有主機,也可以具體到主機ip地址,如:192.168.xxx.xxx # ① 適用于 MySQL 8.0之前的版本,可以直接授權(quán) grant all privileges on *.* to 'root'@'192.168.xxx.xxx' identified by '123456' with grant option; # ② 適用于 MySQL 8.0之后的版本,需要先創(chuàng)建一個用戶,再進行授權(quán)【推薦方式②】 create user root@'%' identified by '123456'; grant all privileges on *.* to root@'192.168.xxx.xxx' with grant option; # 刷新權(quán)限,這一句很重要,使修改生效,如果沒有寫,則還是不能進行遠程連接。這句表示從mysql數(shù)據(jù)庫的grant表中重新加載權(quán)限數(shù)據(jù),因為MySQL把權(quán)限都放在了cache中,所以,做完修改后需要重新加載。 flush privileges; ———————————————— 版權(quán)聲明:本文為CSDN博主「ASMNDS」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/qq_40943000/article/details/120028791這個大佬幫了大忙
23/8/23
今天 修改QTcpServer代碼以實現(xiàn)多客戶端連接 整合功能
#
需要創(chuàng)建一個QTcpSocket的列表來存儲所有的客戶端連接。這可以通過在你的ServerMainWindow類中添加一個QTcpSocket的列表成員變量來實現(xiàn)。然后,當有新的客戶端連接時,你可以將這個新的客戶端連接添加到QTcpSocket的列表中。你可以通過重寫QTcpServer的incomingConnection方法來實現(xiàn)這一點。
然后重寫發(fā)送文件和接收文件的代碼,添加標記
發(fā)布程序,第0步,環(huán)境變量 path 把編譯器的bin目錄搞進去,再把g++所在目錄搞進去,然后exe拖出去,shift+右鍵 windows shell 里面 ,windeployqt ./+tab補齊程序名 運行 即可得到能給別人用的軟件
23/8/24
debug ,在個人信息自定義界面,修改id、頭像,部分得到實現(xiàn),
ui添加背景,部分得到實現(xiàn);
程序美化方面,改樣式表,語法 插入圖片,語法文章來源:http://www.zghlxwxcb.cn/news/detail-714327.html
23/8/25
vscode有感,多光標編輯 alt+leftMouseClick; shift+alt+up/down =ctrl+c&ctrl+v;】w文章來源地址http://www.zghlxwxcb.cn/news/detail-714327.html
到了這里,關(guān)于算法、數(shù)據(jù)結(jié)構(gòu)、計算機系統(tǒng)、數(shù)據(jù)庫MYSQL、概率論、數(shù)學(xué)實驗MATLAB、數(shù)學(xué)建模、馬原、英語、雜項、QT項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!