C语言和操作系统学习笔记

上传人:无*** 文档编号:97271527 上传时间:2022-05-27 格式:DOC 页数:32 大小:217KB
收藏 版权申诉 举报 下载
C语言和操作系统学习笔记_第1页
第1页 / 共32页
C语言和操作系统学习笔记_第2页
第2页 / 共32页
C语言和操作系统学习笔记_第3页
第3页 / 共32页
资源描述:

《C语言和操作系统学习笔记》由会员分享,可在线阅读,更多相关《C语言和操作系统学习笔记(32页珍藏版)》请在装配图网上搜索。

1、深入理解计算机系统存储器层次CPU 主频 : 3.2 GHz高速缓存 (110ns, 一个周期 )主存 (10100ns)辅助(磁盘) (1byte/10ms, 一次可以传送大量字节 , 几十到几百个周期 ) 三级存储 (分钟为单位 )虚拟存储虚拟页 (VP), 物理页 (PA), 页表 (Page Table), 页表条目 (PTE, Page Table Entry), DRAM( 虚拟存 储器缓存 ), SRAM(CPU 和主存的缓存 ), MMU( 存储器管理单元 ),路旁转换缓冲 (TLB, Translation Lookaside Buffer)东芝 satalite L700

2、笔记本进入 BIOS(ctrl + alt + del 之后 F12)Ubuntu 15.10 可能不适配 NVDIA 显卡 (如: NVDIA GeFore GTX 745)Day01C 语言程序的绝大部分必须记录在以 .c 作为扩展名的文件里,这种文件叫源文件 C 语言程序里可以直接使用加减乘除四则运算符号( +、 - 、 * 、 /) 每个独立的计算步骤最后必须使用分毫结束,用分号结束的一个计算步骤叫一条语 句 任何 C 语言程序一个由大量的语句构成C 语言程序中,采用分组的方式管理所有的语句 一组里的所有语句必须写在一对大括号里 可以吧一组里面的语句再次进行分组绝大多数语句必须属于某个

3、分组 任何语句不可以跨越分组 不被其他大括号包含的大括号可以叫做顶级大括号 顶级大括号可以用来表示 函数 (可以吧函数看成一组语句 )每个函数必须有自己的名字,不用的函数的名字必须不同 任何 C 语言程序一对由一个活多个函数构成 C 语言程序中必须有一个叫做 main 的函数,这个函数叫做主函数 C 语言程序必须从主函数的第一条语句开始执行 当主函数的最后一条语句结束的时候整个程序结束C 语言程序允许一个函数的结束的时候遗留一个数字,这个数字叫做这个函数是返 回值主函数需要有一个返回值,这个返回值表示主函数的工作结果。如果这个返回值是 0,则表示一切正常,否则就表示出现非正常情况。C 语言程序

4、里预留了几十个英文单词,这些英文单词叫做关键字。每一个关键字有 特定的用途,不能随便使用。Return 就是一个关键字,它有两个用途。主要用途是结束函数的执行(任何时候一 定会起到这个作用) ,辅助作用是用来指定返回值数值 (当关键字后面有数字时起这 个作用)根据数字在某个方面的区别把数字分成几组,每组叫做一个数据类型 每个数据类型有自己的名字整数类型是一种数据类型,它的名字是int,它里面包含几乎所有不带小数点的数字 程序中所有数字必须有类型C 语言程序中所有不带小数点的数字默认是整数类型每个函数必须明确表示它返回值的类型(把返回值类型名称写在函数名称前面)C 语言程序基本开发步骤:1、使用

5、vi编写以.c作为扩展名的源文件2、 使用gcc工具对源文件进行翻译得到名为a.out的文件(编译)3、用命令./a.out执行得到的文件能够完成编译工作的软件叫编译器 不同编程语言有自己的编译器Gcc 是 c 语言的一种编译器MinGW 软件是 windows 里的 gcc所有 C 语言程序中都会包含 预处理指令 预处理指令全都是以 # 作开头,而且不是以 ;作结尾 标准 C 阶段遇到的预处理指令都可以把源文件内容改变成其他内容 #include 是一个预处理指令,它可以把其他文件内容合并到当前源文件中 使用这个预处理指令的适合需要指定文件路径,这个路径对应的文件会被包含到当 前源文件中 这

6、个路径通常采用相对路径:如果把路径写在 中间表示相对路径的起点 是系统预先设定好的一下目录 如果把路径写在 “”中间表示相对路径的起点 还包括当前源文件所在的目录gcc 工作步骤:1 、先处理所有预处理指令2、把修改后源文件内容翻译成计算机认识的格式(也叫编译)3、把编译得到的不同部分合并在一起(链接)gcc 的选项:-E 只完成预处理指令的处理工作-c 只完成预处理和编译工作-o 用来指定新文件名称-std=c89/-std=c99 用来指定编译过程中遵循的版本(缺省情况下采用 c89 版本) 程序中的文字信息必须加入到注释的区域里,编译器会忽略所有注释以 / 做开头一直到行尾的区域叫单行注

7、释以 /* 做开头,以 */ 做结尾的区域叫多行注释C 语言程序中大量使用名称区分不同内容,这些名称叫做标识符 标识符最好采用有意义的英文单词编写标识符命名规则:1、第一个字母只能是英文字母或者下划线2、后面的字母可以是英文字母、下划线或者阿拉伯数字字符3、标识符中大小写不同的字符被看作是不同的字符(大小写敏感)4、关键字不可以当做标识符使用5、标识符长度没有限制,但计算机只会截取前一段使用(C89规范中截取前31个字符,C99规范里截取前63个字符)C 语言书写规范:1、一行中最多包含一条语句2、不同层次的语句要使用 缩进 区分开3、在合适的地方使用空格和空行提高程序的可读性4、标识符采用驼

