C 真的可以看做是 C++ 的子集吗
搜了一下,答案是:基本上可以这么认为,但是在一些细节上并不兼容
图片源自网络
1. void*类型
在C语言中,void*(空指针)可以隐式转换为任何指针类型,但在C++语言中不合法
2. 字符字面值
在C语言中,字符字面值是int类型,而在C++语言中,字符字面值是char类型
3. 字符串字面值
这是一个很常见的错误,在C语言中,字符串字面值是char[N]类型,而在C++语言中,字符串字面值是const char[N]类型
4. C++ 多了一些关键字
C++多了很多关于面向对象的内容,与之一道多了很多关键字(如class,public等)
使用这些词汇作为变量名的 C 程序无法在 C++ 中成功编译
『About』关于我和我的小站(2021年11月13日版)
欢迎来到我的小站呀,很高兴遇见你!🤝
🏠 关于本站
这个博客网站是我今天(2021年11月13日)在我自己的阿里云服务器上新建的,基于Gridea,非常感谢这个开源项目🎉
主题上我本来想找一个基于 Material Design 的(因为的原来用的是洛谷博客),但逛了一圈都不能很令我满意,就用了这个 Pure 主题,也是挺好看的
有些文章由于我当时年龄较小,语言比较幼稚,望见谅!😂
PS:如果有时候没法正常访问,那么就表明我正在提交我的文章,请稍微等一分钟
👨💻 博主是谁
本人是杭电大一新生一枚,杭电助手后端部新人,正在学习 Golang ,也在慢慢复习高中时信息竞赛的知识(再不复习的话就要全忘啦!)😃
📘 学习经历
初中接触 C,Windows 命令行
高一接触 Linux ,折腾了一段时间的树莓派
高一开始参加 C++ 信息学竞赛,2019年参加了由CCF主办的CSP-S非专业级软件能力认证第二轮,其成绩(等同于原NOIP复赛提高组奖项级别)达到三等 (菜的一批)
高中还学了点WEB三板斧、Python,现在忘得差不多了
现在正在入门 Go,同时买了考研的书慢慢看
📬 联系我呀
QQ:976180942
常用昵称:NickXU(NX)、你这瓜保熟吗(曾用名)、我不是菜鸟(曾用名)、NOTSPROG(就是前面那个的英文)
一般用 KSP 小绿人头像(系KSP老玩家!!!)
GitHub ID:NOTSPROG
📢 商务合作
本站不接受任何广告的投放
点击此链接与我进行商务合作
『Go』方法和接口
一、方法
1.方法是什么
你可以为某个类型声明它的专属函数,如为 A 类型声明函数 f
函数 f 就附加在了类型 A 上,使用 A.f() 来调用
这时 f 就称为 A 的 「方法」
类型 A 就称为方法 f 的 「接收者」
方法就是一种带「接收者」参数的函数
2.为什么要使用方法
方法使我们能在Go中运用面向对象的思想来编程(就像C++中的类一样)
3.如何使用方法
3.1 方法的声明
首先复习一下函数的声明格式
1234func 函数名 (参数列表) (返回值列表){// 函数体return 返回值列表}
方法无疑就是多了个接收者参数,位置在 func 和函数名之间
1234func (接收者) 函数名 (参数列表) (返回值列表){// 函数体return 返回值列表}
注意:
你不能在 A 包内为 B 包内的一个类型定义方法,也就是说方法和接收者必须在同一个包里
内建类型无法定义方法,因为这些类型不是你定义的,你也不知道它是在哪个包里定义的
例子:声明一个 point 类型,用于表示一个二维坐标的点,再为它声明一个方法 dis ,用于获取该点到原点的距离。
12345678910111213141516171819202122package mainimport ( "fmt" "math")//声明 Point 类型type Point struct { X, Y float64}//声明 dis 方法func (a Point) dis() float ...
『Go』浅谈 Go 与 C/C++ 语法的不同
看了这么多教程,感觉还是Go 语言之旅最适合新手
本周初学 Go 的基本语法,总结了一下和 C/C++ 的区别
Go 语法与 C/C++ 的不同 (浅谈)
每句话之后不一定要分号了
引用了包,或者变量声明没有用,就不能成功编译
大括号强制使用 C 风格:不换行,不能使用 C++ 风格
Go 的变量声明方面,名称在前,类型在后:
1234var a int // 声明一个变量,默认为0,这和C/C++不一样var b = 10 // 声明并初始化,且自动推导类型c := 20 // 初始化,且自动推导(只能在函数里用)
然后少了一个 char 类型,多了复数
Go 的 for 语句后面的三个构成部分外没有小括号, 大括号 { } 则是必须的(if同理)
没有了While,可以用for代替:
1234567func main() { sum := 1 for sum < 1000 { sum += sum } fmt.Println(sum)}
Go的 switch 不需要 break,并且 switch 的 case 无需为常量,且取值不必为整数
defer 语句会将函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。可以defer多个函数,推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。
123456package mainimport "fmt&quo ...
『C/C++』获得函数运行时长
见此代码,输出了几种排序方法的运行时长
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAXSIZE 10000void swap(int *a, int *b){int tmp;tmp=*a;*a = *b;*b = tmp;}void rand_Array(int Array[]){for (int i = 0; i < MAXSIZE; i++)Array[i] = rand();}void selection_sort(int a[],int l, int r){ for (int i = l; i <= r; i++) { int min = i; for (int j = i + 1; j <= r; j++) //走访未排序的元素 if (a[j] < a[min]) min = j; //找到目前最小值 swap(&a[m ...
『C/C++』排序算法
感谢菜鸟教程:十大经典排序算法
基础桶排序
进来一个数就丢数组的那个位置里,很好理解
123456789101112131415#include<stdio.h>int a[100],n;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { int tmp; scanf("%d",&tmp); a[tmp]++; } for(int i=0;i<=99;i++) if(a[i])for(int j=1;j<=a[i];j++) printf("%d ",i);}
冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1234567891011121314151617181920212223#include<stdio.h>int a[100000],n;void swap(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp;}void bubble_sort(int l,int r) ...
『C/C++』指针与函数传参杂谈
2022-05-08更新:针对新的渲染器优化了显示
对于大部分C语言初学者,指针是最大的一块骨头 ——沃兹基·硕德
本节内容:
指针的简单引入
[What] 指针是什么
[Why] 为什么要用指针
[How] 指针怎么玩(声明,使用,运算,数组指针,结构体指针,函数指针)
函数传参的几种方式
值传递
地址传递
引用传递
指针的简单引入
指针是什么
首先,我们要清楚指针是什么,下面是指针的原始定义
系统在内存中,为变量(本人按:这里应加上函数)分配存储空间的首个字节单元的地址,称之为该变量的地址。地址用来标识每一个存储单元,方便用户对存储单元中的数据进行正确的访问。在高级语言中地址形象地称为指针。
指针变量就是保存指针的变量,但很多人 将「指针变量」简称为「指针」,故本文的指针都是指针变量的意思
下面要认两个重要概念:指针的值和类型
「指针的值」 内存地址一般用十六进制数表示,故 指针的值就是一个十六进制数
「指针的类型」 指针不仅是一个地址那么简单,对象不同则类型不同,如指向 int类型 的指针就称这个指针是 int 型的,int 型指针就只能存 int 类型变量 的地址,这种要求可以一定程度上避免混乱。指针的类型用于推断对象的长度,以便进行指针运算(后面会讲)
注意:「泛型对象指针」或称「void*指针」可以指向任何对象类型,但不能提供对象的长度,故无法直接运算与引用
PS:实际上在 C 中是可以隐式(或者说自动)转换的, 但是在 C++ 中不能 ,必须显式(或者说手动)地转换,我建议还是保留显式转换的习惯,这是一个好码风 ...
『树莓派』如何以正确的姿势制作树莓派的TF卡数据镜像
准备:
Windows环境(Linux的自己安装GParted即可)
VM或VMplayer环境
GParted的iso镜像 和 Win32DiskImager
一个聪明的脑子
没有VM或GParted或Win32DiskImager可以在这里(密码:61oq)下载
(百度云盘下载慢的自行用pandownload)
教程:
先安装好所有软件,在此不再繁述
打开VM(此处以VMplayer演示,大同小异)
选择“创建新虚拟机”
安装来源选择GParted的iso镜像
操作系统如图选择
名称随便填
硬盘其实可以没有,因为是从iso直接启动系统,但是硬要填的话就填个最小值好了
内存其实100M即可,默认256M也无妨
之后启动,一路按默认选择按Enter
语言输入26也就是简体中文
启动方式输入0
启动完成后让虚拟机连接你的TF读卡器(如果通过USB3.0的话在 管理->虚拟机设置->USB控制器 自行设置)
之后打开GParted
在选项卡中选择你的TF卡
右键->更改大小/移动
把区间右端点(数学乱入)尽量往左移动,把空白区域压掉
之后应用更改
将TF卡退出虚拟机(之后主机就可以找到)
打开Win32DiskImager,选择对应盘符,写入文件名,使用“读取”功能(记得打勾“仅读取已分配分区”)
之后就完了
备份完成后记得重新拓展一下分区,否则后面的空间就无法使用
当然,你也可以选择在备份之前在raspi-config里面打开“下一次启动时拓展分区”,这样以后应该直接用Win32DiskImager写入就行了,不需要再手动 ...
『树莓派』Minecraft超长开服折腾记录(Java+基岩with红石)
【原创】树莓派Minecraft超长开服折腾记录(Java版+基岩版 with 红石)
更新:现在基岩版服务器最佳方案是Java+Geyser
我去…这他妈的终于成功了
折腾时长长达半年啊,从学期初到末再到放寒假再到春节,今天可是大年初二
本教程制作匆忙,很多东西都是点到为止,而且也没有什么图片(以后可能会配图),也肯定会有纰漏或者错误,请多多包涵
目录:
Java版篇
基岩版篇(Nukkit(X),Pocketmine-MP,官方服务端)
好了,废话不多说,开始
1mkdir minecraft && cd minecraft
Java版篇
Java极其简单,且容易地可跨平台,但与基岩版相比代码效率更低
1mkdir Java && cd Java
1.搭建Java环境
1sudo apt install default-jdk
不行就百度,再不行就谷歌,这篇或许有帮助
2.下载服务器jar
这里有多种选择,可以官方下载
也可以通过Paper或者spigot获得对应的版本,基本上是一样的,但据说spigot的效率更高一些
这里下载目前最新官方jar链接举例
1wget https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar
3.运行jar
1java -jar server.jar
之后提示需要同意EULA协议并自动退出,这时候打开同目录下的eula.txt并把false改成true就可以了,此处点到为止
修 ...
『C/C++』2019CSP模板
思维导图
快读
12345678inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;}
逆序对
12345678910111213141516171819void msort(int s, int t){ if (s == t) return; //如果只有一个数字则返回,无须排序 int mid=(s+t)/2; msort(s,mid); //分解左序列 msort(mid+1,t); //分解右序列 int i = s, j = mid + 1, k = s; //接下来合并 while (i <= mid && j <= t) { if (a[i] <= a[j])r[k++] = a[i++]; else { r[k++] = a[j++]; ans += mid - i + 1; }//统计产生逆序对的数量 } while (i <= mid) r[k++] = a[i+ ...
『考试总结』190731
试题:CZYZ2017 夏令营 NOIP 模拟赛(提高组) 2017 年 8 月 4 日
得分:40/300(不想说话了)
T1:传送带(10分)
这题要用三分,但是我们没有学过,我考试的时候也没有想出其他方法,只考虑了特殊情况
较好的题解
T2:疯狂的火神(0分)
这道题用数学推关系,考场直接暴搜但是居然没有拿分,肯定有地方错了
菜就是菜啊。。。以后考场也要试着去推关系,另外,背包差不多被我忘光了
T3:火神的鱼(30分)
线段树
但是我一开始没有注意鱼只会往x与y的正方向游,所以不会打线段树,只好暴搜,30分
『算法』总结欧几里得算法及拓展
真TMD难啊!!!!我真的想*欧几里得
好吧难还是得学啊。。。9九月就初赛
①欧几里得算法
这东西很简单啊。。就记个结论就可以了
1gcd(a,b)=gcd(b,a%b)
然后就没有了
②欧几里得算法的应用
这东西就是用来求最大公约数的
1234int gcd(int a,int b){ return b?gcd(b,a%b):a;}
接下来的才是难点
③欧几里得算法拓展
欧几里得算法拓展用于求
ax+by=gcd(a,b)\text{ax}{+ by} = \gcd\left( a,b \right)
ax+by=gcd(a,b)
的其中一组解
具体过程如下:
ax1+by1=gcd(a,b)\text{\ ax}_{1}{+ by}_{1} = \gcd\left( a,b \right)
ax1+by1=gcd(a,b)
利用欧几里得公式
=>bx2+(a%b)y2=gcd(b,a%b)= > \text{bx}_{2}{+ (a\% b)y}_{2} = \gcd\left( b,a\% b \right)
=>bx2+(a%b)y2=gcd(b,a%b)
可以重复利用欧几里得公式,到最后一层b会变成0
=>(…)xi+(…)yi =gcd(…,0)= > (\ldots)x_{i} + (\ldots)y_{i}\ = \gcd\left( \ldots,0\right)
=>(…)xi+(…)yi =gcd(…,0)
最终b变成0时,最后一层的x与y可以求出来
axi+byi=g ...
『算法』总结区间操作
差分数组例题:P1083 借教室
12345678910111213141516171819202122232425262728293031323334#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;int a[1000000],b[1000000],c[1000000],d[1000000],x[1000000],y[1000000],n,m;bool check(int k){ memset(b, 0, sizeof(b)); for (int i = 1; i <= k; i++) { b[x[i]] += d[i]; b[y[i]+1] -= d[i]; } for (int i = 1; i <= n; i++) { c[i] = c[i - 1] + b[i]; if (c[i] > a[i])return 0; } return 1;}int main(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++)scanf("%d", &a[i]); for (int i = 1; i <= m; i++)scanf("%d %d %d", &d[i], &x[i], &y[i]); int l = 1 ...
『算法』总结KMP算法
【字符串】总结KMP算法
buildtime:2019年7月15日
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
先放两篇比较好的资料:
从头到尾彻底理解KMP(2014年8月22日版)
[KMP算法]NEXT数列手算演示
KMP的算法流程:
假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置
如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;
如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。此举意味着失配时,模式串P相对于文本串S向右移动了j - next [j] 位。
换言之,当匹配失败时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值,即移动的实际位数为:j - next[j],且此值大于等于1。
计算NEXT数组流程:
将前缀后缀相同数组去掉最后一个值,在前面加上-1即可(某些版本还有总体+1)
代码:
1234567891011121314151617181920212223242526272829303132333435363738#include<bits/stdc++.h>using ...
『树莓派』搭建私有云服务器(Nextcloud)
【整理】树莓派搭建私有云服务器(Nextcloud)
buildtime:2019年7月10日
刚刚考完期末考,真的是累死。这个项目其实我去年就做过,现在想重新总结一下。最详细也最正式地\colorbox{purple}{\color{white}{\text{最详细也最正式地}}}最详细也最正式地 教授大家如何实现这个项目。
我的配置
树莓派3A+一块
聪明的脑子一个
树莓派其实可以使用其他任意版本(zerow也可以,虽然很卡但是仍可以正常使用)
请事先调试好你的树莓派确保能正常上网和连接,如有异议请点击这里入门
好的我们开始!
Step0:基础知识
首先你需要有一个总体的概念才能一步步完成这个项目
好的,首先,我们要搭建一个私有云服务器
私有云服务器说白了就是运行私有云的一个网站服务器
要搭建一个网站,就不得不提一个词:LAMP\colorbox{purple}{\color{white}{\text{LAMP}}}LAMP
何为LAMP\colorbox{purple}{\color{white}{\text{LAMP}}}LAMP ?
这里引用百度百科:
LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:\colorbox{brown}{\color{white}{\text{LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:}}}LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:
Linux,操作系统
Apache,网页服务器
MariaDB或MySQL,数据库管理系统 ...
『树莓派』WiFi信号中继
首先要先感谢树莓派实验室创客群-G的大佬:【管理员】辣鸡管理
话说我家的WiFi信号有些差劲,就想用树莓派中继一下,弄了一晚上之后成功,特此记录。
我的配置:
树莓派3A+一块
USB无线网卡一个(建议选择大功率的,我做出来网速就很慢)
树莓派其实可以用其他版本,zerow的话就需要MicroUSB转USB的线
之所以要用USB网卡是因为中继需要两张无线网卡:一张连接网络,一张开AP。
如果你想用网线开热点的话,就不要理这个,把下面的“连接到网络的网卡”改成eth0即可
请事先调试好你的树莓派确保能正常上网和连接,如有异议请点击这里入门
好的我们开始!
Step1:插上USB网卡
插上后要检查一下有没有被识别,一般都能够别识别的
键入命令以查看网络情况:
1ifconfig
之后应该有两张无线网卡:wlan0和wlan1,如图:
如果没有找到两张网卡,就是没有被识别,可以自行百度树莓派识别USB网卡
Step2:安装create_ap
create_ap是GitHub上一个开源项目,专门用于开热点
1234567#把这个项目Git下来并安装sudo git clone https://github.com/oblique/create_apcd create_apsudo make install#安装依赖的库sudo apt-get install util-linux procps hostapd iproute2 iw haveged dnsmasq
这个东西的语法自己用-h去问,大概是这样的:
12345sudo create_ap 要使用的无线网卡 连接到网 ...