信号仔 level
获赞
16
粉丝
10
关注
18
看过 TA
125
同济大学
2027
C++
IP属地:上海
暂未填写个人简介
私信
关注
11-22 20:01
同济大学 C++
0 点赞 评论 收藏
分享
11-16 22:02
同济大学 C++
今天linux学习的内容,太枯燥了- vim的多种模式- Normal:长命令,短命令,- Insert: 编辑文本- Visiual: 选择文本- ...- Normal模式下的命令:移动光标(h:左,k:下,j:上,l:右)- 短命令,向上走几行,向下走几行:[n]+, [n]- 没有中括号- 移动到文本首行:gg,末行:G- 行内移动:wb,WB- 长命令 :[n] | [n]G- 行首:^- 行尾:  $- 到达某个字符前面: t字符 ???- 文本对象:- i(,i), a(,a)- i[,i], a[,a]- ...- Ip, ap   段落 --边界空行- 动作-  d, y ,c-  p-  u-  [ctrl] + r- :/pattern(向下搜索):?pattern(向上搜索)  :[范围]s/pattern/replace/[选项] g=global- gcc 注释一行或者取消注释一行- 代码对其: gg=G- 对文件的操作- :write- :quite- :wq- :q!- 多窗口- 水平 :split :new- 竖直: vsplit :vnew- 切换窗口 [ctrl] + ww- 退出窗口 :q :qa :only- shell命令- linux结构- Kernel 管理计算机硬件资源,为上层应用提供运行环境- 系统调用:api- 库函数: 系统调用的封装- shell:命令解释器- 具体的shell: sh, csh, bash, ksh, zsh- 查看帮助手册: man [手册编号] 词条- 关机-  shutdown -poweroff-  shutdown -reboot-  shutdown -halt-  shutdown -c- 用户子系统相关命令- 查看cat/etc/passwd- 添加useradd -m  或者 useradd -s /bin/bash- 删除 userdel -r- 修改 passwd- 切换用户 su- 退除切换 exit
移动求职进展汇总
0 点赞 评论 收藏
分享
11-16 22:00
同济大学 C++
互联网行业现在还值得去吗
0 点赞 评论 收藏
分享
11-16 21:59
同济大学 C++
- Vim的编辑器学习成本很高。- 编辑器分类- 所见即所得:word,notepad- 多模式编辑器:vim。相同按键在不同模式下有不同的功能。- vim的模式转换[图片]- 这个i I a A o O v [ctrl] + v是在【NORMAL模式】下按相应的按键比如【I】就会自动跳转到相应的【INSERT模式】的功能下- 我编辑了视图后:左下角i代表insert,n代表normal,c代表command。- 移动光标操作(action):(尽量不要用键盘里面的上下左右)-  h: 往左移动一个字符-  j: 往下移动一个字符-  k: 往上移动一个字符-  l: 往右移动一个字符-  ^: 行首-  $: 行尾-  w: 下一个单词的词首:特殊符号单独成为一个单词。-  b: 上一个单词的词首:特殊符号单独成为一个单词。[图片]- Vim中的删除:Vim中的删除类似Windows中的剪切,会将删除的内容复制到Vim的“剪切版”中。所述都是在N模式下面[图片]- 复制yank:[图片]- 修改(change)文本,修改模式:[图片]- 撤回,普通模式下:- u:代表undo,代表撤回。- 文本对象(textobj)- 两种常见组合:action+motion,action+textobj- 常见文本对象:[图片]- 粘贴、撤销、恢复:- 粘贴:p或者P- 撤销:u(undo) 和下面的恢复互为逆操作吧- 恢复:[ctrl] + r- 替换:r(replace)。 作用是比如把某一个字符替换为大写的字符[图片]- 查找和替换(可以根据正则表达式查找)- 查找:[图片]- 替换(substitute): 长命令([:]开头,[enter]结尾)- 其中选项的 [g]代表 global,globally。 加上就会把这一行全部替换,没有加上就只能替换某行第一个[图片]- 视图模式- cd // :切换到系统的根目录(在linux下面,windows cmd好像不太支持?)
国央企求职进展汇总
0 点赞 评论 收藏
分享
11-10 01:21
同济大学 C++
c语言基础部分终于结束了。可以上数据结构了。但是目前感觉对指针这一块儿还需要加深理解!!!(指的我头皮发麻)- 有关于指针参数传递非常重要的一点:- 如果int n = 5. n的类型是int,&n的类型是*int,那么*(&n)的类型是等价于n的类型,也就是int- 动态内存分配。1. 为什么需要动态内存分配?2. 栈空间的局限性:1栈帧的大小,需要在编译时确定。栈空间不能存放动态大小的数据 、2栈空间大小是受限的:在典型的linux系统中主线程8MB,其他线程2MB。如果存放太多数据会栈溢出,程序崩溃。因此栈空间不能存放太大的数据。3每个线程都有自己的栈空间,栈空间不适合存放多线程共享的数据。3. 他作用于:堆(heap)[图片]4. sp寄存器;bp寄存器(Stack pointer; base pointer)它的作用[图片]5. 如何进行动态内存分配?malloc(内存分配) , calloc(清0分配), relloc(调整之前分配出来的内存大小) 他们返回的类型都是void*(通用指针类型:我不知道他的基类型int or double?)6. 通过在main函数里面定义指针指向(无名字)的预先分配的内存空间里面。但是由于无名字特性。我们该怎么操作呢:通过栈上的指针变量访问堆上的数据。- 动态数组(当数组空间不够的时候,他可以自动扩容)1. 我们通过写Vector.h的头文件以及他的实现来创建动态数组。(我感觉类似于java里面的getter setter?)[图片]2. vector.h ; main.c ; vector.c 的三方关系:[图片]3. 利用realloc函数进行扩容 realloc(void* ptr, size_t size): void* ptr-> 指向旧的内存块儿  size_t size:新内存的大小。- 如果返回值为NULL:重新分配的内存失败,旧的内存块不会被释放。- 不为NULL:重新分配成功。- realloc既可以扩容,也可以缩容。- 缩容:把多余的释放掉。- 扩容:第一步尽量原地扩容。第二步:如果不能原地扩容,那么就复制到大的内存空间的位置,然后吧旧空间释放掉。- 释放内存:(free)1. 注意事项:2. 严禁 double free3. free之后对野指针进行解引用会产生未定义行为。- 内存泄漏:程序中存在垃圾的现象。(这就会导致OOM现象。out of memory)[图片]- 动态分配的结构体:(链表)[图片]- 如果定义的链表类型是void的话就会发生head下一个节点是空值的现象。(怎么解决?二级指针**phead)- 二级指针:Node** pp -> Node*p -> Node node !!![图片]- 问题:传递参数的时候到底传一级指针还是二级指针。- 解决:想修改哪个变量的值,就穿哪个变量的地址!!!- 如果是想修改指针变量的指向(值),传二级指针- 如果是想修改指针变量指向的对象,传一级指针- 函数指针:- 他是什么?指向一个函数的首入口(首字节),那么这个指针就是函数指针。- 函数指针你只要知道他的入口他就会一直往下执行。1. 怎么操作?他只支持两个操作:解引用,函数调用。2. 编程范式:面向过程,面向对象,函数式编程(一等公民)<包含复制,作为参数,作为返回值>,逻辑式编程。3. 在c语言中,函数不是一等公民,函数指针是一等公民4. 在c语言中,可以通过函函数指针,进行函数式编程(有利于解耦合,易组合)。[图片]- qshort()函数就是典型利用了函数指针。它的功能:可以对任意一个数组排序。- 解耦合的形象图例:compare是钩子函数[图片]
我的求职进度条
0 点赞 评论 收藏
分享
11-09 14:15
同济大学 C++
!马上就能结束基础语法了!一个阶段算完成了!- 命令行参数1. 命令行参数的作用位置:操作系统通过应用程序返回的状态码给应用程序来发送的命令行参数(main函数)2. 命令行参数属性页面:[图片]3. 如何使用命令行参数: argc argv[]分别是什么意思?[图片]4. 参数转化:[图片]5. 读写文件的对应几个操作:(内存)scanf - printf = (字符串)sscanf - sprintf = (文件)fscanf - fprintf[图片]6. 为什么要用命令行参数?怎么用?(意思是在命令行里面进行编程)- 改变程序的行为,不同命令行参数对应不同的行为,也就是执行不同的命令内容。- 有利于编写通用的程序。7. 结构体- 面向对象: JAVA C++类:属性,行为面向过程: c语言c语言怎么怎么表示一个类的概念呢?通过结构体结构体:用户自定义类型。- 比如:学生:属性:学号、姓名、性别、成绩行为(函数):8. 结构体变量的内存布局:[图片][图片]- 一篇连续的内存空间- 成员是按照声明的顺序依次存放- 填充(填充字节):padding 出现在结构体的中间或者末尾。填充的目的:内存对齐。- 比如内存是四个Byte为一个单元存放,如果最后的数据存放在一个内存单元的末尾,很有可能发生跨单元存放的现象,导致存放在下一个单元里面。后续这个内存下这个成员的内存的时候需要读取两次,所以就索性进行填充,把数据存在下一个单元里面。这样最后读取就只会读取一次了。9. 结构体变量的操作- 结构体变量的定义(后面一定要加分号):[图片]- 1.获取成员 2.结构体赋值(复制)std2 = std1- (*s). 等价于 s->- 如果传入函数只有查询的话那么传入参数就最好有个const。同时也得是指针- 如果传入参数涉及到指针指向修改的话。那么就没有const[图片]- 对结构体对象进行别名操作:[图片]- 匿名结构体(只能引用一次):[图片]- 这个得看懂:1. 把student这个类型取一个别名叫 Student 2. 把 student这个指针类型取了一个别名叫 pStudent[图片]10. 枚举- 枚举值是离散的- 枚举的值赋值为2的幂。DIAMOND = 1 , CLUB = 2, HEART = 4, SPADE = 8- 枚举也可以取别名- 枚举值必须为整数
0 点赞 评论 收藏
分享
11-06 23:38
同济大学 C++
最近两天搞开题报告去了。累死了。不过好运的是开题过了,没有二辩。今天学的内容:- 传入与传出参数:[图片]- static void min_max() 与 void min_max() 静态函数和非静态函数。1. 静态函数的作用域只能在本文件内(也就是生命周期的不同)2. 一般函数的作用域其他的文件也能使用- 指针作为返回值!!!- 注意:永远不要返回指向当前栈帧(foo)的指针变量(意思就是不要指向即将释放的内存空间)- 指针作为返回值的时候意思就得指向一个稳定的栈区域,不能指向即将释放的内存空间- 数组与指针:1. 指针支持的运算:指针 + 一个整数 = 指针; 指针 - 一个整数 = 指针;指针 + 指针。2. 指针对应的加法:向右偏移几个元素。[图片]3. 数组名可以做为指向它第一个元素的指针使用。(数组名字作为指针用途的时候会退化为指向第一个元素的指针)- 指针支持的比较运算1. p == q 等价于 p - q == 02. P <= q 等价于 p - q < 03. P >= q 等价于 p - q > 0- ++; --; *1. *p++ : 值:*p 副作用:p自增2. *(p++):值:*p 副作用: *p自增3. ++*p,++(*p):值*p + 1 副作用:*p自增4. *++p,*(++p):值*(p + 1) 副作用:*p自增- 字符串- 字符串三种书写方法:print("xxx"); printf("xx\ 换行后  -- x\n"); printf("xxx" 换行后 "    -- x\n");- 字符串存储的位置:代码段(只读)== 可以看成是:常量数组。可以吧字符串的字面值看作是数组名[图片]- char*p = "Hello";[图片]- C语言的字符串变量:1. C语言没有真正的字符串类型。2. c语言中字符串依赖字符数组存在。3.[图片]4.   指针指向字符串数组会发生的报错的一些问题:[图片]5.   原因arr2 = s1; arr3=s2这里是等价的[图片]6. size_t类型的别名- size_t 代表一个无符号整数,他代表一个字符串的长度,所以他是const char传入参数 目的就是:可移植性
0 点赞 评论 收藏
分享
11-01 01:18
同济大学 C++
- 一个很重要的:加减会溢出,异或不会溢出。- 函数:function:功能(函数应该完成某种功能、职责、任务)1. 函数的结构:- 函数声明:bool is_prime(int n);- 函数体:bool is_prime(int){...}- 函数调用: is_prime(34)- 函数调用和赋值: bool flag = is_prime(19)- 函数指针:is_prime;- C语言是面向过程(函数)的语言:函数是c语言程序的基本构建单位:c语言程序是由函数之间的相互调用组成的。- 参数传递:形式参数,实际参数。参数传递:实参——>形参。C语言没有引用,只有值传递(复制)。main函数是栈里面最后的一个层,只有等其他所有的执行完了才是main函数出栈。1. 注意:调用的函数有自己的数据副本,他会修改被调函数中的参数,但不会影响主调函数的值。2. 注意:如果想要通过被调函数中的参数来修改,主调函数的值,那么解决办法就是:指针。(指针就是地址,原本参数传递的是值,指针因为是地址,所以就能实现上述功能)3. 注意特例:数组作为参数时,会退化成指向该数组第一个元素的指针。(发生了类型转换)[图片]4. 这个退化有利右弊:- 优点:1避免大量数据的辅助 2可以在被调函数中修正盖主调函数的值 3让函数调用更灵活- 缺点:1丢失了长度信息- 局部变量:定义在函数里面的变量1. 作用域:可以引用变量的区域,2. 块作用域:生命周期,存储期限3. 一般局部变量都放在栈里面,因为他是自动存储期限,随着栈帧入栈开始,栈帧出栈消亡;动态存储期限malloc开始,free结束;静态存储期限:永久!比如数据代码。怎么把默认为自动存储期限的变量变为静态的呢?static关键字!4. 静态变量(static):静态存储期限的变量可以存储上一次函数调用的状态。静态变量只会初始化一次,即便后面在初始化相同的名字变量,他地址值还是不会便。相较于动态(每次都会变)5. 存储期限作用于运行,作用域作用域编译- 外部变量(全局变量)1. 作用域:从变量定义开始,到文件末尾。2. 存储期限:静态存储期限。- 问题:static的局部变量和外部变量有什么区别?- 作用域不同。tips:尽量避免使用外部变量(debug定位问题)- 递归:1. 递归会导致大量的无效计算。比如斐波那切数列。如果要用算法实现非波那切的话一定要用循环的方法。2. 常用面试题:汉诺塔,斐波那契。n皇后(但是实际当中一般都不用递归)- 递归三问;- 到底什么情况下可以考虑递归?问题具有递归结构,也就是能用数学归纳法,同时大问题可以分解为子问题。- 是否使用递归?如果不存在重复计算的问题可以使用递归。- 如何写递归?边界条件,递归公式。
0 点赞 评论 收藏
分享
10-30 18:32
同济大学 C++
- 面试常见题目:1. 求最大公约数:gcd(a,b) = gcd(b,r)  因为 a = b * q + r(余数)=> gcd(a,b) = gcd(b, a % b) = ... gcd(x,0) = x              solution:  int gcd(int a, int b){return gcd(a, a%b);2. a找到一个整数中,从右往左第一个1所在的位置: 求lsb?方法一:有一个指针0x1 每次判断 (n & lsb) ==0 如果是0的话,进入循环然后 lsb <<= 1; 直到(n & lsb) !=0 方法二: 的 return n & (-n);3. 不用中间变量把 a和b换掉。两种思路: a = a+ b; b = a -b; a = a - b; a = a^ b; b = a ^b; a =a ^b;- 语句:1. 三目运算符号  k = i > j ?  i : j;2. 指令语句:if else, switch case break; while true; do while; for; break; continue;- 数组:1. 一维数组:数组的内存空间:一片连续的内存空间,并提前分配好大小相等的小空间[一维内存空间图片]2. 为什么大多数语言都是从零开始?因为这个 i代表的是内存空间的偏移量:i_add = base_add + i * sizeof(elen)3. 常见:数组的效率 > 链表的效率内存:链表内存消耗(离散) > 数组(连续)cpu: 数组可以利用空间局部性4. c语言不检查数组是否越界。无论是否越界他都会执行。- 二维数组:1. 本质是:一维数组,在每个内存子空间下面再竖向添加一个子空间[二维数组内存图片]2. 数组的初始化:推荐 int matrix[2][3] = {0};3. 常量数组:不能修改数组的元素。- 好处:防止篡改,安全性高;有助于编译器优化程序。 应用场景:存储不会发生改变的数据(静态数据)- 例子:扑克牌发牌
笔试
0 点赞 评论 收藏
分享
10-29 04:05
同济大学 C++
目标大厂,冲就完事儿了- 实现输入输出的一个小程序:- 读取输入 scanf("%f", &var); 根据读取的输入(var), 然后对var进行后续的处理- 同时代码读取规范也同样重要,如果突然在代码中间加了一个数字的话,没有任何说明这样可读性很差。- 对于一些恒定的变量可以用预处理器提前声明。define SCALAR = 32类似这样- CPU、内存、外部设备。内存、虚拟内存。程序、进程。进程调用的是内存还是虚拟内存,程序调用的是内存还是虚拟内存?- 格式化输出:1. Printf: f -> format(格式化,控制输出的格式)2. 具体printf从键盘读取到最终打印出来的流程:[图片1]3. 格式化输出的语句格式:printf(格式串,表达式1,表达式2,。。。)int i = 10;float f= 3.14f;printf("i=%d, f = %f\n", i, f)4. printf具体的原理是:打印格式串的内容,并用后面的表达式替换格式串中的转换说明5. 格式串的具体语句:->对于普通字符,也就是字符串,他直接原样输出->对于转换说明,他的作用是占位符比如 %d %f等等。他有具体格式: %m.pX %-m.pX比如%d, %2d, %6d 分别代表的意思是占一位、占二位、占六位。%.2d, %.4d, %.6d分别代表保留几位小数点。 比如 %10.2d:10代表占10位,2代表保留2位有效数字。6. %d%f在读取键盘输入的时候代表的是什么意思呢?%d:忽略前置的空白字符(' ',\n,\t,\r,\f),匹配有效的10进制整数;%f忽略前面的空白字符(' ',\n,\t,\r,\f)匹配一个浮点数7. scanf本质就是一个匹配函数,类似于正则表达式。8.  gcd -> if b == 0 return a else return gcd(b, a%b)- 整型:1. 无符号整数:unsigned short (int), unsigned(int),unsigned long, unsigned  long long2. 有符号整数:short (int), int, long(int), long long(int)- 编码(位运算)1. 无符号整数:类似于正常2进制转化为10进制: 1010_1010(2)的值为=128 + 32 + 8 +2 =1702. 有符号整数:有符号整数一律采取补码:1010_1010(2) = -128 + 32 + 8 + 2 = -86。3. 补码的性质:a) 如果一个有符号整数他的二进制表示都是1那么他的10进制表示的值就是-1。[图片2]b) 有符号整数 a + (~a) = 1111...(2)  = -1 (10) ps:~a代表按位取反 ---性质1c) 有符号整数 a + (-a) =100...000000(2) = 0 (10) ps:这里的2进制表示的1会被丢弃所以结果会变成0.一个问题:有符号整数二进制表示为 11010100(2)他的相反数的二进制表示为?[图片3]- 浮点数:float, double, long, double IEEE 754标准- Char ASCII: 码点0 32 48 65 97 -> 字符‘\o’ 空字符 ; ‘ ’空格; '0';  'A' ; 'a'1. 控制字符:0-31这个是不可以打印的。2. 转义字符:[图片4]3. 数字转义字符:[图片5]4. !!!C语言是把字符当成小的整数来进行处理的 !!!=》整数能支持的操作,字符类型也能支持5. 字符分类函数:查表 大小写转换函数[图片6]6. 如何和用户交互:输入输出输出:printf  ; putchar(c)- 类型转换1. (隐式转换)不同类型进行加法运算的时候最后的类型会根据一个优先级别表进行分配。比如long long + long = long long 而 int + long = long- 最好尽量避免使用无符号整数,特别是不要把他和有符号整数混合使用:[图片7]2. (显式转换)强制转换。int i; float f = 6.17f   i = (int)f- 计算浮点的小数部分- 注释作用- 精确控制转换类型- 强制类型转换避免溢出[图片8]- sizeof:计算某一类型的值,所占内存的长度,单位为字节
0 点赞 评论 收藏
分享
10-29 04:02
同济大学 C++
27届记录贴:目标大厂,冲就完事儿了!- 解决方案:解决方案下面可以支持多个项目比如(解决方案:项目1,项目2,项目3.)- 项目下面的文件:1. 头文件(窗口):*.h 结尾2. 源文件(窗口):*.c 结尾3. 资源文件(窗口):配置文件,静态文件,比如视频、图片等等4. 新建c语言文件是 .c结尾;但是c++是 .cpp结尾5. 目前我们需要的是32位的编译器对应的就是x86;如果是64位的编译器的话对应的就是x646. include <stdio.h>//  预处理指令。 凡是以#开题的他是一个预处理器,他不遵循c语言的语法7. 和java一样,每一个项目只能有一个main函数,我们的进程只能从main执行。8. 第二行代码 return 0; 有两个作用:1。 终止main函数 2. 程序终止时会向操作系统返回状态码 09. 可执行程序是如何生成的[图片1]10. 进程的虚拟内存空间- 预处理:以#开头的指令都是预处理指令,预处理的指令都比较简单。常见预处理指令:include define define FOO(x)(1+(x) * (x)):这个和第二个define没啥区别,就是带参数的宏函数。宏函数:在写宏函数的时候一定要注意合理的加括号,不然在预处理的时候会出现优先级先后顺序的问题。几个点:a 参数要加括号 b 整个表达式也要加括号 c左括号要紧挨宏函数的名字,不要出现空格。宏函数比函数调用的优点:a 他比函数调用开销小 b定义宏函数的时候不需要指定参数类型,类似于泛型的“概念” c提供一定的宏编程使用场景:a 用宏函数替换频繁调用且简短的函数 b- 编译: 经过预处理器处理的文件会给编译器进行编译。编译器会把程序翻译成对应平台的汇编代码。- 汇编:汇编其会把生成的汇编代码翻译成对应平台的机械代码(目标代码)。然而现在的程序是不能运行的,还需要经过最后一个步骤——链接- 链接:在链接阶段,连接器会把由汇编器生成的目标代码和程序和其他的附加代码整合在一起,生成最终可执行的程序。这些附加代码包括陈谷小胡总用到的苦函数比如 printf 函数11. 进程的虚拟内存空间:[图片2]
如果秋招能重来,我会__...
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务