当前位置: 首页 > news >正文

C语言学习笔记总结(一)

C语言基础

字节大小

char:1 字节
unsigned char:1 字节
short:2 字节
unsigned short:2 字节
int:通常为 4 字节(32 位平台)或 8 字节(64 位平台)
unsigned int:通常为 4 字节(32 位平台)或 8 字节(64 位平台)
long:通常为 4 字节(32 位平台)或 8 字节(64 位平台)
unsigned long:通常为 4 字节(32 位平台)或 8 字节(64 位平台)
long long:8 字节
unsigned long long:8 字节
float:4 字节
double:8 字节
long double:通常为 8 字节(32 位平台)或 16 字节(64 位平台)
"i love you"字符串C语言中占多少字节
C语言字符串是字符数组表示,并且结尾用\0
"i love you"={'i',' ','l','o','v','e',' ','y','o','u','\0'}
11
字节

变量

变量名只能由字母、数字和下划线组成,且必须以字母或下划线开头,不能用特殊字符

自增

int a=1;
int b=++a; //a先加1 a=2 在赋值给b=2
int c=a++; //先赋值给c c=1,a在自增1;a=2

变量后先加

循环

for(开始;判定条件;循环结束执行)

运算符

运算符表达式:(表达式有几个)一目、二目、三目

在这里插入图片描述

三目运算符:?:

逗号

int a;
printf("%d",(a=2*5,a*4,a+3));

在这段代码中,使用了逗号运算符。逗号运算符会从左到右依次计算每个表达式,并返回最右侧表达式的值。

首先,a=2*5a 赋值为 10

然后,a*4 计算得到 40,但这个值并没有被赋给任何变量,因此它会被忽略。

最后,a+3 计算得到 13,这是逗号运算符返回的值。

因此,printf("%d",(a=2*5,a*4,a+3)); 会输出 13

逻辑运算符

逻辑运算符的优先级从高到低为:NOT(!) > AND(&&) > OR(||)

&& 有一个为真就是真,前面为真不需要判断后面直接返回真

||全真为真,前面为假直接返回假

int x,y,z,t;    
x=y=z=1;
t=++x || ++y && ++z; 
printf("%d,%d,%d,%d",x,y,z,t);

++xx 自增 1,然后返回 x 的值,所以 ++x 的值为2,然后 t = ++x || ++y && ++z,因为 || 运算符具有短路特性,当 ++x 的值为真(非0)时,后面的 ++y && ++z 将不再执行,直接返回 ++x 的结果,所以 yz 的值没有改变,仍然为1。而 t 的值就是 ++x 的结果,也就是2。所以最后的输出结果为 2,1,1,1

普通函数

isspace是C语言中的一个函数,用于检查给定的字符是否是空白字符。

C语言程序的基本单位是函数。一个C语言程序可以由一个或多个函数组成,其中必须有一个名为main的函数,作为程序的入口点。

指针函数

看后面,就是一个函数

返回函数结果的地址

定义:int *f()

#include <stdio.h>
int *f(){static  int x = 10; //全局使用return &x;          //返回x的地址
}
int main() {int *r = f();   //接受返回地址printf("%d\n",*r);   //打印地址对应的值return 0;
}

函数指针

看后面就是一个指针 ;一个指向函数的指针;在内存空间中存放的是函数的地址;

int add(int a,int b){return a+b;
}
int main() {int (*r)(int a,int b) = &add;   //函数指针接受函数地址int out = r(2,3);         //调用函数printf("%d\n",out);return 0;
}

输出与输入

格式化输出

int x=10,y=3;
printf("%d\n",x%y,x/y);
输出:1

printf函数中,格式化字符串"%d\n"只对应一个输出,即x%y的结果

int a=3366;
printf("│%-08d│",a);

