自學-C語言-基礎-數組、函數、指針、結構體和共同體、文件

這里寫自定義目錄標題

  • 代碼環境:
  • ?問題思考:
  • 一、數組
  • 二、函數
  • 三、指針
  • 四、結構體和共同體
  • 五、文件
  • 問題答案:

代碼環境:

Dev C++

?問題思考:

把上門的字母與下面相同的字母相連,線不能相交,不能碰到框。(文章末尾有答案)不要覺得不可能,請先思考思考。
在這里插入圖片描述

一、數組

C語言中的數組是存儲相同類型數據的集合,數組的元素可以通過下標訪問。

  1. 數組的聲明
    數組聲明時,必須指定數組的類型和大小。例如:
int arr[5]; // 聲明一個包含5個整數的數組
char str[20]; // 聲明一個包含20個字符的字符數組
  1. 數組的初始化
    數組可以在聲明時進行初始化。可以通過直接指定值來初始化數組:
int arr[5] = {1, 2, 3, 4, 5}; // 初始化數組

如果元素少于數組的大小,剩余的元素會被默認初始化為0:

int arr[5] = {1, 2}; // arr = {1, 2, 0, 0, 0}
  1. 數組的訪問
    數組元素通過下標訪問,下標從0開始。例如:
int arr[5] = {1, 2, 3, 4, 5};
printf("%d", arr[2]); // 輸出3
  1. 多維數組
    C語言支持多維數組。二維數組(常用于矩陣)是最常見的多維數組:
int matrix[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};

訪問二維數組時,可以用兩個下標:

printf("%d", matrix[1][2]); // 輸出6
  1. 數組作為函數參數
    數組可以作為函數參數傳遞。當傳遞數組時,實際上傳遞的是數組的指針,而不是數組的副本。例如:
void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}
}int main() {int arr[5] = {1, 2, 3, 4, 5};printArray(arr, 5); // 調用函數并傳遞數組
}
  1. 數組與指針的關系
    在C語言中,數組名本質上是一個指向數組首元素的指針。因此,數組和指針有很多相似之處:
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("%d", *(ptr + 2)); // 輸出3
  1. 動態數組
    C語言沒有內建的動態數組功能,但可以通過mallocfree函數來手動管理內存,創建和銷毀動態數組。例如:
int *arr = (int *)malloc(5 * sizeof(int)); // 動態申請內存
arr[0] = 1;
arr[1] = 2;
// 其他操作
free(arr); // 釋放內存
  1. 常見操作
  • 數組長度:C語言沒有內建的函數來獲取數組的長度,但可以通過sizeof操作符計算數組的大小:
int arr[5];
int len = sizeof(arr) / sizeof(arr[0]); // 計算數組的長度
  • 數組遍歷:可以使用for循環遍歷數組:
for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);
}

二、函數

C語言中的函數是執行特定任務的代碼塊,通過調用函數可以實現代碼的復用。

  1. 函數的基本概念
    函數是一段可以被反復調用的代碼。函數的定義通常包含返回類型、函數名稱、參數列表和函數體。
return_type function_name(parameter_list) {// 函數體// 執行任務return return_value; // 如果有返回值
}
  1. 函數的聲明
    在使用函數之前,通常需要聲明函數。函數聲明告訴編譯器函數的返回類型、名稱以及參數類型。函數聲明通常放在源文件的頂部或頭文件中。
int add(int, int); // 函數聲明
  1. 函數的定義
    函數定義包括函數的返回類型、名稱、參數及函數體。函數體包含執行任務的代碼。
int add(int a, int b) {return a + b; // 函數實現
}
  1. 函數的調用
    在程序的其他部分,調用函數來執行定義的任務。調用時需要提供必要的參數(如果有)。
int result = add(3, 5); // 調用函數
printf("%d", result); // 輸出 8
  1. 函數的返回類型
    函數可以返回一個值,也可以不返回值。常見的返回類型有 int, float, char, void 等。
  • 返回值類型:函數定義時,返回類型指定了函數返回數據的類型。