8、峰方式(区分大小写 XiAn )或者下划线(xi-an)方式编写C 语言中提供了一组标准函数,每个函数负责解决一个常见问题 每个标准函数都有自己是名字 在程序中编写函数调用语句就可以使用某个函数了printf 是一个标准函数的名字,这个标准函数可以把程序中的数字打印在终端窗口 里;为了使用这个标准函数需要包含 stdio.h 文件。在 printf 函数调用语句中使用占用符可以把双引号里面的某个位置保留下来,在打 印的适合先用某个数字填充这个位置然后再打印使用占位符可以打印编写程序时还不知道的数字 不同类型的数字应该和不同的占位符配合使用 和整数类型配合使用的占位符是 %d 可以在一条函数调用

9、语句中使用多个占位符,有多少个占位符就应该在双引号后面 提供多少个数字,数字之间使用逗号分开计算机内存分成很多字节,任意两个的大小一样 每个字节可以用来存放一个数字。可以临时把几个相邻的字节合并用来记录一个数字我们可以把内存中用来记录一个数字的区域叫做一个存储区(一个存储区一定是由 一个或多个相邻字节构成的)每个字节有一个编号,这个编号叫做这个字节的地址 所有字节的地址从 0 开始逐渐递增只有通过地址才能找到字节 一个存储区也有地址,它的地址是它所包含的字节中最前边的字节的地址C 语言中可以使用变量代表一个存储区,这一可以 简化对存储区的使用 一个存储区只能用来存储一种类型的数字,因此存储区是

10、分类型的(变量也是) 计算机可以根据变量计算出对应存储区的地址(变量可以代表存储区的原因) 变量和存储区的对应关系完全由计算机决定 为了在程序中使用一个变量必须首先声明它,变量声明语句用来声明变量 变量声明语句会让计算机为变量分配一个存储区 变量声明语句中不用包含变量的类型和名称 变量的使用方法:1、变量可以用来存储一个数字2、从变量中获得数字并进行计算变量赋值语句可以向变量中存放一个数字 赋值语句需要采用赋值操作符( =)编写 赋值操作符要求左边必须是一个能代表存储区的内容(左值) 赋值操作符要求右边必须是一个能代表数字的内容 赋值语句执行完成后可以把右边的数字记录在左边的存储区里 只要在程

11、序中把代表存储区的内容当作数字使用,计算机就会先从存储区里获得数 字,然后再使用 变量名称在程序中既可以带便存储区,也可以代表存储区的数字( num = num) 变量名称在程序中代表什么是由环境决定的预习:1 变量 2、scanf 标准函数 3 数据类型作业:1、假设有 1 克到 127 克之间的 127 个不同的整数重量, 要求设计一套砝码表示其中 任何一个整数重量。 (同样重量的砝码不能重复,砝码数量越少越好)1 2 4 8 16 Day01 day02 总结:whoamiclear查看当前使用的账号清除终端窗口里的文字信息pwd查看当前目录cdcdls lsl ls -a ls -la

12、touch创建新文件mkdir创建新目录mkdir -pqwe/asd 两个目录一起创建出来rm rm-rfTab 键补齐tar zcvf 压缩文件名 .tar.gz 路径 1 路径 2 打包压缩 tar zxvf 压缩文件名 .tar.gz 解包解压nyy (n 为整数,如果是 1 可省略)拷贝 n 行(必须在正常模式下)np粘贴n次(必须在正常模式下)ndd剪切n行(必须在正常模式下)set nuset nonuvi /.vimrc 查看 set 命令(每次 vi 启动时,都会从 /.vimrc 文件中获得 大量 set 命令并按顺序执行它们)chmodchmodu+x(g+w / o-r

13、)664(二进制后转的十进制数 )user/group/other文件路径修改操作属性mv 路径 1 路径 2 cp 路径 1 路径 2移动 (覆盖)(也可以用来改名 ) 拷贝 (复制)ln -s 路径 1路径 2(可以不存在,新建 )链接(等同操作 )echo abc a.txt echo abc a.txt(重定义输出 )(追加)(abc 覆盖 a.txt)(abc 加在 a.txt 后 )ps(-aux 系统所有进程 )查看当前窗口进程kill(-9 强制结束 ) 234(id 号)结束进程ctrl + c结束进程 (相当于 kill -2 自动寻找死循环 )echoabca.txt重定

14、义输出echoabca.txt追加通配符:(a?) 代表 a_(a*) 代表以 a 开头的gcc -E只完成预处理指令的处理工作(编译)gcc -c只完成预处理和编译gcc -o用来指定新文件名称-std=c89/-std=c99用来指定编译过程中遵循的版本(缺省时采用c89 版本)Day03: 可以在一条语句中声明多个同类型变量,这个时候类型名称写一次就行了 可以在声明变量的语句中立刻对变量进行赋值,这叫做变量的初始化C 语言里所有变量都应该初始化变量可以用来在程序中代表一个未知的固定数字 变量可以用来代表一组相关数字(任何时候只使用其中某一个数字,使用过后就不 再使用了)在 printf(

15、) “” 中用 %,才会打印出 % ;Scanf()如果 scanf 函数调用语句的双引号里有不是占位符的内容,则用户必须在输入的时 候把它们按照顺序依次输入,否则计算机就无法得到数字如果多次从键盘得到数字时某一次用户输入的格式错误则后面的所有输入都可能会 错误清理缓存区(有时前面输入错误,后面会都出错,清理缓存后就好了)Seanf( %*An ”);Scanf(“%*c ”);seanf(“%*An ”);seanf(“%*e ”);字符类型是一种数据类型,名称是 ehar这个类型中一个包含 256 个不同的数据,每个数据可以代表一个字符( %#)ASCII 码表中记录所有 256 个数据两

16、种表示方式之间的对应关系a97A 65048所有字符数据分成两组,每组 128 个字符其中一组里所有字符数据两种表示方式之间的对应关系在所有计算机上都一样(这 组字符的整数表示方式范围从 0 到 127)另外一组中所有字符数据两种表示方式之间的对应关系在计算机上有可能不同(这 组字符的整数表示方式范围从 -128 到-1,也有可能从 128 到 255)无符号字符类型也是一种数据类型 无符号字符类型用 unsigned char 表示 这个数据类型里同样包含那 256 个不同的字符,所有的字符数据的整数表示方式范 围固定从 0到 255)a的整数表示方ASCII 码表中所有小型英文字符的整数表