这段代码的目的是打印整数 a,值为 3366,在一个格式化的字符串中,字符串的格式为 “│ %-08d │”。让我们分析一下这个格式化字符串:

  • 是一个字面字符,它会被直接打印出来。
  • % 是一个格式说明符的开始。
  • - 表示左对齐。
  • 0 表示如果数字的位数少于指定的宽度,那么不足的部分会用0填充。
  • 8 表示数字的宽度为8位。
  • d 表示打印一个整数。

所以,这段代码会打印出 │33660000│。整数 a(3366)左对齐,并在右侧用0填充,以确保总共有8位数字。

int x;
x = printf("I am c program\n");
printf("x=%d", x);

首先打印字符串 “I am c program\n”,然后打印变量 x 的值。变量 x 的值就是 printf 函数返回的值,也就是打印的字符数(不包括最后的 ‘\0’ 字符)。

打印与++

#include <stdio.h>
//合并方法
int main() {int a = 1;printf("%d ",a++);//在前先打印,a在+1;return 0;
}
1 
#include <stdio.h>
//合并方法
int main() {int a = 1;printf("%d ",++a);//a先+1,后先打印;return 0;
}
2

数组

int arr[10] = {1,2,3,4,5,6,7,8,9,10,};
//c语言数组名是第一个元素的地址
int *p = arr;
int *p1 = arr+1;//数组第二个元素的地址
int *p2 = arr++;//不允许,编译报错
printf("%d",*p);
return 0;

字符串

定义字符串

char *str1 = "Hello, World 1!";
char str2[] = "Hello, World 2!";
printf("%s\n",str1);
printf("%s\n",str2);

文件读写

C语言操作文件的标准库是stdio.h库,这个库中包含了用于文件操作的函数,例如:

  1. fopen():打开文件;
  2. fclose():关闭文件;
  3. fgetc():从文件中读取一个字符;
  4. fgets():从文件中读取一行;
  5. fprintf():将格式化的数据写入文件;
  6. fscanf():从文件中读取格式化的数据。
FILE *fp; // 文件指针
char ch; // 读取的字符
// 打开文件,如果文件不存在则创建新文件
fp = fopen("./study.txt", "w+");
// 向文件中写入数据
fprintf(fp, "Hello, world!\n");
// 向文件中写入数据
fputs("This is testing for fputs...\n", fp);
// 将文件指针移到文件开头
fseek(fp, 0, SEEK_SET);
// 从文件中读取数据并输出到控制台
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
// 关闭文件
fclose(fp);

fprintf()fputs() 都是用于向文件中写入数据的 C 语言标准库函数,但它们有一些区别。

区别一:参数不同

fprintf() 函数需要指定格式化字符串以及要写入的数据,可以写入多种类型的数据,并且可以按照指定的格式进行输出。而 fputs() 函数只能写入字符串数据,不能写入其他类型的数据。

区别二:返回值不同

fprintf() 函数返回写入的字符数,如果发生错误则返回负值。而 fputs() 函数返回非负数表示成功,返回 EOF 表示失败。

区别三:功能不同

fprintf() 函数可以将多种类型的数据按照指定的格式写入文件中,可以实现更加复杂的输出操作。而 fputs() 函数只能将字符串写入文件中,功能相对较为简单。

综上所述,fprintf() 函数更加灵活和强大,可以实现更加复杂的输出操作,而 fputs() 函数则适用于简单的字符串写入操作。

fgetc() 是一个 C 语言标准库函数,用于从指定的文件中读取一个字符。

putchar() 函数会将 ch 字符输出到标准输出设备上,并返回输出的字符。如果输出失败,则返回 EOF

算法

数组合并

两个有序数组合并一个有序数组

#include <stdio.h>
//合并方法
int main() {int a[] = {1,3,5,7,9};int asize= sizeof(a)/ sizeof(a[0]);int b[] = {2,4,6,8,10};int bsize= sizeof(b)/ sizeof(b[0]);int r[] ={0,0,0,0,0,0,0,0,0,0};int rsize=asize+bsize;//合并ab到int i=0,j=0,l=0;while(i<=asize&&j<=bsize){if(a[i]<=b[j]){r[l]=a[i];i=i+1;}else{r[l]=b[j];j=j+1;}l=l+1;}for(int i=0;i<rsize;i++){printf("%d ",r[i]);}return 0;
}