int multiply(int a, int b) {return a * b; // 返回int類型
}
  • void函數:如果函數沒有返回值,使用 void 作為返回類型。
void printMessage() {printf("Hello, World!");
}
  1. 參數傳遞
    C語言中有兩種方式傳遞參數:值傳遞地址傳遞
  • 值傳遞:在函數調用時,實參的值被復制到形參中,函數內部對形參的修改不會影響實參。
void addFive(int num) {num = num + 5;
}
int main() {int n = 10;addFive(n); // n不會改變,仍為10
}
  • 地址傳遞(引用傳遞):使用指針將變量的地址傳遞給函數,函數可以通過指針修改實際參數。
void addFive(int *num) {*num = *num + 5;
}
int main() {int n = 10;addFive(&n); // n變為15
}
  1. 遞歸函數
    遞歸是指一個函數在其定義中調用自身。遞歸通常用于解決可以分解為子問題的問題,如階乘、斐波那契數列等。
int factorial(int n) {if (n == 0) return 1; // 遞歸基準條件else return n * factorial(n - 1); // 遞歸調用
}
  1. 函數的作用域與生命周期
  • 局部變量:在函數內部聲明的變量,作用范圍僅限于該函數。局部變量在函數調用時創建,返回后銷毀。
  • 全局變量:在函數外部聲明的變量,整個程序范圍內都可訪問。全局變量在程序運行期間一直存在。
int globalVar = 100; // 全局變量void foo() {int localVar = 50; // 局部變量printf("%d", localVar);
}
  1. 函數指針
    函數指針是指向函數的指針。通過函數指針,可以在運行時動態決定調用哪個函數,常用于回調函數和事件驅動編程。
#include <stdio.h>void greet() {printf("Hello!");
}int main() {void (*func_ptr)() = greet; // 聲明函數指針func_ptr(); // 通過函數指針調用函數return 0;
}
  1. 內存管理與函數
    C語言中的函數并不會自動處理內存的分配和釋放,程序員必須顯式地管理內存。常用的內存管理函數有 malloc, free, calloc, realloc 等。
#include <stdlib.h>int* createArray(int size) {int *arr = (int*)malloc(size * sizeof(int)); // 動態分配內存return arr;
}int main() {int *arr = createArray(10); // 分配10個整數的內存free(arr); // 釋放內存return 0;
}
  1. 可變參數函數
    C語言允許函數接收可變數量的參數,這類函數一般使用 stdarg.h 庫。常見的例子是 printf 函數。
#include <stdarg.h>
#include <stdio.h>void printNumbers(int num, ...) {va_list args;va_start(args, num);for (int i = 0; i < num; i++) {printf("%d ", va_arg(args, int)); // 獲取下一個參數}va_end(args);
}int main() {printNumbers(3, 10, 20, 30); // 輸出: 10 20 30
}
  1. 函數的調用約定
    不同的編譯器和平臺可能使用不同的調用約定。常見的調用約定有 cdecl, stdcall 等,它們定義了如何傳遞參數、如何清理堆棧等。

三、指針

C語言中的指針是一個非常重要的概念,它允許程序直接操作內存。掌握指針的使用對于理解C語言的內存管理、函數調用、數組等方面非常有幫助。

  1. 指針的基本概念
    指針是一個變量,它存儲的是另一個變量的地址。指針允許我們通過地址來訪問和操作內存中的數據。
  • 聲明指針:指針的聲明需要在類型后加上一個星號(*)來表示該變量是一個指針。
int *ptr; // 聲明一個指向int類型的指針
  • 指針變量:指針變量存儲的是另一個變量的地址,而不是值本身。
  1. 指針的初始化與賦值
    指針必須被初始化才能使用,通常通過取地址符(&)來獲取變量的地址。
int num = 10;
int *ptr = &num; // 指針ptr指向num的地址
  1. 間接訪問(解引用)
    通過指針可以訪問其指向的變量。這個過程稱為解引用,通過星號(*)操作符來進行。
