C语言刷题日记(附详解)(1)
一、选择判断部分
第一题:
如下代码是否存在风险,并说明原因和修改方案
#include<stdio.h>
int main()
{char* str = "hello world";*str = 'a';return 0;
}
思路提示:这种形式的字符串存储在什么区域呢?是否真的有写入权限?
答案:运行会报错!!!
因为这种形式的字符串是存储在常量区的,而对于储存在常量区的数据只能进行读取,并不能进行写入,所以此时直接对str所指向的值进行修改是不行的。当然,如果我们先将字符串存放在数组形式中,就可以对数据进行修改啦:
#include<stdio.h>
int main()
{char str[] = "hello world";char* pstr = str;*str = 'a';return 0;
}
第二题:
若定义:int a[2][3]={1,3,5,7,9,11},以下描述正确的是( )
A:*(a + 1)为元素7的地址
B:(a[1] + 1)的值是5
C:**(a + 1) + 2值是11
D:a[0]和a不同
答案:A
题解:在二维数组中,*(a + 1)代表的是第二列首元素的地址,而第二列首元素对应的值为7,则A是正确的。而(a[1] + 1)所代表的是第二列的第二个元素的地址,对应的值应该为9的地址(需要再解引用一次才是9),故B是错误的。**(a + 1) + 2中**(a + 1)所代表的是第二列首元素,此值为7,+2得9,并不是11,所以C是错误的。a所代表的是首元素地址,也就是数组首地址,而a[0]代表的是第一列的首元素地址,同样也是数组首地址,故a和a[0]其实是相同的。
第三题:
请问下列代码的输出是多少 ( )
#include<stdio.h>
int main()
{int m[] = { 1,2,3,4,5,6,7,8,9,0 };int(*p)[4] = (int(*)[4])m;printf("%d", p[1][2]);return 0;
}
思路提示:int(*p)[n]代表的是什么?而int* p[n]代表的又是什么?p[1][2]中p这个二维数组是对一维数组m以什么形式的拆分所得到的呢?
答案:输出结果是7。
题解:int∗ p[n] 表示的是大小为n的,用来存储指针变量的指针数组。
int(∗p)[n] 表示的是一个指向有n个元素的数组的数组指针。
而对于(int(*)[4])m, 我们可以联想一下:(int)m 就是将m强制类型转换为int型,而此时(int(*)[4])m也与(int)m的格式相似,而(int(*)[4])的格式代表了一个以4位元素组成一组的数组指针,此时将m强制类型转换为它,那么m现在就应该是{{1,2,3,4},{5,6,7,8},{9,0, , }};而p[1][2]所指向的就是第二列的第三个元素,也就是7。
第四题:
说出以下代码的错误之处,并说明原因:
char* getmemory(void)
{char p[] = "hello world";return p;
}
void test()
{char* str = NULL;str = getmemory();printf("%s", str);
}
int main()
{test();return 0;
}
思路提示:在getmemory函数中定义的p值在什么区域?是全局变量?还是局部变量?还是静态变量?
答案:运行不报错,但也不会输出hello world,而是随机输出乱码。
题解:因为当我们将str置空之后,将str传入getmemory函数中,虽然getmemory函数中期望的定义并返回的p为hello world,但p是一个局部变量,当退出函数时,p会自动销毁,而此时我们再打印str时,会发现str不再是NULL了,但也不会是hello world,而是随机的乱码。
第五题:
请问下列代码的输出是什么( )
int main()
{char* str = "hello.com";int i;str = "hello world!";int len = strlen(str);printf("%d \n", len);printf("%c \n", *(str + 4));printf("%s \n", (str + 6));return 0;
}
答案:
12
o
world!
题解:因为将str重新赋值后长度发生了改变,此时长度为12,*(str + 4)对应的是str字符数组中第五个字符,也就是o,而打印字符串形式(str + 6)代表的就是跳过str前六个字符再进行打印,也就是world!。
二、编程题部分
第一题:统计字母,空格,字符数!
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
输入样例:
aaabbb11223344 @@@@
输出样例:
数字个数为:8
字母个数为:6
空格个数为:3
字符个数为:4
思路提示:想要做到分别统计出一段字符中的英文字母,空格,数字以及其他字符个数,我们可以定义出四个计数器,分别来统计数字,字母,空格,字符的个数。然后我们可以定义一个整型变量sz用来存放这段字符的长度,通过一个for循环将这段字符的每一个字符遍历一边,并且对每一个字符进行判断,使相应的计数器自增,最后按格式输出它们的个数。
答案:
int main()
{char arr[100];fgets(arr, 100, stdin);int sz = strlen(arr) - 1;int shunum = 0;int zinum = 0;int kongnum = 0;int funum = 0;int i = 0;for (i = 0; i < sz; i++){if (arr[i] >= '0' && arr[i] <= '9')shunum++;else if ((arr[i] >= 'a' && arr[i] <= 'z') || (arr[i] >= 'A' && arr[i] <= 'Z'))zinum++;else if (arr[i] == ' ')kongnum++;elsefunum++;}printf("数字个数为:%d\n", shunum);printf("字母个数为:%d\n", zinum);printf("空格个数为:%d\n", kongnum);printf("字符个数为:%d\n", funum);return 0;
}
需要注意的是:在对定义的字符串赋值时,我们使用的是fgets函数而并非scanf("%s"),这是因为使用scanf的形式进行赋值,在遇到空格时会终止赋值,所以无法判断空格的个数。而fgets函数在进行赋值时,大部分情况下不会被终止,只有遇到换行符号"\n",或者已经达到输入大小的限度才会终止。
由图我们可以知道,fgets函数的原型,以及fgets传参的参数类型。
char* fgets(char* str, int num, FILE* stream)
第一个参数char* str代表的是:容器的地址。
第二个参数int num代表的是:容器的大小。
第三个参数FILE* stream代表的是:从哪里开始读取。
在题中我们使用的格式为fgets(arr, 100, stdin);这段代码就代表,我们需要为地址为arr的容器进行赋值,并且容器最大为100,从0(键盘)开始读取。(stdin代表输入流,表示从0(键盘)开始记录)
第二题:然后是几点?
我们使用四个数字来代表时间,比如1209代表12点零9分。而此题中,你的代码需要计算之前的时间加上经过的时间后的到的现在的时间。
读入两个数字,一个数字代表之前的时间,另一个数字代表经过的时间,而最后输出现在的时间。比如我们输入:1130 160; 输出:1410;
思路提示:如果直接将时间用一个数来表示,那么将本是100进1的小时位改成60进1的小时位未免过于繁琐,我们是否可以尝试一下将时间分成两个数字,分别代表小时和分钟呢?这样或许会方便很多哦~
答案:
int main()
{int time;int minute;scanf("%d %d", &time, &minute);int time1 = time / 100;//用来表示小时int time2 = time % 100;//用来表示分钟if (minute > 0)//用来判断经过时间>0{while (minute > 60){time1++;minute -= 60;}}else if (minute < 0)//用来判断经过时间<0{while (minute < 0){time1--;minute += 60;}}time2 += minute;if (time2 >= 60)//将>60的分钟进位{time1++;time2 -= 60;}if (time1 > 24)time1 -= 24;if(time2<10)//补充分钟为个位时,中间缺少的0printf("%d0%d", time1, time2);elseprintf("%d%d", time1, time2);return 0;
}
题解:我们定义两个变量为time1和time2,time1 = time / 100;代表只取两个高位数,也就是小时。而time2 = time % 100;代表只取两个低位数,也就是分钟。之后我们使用if选择语句和while循环语句,将流逝的时间minute分别加在小时位和分钟位上。当minute>60时,不断地将minute自减60,并且同时为小时位+1。同时也要注意,此题中输入流逝时间为负数的情况(难道这就是传说中的反方向的钟?!),同样的当minute<0时,不断地将minute自增60,并且同时小时位-1。最后将剩余的时间加在分钟位上,再进行一次time2是否>=60的判断,然后此题就解决啦~怎么样,只要想到将小时和分钟分开算,其实还是很简单的呢。
第三题:阶乘计算升级版
本题要求实现一个打印非负整数的阶乘的函数。
要求:其中N是用户传入的参数,其值不超过1000。如果N
是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
整体代码:
#include <stdio.h>void Print_Factorial(const int N)
{/* 你需要编写并实现此代码 */}int main()
{int N;scanf("%d", &N);Print_Factorial(N);return 0;
}
思路提示:平时我们使用的阶乘计算方法很简单,比如我们此时要求5!,只需要定义一个整形变量初始化值为1,for(i=1;i<=5;i++),使此变量在for循环中与i分别相乘,就能求出5!
int main()//阶乘计算初阶版
{int a;scanf("%d", &a);int i = 0;int sum = 1;for (i = 1; i <= a; i++){sum *= i;}printf("%d", sum);return 0;
}
但这是之前的初阶版,对于比较小的数字求阶乘还勉强能做到,但如果要求的阶乘位数很高呢,高到我们用long long型变量也接收不了,那该怎么办呢?给大家一个提示:我们可以定义一个很大的数组,用数组中的元素分别放置阶乘结果的每一位数字,这样无论结果位数多大,我们也能轻松自如的接收啦~
(在此大家可能觉得,就算知道了用数组接收每一位数字的思路,但想要实现能够计算1000!的函数还是太难太繁琐了,确实这是一个较难的题(也可能是我菜(ㄒoㄒ)),那让我们先做一个稍微比较好理解的题来练练手吧~)
练手题:大数加法
利用数组的形式存储每一位数字并进行运算。
运行效果:
大数加法的核心思想与阶乘计算升级版的思想是一致的,我们需要使用数组来接收每一位数字并运算。因为是大数加法,所以输入的数字也可能非常大,所以输入的数字也需要使用数组来存储。
因为我们需要使每一位数字存储在数组相应的位置,并且这一位数字必须是个位数,所以我们可以将其转换成字符形式,这样输入运算数时,自动就将每一位运算数当作字符存储在相应位置了~~~那么有了思路,具体来操作一下:我们定义三个char型数组,char a[10001]用来接收大数运算数(存入时为字符类型),char arr1[10001]和char arr2[10001]用来接收两个大数运算数(接收时将每一位都转换成数字类型)。
char a[10001] = { 0 };//用于存储运算数(字符形式)
char arr1[10001] = { 0 };//用于接收运算数(接收需转换成数字形式)
char arr2[10001] = { 0 };//用于接收运算数(接收需转换成数字形式)
printf("输入两个运算数:\n");
scanf("%s", a);
for (i = strlen(a) - 1; i >= 0; i--)
{arr1[tmp++] = a[i] - '0';//将字符转换为数字
}
scanf("%s", a);
for (tmp = 0,i = strlen(a) - 1; i >= 0; i--)
{arr2[tmp++] = a[i] - '0';//将字符转换为数字
}
解决了大数运算数的传输与接收,那么再让我们来思考一下,大数运算数如何通过数组的形式进行每一位的运算呢?
让我们来举一个例子,并且逐步分析,来看一下运算的过程:
比如此时我们输入的arr1为97,输入的arr2为75,那么两者运算过程就会是:
个 十 百7 9 05 7 0(第一次运算)tmp = arr1[i] + arr2[i] + up; (tmp = 7 + 5 + 0 = 12)arr1[i] = tmp % 10; (arr1[i] = 12 % 10 = 2)up = tmp / 10; (up = 12 / 10 = 1)(第二次运算)tmp = arr1[i] + arr2[i] + up; (tmp = 9 + 7 + 1 = 17)arr1[i] = tmp % 10; (arr1[i] = 17 % 10 = 7)up = tmp / 10; (up = 17 / 10 = 1)(第三次运算)tmp = arr1[i] + arr2[i] + up; (tmp = 0 + 0 + 1 = 1)arr1[i] = tmp % 10; (arr1[i] = 1 % 10 = 1)up = tmp / 10; (up = 1 / 10 = 0)(结束运算)结果为:arr1[0] = 2 arr1[1] = 7 arr1[2] = 1;(97 + 75 = 172)
由此,我们就能够直观的看出运算过程到底是何种方式~我们可以定义两个整型变量tmp和up来辅助运算,tmp代表此次两个位数相加的和,up代表两个位数相加后是否需要进1。而arr1[i]用来存储此次运算后得到的此位数字(只需要取10的余数即可)。将这个思路转化为运算公式的形式就会是这样:
for (i = 0; i < 10000/*运算的最大位数*/; i++)
{tmp = arr1[i] + arr2[i] + up;//两数相加运算arr1[i] = tmp % 10;up = tmp / 10;
}
怎么样?转化为运算公式之后,是不是感觉一下简便了很多呢~接下来就只剩下最后的打印工作了,此处我们需要注意的是,之前我们对arr1和arr2进行存储时,使用的是逆序的存储,这样的目的是使低位数在前,高位数在后,这样我们就能做到使用for循环运算时先计算低位数,再计算高位数。相应的,得出的结果也理所当然的是逆序,所以打印时我们需要从后往前打印,才能得出真正的结果~
答案:
int main()
{char a[10001] = { 0 };//用于存储运算数(字符形式)char arr1[10001] = { 0 };//用于接收运算数(接收需转换成数字形式)char arr2[10001] = { 0 };//用于接收运算数(接收需转换成数字形式)int tmp = 0;int up = 0;int i = 0;printf("输入两个运算数:\n");scanf("%s", a);for (i = strlen(a) - 1; i >= 0; i--){arr1[tmp++] = a[i] - '0';//将字符转换为数字}scanf("%s", a);for (tmp = 0,i = strlen(a) - 1; i >= 0; i--){arr2[tmp++] = a[i] - '0';//将字符转换为数字}printf("运算结果为:\n");for (i = 0; i < 10000; i++){tmp = arr1[i] + arr2[i] + up;//两数相加运算arr1[i] = tmp % 10;up = tmp / 10;}for (i = 10000; i >= 0; i--){if(arr1[i]!=0)for(i;i>=0;i--)//逆序打印出真正结果printf("%d", arr1[i]);}return 0;
}
那么学会了大数相加,让我们收回思路,继续解决阶乘计算升级版吧~
还是同样的思路,我们需要定义一个足够大的char型数组用来后续存放i的阶乘,然后先分别对<0求阶乘和对0,对1求阶乘的情况进行解决:
#include <stdio.h>
void Print_Factorial(const int N)
{char a[5000] = { 1 };//因为是相乘而不是相加,如果初始化为0则无法进行相乘int tmp = 0; //所以我们将第一个元素初始化为1,使其能够正常运算int i = 0; //并且其他的元素仍为0,使用进位来增大其余元素int j = 0;int up = 0;if (N < 0)printf("Invalid input");else if (N == 0 || N == 1)printf("1");else{...}
而else中的内容,就是求阶乘的运算了~
同样的,让我们举个例子,逐步分析一下应该如何运算:
从 i = 2 开始 i<=5 i++ 分别求2! 3! 4! 5!(计算2!)//2 0 0tmp = a[j] * i + up; (tmp = 1 * 2 + 0 = 2)a[j] = tmp % 10; (a[j] = 2 % 10 = 2)up = tmp / 10; (up = 2 / 10 = 0)(计算3!)//6 0 0tmp = a[j] * i + up; (tmp = 2 * 3 + 0 = 6)a[j] = tmp % 10; (a[j] = 6 % 10 = 6)up = tmp / 10; (up = 6 / 10 = 0)(计算4!)//4 2 0(逆序)tmp = a[j] * i + up; (tmp = 6 * 4 + 0 = 24)a[j] = tmp % 10; (a[j] = 24 % 10 = 4)up = tmp / 10; (up = 24 / 10 = 2)tmp = a[j] * i + up; (tmp = 0 * 4 + 2 = 2)a[j] = tmp % 10; (a[j] = 2 % 10 = 2)up = tmp / 10; (up = 2 / 10 = 0)(计算5!)//0 2 1(逆序)tmp = a[j] * i + up; (tmp = 24 * 5 + 0 = 120)a[j] = tmp % 10; (a[j] = 120 % 10 = 0)up = tmp / 10; (up = 120 / 10 = 12)tmp = a[j] * i + up; (tmp = 0 * 5 + 12 = 12)a[j] = tmp % 10; (a[j] = 12 % 10 = 2)up = tmp / 10; (up = 12 / 10 = 1)tmp = a[j] * i + up; (tmp = 0 * 5 + 1 = 1)a[j] = tmp % 10; (a[j] = 1 % 10 = 1)up = tmp / 10; (up = 1 / 10 = 0)
(整理这个真的要把我这个小菜鸡累毁了!!!各位看到这里如果不介意的话,点点收藏点点赞吧 T A T)
统计成公式就是:
for (i = 2; i <= N; i++)
{for (up = 0, j = 0; j <= 5000; j++){tmp = a[j] * i + up;a[j] = tmp % 10;up = tmp / 10;}
}
最后我们只需要将运算出来的数组给逆序打印出来就好啦~
答案:
#include <stdio.h>
void Print_Factorial(const int N)
{char a[5000] = { 1 };int tmp = 0;int i = 0;int j = 0;int up = 0;if (N < 0)printf("Invalid input");else if (N == 0 || N == 1)printf("1");else{for (i = 2; i <= N; i++){for (up = 0, j = 0; j <= 5000; j++){tmp = a[j] * i + up;a[j] = tmp % 10;up = tmp / 10;}}for (i = 5000; i >= 0; i--){if (a[i] != 0)for (i; i >= 0; i--)printf("%d", a[i]);}}
}
int main()
{int N;scanf("%d", &N);Print_Factorial(N);return 0;
}
怎么样,是不是看起来比大数运算还要更加简便一些呢?但其实这段乘法的公式是真的难!!
最后我们算出1000的阶乘为......好可怕的数字......不愧是计算机,这都能算出来~
那么今天的刷题日记就给大家分享到这啦~如果有哪里说的不对的或者讲解的不清楚的,还请大家多多在评论区指出意见哦~我也会多多吸取教训,多多学习的~那么我们下一篇再见啦ヾ(•ω•`)o
相关文章:

C语言刷题日记(附详解)(1)
一、选择判断部分 第一题: 如下代码是否存在风险,并说明原因和修改方案 #include<stdio.h> int main() {char* str "hello world";*str a;return 0; }思路提示:这种形式的字符串存储在什么区域呢?是否真的有…...

SpringSecurity实现登录功能实战!!!
实现思路 登录 ①自定义登录接口 调用ProviderManager的方法进行认证 如果认证通过生成jwt 把用户信息存入redis中 ②自定义UserDetailsService 在这个实现类中去查询数据库 注意配置passwordEncoder为BCryptPasswordEncoder 退出登录,删除redis中的数…...
mysql中用一个查询获取多个数据库(模式)和表的计数之和
问题 下面的查询返回了4排数据,这很好。但我同时需要对同一个查询中的所有计数求和。这如何实现?我已经尝试了多种不同的方法,但只得到sintax报错。 SELECT COUNT(*) FROM schema1.table WHERE STATE 17 AND LEVEL 1 UNION ALL SELECT CO…...
linux patch 的制作方式
文章目录 制作patch1. 准备工作2. 使用 diff 命令生成补丁文件生成单个文件的补丁生成整个目录的补丁 3. 检查补丁文件 使用patch1. 应用补丁文件1.1 应用单个文件的补丁1.2 应用整个目录的补丁 总结示例:制作和应用补丁 前言: 在Linux系统中,…...
白骑士的C#教学进阶篇 2.4 LINQ查询
系列目录 上一篇:白骑士的C#教学进阶篇 2.3 委托与事件 LINQ(Language Integrated Query)是C#中的一个强大特性,它提供了统一的语法来查询和操作各种数据源,如数组、集合、XML和数据库等。LINQ通过一种类似SQL的查询语…...
2024华为OD机试真题- 贪吃的猴子Python-C卷D卷-200分
目录 题目描述 输入描述 输出描述 用例1 用例2 用例3 解题思路 代码 2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。 猴子获取香蕉,…...

4-1-2 直流电机(电机专项教程)
4-1-2 直流电机(电机专项教程) 4-1-2 直流电机主要参数尺寸参数额定电压额定电流空载转速 如何控制直流电机有刷直流电机转向控制H桥电路控制转向 如何控制电机转速PWM控制电机转速 4-1-2 直流电机 之前学习了有刷直流电机的基本结构个工作原理ÿ…...

[图解]用例规约之扩展路径
1 00:00:01,710 --> 00:00:03,670 基本路径写完之后 2 00:00:04,690 --> 00:00:07,270 接下来就是扩展路径 3 00:00:08,620 --> 00:00:14,000 扩展路径就是系统要处理的意外和分支 4 00:00:14,010 --> 00:00:19,710 系统要处理的 5 00:00:20,970 --> 00:00:…...
学习记录第二十八天
有名管道(FIFO) 在Linux系统中,有名管道是一种特殊类型的文件,它允许不相关的进程之间进行通信。有名管道在文件系统中有一个具体的路径和名称,因此它们可以被多个进程共同访问。有名管道的特点包括持久性、多进程访问…...

SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结
目录 1、SpringBoot的事务管理 2、SpringBoot的异步任务 3、SpringBoot定时任务调度 4、SpringBoot整合Mail发送邮件 5、Spring框架中的Bean的作用域 6、Spring框架中的Bean的线程安全 7、 Spring框架中的Bean生命周期 8、Spring框架如何解决循环依赖? 9、…...
透明加密技术
透明加密技术,也被称为透明数据加密(Transparent Data Encryption, TDE),是一种加密方法,它允许数据在存储时自动加密和解密,而不需要用户进行任何手动操作。透明加密技术主要应用于数据库、文件系统和磁盘…...

深入理解Faiss:高效向量检索的利器
近年来,随着人工智能和机器学习技术的飞速发展,向量检索技术变得越来越重要。无论是在推荐系统、图像搜索还是自然语言处理等领域,向量检索都扮演着至关重要的角色。而在众多向量检索库中,Faiss(Facebook AI Similarit…...

RK3576 芯片介绍
RK3576 芯片介绍 RK3576瑞芯微第二代8nm高性能AIOT平台,它集成了独立的6TOPS(Tera Operations Per Second,每秒万亿次操作)NPU(神经网络处理单元),用于处理人工智能相关的任务。此外࿰…...
Python模块篇(五)
模块 模块与包模块的导入与使用标准库的常用模块第三方库的安装与使用(如:pip工具) 模块与包 模块是一个包含 Python 代码的文件,通常以 .py 作为扩展名。一个模块可以包含函数、类、变量,以及可执行的代码段。模块的…...

西安旅游系统--论文pf
TOC springboot383西安旅游系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿…...

分享一个思路,使用插桩技术解决慢查询测试问题
前段时间,我负责测试的系统在生产环境运行出现问题。该系统对于响应时间要求较高,问题发生的时候并发很高,出现大量请求超时,超时请求比例随时间推迟越来越高,最后几乎全部请求都失败。滚动重启了所有进程后࿰…...

【STM32项目】在FreeRtos背景下的实战项目的实现过程(二)
个人主页~ 实战项目的实现过程(一)~ 实战项目的实现过程 二、初步了解各个外设硬件1、OLED模块2、GPS模块3、MPU6050模块4、超声测距模块5、温度测控模块6、语音模块7、SIM模块8、按键模块 三、查阅资料1、查看手册2、查找例程 四、研究硬件功能1、OLED…...

javaer快速入门 goweb框架 gin
gin 入门 前置条件 安装环境 配置代理 # 配置 GOPROXY 环境变量,以下三选一# 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOPROXYhttps://goproxy.…...
SQL - 数据类型
字符串类型 char(10),存储固定长度字符串 varchar(255),存储可变长度字符串 mediumtext,中文本,对于存储JSON对象、SCV字符串很好使 longtext,长文本,可以很好地存储教本或许多年地日志文件 tinytext&#…...

进程相关知识
进程和程序的区别 程序 程序是静态的,是存储在硬盘、SSD等存储介质中的一个文件,通常由源代码(如 .c 文件)编译生成的二进制可执行文件(如 a.out)。程序包含了指令和数据,但在未被执行时&#…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...