动态规划

未知的问题用已知的解决

定义dp数组,判断数组里面是否有,有就取,没有就放在数组

斐波那契数列

int n =10;
int dp[n+1];
dp[0]=0;
dp[1]=1;
int l = sizeof(dp)/sizeof (dp[0]);
for (int j = 2; j <=l ; ++j) {dp[j]=dp[j-1]+dp[j-2];
}
for (int i = 0; i < l; ++i) {printf("%d ",dp[i]);
}
printf("%d ",dp[n-1]);

走楼梯

dp[1] = 1;  
dp[2] = 2;  
for (int i = 3; i <= n; i++) {  p[i] = dp[i - 1] + dp[i - 2];  
}  

最长连续递增子序列

#include <stdio.h>
int max(int a,int b){if(a>b){return a;}else{return b;}
}
int main() {int arr[] = {3,2,5,7,1,4,10,8,9};int len=sizeof(arr)/ sizeof(arr[0]);int dp[len]; //定义dp数组for (int i = 0; i < len; ++i) { //初始化dp[i]=1;};for (int i = 0; i < len; ++i) {int temp = arr[i];//i位置上的元素for (int j = i; j >0 ; j--) {if(arr[j]<temp && i==j+1){  //在i之前找到比这个小,并且是连续的dp[i]=dp[j]+1; //以i位置结尾的最长递增子序列的长度是j的加1(i本身)break;}}}int result = 1;for (int i = 0; i < len; ++i) { //初始化result=max(result,dp[i]);};printf("最长递增子序列的长度:%d",result);return 0;
}

贪心

最优解决:程序通过贪心算法计算出需要使用多少个硬币找零,收银员总是先给最大的硬币

也就是说要找的零钱张数最少

#include <stdio.h>
int found(int a[],int mon,int len,int dp[]){//要找给顾客的钱为0;就退出循环if(mon == 0){return 0;}else{for (int i = 0; i < len; ++i) {if(a[i]>=mon){//先找最大dp[i-1]=mon/a[i-1];mon=mon%a[i-1];len=i;break;}}return found(a,mon,len,dp);}
}
int main() {//若干零钱int arr[] = {1,2,5,10,20,50,100};int mon = 37;//实际要给顾客找零int len = sizeof(arr)/ sizeof(arr[0]);int dp[len];//对应零钱找的张数for(int i=0;i<len;i++){dp[i]=0;}found(arr,mon,len,dp);for(int i=0;i<len;i++){printf("%d张%d\n",dp[i],arr[i]);}return 0;
}

背包

01背包