17、示方式是连续排列的, 式最小 所有大写英文字母和阿拉伯数字字符也都符合这个规律 t-a=T-A3-0= 3 - 0 =d-aShort%hdUnsignedshort%huLong%ldUnsignedlong%luInt%dUnsignedint%uFloat%f 或者 %gDouble%lf 或者 %lg%lf和%f会保留小数后面无效的零%nd 和 %-nd%0nd 也可以做站位符, (n 同样代表一个整数)打印 n 个位子,无效位置用 0 %n,mf 作浮点占位符,共 n 个位置,小数点占 m 位 不同数据类型之间的区别是有它们是存储区所包含的字节个数不同造成的Sizeof关键字可以用来

18、计算一个变量或数据的存储区所占的字节个数各种数据类型所包含的字节个数:1 个字节2 个字节4 个字节4 个字节4个字节8个字节char(unsigned char) short(unsigned short) long(unsifned long) int(unsigned int) float doubleSizeof 关键字的小括号里可以写任何能当作数字使用的内容(赋值语句也可以当作 数字)Sizeof 关键字的小括号里如果修改了任何存储区的内容则这种修改不会真正生效 (如: sizeof(num = 10) 不会真正赋值)计算机采用二进制表示数字,二进制里每个数位上只有 0或 1者两种可

19、能 计算机里每个字节分成八段,每段可以用来记录一个 0或者 1 数字的二进制表示方式中每个数位有一行编号,最右边数位的编号是0,向左依次递增二进制中每个数位上的 1 单独代表一个数字,它的数值就是 2 的编号次方 一个二进制所代表的数值就是他里边所有数位上的 1 所代表的数值之和 二进制加一是计算规则是吧最右边的 0 变成 1,把它右边的所有 1 都变成 0 二进制转十进制方式:把所有 1 单独转换最后把转换结果求和0111 0011 = 1 + 2 + 16 +32 +64 =115预习:1 二进制(八进制 十六进制,负数的二进制)2 操作符作业:1 编写程序计算给定长和宽的长方形的面积2

20、编写程序计算给定半径的元的周长扩展:crontab ( 任务调度 )cron tab -查看任务调度cron tab -e修改任务调度可执行的 shell 脚本vi abc.shmkdir shellcd shelltouch a.txtIs - abc.sh(查看脚本问价操作属性)chmod 777 abc.sh(修改脚本操作属性,使其能被运行)./abc.sh执行脚本,从而运行里面步骤远程操作别id的电脑(有对方ip和密码)(ftp也可以)tel net + ip (远程连接)/sbin/ifconfig查看本地 ipIpconfig在 windows 下查看 ip退出:exit (正常进

21、入)Quit (不正常进入)服务器下:xlyxly下载:gat文件上传:put文件退出:byeDay042的整数次方值和,然后把所有拆分结十进制转二进制两种方法: 第一种,首先把十进制表示方法拆分成多个果单独转换成二进制,最后把所有转换结果合并就得到证个数字的二进制57 = 32 + 16 + 8 + 1 = 0010 0000 + 0001 0000 +0000 1000 + 0000 0001 =0011 1001第二种是不断除以2取余,把所有余数按照从后向前的顺序书写得到转换结果83* *1410* *12000* *010000* *050000 *120000 0*010000 00

22、*10 0000 0000113/2 = 56/2 = 28/2 = 14/2 = 7/2 = 3/2 = 1/2 = 01000 1110 0111 0001通过上述方法计算得到的二进制叫做源码 计算机里采用补码计算数字 非负数的源码和补码是一样的八进制也是一种表示数字的方式(可以看成是二进制的简写方式) 把二进制的补码从有向左每三个数位分成一组,把每一组用 0 到 7 之间的数字替换 得到结果就是八进制表示方法0101 01114分01 010 111 1273 分八进制可以直接在程序中使用八进制方式表示数字,但是必须在数字前写一个 0 采用 %o 做占位符可以把一个数字的八进制表示方式打

23、印在屏幕上十六进制也是一种表示数字的方法(也可以看成是二进制的简写方式)把二进制补码中所有数位从右向左每四个数位分成一组,每组用一字字符替代得到的结果就是十六进制表示方式如果某一组的转换结果在 0 到 9 之间则使用对应的阿拉伯数字字符替换, 如果在 10 到15之间则使用 a至uf替换。0010 1101 2d (十六进制)可以在程序中使用十六进制的方式表示数字,但是必须在前面写上 0x采用 %x 或者 %X 可以把一个数字的十六进制表示方式打印在屏幕上-50 -50000 0000 -0000 01011 0000 0000 -0000 0101=1111 1111 + 1-0000 01

24、01=1111 1111 -0000 0101 + 1=1111 1010 + 1=1111 1011负数二进制补码计算方法:1 计算出负数相反数的补码2 把第一步的结果中每个数位变成相反数值,然后在加一这种方法得到的结果直接是二进制补码 无符号类型的二进制补码一定是非负数有符号类型的二进制最左边的数位可以用来盘点正负,如果是 0则是非负数,如果 是 1 则是负数这个数位叫做符号位不能直接把符号位替换成正负号 所有有符号类型中有一个特殊的二进制补码,它最左边的数位是 1 右边全是 0,这 个补码用来表示这个数据类型中最小的负数当吧一个占地大的整数类型数据赋值给以个占地小的整数类型存储区的时候,

