- 博客(43)
- 收藏
- 关注
原创 C语言练习题之 用栈实现队列
描述用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。数据范围: n≤1000要求:存储n个元素的空间复杂度为O(n) ,插入与删除的时间复杂度都是O(1)
2024-10-12 13:15:11 192
原创 C语言学习之 没有重复项数字的全排列
然后是递归的主体,本着按顺序排列组合的思路,依次对数组首位(index = 0),第二位(index=1),第三位,第四位...进行交换。以题目中 1 2 3 数组为例,将1 分别与2、3交换,就能得到1 2 3;题目中排列组合,在之前的课中有类似练习,当时是通过交换两个元素的思路完成的,这里想到递归之后,第一时间我就想到用交换的思路。题目中又要求顺序,所以需要考虑交换后的数组顺序是否为题目要求的,如不满足,还需进行调整。根据题意,输出的是一个个的数组,所以需要每个数组对应的行数、列数。
2024-10-04 11:01:04 644
原创 C语言练习题之 字符串变形
首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。字符串逆序两次,第一次将全部字符逆序,第二次以空格为界限分段逆序,就将所有单词逆序了。这一题意思很简单,就是一个字符串,其中只有大小写字母和空格。我们要将字符串的单词从后往前排列,同时将大小写转换一次。之前的博客有大小写转变的程序,也有字符串逆序的程序,这里可以借用一下。请返回变形后的字符串。给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)
2024-09-21 15:01:52 238
原创 C语言练习题之 跳台阶
拿到这个题目,很容易想到递归,只要让青蛙每次跳1级或者跳2级,最后剩下1级的时候就只剩一种跳法,剩下2级就只有2种跳法。让青蛙把所有可能的跳法都跳一遍,最后剩下1级台阶就+1,剩下2级台阶就+2。上式是每次计算时,将跳1级和跳2级的可能都跳一遍,如果能做到每一级将前面1级和前面2级的所有可能跳法都加起来,那就可以一遍将所有跳法算出来。递归的算法容易想,写起来也比较简洁,但是当台阶数比较多的时候,花费的时间太长,不满足题目要求:时间复杂度:O(n)。要求:时间复杂度:O(n) ,空间复杂度:O(1)
2024-09-12 19:00:04 342
原创 C语言练习题之 数组中出现次数超过一半的数
如果参考值不是所求值 a,会被赋新值,因为所求值出现的总数最高,则遍历之后,最后 a一定会被赋值为所求值,比较结束后,结果也一定大于0。遍历过程中,arr数组中出现哪个数值,就对计数数组的对应位元素+1,统计出arr数组中每个数出现的个数,然后对技术数组遍历一遍,就能找到出现次数超过一半的数字了。根据题意,所求的返回值一定是 0-10000 这10001个数中的一个,所以如果提供一个容量为10001的数组,就可以把所求值的所有情况包含进去。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。
2024-09-07 15:45:37 656
原创 C语言练习题 包含min函数的栈
当现在已有10个元素,第10个元素是20,10个元素中最小值是-5,下一个压入元素是-20,这时新的最小值会更新为-20。如果下一个操作是弹出栈顶元素,则最小值应该是-5,可现在-20是最小值,如果舍弃,则丢失了之前的-5。定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。由于栈是记录临时变量的,不方便我们演示,这里采用数组来记录栈中元素,并参考栈的压入弹出等功能对数组进行操作,从而实现演示。
2024-08-30 17:53:37 1086
原创 C语言练习题 寻找峰值
取其中间值判断,若中间值所在位置为上升阶段,则其和右边下降沿中间一定有峰值,可以将左边界置于中间位置,重新查找;峰值的两侧分别为上升和下降,则只要区间的左边界是上升的,右边界是下降的,那么其中间必定存在峰值。如此循环下去,当中间值左边是上升沿(中间值大于前一位元素),右边是下降沿时(中间值大于后一位元素),则中间值为峰值。二分之后,新的区间如起始一样,其左边为上升沿,右边为下降沿,取其中间值判断,思路与初始相同。a、数组只有一个元素,则它大于自己前面的负无穷,同时又大于后面的负无穷,峰值为其本身。
2024-08-22 16:19:34 165
原创 学习C语言之 了解程序的编译(预处理)+链接
程序同时也可以使用静态( static )内存,让存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。如果内存大,就需要一个大的数组。当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的结果。2.1.3、链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。如果一个程序引用了两个头文件a、b,而这两个头文件a、b又都引用了同一个头文件c,这就造成了文件内容的重复。
2024-08-10 17:22:54 566
原创 学习C语言之 了解文件操作
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符占一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013中)。想要保存数据,就需要数据的持久化,数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区的操作,或者在文件操作结束的时候关闭文件。
2024-08-09 09:49:18 464
原创 学习C语言之 了解动态内存分配
于是,我把结构体的内存以及其成员要的内存一次性分配好,并返回给用户一个结构体指针,用户做一次 free 就可以把所有的内存也给释放掉。但是对于空间的需求,不仅仅是上述的情况。c、包含柔性数组成员的结构体用 malloc () 函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。情况2)中,原有空间之后没有足够多的空间,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。e、这个函数在调整原内存的空间大小的基础上,还会将原来内存中的数据移动到新的空间。
2024-08-07 18:07:48 496
原创 学习C语言之 了解结构体、枚举、联合体
d、如果嵌套了结构体,嵌套的结构提对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。d、当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃还是利用剩余的位,这是不确定的。e、跟结构体相比,位段可以达到同样的效果,但是可以很好的节省空间,却也有跨平台的问题存在。结构的每个成员可以是不同类型的量。
2024-08-05 18:47:56 443
原创 学习C语言之 了解字符串函数和内存函数
c、strtok函数找到str中的下一个标记,并将其用 ' \0 ' 结尾,返回一个指向这个标记的指针。(strtok函数会改变被操作的字符串,所以使用strtok函数切分的字符串一般都是临时拷贝的内容,并且可修改。isspace——空白字符:空格 ' ' ,换页 ' \f ' ,换行 ' \n ',回车 ' \r ',制表符 ' \t ' 或垂直制表符 ' \v 'a、字符串以 ' \0 ' 作为结束标志,strlen函数返回的是在字符串 ' \0 ' 前面出现的字符个数(不包含 ' \0 ' )。
2024-08-02 19:14:16 819
原创 学习C语言之 深入了解指针2
函数指针数组形式 int (*ptest [10] ) () ,ptest 先和 [ ] 结合,说明 ptest 是数组,数组的内容是 int (*)() 类型的函数指针。函数指针形式 void (*ptest) (),ptest 和 * 先结合,说明 ptest 是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为 void。回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就被称作回调函数。主函数部分明显简洁一些。
2024-07-27 17:59:34 228
原创 学习C语言之 深入了解指针1
arr +1 得到的是数组第二个元素的地址,&arr +1得到的是下一个数组(或数据)的地址。&arr 的类型是 int (*) [10] ,是一种数组指针类型,&arr+1会跳过整个数组的大小,即 &arr+1 与 &arr 的差值是40(数组是10个整型,占40个字节)。int (*p) [10] 中,p 先和 * 结合,说明p是一个指针变量,然后指针指向的是一个大小为10个整型的数组。3)指针是有类型的,指针的类型决定了指针的 +/- 整数的步长,指针解引用操作时候的权限。
2024-07-26 17:57:54 336
原创 学习C语言之 深入了解数据存储
但由于科学计数法中的指数会出现负数,为方便表示,IEEE754规定,所有数值的指数存入内存时,都加上中间数,对8位的E,加上127(对11位的E,加上1023)。对于大端存储模式,就会将高字节的0x11放在低地址中,即地址0x0010中,将低字节的0x22放在高地址中,即地址0x0011中。对于小端存储模式,就会将高字节的0x11放在高地址中,即地址0x0011中,将低字节的0x22放在低地址中,即地址0x0010中。小端存储模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。
2024-07-20 14:44:21 847
原创 学习C语言之调试技巧
2)Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。1)const放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。2)const放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。调试>窗口>监视>监视1(任选一个都行)>输入变量名:在调试开始之后,用于观察变量的值。CTRL+F5——开始执行(不调试),用于不调试,直接运行程序的情况。
2024-07-17 19:32:05 1104
原创 学习C语言之了解结构体
结构体 struct Stu 包含浮点型数、字符数组、整型指针、结构体struct score。结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构变量的成员是通过点操作符(.)访问的。一个结构体可以包含多种类型数据,如上例包含字符类型、整型、浮点型。上例中结构体指针解引用等同于结构体,所以可以用 (.)操作符访问。结构体的成员可以是标量、数组、指针、其他结构体。2)结构体指针访问指向变量的成员。1.4结构体变量的定义和初始化。1、结构体的基础知识。2、结构体成员的访问。
2024-07-13 17:58:15 284
原创 学习C语言之 了解指针
如上,做到使用指针时初始化,如int a = 0,int * pa = &a,没有变量时,可以先用NULL初始化。以32位平台为例,一个地址是32个比特位,一个字节可以存储8个比特位,所以需要4个字节来存储。平时口语中的指针,通常指的是指针变量,即用来存放指针的变量,也就是用来存放地址的变量。野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。指针变量也是变量,这个指针变量存放的指针就是二级指针。多字节变量取地址得到的地址是它的第一个字节的地址。指针数组是存放指针的数组。
2024-07-13 15:24:19 307
原创 学习C语言之操作符详解
操作数代表的是指针变量,指针变量的大小在编译器中是固定的,32位系统是4,64位系统是8。表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是 int 的字节长度,同时也是CPU的通用寄存器的长度。5)算术转换:如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的类型转换为另一个操作数的类型,否则操作就无法进行。2)+=,-=,*=,/=,%=,>=,&=,|=,^=:复合赋值——操作数 += 等价于 操作数 = 操作数 +,其余同理。
2024-07-11 17:40:29 640
原创 学习C语言之 数组扫雷
7、排查雷 FindMine() ,接收坐标,先判断合法性,合法之后再判断是否有雷,无雷之后再判断坐标周围有几个雷 get_mine_count();分模块编写函数是为了方便调试,之前编写模块如果没有问题,那问题出现的地方就在新编写的模块函数中,因此出现问题可以很快找到出错点。3、雷区通过数组方式实现,布置雷采用mine[ ][ ],排查雷采用show[ ][ ];首先进入菜单,然后选择游戏,输入1则开始游戏;5、打印排查层 DisplayBoard() ,雷区层不用打印,隐藏起来即可;
2024-07-10 08:21:28 145
原创 学习C语言 数组三子棋
之后玩家落子/电脑落子,若无赢家及平局,则继续循环落子,若出现赢家或平局,则提示后跳出循环,回到主函数,进入下一轮循环,选择是否游戏。有些电脑使用rand(),srand(),time()等函数,还需#include 及 #include 。首先通过do while循环,进入菜单,判断是否游戏,输入值作为while()的判断,如果是0,则终止循环;判断状态IsWin() 中,将平局IsFull() 单独拿出来判断,判断后返回IsWin()。
2024-07-09 10:49:26 241
原创 学习C语言之数组1
行可以省略,是因为二维数组在内存中是按序存储元素,一行结束进入下一行,只要知道列数,这一行占用的空间就明确了,就能知道下一行的地址。1)sizeof(arr)时,数组名表示整个数组,计算的是整个数组的大小,单位是字节。可以看到地址以16进制数表示,里面的元素地址依次增加,每个元素占4个地址,即整型元素占4个字节。后续引用数组时,[ ]内可以用变量,如 i,j。2)&数组名时,数组名表示整个数组,取出的是整个数组的地址。数组创建时若不初始化,里面的值是随机的,不易控制,一般都建议给个初始值。
2024-07-08 15:36:38 601
原创 递归解决汉诺塔问题和青蛙跳台阶问题
输入n=3层时,函数tow(3)执行 return 2*tow(3 -1) +1,进入下一层tow(2),执行return 2*tow(2-1) +1,进入下一层tow(1),执行return 1。第N(N>2)层也只有两种可能,分别是从(N - 1)层再跳1层,从(N-2)层再跳2层。这个问题很明显可以如此分析,将圆盘分为最低部一个,和上面N-1个两部分,只需将上面N-1个圆盘放在B柱上,再将底部圆盘放在C柱上,然后将B柱上N-1个圆盘放到C柱上即可。有个青蛙,一次可以跳1层台阶,也可以跳2层台阶。
2024-07-05 15:37:15 251
原创 学习C语言之函数3
上例中,函数factorial() 执行时,先判断x是否≤1,当x≤1 时,返回1,否则返回 x * factorial(x -1),即向下调用。当 x 大于1时,函数向下层调用,直到x=1,此时返回1,上一层接收到返回值并被2乘,再返回上一层被3乘,一直往上,直到表层值返回到主函数中。即先打印234 %10 得到的4,再往下一层判断是否调用函数,直到第三层,print()参数为2,不再向下调用,程序结束。又由于数组中的变量储存在连续的地址上,所以可以通过str+1 的方式直接对比下一个地址中的变量。
2024-07-05 14:22:18 411
原创 学习C语言之函数2
头文件为 xxx.h格式,在头文件中声明函数,在头文件对应的 xxx.C文件中编写程序,即可在主函数中使用#include "xxx"进行调用。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。add() 函数的参数是函数 link(),而不是变量。函数的声明一般出现在函数的使用之前。头文件 add.h 中的内容只是声明,并没有具体的代码。把一个函数的返回值作为另外一个函数的参数。
2024-07-01 17:17:28 220
原创 学习C语言之函数 1
函数swap2通过指针变量,使swap2函数接收到a,b对应的地址,再通过解引用改变相应地址中保存的数值,所以执行后a,b跟着变化。函数get_max的返回类型是int,函数名是get_max,函数参数是int x和int y,函数体是大括号里面的内容。调用函数时函数真实传递过去的参数叫实参,实参可以是c常量、变量、表达式、函数等,无论是什么形式的量,实参都必须有确定的值。函数名后括号中的变量叫形参,只有在函数b被调用的过程中才实例化,形参在函数调用完后自动销毁,所以只在函数中有效。
2024-06-29 18:21:14 545
原创 学习C语言之goto语句 随笔
使用rand()需提前准备srand()函数作为基础;使用rand()和srand()需#include <stdlib.h>。4、一般可以用time(&t)来为srand()提供变量。5、system(“命令”),执行系统命令(即cmd命令)。使用system("命令")需#include <stdlib.h>使用sqrt()需要#include <math.h>。system("shutdown -s -t -60"),电脑关机 时间60秒。system("shutdown -a"),电脑取消关机。
2024-06-27 16:16:45 263
原创 学习C语言之for 循环 和do...while循环
3、do...while循环中,continue 代表继续,即跳过本次循环continue后面的语句,直接重新判断是否继续新一轮循环。3、for循环中,continue 代表继续,即跳过本次循环continue后面的语句,直接重新判断是否继续新一轮循环。6、for循环的初始化、判断、调整三个部分都可省略,程序仍能执行下去。2、do...while循环中,break 代表永久中止循环,直接跳出循环。2、 for循环中,break 代表永久中止循环,直接跳出循环。内部修改变量,导致后面看代码人员修改出错。
2024-06-25 10:32:44 205
原创 学习C语言之while循环
4、scanf可以读取一个字符串但不能读取空格、回车。getchar 可以读取一个字符,包括空格和回车,配合while 循环,可以清除缓存区。putchar会将getchar读取的字符打印出来。3、while 语句中,continue 代表继续,即跳过本次循环continue后面的语句,直接重新判断是否开始下一轮循环。键盘输入的字符会先存到缓存区,scanf 和getchar 获得的字符都是从缓存区读取的。2、while 语句中,break 代表永久中止循环,直接跳出循环。getchar功能演示。
2024-06-15 16:30:37 247
原创 学习C语言之分支语句
5、switch 语句中,对case 条件不包含的情况,可以用default 处理。相当于if 语句的 else。4、if 语句默认只能执行1条语句。想执行多条语句,需要用大括号{ }括起来。3、switch 语句中,case 决定入口, break 决定出口。4、switch 语句中,case 可以不执行任何操作。//表达式为真(非0),则执行语句1。//表达式为假(为0),则执行语句2。//表达式为真(非0),则执行语句。隔开的就是一条语句。语句项是一些 case 语句,如下。分支语句(选择语句)
2024-06-14 18:03:28 267
原创 学习C语言之初识指针和结构体
但由于计算机动辄是2的N次方的内存,如果用全二进制数字0/1来表示地址,那会不利于管理。地址:计算机中,数据都保存在内存中,像存在一个个小房间一样,地址就是小房间的门牌号,知道了门牌号,我们就可以直接找到对应的数据。有些数据规模比较大,一个小房间住不下,要占用多个小房间,指针只指向第一个房间号,也就是地址的首位字节。由于指针中存放的是地址,则使用指针的时候,就是使用地址。2、指针变量用 数据类型* 定义,这里的数据类型和要存放地址的数据类型相同。1、指针变量是用来存放地址的,用 * 定义。
2024-06-12 17:02:57 255
原创 学习C语言之关键字和预处理指令
/static 修饰全局变量,改变全局变量的作用范围(static改变了全局变量的链接属性,外部链接属性被改为内部链接属性),使全局变量只能在本源文件中使用。register //寄存器关键字,大量、频繁被使用的数据,建议放寄存器中,可以提高计算效率。//计算机中,CPU处理的数据可以是 寄存器、高速缓存、内存、硬盘中的,其中寄存器最快,硬盘最慢,依次排列。//static 修饰局部变量,改变局部变量的生命周期(本质上是改变了变量的存储类型,从栈区转移到静态区)。
2024-06-12 10:17:32 359
原创 学习C语言之操作符2
逗号表达式从左往右依次计算,整个表达式的结果是最后一个表达式的结果。exp1 不成立,exp3计算,整个表达式的结构是exp3的结果。exp1 成立,exp2计算,整个表达式的结构是exp2的结果。函数调用时,用()进行函数调用,如 printf()。sizeof 操作数的类型长度(以字节为单位);数组引用时,用[]进行下标引用,如 a[1]。* 间接访问操作符(解引用操作符);~ 对一个数的二进制按位取反;= 用于测试”不相等“-- 前置、后置--;++ 前置、后置++;== 用于测试”相等“
2024-06-11 16:04:00 152
原创 学习C语言之操作符1
/(a+=5 等同于 a= a+5);学习中各种新知识最好自己验证一下,验证之后更深刻。//按二进制位进行逻辑操作。//移动的是二进制位;% 取余,及商数的余数;
2024-06-07 12:42:03 199
原创 学习C语言之认识选择语句 循环语句 函数 数组
/数组可以赋初值,按顺序往后赋值,未输入则默认是0 或\0。//数组下标从0开始计算,访问数组通过下标访问,这里打印结果是"c"。if(a
2024-06-06 17:27:01 310
原创 学习C语言之 常量、字符串
4、枚举常量,一周从周一到周日是能列举完整的,就叫枚举,C语言中用enum可以将后续会用到的变量范围全部列举出来(默认从0开始递增,可以主动赋初始值),之后赋值时只能从该范围内选择,常量值为对应的顺序号+初值-1;1、字符串是用英文双引号引起来的一串字符,字符串后面都有一个隐藏起来的 \0 ,\0是字符串的结束标志,不计入字符串的长度中;3、注释是用来解释代码的,可以在前面或中间加"//解释",不会被编译,也可以“/* 解释 */”,但/* */不支持嵌套注释;—— MIN就会变成标识符常量,数值是1;
2024-06-06 13:33:09 254
原创 学习C语言-变量的作用域和生命周期
1、作用域是指该变量可以使用的范围,一般局部变量作用域是该变量所在的“{}”内,全局变量的作用域是整个工程内;2、同工程内不同文件中引用全局变量时,需声明后才能使用,声明格式:extern XXX;3、局部变量的生命周期是程序从局部变量所在的作用域(即“{}”)起始到结束;4、全局变量的生命周期是整个程序的生命周期,即主函数的起始到结束。认识变量的作用域和生命周期。
2024-06-05 15:03:25 104
原创 学习C语言 认识常量及变量
7、scanf是输入函数,格式为scanf("%数据类型 ",&变量),可输入多个变量,中间加“,”即可;如scanf("%d %d",&a,&b);4、printf 打印时,符号对应数据类型:%d - 整型、%f - float、%lf - double;9、VS2013建议使用scanf_s 输入函数,但只能在VS上面使用,不建议;5、变量分局部变量、全局变量,主函数内定义的是局部变量,主函数外的是全局变量;1、常量即不可变数据、变量即可变数据;3、创建变量的时候最好给个初始化的值;
2024-06-04 11:52:31 144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人