#include <stdio.h>
int max(int a, int b) {return a > b ? a : b;
}int knapsack(int w[], int v[], int n, int W) {int i, j;//构建二维数组:行放入物品种类0-n号物品种类,列是背包对应的重量,ij是背包对应的最大价值int dp[n+1][W+1];// 初始化dp数组--背包重量为0,其最大价值为0;背包种类为0;其最大价值为0for (i = 0; i <= n; i++) {for (j = 0; j <= W; j++) {if (i == 0 || j == 0) {dp[i][j] = 0;} else {dp[i][j] = -1;}}}// 动态规划求解for (i = 1; i <= n; i++) {for (j = 1; j <= W; j++) {if (j < w[i-1]) {//当前背包重量小于物品重量dp[i][j] = dp[i-1][j]; //背包最大价值是背包重量-1对应的最大价值} else {//当前背包重量可以放该物品//不放,背包最大价值还是当前物品重量-1对应的价值//放,背包最大价值是当前放入物品重量对应的价值+没放之前背包对应的最大价值dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1]);}}}return dp[n][W];
}int main() {int w[] = {2, 1, 3}; // 物品的重量int v[] = {4, 2, 3}; // 物品的价值int W = 5; // 背包的总重量int n = sizeof(w) / sizeof(w[0]); // 物品的数量int max_value = knapsack(w, v, n, W); // 求最大价值printf("最大价值为:%d\n", max_value);return 0;}

回溯

DFS 递归判断迷宫有出路没有

#include <stdio.h>
#define M 5
#define N 5
//迷宫出口
int a=3;int b=4;
//迷宫
//0是没有访问过
//-1墙
//2访问过
int maze[M][N] = {{0, 0, 0, 0, 0},{0, -1, -1, 0, -1},{0, -1, 0, 0, -1},{0, -1, -1, -1, -1},{-1, 0, 0, 0, 0}};
//找出路
int find_path(int m,int n){//当前是不是目标,是:返回找到出口if(m==a && n==b){maze[m][n]=2;return 1;}//刚开始一定可以进去;标记走过maze[m][n]=2;//在迷宫内并且可以走//上if(0<=m-1&&m-1<=M&&maze[m-1][n]==0){return find_path(m-1,n);}//右else if(0<=n+1&&n+1<=M&&maze[m][n+1]==0){return find_path(m,n+1);}//下else if(0<=m+1&&m+1<=M&&maze[m+1][n]==0){return find_path(m+1,n);}//左else if(0<=n-1&&n-1<=M&&maze[m][n-1]==0){return find_path(m,n-1);}else {return 0;}}
int main() {if(find_path(0,0)){printf("有出路");}else{printf("没有出路");}//找出路}

BFS长草问题–BFS借助队列

【问题描述】
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,小块空地都将变为有草的小块。请告诉小明,k 个月后空地上哪些地方有草。
【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
【输出格式】
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
【样例输入】
4 5
.g...
.....
..g..
.....
2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
#include<stdio.h>
#include <stdlib.h>
#define M 6
#define N 6
// 定义链表节点结构体
typedef struct node {int data;struct node* next;
} Node;
// 定义队列结构体
typedef struct queue {Node* front; // 队头指针Node* rear; // 队尾指针int size; // 队列长度
} Queue;// 初始化队列
void initQueue(Queue* q) {q->front = NULL;q->rear = NULL;q->size = 0;
}// 判断队列是否为空
int isEmpty(Queue* q) {return q->front == NULL;
}// 获取队列长度
int getLength(Queue* q) {return q->size;
}// 入队操作
void enqueue(Queue* q, int data) {Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点newNode->data = data;newNode->next = NULL;if (isEmpty(q)) { // 如果队列为空,队头和队尾都指向新节点q->front = newNode;} else { // 否则,将新节点插入到队尾,并更新队尾指针q->rear->next = newNode;}q->rear = newNode; // 更新队尾指针q->size++; // 队列长度加1
}// 出队操作
int dequeue(Queue* q) {if (isEmpty(q)) { // 如果队列为空,返回错误码-1return -1;}int data = q->front->data; // 取出队头节点的数据Node* temp = q->front; // 用临时变量保存队头节点地址q->front = q->front->next; // 将队头指针指向下一个节点if (q->front == NULL) { // 如果队头指针为空,说明队列已空,将队尾指针也置为空q->rear = NULL;}free(temp); // 释放队头节点的内存空间q->size--; // 队列长度减1return data; // 返回取出的数据}
//第几个月后
int k = 1;
//草地
char c[M][N]={{'.','.','.','.','.','.'},{'.','.','.','.','g','.'},{'.','g','.','.','.','.'},{'.','.','.','.','.','.'},{'.','.','g','.','.','.'},{'.','.','.','.','.','.'}};
//bfs长草
void bfs(Queue *x,Queue *y){//初始化:长草地址加入队列for (int i = 0; i < M; ++i) {for (int j = 0; j < N ; ++j) {if(c[i][j]=='g'){enqueue(x,i);enqueue(y,j);}}}//队列长度大于0while(getLength(x)>0){//出队int qx = dequeue(x);int qy = dequeue(y);//循环拿到下一步//移动方向int mv[4][2]={{0,1},{1,0},{0,-1},{-1,0}};for(int i=0;i<4;i++){int *temp = mv[i];int tx = qx+temp[0];int ty = qy+temp[1];//如果下个方向可以长草if(0<=tx&&tx<M && c[tx][ty]=='.'&&0<=ty&&ty<N){//标记长草c[tx][ty]='g';//坐标加入队列enqueue(x,tx);enqueue(y,ty);}}}
}
int main(){printf("初始化草地:\n");for (int i = 0; i < M; ++i) {for (int j = 0; j < N ; ++j) {printf("%c ",c[i][j]);}printf("\n");}//创建队列Queue x;initQueue(&x); // 初始化队列Queue y;initQueue(&y); // 初始化队列//长草bfs(&x,&y);printf("%d个月草地长草后:\n",k);for (int i = 0; i < M; ++i) {for (int j = 0; j < M ; ++j) {printf("%c ",c[i][j]);}printf("\n");}return 0;
}

相关文章:

C语言学习笔记总结(一)

C语言基础 字节大小 char&#xff1a;1 字节 unsigned char&#xff1a;1 字节 short&#xff1a;2 字节 unsigned short&#xff1a;2 字节 int&#xff1a;通常为 4 字节&#xff08;32 位平台&#xff09;或 8 字节&#xff08;64 位平台&#xff09; unsigned int&#x…...

WPF:自定义按钮模板

1.WPF:自定义按钮模板 自定义封装的按钮属性可写在<Button.Template>中 Background"{TemplateBinding Background}"中的TemplateBinding代表使用按钮本身所使用的背景颜色 不在样式内修改背景颜色 例如&#xff1a; <Button Width"300" Height&q…...

Spring Boot集成Swagger接口分类与各元素排序问题

在上一篇中我们完成使用JSR-303校验&#xff0c;以及利用Swagger2得到相关接口文档&#xff0c;这节&#xff0c;我们在原先的基础之上&#xff0c;完成Swagger中关于对各个元素之间控制前后顺序的具体配置方法。 Swagger的接口的分组 首先我们需要对Swagger中的接口也就是以…...

盘点国产ChatGPT十大模型

什么是ChatGPT ChatGPT是一种基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的聊天机器人。GPT是一种基于深度学习的自然语言处理模型&#xff0c;它使用了Transformer架构来处理文本数据。GPT模型通过在大规模文本数据上进行预训练&#xff…...

【C++杂货铺】C++11特性总结:列表初始化 | 声明 | STL的升级

文章目录 一、C11简介二、统一的列表初始化2.1 { } 初始化2.2 列表初始化在内置类型上的应用2.3 列表初始化在内置类型上的应用2.4 initializer_list2.4.1 {1, 2, 3} 的类型2.4.2 initializer_list 使用场景2.4.3 模拟实现的 vector 中的 { } 初始化和赋值 三、声明3.1 auto3.1…...

doris的be其中失败的原因

doris的be其中失败的原因 修改limits文件 vim /etc/security/limits.conf1在文件的末尾处添加或者修改 * soft nofile 204800 * hard nofile 204800 * soft nproc 204800 * hard nproc 204800vim /etc/sysctl.conf#添加 fs.file-max 6553560 vm.max_map_count 2000000 1 2…...

LeetCode 面试题 16.04. 井字游戏

文章目录 一、题目二、C# 题解 一、题目 设计一个算法&#xff0c;判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘&#xff0c;由字符" "&#xff0c;“X"和"O"组成&#xff0c;其中字符” "代表一个空位。 以下是井字游戏的规则&#…...

Nodejs和Node-red的关系

NPM相关知识 npm概念 npm&#xff1a;Node Package Manager&#xff0c;Node包管理器。是Node.js默认的&#xff0c;以JavaScript编写的软件包管理系统。 npm工作原理 npm的操作原理是各个官网使用npm publish把代码提交到npm的服务器&#xff0c;其他人想要使用这些代码&am…...

Spring Boot整合OAuth2实现GitHub第三方登录

Spring Boot整合OAuth2&#xff0c;实现GitHub第三方登录 1、第三方登录原理 第三方登录的原理是借助OAuth授权来实现&#xff0c;首先用户先向客户端提供第三方网站的数据证明自己的身份获取授权码&#xff0c;然后客户端拿着授权码与授权服务器建立连接获得一个Access Token…...

Android [SPI,AutoSerivce,ServiceLoader]

记录一下在Android中使用SPI的过程。 1.项目gralde文件。 plugins {id kotlin-kapt } dependencies {implementation com.google.auto.service:auto-service:1.0-rc7 kapt "com.google.auto.service:auto-service:1.0-rc7" } 这个AutoServ…...

【Linux】ASCII码表-256个

ASCII码简介: ASCII码 是现今最通用的单字节编码系统&#xff0c;并等同于国际标准ISO/IEC 646 。在这个页面&#xff0c;你可以找到8位的256个字符、ASCII码表和Windows-1252 (code page 1252&#xff0c;它是国际标准ISO 8859-1的一个扩展字符集) 标准保持一致;ASCII码 是 A…...

node.js - 上传文件至阿里云oss

deploy.js const fs require(fs) const path require(path) const util require(util) const OSS require(ali-oss)/*因为&#xff0c;在Node.js中&#xff0c;许多核心模块的函数都是采用回调函数的形式进行异步操作的&#xff0c;即在操作完成后调用回调函数来处理结果。…...

xxl-job项目集成实战,全自动项目集成,可以直接使用到项目中

如果你看官方文档&#xff0c;在研究透&#xff0c;至少也得几天时间&#xff0c;如果你直接看我的文档&#xff0c;快速用到项目中&#xff0c;也就10分钟就搞好了。 xxl-job功能确实很强大&#xff0c;而且使用的人比较多&#xff0c;既然在使用xxl-job&#xff0c;那肯定是…...

Qt生成PDF报告

文章目录 一、示意图二、实现部分代码总结 一、示意图 二、实现部分代码 //! 生成测试报告 void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err) {//QDir dir;if(!dir.exis…...

Jenkins 安装全攻略:从入门到精通

目录 一&#xff1a;安装文件夹准备 1.打开&#xff0c;/home/admin目录 2.新建三个文件夹 二&#xff1a;安装tomcat 1.打开tomcat目录进行tomcat安装 2.解压tomcat文件 3.开放端口号 4.启动tomcat 5.浏览器访问tomcat 三&#xff1a;安装Maven 1.打开maven目录进行…...

迎重阳,话养老:平安养老险如何助力国民“养老梦”?

10月23日&#xff0c;我们将迎来传统节日重阳节&#xff0c;又称敬老节&#xff0c;自古就有祭祖、登高、赏菊三大风俗&#xff0c;流传至今&#xff0c;已成为人们孝老敬老的重要节日。 随着老龄化日益加深&#xff0c;在“敬老”的同时如何“备老”成为人民群众长期热议的话题…...

微信小程序获取用户信息

个人博客 微信小程序获取用户信息 个人微信公众号&#xff0c;求关注&#xff0c;求收藏&#xff0c;求指错。 文章概叙 本文主要讲的是小程序获取用户信息的&#xff0c;更新测试时间是2023-10-25 更改原因 首先&#xff0c;官网上的解释是这样的&#xff0c;为了安全合…...

Mysql 索引原理和优化方式

一、索引原理 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。可以联想到字典中的目录。 索引的分类 &#xff08;1&#xff09; Hash 索引 Hash 索引是比较常见的一种索引&#xff0c;他的单条记录查询的效率很高&#xff0c;时间复杂度为1。但是&#xff0c…...

Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题

1&#xff1a;首先使用VMware Workstation安装一个Ubuntu的系统。 2&#xff1a;现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3&#xff1a;进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4&#xff1a;提示下面错误&#xff0c;Package open-vm…...

【Docker】Docker Swarm介绍与环境搭建

为什么不建议在生产环境中使用Docker Compose 多机器如何管理&#xff1f;如何跨机器做scale横向扩展&#xff1f;容器失败退出时如何新建容器确保服务正常运行&#xff1f;如何确保零宕机时间&#xff1f;如何管理密码&#xff0c;Key等敏感数据&#xff1f; Docker Swarm介…...

国产CAN总线收发芯片DP1042 兼容替换TJA1042

说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片&#xff0c;可应用于卡车、公交、小汽车、工业控制等领域&#xff0c;支持 5Mbps CAN FD 灵活数据速率&#xff0c;具有在总线与 CAN 协议控制器之间进行差分信号传输的能力&#xff0c;完全兼容“ISO…...

[架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构

目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图&#xff0c;是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 …...

【接口技术】定时计数器习题

1&#xff1a;8253芯片有______个端口地址。 【可选】 2 3 4 6 解答&#xff1a;4 2&#xff1a;8253芯片有______种工作方式。 【可选】 3 4 5 6 解答&#xff1a;6 3&#xff1a; 8253芯片内部有完全独立的______。 【可选】 6个16位计数通道 3个16位计数通道 6个8位计…...

DC电源模块的的散热结构合理布局

BOSHIDA DC电源模块的的散热结构合理布局 DC电源模块在工业控制、通讯、汽车电子等领域广泛应用。然而&#xff0c;随着功率密度不断提高&#xff0c;DC电源模块产生的热量也越来越大&#xff0c;散热问题变得越来越突出。为了保障电路的稳定性和可靠性&#xff0c;必须采取合…...

Fedora Linux 38下安装音频与视频的解码器和播放器

Fedora Linux 38 操作系统安装好后&#xff0c;默认是没有音频与视频的解码器的&#xff0c;音频与视频的播放体验非常差劲。但是第三方的软件源中有解码器和播放器的软件&#xff0c;需要我们自己手动安装。、 连接互联网&#xff0c;打开Shell命令行&#xff1a; 1. sudo d…...

边缘计算:云计算的延伸

云计算已经存在多年&#xff0c;并已被证明对大大小小的企业都有好处&#xff1b;然而&#xff0c;直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理&#xff0c;更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…...

【经验分享】在Kylin桌面版操作系统中配置openGauss的ODBC数据源

引言 openGauss是一款开源的关系型数据库管理系统&#xff0c;它提供了强大的功能和性能&#xff0c;可以满足各种企业级应用的需求。与此同时&#xff0c;ODBC&#xff08;Open Database Connectivity&#xff09;是一个标准的数据库访问接口&#xff0c;它允许应用程序通过统…...

WSL——ubuntu中anaconda换源(conda、pip)

1、conda 打开Ubuntu&#xff0c;输入下列命令。 conda config --set show_channel_urls yes 在文件管理器地址栏&#xff0c;输入&#xff1a;\\wsl$。打开Ubuntu根路径&#xff0c;其中显示了.condarc文件。 以文本形式打开&#xff0c;并输入要换的源&#xff0c;保存即可。…...

IP地址在网络安全中的关键作用

IP地址&#xff08;Internet Protocol Address&#xff09;是互联网世界中的重要标识符&#xff0c;它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此&#xff0c;还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…...

Android.mk 中覆盖应用包名

项目场景&#xff1a; 一般来讲应用包名都是配置在 AndroidManifest.xml 中的&#xff0c;但遇到特殊情况&#xff0c;需要修改源码中应用包名 通常都会先去改 AndroidManifest.xml package 但改为后编译发现一顿错误&#xff0c;原因是 java 类中已经指定了 R 文件包名&…...