![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 51
C语言的语法和典型题目
wzdxsa
大大方方的去肯定自己
展开
-
文件操作3
可以看到上图第一遍fread的返回值len1为15,不是100,因为fread的返回值是实际读取的数据数量。所以在第二次读len2之前,我们要将文件标记位置,重新移动到文件开头——fseek。这里的文件读写位置标记——可以想象成图形界面里的光标,读写时自动移动。而读数据时,也有一个看不见光标,随着已经读完的数据,往后移动。例如读下图中的一串数据,第一遍顺序读到末尾,光标显示在末尾。例如要到达文件开头,那就是偏移量为0,以文件开头为参照点。要是以第一遍读完后的文件尾,为当前位置,作参照点,原创 2024-03-25 23:03:57 · 461 阅读 · 0 评论 -
文件操作2
可以看到代码执行完后2个文件的大小是一模一样的,打开第二个文件,里面复制的内容也跟第一个一样。但这两个函数不太好用也不广泛,因为它们只能读写文本文件,非文本文件的操作可能会出错,且速度慢。这里相对路径创建的文件就跟下图中右上角的——打开所在的文件夹,打开后的路径一样。后面相对路径创建的文件就在下图中,即上图中刚刚打开的所在文件夹。打开1.txt文件,因为是二进制的形式,所以是这样看不懂的乱码。因为是中间不做任何转换的二进制,如果有转换,字节大小就不一样了。二进制文件打开,我们看到的是乱码,原创 2024-03-25 18:08:38 · 359 阅读 · 0 评论 -
文件操作1
可以看到这个buf打印出来有问题这里一路烫是因为我们前面说过的,在文件中,字符串的结尾并没有‘\0’而buf是一个字符串数组,所以一个简单的办法就是把它写成——原创 2024-03-20 23:10:40 · 864 阅读 · 0 评论 -
文件概念-C语言
例如下图,这个要往屏幕上写数字1,但它的输出是个小黑块或像个口字或是别的奇怪的字符,也可能什么都没有,看不见,不同的系统表现可能略有不同,但根本上数字1就是一个看不见的字符,非要看的话就是个奇怪的符号,但它没有任何意义。还有一种就是打开一本书,你能看见也能复制它的文字,但它不是文本,是照片拍出来的图片识别后的,所以它的文字就不清晰较模糊。文本文件的文字都是非常清晰的。我们可以先将上面的1转成16进制,为31,再转成10进制,3*16+1=49,而阿斯克码49就是字符1的编码,字符0的编码为48。原创 2024-03-19 08:54:57 · 908 阅读 · 0 评论 -
定义一个学生结构体,包含学号,姓名和三科成绩。定义一个函数实现每科的平均分并输出,再定义一个函数求出总分最高分的学生并输出该生信息。
【代码】定义一个学生结构体,包含学号,姓名和三科成绩。定义一个函数实现每科的平均分并输出,再定义一个函数求出总分最高分的学生并输出该生信息。原创 2023-10-20 12:48:21 · 2573 阅读 · 0 评论 -
易错题-C语言
指针数组可以说成是”指针的数组”,由于*p没有括号,首先这个变量是一个数组,其次,”指针p”修饰这个数组,意思是说这个数组的所有元素都是指针类型,而指针所占的字节数和其类型无关,只与系统有关,在32位系统下,任何类型的指针占据4个字节,在64位系统下,任何类型的指针占据8个字节。而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。所以对的有 p,&a,&*p,*&p。原创 2023-10-20 00:55:13 · 188 阅读 · 0 评论 -
输出函数(printf)格式化符-C语言
组成格式符号。其作用是,等后面传入的参数来进行替换。printf 函数中,字符串里如果有格式符号,可变参数列表中就得有相应的参数(变量、常量、表达式等)。如果不提供参数,打印的结果就会出现。且格式字符匹配是一个一个填进去。输出 有符号 单精度浮点数字,默认为保留小数点后6位。可指定小数点后的精度,表现方式为 %.nf ,其中 n 必须是正整数,不能为负数。n 为多少,就保留到小数点后 n 位,同时进行四舍五入。(float)输出 有符号 双精度浮点数字,默认为保留小数点后6位。原创 2023-10-19 21:22:15 · 1191 阅读 · 0 评论 -
内存,外存,魔数
电脑的操作归根结底是二进制,比如说有一个VIP视频,其文件开头有一百个字节内容的“天下第一”,那么你要是不知道这个魔数的规则,在别的字节的位置开始编译的,那么你这个视频的播放肯定是存在问题,放不出来的。大多数情况下,我们都是通过扩展名(后缀名)来识别一个文件的类型的,比如我们看到一个.txt类型的文件我们就知道他是一个纯文本文件。但是,扩展名是可以修改的,那一旦一个文件的扩展名被修改过,那么怎么识别一个文件的类型呢。其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)。很方便的区别不同的文件。原创 2023-10-12 20:10:41 · 34 阅读 · 0 评论 -
定义一个学生结构体,包含学号,姓名和三科成绩。再定义一个学生数组,实现一个函数从键盘读取5个学生的信息。再实现一个函数将学生信息全部输出
【代码】定义一个学生结构体,包含学号,姓名和三科成绩。再定义一个学生数组,实现一个函数从键盘读取5个学生的信息。再实现一个函数将学生信息全部输出。原创 2023-10-12 15:30:55 · 1006 阅读 · 0 评论 -
定义一个包含年月日的结构体Day,实现一个函数,根据传入的结构体指针计算,该日期是当年的第几天
【代码】定义一个包含年月日的结构体Day,实现一个函数,根据传入的结构体指针计算,该日期是当年的第几天。原创 2023-10-12 14:44:24 · 97 阅读 · 0 评论 -
结构体(2)
但上面的函数设计的非常不好,基本不用。因为上面的结构体的字节数就144个了,这都算少的了,要是学校的学生信息管理系统,那他的信息登记角度更多,四五百字节都有,所以说。name前的&也可以加上,但在数组前面加&和不加&虽然都可以,但其两个指针的含义不同,很麻烦,一个是char*,一个是指向数组的指针。那么我在把实参传递给形参的时候传的数据就很大,传递很大数据很麻烦,那么就需要更好的传递方式。C++里面,一般传的都是类的引用,引用就是一个好用的指针,不会传类的本身。下面就是用指针传结构体,用的非常多。原创 2023-10-12 14:03:00 · 21 阅读 · 0 评论 -
结构体-C语言
等到你要用的时候,例如是存的一个电影,现在要播放,前一段的字节内容播放完了,后一段的字节内容跟它不在一起也没关系,它有一个线索能够找到另一段的地址,然后继续播放另一段就好了。这样就比单个类型的变量或数组更方便处理,而这样定义一个学生的类型,就是结构体。这就跟数组有区别了,数组是只有一个数组名,里面具体的每个格子是没有名字的,我们通过下标来区分数组的每个格子。结构体,称为自定义数据类型,就是按照你自己的意愿(应用场景的需要,不同的应用场景即使是同一事物,关注的信息侧重点也不一样)来定义一个新的数据类型。原创 2023-10-11 15:01:32 · 28 阅读 · 0 评论 -
运算符优先级
1.同一优先级的运算符,运算次序由结合方向所决定。> && > || > 赋值运算符。(表达式)/函数名(形参表)C语言运算符优先级表格。++变量名/变量名++--变量名/变量名--sizeof(表达式)整型表达式%整型表达式。,其他都是从左至右。数组名[常量表达式]表达式2: 表达式3。原创 2023-10-11 13:03:29 · 37 阅读 · 0 评论 -
typedef是干嘛的
这是什么意思,我们定义了一个无符号长长整型的变量 uint64, typedef是用来干嘛的,它用来定义类型,把刚刚的变量提升成为它刚才的数据类型。关键字的作用是用来定义类型而非定义变量的,所以没有它就是一个无符号长长整型的变量,加上它就是无符号长长整型的数据类型。所以(类型名+变量名)是通过一个类型定义变量,(typedef+类型名+变量名)是变量名就提升成这种数据类型了,以后(变量名+变量)定义出来的变量就是上面一整个(类型名+变量名)了。Pint等同于int *。原创 2023-10-10 13:30:09 · 363 阅读 · 1 评论 -
二进制求和 : 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
两个加数的下标(i,j)可以从后往前遍历(i,j--),但和的下标(k)只能从前往后遍历(k++),因为和的具体长度是不能确定的。所以这个相加的结果是一个反的字符串,那么最后在将这个字符串反转一次就是我们要求的真正的和。再说到逢二进一,就是相加为2的结果会变成0,这里用到的就是对2取余。例如十进制中的6+7为13中的个位为3就是 13对10取余剩下的3.而在二进制中1+1为2那么2对2取余,余数就是个位的0.,类似于十进制加法。两个数相加,和的位数长度最长可能为两个数的长度中最长的长度位数加一。原创 2023-10-04 23:10:26 · 666 阅读 · 1 评论 -
有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m个数,见下图,写一个函数实现该功能。
那么我们要做的事情就是先把后面的四本书拿下来,然后把前面的六本书往后移,最后把拿下来的四本书插到最前面去就完成了。也就是我们要把 1 2 3 4 5 6 7 8 9 10 变成 7 8 9 10 1 2 3 4 5 6。类似于书架有十本书,我们要把最后面的四本书放到最前面来的这个流程。写一个函数实现该功能。使前面各数顺序向后移。原创 2023-10-04 20:36:51 · 430 阅读 · 1 评论 -
动态内存4
那free是怎么做到的呢,这就是动态内存跟我们普通的数组有的一个区别。因为i=0,指针一开始指向数组的开头,前面将p当做数组来用没有问题是因为数组p是不动的,而现在的指针p是移动的,每一次赋值后都加加,当p一直走数组操作完了后,这个指针就指到了这个数组的尾巴上面去了,现在你再去free的时候,这个p的指针就不再是原来的指针了。举例你有一个p申请了动态内存,然后你把这个p的值复制给了q,你用p里面的数据或者用q里面的数据你以为它们是分开单独的,其实它们指向的是同一个内存,用完后你分别释放p和q就重复释放了。原创 2023-10-04 15:42:38 · 37 阅读 · 1 评论 -
动态内存3
但这个地址变不变是相对的不是绝对的,在这个地方不变不代表在另一个地方不变,但变不变跟我们关系也不大,我们要做的就是接受这个新地址并且用新的地址。也有地址仍然一样的,这里有可能是因为这个内存没有使用,就是系统有可能采取一种叫延迟内存分配的,就是你申请了内存但没有用,那么系统就还会把这个没用过的内存给你。就是这个过程比较麻烦。最后在回顾一下动态内存,当你需要申请内存的时候,就叫malloc来说需要分配多少内存,之后malloc就会把它的首地址返回给你,你来接收它的首地址,然后就可以把它当做一个数组来使用了。原创 2023-09-28 15:02:32 · 23 阅读 · 0 评论 -
动态内存2
如果上面的变量是用动态内存申请的,那么在函数外面需要它的时候还是可以使用的,因为动态内存的申请在没有释放的时候都是可以使用的,而动态内存只要你自己不释放,它是不会自己释放的。,上面2G的申请失败不能说明堆里面就没有2G的内存了,也有可能堆里面还有3G的内存,但其中最大的连续的整块的内存不到2G了,其他内存都是散布的,所以申请失败。而栈的缺点在于它的内存很小,只有1M。上面可以看到,超过1G的内存可以从堆里面申请出去,但2G的内存通常会申请失败,因为动态内存申请完后我们可以把它当数组来用,说明。原创 2023-09-26 15:20:15 · 27 阅读 · 0 评论 -
动态内存-C语言
首先我们的软件运行在工作环境中时是不允许关机的,如果有内存泄漏每天100M(兆),那它在运行的前一小段时间内是没有问题出现的,但一个月后这个程序软件可能点都点不动,点一下反应半个小时才能好,就因为内存泄漏每天100M(兆),那么30天就会泄漏掉3G内存,而这个泄漏掉的内存既没有人用它,系统也不能把它再分配出去给别的,因为在操作系统眼里这个泄漏掉的内存还是有人在用的,只是还没有用完后还给我,而实际上这部分内存是没人用的。当我们需要根据变量定义数组,变量作为数组的长度(在[]内的)时,就用到了动态内存。原创 2023-09-24 22:03:59 · 31 阅读 · 1 评论 -
整型数组有一个数字出现的次数超过总数的一半,请找出该数字,例如长度为 9 的数组{1,2,3,2,4,2,5,2,2}。 由于 2 出现的次数是 5 次,超过一半,所以结果为2。
穷举法,暴力枚举,最多需要统计出每个数字出现的次数。例如从第一个数字1开始,遍历一遍数组找一共有几个1,如果1的出现次数没有超过总数的一半,则丢弃1.然后开始重新遍历数组找2的出现次数,如果超过一半,则结果为2.如果没有,则继续重复遍历。这个方法的时间复杂度为O(n^2).空间复杂度为O(1),只有cln三个变量。给数组排序,数组里最中间的数字(arr[len/2])就是我们要找的出现次数超过一半的数字。.其时间复杂度为O(n),空间复杂度为O(1)。如果两个相邻的数字不一样则相互抵消。原创 2023-09-19 15:36:37 · 29 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面。输入一个整数数组,实现一个函数来调整该数组中的数字顺序,使得所有的奇数位于所有的偶数前面。
定义下标i从前往后遍历数组寻找偶数,定义下标j从后往前遍历数组寻找奇数,每找到一组奇数和偶数就将两个数互换位置,然后接着遍历,直到两个下标相遇错过后结束。这个是在原数组里进行操作,所以空间复杂度为O(1)。与原数组等长的新数组。下面的空间复杂度为O(1)但存在bug。这个算法的时间复杂度为O(n),因为三个。空间复杂度也为O(n),因为创建了一个。2.将原数组遍历一遍把奇数复制下来(for循环1)3.将原数组遍历一遍把偶数复制下来(for循环2)4.将新数组的数据复制回到原数组(for循环3)原创 2023-09-19 13:11:29 · 164 阅读 · 0 评论 -
C语言—函数(1)
程序是为了实现功能,而C语言的执行是从main函数开始的,如果我们将实现所有功能的全部代码(可能有成千上万行)都写在一个main函数里面,就会很不方便。先举个例子,当我们要计算x的n次方时,我们会直接调用pow(x,n);在设计较大程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能。而当我们要求三个数里面的最大值时,则可以先比较前两个数中的最大值,再用一个变量来。这时使用函数就可使程序的功能清晰,精炼,简单,灵活。的,例如在C语言中,我们要输入a的值时,可以写。原创 2023-09-14 15:23:54 · 38 阅读 · 1 评论 -
指针,数组练习题
原创 2023-07-09 20:25:19 · 55 阅读 · 1 评论 -
用C语言构造一个数字的回文数字(有两种方法),例如给定1234,输出1234321
例题: 给定1234,输出。原创 2023-06-07 17:25:36 · 617 阅读 · 1 评论 -
用 选择排序法 对10个整数进行排序
【代码】用 选择排序法 对10个整数进行排序。原创 2023-06-07 14:16:17 · 5999 阅读 · 4 评论 -
用C语言实现 折半(二分)查找法
【代码】用C语言实现 折半(二分)查找法。原创 2023-06-07 12:13:57 · 833 阅读 · 1 评论 -
两种方法 求一维数组的前缀和。例如nums = {1,2,3,4},则输出1,3,6,10,因为前缀和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。
例如nums = {1,2,3,4},给你一个数组 nums。原创 2023-06-06 20:30:45 · 76 阅读 · 0 评论 -
用C语言 1.定义10个长度的整型数组,从键盘获取10个数据保存到数组中,输出数组的所有数据 2.求出上面数组中的最大值,最小值和平均值并输出.
【代码】用C语言 1.定义10个长度的整型数组,从键盘获取10个数据保存到数组中,输出数组的所有数据 2.求出上面数组中的最大值,最小值和平均值并输出.原创 2023-06-06 19:52:38 · 4107 阅读 · 0 评论 -
假设在n进制下,下面的等式成立,567*456=150216,n的值是()——三种解题方法
因为任意数对其因子取余,结果都为0。等式两边 按成十进制权重的形式运算。等式两边 都按成n进制权重相加。进制下,下面的等式成立,原创 2023-06-03 01:22:57 · 79 阅读 · 0 评论 -
“八皇后”问题的最简单解法——穷举法
不能相邻(即不能成45度或135度)不同行:分别为h1至h8。原创 2023-06-01 21:41:34 · 136 阅读 · 0 评论 -
穷举法的三个典型应用例题
寻找所有组成18元8分(即1808分)的可能组合。假定对于所有面值的硬币你都有足够的硬币(此题的组合情况较多)。3.在一个陌生的国度,有5种不同的硬币单位:15、23、29、41和67(分)。巳抽签决定比赛名单,有人向队员打听比赛的名单,A。1.两个乒乓球队进行比赛,各出。1元,5元,10元的。一共有多少种组合情况。原创 2023-06-01 19:45:41 · 1138 阅读 · 0 评论 -
用C语言统计一个整数的数字位数,并将这个数的每一位数字进行顺序输出和逆序输出的方法
统计数据的数字位数采用的是: 丢弃个位法。从右往左) 逆序输出这个数据的每一位。2.给定一个整数可能为正数。顺序输出这个数字的每一位。给定一个整数可能为正数。给定一个整数可能为正数。原创 2023-05-31 15:49:45 · 3207 阅读 · 0 评论