25、计算 机会保持二进制内容不变(会丢失一些数据)当把一个占地小的整数类型数据赋值给一个占地大的整数类型存储区时会扩充二进 制数位。原有的数字是有符号的,则扩充出来的二进制数位全是符号位。如果原有 数字是无符号的,则扩充出来的二进制数位都是 0C 语言程序中使用加减乘除C 语言中使用 % 表示区余操作、,在 C 语言中可以做为操作符使用,它的左右和写一个能当数字使用的内容 使用这个操作符编写的表达式可以当数字使用,这个数字就是逗号操作符后面的那 个数字逗号操作符的优先级非常低,甚至比赋值操作符优先级都低 赋值操作符( =)可以把一个数字放在一个存储区里 赋值操作符左边必须是一个能代表存储区的内容(

26、左值) 赋值操作符右边必须是可以当数字使用的内容 赋值操作符的优先级非常低,但是比逗号操作符高 使用赋值操作符编写的赋值语句可以当作数字使用,这个数字就是赋值完成后的右 边的存储区里的数字一条语句中可以包含多个赋操作符,它们的计算顺序是先右后左只需要一个数字就可以配合使用的操作符叫单目操作符 需要两个数字配合使用的操作符叫双目操作符 需要三个数字配合使用的操作符叫三目操作符 绝大多数双目操作符可以和赋值操作符合并形成赋值操作符( += -= %=) 符合赋值操作符要求左边是能代表存储区的内容,有边是能当数字使用的内容 复合赋值操作符也是爽目操作符 所有复合赋值操作符的优先级都和赋值操作符的优先

27、级一样低自增 +/自减 - 它们是单目操作符,它们必须和一个存储区配合使用 这两个操作符都可以采用前操作方式或后操作方式使用( i+ +i ) 不用在一条语句中队同一个变量多次进行自增自减计算,因为结果不确定布尔类型数据只包含两个数值,分别是真(true)和假(false) 在 C89 规范中真用整数 1 表示,假用整数 0 表示整数也可以作为布尔值使用, 0 作为布尔值使用时是假,其他整数作为布尔值使用 时是真逻辑操作符用来编写逻辑表达式,逻辑表达式的计算结果只能是布尔值 !是单目逻辑操作符,表示求反双目逻辑操作符:V=双目逻辑操作符的优先级比算术操作符的优先级低C 语言中所有逻辑表达式必须

