C語言快速入門

Linux C 的編譯流程

C 編譯器

  • gcc GNU
  • msvc windows
  • clang 蘋果
  • intel
  • cc 默認Linux c語言編譯器

程序設計語言分類

  • 編譯型 C、C++、java
    • 把源代碼轉換成機械指令(X86 電腦、ARM 手機)
    • 編譯做了類型安全檢查,安全
    • 性能高
    • 靈活差
  • 解釋型 Python、JS、java
    • 源代碼直接在解釋器上運行
    • 靈活性強、建模與語義的表達高效 ‘*’
    • 易學習 ‘*’
    • 性能差

編譯流程

c語言源文件:
.h 頭文件 包含函數和變量聲明、宏和數據類型定義
.c 源文件 包含函數定義和實現,預處理語句

gcc hello.c -o hello

以上語句執行過程可拆分為一下流程:

  1. 匯編,生成匯編代碼
    gcc -S hello.c -o hello.s

  2. 編譯,生成目標文件.o/.obj
    gcc -c hello.s -o hello.o

  3. 鏈接 目標文件、庫文件(.so/.dll)和操作系統系統執行相關代碼 生成可執行文件 hello/hello.exe
    gcc hello.o … -o hello

TCC 編譯器
tcc 優化編譯器,生成可執行文件較小

C 語言學習

設計者:丹尼斯·里奇 & 肯·湯普森 共同設計實現 UNIX,設計C語言
UNIX/C、C/Linux、Linux/互聯網共生相互成就

推薦紀錄片《操作系統革命》

CGI 用C動態生成HTML頁面
Web/PHP 基于c改進的

編程范式(方法學、建模時思維模式)

  • 面向過程:過程、操作,C、Pascal
  • 面向對象 OOP:C++、java、python
  • 函數式:Lisp

學習內容

  • 變量與類型系統
  • 流程控制:順序、分支、循環
  • 數組
  • 函數:程序基本單位;C++中為類、對象
  • 指針 ‘*’ 信任開發者,駕馭起來有難度 unix/linux root用戶
  • 結構體
  • 庫:文件、網絡、進程、線程(提高性能,如找一個億以內的質數)、GUI、安全、MySQL、Opencv …

推薦書:《C語言程序設計 現代方法》

C變量與類型

程序,為完成特定任務,數據與指令的集合

變量與常量

標識符,定義了內存中的一個區域,替代內存物理地址

變量:空間中數據隨時間會發生變化
常量:程序中隨時間不發生變化 ‘const’

變量聲明:類型     標識符|         |空間分配的大小   字母下劃線開頭空間格式         包含字母、下劃線、數字不能使用關鍵字、保留字不能包含空格以及下劃線以外的其他符號變量小寫、常量大寫有意義

類型系統

  • 基本類型
    • 數值
      • 整數
      short 2     2^16 = 65536
      int   2 4   2^32 = 46億 10位
      long  4 8
      long long 8
      
      • 浮點數
        float 4
        double 8
    • 字符
      • char 1
    • 邏輯
      • bool 1
  • 復合類型
    • 數組
      復合數據類型,存儲多個值,大小不可變
       int a[6]; // 6個int元素char c[128]; // 128個char字符char c[] = {'a', 'b', 'c'}; // 3個字符int a[6] = {1, 2, 3, 4, 5, 6}; // 6個int元素int n; int a[n]; // n個int元素,n改變a大小不變, c++中n必須是const
    
          下標可以越界但是結果不確定
    
    • 結構體
    • 聯合

靜態與動態類型

  • 靜態類型 C、C++、java
  • 動態類型 Python、JS

運算

  • 算術:+ - * / %

  • 位(二進制):& | ^ << >> ~

  • 邏輯(比較):

    • || 或 左邊為假才執行右邊,兩個假為假
    • && 與 左邊為真才執行右邊,兩個真為真
    • ! 非 真變假,假變真
  • 關系(真假):== != > < >= <=

  • 賦值:從右往左執行

  • 位運算
    數值轉換成二進制進行運算,效率更高

    • & 與:兩1得1,否則為0

      • 掩碼運算 ip地址掩碼
      • 奇數偶數判斷(n & 1 == 1 為奇)
    • | 或:兩0得0,否則為1

      • 狀態疊加
    • ^ 異或:兩1得0,兩0得0,否則為1

      • 在所有成對出現的數字中,找只出現一次的數字
      • 交換兩個變量的值 a = a ^ b; b = a ^ b; a = a ^ b;
    • ~ 非:0變1,1變0

    • '>>'右移:右移n位,相當于除以2的n次方 比除法性能高

    • << 左移:左移n位,相當于乘以2的n次方