int num = 10;
int *ptr = &num; // ptr存儲num的地址
printf("%d", *ptr); // 輸出num的值,即10
  1. 指針與變量
    指針本身是一個變量,它保存了另一個變量的地址。通過指針可以修改指向的變量的值。
int num = 10;
int *ptr = &num;
*ptr = 20; // 通過指針修改num的值
printf("%d", num); // 輸出20
  1. 指針與數組
    數組名本質上是一個指向數組首元素的指針,因此可以通過指針操作數組。
int arr[3] = {1, 2, 3};
int *ptr = arr;
printf("%d", *(ptr + 1)); // 輸出2,ptr指向arr[0],*(ptr + 1)指向arr[1]
  1. 指針運算
    指針支持一些基本的運算,例如指針加減法。指針加法會根據指針所指向的數據類型自動調整步長。例如,int *ptr 加1,實際上會跳過一個int的空間(通常是4字節)。
int arr[3] = {1, 2, 3};
int *ptr = arr;
ptr++; // 指針ptr移動到arr[1]
printf("%d", *ptr); // 輸出2
  1. 空指針
    空指針是指不指向任何有效內存位置的指針。它常用于初始化指針變量,以避免它指向不確定的內存地址。空指針常用的值是NULL
int *ptr = NULL; // 空指針
if (ptr == NULL) {printf("指針為空\n");
}
  1. 指向指針的指針(多級指針)
    指針本身可以指向另一個指針,這稱為多級指針。常見的如二級指針、三級指針等。
int num = 10;
int *ptr = &num;
int **ptr2 = &ptr; // ptr2指向ptr,ptr指向num
printf("%d", **ptr2); // 輸出10
  1. 指針與函數
    指針在函數中的使用非常廣泛,常用于傳遞大塊數據(如數組),或者通過指針修改函數外部的變量值。
  • 指針作為函數參數:傳遞指針到函數,允許在函數內修改外部變量。
void increment(int *ptr) {(*ptr)++;
}int main() {int num = 10;increment(&num); // 傳遞num的地址printf("%d", num); // 輸出11
}
  • 返回指針的函數:函數可以返回指向局部變量的指針,但這樣做是危險的,因為局部變量在函數返回后會被銷毀。
int* foo() {int num = 10;return &num; // 返回局部變量的地址,不建議這么做
}
  1. 指針數組
    指針數組是一個數組,其中每個元素都是指針。例如,可以創建一個指向多個字符串的數組。
char *arr[] = {"Hello", "World"};
printf("%s", arr[1]); // 輸出 "World"
  1. 常量指針與指針常量
  • 常量指針:指向的內容不能被修改,但指針本身可以指向其他地址。
int num = 10;
int *const ptr = &num; // 常量指針
*ptr = 20; // 允許修改ptr指向的內容
ptr = &num2; // 錯誤,無法修改指針的地址
  • 指針常量:指針本身不能修改,但可以通過指針修改它所指向的內容。
int num = 10;
const int *ptr = &num; // 指針常量
*ptr = 20; // 錯誤,無法修改ptr指向的內容
ptr = &num2; // 允許修改指針的地址
  1. 指針與動態內存分配
    C語言通過malloc, calloc, realloc, 和 free來動態分配和釋放內存。使用指針操作動態分配的內存。
#include <stdlib.h>int *ptr = (int *)malloc(10 * sizeof(int)); // 動態分配內存
if (ptr != NULL) {ptr[0] = 5;printf("%d", ptr[0]);free(ptr); // 釋放內存
}
  1. 指針的內存布局
    指針類型的大小通常是固定的,依賴于平臺(例如,32位系統上通常是4字節,64位系統上通常是8字節)。指針本身只存儲地址信息。

  2. 指針的安全性
    指針操作不當可能導致以下問題:

  • 野指針:指向無效或未初始化的內存區域,可能導致程序崩潰或數據丟失。
  • 內存泄漏:動態分配的內存未釋放,導致內存浪費。
  • 緩沖區溢出:對指針操作時,超出內存邊界,可能會破壞數據或導致程序異常。

因此,在使用指針時,務必注意指針的初始化、使用和內存的正確管理。