28、由一个或多个简单逻辑表达式构成(最多包含以个双 目逻辑操作符的表达式叫简单逻辑表达式)& 与 | 或 ( !Gender & weight (height - 110)| ( Gender & weight (height - 105)与( & )和或( |)都具有短路特性(前面的逻辑表达式如果能决定整个表达式的 结果则不会去考虑后面的内容)作业:1、编写程序从键盘上得到一个 1到 127之间的整数,把它转换成二进制并把转换结 果打印在屏幕上(两种方法)Day05位操作符可以直接对字节中的二进制数位进行操作是以个单目位操作符,它可以把字节中所有二进制数位求反,叫求反操作符求反操作符不会修改原有

29、数字内容双目为操作符包括按位与(&),按位或(I)以及按位异或(A) 以上双目操作符首先把两个数字转化二进制补码,然后把对应数位上的数字进行操 作(不对应的数位之间不会互相影响) 按位与会把对应数位上的数字进行与计算 按位与可以用来把租借中某些二进制数位清 0;任何数位和 0 按位与后是 0任何数位和 1 按位与后还是他本身a 650100 0001A 970110 0001Char ch;按位或把对应数位上的数字进行或计算(或 0 得本身,或 1 得 1) 30000 0011|50000 0101=70000 0111按位或可以把字节中某些二进制数位设置成 1按位异或把对应上的数字进行异或

30、计算 (异或 0 不变,异或 1 结果改变 )0 A 0 = 03 A 5 = 0000 01100 a 1 = 1= 61 A 1= 0按位异或可以把某二进制数位求反移位操作符也是双目操作符;可以把所有二进制数位上的数字统一向左或向有移动 n 个位置左移操作使用 表示移位操作符左边的数字是要进行移位操作的数字,右边的数字是移动的位数 移位操作不会修改原有的数字 移位操作后一定会有些数字丢失,另外一些位置空出来 左移时右边空出的位置上一定补充 0; 右移时有符号类型数据左边空出来的位置上一定补充符号位,无符号类型数据左边 空出来的位置上一定补充 0在移动过程中如果没有丢失有效数据位,则左移 n

31、位相当于乘以2的n次方,右移 除以。取地址操作符( &)可以根据一个存储区计算出它的地址 这是一个单目操作符,它必须和一个存储区配合使用 使用%p做占位符把地址打印在屏幕上 地址方式都是以十六进制来写的可以在地址数据前使用 * 操作符获得地址对应的存储区三目表达式可以根据一个布尔值从两个计算规则中选择一个作为最终结果 三目表达式格式:布尔值 ? 表达式 1 : 表达式 2 如果布尔值是真则采用表达式 1 计算最终结果,如果是假则采用表达式 2计算最终 结果不要把赋值操作符写在三目操作符的问号后面如果一个表达式中多个数据的类型不同,则计算机会首先把它们转换成同一类型, 然后在进行计算这个转换过程

32、完全由计算机完成,这个过程叫隐式类型转换 隐式类型转换过程中会把 char ,short 都转换成 double 当不同类型占地大小不同时 会把有符号类型转换成武符号类型,整数类型转换成浮点类型在 C 语言程序中可以随时给一个数据指定新类型,者叫做强制类型转换 强制类型转换的实现方法是在数据前写一对小括号,小括号里写数据类型名称 强制类型转换不受规则约束,所以转换过程中有可能造成数据丢失 实现强制类型转换的时候计算机会分配一个新的存储区,这个存储区的类型是我们在小括号里指定的类型。计算机用原来的数据对这个存储区进行赋值,然后使用 这个存储区里的内容进行计算 如果对一个存储区的内容做强制类型转换

33、则转换过程不会修改原有存储区里的数字 流程控制语句可以让程序中的语句不再从上到下执行 分支是一种流程控制语句,它可以从几组语句中选择一组执行而忽略其他组使用 if 关键字可以编写分支,在 if 分支中可以使用一个逻辑表达式的结果控制一 组语句是否要执行(括号为真执行,位假不执行)如果有多个分支,在任何时候最多只会执行其中一个分支,则可以使用 else 关键字 把它们合并如果合并好的多个分支任何时候必然会执行其中一组,则可以把最后一组的逻辑表 达式省略合并好的分支中多个逻辑表达式之间有先后顺序,只有当前面的逻辑表达式为假才 会考虑后面的逻辑表达式可以利用者一点在合并多个分支的时候简化它们的逻辑表

34、达式已经合并好的分支不一定能当作多个无关分支理解作业: 1编写程序从用户提供的三个数中找出最大数并打印2 编写程序从键盘得到小时、分钟、秒,计算出下一秒的时间,并按照如下格式打 印Hh:mm:ssDay06Switchcase语句也可以用来实现分支 如果一个分支中包含有限个整数,每个整数对应一组专门的语句,这种一般使用Switch case 语句Switchcase语句中在大括号内部把所有整数都列举出来,每个整数对应的处理语 句就可以卸载这个整数下面。每段必须用 break;语句结束 在大括号里可以编写一组语句用来处理没有处理没有例句出来的数字,可以用default : 来包括所有这些没有列举

35、过的数字 循环也是一直流程控制语句,它可以让一组语句反复多次执行For 关键字可以用来编写循环在 for 关键字编写的循环中,可以采用一个变量代表一组相关数字,这个变量叫循 环变量在循环的大括号里可以使用break;语句随时终止循环的执行Break;语句不会执行后循环变量也不会再改变Continue;语句会直接跳转到循环大括号的末尾,中间的语句这次都不会执行(只 结束这次循环,而不会像break那样结束掉整个循环)Break;和continue;语句通常写在分支里假设有如下的 for 循环语句For( 1; 2; 3) 4它的执行顺序:【1、2】【4、3、2】【4、3、2】【4、3、2】第一组

36、和其他所有组都不同 循环嵌套可以解决复杂的循环问题首先把所有问题分组,为每组找一个代表数字使用一个循环描述所有组代表数字的变化过程在这个循环内部再写一个循环负责处理这一组内部的所有任务内循环的开始数字和结束数字可能是不固定的,需要根据外循环的循环变量计算得 到作业: 1 编写程序打印 99 惩罚表2假设一个面包店卖三种面包,重量分别是 20克, 25 克, 30克,编写程序吧所有 能凑成 200 克的情况打印Day07For循环的多种写法:1、当大括号里只有一条语句时,大括号可以省略2、小括号里可以使用逗号操作符3、在小括号里临时定义循环变量(C99规范中才可以使用)。当循环结束后临时定 义的

37、循环变量不再能使用4、 如果大括号里没有语句则可以直接在小括号后用;结束,这种写法叫空语句5、只保留小括号里之间的逻辑表达式6、可以省略小括号中间的逻辑表达式 (这个时候计算机认为这个逻辑表达式的结果 永远是真,这种循环无法正常结束,所有叫死循环)While 循环也是一种实现循环的方式如何编写循环的时候不知道循环要执行多少次就可以考虑采用 while 格式编写 While 循环和 for 循环可以互相替代,仅仅是两种不同的编写思路While 循环格式:While (逻辑表达式 1) 反复执行的语句 2 反复执行大括号里由直到逻辑表达式为假时结束执行顺序:【1】【2 1】【2 1】【2 1】如果

38、某一组最后编号为 1 的逻辑表达式结合为假则循环结束,否则启动下一组While 循环也可以编写空语句和死循环(把 1 作为逻辑表达式就可以实现死循环)While循环中也可以使用break;和continue;语句Do while 也是编写循环的方式,格式如下:Do2while ( 1 );它按照如下顺序分组执行:【2 1】【2 1】【2 1】【2 1】【2 1】 相当于把 while 循环中第一组排除掉 它的结束方式和 while 循环一样这种格式可以保证大括号里的语句至少执行一次编写程序是无法预知的数字叫随机数计算机生成的随机数叫伪随机数Rand 标准寒素可以用来获得随机数 把函数调用语句当

39、数字使用就得到随机数 为了使用这个函数需要包含 stdlib.h 函数Srand标准函数可以用来设置随机数种子 这个函数把一个整数作为种子使用 为了使用这个标准函数需要包含 stdlib.h 文件Srand函数调用语句只应该在主函数的开始执行一次Time 标准函数可以用来获得当前时间 把函数调用语句当数字使用结束得到的时间(1 970-00:00:00到现在的秒数)为了使用这个标准函数需要包含 time.h 文件Goto 也是流程控制语句,它可以指定任何一条语句作为下一条语句 不要使用 goto 语句数组可以代表内存中一组连续的同类型存储区数组需要先声明再使用声明数组时需要指定存储区类型,数组

40、名称以及存储区域个数 数组创建后内部所包含的存储区个数不可以改变数组不可以当作整体使用,一次只能使用其中某一个存储区 数组中每个存储区有一个专门的编号,这个编号叫下标 第一个存储区的下表是 0,向后依次递增最大下标是存储区个数减一超过范围的下标不可以使用数组名称不代表存储区,而只代表第一个存储区的地址(数组名称不可以被赋值) 数组名称加 N 可以计算出下标位 N 的存储区地址数组中下标为 N 的存储区还可以使用如下方式表示:*( 数组名称 + N)可以使用一个 for 循环依次处理数组中每个存储区,循环中循环变量依次代表所有 存储区的下标数组也应该初始化 初始化数组的时候需要提供多个初始化数据

41、,每个数据用来初始化一个存储区 所有初始化数据写在一对大括号里,不同数据之间使用逗号分开 初始化数据的使用顺序是从前向后 如果初始化的时候提供过多的初始化数据则多余的会被丢掉 如果初始化数据过少则没有对应初始化数据的存储区自动被初始化成 0 如果初始化数据个数和存储区个数一样则可以省略数组声明中存储区个数 可以采用 sizeof 关键字对数组名称进行计算,计算结果是 数组中包含的字节个数Int arr5 = ;Sizeof(arr) = 4*5 = 20声明变长数组的时候可以使用变量表示数组中存储区的个数,这种数组只能在 C99 规范中使用(变长数组只表示声明是不确定长度, 可一旦确定就不可以

42、再改变了) int arrnum; / /变长数组变长数组不可以初始化!Day08二位数组采用循环嵌套的处理方式对它每一个 二位数组的初始化: 二维数组既可以作为一个一维数组进行初始化,也可以作为多个一维数组进行初始 化二维数组名称加N跨越了 N组存储区的大小,结果是下标为 N那组第一个存储区的地址对二维数组组名称进行 sizeof 计算结果是整个二维数组中所有存储区的大小 可以把二维数组名称转换成一维数组使用转换方式是二维数组名称后面加一个组下标 这个一维数组中包含组下标对一维数组名称进行取地址操作结果可以看成是一个二维数组这个二位数组中只有一个分组,这个分组里包含原来一维数组中所有存储区D

43、ay09函数C 语言中可以采用分组的方式管路所有的语句 最简单的分组方式可以把所有语句分成多个函数,每个函数中包含多个语句 所有 C 语言程序一定由一个或多个函数构成 每个函数有自己的名字,名字用来区分不同的函数C 语言规定每个程序中必须包含一个叫做 main 的函数,这个函数叫主函数 多函数程序执行的时候遵守如下规则:1、任何时候只能有一个函数工作2、任何时候也必然有一个函数在工作3、如果函数 A 在工作过程中停下来让函数 B 开始工作,则函数 B 结束所有工作后 必须要让函数 A 继续后面的工作如果函数 A 在工作过程中停下来让函数 B 开始工作,则它们之间存在调用关系 函数调用关系一定发

44、生在两个函数之间 调用关系中先开始工作的函数叫调用函数,后开始工作的函数叫被调用函数 函数 A 和函数 B 之间的调用只在函数 B 工作期间有效存储区是有主人的 存储区的主人可以任意使用它所拥有的存储区 同一个主人的存储区不可以重名,不同主人的存储区可以重名声明在函数内部的存储区它的主人是这个函数的某一次运行过程 绝大多数函数调用过程中存在双方之间数据的传递 数据传递有两个完全相反的方向,它们分别使用不同的方法实现 任何一个方向的数据传递都需要一组专门的存储区来记录要传递的数字 所有这些存储区的主人都是被调用函数从被调用函数向调用函数只能传递一个数据,这个数据叫做被调用函数的返回值 为此只需要

45、准备一个存储区只能由被调用函数向这个存储区里放数字 被调用函数只能在最后一条语句使用 return 关键组向这个存储区放数字 只有调用函数才能从这个存储区里获得数字 把函数调用语句当作数字使用就可以获得这个数字 这个存储区的类型名称要写在函数名称前面 调用函数在得到返回值以后必须立刻使用或者转存到其他存储区一个函数可以选择 不使用返回值存储区 ,这时需要在函数名称前写 void 如果函数名称前没有写数据类型名称则计算机认为函数使用一个整数类型的返回值 存储区如果没有使用 return 关键字返回值存储区赋值,则调用函数从这个存储区里获得的 数字是随机的在对返回值存储区进行赋值的时候最好保证数据

46、和存储区的类型一致Exit 标准函数可以随时结束一个程序的执行; 为了使用这个函数需要包含 stdlib.h 文 件为了把数据从调用函数传递给被调用函数需要被调用函数提供一组存储区(这些存 储区的个数和类型 都是任意的)为了使用这些存储区需要被调用函数声明一组变量 这些变量必须声明在函数名称后面的小括号里面 这些变量叫做 形式参数函数名称后面小括号里的内容叫形式参数列表形式参数列表中 每个形式参数都需要专门写类型名称 ,用逗号分隔 不同的形式参数 声明函数调用语句中需要在小括号路位每个形式参数提供一个对应的数字。被调用函数 在工作的时候就可以通过形式参数获得这些数字。这些数字叫实际参数 如果存

47、在多个实际参数,一个实验逗号把它们分隔开 所有可以当作数字使用的内容都可以作为实际参数使用形式参数和实际参数的存储区完全不同,对形式参数的修改不会影响实际参数如果函数名称后面的小括号里什么都没有则表示函数可以接受任意个数任意类型的 实际参数在小括号里写 void 表示函数没有形式参数利用数组作为形式参数可以传递大量数据,声明在小括号里的数组就是形式参数 地址数据可以作为实际参数和数组形式参数配合使用 (大多数情况下使用数组名称) 数组作为形式参数使用时可以省略中括号里的数字,但是必须要另外提供一个形式 参数表示数组中存储区个数数组形式参数并不是数组,而是一个可以当作数组使用的存储区 预习:1、

48、函数(数组形参,函数隐式声明和显示声明)2、递归函数3、变量的生命周期和作用域4、程序的分段5、声明变量时可以使用的关键字作业:1、编写函数解决鸡兔同笼问题, 调用函数提供头和脚的个数, 函数负责计算出兔 子的个数2、编写程序在屏幕上打印如下内容1x9=92x8=173x7=214x6=245x5=25每行使用一个函数调用语句打印Day10Rabbit 兔子 chicken 鸡数组作为形式参数的时候,真正的形式参数并不是数组,而是一个可以作为数组使用的单个存储区 函数调用的时候,这个真正的形式参数只记录了一个地址数据 数组形式参数的名称代表了这个存储区 数组作为形式参数的时候,数组名称所代表的

49、存储区主人是被调用函数,数组里所包含的所有存储区主人一定不是被调用函数 使用数组形式参数可以让被调用函数使用其他主人的存储区 使用数组作为形式参数可以让调用函数和被调用函数共用同样的存储区 使用数组形式参数可以实现双向数据传递,这个参数叫输入输出参数 普通变量作为形式参数只能吧数组从调用函数传递给被调用函数,这个参数叫输入参数被调用函数可以通过数组形参改变调用函数里的数组的数据 函数可以分成函数声明和函数体(大括号里的叫函数体,大括号前的叫函数声明) 函数声明可以独立作为一条语句,这个时候可以省略所有形式参数的名称 当编译器首先遇到函数调用语句时会猜测函数的格式,这个猜测的结果叫函数的隐 式声

50、明所有函数的隐式声明格式一样,有一个整数类型的返回值存储区,可以接受任意个 数 任意类型的参数应该把文件所有函数(主函数)的声明在文件开头列出,这叫做函数的显示声明。 显示声明可以避免隐式声明所带来的问题 会调用自己的函数叫 递归函数适合采用递归方式解决的问题需要符合如下特征:1、问题比较复杂 ,难以找到直接解决的方法2、问题可以分解成几个小问题 ,至少有一个小问题和原来问题的本质一样,只 是稍微简单一点编写递归函数的步骤:1、用语句把问题的分解方式描述出来(假设递归函数已经编写好了)2、在函数的开头编写一个分支用来处理不可分解的情况(这个分支必须能直接 结束函数)采用递归函数解决问题的思路叫

51、递归采用循环解决同样问题的思路叫递推程序中所有存储区都有主人 主人可以任意使用自己拥有的存储区 如果希望使用其他主人的存储区需要使用特殊的手段,甚至无法实现如果一个存储区对应的变量声明在一对大括号里,则它的主人是这个大括号的一次 运行过程如果一对大括号在程序运行过程中多次运行,则会出现多个主人,每个主人拥有自 己私有的存储区声明在所有大括号之外的变量,它的主人是整个程序的运行过程在主人存在的时间范围内,存储区是存在的,是可以使用的,这个时间范围叫做存 储区或变量的生命周期代表存储区的变量只有在存储区主人内部所包含的语句中才可以使用,这些语句叫 做存储区或变量的作用域根据变量的生命周期和作用域,

52、把变量分成三种:1、声明在所有函数之外的变量叫 全局变量 ,它是主人是整个程序的运行过程,它 的生命周期是整个程序运行范围, 它的作用域包含程序中所有语句, 没有初始化 的全局变量自动被初始化成 0。2、声明在函数内部的变量叫 局部变量 ,它的主人是函数的一次运行过程,它的生 命周期是函数一次执行的时间范围,它的作用域是函数内部的所有语句3、函数内部的大括号叫做语句块,声明在语句块里的变量叫 块变量 ,它的主人是 语句块的一次执行过程, 它的生命周期是语句块的执行时间范围, 它的作用域是 语句块里的所有语句预习:1、重名变量的使用2、程序分段3、声明变量时可以使用的关键字4、指针变量作业: 编

53、写函数把一个数组中所有存储区的内容前后颠倒,然后在主函数里打印修改后的内容 (采用循环和递归两种方式实现 )Day11全局变量,局部变量和块变量时可以重名的如果一条语句使用了重名变量,则会优先选择作用域小的那个 程序在内存中是分段保存的代码段 记录程序语句 转换得到的 数字 ,在运行的时候这个段落的内容不可以被修改全局段 包含生命周期是整个程序运行期间的存储区,包含的存储区个数 在程序运行期间固定不变栈 局部变量,块变量,形式参数和返回值的存储区都被包含在这个段落里 ;当一个函数开始运行的时候 ,计算机会从这个段落中为这个函数 分配必要的存储区,当一个函数结束的时候,计算机会把这个段落中 分配

54、给这个函数的存储区回收 (回收时计算机不会修改存储区的内容) 分配顺序和回收顺序刚好相反堆 可以认为大小是无限的,可以存放大量数据;需要使用专门的函数调用语句才能从这个段落分配存储区; 当不再使用这个段落中存储区的时候需要使用专门的函数调用语句把 它们还给计算机 如果没有把这个段落中存储区还给计算机则会导致内存泄露声明变量时可以使用的关键字1、auto关键字用来声明自动变量,所有局部变量都是自动变量,不需要特别声明2、static 关键字用来声明静态变量,所有静态变量的生命周期都是整个程序运行期 间;没有初始化的静态变量自动被初始化成 0;静态全局变量的作用域只包含声 明它的那个文件中所有语句

55、; 不论静态变量的初始化语句写在哪里, 它只会在程 序开始的时候执行一次初始化(静态变量不能在别的文件里执行)3、const关键字用来声明不可赋值的变量。这种变量只能在声明的时候进行赋值; 但可以用scanf改变4、volatile关键字用来声明多变的变量指针指针变量专门用来记录地址数据指针变量的主要用途是帮我们找到某一个存储区可以把指针变量当作种子文件来理解指针变量和种子文件的区别:1、任何时候指针变量只能帮我们找到另外一个存储区2、指针变量在不同的时候可以帮我们找到不同的存储区只有把指针和另外存储区捆绑后才可以通过指针找到这个存储区只要把存储区的 地址记录在指针变量里 就可以实现它们的捆绑

56、指针也分类型,不同类型的指针适合跟不同类型的存储区进行捆绑指针变量可以用来代表四个不同的内容:1、不加*的指针可以代表指针本身的存储区或这个存储区里的地址数据2、加了 *以后可以代表捆绑存储区或捆绑存储区里的数据Null代表空地址,它的数值是数字 0;记录空地址的指针叫 空指针 除了空指针以外没有捆绑的指针叫 野指针:程序中禁止出现野指针 没有初始化的指针都是野指针指针初始化语句中*没有参与赋值过程,它仅仅代表指针类型指针在不同的时候可以和不同的存储区捆绑,使用指针的时候应该关注捆绑存储区 域的使用方式,而不是它的来源在我们的计算机里所有指针变量的大小都是四个字节 不同类型的指针之间互相赋值不

57、会导致地址数据丢失(大小一样) 不同类型指针之间进行强制类型转换也不会导致地址数据丢失 指针的类型决定了通过指针找到的捆绑存储区的类型 不同类型指针可以记录同样的地址,但是通过它们找到的捆绑存储区的类型不同, 所以数值也可以不同无类型指针用void *表示这种指针没有声明捆绑存储类型,它只表示里面存储了一个地址数据 这种指针可以记录任何地址数据不可以在这种指针前加*表示捆绑存储区(无类型)只有先强制类型转换成有类型指针后才可以加* (如:*(int*)p_vd= 10 )这种指针通常用来记录来源不明并且有多种可能性的地址数据 指针可以加减一个整数,计算结果还是一个地址数据 指针加减整数 N 实

58、际地址数据的变化时 N 个捆绑存储区的大小两个同类型的指针之间可以进行减法操作 计算结果是一个整数 这个整数代表两个地址之间可以容纳的捆绑存储区个数 把数组名称赋值给指针后可以用这个指针代替数组名称 这个时候可以认为指针间接和数组中每个存储区实现了捆绑 指针可以和数组中每个存储区捆绑,捆绑好以后就可以代替下标表示这个捆绑存储 区 预习:1、指针2、字符串作业:1、使用指针把数组中所有存储区的内容前后颠倒Day12可以使用指针作为循环变量依次处理数组中每个存储区 数组作为函数形式参数的时候真正的形式参数就是一个指针, 指针和数组名称的差异:1、指针可以被赋值,数组名称不可以被赋值2、对指针进行

59、sizeof 计算结果是 4,对数组名称进行 sizeof 计算结果是数组中包含 的字节个数3、对数组名称取地址的结果是二维数组, 对指针取地址结果是指针本身存储区的地 址声明指针时也可以使用 const 关键字,使用方法有如下两种:1、const关键字写在指针类型前面,例如:const int *p_num = NULL;不可以通过这个指针对它的捆绑存储区进行赋值2、const关键字写在指针变量名称前,例如:int * const p_num = NULL; 这种指针本身不可以被赋值,只能在初始化的时候捆绑如果一个函数在执行过程中不会修改指针形式参数所捆绑的存储区内容,则应该在 指针形式参数

60、前加 const 关键字使用指针作为形式参数可以让被调用函数使用其他主人的存储区(存储区的声明周 期包含被调用函数的执行时间)函数调用语句中可以使用任何地址数据和指针类型形式参数配合使用 如果函数的指针形式参数不能确定类型,就可以采用 void* 类型的指针 当使用 void* 类型的指针形式参数时需要通过其他途径知道指针的类型指针也可以作为函数的返回值使用 使用指针作为函数的返回值可以间接从被调用函数通过返回值向调用函数传递多个 数据当指针作为返回值的时候,绝不可以把局部变量和块变量的地址赋值给指针类型的 返回值字符串C 语言中使用一组连续的字符类型存储区记录文字信息 所有文字信息最后必须放

61、一个 ASCII 码的字符 (用 0表示 )表示结束位置 符合以上要求的一组字符类型存储区叫一个字符串 0字符前的内容是要记录的文字信息 所有字符串都可以使用一个字符类型指针表示 (这个指针要求和第一个字符类型存 储区捆绑)字符串 又分为两种:一种字符串叫字符串字面值,例如:“abc” “%$&八”等; 编译器在编译的时候会自动在字符串字面值后面加 0字符, 编译器会自动用第一个字符类型存储区的地址替换掉值 字符串字面值的内容在程序执行过程中不可以修改 编译器会把字符串字面值中所有存储区放在一个专门的段落里,这个段落里的所 有内容在程序执行的时候都不可以修改内容一样的字符串字面值在计算机里只保存一份 两个字符串字面值连着写在一起,则编译器会自动把它们合并成一个第二种:字符数组也可以用来表示字符串 只有包含 0字符的字符数组才能当字符串使用 可以采用字符串字面值对字符数组进行初始化,这个时候会把0字符也初始化到字符数组中。初始化完成后字符数组可以当字符串使用。当使用字符串字面值对字符数组完成初始化以后,它们的存储区之间完全无关, 仅仅是内容一样。在程序执行过程中,字符数组中的字符串内容可以修改 匿名字符数组:M0123456789u0;77110123456789s是匿名字符数组使用%s做占位符可以把一个字符串中所有有效字符按顺序打印在屏幕上和s占位符对应的数据应该是第一个字

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!