C语言
记录C语言学习过程
CLO_se_
大学生重新从零开始学习编程语言
展开
-
贪吃蛇完整代码
【代码】贪吃蛇完整代码。原创 2024-08-11 22:50:14 · 700 阅读 · 0 评论 -
贪吃蛇之自己撞死自己
并且直接把边界也设置到这里之后 我们就可以缩减我们一点代码量,直接引用死亡这个函数。让尾节点等于身子中某一个节点,那么蛇就会死亡,原创 2024-08-11 22:40:15 · 187 阅读 · 0 评论 -
贪吃蛇之食物
然后在移动的过程中吃到食物后 生成新的食物后,不执行删除函数 deleNode( ) ,身子只增加不删除,就是视觉上的加长。首先定义一个食物,rand()是随机数的意思,但是为了在地图范围内,我们取20的余数。如果没吃到 就正常的增加和减少,头节点删除,尾节点增加。然后如果食物的行和列等于上方随机数所定义的行和列。就能把食物准确的放在地图里面。就可以打印出“##”原创 2024-08-11 22:35:09 · 232 阅读 · 0 评论 -
贪吃蛇随意移动
在 addNode 函数 身子增加里面将操作后 尾节点的下一个值赋值完成。先定义一个全局变量 dir。原创 2024-08-11 19:47:38 · 97 阅读 · 0 评论 -
Linux线程
(线程的描述符, 一般都写NULL, 运行的线程函数, 传入的值)在Linux中运行的话,还需加后缀 - lpthread。还要记得加头文件哦 include<pthread.h>pthread_create 是创建线程的意思。程序里面如何同时运行两个while函数呢。这个就需要使用线程的原理。原创 2024-08-11 19:42:27 · 127 阅读 · 0 评论 -
贪吃蛇之撞墙去世
initSnake是定义蛇原先的出生地和身子长度的。我们将它的身子都free 然后重新刷新蛇。原创 2024-08-10 19:48:34 · 192 阅读 · 0 评论 -
贪吃蛇之身子向右移动
定义一个con指令,当con等于向右指令时,移动身子,并且要更新一次地图。身子的移动可以解析为生成一个新的身子和删除一个旧的身子,闲置的空间我们要及时去free 否则会影响下次身子的。地图里面还要使用 move函数 移动游标位置。将头赋值给下一个就很好的去删除了(覆盖)原创 2024-08-10 19:28:20 · 183 阅读 · 0 评论 -
贪吃蛇之身子绘制
要加多少身子就调用多少个addNode( );记得 lie + 1。首选我们要定义一个结构体链表,这里的核心代码就是下面右图。原创 2024-08-10 19:22:44 · 122 阅读 · 0 评论 -
贪吃蛇之地图的绘制
首先我们要知道地图位置大体是怎么样的 绘出一个大概的地图。设置了20×20的方格。原创 2024-08-08 22:09:30 · 162 阅读 · 0 评论 -
Linux中如何复制贴贴删除
多行复制:将光标移动到将要复制的首行处,按“nyy”复制n行;其中n为1、2、3…一直都是直接删除的,但是打多行代码的时候实在是太烦了,所以查了资料写下来,全选高亮显示:按esc键后,先按gg,然后ggvG或者ggVG。全部删除:按esc键后,先按gg(到达顶部),然后dG。全部复制:按esc键后,先按gg,然后ggyG。单行复制:按esc键后, 然后yy。单行删除:按esc键后, 然后dd。粘贴:按esc键后, 然后p。光标移到起始行,输入ma。光标移到结束行,输入mb。光标移到粘贴行,输入mc。原创 2024-08-08 19:51:15 · 291 阅读 · 0 评论 -
C语言项目——贪吃蛇,为什么用curses,定义上下左右
使用curse,他可以及时响应,不用像 scanf 和 getchar 这两个需要回车键响应。在Linux系统中,使用ncurses在程序编译时还要加上 -lcurses。函数keypad设置了可以在stdscr中接受键盘的功能键(除字母外的按键)恒定义 : vi / usr / include / curses.h。即:gcc cursedemo.c -lcurses。这对于我们贪吃蛇上下左右键的响应十分有作用。原创 2024-08-07 17:36:10 · 336 阅读 · 0 评论 -
链表的源码
差不多200行,也是第一次打这么多行的代码,希望能帮助大家,这些也很好的帮助到了我。因为上一篇的源码断断续续的,怕大家不好看得到,所以我把源码给大家全部放出来。原创 2024-08-06 20:27:18 · 88 阅读 · 0 评论 -
链表是个好东西
而链表存放数据的地址是随机的,他有一个指针指向下一个地址,增加,删除数据仅仅将指针指向给修改了即可。数组存放数据的地址是连续的,且增加,删除数据需要把后面的数据给挪位置。第二:new->next = p->next。第三: p.next=new。第一:找到你想要插入的数据。注意:插入的顺序不能乱,否则地址会丢失。原创 2024-08-06 20:25:13 · 139 阅读 · 0 评论 -
结构体指针应用
这和之前说的指针,其实是一样的,只是指针类型是结构体。通过结构体变量地址来访问该结构体,需要一个变量来保持这个地址。指针变量就是存放地址的变量。需要一个变量来保持这个地址。原创 2024-08-04 19:34:23 · 79 阅读 · 0 评论 -
Linux初次体验
编译文件gcc 文件名 . c - o 程序名—eg. gcc test.c -o first_test。建立一个新的文件夹 mkdir (文件夹名)—eg. mkdir newfolder。默认模式是命令行模式 无法写代码的 输入 i 后进入输入模式,开始写代码。Linux系统也是的命令字符也是多的离谱,本来不想写的就顺便写写吧。进入文件夹 cd (文件夹名)— eg.cd newfolder。这里我就创建了一个文件,test,使用 vi 文件名.c。退回上层文件夹 cd . .原创 2024-08-03 23:45:18 · 215 阅读 · 0 评论 -
联合体共用体
联合体的元素地址相同,但是他的值被最后的ddata覆盖了,导致前面两个值无法输出。eg.用同一个表格 来表示老师和学生的数据情况。结构体的元素地址不同,而且他的值也不相同。原创 2024-08-03 15:21:40 · 187 阅读 · 0 评论 -
结构体指针数组函数综合应用改写选票系统之再改写
之前写的感觉,在初始化选民信息中使用指针函数比较复杂,特别是 return p - *pn。是因为 p++ 之后,p的地址改变,需要返回初始地址。那么我就使用p[ i ]来代替,就不需要放返回值了。原创 2024-08-02 23:39:22 · 116 阅读 · 0 评论 -
结构体指针数组函数综合应用改写选票系统
第三次,我发现尽管数组是++的,但是发现是因为数组本身就有数值,不需要去改变,改变的都是数组的地址,也就是说,指针当作数组名++了。收获很多,虽然学习进度被打乱了,但是我对于指针的理解更深入了,代码还是要打出来才学的会,根据理论知识,是无法真正融会贯通的。第二个结论是翻看我之前的指针,发现我每次使用指针++的时候 都是使用数组的时候,当时就在想是不是只有数组才能使用指针++。所以,使用指针改变数值,似乎是不可能实现的,它只能调用数值,但是不能改变。所以我决定自己改代码,实现这个功能,可惜我失败了。原创 2024-08-02 00:42:28 · 313 阅读 · 0 评论 -
结构体和数组的结合
结构体类型数组的每个数组元素都存储一组数据(所以各成员的数据),而普通数组的每个数组元素只存储一个数据。值得注意的是,往结构体里面赋值,可以像31行一样直接赋值,但一般都是要后面一个一个赋值进去的。定义一个学生结构体数组 struct Student。eg.做一个选票系统,要求统计票数,废票。原创 2024-07-31 00:45:47 · 203 阅读 · 0 评论 -
结构体的引入
结构体也是一种数据组合,它和数组的区别是,数组的元素类型是一样的数据集合体,如果元素类型不一样,就要用到结构体了。struct Student 的作用相当于 int,所以后面要定义变量名。它是一个模板,一般不给赋具体的值,每一项在实际应用中并不是都要使用。,每个成员都是结构体中的一个域。每个数据类型在结构体都称为。机构体类型变量名.成员名。,其中"."为成员变量名。下面定义一个学生结构体。原创 2024-07-30 20:22:47 · 170 阅读 · 0 评论 -
字符串的补充——assert( ),strcat( ),strcmp( )
大白话讲 就是将后面的src字符加到前面的dest字符的后面,最后输出拼接后dest的字符串。前面的字符串小于后面的字符串,输出为-1。前面的字符串等于后面字符串,输出为0.strcmp 比较两个字符串的大小,一个字符一个字符比较,按ASCLL码比较。第一个字符串小于第二个字符串,则返回小于0的数字 (-1)第一个字符串大于第二个字符串,则返回大于0的数字 (1)使用时,判断语句为真时,程序继续运行,若为假,则系统报错。大白话讲 就是前面的字符串大于后面的字符串,输出为1,原创 2024-07-29 20:31:12 · 434 阅读 · 0 评论 -
动态开辟字符串—malloc
该函数包含在头文件中.函数原型 void * malloc (size_t size) ——分配所需的内存空间,并返回一个指向它的指针size_t size, 该是,它表示,它的作用是在使用malloc时,一般传递的或者直接给malloc;这样malloc()函数就会给你使用.原创 2024-07-28 18:37:10 · 367 阅读 · 0 评论 -
字符串的引入和注意事项
和整型数组一个道理————char str[ ]={'h','a','l','l','o'};还可以直接表达成这样————char str[ ]="hallo";或者用另一种方式————char *p="hallo";=============首先,他和整型一样————int data[ ]={1,2,3,4,5};所以,cdata的大小是5,而cdata2的大小是6。首先,他们的字符数量是一样的,但是他们的长度不一样。字符串的结束标志是 ‘ \0 ’字符串常量,不可以被修改。字符串变量,可以被修改。原创 2024-07-27 17:03:28 · 194 阅读 · 0 评论 -
sizeof和strlen区别
如图,sizeof来计算的时候,得出的是计算机用多少个字节来表示一个地址。而strlen来计算的时候,只是计算出他的有效字符长度。打印出的不同地址就是其不同的区别。原创 2024-07-27 17:02:07 · 201 阅读 · 0 评论 -
指针之多级指针
二级(多级)指针不直接指向数据对象,而是指向一级指针变量,即二级指针变量存放的是一个一级指针变量的地址。类似地,可以定义三级指针变量,三级指针变量所存放的是一个二级指针变量的地址。这里还有一个疑问,第4行的,为什么我的数组指针还要用int来定义,之前使用数组指针都不是这样使用的,大家有知道的可以回复一下我!值得注意的是,第13行的&ppos是因为二级指针要使用一级指针的地址,所以使用一级指针的取地址。int ** p=======类型标识符 ** 指针变量名。二级指针不可以直接指向二维数组!原创 2024-07-26 23:51:02 · 147 阅读 · 0 评论 -
指针之指针函数
一个函数可以返回一个整型数,字符值,实型值等,也可以返回指针型的数据,即地址,其概念与以前类似,只是返回的值的类型是指针类型而已。定义一个指针,让这个指针指向指针函数,指针函数放回一个指针,这就是指针函数的用途。值得注意的是,这里定义不需要加括号,与前面函数指针容易混淆。=======函数类型 * 函数名(形参表列 )原创 2024-07-26 17:05:22 · 108 阅读 · 0 评论 -
指针之指针数组
]的优先级比*高,因此p先与[ 4 ]结合,形成p[ 4 ]形式,表示p数组有4个元素,再与p前面的" * "结合,表示此数组是指针类型的。一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。注意跟之前的数组指针定义格式相近,但是指针数组注重的是数组,数组指针注重的是指针。下面定义一个指针数组。原创 2024-07-16 19:56:13 · 118 阅读 · 0 评论 -
指针之关于函数指针
最重要的是dataHand(int data1,int data2,int (*pfunc)(int data1,int data2));使用函数指针,函数调用概念和变量一样,直接访问(变量名,函数名),间接访问(指针,函数指针)函数指针,定义“函数地址”,函数名就是地址。在使用有返回值的函数指针时,记得将值放入。函数的指针有点绕,需要勤加训练。如何定义一个函数指针变量,原创 2024-07-16 18:52:09 · 217 阅读 · 0 评论 -
指针之关于数组指针
数组指针,定义一个指针,指向一个数组,让指针偏移的时候,也偏移相应大小的数组。eg.输出二维数组任意行列的数。原创 2024-07-15 20:12:09 · 181 阅读 · 0 评论 -
指针和二维数组
在二维数组里面,a+1和*(a+1)他们都是代表着同一个地址,这是因为二维数组里面,a代表的是0行的首地址, a+1就是第2行的首地址,那么*(a+1), 根据上面的等价关系, 我们可以知道*(a+1)==a[ 1 ],在二维数组里面也是表达第2行的首地址,所以是一样的。所以,二维数组a中的元素a[ i ]a[ j ]的地址(或指针)既可以用a[ i ]+j来表示,也可以用*(a+i)+j表示 =========================a代表的是a[ 0 ];原创 2024-07-15 17:12:20 · 170 阅读 · 0 评论 -
指针练习之函数的翻转
这里for循环使用i只需要 i = len / 2;根据翻转可知 i + j = len - 1;即 j = len- 1 + j;原创 2024-07-13 19:13:49 · 120 阅读 · 0 评论 -
指针——认识指针,如何使用
int *p ——这里的*是一个标识符,告诉系统这是一个指针变量,是用来保存别人地址的,只产生在指针变量定义或声明的时候。os中用8个字节表示一个地址,4个字节表示一个整型类型。& 是取地址的运算符;* 将地址内的值读出的运算符。在函数的封装中,使用指针也能更好的将数值传递。什么是指针变量,存放指针(地址)的变量。第一个指针可以当作数组名,下标法访问。接着,指针变量==存放地址的变量。什么是整型变量,存放整型数的变量。什么是字符变量,存放字符型变量。第二个可以使用数组名来加。首先,指针==地址,原创 2024-07-12 19:41:26 · 120 阅读 · 0 评论 -
全局变量(外部变量)和局部变量
首先分享一个错误,很有认识的意义,我这里在全局变量中定义了max和min,但是我又在averscore函数中定义了这两个变量,导致我输入的值传不进去,输出失败,这是因为averscore函数里面的变量是局部变量,接着来写一个案例,班上10个学生,封装一个函数,调用该函数后获得班上的平均分,最高分,最低分;它可以使程序员编程便捷,但是有隐藏风险;所以的函数都可以操作这个变量。全局变量是写在所有函数之前的外部变量,,但是输出的是全局变量,所以输出失败。局部变量是修改不了全局变量的。这里修改后,输出就正常了。原创 2024-07-08 00:26:34 · 190 阅读 · 0 评论 -
函数的封装之多维数组
也就是说arr[ ][ ]二维数组的写法,可以写成 arr[1][2]或者arr[ ][2];但是不能写成arr[2][ ];那么用二维数组找出最大值的函数封装法,就可以是以下方式。首先,多维数组必须对除第一个维度外的所有维度有边界。getmaxarr 得出数组内最大的数值。printfarr 打印出数组内的数值。initarr 初始化数组内的数值。我使用了三个函数封装,分别是。原创 2024-07-07 23:35:57 · 105 阅读 · 0 评论 -
封装函数数组实战之计算不同班级学生的平均分
有两个班级的同学,都是五人,分别求这两个班平均分。printfarr,打印数组的数字。这个代码使用了三个自定义封装函数。initarr,初始化数组的数字。averarr,获取数组的平均值。注意数组的调用,是写数组名。即可或者数组的首地址。原创 2024-07-07 22:13:18 · 102 阅读 · 0 评论 -
关于数组和数值实参和形参的
首先我们先看一段代码,猜猜上面data的打印和下面data的打印的数值分别是多少。答案是一样的,这是因为操作的是相同的内存空间,数组名当作实参,传递的是地址。如果要使值正常传入,则重新定义函数的类型并且将data的值等于函数调用。答案是110和10,这是因为这是数值传递,操作的是不同的内存地址,再来看一段代码,这里上下打印的是否是一样的数值呢。原创 2024-07-03 19:47:10 · 131 阅读 · 0 评论 -
数组传参中关于形式参数
最后这里数组名传递过去的是整个数组的首地址,或者用地址符&写入第一个元素的地址。所以在printfarr中他的大小永远是8,因为他传递过去的地址大小就是8。首先,形式参数中不存在数组的概念,及时中括号约定了数组的大小,也无效。在os中一个数组用8个字节来表示一个地址,一个整型数是4个字节。但是main中arr的大小根据数组的数字决定。传递的是一个地址,是数组的首地址。发现打错17行,正确应该是。原创 2024-07-03 18:53:06 · 231 阅读 · 0 评论 -
递归函数写阶乘!n
用exit(-1)强制退出程序,但是头文件#include<stdio.h>中没有,所以还需要一个头文件#include<stdlib.h>;,所以我们要在17次方的时候及时停止程序的运行,就不会出现报错,我们知道int整型类型是4个字节,也就是在计算机中是。跟之前的递归函数没什么变化,但是有值得注意的点;所以使用int类型的整型,不能超过。原创 2024-07-02 22:58:38 · 102 阅读 · 0 评论 -
递归函数的应用
有五个学生在一起,问他们说多少岁,第五个学生说比第四个学生大2岁,第四个学生说比第三个学生大2岁,第三个学生说比第二个学生大2岁,第二个学生比第一个学生大2岁,第一个学生说他10岁。值得注意的是,递归函数很容易无限循环或者出现程序错乱,所以一定要设置好递归函数的输出量,在这里就是age=10,如果不使用这个if函数,就会出现程序错乱。递归函数的含义就是在函数中再使用自己所定义的函数。原创 2024-07-02 22:38:22 · 155 阅读 · 0 评论 -
函数的嵌套
这里一共是使用了三个函数,其中两个函数是自定义的函数(getmaxfour),(getmaxtwo)值得注意的是形参和实参必须一一对应,不能少也不能多,否则就会报错。首先,一步步进入调用,一步步退出放回。利用函数一步步的把需要的结果实现。输入四个数,函数方式找出最大值。原创 2024-07-02 19:19:06 · 146 阅读 · 0 评论