流程控制

程序結構

  • 順序

  • 分支(判斷選擇)

    • if
        if (條件) {}
    
    • if else (三元運算符可替代 '? : ')
        if (條件) {}else {}
    
    • if else if else (多路分支,匹配范圍、枚舉值/精確值)
        if (條件) {}else if (條件) {}else {//邏輯閉環}
    
    • switch case (多路分支、有限:只能匹配枚舉值/精確值)
        switch (變量) {case:break;......default://邏輯閉環}
    
  • 循環

    • for 循環次數確定
    //1 初始化
    //2 循環條件
    //3 步長
    //4 循環題
    //執行順序1->2->4->3->2->4->3...
    for (1; 2; 3){//4
    }
    • while 循環次數不確定, 先判斷再執行
    while (條件){}
    
    • do while 循環次數不確定,先執行再判斷
    do {}while (條件);
    

重構

不增加代碼功能,對代碼結構進行改變

函數

命名的代碼塊,預定義的,可復用的功能單元
函數是c程序的基本單元,c程序有若干個函數組成
函數也叫方法

函數大小:建議不要超過100行/一個屏幕

函數的作用

  1. 封裝:將功能封裝成一個函數,便于復用,開放閉合原則
  2. 可復用
  3. 模塊化:將一個大的功能分解成若干個小功能,便于理解,一般在不同的文件中定義函數

開放閉合原則:對擴展開放,對修改關閉

定義

//函數名 functionName//返回值類型 returnType void int double ptr...//參數列表 parameter list int a, int b double c, int d...returnType functionName (parameter list){//函數體//返回值return returnValue;}

遞歸

一個函數調用自身

部分遞歸實現的算法可以使用循環實現,遞歸代碼更簡潔
部分循環無法實現的只能使用遞歸實現 文件遍歷、圖、漢諾塔

  1. 遞歸函數必須有收斂條件
  2. 包含自身的調用

模塊化

/*
* f.h
* 聲明函數
*/
int jc(int);
int fib(int);
long long fib2(int);/*
* f.c
* 定義函數
*/
#include "f.h"
//菲波那切數列
int fib(int n){//
}long long fib2(int n){//
}
//

指針

概念

指針:一種數據類型,存儲變量的地址

指針可以運算

定義

    int i;    //64位 4字節 32位 2字節double d; //8字節// 64位 8字節 32位 4字節int *p = &i; //& 取地址符 p保存首地址,int類型規定管轄范圍double *p1 = &d;// %p打印地址 *解引用運算符,可以取得指針指向的數據,在聲明時表示變量是一個指針printf("int\t%ld %ld %p %d\n", sizeof(i), sizeof(p1), p1, *p1);printf("double\t%ld %ld %p %lf\n", sizeof(d), sizeof(p3), p3, *p3);int a[] = {100, 200, 300, 400}; //數組是復合類型,數組名就是一個指針,指向數組的首地址,不被復制 (a = b 錯)int *p;p = &a;     //指針指向數組的首地址p = a;      //數組名稱轉化成數組首地址p = &a[0];  //指向數組首元素的地址,就是數組首地址p[i] = 233; //p[i] == *(p+i)printf("%d\n", *(p + i)); //輸出233

字符串

定義

字符串:字符構成的一個有‘序列表’,以‘\0’結尾的字符序列

//字符
char c;
//字符數組,字符串中出現特殊字符需要用 \ 轉義
char s[] = {'a', 'b', 'c', '\0'};
char s[4] = "abc"; //由于隱含地包含'\0',容量(sizeof(s))要大于表面上的‘長度’(strlen(s)),這里大于4
//字符串,數組,元素內容可變(s1[0] = 'a'),數組不可變(s1 = "abc" X)
char s1[] = "abc";
//字符指針,不改可變元素內容(s2[0] = 'a' X),指針變量本身可變(s2 = "abc")
char *s2 = "abc";
//拼接,初始化的時候可以
char s3[] = "abc""def""ghi\
get";
//拼接,賦值時也可以
char *s2 = "abc""def"
s2 = "abc""get";

sizeof(s):返回字符數組容量,包含‘\0’
strlen(s):返回字符數組長度,不包含‘\0’

數據形式:

  • 數值
  • 字符串:文本
  • 二進制
    • 圖形
    • 音頻
    • 視頻

操作

頭文件:string.h

  • strlen(s):返回字符串長度
  • strcat(s1, s2)、strncat(s1, s2):拼接字符串,s2拼接到s1
  • strcmp(s1, s2):比較字符串, 返回值:0(相等),-1(s1 < s2),1(s1 > s2), 其實就是返回最后一個不相等的字符做減法運算后的結果
  • strcpy(s1, s2)、strncpy(s1, s2):復制字符串, s2復制到s1
  • puts(s)、fputs(s, fp):輸出字符串到標準輸出或文件,回車結束
  • gets(s)、fgets(s, size, fp):從鍵盤讀取字符串,回車結束,最多取size - 1個字符(包括\0)

應用

  1. 進制轉換
    char base[] = "0123456789ABCDEF";char res[100];int n;printf("請輸入一個正整數:");scanf("%d", &n);int len = 0;while(n > 0){char tmp[100];tmp[0] = base[n % 16];tmp[1] = '\0';strncat(tmp, res, len);++len;strncpy(res, tmp, len);n /= 16;}printf("%s\n", res);
  1. 大數值計算
  • 加法
    • 從低位到高位每位相加再加進位,模10的余數放進結果字符數組,除10的結果保存為進位,字符數組長度就是較大數長度 + 1(最多進一位)
    • 為方便操作,對不等長的兩個數,將較短的數補充0,使其與較長數長度+1相等,較長數也要在最高位之后補充一個0,從低位到高位加,要將字符數組翻轉
    • 結果要刪除多余的0
  • 減法
    • 不管兩個數誰大誰小,用大數做減數,小數做被減數,最后根據大小處理符號
    • 從低位到高位每位減,結果小于0要向高位借位(結果加10,高位a[i + 1]減1)
    • 為方便操作,對不等長的兩個數,將較短的數補充0,使其與較長數長度相等,同時要將字符數組翻轉
    • 結果要刪除多余的0
  • 乘法
    • 對于被乘數每一位b[i],乘數a累加b[i]次存入tmp,然后tmp后面補i個零,將tmp累加到結果數組中
  • 除法
    方法一: 大數減小數,能減多少次除數商就是多少
    方法二: 模擬短除法的過程
    • 先處理特殊情況:1- 被除數比除數小,直接輸出0 2- 被除數為0,打印錯誤信息
    • 從高位開始模擬,先取除數a與被除數b長度相等的一部分tmp
    • 從高位開始tmp減被除數b,結果放tmp,能減的次數count就是結果數組這一位的值,最后不夠減的數保存在tmp
    • 將a剩余拼接一位到tmp末尾,直到大于除數,或者拼接的是被除數最后一位之后的‘\0’(退出條件),每拼接一位就保存一位0到結果數組,但是結果數組的第一位不能是0,所以如果時一開始的結果,結果沒有內容不需要補0,同時遇到退出條件也不用補0
    • 重復2-3步,共執行 除數長度減被除數長度 + 1 次
    • 為了刪除結果多余的0,如果count是0且結果數組是第一位,則不要加到結果中,如果更新結果數組后已經是最后一次循環直接退出
    • 算法過程要多次比較兩個數的大小,可以定義一個比較函數比較兩個字符串表示的數的大小

示例代碼:

//交換兩個字符
void swap(char *a, char *b)
{int tmp = *a;*a = *b;*b = tmp;
}
//字符串翻轉
void reverse(char *s)
{int len = strlen(s);for (int i = 0; i < len / 2; ++i){swap(&s[i], &s[len - i - 1]);}
}
//字符串表示的數字相加運算
void add(const char *a, const char *b, char *res)
{int llen = strlen(a);int rlen = strlen(b);//記錄最后結果是正是負int flag = 0;if (a[0] == '-' && b[0] == '-'){flag = 1;--llen;--rlen;}//如果一正一負則委托減法進行運算else{if (a[0] == '-' && b[0] != '-'){sub(b, a + 1, res);return;}if (a[0] != '-' && b[0] == '-'){sub(a, b + 1, res);return;}}//兩個都是整數則正常計算//拷貝到臨時變量中,避免影響原字符串char tmpa[100];char tmpb[100];if (flag){strncpy(tmpa, a + 1, llen + 1);strncpy(tmpb, b + 1, rlen + 1);}else{strncpy(tmpa, a, llen + 1);strncpy(tmpb, b, rlen + 1);}//計算出最較大的和較小的數字以及其長度int size, minc;char *max, *min;if (llen > rlen){max = tmpa;size = llen + 1;min = tmpb;minc = rlen;}else{max = tmpb;size = rlen + 1;min = tmpa;minc = llen;}//翻轉數組reverse(tmpa);reverse(tmpb);//填充0使原字符串最大數字的長度加1for (int i = minc; i < size; ++i){min[i] = '0';}max[size - 1] = '0';//逐位加int cur = 0;for (int i = 0; i < size; i++){cur = cur + max[i] - '0' + min[i] - '0';res[i] = cur % 10 + '0';cur /= 10;}//去除多余的0while (res[size - 1] == '0'){--size;}if (flag){res[size++] = '-';}//補充'\0'res[size] = '\0';//翻轉位正常循序reverse(res);
}
//比較兩個字符串表示的數組
int compare(const char *a,const char *b)
{int llen = strlen(a);int rlen = strlen(b);if (llen > rlen){return 1;}else if (llen == rlen){return strcmp(a, b);}else{return -1;}
}//字符串表示的數字相減運算
void sub(const char *a, const char *b, char *res)
{int flag = 0;int llen = strlen(a);int rlen = strlen(b);//使用臨時數組,不影響原字符串char tmpa[100], tmpb[100];strncpy(tmpa, a, llen + 1);strncpy(tmpb, b, rlen + 1);//比較兩個數大小,獲取長度,用較大減較小數,最后處理符號//分別獲取較大數和較小數char *max, *min;int minc, maxc;//根據符號處理if (a[0] == '-' && b[0] == '-'){--llen;--rlen;if (compare(a + 1, b + 1) >= 0){flag = 1;max = tmpa + 1;min = tmpb + 1;maxc = llen;minc = rlen;}else{max = tmpb + 1;min = tmpa + 1;maxc = rlen;minc = llen;}}//如果一正一負則委托加法法進行運算else if (a[0] != '-' && b[0] != '-'){if (compare(a, b) >= 0){max = tmpa;min = tmpb;maxc = llen;minc = rlen;}else{flag = 1;max = tmpb;min = tmpa;maxc = rlen;minc = llen;}}else{//-a - b =-a + -bif (a[0] == '-' && b[0] != '-'){tmpb[0] = '-';strncpy(tmpb + 1, b, rlen + 1);add(a, tmpb, res);return;}//a - -b = a + bif (a[0] != '-' && b[0] == '-'){add(a, b + 1, res);return;}}//翻轉數組reverse(max);reverse(min);//較小數填充0for (int i = minc; i < maxc; ++i){min[i] = '0';}//逐位減int t = 0;for (int i = 0; i < maxc; ++i){t = max[i] - min[i];if (t < 0){t += 10;--max[i + 1];}res[i] = t + '0';}//去除多余0while(res[maxc - 1] == '0'){--maxc;}//添加\0和符號if (flag){res[maxc++] = '-';}res[maxc] = '\0';//翻轉成正常順序reverse(res);
}
//大數乘法
void mul(char *a, char *b, char *res){int llen = strlen(a);int rlen = strlen(b);//初始化結果int size = llen + rlen + 1;memset(res, '0', size);res[1] = '\0';//不改變原數組使用臨時變量char tmpa[llen + 1], tmpb[rlen + 1];strncpy(tmpa, a, llen + 1);strncpy(tmpb, b, rlen + 1);int min = llen > rlen ? rlen : llen;char *minc = llen > rlen ? tmpb : tmpa;int max = llen > rlen ? llen + 1 : rlen + 1;char *maxc = llen > rlen ? tmpa : tmpb;//翻轉較短字符串reverse(minc);//對較短字符串每一位n,較長位自加n次, 再添加i個0后加到結果中for (int i = 0; i < min; ++i){char tmp[size];strncpy(tmp, maxc, max);int n = minc[i] - '0';//自加n次for (int j = 0; j < n - 1; ++j){add(tmp , maxc, tmp);}//在末尾添加i個零int pos = strlen(tmp);memset(tmp + pos, '0', i);tmp[pos + i] = '\0';//累加到結果中add(res, tmp, res);}
}
//大數除法
void divi(char *a, char *b, char *res){//特殊情況if (b[0] == '0'){printf("除數不能為0\n");exit(-1);}if (compare(a, b) < 0){res[0] = '0';res[1] = '\0';return;}//從高位模擬,高位減被除數,能減多少次就是商這一位的值//取除數與被除數長度相等的一部分int llen = strlen(a);int rlen = strlen(b);char tmp[rlen + 1];strncpy(tmp, a, rlen);tmp[rlen] = '\0';int t = 0;for (int i = rlen; i <= llen; ++i){//記錄能減幾次int count = 0;while (compare(tmp, b) >= 0){//減去被除數sub(tmp, b, tmp);++count;}//count是0 且是結果第一位不用加到結果if (count != 0 || t != 0){res[t++] = count + '0';}//到達最后一位,直接退出if (i == llen){break;}//拼接剩余數字while(1){strncat(tmp, a + i, 1);++i;//直到大于除數,或者拼接的是被除數最后一位之后的‘\0'if (compare(tmp, b) >= 0 || i == llen + 1){break;}//不是結果的第一位才要補零if (t == 0){continue;}res[t++] = '0';}}res[t] = '\0';
}

結構體

C結構體與C++類的區別

結構體:封裝了屬性(字段)
類:封裝了屬性和相關操作

結構體
方法學面向過程面向對象
字段++
函數/方法-+
繼承-+
賦值操作拷貝指針

c++中結構體和類沒有區別,結構體是成員的默認訪問級別為公有的類

結構體定義

// 把多個相關的字段封裝成一個整體
struct student
{char name[16];char tel[11];int score;double height;double weight;struct student *friend;
}struct student s1[40];
// 不僅封裝數據還封裝方法
class Student {int age;int score;void talk() {}void run() {}
}

結構體填充原則

  • 各字段字節對齊
  • 結構體整體大小是最長字段的大小

結構體操作

  1. 賦值
struct date d1;
struct date d2 ={2024, 7, 3};
struct date d3 = {.month = 7, .day = 4};
d1.year = 2024;
d1.mouth = 7;
d1.day = 5;
  1. 使用
//訪問,通過指針(d->year (*d).year)或對象訪問(d.year)
void display(struct date *d){printf("%d年%d月%d日\n", d->year, d->month, d->day);
}
void display2(struct date d){printf("%d年%d月%d日\n", d.year, d.month, d.day);
}

內存管理相關

內存管理概念

    int a;int *p;    //8字節double *d; //8字節void *v;   //8字節,類型未知的一個指針變量,不可以直接使用,通過類型轉換或者賦值給具體類型指針使用

void*:類型未知的一個指針變量,可以存儲任何類型的地址,不可以直接使用,通過類型轉換或者賦值給具體類型指針使

內存管理方式

  • 系統管理
    函數中聲明的普通變量,內存空間在棧空間
    由系統自動分配和銷毀,在函數聲明時分配,結束時銷毀
  • 手動管理
    基于內存管理函數創建的,或全局的變量,存儲在堆空間
    需要手動分配和銷毀,若不釋放會引起內存泄漏

相關函數

stdlib.h

  • malloc(size_t size) 分配
    //靜態數組,大小不變
    int a[4] = {100, 200, 300, 400};
    //動態數組,大小可變
    int *b = malloc(sizeof(int) * 4);
    
  • free(void *ptr) 釋放
  • calloc(size_t num, size_t size) 分配并初始化
  • realloc(void *ptr, size_t size) 重新分配 如果有剩余空間,則在原地址中擴展,否則開辟新的空間并拷貝至新空間
  • memset(void *ptr, int value, size_t num) 初始化
  • memcpy(void *dest, void *src, size_t num) 內存拷貝

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44117.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44117.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44117.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三生隨記——毛巾的詛咒

在一個沉悶的傍晚&#xff0c;李明拖著疲憊的身軀回到了家中。一整天的工作讓他精疲力竭&#xff0c;此刻他只想趕緊洗個熱水澡&#xff0c;然后躺在舒適的床上&#xff0c;好好放松一下。 走進浴室&#xff0c;他打開淋浴&#xff0c;溫暖的水流傾灑在身上&#xff0c;疲憊感…

Oracle 利用觸發器鎖住代碼防止他人改動

利用觸發器鎖住自己的代碼防止他人改動 create or replace trigger LockSourcebeforecreateon SCHEMA declare beginif SYS_CONTEXT(USERENV,OS_USER) 自己的機器名thenreturn;end if;if ora_dict_obj_name in (xxxx1_PACKAGE,xxxx2_PACKAGE)thenraise_application_error(-2…

每日刷題(二分查找,匈牙利算法,逆序對)

目錄 1.Sarumans Army 2.Catch That Cow 3.Drying 4.P3386 【模板】二分圖最大匹配 5. Swap Dilemma 1.Sarumans Army 3069 -- Sarumans Army (poj.org) 這道題就是要求我們在給的的位置放入 palantir&#xff0c;每個 palantir有R大小的射程范圍&#xff0c;要求求出最少…

生產訂單執行明細表二開增加字段

文章目錄 生產訂單執行明細表二開增加字段業務背景業務需求方案設計詳細設計和實現標準報表引入到應用標準報表和過濾擴展添加字段創建插件&#xff0c;掛載插件新建類庫 Krystal.K3.SCGL.App.Report&#xff0c;添加引用創建類&#xff0c;繼承報表原插件重寫BuilderReportSql…

【微服務】Spring Cloud中如何使用Eureka

文章目錄 強烈推薦引言主要功能Eureka 的架構使用示例Eureka Server 配置Eureka Client 配置示例服務服務發現調用示例 Spring Cloud如何實現服務的注冊?1. 搭建 Eureka 服務注冊中心2. 配置服務注冊到 Eureka3. 驗證服務注冊 總結應用場景1. 動態服務發現2. 負載均衡3. 服務治…

Android C++系列:Linux進程間關系

1. 終端 在UNIX系統中,用戶通過終端登錄系統后得到一個Shell進程,這個終端成為Shell進 程的控制終端(Controlling Terminal),在前面文章我們說過,控制終端是保存在PCB中的信 息,而我們知道fork會復制PCB中的信息,因此由Shell進程啟動的其它進程的控制終端也是 這個終端。…

OpenCV進行視頻分析(光流、目標跟蹤)----20240710

一、OpenCV進行光流分析 # 光流分析螞蟻軌跡 import numpy as np import cv2if __name__ == __main__:cap = cv2.VideoCapture(./pictures/ant.mp4)# ShiTomasi 角點檢測參數feature_params = dict(maxCorners=100

基于Java中的SSM框架實現水稻朔源信息系統項目【項目源碼】

基于Java中的SSM框架實現水稻朔源信息系統演示 SSM框架 SSM框架是基于Spring、SpringMVC以及Mybatis實現的針對JAVA WEB端應用的開發框架&#xff0c;通過SSM框架結構可以實現以上三種框架的優點集合&#xff0c;從而實現更加高效便捷的系統開發和呈現。該框架結構通過Spring框…

PolarisMesh源碼系列——服務如何注冊

前話 PolarisMesh&#xff08;北極星&#xff09;是騰訊開源的服務治理平臺&#xff0c;致力于解決分布式和微服務架構中的服務管理、流量管理、配置管理、故障容錯和可觀測性問題&#xff0c;針對不同的技術棧和環境提供服務治理的標準方案和最佳實踐。 PolarisMesh 官網&am…

main.cpp程序執行流程圖

當然&#xff0c;我會為你繪制一個程序執行流程圖&#xff0c;并用中文注釋來解釋 main.cpp 的代碼邏輯思想和執行流程。 程序執行流程圖 開始|V 初始化|V 打開攝像頭 (VideoCapture cap(0))|V 進入主循環 (while (true))|V 捕獲圖像 (cap >> srcImage)|V 圖像是否為空…

280個地級市金融集聚水平數據(2006-2022年)

2006年-2022年280個地級市金融集聚水平數據整理資源-CSDN文庫 金融集聚水平&#xff1a;衡量地級市金融發展的新維度 金融集聚水平是衡量一個地區金融發展程度的重要指標&#xff0c;它反映了金融機構、金融資源、金融服務在特定時間和空間的集中程度。這一指標的評估可以從多…

根據H在有限域GF(2^m)上求解生成矩陣G

原理 有時間再補充。 注1&#xff1a;使用高斯消去法。如果Py不為單位陣&#xff0c;則說明進行了列置換&#xff0c;此時G不是系統形式。 注2&#xff1a;校驗矩陣H必須是行滿秩才存在對應的生成矩陣G&#xff0c;且生成矩陣G通常不唯一。 matlab實現&#xff1a;只做列置…

視語坤川大模型智能體平臺亮相2024世界人工智能大會

7月4日-7月7日&#xff0c;以“以共商促共享以善治促善智”為主題的2024世界人工智能大會&#xff08;WAIC 2024&#xff09;在上海舉辦&#xff0c;世界頂級專家學者、知名企業代表、政界人士、高校組織等齊聚上海&#xff0c;共商發展、共話未來。 作為大會的重磅環節——昇…

Python面試題:編寫一個 Python 腳本來讀取 Excel 文件

要在 Python 中讀取 Excel 文件&#xff0c;可以使用 pandas 庫&#xff0c;這個庫提供了強大的數據處理和分析功能&#xff0c;并且支持讀取 Excel 文件。你還需要 openpyxl 庫來支持讀取 .xlsx 格式的 Excel 文件。以下是如何編寫一個腳本來讀取 Excel 文件的示例&#xff1a…

git 的cherry-pick選擇性提交

git cherry-pick 是 Git 中的一個非常有用的命令&#xff0c;它允許你將一個或多個特定的提交&#xff08;commit&#xff09;從一個分支應用到另一個分支上&#xff0c;而不是合并整個分支。 單個提交的 cherry-pick 假設你有一個 feature 分支&#xff0c;其中有一個提交&a…

【筆記】Android V 應用SDK升級適配和問題

說明 隨著Google釋放的Android版本,系統升級SDK到35,應用也需要升級上去,不然會報錯。 Android Studio Jellyfish | 2023.3.1 | Android Developers Android Studio 預覽版中的新功能 | Android Developers 當前版本的Android Studio

Elasticsearch:深度學習與機器學習:了解差異

作者&#xff1a;來自 Elastic Elastic Platform Team 近年來&#xff0c;兩項突破性技術一直站在創新的最前沿 —— 機器學習 (machine learning - ML) 和深度學習 (deep learning - DL)。人工智能 (AI) 的這些子集遠不止是流行語。它們是推動醫療保健、金融等各行業進步的關鍵…

Java面試八股之MySQL索引B+樹、全文索引、哈希索引

MySQL索引B樹、全文索引、哈希索引 注意&#xff1a;B樹中B不是代表二叉樹&#xff08;binary&#xff09;&#xff0c;而是代表平衡&#xff08;balance&#xff09;&#xff0c;因為B樹是從最早的平衡二叉樹演化而來&#xff0c;但是B樹不是一個二叉樹。 B樹的高度一般在2~…

es是如何處理索引數據的變動的?

1 概述 es是如何處理索引數據的變動的&#xff1f; 或者說索引數據變動時&#xff0c;es會執行哪些操作&#xff1f; refresh、fsync、merge 和 flush 操作有何作用&#xff1f; es是如何確保即使es發生宕機數據也不丟失的&#xff1f; 在回答上述問題前&#xff0c;可以先…

文件操作和IO流

前言&#x1f440;~ 上一章我們介紹了多線程進階的相關內容&#xff0c;今天來介紹使用java代碼對文件的一些操作 文件&#xff08;file&#xff09; 文件路徑&#xff08;Path&#xff09; 文件類型 文件操作 文件系統操作&#xff08;File類&#xff09; 文件內容的讀…