四、結構體和共同體

C語言中的結構體(struct)和共用體(union)是用于存儲不同類型數據的復合數據類型,它們具有各自的特點和用途。

  1. 結構體(struct
    結構體是一個用戶自定義的數據類型,它允許將不同類型的數據組合在一起。每個數據成員稱為結構體的字段或成員。

1.1 結構體的定義
結構體通過struct關鍵字定義,并且可以包含不同類型的成員。

struct Person {char name[50];int age;float height;
};

1.2 結構體的聲明與初始化
結構體可以通過結構體名來聲明變量,并且可以通過指定字段名來初始化。

struct Person person1; // 聲明結構體變量// 初始化結構體變量
struct Person person2 = {"John", 25, 175.5};

結構體變量可以直接通過點(.)運算符訪問其成員:

printf("Name: %s\n", person2.name);
printf("Age: %d\n", person2.age);

1.3 結構體指針
結構體變量也可以通過指針來訪問。通過結構體指針訪問成員時,使用箭頭(->)運算符。

struct Person *ptr = &person2;
printf("Name: %s\n", ptr->name); // 使用箭頭運算符訪問結構體成員

1.4 結構體作為函數參數
結構體可以作為函數的參數傳遞。通常有兩種方式:

  • 按值傳遞:傳遞結構體的副本。
  • 按指針傳遞:傳遞結構體的地址,可以修改結構體的內容。
// 按值傳遞
void printPerson(struct Person p) {printf("Name: %s\n", p.name);printf("Age: %d\n", p.age);
}// 按指針傳遞
void updateAge(struct Person *p) {p->age = 30;
}

1.5 結構體的大小
結構體的大小取決于它的成員以及內存對齊要求。內存對齊是為了提高處理器訪問數據的效率,通常結構體的每個成員按照最大類型對齊方式來分配內存。

printf("Size of Person: %zu bytes\n", sizeof(struct Person));
  1. 共用體(union
    共用體是一個特殊的結構體,所有成員共享同一塊內存區域,因此共用體的大小是其最大成員的大小。共用體中的每個成員都可以存儲值,但任何時刻只能有一個成員被使用。

2.1 共用體的定義
共用體通過union關鍵字定義,它的成員共享同一塊內存。

union Data {int i;float f;char str[20];
};

2.2 共用體的聲明與初始化
共用體聲明后,它會分配足夠大的內存空間來存儲最大的成員。

union Data data1;
data1.i = 10;
printf("i: %d\n", data1.i); // 輸出i: 10

在同一個時間,只能訪問一個成員。如果你修改一個成員的值,其他成員的值可能會被覆蓋。

union Data data2;
data2.f = 3.14;
printf("f: %.2f\n", data2.f); // 輸出f: 3.14
data2.i = 100;
printf("i: %d\n", data2.i); // 輸出i: 100,str被覆蓋

2.3 共用體的大小
共用體的大小等于其最大成員的大小,因為所有成員共享同一塊內存區域。

printf("Size of Data: %zu bytes\n", sizeof(union Data));
  1. 結構體與共用體的區別
  • 內存分配:結構體的每個成員都有獨立的內存空間,而共用體的所有成員共享同一塊內存區域。
  • 大小:結構體的大小是所有成員大小之和,而共用體的大小是其最大成員的大小。
  • 使用場景:結構體用于需要存儲多個不同類型的數據并且這些數據同時有效的場景,而共用體用于在同一時間只需要存儲一個成員的值的場景,節省內存空間。
  1. 結構體與共用體的結合使用
    可以在結構體中嵌套共用體,也可以在共用體中嵌套結構體。這種方式常用于實現具有多種類型數據的復合數據結構。
struct Mixed {int x;union {int i;float f;} data;
};struct Mixed example;
example.x = 5;
example.data.i = 10; // 或者example.data.f = 3.14;
  1. 位域(Bit-fields)
    結構體中的位域是通過指定成員的位數來控制內存的精確分配。位域成員通常用于需要節省內存的場景。
struct Person {unsigned int age : 7;  // 7位來表示年齡unsigned int gender : 1;  // 1位來表示性別
};

位域成員的總和不能超過一個int類型的大小。位域可以指定某個數據成員占用的位數,通常用于硬件寄存器映射等場景。

  1. 結構體指針和共用體指針
    指向結構體和共用體的指針操作是相似的。可以使用指針訪問結構體或共用體的成員,但指向結構體的指針和指向共用體的指針在訪問時有所不同。
struct Person *ptr = &person1;
ptr->age = 30;  // 修改結構體成員union Data *ptr2 = &data1;
ptr2->i = 100;  // 修改共用體成員
  1. 結構體與共用體的使用場景
  • 結構體:結構體廣泛用于需要同時存儲多個不同類型數據的場景。例如,存儲學生信息(姓名、年齡、成績等)。
  • 共用體:共用體適用于節省內存的場景,特別是當不同數據成員不會同時使用時。例如,用于處理不同類型的網絡數據包,其中每個數據包類型的字段是不同的。

總結

  • 結構體適合存儲多個不同類型的變量,并且每個成員可以獨立地存儲值。
  • 共用體用于節省內存,多個成員共享同一塊內存空間,但同一時刻只能存儲一個成員的值。
  • 位域提供了精細的內存控制,通常用于低級編程和硬件編程。

五、文件

在C語言中,文件操作是非常重要的一部分,它使得程序能夠與外部存儲設備(如硬盤)進行數據交換。C語言提供了一些標準庫函數,用于打開、讀寫、關閉文件等操作。

  1. 文件的基本概念
    C語言中的文件操作通過文件指針來實現。文件指針是指向文件的指針,它包含了文件的信息(如文件的位置、狀態等)。C語言標準庫提供了一些函數來操作文件。

  2. 文件操作的基本流程
    在C語言中,文件操作的一般步驟如下:

  3. 打開文件

  4. 進行文件讀寫操作

  5. 關閉文件

  6. 文件指針
    文件指針是指向文件的指針,C語言中通過FILE類型來定義文件指針。使用標準庫函數打開文件時,會返回一個文件指針。

FILE *file;
  1. 打開文件
    在C語言中,使用fopen函數打開文件,fopen函數返回一個指向文件的指針,打開文件的模式指定了文件操作的類型(如讀、寫、追加等)。

4.1 fopen函數

FILE *fopen(const char *filename, const char *mode);
  • filename:文件的名稱(包括路徑)。
  • mode:打開文件的模式,表示文件的訪問權限。

常用的文件打開模式:

  • "r":以只讀方式打開文件,文件必須存在。
  • "w":以寫入方式打開文件,如果文件存在則覆蓋,不存在則創建。
  • "a":以追加方式打開文件,如果文件不存在則創建。
  • "rb":以二進制模式打開文件進行只讀操作。
  • "wb":以二進制模式打開文件進行寫入操作。
  • "r+":以讀寫方式打開文件,文件必須存在。
  • "w+":以讀寫方式打開文件,如果文件存在則覆蓋,不存在則創建。
  • "a+":以讀寫方式打開文件,文件不存在則創建,文件指針移到文件末尾。
  1. 關閉文件
    文件操作完成后,使用fclose函數關閉文件。關閉文件時,文件指針不再有效。
int fclose(FILE *file);
  1. 文件讀取
    文件讀取操作常用的函數包括fgetcfgetsfread等。

6.1 fgetc函數
fgetc用于讀取一個字符,并返回該字符。如果文件結尾則返回EOF(End Of File)。

int fgetc(FILE *file);

6.2 fgets函數
fgets用于從文件中讀取一行數據,直到遇到換行符或文件結尾。fgets會在讀取的字符串末尾添加\0

char *fgets(char *str, int num, FILE *file);
  • str:讀取的字符串存儲位置。
  • num:要讀取的最大字符數。
  • file:文件指針。

6.3 fread函數
fread用于從文件中讀取指定大小的數據塊,通常用于二進制文件的讀取。

size_t fread(void *ptr, size_t size, size_t count, FILE *file);
  • ptr:指向存儲讀取數據的內存區域。
  • size:每個數據塊的字節數。
  • count:要讀取的數據塊數量。
  1. 文件寫入
    文件寫入操作常用的函數包括fputcfputsfprintffwrite等。

7.1 fputc函數
fputc用于將一個字符寫入文件。

int fputc(int char, FILE *file);

7.2 fputs函數
fputs用于將字符串寫入文件。

int fputs(const char *str, FILE *file);

7.3 fprintf函數
fprintf用于格式化輸出到文件,類似于printf,但輸出目標是文件。

int fprintf(FILE *file, const char *format, ...);

7.4 fwrite函數
fwrite用于將內存中的數據塊寫入文件,通常用于二進制文件的寫入。

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *file);
  1. 文件位置指針操作
    文件指針用于記錄文件中當前操作的位置。可以使用fseekftellrewind函數進行文件指針操作。

8.1 fseek函數
fseek用于設置文件指針的位置。

int fseek(FILE *file, long offset, int whence);
  • offset:文件指針偏移量。
  • whence:指定偏移的基準位置(SEEK_SETSEEK_CURSEEK_END)。

8.2 ftell函數
ftell返回文件指針的當前位置。

long ftell(FILE *file);

8.3 rewind函數
rewind將文件指針移動到文件的開頭。

void rewind(FILE *file);
  1. 文件錯誤處理
    在文件操作過程中,可能會發生錯誤。C語言提供了以下函數來檢測和處理文件錯誤。

9.1 feof函數
feof用于檢測文件是否已到達結尾。

int feof(FILE *file);
  • 返回值:非零值表示已到達文件末尾,零表示未到達文件末尾。

9.2 ferror函數
ferror用于檢測文件是否發生錯誤。

int ferror(FILE *file);
  • 返回值:非零值表示發生錯誤,零表示沒有錯誤。
  1. 文件的讀取與寫入模式總結
    | 操作模式 | 說明 |
    |----------|-----------------------------|
    | "r" | 只讀模式 |
    | "w" | 寫模式,覆蓋原文件或創建新文件 |
    | "a" | 追加模式 |
    | "r+" | 讀寫模式 |
    | "w+" | 讀寫模式,覆蓋原文件或創建新文件 |
    | "a+" | 讀寫模式,追加內容 |
    | "rb" | 以二進制只讀模式打開 |
    | "wb" | 以二進制寫模式打開 |
    | "ab" | 以二進制追加模式打開 |
    | "r+b" | 以二進制讀寫模式打開 |

  2. 常見的文件操作示例
    示例1:讀取文件內容并輸出

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file == NULL) {printf("File not found!\n");return 1;}char ch;while ((ch = fgetc(file)) != EOF) {putchar(ch);}fclose(file);return 0;
}

示例2:將字符串寫入文件

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w");if (file == NULL) {printf("Error opening file!\n");return 1;}fputs("Hello, world!\n", file);fclose(file);return 0;
}

C語言提供了強大的文件操作功能,能夠幫助程序與外部存儲設備進行數據交換。通過熟悉和掌握文件打開、讀取、寫入、關閉、指針操作和錯誤處理等基本操作,可以高效地進行文件操作。文件操作涉及的函數和模式非常豐富,可以滿足各種需求。

問題答案:

你應該想到了吧?
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

VMware+Ubuntu+VScode+ROS一站式教學+常見問題解決

目錄 一.VMware的安裝 二.Ubuntu下載 1.前言 2.Ubuntu版本選擇 三.VMware中Ubuntu的安裝 四.Ubuntu系統基本設置 1.中文更改 2.中文輸入法更改 3. 輔助工具 vmware tools 五.VScode的安裝ros基本插件 1.安裝 2.ros輔助插件下載 六.ROS安裝 1.安裝ros 2.配置ROS…

PostgreSQL pg_repack 重新組織表并釋放表空間

pg_repack pg_repack是 PostgreSQL 的一個擴展&#xff0c;它允許您從表和索引中刪除膨脹&#xff0c;并可選擇恢復聚集索引的物理順序。與CLUSTER和VACUUM FULL不同&#xff0c;它可以在線工作&#xff0c;在處理過程中無需對已處理的表保持獨占鎖定。pg_repack 啟動效率高&a…

5G_WiFi_CE_射頻輸出功率、發射功率控制(TPC)和功率密度測試

目錄 一、規范要求 1、法規目錄&#xff1a; &#xff08;1&#xff09;RF Output Power (2)Transmit Power Control (TPC) &#xff08;3&#xff09;Power Density 2、限值&#xff1a; 二、EIRP測試方法 &#xff08;1&#xff09;測試條件 &#xff08;2&#xff…

掃描線離散化線段樹解決矩形面積并-洛谷P5490

https://www.luogu.com.cn/problem/P5490 題目描述 求 n n n 個四邊平行于坐標軸的矩形的面積并。 輸入格式 第一行一個正整數 n n n。 接下來 n n n 行每行四個非負整數 x 1 , y 1 , x 2 , y 2 x_1, y_1, x_2, y_2 x1?,y1?,x2?,y2?&#xff0c;表示一個矩形的四個…

Java項目之基于ssm的簡易版營業廳寬帶系統(源碼+文檔)

項目簡介 簡易版營業廳寬帶系統實現了以下功能&#xff1a; 此營業廳寬帶系統利用當下成熟完善的SSM框架&#xff0c;使用跨平臺的可開發大型商業網站的Java語言&#xff0c;以及最受歡迎的RDBMS應用軟件之一的Mysql數據庫進行程序開發。實現了營業廳寬帶系統基礎數據的管理&…

從入門到入土,SQLServer 2022慢查詢問題總結

列為,由于公司原因,作者接觸了一個SQLServer 2022作為數據存儲到項目,可能是上一任的哥們兒離開的時候帶有情緒,所以現在項目的主要問題就是,所有功能都實現了,但是就是慢,列表頁3s打底,客戶很生氣,經過幾周摸爬滾打,作以下總結,作為自己的成長記錄。 一、索引問題…

PDF處理控件Aspose.PDF教程:在Python、Java 和 C# 中旋轉 PDF 文檔

您是否希望快速輕松地在線旋轉PDF文檔&#xff1f;無論您需要修復文檔的方向還是只想重新排列頁面&#xff0c;本指南都能滿足您的需求。有簡單的方法可以解決此問題 - 無論您喜歡在線工具還是編程解決方案。 在本指南中&#xff0c;我們將向您展示如何免費在線旋轉 PDF&#…

編譯原理:first集和follow

一、First 集&#xff08;首符號集&#xff09; 定義&#xff1a; 對于符號&#xff08;非終結符或終結符&#xff09;或符號串&#xff0c;First 集是該符號串能夠推導出的所有可能開頭的終結符的集合。若符號串可以推導出空串&#xff08;ε&#xff09;&#xff0c;則 ε 也…

python實現簡單fast-cgi服務,對接到nginx

python代碼 import socket import struct import threading# FastCGI 頭格式&#xff08;8 字節&#xff09; FCGI_HEADER_FORMAT "!BBHHBx" FCGI_VERSION 1 FCGI_TYPE_BEGIN_REQUEST 1 FCGI_TYPE_PARAMS 4 FCGI_TYPE_STDIN 5 FCGI_TYPE_STDOUT 6 FCGI_TYPE_E…

vue開始時間小于等于結束時間,且開始時間小于等于系統時間,時間格式:年月日時分

// 日期配置 export const DATA_CONFIGS [{itemKey: "startDate",startDateKey: "startDate",endDateKey: "endDate",isStart: true,},{itemKey: "endDate",startDateKey: "startDate",endDateKey: "endDate",is…

PyCharm 下載與安裝教程:從零開始搭建你的 Python 開發環境

PyCharm 是一款專為 Python 開發設計的集成開發環境&#xff08;IDE&#xff09;&#xff0c;它提供了強大的代碼編輯、調試、版本控制等功能&#xff0c;是 Python 開發者的必備工具之一。如果你是初學者&#xff0c;或者正在尋找一款高效的開發工具&#xff0c;這篇文章將幫助…

Qt線程等待條件QWaitCondition

Qt 線程等待條件 概念 Qt提供了QWaitCondition類實現“等待條件”式的線程控制方法&#xff0c;它讓線程阻塞在等待條件的地方&#xff0c;直到條件滿足后才繼續執行下去。也就是說&#xff0c;QWaitCondition可以使一個線程在滿足一定條件時通知其他多個線程&#xff0c;使它…

RAG 和 RAGFlow 學習筆記

一、RAG&#xff08;檢索增強生成&#xff09; 1. RAG 的定義與核心思想 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09; 是一種結合 信息檢索&#xff08;Retrieval&#xff09; 和 文本生成&#xff08;Generation&#xff09; 的技術…

Windows連接服務器Ubuntu_MobaXterm

通過 SSH 遠程連接&#xff08;命令行方式&#xff09; &#x1f527; 所需工具&#xff1a; Windows&#xff1a;MobaXterm&#xff08;強烈推薦&#xff09;或 PuTTY Ubuntu&#xff1a;已開啟 SSH 服務 Ubuntu 開啟 SSH 服務&#xff08;僅需一次&#xff09; 在 Ubuntu …

Rust 中的高效視頻處理:利用硬件加速應對高分辨率視頻

引言 在視頻處理領域&#xff0c;隨著4K、8K甚至更高分辨率內容的普及&#xff0c;傳統的CPU計算方式逐漸顯得力不從心。無論是視頻剪輯、直播流處理還是格式轉換&#xff0c;高負載場景下CPU占用過高的問題常常讓開發者頭疼。硬件加速技術通過利用GPU等專用硬件分擔編解碼任務…

大模型提示工程中,提示、補全、指令、上下文和樣本這幾個概念的區別是什么?

提示 (Prompt) 定義&#xff1a;輸入給大模型的完整文本刺激&#xff0c;是與模型交互的主要方式。 特點&#xff1a; 是最廣義的概念&#xff0c;包含其他幾個元素整體輸入的總和&#xff0c;包括指令、上下文和樣本等內容決定模型如何理解和處理請求 示例&#xff1a; 分…

AI的未來演進

企業數字IP實戰&#xff1a;創始人分身如何實現品宣獲客雙贏&#xff1f; ——從量子化建模到聯邦學習的全鏈路技術拆解 一、行業痛點&#xff1a;品牌信任與獲客效率的雙重困局 2025年數據顯示&#xff0c;73%的企業因傳統營銷模式效率低下錯失市場機遇&#xff08;家居品牌…

軟件定義無線電39

13.8 RFSoC上PYNQ的SDR設計流程 本節中詳細介紹的設計過程可以分為六個獨立的步驟&#xff0c;如圖13.16所示&#xff0c;并在接下來的幾頁中進行討論。 13.8.1 初始設計過程 。在這里&#xff0c;系統設計人員必須考慮許多因素&#xff0c;例如RFDC接收和/或發送的頻率范圍…

?自動化網絡架構搜索(Neural Architecture Search,NAS)

NAS是一種旨在自動設計神經網絡結構的技術。傳統上&#xff0c;神經網絡的架構設計依賴于專家的經驗和大量的試錯過程&#xff0c;而NAS通過算法自動搜索網絡架構&#xff0c;以發現最適合特定任務的神經網絡設計。 NAS的主要組成部分包括&#xff1a; 搜索空間&#xff1a;定…

Ubuntu 22.04 安裝和運行 EDK2 超詳細教程

Ubuntu 22.04 安裝和運行 EDK2 超詳細教程 適合新手小白&#xff0c;從零開始 &#x1f31f; 1. 什么是 EDK2&#xff1f; EDK2&#xff08;EFI Development Kit 2&#xff09;是一個開源的 UEFI&#xff08;統一可擴展固件接口&#xff09;開發環境&#xff0c;主要用于編寫和…