自学-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.mzph.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;主要用于编写和…