《郝斌C语言自学视频》笔记_第1页
《郝斌C语言自学视频》笔记_第2页
《郝斌C语言自学视频》笔记_第3页
《郝斌C语言自学视频》笔记_第4页
《郝斌C语言自学视频》笔记_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业郝斌C语言自学视频笔记v1.1作者:星辰变71目录的编号对应视频的编号,专为懒得打字做笔记的吧友所著!再次感谢郝斌老师,带我们装逼带我们飞(_)目录 TOC o 1-3 h z u 1.所用编程软件视频中用的编程软件是VC+6.0,本笔记用的编程软件是VS2010和Dev C+5.11。要求变量定义写在最前面,不能中途定义,否则编译时会出错。17.什么是数据类型整型:整型int-4字节 长整型long int-8 短整型short int-2浮点型:float-4 do

2、uble-8字符char-1所占字节数不一定都是这样,但是比如长整型所占一定大于等于整型。复合数据类型:结构体 枚举 共用体18.什么是变量int i; /VC+6.0请求操作系统把内存条中的一个空闲单元和i产生关联i=3; /3最终是存放在内存中,程序终止之后3所站的空间被释放如果不使用变量,要自己去找内存中的空闲单元,有了变量就不用考虑了。变量的本质就是内存中一段存储空间20.变量为什么必须初始化所谓初始化,就是赋值。当软件运行完毕后,操作系统将回收该内存空间,以便再次分配给其他软件使用。(注意:操作系统并不清空该内存空间中遗留下来的数据)综上,一个软件所分配的空间中极可能存在着以前其他软

3、件使用过后的残留数据(垃圾数据)。所以通常我们为一个变量,为一个数组,分配好存储空间之后都要对该内存空间初始化!21.如何定义变量int i=3;等价于int i; i=3;int i,j;等价于int i; int j;int i,j=3;等价于int i; int j; j=3;int j=3,j=5;等价于int i; int j; i=3; j=5;int i,j;i=j=5;等价于int i,j; i=5; j=5;22.什么是进制N进制就是指逢N进1。我们计算机只识别二进制。C语言规定八进制前要加0(注意是零不是字母O),十六进制前要加0 x或者0X,十进制前什么都不加。在汇编中:

4、在数字后加字母B表示二进制,加O表示八进制,加D表示十进制,加H表示十六进制。例如:1011B也记为(1011)2 1357O也记为(1357)8 2049D也记为(2049)10 3FB9H也记为(3FB9)16printf中,%d表示以十进制输出;%x或%X(决定输出字母的大小写)以十六进制输出;%O(这次是字母不是零了!)表示以八进制输出。23.常量在C语言中是如何表示的A整数:八进制前要加0(注意是零不是字母O),十六进制前要加0 x或者0X,十进制前什么都不加。B浮点数:传统的写法float = 3.2;科学计数法float x = 3.2e3; /x的值是3200float x =

5、123.45e-2; /x的值是是1.2345编译时会有个警告,如图为什么呢?C语言中,无论是传统写法还是科学计数法,默认是double型。double赋给float会丢失精度。可以选择忽略警告,也可以选择加个F变成123.45e-2F。这样编译时就没有警告了。注意一个问题,为了解决上述窗口一闪而过,我们要加上头文件(如图)并在main函数结尾前加上(如图)。C字符:单个字符用单引号括起来,如A。AB错误,”AB”正确。字符串用双引号括起来。A正确,因为A代表了A 0的组合。可以想成一个字符串就一个字符。24.常量是以什么样的二进制代码存储在计算机中整数是以补码的形式转换为二进制代码存储在计算

6、中的。实数是以IEEE754标准转换为二进制代码存储在计算中的。字符本质上与整数的存储方式相同。26.代码的规范化A. 括号一敲敲一对(),敲完括号再写内容B注意加空格。比如if ()/if要敲空格再加括号比如Int a = 1; /等号两边要加空格比如x1 = (-b + sqrt(delta) / (2*a); /这些运算之间要加空格C注意从属关系要进行缩进。选中要缩进的多行代码按Tab,就一起右移了,Shift+Tab就一起左移回来了。D代码之间要适当的空行。相同功能的写在一起,然后空一行再写下一部分相对独立功能的代码。27.什么是字节字节是存储数据的单位,并且是硬件所能访问的最小单位。

7、1字节=8位,这是固定不变的。CPU只能直接处理内存里面的数据,硬盘的数据必须调入内存才能处理。硬件上最小的单位是位,不是0就是1。但是CPU只能到字节上,不能准确控制到某一位。控制到位上可通过位运算符。下面是内存条28.不同类型数据之间相互赋值的问题这个问题是C和C+所独有的,如果想深入了解C和C+必须搞清楚。如果想搞清楚必须懂补码。29Char使用常见问题A. char ch = A; /正确 char ch =”AB”; /错误,不能把字符串赋给单个字符char ch =”A” ; /错误char ch =AB; /错误B以下写法是错误的! 下面这么写就对了。30.什么是ASCII码 A

8、SCII不是一个值,是一种规定。它规定不同的字符是使用哪个整数值去表示。比如A-65 /A这个字符在ASCII中是用65来表示的a-97,0-48所以说字符本质上与整数的存储方式相同。33.printf();将变量的内容输出到显示器上四种用法:A.printf(”字符串”);B.printf(”输出控制符”,输出参数);C.printf(”输出控制符1 输出控制符2”,输出参数1,输出参数2);要是想让35之间有空格要是想让35之间有逗号还有更清楚的,写上i = 3,j = 5如下图注意一个问题,下面写法是错误的,虽然编译时没有问题。因为输出控制符和输出参数的个数不一一对应。D. printf

9、(”输出控制符 非输出控制符”,输出参数); 输出控制符包括%d %ld %c %f %lf %o %s %x(或%X或%#X或%#x)这么看还是%#X比较好!非输出控制符原样输出,在上面C中就是例子。34.如何让程序更有保存价值在开头加上时间,功能,目的等。在末尾加上在某款软件中的输出结果和总结。补充:怎么复制.exe黑窗口中的数据右键标记或者全选,标记完了再点右键,然后就不是被选中状态了。这时到目标处ctrl+V就OK了。36.为什么需要输出控制符A.0和1组成的代码可以表示数据也可以表示指令。一串01代码本身没有实际含义,关键是看怎么用输出控制符去解读。B. 0和1组成的代码表示的是数据

10、的话,那么用不同的输出格式输出就会有不同的结果。38+39.scanf();用法:通过键盘将数据输入到变量中scanf(”输入控制符”,输入参数);/当然可以含有非输入控制符功能:将从键盘输入的字符,转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。解析:A.读着云里雾里。在键盘输入123不是整型数字123,而是字符1字符2字符3,操作系统就是这么规定的。%d的作用就是把字符1字符2字符3转换成一个十进制整数。B.输入参数是&i,就是存入以i的地址为地址的变量,就是i变量!就像把我的家作为家的人,就是我这个人!服了下面是含有非输入控制符的例子。 注意:A.不要忘了加上取地

11、址符&。B.如果scanf();中含有非输入控制符,那么输入时要把它对着输一遍,非输入控制符不会和printf();一样显示在黑窗口上!C.因为是%d输入,所以输入m123n时自动把n屏蔽了。D.有了scanf了就不需要在定义变量时赋初值了,当然附了无影响。E.scanf中不要加非输入控制符,用户并不知道你加的是什么,没法照着再输一遍!40.一次给多个键盘变量赋值就算我把%d%d连在一起写,我输入12按回车也不会i = 1,j = 2,他会一直换行光标闪烁等我我输入j的值。还是%d%d连在一起写,我输入1,空格/回车,输入2,输完后回车就i = 1,j = 2。A.就是我%d%d不管之间连在一

12、起还是加几个空格,我都可以在黑窗口中用空格把输入的三个数分开。B.但是我要是之间加逗号和若干空格,那我输入的两个值需要以逗号(或逗号加若干空格)相隔。如果仍然以空格相隔,那么只能是第一个值正确。41.第一部分:如何优雅地使用scanfA.上面先加一条提示信息,例如printf(”请输入两个值中间以空格/逗号分隔:”);B.scanf尽量不使用非输入控制符,尤其是n!有时候莫名其妙的不好用就是随手加了个n引起的!不过加空格没事(_)scanf(%dn,&i); / n加进来后你想输出123就要输入123n总结:一个取地址符&,一个换行符n,scanf和printf不要弄混了!C.(难点!)sca

13、nf对用户非法输入的处理() C-1. i和j都是%d输出,i在前面,输入123m,它找到了123作为合法的%d字符,然后j开始从m开始读,开始就出错了。但是我要是定义char j; 然后scanf和printf都用%c那就i = 123,j = m,当然这也是错误的输入方式。 然后还有一个问题,我要是输入123mn呢?j = mn?别忘了char 只能存放一个字符啊!所以只能放m啊!C-2. 如果输入m123,开始读就错了,往后都错了,如下图。注意啊,这个地方要好好的理解一下啊!上面的例子是说输入错误的情况下是输一次值回车就报错了。因为出错的部分不会自动丢弃,等待下一次输入时再把出错的部分赋

14、给下一个变量!直接就不用你给下一个变量输入了!然后往后就全错了!好贱啊!上句话不理解可以看C-6,C-7。C-3. 我再次输错值,我输入123空格456还是一次输入,按回车就这个结果。C-4. 我要是输入123空格456空格789,结果如图。个人猜测应该是检测到123遇到空格就把123给i,但是空格不影响往下检测,检测到456遇到空格就把456给了j,再没有输入的值了就停了。C-5. 我要是输入123(可以加一堆空格),他会继续光标闪烁提醒我输入第二个值,我输入456(可以加一堆空格)再按回车结果如下 C-6. 正确的输入方式也就是按照流程的意思就是C-5中输入123回车输入456回车。所以编

15、写程序时可以按照下图,这样就引导用户按照正确的输入方式输入。 C-7. 按照上面的引导出错的话,结果如下图。41.第二部分:保证前面输入的垃圾值不会被接受这样就出现一个问题,当我需要对变量键盘赋值时,前面的输入可能会遗留一些垃圾的输入值,就像上面例子以前有些值没有放进去,而是放进这次输入了,然后往后就全错了。真不知道为什么设计者不直接自动丢弃错误部分呢?!所以我们需要这样一个功能,输入值时要保证前面输入的垃圾值不会被接收。两个scanf之间加入两行代码while(ch = getchar()!= n) continue;如图,这样在输入时前面输入的垃圾值就没有影响了,好神奇啊(_)ch是cha

16、r类型的! 另外很多编好的代码拿过来就能用,不必自己再绞尽脑汁的去想!42.运算符的分类算数运算符:+ - * /(除) %(取余)关系运算符: = 关系逻辑赋值43.除法与取余除法/的运算结果和运算对象的数据类型有关,两个都是int,则商就是int,若商有小数,则去除小数部分;被除数和除数中有一个或两个是浮点型,那结果就是浮点型,不去除小数部分。如16/5=3 16/5.0=3.2 -13/4=-3 -13/-3=4 3/5=0 有一个常用的计算:m = 1234; m /= 10;第1次m = 123 第2次m = 12 第3次m = 1 第4次m = 0取余%的运算对象必须是整数,结果是

17、整除后的余数,余数的符号与被除数相同。13%3=1 13%-3=1 -13%3=-1 -13%-3=-1 3%5=3 44.逻辑运算符 &:真&真为真,其余都是假 |:假|假为假,其余都是真A. C语言对真假的处理:非零是真,零是假。真用1表示,假用零表示。分析:m的值不是0就是1。32是真,k = 8也是真,所以m是1。B. 要是k = 0结果为 C. k的值不是想得那么简单! 我擦,k = 20!为什么k = 5没有被执行!&左边的表达式为假的时候,右边的表达式就不执行了!因为一个是假的肯定就是假的了!同样啊,对于|,左边的表达式为真的时候,右边的表达式就不执行了!45.初学者学习运算符的

18、一些建议。A忘了的话就查运算符和结合性表。B. 为了让别人更好清楚,把想让它优先级高的用括号括起来。附:谭浩强 著C程序设计(第四版)P378运算符和结合性表运算符与结合性优先级运算符含义要求运算对象的个数结合方向1( )圆括号左-右 下标-指向结构体成员.结构体成员2!逻辑非1(单目运算符)右-左按位取反+自增-自减-负号(类型)类型转换*指针&取地址sizeof长度3*乘法2(双目运算符)左-右/除法%求余4+加法2左-右-减法5右移6 =关系2左-右7=等于2左-右!=不等于8&按位与2左-右9按位异或2左-右10|按位或2左-右11&逻辑与2左-右12|逻辑或2左-右13 ? :条件3

19、(三目运算符)右-左14= += -= *= /= %= = . 单目 算术(先乘除,后加减) 关系 逻辑(不包括!)条件 赋值 逗号以上优先级从高到低。位运算符的优先级比较分散:有的在算术之前如,有的在关系之前如,有的在关系之后如&、|。为了容易记忆,使用位运算符时可加圆括号。46.黑窗口不要重复打开和其属性修改注意一个问题:经常已经打开.exe的黑窗口了,还去点击启动调试(F5)又打开第二个黑窗口了。要把前一个黑窗口关了,再修改再打开第二个!要是已经有黑窗口了,再点击编译(Ctrl+F7)就会弹出一个对话框,这时候别困惑啥意思,就是把已经打开的黑窗口关了!在黑窗口的边框上右键-属性,可以修

20、改光标大小,字体,布局,颜色等,不过默认的挺好的。52.if最简单用法流程控制的分类:顺序、选择(if和switch)、循环 53.if的范围A. if (表达式) 语句A;语句B;if默认只能控制语句A是否执行,语句B一定会执行。它正确的格式应该是if (表达式) 语句A;语句B;B. if (表达式) 语句A;语句B; 此时if 可以控制语句A和语句B。综上所述,if默认只能控制一个语句是否执行。如果想控制多个语句是否执行,就要把它们用括起来。54.ifelse的用法注意一个问题啊,在新建的时候起名叫ifelse会有问题,因为else后面有三个点,加上.c作后缀就是ifelse.c,这样命

21、名不行!新建命名的时候不要加点!(附:.cpp是C+的源程序。在国内,C+读作”C加加”,在国外读作”C Plus Plus”,即”.cpp”。C的源程序后缀就是.c。) else后面也是默认只能控制一个语句是否执行。如果想控制多个语句是否执行,就要把它们用括起来。 55-1.ifelse ifelse的用法格式:if (1) A;else if (2) B;else if (3) C;else /注意!最后一个else后面没有括号了!D;说明:(1)成立A执行;如果(1)不成立(2)成立B执行;如果(1)(2)都不成立执行C;(1)(2)(3)都不成立就执行D了。 注意啊!有个容易犯的错误用

22、法! 55-2. if中容易犯的错误这是1个语句,不是3个!要是3个都会执行那是3个语句,可是只会执行一个所以是1个语句。下面的写法就是错误的!加了哈哈这个语句之后把这个整体分成了3个语句,语句1没问题,语句2也没问题,但是语句3就错了!因为没有语句以else开头()当然,编译(Ctrl + F7)时会提示错误:57.if 举例求分数的等级注意:一种错误的表达式写法!90 = score = 100是XX的()这式子一看觉得是没啥问题,但是是XX的!因为从45节运算符表可以看出关系运算符是自左至右执行的,就是先算90 = score,这就出问题了!90 = score的值是个逻辑值,要不是真要

23、不是假,就说结果不是1就是0,不管是1还是0 小于等于100一定成立()综上,90 = score = 90 & score b则a与c比较 ac则输出a ac则输出b b 再每个语句的功能 - 试数(最后一步尤其重要)试数两个原则:一个是把自己当计算机,一步一步来。一个是写整齐。就一些小算法的程序:尝试自己去编程解决它,基本不太可能()如果解决不了,就看答案关键要把答案看懂,这个要花很大的精力,也是我们学习的重点看懂之后尝试自己去修改程序,并且知道修改后不同输出结果的含义照着答案去敲,调试错误不看答案,自己独立敲出来如果程序实在无法彻底理解,就把它背下来62.if空语句的问题有时候犯错误在i

24、f后面加了个分号,如下图 上面两种都一样,就是如果1大于2就执行这个空语句。上述就是3个语句了。语法上虽然没有问题,但是达不到效果了。63.if常见问题上述语法没有问题,但是加了else语言就错了,因为没有单独以else开头的语句。同样,else if和else后面也别加上分号!if (表达式1) A;else if (表达式2) B;else if (表达式3) C;elseD;即使表达式1和2都成立,也只会执行A语句。因为表达式1成立了,就没有否则了(_)能不能没有最后一个else?if (表达式1) A;else if (表达式2) B;else if (表达式3) C;/最后的else

25、没有了,语法不会出错,但是逻辑上有漏洞。如下例子:漏洞就是我要是输入分数是70,就没有对应的输出了!更加郁闷的错误O(_)O哈哈if (表达式1) A;else if (表达式2) B;else if (表达式3) C;else (表达式4)/ 最后一个else后面没有括号了!D;不过这个错误还好,语法错误,编译时会提醒你表达式4后面缺少分号。可以这样理解,else后面都是一个语句,但是没有(表达式4)D;这种类型的语句。上述错误我要是表达式4后面加上分号呢?if (表达式1) A;else if (表达式2) B;else if (表达式3) C;else (表达式4);/ 表达式4后面加上

26、分号D;和第E条相比语法上没有错误,编译OK。它就等价于else (表达式4); D;语法上虽然OK,但是只会导致错误结果()67.初识for循环循环分类:for while dowhile先执行”1”, ”1”完了执行”2”, ”2”成立执行”4”, ”4”完了执行”3”,”3”完了标志循环一次结束。然后再判断”2”决定是否进行下一次循环。如果”2”不成立就退出循环了。注意:”3”完了才标志循环一次结束,所以i最终值不是100,是101! ”1”永远只执行一次,”3”完了一定会执行”2”!别忘了给sum赋初值,否则sum是个垃圾值。垃圾值再加上i还是垃圾值然后VS故意输出一个很大的数字告诉你

27、你错了O(_)O哈哈 ”1” ”2” ”3” 之间是分号分隔,不是逗号!”3”后面没有分号了()68.for最简单的应用-求10以内奇数和 注意:i+=2后面没有分号!要是求10000以内的奇数和就是i10000,但是怎么证明程序正确呢?就是先看10正确,再放大点正确,也就得出10000正确了。69.for和if的嵌套使用注意一个问题:for()后面不要加一个分号!和if()一样!因为语法没有错误编译时检查不出,一个分号又不起眼,有时候硬是让人崩溃()求1-12所有能被3整除的数字之和这个for下面我没加括号,for默认也是控制一个语句 这个例子刚开始有点难,for下面我加了括号输出结果是什么

28、?分析:1完了执行2;2成立执行4;4成立执行5,5完了执行6,4不成立执行6,6完了执行3,标志循环一次结束。71.强制类型转换从一个例子引出强制类型转换:1+1/2+1/3+1/100 为什么sum结果是错误的?根据43节:除法/的运算结果和运算对象的数据类型有关,两个都是int,则商就是int,若商有小数,则去除小数部分;被除数和除数中有一个或两个是浮点型,那结果就是浮点型,不去除小数部分。如16/5=3 16/5.0=3.2 -13/4=-3 -13/-3=4 3/5=0 取余%的运算对象必须是整数,结果是整除后的余数,余数的符号与被除数相同。13%3=1 13%-3=1 -13%3=

29、-1 -13%-3=-1 3%5=3 所以从i = 2开始,1/i的结果就都是0进一步研究:将sum变为float型sum = float + int结果为float ,即不同精度运算结果为高精度 () 为什么sum结果为0!因为sum以%d输出,正确应该以%f输出!这个错误也经常被忽略! 进一步研究:对1/i使用强制类型转换 从i = 2开始,1/i的结果就都是0,加上强制类型转换就是0.00000()本例子正确做法,对i进行强制类型转换(不推荐此法,后面有简单的) 还有个更简单的写法:sum = sum + 1.0 / i (_) 推荐使用这个注意:这里边sum最后结果是个浮点型,一开始必

30、须定义成float,输出时必须是%f,定义和输出要匹配。一开始定义成int,输出是%f或者一开始定义成float,输出时是%d,结果都是错误的!为什么不直接定义成float i?下一节会讲到。综上,强制类型转换格式(数据类型)(表达式),作用是把表达式的值强制转换为前面写的数据类型,例子(int)(4.5 + 2.2)值为6 (float)(5)值为5.72.浮点数存储带来的问题float和double都不能保证精确存储()面试题举例:有一个浮点型变量x,如何判断x的值是否为0错误写法: if (x = 0) 是 else 不是 因为x赋值为0,但是存储的只是0的近似值正确写法:if (|x

31、0.| =0.) 是 else 不是 表示x和某一个很小很小的数字相差非常非常小,x就可以当0来看待了为什么循环中更新的变量不能定义成浮点型就比如71节的i+为什么i不能是浮点型?因为判断i 2成立-4-5成立-A-6-5,5不成立-3-2成立-4(别以为4只执行1次啊)-5成立-A-6-5,5不成立-3-2不成立-B就退出循环了75.复习进制的知识搞清楚4个问题什么是n进制?就是逢n进1把r进制转化成十进制这个简单,比如说(234)5 = (4x50+3x51+2x52)10(234C)16 =(12+4x16+3x162+2x163)10把十进制转化成r进制这个算就麻烦。除r取余,直至商0

32、,余数倒序排列不同进制所代表的数值之间的关系比如十进制的3981转换成十六进制是F8D,它们的本质都是同一个数字二进制转十进制的最快方法是先二进制转十六进制,再十六进制转十进制76.运算符补充自增/自减+在变量的后面, 首先对变量取值,然后再参与自增运算;+在变量的前面, 首先对变量做自增运算,然后再对变量取值。-为什么会出现自增?i += 1就行了为何还会有i+?一个是代码看着更精炼,一个是自增的速度更快(暂不深究)。使用自增时要注意的问题编程时应该尽量屏蔽掉前自增和后自增的差别。就是i+和+i单独成一个语句,这样没有区别,但是不要作为一个更大的表达式的一部分!77.运算符补充三目运算符格式

33、 A ?B : C等价于if (A) B; else C; 78.运算符补充逗号表达式格式 (A, B, C, D)从左到右执行,最终表达式的值是最后一项的值 说是逗号是一个顺序点,所有的副作用必须在下个语句前生效。所以j+完了j就加1,+j完了j又加1变成4。注意j+2的值是6但是j的值没有改变,因为没有把j+2的值赋给j,不是j += 2!最后j - 3的值是4-3=1。82.while循环 while (表达式) 语句;解释:表达式成立执行语句,完了再判断表达式,再执行语句 while默认控制一个语句83.for和while的比较比如求1到100的和,分别用for和while来写 - 综

34、上,for和while可以相互转换 for (1; 2; 3) A;等价于1;while (2) A; 3;虽然for和while可以相互转换,但for的逻辑性更强,更不容易出错,我们推荐多使用for。87.何时用while,何时用for没法说,用的多了自然就知道了88.dowhile格式 do while(表达式); /后面这个分号不能丢了!dowhile并不等价于for,当然也不等价于while。因为dowhile一定会执行一次,而那两个可能一次也不执行。主要用于人机交互。例如写的禹山溶解氧执行,原来计算只能输入一次,现在可以不断的输入!-上述程序改进。上述程序没有结束啊,黑窗口一直在闪烁

35、等待你输入,但是你输了几个想要结束咋办() 通过以上例子就理解了为什么dowhile用于人机交互(_)90.switch用法简介含有break - 将case 1后面的break去掉-结论:case 1 case 2 case 3 和 default 它们是程序的入口,val值判断和哪个case后面相等就从哪个入口进入,都不相等就从default进入。但是一旦找到入口之后,就没有case1 case2 case3 和 default了,程序从入口开始从上往下连续去执行。加深对上面结论的理解,将break都去掉 91.switch琐碎知识switch(表达式) case常量表达式1:语句1;ca

36、se常量表达式2:语句2;case常量表达式3:语句3;default : 语句n;第一条 所有case后面的常量表达式为了便于描述我们姑且称之为标签。这些标签都只能是(1)枚举常量(有些书中称之为枚举元素)(2)数值常量(3)字符常量(4)常变量(5)宏名中的一种。注意:普通变量,枚举变量是不能作为标签使用的。第二条 switch(表达式)中的表达式允许是任何类型,但是VC+中只允许为int或char类型,就说具体软件中做了一些限制。switch(i) case 1: 语句1;case 2: 语句2;default : 语句3; /有些SB有毛病把default写到前面case 3: 语句4

37、; 当i = 1时,从case 1处往下一个不落的执行当i = 2时,从case 2处往下一个不落的执行当i = 3时,只执行case 3一句当i = 4时,从default处往下一个不落的执行switch是选择不是循环,如果在switch中出现了break语句,该语句的功能是退出switch语句并转去执行switch下面的语句。在switch中出现continue是错误的,除非switch就属于for或while循环的一部分。92.break的用法break如果用于循环是用于终止循环break如果用于switch是用于终止switchbreak不能直接用于if(语法错误),除非if属于循环内

38、部的一个子句break用于一个for循环现在想知道break是用来终止if还是终止for?可以这么想,如果是用来终止if,那么为什么规定不能直接用于if?如用来终止if,那么应该有三个嘿嘿;如用来终止for,那么应该啥也没有果然是啥也没有,所以break虽然是if内部的语句,但终止的却是外部的for循环。break用于多个for循环break如果用于终止第一个 for,应该啥也不输出,如果用于终止第二个for,应该输出三个嘿嘿。 看来break只能终止距离它最近的包含它的(这一条不能忽略!)循环break用于多个switchbreak只能终止距离它最近的tinue的用法用于跳过本次循环余下的语

39、句,转去判断是否需要执行下次循环在for循环中for(1; 2; 3) A; B; continue;C;D; 如果执行continue,则执行完后,会执行语句3(是语句3别记错了!),C和D都会被跳过去,即C和D不会被执行。在while循环中while(表达式) A; B; continue;C;D; 如果执行continue,则执行完后,会执行表达式,C和D都会被跳过去,即C和D不会被执行。如果把for转换成while,注意把3放在continue的上面不是下面,否则3就不会被执行了。实际应用的例子:在41节中,scanf怎么保证用户输入的垃圾值不会被接受?两个scanf之间加入两行代码w

40、hile(ch = getchar()!= n) continue;解析:这个不太好理解() getchar()是个函数,要求用户从键盘输入一个字符。再把这个字符赋给ch。(这个很重要,就是ch替下面那个scanf接收了用户输入的垃圾值) 如果ch不是换行符,括号里就为真,就去执行continue。continue用于跳过本次循环余下的语句,转去判断是否需要执行下次循环。当然现在没有余下的语句,就直接去判断括号里了。比如应该输入十进制给i我输入了1 asdf ddd ,当我按下回车(输完了最后要按下一个回车的!),就把1赋给i,后面这些无法赋给i,就靠getchar()去接受了!第一个是空格,

41、赋给ch,空格不是换行符,然后continue,返回while表达式,getchar()又把a读取到了,赋给ch,ch又不是换行符最后getchar()读取到了你按下的那个回车,赋给ch,然后while循环就终止了。就是说getchar()替下面那个scanf把余下的垃圾值都接受了,然后一次又一次的赋给ch了。所以ch的值就是一个回车符,可以将它输出试试!注意ch是个char类型! 可以看出ch是个换行符!continue用法测试1注意,continue虽然放在if中,但它针对的仍然是循环,而if不是循环,所以continue执行后转去执行while(i5);。这个例子输出值是9,自己算一下就

42、明白continue的用法了。continue用法测试298.数组的简单使用格式注意是从a0开始,不是从a1开始!数组有5个元素,最后一个是a4不是a5!a0表示数组中第1个元素,a1表示数组中第2个元素,所以ai表示数组中第(i+1)个元素。输出方法-借助for循环 99.为什么需要数组为了解决大量同类型数据的存储和使用问题为了模拟现实世界101.一维数组怎样定义一维数组为n个变量连续(一定是连续)分配存储空间所有的变量数据类型必须相同所有变量所占的字节大小必须相同初始化完全初始化 int a5 = 1,2,3,4,5;不完全初始化 int a5 = 1,2,3; 未初始化的元素自动为0不初

43、始化 int a5; 所有元素是垃圾值清零int a5 = 0; 错误写法! C-1.int a5;a5 = 1,2,3,4,5; /错误的!虽然看样子很正确()只有在定义数组的同时可以整体赋值,其他情况下整体赋值都是错误的!因为int a5; a是数组名,5是长度即个数。而下面那个a5表示的是数组中第6个元素,5代表下标,表示元素的位置是第6个元素。首先最后一个元素是a4没有a5,然后把5个数字赋给一个元素也不行。C-2. int a5 = 1,2,3,4,5;a5 =10; /错误,因为没有a5元素,最后一个是a4C-3.把a数组中的值全部赋值给b数组 错误写法: b = a; /错误!因

44、为数组名代的不是数组所有元素,代表的是第一个元素的地址,指针讲 正确写法:for (i = 0;i 5;i+)/i从0开始 bi = ai; 赋值排序,求最大最小值,倒置,查找,删除,插入这些不用自己写,别人都已经设计好了,拿过来用就行了。102.二维数组int a34;总共是12个元素,可以当成3行4列看待,分别是a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23aij 表示第i+1行,j+1列的元素int amn;该数组右下角最后一个元素是am-1n-1初始化int a34 = 1,2,3,4,5,6,7,8,9,10,11,12; /严重不推荐!推

45、荐下面这样写,别忘了最后一个分号!输出 如果想对输出进行对齐控制 负号表示左对齐,5表示一个数占5个光标的位置这个不重要,因为对齐不是靠printf来控制。103.是否存在多维数组不存在,因为内存是线性一维的。n维数组可以当成每个元素是(n-1)维数组的一维数组。上句话不好理解,举例:int a34; 该数组是含有3个元素的一维数组,只不过每个元素都可以再分成4个小元素int a345; 该数组是含有3个元素的一维数组,只不过每个元素都是4行5列的二维数组106-107.为什么需要函数+什么是函数避免了重复性操作,有利于程序的模块化什么是函数?函数是C语言的基本单位,类是C+,C#,Java的

46、基本单位。逻辑上:能够完成特定功能的独立的代码块物理上:能够接收数据(当然可以不接收)能够对接收的数据进行处理(不处理没啥意义())能够将处理的结果返回(当然也可以不返回任何值)例子1:函数有返回值例子2:函数无返回值综上:函数是个工具,它是为了解决大量类似问题而设计的,函数可以当做一个黑匣子,编好的函数,我输入处理数据,它输出处理结果,至于它内部怎么实现的就不用操心了。黑匣子 输入输出108.如何定义函数?函数的返回值类型 函数的名字(函数的形参列表) 函数的执行体函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法函数的返回值的类型也称为函数的类型,因为如果”函数名字前函数的返

47、回值类型”和函数的执行体中”return的表达式的类型”不同的话,以”函数名字前函数的返回值类型”为准。109.return和break的区别复习92节breakbreak如果用于循环是用于终止循环break如果用于switch是用于终止switchbreak不能直接用于if(语法错误),除非if属于循环内部的一个子句如果break没有包含在for的括号里单独出现,就会出现错误把break换成return 这么看return不是用来终止for循环的,是用来终止所在的函数的。return和函数匹配。子函数中return的作用:终止被调函数,向主调函数返回表达式的值;如果表达式为空,就只终止函数,

48、不向主调函数返回任何值把上例子中for的括号去掉110.函数的分类有参和无参有返回值和无返回值库函数和用户自定函数,值传递函数和地址传递函数主函数和普通函数背下来:一个程序必须有且只有一个主函数,主函数是程序的入口,也是函数的出口主函数可以调用普通函数,但是反过来不行普通函数可以相互调用111.函数举例求最大值的两种子函数子函数1 子函数2 两种方式比较:max1功能是两个,就是找到最大值,对最大值进行处理。max2的功能就是寻找最大值,至于怎么处理要看main函数。判断一个数是否是素数,看语法! 写成子函数的形式,注意bool类型,有true和false两个值 113.函数的声明子函数要定义

49、在主函数上面才可以不出错,因为编译是从上往下执行,如果子函数在下面,编译到主函数时不知道那是个什么东西。所以要加函数的声明。例子1例子2 / 综上,如果函数调用写在了函数定义的前面,必须加前置声明函数前置声明作用:告诉编译器即将可能出现的若干个字母代表的是一个函数告诉编译器即将可能出现的若干个字母代表的函数的形参和返回值的具体情况函数声明是一个语句,末尾必须加分号对库函数的声明是通过#include来实现的函数声明时形参名字可省略如void f(int); 一般不写形参114.函数的形参和实参个数相同,位置一一对应,数据类型相互兼容附:代码整体左移右移就选中用Tab和Shift + Tab。1

50、15.如何在软件开发中合理的设计函数来解决实际问题一个函数的功能尽量独立,单一多学习,多模仿牛人的代码120.函数的作用域和存储方式按作用域分:全局变量 局部变量局部变量:在一个函数内部定义的变量或者函数的形参例如:void f(int i) int j = 20; / i和j都属于局部变量,只能在本函数内部使用全局变量:在函数外部定义的变量使用范围是从定义位置开始到整个程序结束,定义位置上面就管不了了局部变量和全局变量命名一样的问题?局部变量会屏蔽全局变量 按存储方式分:静态变量 自动变量 寄存器变量 外部参照引用型121.指针初次介绍内存:内存的单元的编号不是以位算的,是以字节算的。不是1

51、个0或1是一个编号,而是8个0或1合在一起是一个编号。这个编号就是地址。122.指针的重要性表示一些复杂的数据结构、快速的传递数据并减少内存的占用、使函数返回一个以上的值(130节)、能直接访问硬件、能够方便的处理字符串、是理解面向对象语言中引用的基础总之,指针是C语言的灵魂。123.什么是地址内存单元的编号,从零开始的非负整数。范围:4G(0到4G-1)地址总线数据总线控制总线内存条CPU单看地址总线1根线能控制一个内存单元(字节),0或1。两根线有四种状态00 01 10 11。一般机器有32根线,就有232种组合。就是地址总线能控制232字节。1K = 210B 1M = 210K =

52、220B 1G = 210M = 230B 232 = 22 X 230B = 4G 所以一般机器内存最大就4G。124.什么是指针指针就是地址,地址就是指针。指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量指针和指针变量是两个不同的概念,但是要注意通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样。指针的本质就是一个操作受限的非负整数。非负整数可以进行加减乘除,但是地址只能进行相减。125.基本类型的指针int *p; /*p是变量的名字,int *表示p变量存放的是int类型变量的地址int *p;不是定义了一个名字叫*p的变量()应该这样理解,p是变量名,定义

53、是p不是*p,p变量的类型是int *类型,所谓int *类型,实际就是存放int变量地址的类型*/int i = 3;p = &i; /取地址符!不能写成p = i; 因为int *类型,只能存放地址。/*1.p保存了i的地址,因此p指向i2.p不是i,i也不是p,修改其中一个的值不影响另一个 3.如果一个指针变量指向了某个普通变量,则*指针变量就完全等同于普通变量例子:如果p是个指针变量,并且p存放了普通变量i的地址则p指向了普通变量i,*p就完全等同于i。就是p = &i;那么*p = i。解释:*p代表以p的内容为地址的变量(语法就这么规定的!) p的内容是&i,*p就是以i的地址为地

54、址的变量,以我的家为家的人就是我,所以以i的地址为地址的变量就是i,所以*p=i。*/126. 基本类型的指针常见错误解析错误例子1编译时没有错误,但是一旦执行就死机了。因为*p上面少了一步p = &i; 解析:表面上错误原因是p没有指向,但是定义了p它就有指向了,指向哪就不知道了。p没有初始化,*p代表以p的内容为地址的变量 ,变量的本质就是内存中一段存储空间,*p是个垃圾值。*p = i的结果就是把i的值赋给了我不知道的存储空间。操作系统只给我分配了i和p的空间,但是我用了其他的空间,别的程序可能在使用我用的其它空间,所以就出错了。错误例子2编译时就会出错,因为p是int *型,而*q是i

55、nt变量。错误例子3语法上没错,但是死机。*p就是i,和例子1的错误一样。正确的方法是 错误例子4把p = q变成了q = p,语法没错,但是死机已经定义了p和q,虽然不知道q指向哪里,但是让q = p没问题,输出q也没问题,但是输出*q就有问题了。同例子1 127.经典指针程序-互换两个数字错误方法,加深函数理解互换没有成功。原因是1:互换的是形参a和b的值,和主函数的a和b没有影响。2:执行完huhuan(a,b);后形参a和b分配的空间被释放,但是主函数a和b分配的空间没有被释放,下面输出的a和b是主函数的,没有互换。这个问题的关键就是怎么通过改变形参的值来影响实参的值?错误方法2这么写

56、仍然没有什么意义,就是把a的地址发给p,把b的地址发给q,然后再把p和q的值给互换了,对a和b没有影响注意一个问题:a和b的分配的地址我们用语言改不了的!免得走误区!正确方法 解析:虽然子函数执行完毕p和q的空间都被释放了,但是在执行子函数的过程中已经把p指向的a和q指向的b的值给互换了。129.实参和形参永远是不同的变量p是int *型,只能指向int 型实参和形参永远是不同的变量联系127节互换两个数字。写一个程序验证一下是不是同一个变量。 两个i都是局部变量,当然不可能一样。所以修改形参的值不可能影响实参的值。130.指针可以使被调函数修改主调函数多个变量的值如果没有指针上面已经说了修改

57、形参的值不可能影响实参的值,但是子函数会有一个返回值,可以把返回值赋给一个实参。如果使用指针 总结:如何通过被调函数修改主调函数普通变量的值?实参必须为该普通变量的地址形参必须为指针变量在被调函数中通过”*形参名 = XXX”的方式就可以修改主调函数相关变量的值131-136.专题:一维数组和指针关系一维数组名的含义一维数组名是个指针常量(指针型!常量!),它存放的是一维数组第一个元素的地址把a数组中的值全部赋值给b数组 错误写法: b = a; /错误!因为一维数组名代的不是数组所有元素,代表的是第一个元素的地址 正确写法:for (i = 0;i 成员名所以说这两种方式是等价的!通过函数完

58、成对结构体变量的输入和输出输入输出 总结,输入的时候必须发送st的地址,因为要对st的内容进行修改。但是输出的时候没有必要再发送st的地址了,只需要把st的内容发给形参,再把形参输出就行了。附:注意一个问题:子函数定义如果不在主函数上面写,那么要先声明(别忘了写分号)!然后子函数定义是写在主函数下面的,写在主函数外部!不是写在主函数里面!主函数里面不包括子函数的定义,只有子函数的调用语句!曾经这个错误差点让我抓狂!例如:输出应该发送内容还是发送地址上例的输出函数是应该发送地址还是发送内容,上面例子是发送内容,但是实际应该发送地址!因为这样可以减少内存的占用,也可以提高执行速度。原因忘了看视频。指针优点大总结表示一些复杂的数据结构(C语言不讲)快速的传递数据并减少内存的占用(结构体章节序号6)使函数返回一个以上的值(130节)能直接访问硬件能够方便的处理字符串是理解面向对象语言中引用的基础结构体变量的运算结构体变量不能进行加减乘除,但是可以相互赋值。struct Student in

温馨提示

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

评论

0/150

提交评论