41.第一部分:如何优雅地使用scanf
A.上面先加一条提示信息,例如
printf(”请输入两个值中间以空格/逗号分隔:”); B.scanf尽量不使用非输入控制符,尤其是\\n!!有时候莫名其妙的不好用就是随手加了个\\n引起的!!不过加空格没事(∩_∩)
scanf(\ \\n加进来后你想输出123就要输入123\\n
总结:一个取地址符&,一个换行符\\n,scanf和printf不要弄混了! C.(难点!)scanf对用户非法输入的处理(>﹏<)
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,开始读就错了,往后都错了,如下图。
11/83
注意啊,这个地方要好好的理解一下啊!!上面的例子是说输入错误的情况下是输一次值回车就报错了。因为出错的部分不会自动丢弃,等待下一次输入时再把出错的部分赋给下一个变量!直接就不用你给下一个变量输入了!然后往后就全错了!好贱啊!上句话不理解可以看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回车。所以编写程序时可以按照下图,这样就引导用户按照正确的输入方式输入。
C-7. 按照上面的引导出错的话,结果如下图。
12/83
41.第二部分:保证前面输入的垃圾值不会被接受
这样就出现一个问题,当我需要对变量键盘赋值时,前面的输入可能会遗留一些垃圾的输入值,就像上面例子以前有些值没有放进去,而是放进这次输入了,然后往后就全错了。真不知道为什么设计者不直接自动丢弃错误部分呢?!
所以我们需要这样一个功能,输入值时要保证前面输入的垃圾值不会被接收。 两个scanf之间加入两行代码 while((ch = getchar())!= ’\\n’) continue;
如图,这样在输入时前面输入的垃圾值就没有影响了,好神奇啊(∩_∩) ch是char类型的!
另外很多编好的代码拿过来就能用,不必自己再绞尽脑汁的去想! 42.运算符的分类
算数运算符:+ - * /(除) %(取余)
关系运算符:>>= <<= !=(不等于) ==(等于) 逻辑运算符:&&(并且) ||(或)!(非)
赋值运算符:= += -= *= /= a += 3;就是a = a + 3; 优先级:算数>关系>逻辑>赋值 43.除法与取余
除法/的运算结果和运算对象的数据类型有关,两个都是int,则商就是int,若商有小数,则去除小数部分;被除数和除数中有一个或两个是浮点型,那结果就是
13/83
浮点型,不去除小数部分。
如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 取余%的运算对象必须是整数,结果是整除后的余数,余数的符号与被除数相同。 13%3==1 13%-3==1 -13%3==-1 -13%-3==-1 3%5==3 44.逻辑运算符
&&:真&&真为真,其余都是假 ||:假||假为假,其余都是真
A. C语言对真假的处理:非零是真,零是假。真用1表示,假用零表示。
分析:m的值不是0就是1。3>2是真,k = 8也是真,所以m是1。 B. 要是k = 0结果为
C. k的值不是想得那么简单!
我擦,k = 20!!为什么k = 5没有被执行!!&&左边的表达式为假的时候,右边的表达式就不执行了!因为一个是假的肯定就是假的了!
同样啊,对于||,左边的表达式为真的时候,右边的表达式就不执行了! 45.初学者学习运算符的一些建议。
A.忘了的话就查运算符和结合性表。
B. 为了让别人更好清楚,把想让它优先级高的用括号括起来。 附:谭浩强著《C程序设计》(第四版)P378运算符和结合性表
运算符与结合性 优先级 运算符 ( ) 1 [ ] -> 含义 圆括号 下标 指向结构体成员 14/83
要求运算 对象的个数 结合方向 左-右 . ! ~ ++ -- 2 - (类型) * & sizeof * 3 / % 4 + - << >> <<= >>= == != & ∧ | && || ? : = += -= *= 14 /= %= >>= <<= &= ∧= |= 15 , 结构体成员 逻辑非 按位取反 自增 自减 负号 类型转换 指针 取地址 长度 乘法 除法 求余 加法 减法 左移 右移 关系 等于 不等于 按位与 按位异或 按位或 逻辑与 逻辑或 条件 2 (双目运算符) 1 (单目运算符) 右-左 左-右 2 左-右 5 6 7 8 9 10 11 12 13 2 2 2 2 2 2 2 2 3 (三目运算符) 左-右 左-右 左-右 左-右 左-右 左-右 左-右 左-右 右-左 赋值 逗号 (顺序求职) 2 右-左 左-右 说明:
1) 同一优先级的运算符,运算次序由结合方向决定。例如*和/具有相同的优先级,其结合方向为自左至右,因此3*5/4的运算顺序是先乘后除。-和++为同
15/83
《郝斌C语言自学视频》笔记v1.1
作者:星辰变71
目录的编号对应视频的编号,专为懒得打字做笔记的吧友所著!
再次感谢郝斌老师,带我们装逼带我们飞(∩_∩)
目录
1.所用编程软件 .......................................................................................................... 3 17.什么是数据类型 .................................................................................................... 3 18.什么是变量 ............................................................................................................ 3 20.变量为什么必须初始化 ......................................................................................... 4 21.如何定义变量 ........................................................................................................ 4 22.什么是进制 ............................................................................................................ 4 23.常量在C语言中是如何表示的 ............................................................................. 4 24.常量是以什么样的二进制代码存储在计算机中 .................................................. 5 26.代码的规范化 ........................................................................................................ 6 27.什么是字节 ............................................................................................................ 6 28.不同类型数据之间相互赋值的问题 ..................................................................... 6 29.Char使用常见问题 ............................................................................................. 6 30.什么是ASCII码 ...................................................................................................... 7 33.printf();将变量的内容输出到显示器上 ........................................................... 7 34.如何让程序更有保存价值 ..................................................................................... 8 补充:怎么复制.exe黑窗口中的数据 ....................................................................... 8 36.为什么需要输出控制符 ......................................................................................... 9 38+39.scanf();用法:通过键盘将数据输入到变量中 .......................................... 9 40.一次给多个键盘变量赋值 ................................................................................... 10 41.第一部分:如何优雅地使用scanf ...................................................................... 11 41.第二部分:保证前面输入的垃圾值不会被接受 ................................................ 13 42.运算符的分类 ...................................................................................................... 13 43.除法与取余 .......................................................................................................... 13 44.逻辑运算符 .......................................................................................................... 14 45.初学者学习运算符的一些建议。 ....................................................................... 14 46.黑窗口不要重复打开和其属性修改 ................................................................... 16 52.if最简单用法 ....................................................................................................... 16 53.if的范围 ............................................................................................................... 16 54.if…else…的用法 .................................................................................................... 17 55-1.if…else if…else…的用法 ..................................................................................... 17
1/83
55-2. if中容易犯的错误 ........................................................................................ 18 57.if 举例—求分数的等级 ....................................................................................... 19 58. if 举例—互换两个数据 ...................................................................................... 20 59.对任意三个数字进行排序 ................................................................................... 20 60.如何看懂一个程序............................................................................................... 21 62.if空语句的问题 ................................................................................................... 21 63.if常见问题 ........................................................................................................... 22 67.初识for循环 ........................................................................................................ 24 68.for最简单的应用-求10以内奇数和 .................................................................. 25 69.for和if的嵌套使用 ............................................................................................. 25 71.强制类型转换 ...................................................................................................... 26 72.浮点数存储带来的问题 ....................................................................................... 28 73.for 和 if的嵌套循环 ........................................................................................... 29 补充:软件自动对齐的方法 .................................................................................... 30 74.多个for循环的嵌套 ............................................................................................ 30 75.复习进制的知识 .................................................................................................. 31 76.运算符补充—自增/自减 ..................................................................................... 31 77.运算符补充—三目运算符 ................................................................................... 32 78.运算符补充—逗号表达式 ................................................................................... 32 82.while循环 ............................................................................................................ 33 83.for和while的比较 .............................................................................................. 33 87.何时用while,何时用for ...................................................................................... 34 88.do……while ............................................................................................................ 34 90.switch用法简介 ................................................................................................... 36 91.switch琐碎知识 ................................................................................................... 38 92.break的用法 ........................................................................................................ 38 93.comtinue的用法 .................................................................................................. 39 98.数组的简单使用 .................................................................................................. 42 99.为什么需要数组 .................................................................................................. 42 101.一维数组 ............................................................................................................ 42 102.二维数组 ............................................................................................................ 44 103.是否存在多维数组 ............................................................................................. 45 106-107.为什么需要函数+什么是函数 .................................................................... 45 108.如何定义函数? ................................................................................................ 46 109.return和break的区别 ...................................................................................... 47 110.函数的分类 ........................................................................................................ 49 111.函数举例 ............................................................................................................ 49 113.函数的声明 ........................................................................................................ 52
2/83
114.函数的形参和实参 ............................................................................................. 53 115.如何在软件开发中合理的设计函数来解决实际问题 ...................................... 53 120.函数的作用域和存储方式 ................................................................................. 53 121.指针初次介绍 .................................................................................................... 54 122.指针的重要性 .................................................................................................... 54 123.什么是地址 ........................................................................................................ 54 124.什么是指针 ........................................................................................................ 54 125.基本类型的指针 ................................................................................................ 54 126. 基本类型的指针常见错误解析 ....................................................................... 55 127.经典指针程序-互换两个数字 ............................................................................ 57 129.实参和形参永远是不同的变量 ......................................................................... 59 130.指针可以使被调函数修改主调函数多个变量的值 .......................................... 60 131-136.专题:一维数组和指针关系 ...................................................................... 60 137.何为变量地址?一个指针变量占几个字节[难点] ........................................... 63 补充:字符数组和字符串,视频没讲 .................................................................... 64 补充:通过指针引用字符串 .................................................................................... 65 138-150.专题:动态内存分配[重点难点] ................................................................ 66 151-164.结构体 ......................................................................................................... 70 163.冒泡排序 ............................................................................................................ 77 168-170.补码 ............................................................................................................. 79 176.位运算符(重点!) ........................................................................................... 81 179.NULL的含义 ....................................................................................................... 82
1.所用编程软件
视频中用的编程软件是VC++6.0,本笔记用的编程软件是VS2010和Dev C++5.11。 要求变量定义写在最前面,不能中途定义,否则编译时会出错。 17.什么是数据类型
整型:整型int-4字节长整型long int-8 短整型short int-2 浮点型:float-4 double-8 字符char-1
所占字节数不一定都是这样,但是比如长整型所占一定大于等于整型。 复合数据类型:结构体枚举共用体 18.什么是变量
int i; //VC++6.0请求操作系统把内存条中的一个空闲单元和i产生关联 i=3; //3最终是存放在内存中,程序终止之后3所站的空间被释放
如果不使用变量,要自己去找内存中的空闲单元,有了变量就不用考虑了。
3/83
变量的本质就是内存中一段存储空间 20.变量为什么必须初始化
所谓初始化,就是赋值。当软件运行完毕后,操作系统将回收该内存空间,以便再次分配给其他软件使用。(注意:操作系统并不清空该内存空间中遗留下来的数据)综上,一个软件所分配的空间中极可能存在着以前其他软件使用过后的残留数据(垃圾数据)。所以通常我们为一个变量,为一个数组,分配好存储空间之后都要对该内存空间初始化! 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),十六进制前要加0x或者0X,十进制前什么都不加。 在汇编中:在数字后加字母B表示二进制,加O表示八进制,加D表示十进制,加H表示十六进制。
例如:1011B也记为(1011)2 1357O也记为(1357)8 2049D也记为(2049)10 3FB9H也记为(3FB9)16
printf中,%d表示以十进制输出;%x或%X(决定输出字母的大小写)以十六进制输出;%O(这次是字母不是零了!)表示以八进制输出。 23.常量在C语言中是如何表示的
A.整数:八进制前要加0(注意是零不是字母O),十六进制前要加0x或者0X,十进制前什么都不加。
B.浮点数:传统的写法float = 3.2;
科学计数法float x = 3.2e3; //x的值是3200 float x =123.45e-2; //x的值是是1.2345
4/83
编译时会有个警告,如图
为什么呢?C语言中,无论是传统写法还是科学计数法,默认是double型。double赋给float会丢失精度。可以选择忽略警告,也可以选择加个F变成123.45e-2F。 这样编译时就没有警告了。
注意一个问题,为了解决上述窗口一闪而过,我们要加上头文件(如图)并在main函数结尾前加上(如图)。
C.字符:单个字符用单引号括起来,如’A’。‘AB’错误,”AB”正确。
字符串用双引号括起来。’’A’’正确,因为’’A’’代表了’A’’\\0’的组合。可以想成一个字符串就一个字符。
24.常量是以什么样的二进制代码存储在计算机中 整数是以补码的形式转换为二进制代码存储在计算中的。 实数是以IEEE754标准转换为二进制代码存储在计算中的。 字符本质上与整数的存储方式相同。
5/83
26.代码的规范化
A.括号一敲敲一对(){},敲完括号再写内容
B.注意加空格。比如if ()//if要敲空格再加括号 比如Int a = 1; //等号两边要加空格
比如x1=(-b + sqrt(delta)) / (2*a); //这些运算之间要加空格
C.注意从属关系要进行缩进。选中要缩进的多行代码按Tab,就一起右移了, Shift+Tab就一起左移回来了。
D.代码之间要适当的空行。相同功能的写在一起,然后空一行再写下一部分相对独立功能的代码。 27.什么是字节
字节是存储数据的单位,并且是硬件所能访问的最小单位。 1字节=8位,这是固定不变的。
CPU只能直接处理内存里面的数据,硬盘的数据必须调入内存才能处理。
硬件上最小的单位是位,不是0就是1。但是CPU只能到字节上,不能准确控制到某一位。控制到位上可通过位运算符。下面是内存条
28.不同类型数据之间相互赋值的问题
这个问题是C和C++所独有的,如果想深入了解C和C++必须搞清楚。如果想搞清楚必须懂补码。 29.Char使用常见问题
A. char ch = ‘A’; //正确
char ch =”AB”; //错误,不能把字符串赋给单个字符 char ch =”A” ; //错误 char ch =’AB’; //错误 B.以下写法是错误的!
6/83
下面这么写就对了。
30.什么是ASCII码
ASCII不是一个值,是一种规定。它规定不同的字符是使用哪个整数值去表示。 比如’A’--65 //A这个字符在ASCII中是用65来表示的 ’a’--97,’0’--48
所以说字符本质上与整数的存储方式相同。 33.printf();将变量的内容输出到显示器上 四种用法:
A.printf(”字符串”);
B.printf(”输出控制符”,输出参数);
7/83
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)
这么看还是%#X比较好!!
非输出控制符原样输出,在上面C中就是例子。 34.如何让程序更有保存价值
在开头加上时间,功能,目的等。
在末尾加上在某款软件中的输出结果和总结。
补充:怎么复制.exe黑窗口中的数据
右键—[标记]或者[全选],标记完了再点右键,然后就不是被选中状态了。这时到目标处ctrl+V就OK了。
8/83
36.为什么需要输出控制符
A.0和1组成的代码可以表示数据也可以表示指令。一串01代码本身没有实际含 义,关键是看怎么用输出控制符去解读。
B.0和1组成的代码表示的是数据的话,那么用不同的输出格式输出就会有不 同的结果。 38+39.scanf();用法:通过键盘将数据输入到变量中
scanf(”输入控制符”,输入参数);//当然可以含有非输入控制符
功能:将从键盘输入的字符,转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。
解析:
A.读着云里雾里。在键盘输入123不是整型数字123,而是字符1字符2字符3,操作系统就是这么规定的。%d的作用就是把字符1字符2字符3转换成一个十进制整数。
B.输入参数是&i,就是存入以i的地址为地址的变量,就是i变量!就像把我的家作为家的人,就是我这个人!!服了…… 下面是含有非输入控制符的例子。
9/83
注意:
A.不要忘了加上取地址符&。 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不管之间连在一起还是加几个空格,我都可以在黑窗口中用空格把输入的三个数分开。
B.但是我要是之间加逗号和若干空格,那我输入的两个值需要以逗号(或逗号加若干空格)相隔。如果仍然以空格相隔,那么只能是第一个值正确。
10/83
一优先级,结合方向为自右向左,因此-i++相当于-(i++)。 不同的运算符要求有不同的运算对象个数,如+(加)和-(减)为双目运算符,要求在运算符两侧各有一个运算对象(如3+5、8-3等)。而++和-(负号)是单目运算符,只能在运算符的一侧出现一个运算对象(如-a、i++、--i、(float)i、sizeof(int)、*p等)。条件运算符是C语言中唯一的三目运算符,如x ?a :b。 2) 从上表中可以大致归纳出各类运算符的优先级:
初等运算符{() [] -> .}单目算术(先乘除,后加减) 关系逻辑(不包括!) 条件赋值逗号
以上优先级从高到低。位运算符的优先级比较分散:有的在算术之前如~,有的在关系之前如<<和>>,有的在关系之后如&、∧、|。为了容易记忆,使用位运算符时可加圆括号。 46.黑窗口不要重复打开和其属性修改
注意一个问题:经常已经打开.exe的黑窗口了,还去点击[启动调试](F5)又打开第二个黑窗口了。要把前一个黑窗口关了,再修改再打开第二个!! 要是已经有黑窗口了,再点击[编译](Ctrl+F7)就会弹出一个对话框,
这时候别困惑啥意思,就是把已经打开的黑窗口关了!
在黑窗口的边框上右键-[属性],可以修改光标大小,字体,布局,颜色等,不过
默认的挺好的。 52.if最简单用法
流程控制的分类:顺序、选择(if和switch)、循环
53.if的范围 A. if(表达式) 语句A;
语句B;
16/83
if默认只能控制语句A是否执行,语句B一定会执行。它正确的格式应该是
if (表达式) 语句A;
语句B; B. if(表达式)
{
语句A; 语句B;
} 此时if 可以控制语句A和语句B。
综上所述,if默认只能控制一个语句是否执行。如果想控制多个语句是否执行,就要把它们用{}括起来。 54.if…else…的用法
注意一个问题啊,在新建的时候起名叫if…else…会有问题,因为else后面有三个点,加上.c作后缀就是if…else….c,这样命名不行!新建命名的时候不要加点! (附:.cpp是C++的源程序。在国内,C++读作”C加加”,在国外读作”C Plus Plus”,即”.cpp”。C的源程序后缀就是.c。)
else后面也是默认只能控制一个语句是否执行。如果想控制多个语句是否执行,就要把它们用{}括起来。
55-1.if…else if…else…的用法 格式:if (1) A;
else if (2) B;
else if (3)
17/83
C;
else //注意!最后一个else后面没有括号了!! D;
说明:(1)成立A执行;如果(1)不成立(2)成立B执行;如果(1)(2)都不成立执行C;(1)(2)(3)都不成立就执行D了。
注意啊!有个容易犯的错误用法!
55-2. if中容易犯的错误
这是1个语句,不是3个!要是3个都会执行那是3
个语句,可是只会执行一个所以是1个语句。 下面的写法就是错误的!
18/83
加了哈哈这个语句之后把这个整体分成了3个语句,语句1没问题,语句2也没问题,但是语句3就错了!因为没有语句以else开头╮(╯﹏╰)╭ 当然,编译(Ctrl + F7)时会提示错误:
57.if 举例—求分数的等级
注意:一种错误的表达式写法!90 <= score <= 100是XX的(>﹏<) 这式子一看觉得是没啥问题,但是是XX的!
因为从45节运算符表可以看出关系运算符是自左至右执行的,就是先算
90 <= score,这就出问题了!90 <= score的值是个逻辑值,要不是真要不是假,就说结果不是1就是0,不管是1还是0小于等于100一定成立(>﹏<) 综上,90 <= score <= 100永远为真,值永远为1。
不管score的值是多少,i的值都是1。正确写法是score >= 90 && score <=100 。
19/83
58.if 举例—互换两个数据
将i,j两个变量互换,要再定义第三个变量t。为什么要用t呢?? 因为temporary adj.临时的;暂时的 n.临时雇员 t = i; i = j; j = t;
59.对任意三个数字进行排序
算法:如果a>b
则a与c比较 a>c则输出a a 否则 b与c比较 b>c则输出b b 20/83 60.如何看懂一个程序 分三步,一定把这三步背下来并用到实践中! 先看流程->再每个语句的功能->试数(最后一步尤其重要) 试数两个原则:一个是把自己当计算机,一步一步来。一个是写整齐。 就一些小算法的程序: A. 尝试自己去编程解决它,基本不太可能(>﹏<) B. 如果解决不了,就看答案 C. 关键要把答案看懂,这个要花很大的精力,也是我们学习的重点 D. 看懂之后尝试自己去修改程序,并且知道修改后不同输出结果的含义 E. 照着答案去敲,调试错误 F. 不看答案,自己独立敲出来 G. 如果程序实在无法彻底理解,就把它背下来 62.if空语句的问题 有时候犯错误在if后面加了个分号,如下图 21/83 上面两种都一样,就是如果1大于2就执行这个空语句。上述就是3个语句了。 语法上虽然没有问题,但是达不到效果了。 63.if常见问题 A. 上述语法没有问题,但是加了else语言就错了,因为没有单独以else开头的语句。 B. 同样,else if和else后面也别加上分号!! C. if (表达式1) A; else if (表达式2) B; else if (表达式3) C; else D; 即使表达式1和2都成立,也只会执行A语句。因为表达式1成立了,就没有否则了(∩_∩) 22/83 D. 能不能没有最后一个else? if (表达式1) A; else if (表达式2) B; else if (表达式3) C; //最后的else没有了,语法不会出错,但是逻辑上有漏洞。如下例子: 漏洞就是我要是输入分数是70,就没有对应的输出了! 23/83 E. 更加郁闷的错误O(∩_∩)O哈哈~ if (表达式1) A; else if (表达式2) B; else if (表达式3) C; else(表达式4)// 最后一个else后面没有括号了!! D; 不过这个错误还好,语法错误,编译时会提醒你表达式4后面缺少分号。 可以这样理解,else后面都是一个语句,但是没有’’(表达式4)D;’’ 这种类型的语句。 F. 上述错误我要是表达式4后面加上分号呢? if (表达式1) A; else if (表达式2) B; else if (表达式3) C; else(表达式4);// 表达式4后面加上分号 D; 和第E条相比语法上没有错误,编译OK。 它就等价于 else (表达式4); D; 语法上虽然OK,但是只会导致错误结果(>﹏<) 67.初识for循环 循环分类:for while do…while 先执行”1”,”1”完了执行”2”,”2”成立执行”4”,”4”完了执行”3”,”3”完了标志循环一次结束。然后再判断”2”决定是否进行下一次循环。如果”2”不成立就退 24/83 出循环了。 注意: A. ”3”完了才标志循环一次结束,所以i最终值不是100,是101!! B. ”1”永远只执行一次,”3”完了一定会执行”2”! C. 别忘了给sum赋初值,否则sum是个垃圾值。垃圾值再加上i还是垃圾值 然后VS故意输出一个很大的数字告诉你你错了O(∩_∩)O哈哈~ D. ”1””2””3”之间是分号分隔,不是逗号! E. ”3”后面没有分号了(>﹏<) 68.for最简单的应用-求10以内奇数和 注意: A. i+=2后面没有分号!! B. 要是求10000以内的奇数和就是i<10000,但是怎么证明程序正确呢? 就是先看10正确,再放大点正确,也就得出10000正确了。 69.for和if的嵌套使用 注意一个问题:for()后面不要加一个分号!和if()一样!因为语法没有错误编译时检查不出,一个分号又不起眼,有时候硬是让人崩溃(>﹏<) A. 求1-12所有能被3整除的数字之和 这个for下面我没加括号,for默认也是控制一个语句 25/83 B. 这个例子刚开始有点难,for下面我加了括号 输出结果是什么? 分析:1完了执行2;2成立执行4;4成立执行5,5完了执行6,4不成立执行6,6完了执行3,标志循环一次结束。 71.强制类型转换 A. 从一个例子引出强制类型转换: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 取余%的运算对象必须是整数,结果是整除后的余数,余数的符号与被除数相 26/83 同。 13%3==1 13%-3==1 -13%3==-1 -13%-3==-1 3%5==3 所以从i = 2开始,1/i的结果就都是0 B. 进一步研究:将sum变为float型 sum = float + int结果为float ,即不同精度运算结果为高精度 (>﹏<)为什么sum结果为0!因为sum以%d输出,正确应该以%f输出! 这个错误也经常被忽略! C. 进一步研究:对1/i使用强制类型转换 从i = 2开始,1/i的结果就都是0,加上强制类型转换就是0.00000(>﹏<) D. 本例子正确做法,对i进行强制类型转换(不推荐此法,后面有简单的) 27/83 还有个更简单的写法:sum = sum + 1.0 / i (∩_∩)推荐使用这个 注意:这里边sum最后结果是个浮点型,一开始必须定义成float,输出时必须是%f,定义和输出要匹配。一开始定义成int,输出是%f或者一开始定义成float,输出时是%d,结果都是错误的! E. 为什么不直接定义成float i? 下一节会讲到。 综上,强制类型转换格式(数据类型)(表达式),作用是把表达式的值强制转换为前面写的数据类型,例子 (int)(4.5 + 2.2)值为6 (float)(5)值为5.000000 72.浮点数存储带来的问题 float和double都不能保证精确存储(>﹏<) A. 面试题举例:有一个浮点型变量x,如何判断x的值是否为0 错误写法: if (x == 0) 是 else 不是因为x赋值为0,但是存储的只是0的近似值 正确写法:if (|x – 0.000001| <= 0.000001) 是 else 不是 表示x和某一个很小很小的数字相差非常非常小,x就可以当0来看待了 B. 为什么循环中更新的变量不能定义成浮点型 就比如71节的i++为什么i不能是浮点型?因为判断i <= 100,理论上 i = 100.00,但i实际上存成了100.0001,这样就大于100了。 注意:浮点型不是说一定不能准确存储,只是不能保证准确存储,就说有的能存准确了,但是有的不能。为了保险,我们循环中更新的变量不能定义成浮点型。 我们试验一下: 28/83 73.for 和 if的嵌套循环 A. 求1到100之间的奇数之和 B. 求1到100之间奇数的个数 C. 求1到100之间的奇数的平均值 29/83 注意啊,for下面为了规范应该加中括号的,加了看的更直观并且不容易出错 控制一个复合语句时习惯不加,以后控制多语句很可能忘了!! D. 求1到100的奇数和偶数和 补充:软件自动对齐的方法 补充:如果我们的代码洗的不是很规范,比如上下对应的括号不对齐,或者缩进 有的大有的小,软件可以自动帮我们对齐,很方便。Ctrl + A,全部选中。 再按Alt + F8。 74.多个for循环的嵌套 for(1; 2; 3) for(4; 5; 6) A; 30/83 综上:函数是个工具,它是为了解决大量类似问题而设计的, 函数可以当做一个黑匣子,编好的函数,我输入处理数据,它输出处理结 果,至于它内部怎么实现的就不用操心了。 黑匣子 输入 输出 108.如何定义函数? 函数的返回值类型函数的名字(函数的形参列表) { 函数的执行体 } ? 函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法 ? 函数的返回值的类型也称为函数的类型,因为如果”函数名字前函数的返回值类型”和函数的执行体中”return的表达式的类型”不同的话,以”函数名字前函数的返回值类型”为准。 46/83 109.return和break的区别 1. 复习92节break break如果用于循环是用于终止循环 break如果用于switch是用于终止switch break不能直接用于if(语法错误),除非if属于循环内部的一个子句 如果break没有包含在for的括号里单独出现,就会出现错误 47/83 2. 把break换成return 这么看return不是用来终止for循环的,是用来终止所在的函数的。 return和函数匹配。子函数中return的作用: ? 终止被调函数,向主调函数返回表达式的值; ? 如果表达式为空,就只终止函数,不向主调函数返回任何值 3. 把上例子中for的括号去掉 48/83 110.函数的分类 有参和无参 有返回值和无返回值 库函数和用户自定函数, 值传递函数和地址传递函数 主函数和普通函数 背下来: ? 一个程序必须有且只有一个主函数,主函数是程序的入口,也是函数的出口? 主函数可以调用普通函数,但是反过来不行 ? 普通函数可以相互调用 111.函数举例 1. 求最大值的两种子函数 1.1 子函数1 49/83 1.2 子函数2 两种方式比较:max1功能是两个,就是找到最大值,对最大值进行处理。 max2的功能就是寻找最大值,至于怎么处理要看main函数。 2. 判断一个数是否是素数,看语法! 50/83 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库《郝斌C语言自学视频》笔记v1.1在线全文阅读。
相关推荐: