《《郝斌C语言自学视频》笔记(共83页).docx》由会员分享,可在线阅读,更多相关《《郝斌C语言自学视频》笔记(共83页).docx(82页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上专心-专注-专业郝斌 C 语言自学视频笔记 v1.1作者:星辰变 71目录的编号对应视频的编号,专为懒得打字做笔记的吧友所著!再次感谢郝斌老师,带我们装逼带我们飞(_)目录目录精选优质文档-倾情为你奉上专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业1.1.所用编程软件所用编程软件视频中用的编程软件是 VC+6.0,本笔记用的编程软件是 VS2010 和 Dev C+5.11。要求变量定义写在最前面,不能中途定义,否则编译时会出错。要求变量定义写在最前面,不能中途定义,否则编译时会出错。17.17.什么是数据类型什么是数据类型整型:整型 int-4 字节长整
2、型 longint-8短整型 shortint-2浮点型:float-4double-8字符 char-1所占字节数不一定都是这样,但是比如长整型所占一定大于等于整型。复合数据类型:结构体枚举共用体18.18.什么是变量什么是变量int i;/VC+6.0 请求操作系统把内存条中的一个空闲单元和 i 产生关联i=3;/3 最终是存放在内存中,程序终止之后 3 所站的空间被释放如果不使用变量,要自己去找内存中的空闲单元,有了变量就不用考虑了。精选优质文档-倾情为你奉上专心-专注-专业变量的本质就是内存中一段存储空间变量的本质就是内存中一段存储空间20.20.变量为什么必须初始化变量为什么必须初始
3、化所谓初始化,就是赋值。当软件运行完毕后,操作系统将回收该内存空间,以便再次分配给其他软件使用。 (注意:操作系统并不清空该内存空间中遗留下来的注意:操作系统并不清空该内存空间中遗留下来的数据数据)综上,一个软件所分配的空间中极可能存在着以前其他软件使用过后的残留数据(垃圾数据) 。所以通常我们为一个变量,为一个数组,分配好存储空间之后都要对该内存空间初始化!21.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
4、 j;i=3;j=5;int i,j;i=j=5;等价于 int i,j;i=5;j=5;22.22.什么是进制什么是进制N 进制就是指逢 N 进 1。我们计算机只识别二进制。C 语言规定八进制前要加 0(注意是零不是字母 O) ,十六进制前要加 0 x 或者 0X,十进制前什么都不加。在汇编中:在数字后加字母 B 表示二进制,加 O 表示八进制,加 D 表示十进制,加 H 表示十六进制。例如:1011B 也记为(1011)21357O 也记为(1357)82049D 也记为(2049)103FB9H 也记为(3FB9)16printf 中,%d 表示以十进制输出;%x 或%X(决定输出字母的
5、大小写)以十六进制输出;%O(这次是字母不是零了! )表示以八进制输出。23.23.常量在常量在 C C 语言中是如何表示的语言中是如何表示的A整数:八进制前要加 0(注意是零不是字母 O) ,十六进制前要加 0 x 或者 0X,十进制前什么都不加。B浮点数:传统的写法 float = 3.2;科学计数法 float x = 3.2e3;/x 的值是 3200float x=123.45e-2; /x 的值是是 1.2345精选优质文档-倾情为你奉上专心-专注-专业编译时会有个警告,如图为什么呢?C 语言中, 无论是传统写法还是科学计数法, 默认是 double 型。 double赋给 flo
6、at 会丢失精度。可以选择忽略警告,也可以选择加个 F 变成 123.45e-2F。这样编译时就没有警告了。注意一个问题,为了解决上述窗口一闪而过,我们要加上头文件(如图)并在main 函数结尾前加上(如图) 。C字符:单个字符用单引号括起来,如A。AB错误,”AB”正确。字符串用双引号括起来。A正确,因为A代表了A 0的组合。可以想成一个字符串就一个字符。24.24.常量是以什么样的二进制代码存储在计算机中常量是以什么样的二进制代码存储在计算机中整数是以补码的形式转换为二进制代码存储在计算中的。实数是以 IEEE754 标准转换为二进制代码存储在计算中的。字符本质上与整数的存储方式相同。精选
7、优质文档-倾情为你奉上专心-专注-专业26.26.代码的规范化代码的规范化A. 括号一敲敲一对(),敲完括号再写内容B注意加空格。比如 if ()/if 要敲空格再加括号比如 Int a = 1;/等号两边要加空格比如 x1=(-b+sqrt(delta)/(2*a); /这些运算之间要加空格C注意从属关系要进行缩进。选中要缩进的多行代码按选中要缩进的多行代码按 Tab,就一起右移了,就一起右移了,Shift+Tab 就一起左移回来了。就一起左移回来了。D代码之间要适当的空行。相同功能的写在一起,然后空一行再写下一部分相对独立功能的代码。27.27.什么是字节什么是字节字节是存储数据的单位,并
8、且是硬件所能访问的最小单位。1 字节=8 位,这是固定不变的。CPU 只能直接处理内存里面的数据,硬盘的数据必须调入内存才能处理。硬件上最小的单位是位,不是 0 就是 1。但是但是 CPU 只能到字节上只能到字节上,不能准确控制不能准确控制到某一位。控制到位上可通过位运算符。到某一位。控制到位上可通过位运算符。下面是内存条28.28.不同类型数据之间相互赋值的问题不同类型数据之间相互赋值的问题这个问题是 C 和 C+所独有的,如果想深入了解 C 和 C+必须搞清楚。如果想搞清楚必须懂补码。2929C Charhar 使用常见问题使用常见问题A. char ch = A;/正确char ch =
9、”AB”;/错误,不能把字符串赋给单个字符char ch =”A” ;/错误char ch =AB;/错误B以下写法是错误的!精选优质文档-倾情为你奉上专心-专注-专业下面这么写就对了。30.30.什么是什么是 ASCIIASCII 码码ASCII 不是一个值,是一种规定。它规定不同的字符是使用哪个整数值去表示。比如A-65/A 这个字符在 ASCII 中是用 65 来表示的a-97,0-48所以说字符本质上与整数的存储方式相同。33.printf33.printf();将变量的内容输出到显示器上();将变量的内容输出到显示器上四种用法:A.printf(”字符串”) ;B.printf(”输
10、出控制符”,输出参数) ;精选优质文档-倾情为你奉上专心-专注-专业C.printf(”输出控制符 1 输出控制符 2”,输出参数 1,输出参数 2) ;要是想让 35 之间有空格要是想让 35 之间有逗号还有更清楚的,写上 i = 3,j = 5 如下图注意一个问题,下面写法是错误的,虽然编译时没有问题。注意一个问题,下面写法是错误的,虽然编译时没有问题。因为输出控制符和输出参数的个数不一一对应。因为输出控制符和输出参数的个数不一一对应。D. printf(”输出控制符 非输出控制符”,输出参数) ;输出控制符包括%d%ld%c%f%lf%o%s%x(或%X 或%#X 或%#x)这么看还是%
11、#X 比较好! !非输出控制符原样输出,在上面 C 中就是例子。34.34.如何让程序更有保存价值如何让程序更有保存价值在开头加上时间,功能,目的等。在末尾加上在某款软件中在某款软件中的输出结果和总结。补充:怎么复制补充:怎么复制.exe.exe 黑窗口中的数据黑窗口中的数据右键标记或者全选,标记完了再点右键,然后就不是被选中状态了。这时到目标处 ctrl+V 就 OK 了。精选优质文档-倾情为你奉上专心-专注-专业36.36.为什么需要输出控制符为什么需要输出控制符A.0 和 1 组成的代码可以表示数据也可以表示指令。 一串 01 代码本身没有实际含义,关键是看怎么用输出控制符去解读。B.
12、0 和 1 组成的代码表示的是数据的话,那么用不同的输出格式输出就会有不同的结果。38+39.scanf38+39.scanf();用法:通过键盘将数据输入到变量中();用法:通过键盘将数据输入到变量中scanf(”输入控制符”,输入参数) ;/当然可以含有非输入控制符功能:将从键盘输入的字符,转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。解析:A.读着云里雾里。在键盘输入 123 不是整型数字 123,而是字符 1 字符 2 字符 3,操作系统就是这么规定的。%d 的作用就是把字符 1 字符 2 字符 3 转换成一个十进制整数。B.输入参数是输入参数是&i,就是存入
13、以,就是存入以 i 的地址为地址的变量,就是的地址为地址的变量,就是 i 变量!就像把我的变量!就像把我的家作为家的人,就是我这个人家作为家的人,就是我这个人! !服了!服了下面是含有非输入控制符的例子。精选优质文档-倾情为你奉上专心-专注-专业注意:A.不要忘了加上取地址符不要忘了加上取地址符&。B.如果 scanf() ;中含有非输入控制符,那么输入时要把它对着输一遍,非输入控制符不会和 printf() ;一样显示在黑窗口上!C.因为是%d 输入,所以输入 m123n 时自动把 n 屏蔽了。D.有了 scanf 了就不需要在定义变量时赋初值了,当然附了无影响。E.scanf 中不要加非输
14、入控制符中不要加非输入控制符, 用户并不知道你加的是什么用户并不知道你加的是什么, 没法照着再输一遍没法照着再输一遍! !40.40.一次给多个键盘变量赋值一次给多个键盘变量赋值就算我把%d%d 连在一起写,我输入 12 按回车也不会 i = 1,j = 2,他会一直换行光标闪烁等我我输入 j 的值。还是%d%d 连在一起写,我输入 1,空格空格/回车回车,输入 2,输完后回车就 i = 1,j = 2。A.就是我%d%d 不管之间连在一起还是加几个空格,我都可以在黑窗口中用空格把输入的三个数分开。B.但是我要是之间加逗号和若干空格,那我输入的两个值需要以逗号(或逗号加若干空格)相隔。如果仍然
15、以空格相隔,那么只能是第一个值正确。精选优质文档-倾情为你奉上专心-专注-专业41.41.第一部分:如何优雅地使用第一部分:如何优雅地使用 scanfscanfA.上面先加一条提示信息,例如printf(”请输入两个值中间以空格/逗号分隔:”) ;B.scanf 尽量不使用非输入控制符,尤其是尽量不使用非输入控制符,尤其是n! !有时候莫名其妙的不好用就是随!有时候莫名其妙的不好用就是随手加了个手加了个n 引起的引起的! !不过加空格没事(_)scanf(%dn,&i); /n 加进来后你想输出 123 就要输入 123n总结:一个取地址符&,一个换行符n,scanf 和 printf 不要弄
16、混了!C.(难点! )scanf 对用户非法输入的处理()C-1.i 和 j 都是%d 输出,i 在前面,输入 123m,它找到了 123 作为合法的%d 字符,然后 j 开始从 m 开始读,开始就出错了。但是我要是定义 charj; 然后 scanf 和 printf 都用%c 那就 i = 123,j = m,当然这也是错误的输入方式。然后还有一个问题,我要是输入 123mn 呢?j = mn?别忘了别忘了 char 只能存放一个字只能存放一个字符啊!所以只能放符啊!所以只能放 m 啊!啊!C-2.如果输入 m123,开始读就错了,往后都错了,如下图。精选优质文档-倾情为你奉上专心-专注-
17、专业注意啊,这个地方要好好的理解一下啊! !上面的例子是说输入错误的情况下是输一次值回车就报错了。因为出错的部分不会自动丢弃因为出错的部分不会自动丢弃,等待下一次输入时再把等待下一次输入时再把出错的部分赋给下一个变量出错的部分赋给下一个变量!直接就不用你给下一个变量输入了直接就不用你给下一个变量输入了!然后往后就全然后往后就全错了!好贱啊!错了!好贱啊!上句话不理解可以看 C-6,C-7。C-3.我再次输错值,我输入 123 空格空格 456还是一次输入,按回车就这个结果。C-4.我要是输入 123 空格 456 空格 789,结果如图。个人猜测应该是检测到 123 遇到空格就把 123 给
18、i,但是空格不影响往下检测,检测到 456 遇到空格就把 456 给了 j,再没有输入的值了就停了。C-5.我要是输入 123(可以加一堆空格) ,他会继续光标闪烁提醒我输入第二个值,我输入 456(可以加一堆空格)再按回车结果如下C-6. 正确的输入方式正确的输入方式也就是按照流程的意思就是 C-5 中输入 123 回车输入 456 回车。所以编写程序时可以按照下图,这样就引导用户按照正确的输入方式输入。C-7.按照上面的引导出错的话,结果如下图。精选优质文档-倾情为你奉上专心-专注-专业41.41.第二部分:保证前面输入的垃圾值不会被接受第二部分:保证前面输入的垃圾值不会被接受这样就出现一
19、个问题,当我需要对变量键盘赋值时,前面的输入可能会遗留一些垃圾的输入值,就像上面例子以前有些值没有放进去,而是放进这次输入了,然后往后就全错了。真不知道为什么设计者不直接自动丢弃错误部分呢?!所以我们需要这样一个功能,输入值时要保证前面输入的垃圾值不会被接收。所以我们需要这样一个功能,输入值时要保证前面输入的垃圾值不会被接收。两个 scanf 之间加入两行代码while( (ch = getchar() ) !=n)continue;如图,这样在输入时前面输入的垃圾值就没有影响了,好神奇啊(_)ch 是 char 类型的!另外很多编好的代码拿过来就能用,不必自己再绞尽脑汁的去想!42.42.运
20、算符的分类运算符的分类算数运算符:+-*/(除)%(取余)关系运算符:=关系关系逻辑逻辑赋值赋值43.43.除法与取余除法与取余除法/的运算结果和运算对象的数据类型有关,两个都是 int,则商就是 int,若商有小数,则去除小数部分;被除数和除数中有一个或两个是浮点型,那结果就是精选优质文档-倾情为你奉上专心-专注-专业浮点型,不去除小数部分。如 16/5=316/5.0=3.2-13/4=-3-13/-3=43/5=0有一个常用的计算:m = 1234;m /= 10;第 1 次 m = 123第 2 次 m = 12第 3 次 m = 1第 4 次 m = 0取余%的运算对象必须是整数,
21、结果是整除后的余数, 余数的符号与被除数相同余数的符号与被除数相同。13%3=113%-3=1-13%3=-1-13%-3=-13%5=344.44.逻辑运算符逻辑运算符&:真&真为真,其余都是假|:假|假为假,其余都是真A.C 语言对真假的处理:非零是真,零是假。真用 1 表示,假用零表示。分析:m 的值不是 0 就是 1。32 是真,k = 8 也是真,所以 m 是 1。B.要是 k = 0 结果为C.k 的值不是想得那么简单!的值不是想得那么简单!我擦,k = 20!为什么 k = 5 没有被执行! !&左边的表达式为假的时候,右边的左边的表达式为假的时候,右边的表达式就不执行了!因为一
22、个是假的肯定就是假的了!表达式就不执行了!因为一个是假的肯定就是假的了!同样啊,对于同样啊,对于|,左边的表达式为真的时候,右边的表达式就不执行了!,左边的表达式为真的时候,右边的表达式就不执行了!45.45.初学者学习运算符的一些建议。初学者学习运算符的一些建议。A忘了的话就查运算符和结合性表。B.为了让别人更好清楚,把想让它优先级高的用括号括起来。附:谭浩强 著C 程序设计 (第四版)P378 运算符和结合性表运算符与结合性运算符与结合性优先级运算符含义要求运算对象的个数结合方向1()圆括号左-右下标-指向结构体成员精选优质文档-倾情为你奉上专心-专注-专业.结构体成员2!逻辑非1 (单目
23、运算符)右右- -左左按位取反+自增-自减-负号(类型)类型转换*指针&取地址sizeof长度3*乘法2 (双目运算符)左-右/除法%求余4+加法2左-右-减法5右移6 =关系2左-右7=等于2左-右!=不等于8&按位与2左-右9按位异或2左-右10|按位或2左-右11&逻辑与2左-右12|逻辑或2左-右13?:条件3 3 (三目运算符三目运算符)右右- -左左14= += -= *=/= %= =.单目算术(先乘除,后加减)关系逻辑(不包括!)条件赋值逗号以上优先级从高到低。位运算符的优先级比较分散:有的在算术之前如,有的在关系之前如,有的在关系之后如&、|。为了容易记忆,使用为了容易记忆,
24、使用位运算符时可加圆括号。位运算符时可加圆括号。46.46.黑窗口不要重复打开和其属性修改黑窗口不要重复打开和其属性修改注意一个问题:经常已经打开.exe 的黑窗口了,还去点击启动调试(F5)又打开第二个黑窗口了。要把前一个黑窗口关了,再修改再打开第二个! !要是已经有黑窗口了,再点击编译(Ctrl+F7)就会弹出一个对话框,这时候别困惑啥意思, 就是把已经打开的黑窗口关了!在黑窗口的边框上右键-属性,可以修改光标大小,字体,布局,颜色等,不过默认的挺好的。52.if52.if 最简单用法最简单用法流程控制的分类:顺序、选择(if 和 switch) 、循环53.if53.if 的范围的范围A
25、.if (表达式)语句 A;语句 B;if 默认只能控制语句 A 是否执行,语句 B 一定会执行。它正确的格式应该是精选优质文档-倾情为你奉上专心-专注-专业if (表达式)语句 A;语句 B;B.if (表达式)语句 A;语句 B;此时 if 可以控制语句 A 和语句 B。综上所述,if 默认只能控制一个语句是否执行。如果想控制多个语句是否执行,就要把它们用括起来。54.if54.ifelseelse的用法的用法注意一个问题啊注意一个问题啊,在新建的时候起名叫在新建的时候起名叫 ifelse会有问题会有问题,因为因为 else 后面有三个后面有三个点,加上点,加上.c 作后缀就是作后缀就是
26、ifelse.c,这样命名不行!新建命名的时候不要加点!,这样命名不行!新建命名的时候不要加点!(附: .cpp是C+的源程序。 在国内, C+读作”C加加”, 在国外读作”CPlusPlus”,即”.cpp”。C 的源程序后缀就是.c。 )else 后面也是默认只能控制一个语句是否执行。如果想控制多个语句是否执行,就要把它们用括起来。55-1.if55-1.ifelseelse ififelseelse的用法的用法格式:if (1)A;else if (2)B;else if (3)C;精选优质文档-倾情为你奉上专心-专注-专业else/注意!最后一个注意!最后一个 else 后面没有括号了
27、后面没有括号了! !D;说明: (1)成立 A 执行;如果(1)不成立(2)成立 B 执行;如果(1) (2)都不成立执行 C; (1) (2) (3)都不成立就执行 D 了。注意啊!有个容易犯的错误用法!注意啊!有个容易犯的错误用法!55-2.55-2.ifif 中容易犯的错误中容易犯的错误这是这是 1 个语句个语句, 不是不是 3 个个! 要是要是 3 个都会执行那是个都会执行那是 3个语句,可是只会执行一个所以是个语句,可是只会执行一个所以是 1 个语句。个语句。下面的写法就是错误的!精选优质文档-倾情为你奉上专心-专注-专业加了哈哈这个语句之后把这个整体分成了 3 个语句,语句 1 没
28、问题,语句 2 也没问题,但是语句 3 就错了!因为没有语句以 else 开头()当然,编译(Ctrl + F7)时会提示错误:57.if57.if 举例举例求分数的等级求分数的等级注意:一种错误的表达式写法!注意:一种错误的表达式写法!90 = score = 100 是是XX的的()这式子一看觉得是没啥问题,但是是这式子一看觉得是没啥问题,但是是XX的!的!因为从因为从 45 节运算符表可以看出关系运算符是自左至右执行的,就是先算节运算符表可以看出关系运算符是自左至右执行的,就是先算90 = score,这就出问题了!,这就出问题了!90 = score 的值是个逻辑值,要不是真要不是假,
29、的值是个逻辑值,要不是真要不是假,就说结果不是就说结果不是 1 就是就是 0,不管是,不管是 1 还是还是 0 小于等于小于等于 100 一定成立一定成立()综上,综上,90 = score = 90 & score b则 a 与 c 比较ac 则输出 aac 则输出 bb 再每个语句的功能 - 试数(最后一步尤其重要)精选优质文档-倾情为你奉上专心-专注-专业试数两个原则:一个是把自己当计算机,一步一步来。一个是写整齐。就一些小算法的程序:A. 尝试自己去编程解决它,基本不太可能()B. 如果解决不了,就看答案C. 关键要把答案看懂,这个要花很大的精力,也是我们学习的重点D. 看懂之后尝试自
30、己去修改程序,并且知道修改后不同输出结果的含义E. 照着答案去敲,调试错误F.不看答案,自己独立敲出来G. 如果程序实在无法彻底理解,就把它背下来62.if62.if 空语句的问题空语句的问题有时候犯错误在 if 后面加了个分号,如下图上面两种都一样,就是如果 1 大于 2 就执行这个空语句。上述就是 3 个语句了。语法上虽然没有问题,但是达不到效果了。63.if63.if 常见问题常见问题A. 上述语法没有问题,但是加了 else 语言就错了,因为没有单独以 else 开头的语句。B. 同样,elseif 和 else 后面也别加上分号! !精选优质文档-倾情为你奉上专心-专注-专业C. i
31、f (表达式 1)A;elseif (表达式 2)B;elseif (表达式 3)C;elseD;即使表达式 1 和 2 都成立,也只会执行 A 语句。因为表达式 1 成立了,就没有否则了(_)D. 能不能没有最后一个 else?if (表达式 1)A;elseif (表达式 2)B;elseif (表达式 3)C;/最后的 else 没有了,语法不会出错,但是逻辑上有漏洞。如下例子:漏洞就是我要是输入分数是 70,就没有对应的输出了!精选优质文档-倾情为你奉上专心-专注-专业E. 更加郁闷的错误 O(_)O 哈哈if (表达式 1)A;elseif (表达式 2)B;elseif (表达式
32、3)C;else (表达式 4)/ 最后一个 else 后面没有括号了! !D;不过这个错误还好,语法错误,编译时会提醒你表达式 4 后面缺少分号。可以这样理解,else 后面都是一个语句,但是没有(表达式 4)D;这种类型的语句。F.上述错误我要是表达式 4 后面加上分号呢?if (表达式 1)A;elseif (表达式 2)B;elseif (表达式 3)C;else (表达式 4) ;/ 表达式 4 后面加上分号D;和第 E 条相比语法上没有错误,编译 OK。它就等价于else(表达式 4) ;D;语法上虽然 OK,但是只会导致错误结果()67.67.初识初识 forfor 循环循环循环
33、分类:forwhiledowhile先执行”1”, ”1”完了执行”2”, ”2”成立执行”4”, ”4”完了执行”3”,”3”完了完了标志循环一次结束标志循环一次结束。然后再判断”2”决定是否进行下一次循环。如果”2”不成立精选优质文档-倾情为你奉上专心-专注-专业就退出循环了。注意:A. ”3”完了才标志循环一次结束,所以完了才标志循环一次结束,所以 i 最终值不是最终值不是 100,是,是 101! !B. ”1”永远只执行一次,”3”完了一定会执行”2”!C. 别忘了给 sum 赋初值,否则 sum 是个垃圾值。垃圾值再加上 i 还是垃圾值然后 VS 故意输出一个很大的数字告诉你你错了
34、 O(_)O 哈哈D. ”1” ”2” ”3” 之间是分号分隔,不是逗号!E. ”3”后面没有分号了()68.for68.for 最简单的应用最简单的应用- -求求 1010 以内奇数和以内奇数和注意:A. i+=2 后面没有分号! !B. 要是求 10000 以内的奇数和就是 i10000,但是怎么证明程序正确呢?就是先看 10 正确,再放大点正确,也就得出 10000 正确了。69.for69.for 和和 ifif 的嵌套使用的嵌套使用注意一个问题注意一个问题:for()后面不要加一个分号!和()后面不要加一个分号!和 if()一样!因为语法没有错误()一样!因为语法没有错误编译时检查不
35、出,一个分号又不起眼,有时候硬是让人崩溃编译时检查不出,一个分号又不起眼,有时候硬是让人崩溃()A. 求 1-12 所有能被 3 整除的数字之和这个 for 下面我没加括号,for 默认也是控制一个语句精选优质文档-倾情为你奉上专心-专注-专业B. 这个例子刚开始有点难,for 下面我加了括号输出结果是什么?分析:1 完了执行 2;2 成立执行 4;4 成立执行 5,5 完了执行 6,4 不成立执行 6,6 完了执行 3,标志循环一次结束。71.71.强制类型转换强制类型转换A. 从一个例子引出强制类型转换:1+1/2+1/3+1/100为什么 sum 结果是错误的?根据 43 节:除法/的运
36、算结果和运算对象的数据类型有关,两个都是 int,则商就是 int,若商有小数,则去除小数部分;被除数和除数中有一个或两个是浮点型,那结果就是浮点型,不去除小数部分。如 16/5=316/5.0=3.2-13/4=-3-13/-3=43/5=0取余%的运算对象必须是整数, 结果是整除后的余数, 余数的符号与被除数相余数的符号与被除数相精选优质文档-倾情为你奉上专心-专注-专业同。同。13%3=113%-3=1-13%3=-1-13%-3=-13%5=3所以从 i = 2 开始,1/i 的结果就都是 0B. 进一步研究:将 sum 变为 float 型sum = float + int 结果为
37、float ,即不同精度运算结果为高精度() 为什么 sum 结果为 0!因为因为 sum 以以%d 输出,正确应该以输出,正确应该以%f 输出!输出!这个错误也经常被忽略!这个错误也经常被忽略!C. 进一步研究:对 1/i 使用强制类型转换从 i = 2 开始,1/i 的结果就都是 0,加上强制类型转换就是 0.00000()D. 本例子正确做法,对 i 进行强制类型转换(不推荐此法,后面有简单的)精选优质文档-倾情为你奉上专心-专注-专业还有个更简单的写法还有个更简单的写法:sum = sum + 1.0 / i(_)推荐使用这个推荐使用这个注意:这里边 sum 最后结果是个浮点型,一开始
38、必须定义成 float,输出时必须是%f,定义和输出要匹配。一开始定义成 int,输出是%f 或者一开始定义成float,输出时是%d,结果都是错误的!E. 为什么不直接定义成 float i?下一节会讲到。综上,强制类型转换格式(数据类型) (表达式) ,作用是把表达式的值强制转换为前面写的数据类型,例子(int) (4.5 + 2.2)值为 6(float) (5)值为 5.72.72.浮点数存储带来的问题浮点数存储带来的问题float 和和 double 都不能保证精确存储都不能保证精确存储()A. 面试题举例:有一个浮点型变量 x,如何判断 x 的值是否为 0错误写法:if (x =
39、0)是else不是因为 x 赋值为 0,但是存储的只是 0 的近似值正确写法:if (|x 0.| = 0.)是else不是表示 x 和某一个很小很小的数字相差非常非常小,x 就可以当 0 来看待了B. 为什么循环中更新的变量不能定义成浮点型为什么循环中更新的变量不能定义成浮点型就比如 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.75.复习进制的知识复习进制的知识搞清楚 4 个问题A. 什么是 n 进制?就是逢 n
40、进 1B. 把 r 进制转化成十进制这个简单,比如说(234)5= (4x50+3x51+2x52)10(234C)16=(12+4x16+3x162+2x163)10C. 把十进制转化成 r 进制这个算就麻烦。除 r 取余,直至商 0,余数倒序排列D. 不同进制所代表的数值之间的关系比如十进制的 3981 转换成十六进制是 F8D,它们的本质都是同一个数字E. 二进制转十进制的最快方法是先二进制转十六进制,再十六进制转十进制76.76.运算符补充运算符补充自增自增/ /自减自减+在变量的后面,首先对变量取值,然后再参与自增运算;+在变量的前面,首先对变量做自增运算,然后再对变量取值。-精选优
41、质文档-倾情为你奉上专心-专注-专业A. 为什么会出现自增?i += 1 就行了为何还会有 i+?一个是代码看着更精炼,一个是自增的速度更快(暂不深究) 。B. 使用自增时要注意的问题编程时应该尽量屏蔽掉前自增和后自增的差别。就是 i+和+i 单独成一个语句,这样没有区别,但是不要作为一个更大的表达式的一部分!77.77.运算符补充运算符补充三目运算符三目运算符格式A ?B : C等价于 if (A)B;elseC;78.78.运算符补充运算符补充逗号表达式逗号表达式格式(A, B, C, D)从左到右执行,最终表达式的值是最后一项的值精选优质文档-倾情为你奉上专心-专注-专业说是逗号是一个顺
42、序点,所有的副作用必须在下个语句前生效。所以 j+完了 j就加 1,+j 完了 j 又加 1 变成 4。注意注意 j+2 的值是的值是 6 但是但是 j 的值没有改变,因为的值没有改变,因为没有把没有把 j+2 的值赋给的值赋给 j,不是,不是 j += 2!最后最后 j - 3 的值是的值是 4-3=1。82.while82.while 循环循环while (表达式)语句;解释:表达式成立执行语句,完了再判断表达式,再执行语句while 默认控制一个语句83.for83.for 和和 whilewhile 的比较的比较比如求 1 到 100 的和,分别用 for 和 while 来写-综上,
43、for 和 while 可以相互转换for (1; 2; 3)A;等价于1;while (2)精选优质文档-倾情为你奉上专心-专注-专业A;3;虽然 for 和 while 可以相互转换,但 for 的逻辑性更强,更不容易出错,我们推荐多使用 for。87.87.何时用何时用 while,while,何时用何时用 forfor没法说,用的多了自然就知道了88.do88.dowhilewhileA. 格式dowhile(表达式);/后面这个分号不能丢了后面这个分号不能丢了! !B. dowhile 并不等价于 for,当然也不等价于 while。因为 dowhile 一定会执行一次,而那两个可能
44、一次也不执行。C. 主要用于人机交互。例如写的禹山溶解氧执行,原来计算只能输入一次,现在可以不断的输入!精选优质文档-倾情为你奉上专心-专注-专业-D. 上述程序改进。上述程序没有结束啊,黑窗口一直在闪烁等待你输入,但是你输了几个想要结束咋办()精选优质文档-倾情为你奉上专心-专注-专业通过以上例子就理解了为什么 dowhile 用于人机交互(_)90.switch90.switch 用法简介用法简介A. 含有 break-精选优质文档-倾情为你奉上专心-专注-专业B. 将 case 1 后面的 break 去掉-结论:case 1case 2case 3 和 default 它们是程序的入口
45、,val 值判断和哪个case 后面相等就从哪个入口进入,都不相等就从 default 进入。但是一旦找到入但是一旦找到入口之后,就没有口之后,就没有 case1case2case3 和和 default 了,程序从入口开始从上往下了,程序从入口开始从上往下连续去执行。连续去执行。C. 加深对上面结论的理解,将 break 都去掉精选优质文档-倾情为你奉上专心-专注-专业91.switch91.switch 琐碎知识琐碎知识A. switch(表达式)case 常量表达式 1:语句 1;case 常量表达式 2:语句 2;case 常量表达式 3:语句 3;default :语句 n;第一条所
46、有 case 后面的常量表达式为了便于描述我们姑且称之为标签。这些标签都只能是(1)枚举常量(有些书中称之为枚举元素) (2)数值常量(3)字符常量(4)常变量(5)宏名中的一种。注意:普通变量变量,枚举变量变量是不能作为标签使用的。第二条switch(表达式)中的表达式允许是任何类型,但是 VC+中只允许为 int 或 char 类型,就说具体软件中做了一些限制。B. switch(i)case 1:语句 1;case 2:语句 2;default :语句 3;/有些 SB 有毛病把 default 写到前面case 3:语句 4;当 i = 1 时,从 case 1 处往下一个不落的执行当
47、 i = 2 时,从 case 2 处往下一个不落的执行当 i = 3 时,只执行 case 3 一句当 i = 4 时,从 default 处往下一个不落的执行C. switch 是选择不是循环, 如果在 switch 中出现了 break 语句, 该语句的功能是退出 switch 语句并转去执行 switch 下面的语句。在 switch 中出现 continue 是错误的,除非 switch 就属于 for 或 while 循环的一部分。92.break92.break 的用法的用法break 如果用于循环是用于终止循环break 如果用于 switch 是用于终止 switchbrea
48、k 不能直接用于 if(语法错误) ,除非 if 属于循环内部的一个子句精选优质文档-倾情为你奉上专心-专注-专业A. break 用于一个 for 循环现在想知道 break 是用来终止 if 还是终止 for?可以这么想,如果是用来终止if,那么为什么规定不能直接用于 if?如用来终止 if,那么应该有三个嘿嘿;如用来终止 for,那么应该啥也没有果然是啥也没有,所以 break 虽然是 if 内部的语句,但终止的却是外部的 for 循环。B. break 用于多个 for 循环break 如果用于终止第一个 for,应该啥也不输出,如果用于终止第二个 for,应该输出三个嘿嘿。看来 br
49、eak 只能终止距离它最近的包含它的包含它的(这一条不能忽略! )循环C. break 用于多个 switchbreak 只能终止距离它最近的 tinue 的用法的用法用于跳过本次循环余下的语句,转去判断是否需要执行下次循环A. 在 for 循环中精选优质文档-倾情为你奉上专心-专注-专业for(1;2;3)A;B;continue;C;D;如果执行 continue,则执行完后,会执行语句语句 3(是语句是语句 3 别记错了别记错了! ) ,C 和D 都会被跳过去,即 C 和 D 不会被执行。B. 在 while 循环中while(表达式)A;B;continue;C;D;如果执行 cont
50、inue,则执行完后,会执行表达式,C 和 D 都会被跳过去,即 C 和 D 不会被执行。如果把 for 转换成 while,注意把 3 放在 continue 的上面不是下面,否则 3 就不会被执行了。实际应用的例子:在 41 节中,scanf 怎么保证用户输入的垃圾值不会被接受?两个 scanf 之间加入两行代码while( (ch = getchar() ) !=n)continue;解析:这个不太好理解()getchar()是个函数,要求用户从键盘输入一个字符。再把这个字符赋给 ch。 (这个很重要这个很重要,就是就是 ch 替下面那个替下面那个 scanf 接收了用接收了用户输入的垃