记录 Linux、运维、自动化,还有我自己折腾过的项目。这里会持续更新。


1.分支和循环(下) 一.随机数生成 (1).rand (2).srand (3)time (4)设置随机数的范围 二.猜数字游戏实现 分支和循环(下) 在本节内容当中,主要讨论了关于随机函数相关的知识点并做一些应用,也就是说讨论关于猜数字的游戏。 一.随机数生成 随机函数主要有rand,srand,函数,我们将会讨论什么是随机数种子,为何说rand函数不是我们的随机函数,以及用time函数实现srand的随机种子,进而实现了对于随机数的求解。 (1).rand C语言提供了求解随机数的方法: int rand(void); 但是呢,由于rand函数是为随机函数是通过某种算法生成的随机数,不是真正的随机数,下面就为大家试一下: #include <stdio.h> #include <stdlib.h> int main() { printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); return 0; ) 由此可以知道的,是rand两次所生成的结果是一样的,那么可以说,rand不是一个正常的生成随机数的函数,因为他默认的随机种子数是1,如果要生成不同的随机数,就要让种子是变化的。 (2).srand 下面我就介绍关于srand函数,只要在使用rand之前,使用srand函数,通过 srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了, 那也就是说给srand的种子是如果是随机的,rand就能生成随机数;在生成随机数的时候又需要一个随 机数,这就矛盾了. (3)time 因为时间是经常变化的,在c当中有一个函数是time,因此我们可以使用它时间作为随机数种子。在C当中的定义如下: time_t time (time_t* timer); 如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。 使用time函数的时候,需要包含头文件:time.h 书写生成随机函数的代码如下: #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { //使用time函数的返回值设置种子 //因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换 srand((unsigned int)time(NULL)); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); return 0; } 得到的结果是: 可以知道的是,两次得到的随机数并不像第一次那样—二次得到的,是一样的,这个函数可以成功的实现对于随机数的求解,这就是我们需要的函数。 ...
【实战】DNS建设案例: 0.需求 1.准备工作 2.进行标准化的服务器配置 1.修改ip 2.修改主机名 3.修改hosts文件 4.免密配置 3.实操流程 4.在node1和node2中安装相关服务 1.node1上面安装相关软件 1.先在node1上面安装jdk软件包 1.环境变量配置 2.任意目录测试一下 2.最后安装tomcat服务器 1,从官网下载阿帕奇的tar的包 2.解压这个包 3.运行这个软件,并在浏览器查看 2.在node2安装相关软件 1.安装NFS 1.开启服务 2.开放端口 3.创建共享目录 4.修改配置文件 5.验证是否成功共享 6.挂载使用 7.验证 3安装ftp软件 1.创建文件夹 2.安装软件 3.修改配置 4.启动并配置 vsftpd 服务 5.配置防⽕墙 6.连接FTP服务器 5.在node3中配置dns服务器 1.修改named.conf这个文件 2.修改vi /etc/named.rfc1912.zones 3.修改/var/named/itcast.local.db 4.修改/var/named/192.168.149.rev文件 5.检测 6.启动服务以及开放端口 6.测试操作 6.总结 0.需求 目前我们在node2节点中已经有FTP服务器、NFS服务器, 同时大家需要在node1中部署一个tomcat服务器。 请对三个服务设置对应得域名,并基于DNS进行内网解析,从而实现基于域名访问,要求DNS服务器架设至node3, 配置后, 不管是在node1还是node2都可以基于此DNS进行访问 NFS服务器域名: nfs.itcast.local FTP服务器域名: ftp.itcast.local tomcat服务器域名: www.itcast.local FTP服务器要求: 1- 禁锢FTP目录: /export/ftp 2- 禁止匿名用户访问,可以使用系统中任意存在用户访问即可 3- 不管在服务器还是在windows中, 都可以直接使用域名的方式访问到ftp服务器 windows中,建议使用filezilla.exe 软件来连接 NFS服务器: 共享目录: /export/nfs 要求 node1在挂载这个目录的时候,请使用域名方式进行挂载即可(测试 临时挂载即可) 1.准备工作 我们在进行这个综合案例的时候,需要准备3台主机,分别是node1,node2,node3 而node3的话,我们需要对node1克隆就可以得到了,开启这三台Linux主机就可以进行下一个步骤了 ...
CSDN 博客本地化工具 用途 CSDN 导出的 Markdown 文件通常只包含图床链接,例如:  如果图床失效或文章被删除,图片就找不回来了。 这个工具会把 Markdown 里的远程图片全部下载到本地,并把链接改成相对路径:  这样博客的正文和图片就能一起保存、迁移、备份。 使用方法 1. 准备 本机需要安装 Python 3.11 或更高版本。 检查: python --version 2. 下载图片 python download_images.py "D:\博客\文章.md" 执行后会在文章同目录生成: D:\博客\ ├─ 文章.md └─ images\ └─ xxxx.png 文章.md 里的图片链接会自动改写为:  3. 可选参数 指定图片目录名: python download_images.py "D:\博客\文章.md" --out 图片 只预览,不实际下载: python download_images.py "D:\博客\文章.md" --dry-run 注意事项 脚本只处理 Markdown 的  图片语法 下载失败时会保留原图床链接,并在结果里显示 FAILED 已存在且大小不为 0 的图片会自动跳过,不会重复下载 执行前会先把原 Markdown 备份为 文章.md.bak 下载的图片文件会按 URL 文件名保存,重名时自动加编号 建议 下载完成后,把整个博客文件夹放进 Teldrive 备份目录,这样正文和图片都会一起自动备份,不再依赖 CSDN 图床。
if语句 在if语句中他的语法是if(表达式) 语句 表达式成立那么语句执行,不成立那么语句不执行。 在if语句中只要是true就执行,false不执行。 那么true通常是1,而false则是0,比如nun%2==1,它执行的是判断num是否是奇数,其实这样写也可以,但是不是更很直观 没有前者更加直观一些。 在if语句中if语句只可以跟着一条语句,但是如果过于多的话可以调整为大括号 由此我们可以知道这样的道理,else是在一些情况可以省略的,不必再写像 if(num%2) printf("%d 是奇数",num); printf("%d 是偶数",num);
C语言之操作符(上) 一.二进制,八进制,十六进制 1.二进制 2.八进制与十六进制 二.原码,反码,补码 1.原码 2.反码 3.补码 三.移位操作符 1.左移操作符 2.右移操作符 1.逻辑右移 2.算术右移 四.位操作符 1.按位与 2.按位或 3.按位异或 4.运用 五.逗号表达式 在C语言之中,操作符也是极其重要的,不不仅仅C语言会用到,同时最为关键的是学会操作符,会对于我们学习单片机起到奠基石的作用,对于单片机的学习起到引领的作用,会非常有助于我们学习单片机的,会让我们对于单片机的一些基础操作可以看的懂。 一.二进制,八进制,十六进制 在计算机当中信息是以二进制的形式存储的,而我们在日常生活当中使用的最为多的,其实就是十进制,然而我们对于十进制的转化可以说是手到擒来。但是对于二进制相信一些伙伴,连听都没有听过,更不要说二进制之间的转化,不同进制之间的转化。由于二进制表达的数字太过于庞大了,我们不习惯使用二进制,因此我们需要学习八进制,十六进制,在接下来的讲解中我将为大家娓娓道来,并力求做到,看过我写的便学会,懂得了。 1.二进制 1.首先,需要注意的是,二进制是什么。二进制是是计算机在存储信息之中时以1,0对信息加以存储和表达,满2进1对的。 2.其次我们需要注意的是,二进制的转化: 1.二进制同十进制之间的转化:首先需要明确一下的是权重,求值,以十进制数字:123为例。 10进制的位 1 2 3 权重 10^2 10^1 10^0 权重值 100 10 1 求值 1*100 2*10 3*1 = 123 1.由此可以看出,权重,权重值,的关系,对这个概念可以运用到二进制·之上,对于二进制数如:110. 二进制的位 1 1 0 权重 2^2 2^1 2^0 权重值 4 2 1 求值 4*1 2*1 0*1= 6 2.这样我们就完成了对二进制与十进制数相互进行转化。而对于十进制数转化为二进制数字,比如说一个十进制数字125将他转化成二进制数字,可以采用短除法,具体操作如下: ...
C语言之操作符【下】 一.下标访问[],函数调用() 1.下标访问[] 1.什么是下标访问[] 2.下标访问操作符[]的应用与举例 2.函数调用() 二.操作符的属性:优先级、结合性 1.优先级 2.结合性 3.俩者之间的应用 三.整型提升 1.整型提升 2.整形提升的意义 3.如何进行整型提升 例子如下: 四.算术转换 五.表达式求值 在上一节中,我们已经学习了操作符的一些相关知识,我们对C语言的操作符有了新的认识与理解,那么在本节C语言中,我们将继续上一次的讲解,为大家呈现更加有趣并且深刻的讲解,来开启我们的操作符之旅吧! 一.下标访问[],函数调用() 1.下标访问[] 1.什么是下标访问[] 1.在C语言学习中,我们会经常用到下标访问操作符,那么相信在屏幕前的你们一定很想知道什么是下标访问操作符吧?下面我就为大家详细的道来:其实下标访问操作符,是数组里面的一个知识点,下标访问操作符是数组遍历当中经常使用的,数组在遍历[]里面会有一些数字,而那些数字其实就可以表示数组的内容,因此就可以对数组进行遍历了。 2.形式是[]里面的数字从数字0开始,到最后的数字结束。 2.下标访问操作符[]的应用与举例 1.下标访问操作符的应用:下标访问操作符,应用到数组当中,对于数组内容的访问有着极其重要的意义。 2.下标访问操作符的举例:如在下面的函数当中,我们就用到了下标访问操作符。 #include<stdio.h> int main() { int a[5]={1,2,3,4,5}; for(int i=0; i<5;i++) printf("%d",a[i]); return 0; } 3.在上例当中,a[i]里面的i其实就是数组里面的内容,它的意思是说数组里面的的i-1个元素,因此我们通过这个方法对其进行遍历。 2.函数调用() 1.函数调用操作符是小括号。 2.形式如下: int add(int x,int y); 在上例之中,小括号之前的是,函数名;在小括号之后的是形参,可以看出该函数有两个形参:一个是int x,另一个是int y,该函数的返回类型是int形。 二.操作符的属性:优先级、结合性 1.优先级 1.每种同类型的运算符都有内部的运算符优先级,不同类型的运算符之间也有相应的优先级顺序。一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。各种运算符间的优先级如下:数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是最优先计算。 2.操作符的优先级如下: 2.结合性 结合性是,对于多个优先级是一样的操作符的一个表达式,此时他们的就需要用到,结合性,如下: 2*3/5 此时他们的优先级是一样的,因此我们选择使用结合性,因为,乘法和除法的结合性是做结合的因此该表达式是从左到右计算的。 3.俩者之间的应用 因为在上文的优先级表格中,小括号的优先级是最高的,使用小括号可以提高算术的优先级。因此呢,当有一些表达式的优先级是一样的时候,我们就可以使用小括号,这样小括号括起来的地方,优先级是比较高的,可以达到我们想要的结果 三.整型提升 1.整型提升 C语言中整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。 2.整形提升的意义 整型提升的意义是在表达式中,各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算12。C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。比如:即使两个char类型(1个字节==8个比特字节)的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度. 3.如何进行整型提升 有符号整数提升是按照变量的数据类型的符号位来提升的 无符号整数提升,高位补0 例子如下: int main() { char - signed char unsigned char char a = 5;//char只有一个字节,那么的话char有8个比特位。 //a 的二进制位是:00000101 - a (截断后存储a中) //由于a是无符号类型的,可以整型提升,提升为int类型,以二进制位表示如下:000000000000000000000000 00000101 char b = 127; //类似char a,一些步骤缺省,因此将他转换为int类型以二进制表示如下:00000000000000000000000001111111 01111111 - b (截断后存储到b中) char c = a + b;//发生整型提升 00000000000000000000000000000101 - a 00000000000000000000000001111111 - b 00000000000000000000000010000100 - a+b 10000100 - c//由于char c的最高位是1因此我们用1char c提升为整形,如下: printf("%d\n", c); //这里c还是要整型提升 11111111111111111111111110000100//c的整型提升的原码 10000000000000000000000001111011//c的反码 10000000000000000000000001111100//c的补码 -124 %d 是按照10进制的形式打印有符号的整数 return 0; } 四.算术转换 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换: ...
例题: 下面代码的结果是: #include <stdio.h> int i; int main() { i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; } A.> B.< C.不输出 D.程序有问题 首先,我可以明确一点的是,这道题不选择D和C,在本函数中,由于int i 是一个全局变量,它存放的是静态区, C标准是要求全局变量要被初始化为零值,因此即使你没有初始化该值那么依然会被系统初始化为0,然而,sizeof类型是属于unsigned int 类型,也就是说,-1需要进行一拨转换,然而-1转换为无符号整形数字是比较大的,那么的话,明显是>,那么就选则的是A
例题:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。 对于这个题我想的是,由于1&二进制的数字,他的意思是判断最低位是否为1,是的话那么就是1,否则就不是1而是0,这样如果我在进行一番右移操做,那么的话,就可以把这个二进制打印出来。 若是需要奇偶位打印的话,那么可能是在每次右移奇数个位或者是偶数个位,就可以求出二进制的奇数位,以及偶数位,下面我就为大家展示一番。 #include<stdio.h> int main() { int num = 0; printf("请输入一个数:"); scanf("%d", &num); printf("奇数位:"); for (int i = 31; i >= 1; i -= 2) { printf("%d ", (num >> i) & 1); } printf("\n"); printf("偶数位:"); for (int i = 30; i >= 0; i -= 2) { printf("%d ", (num >> i) & 1); } printf("\n"); return 0; } 这个是运行结果: 因此这就是本题的代码。
例题:求两个数二进制中不同位的个数,写出C代码。 在我的讲解篇2中可以看到:由于每次右移1位并对1按位与那么就可以将二进制位分离出来,得出与原来一样二进制位。 思路一样,那么我们可以用上一篇中提到的方法,那么接下来我们就需要对每个二进制位进行比较就可以了,以此类推,若是不同的话统计其个数并将其统计的个数,返回,所求的便是其值,我所写的代码,如下: #include<stdio.h> int main() { int x = 0; int y = 0; int count = 0; printf("输入两个整数:"); scanf("%d %d", &x, &y); for (int i = 0; i < 32; i++) { if (((x >> i) & 1) != ((y >> i) & 1)) { count++; } } printf("有:%d位数不同", count); return 0; } 下面是我的代码的运行结果:
例题: 下面代码的结果是:( ) #include <stdio.h> int main() { int arr[] = {1,2,3,4,5}; short *p = (short*)arr; int i = 0; for(i=0; i<4; i++) { *(p+i) = 0; } for(i=0; i<5; i++) { printf("%d ", arr[i]); } return 0; } 由于short是短整型的,那么其,因此p每次只能得到两个字节,而由于原来是4次循环那么其实是相当于4/2=2个数,也就是说对原来的前两个数赋值为0,那么打印出来得话,自然是:0,0,3,4,5