第3章作业: p59 1 (仿例3-5) , 5 (仿例2-8), 6 (仿例2-10), 7(仿例3-7), 8 (仿例3-8), 第4章作业: p84 三. 1,3(月入9000以内),5,7,8 每章的选择题和填空题自己做,上机验证答案!
学会读书,第2章复习 1. p26 改错,例2-6的右边代码应该是未缩进的,左边代码错行了。 2. p26 注意 缩进式 4. 复习三大结构的图示 5. p32 错误列表的用法
第一次上机总结 1. 上机前一定要预习、在作业本上写上程序代码,做好充分准备!!! 2. 细读p11、12,从前向后查错改错!!! 3. VC++6.0: 工程式管理,一个工程(*.dsp),一个工作区(*.dsw),目前只有一个文件(*.cpp), 文件中只有一个main函数! 4. 逐步学习英语: 程序中的单词,消息中的提示。
cout<< “x= ”<<x; } 注意成对的符号:一次敲入一对!!! main() { int x; x=‘a’; cout<< “x= ”<<x; } 一起输入! 想办法验证结果成对的正确性!
注意程序的形式 1. 每行一个语句!!! 2. 每个语句都由一个“ ;”结束!!! 3. 注释是给自己或别的“人”看的,你在需要时可加。 (p24 补充行注释符//) 4. 对齐、缩进表示的是语句间的包含、层次关系!!! (尤其在分支和循环语句中,要模仿例题!)
尽快尽量多地熟悉上机的过程----上机三大步: 1. 编辑程序代码(逐行敲入!) 2.编译与链接(选主菜单“组建”中的“全部重建”) (改错,存盘,再重建直至0 error,0 warning) 3.执行 (Run) ----- 结果正确!!! 有些同学在修改后(存盘!)省略Build,直接运行,不好!应养成好习惯!否则易死机丢程序。 正确步骤:改错—存盘—Build--Run
cin>>n; sum=0; i=2; While(i<n) { if(i%2==0) sum+=i; i++; } 包含在while 语句内部的要内缩两列!说明while语句内有一if和i++复合起来的复合语句。 if语句满足条件后要执行缩在其内的sum+=i; cin>>n; sum=0; i=2; While(i<n) { if(i%2==0) sum+=i; i++; } cout<<"the sum of even from 1 to"<<n<<" is "<<sum); 缩进 While内 缩进if内
第3章 C的基本数据类型 加强自学,有效读书: 上机遇到疑惑,(1/2结果是0,而不是 0.5)应该自己会在书上找答案 画第三章引言:2、3两章、理论和上机实践互相促进学习。
第3章C的基本数据类型 3.1 标识符和关键字 3.2 基本数据类型 3.3 常量 和变量 3.4 运算符 3.5 表达式
原则:见名知义!!不产生歧义。 3.1 标识符和关键字(p37) 标识符是C语言编程时用来标志识别的符号,以字母开头,由字母、数字和下划线组成。 正确 √ 不正确╳ count 1 count test123 hi!there high_balance high..balance PI a+b a_1 a=1 原则:见名知义!!不产生歧义。
在C语言中, 标识符中大小写字母是有区别的。习惯上采用小写字母表示各种标识符,如变量名、数组名、函数名等。各种语句也用小写字母,而大写字母只用来定义宏名等,用的不多。 不同的系统对标识符的长度有不同的要求, 有的要求为6个字符,有的允许使用8个字符,而VC系统下的有效长度为1至32个字符。 除了少数工作单元我们用单个字符作标识符,一般的应做到见名知义,以提高程序的可读性。如用sum表示和, score表示成绩, max表示最大等等。
关键字 ANSI C规定了32个关键字(保留字),不能再用作各种标识符。auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while。 它们用来表示C语言本身的特定成份, 具有相应的语义, 可构成所有的C语言语句。 12个标识符作为编译预处理的命令单词, 但使用时前面应加“#”: define, elif, else, endif, error, if, ifdef, ifndef, include, line, progma, undef。
3.2 C的基本数据类型 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作
3.2 基本数据类型 1. 基本数据类型 (p39 表3-2) 基本数据类型 类型 位数 值域 内存字节数 char 8 -128~127 int 16 -32768~32767 2 float 32 3.4e-38~3.4e+38 4 double 64 1.7e-308~1.7e+308 void
3.3 常量和变量 (p39) 常量是指在程序运行过程中其值不能被改变的量; C语言中有三种常量: 5 数值 123.4 常量 整型常量 单精度实型常量 双精度常量 5 123.4 1234567.89 字符 常量 用单引号括起的一个字符,转义字符 ‘a’, ’0’, ’$’ ‘\t’ 字符串 常量 用一对双引号括起的字符序列 “string” “a lot of”
3.3.1 常量 1. 整型常量 整型常量也称为整型常数或整数。 整型常量按进制分可分为十进制整数,八进制整数和十六进制整数。 ①十进制整数 十进制整数以正负号开头,后跟0~9的若干位数字构成。如123, -456, 789等。
3.3.1 常量 ②八进制整数 以基数0,1,2,3,4,5,6,7表示的数,以数字0作为前缀,作为八进制数的标志。如0123, -0456, 0765等。 ③十六进制整数 以基数0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F表示的数,以0x作为前缀,作为十六进制数的标志。如0x123, -0xF56, 0x7ED等。
逢二进一 逢八进一 逢十进一 逢十六进一
数制间的转换 非十进制转换为十进制:按权值展开即可, An-1An-2…A1A0,n位M进制数 D=An-1Mn-1+An-2Mn-2+…+A1M1+A0M0 如 0x2F=2*161+15*160=47 1101B=1*23+1*22+0*21+1*20=8+4+0+1=13 2.十进制转换为非十进制:短除法 13 →015 47 → 0x2F 3.十六进制与二进制之间的转换:一位十六进制数对应于四位二进制数。
十进制 二进制 八进制 十六进制 0000 00 1 0001 01 2 0010 02 3 0011 03 4 0100 04 5 0101 05 6 0110 06 7 0111 07 8 1000 10 9 1001 11 1010 12 A 1011 13 B 1100 14 C 1101 15 D 1110 16 E 1111 17 F P40
2. 实型常量 分为单精度实型常量和双精度实型常量。 单精度实数占四个字节,其数值范围是: 3.4×10-38≤|x|≤3.4×1038,它的有效位最多只有7位十进制数字。 双精度实数占8个字节,取值范围是: 1.7×10-308≤|x|≤1.7×10308,它的有效位能达到16位十进制数字。 有小数形式和指数形式两种。
①小数形式 正、负号开头,有若干位整数部分,后跟一个小数点,再有若干位小数部分。 如123.456,-21.37,12. ,12.0。
②指数形式 也称为科学计数法,分成尾数部分和指数部分。尾数部分可以是整数形式或小数形式,指数部分是一个字母“e”或“E”后跟一个整数。 2.1E5 (等于2.1×105),√ 3.7E-2 (等于3.7×10-2) √ 0.5E7 (等于0.5×107) √ -2.8E-2 (等于-2.8×10-2) √ E7 ,53.-E3 ,2.7E 。 ×
3. 字符常量 :常用字母数字+转义字符 ‘A’ ~ ‘Z’: 0x41 ~ 0x5A (p284 附录A) ‘a’ ~ ‘z’: 0x61 ~ 0x7A ‘0’ ~ ‘9’: 0x30 ~ 0x39 其他符号:!,@,#,$,%,^,&,*,(,),+,_... 转义字符 单引号内以“\”开始,后跟字母,或最多3位八进制数或x+最多两位十六进制数。
符号 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) 008 \f 换页(FF) 012 \n 换行(LF) 010 \r 回车(CR) 013 \t 水平制表(HT) 009 \v 垂直制表(VT) 011 \\ 反斜杠 092 \? 问号字符 063 \' 单引号字符 039 \" 双引号字符 034 \0 空字符(NULL) 000 \ddd 任意字符 三位八进制 \xhh 二位十六进制
③ 变量可以在程序内的三个地方定义: A:在函数内部的一开始 B:在函数的参数(形参)中定义(形式参数) C: 在所有的函数外部 (全局变量) 在不同地方定义的变量,其作用范围不同(ch7,难点)。 在同一层次定义的变量,不能与数组、指针、函数和其它变量同名。
不同的系统中,同一个类型变量所占的空间大小是不一样的,可以查看有关手册,也可以通过编程查看其所用字节数目。 #include <iostream.h> void main () { double x; x=45; cout<<"the size of double is "<<sizeof(x)<<endl; }
变量是指程序执行过程中,其值可以改变的量; 变量定义的一般形式: 类型 变量名表; 3.3.2 变量(重点) 变量是指程序执行过程中,其值可以改变的量; 变量定义的一般形式: 类型 变量名表; 合法标识符, “知名见义”; char c, ch, name; unsigned int ui; int i, j, num; float a, b, sum; double x, total; 例: 1个字节 每个变量都必须有类型说明; 一旦被指定为确定类型,将为它分配相应字节的内存; 2个字节 4个字节 8个字节 变量必须先定义,后使用,且在同一层次中不能与其它标识符重名;
强调程序的可读性、规范性 中国软件之所以上不去的原因之一就是“习惯问题”。印度十个人编程,会编出一样的东西,而我们十个人编程可能会有十种风格。因为我们忽略了一个重要的问题,即“顾客”的感受。程序是编写给别人看的,不是给自己看的。 基本的规范(如变量的起名和缩进式)不应该自己创新,尽量模仿例题!
3.3.3 变量的初始化 程序中常需要对一些变量预先设置初值。 C规定, 可以在定义变量时同时使变量初始化。 变量初始化只需在定义变量时在变量名后面加一等号及一个常数。它的一般形式是: 类型 变量名=常数; char ch=‘a’; int first=0; float x=123.45;
例3-1字符型数在数值运算时可以当成整型数。 #include <iostream.h> void main() { int x; char ch='a'; x=ch+2; // 这里x的值是‘a’的ASCII码值97 // 加2,也就是99 cout<< " ch="<<ch<<'\n'<<" x="<<x<<endl; } 初始化应用举例
3.4 C语言中的运算符 (常用的) 算术运算符: +, -, *, /, %, ++, -- (P45 表3-7) (4) 赋值运算符: =, 及其双目运算符的扩展赋值 运算符 (5) 圆括号运算符 ( ) 。
3.4.1. 算术运算符和赋值运算符 表 3-7 算术运算符和赋值运算符 操作符 作 用 运算对象个数 优先级 结合方向 ++ 自增,加1 表 3-7 算术运算符和赋值运算符 操作符 作 用 运算对象个数 优先级 结合方向 ++ 自增,加1 1 2 自右向左 -- 自减,减1 - 负号 * 乘 3 自左向右 / 除 % 取余(取模) + 加 4 减 = 赋值 14
+, -, *, / , 先乘除后加减, 按优先级顺序进行运算,优先级高(数小)的先运算。加括号可以改变运算顺序。 如1/2=0, 1.0/2=0.5; (2) 求余运算符(%)仅用于整型数据,不能用于实型和双精度实型。它的作用是取整数除法的余数。 如1%2=1, 10%3=1,(-10)%3=-1,10%(-3)=1
??? / %是两个法宝 三位数的整数,如何取出其个位? 十位? 百位? 准备上机程序代码时要认真琢磨p46 图3-2和图3-3! 牵扯一类编程题!!!
(3) 赋值运算符(=)是将“=”右边表达式的值赋给左边的变量。 赋值运算符左边必须是变量等有存贮单元的元素,而不能是常量或表达式。 x=x+1√ x+1=x × 0=X+1 × ×
(4) ++, --(难点) 仅用于变量,在变量原值的基础上加1、减1; 如果运算符在变量前面, 则在 “引用”该变量前,先对其作加1或减1运算; 如果运算符在变量后面, 则在 “引用”该变量后,再对其作加1或减1运算; y=++x; ↔ x=x+1;y=x; y=x++; ↔ y=x; x=x+1;
运算结果为 11, 11 运行结果为 11, 10 void main() { int x,y; x=10; y=++x; cout<< x<<","<<y<<endl; } 运算结果为 11, 11 void main() { int x,y; x=10; y=x++; cout<< x<<","<<y<<endl; } 运行结果为 11, 10
(5) +, -, *, /, % 可以与赋值号“=”组成复合赋值运算符+=, -=, *=, /=, %=。 a=a+b → a+=b; a=a*b → a*=b 书写简练,运行速度快。
2. 关系运算符和逻辑运算符 操作符 作 用 运算对象个数 优先级 结合方向 > 大于 2 6 自左向右 >= 大于等于 作 用 运算对象个数 优先级 结合方向 > 大于 2 6 自左向右 >= 大于等于 < 小于 <= 小于等于 == 等于 7 != 不等于 ! 逻辑非(取反) 1 自右向左 && 逻辑与 11 || 逻辑或 12
当关系运算符两边的值满足关系时为真, 返回1,不满足关系时为假,返回0。 x=10; cout<< x>=9; /* 此时输出为1 */ x=5; cout<< x>=9; /* 则输出为0。 */ 字符比较按其ASCII码值进行,如‘A’<‘B’为真。
(2) 关系运算符>, >=, <, <=的优先级相同, 如在表达式中同时出现时, 则自左向右顺序运算。而 == 与 (2) 关系运算符>, >=, <, <=的优先级相同, 如在表达式中同时出现时, 则自左向右顺序运算。而 == 与 != 优先级低于此四种关系运算符。 cout<< 5>3>1; 运行输出结果为0。因为两个>是同一优先级,5>3的结果为1, 而1>1的关系不满足,所以最后结果为0。 cout<< 1==11<35; 运行输出结果为1。因为<的优先级比==高,则11<35的结果为1,而1==1的关系满足,所以最后结果为1。
逻辑运算真值表 参与逻辑运算的量,非0表示真(1), 0表示假(0); ★逻辑运算结果中,1表示真,0表示假; p q !q p&&q 1 参与逻辑运算的量,非0表示真(1), 0表示假(0); ★逻辑运算结果中,1表示真,0表示假;
逻辑运算规则 非运算:0 → 1,1 → 0 与运算:表示“并且”的含义,见0为0 数学:3<x<6 C中:x>3&&x<6 或运算:表示“或者”的含义,见1为1 数学:num(0~99)中含5的数 C中: num个位是5||num十位是5
(3) 关系和逻辑运算符的优先级都低于算术运算符(逻辑非 (3) 关系和逻辑运算符的优先级都低于算术运算符(逻辑非!除外)。 如10>1+12完全等价于10>(1+12), 其结果当然是假(即0)。 (4) 在关系和逻辑运算符组成的表达式中, 也可以像算术表达式一样, 用圆括号来改变运算的优先次序, !1&&0其值为假,因为先执行!1, 然后才执行&&。然而加上圆括号!(1&&0)后改变了运算顺序,则执行!0操作结果为1,其值为真。
(5) && 和 || 一旦能够确定表达式的值,就不再继续运算下去;“偷懒”不执行了 (5) && 和 || 一旦能够确定表达式的值,就不再继续运算下去;“偷懒”不执行了 a||b, 当a=1时,则不再求b的值,直接得到结果1。a&&b,当a=0时,则不再求b的值, 直接得到结果0。 作业:同理, a||b||c,a&&b&&c 一样 例如: (6) 逻辑运算的转换。 !(a||b) →!a&&!b 等同于(!a)&&(!b) !(a&&b) →!a||!b
3. 条件运算符和逗号运算符 条件运算符的一般形式是: 表达式1 ? 表达式2:表达式3 x=10; y=x>9?100:200;//y=100 y=x<9?100:200;//y=200
逗号运算符“, ” 也称顺序求值运算符, 其运算优先级为15,也是最低的,结合方向是自左至右。 逗号运算符的左边总是不返回的,也就是说逗号最右边表达式的值才是整个表达式的值。 x=(y=3, y+1,y=9,y+1); 先将3赋给y,然后计算表达式y+1,其值为4,然后执行y=9,再执行y+1,最后将10赋给x。 由于逗号运算符的级别最低, 所以以整体先求值时一般均需加圆括号。
= += -= *= /= %= &= ^= |= >>= <<= 优先级 运算符 结合规则 1 [ ] ( ) → . 从左至右 2 ! ~ ++ -- - * & sizeof 从右至左 3 * / % 4 + - 5 << >> 6 < <= > >= 7 == != 8 & 9 ^ 10 | 11 && 12 || 13 ?: 14 = += -= *= /= %= &= ^= |= >>= <<= 15 ,
3.5 表达式 运算符、常量以及变量构成了表达式。表达式是这些成分的有效组合。 C语言的表达式非常丰富,也有人称C语言为表达式语言。
3.5 C的常用表达式 ① 算术表达式 <操作数><算术运算符><操作数> 算术表达式中运算对象(操作数)是常量、变量和表达式,运算结果(即表达式的值)是数值。 a+b*c-d/e*10
②关系表达式 <操作数><关系运算符><操作数> 关系表达式中运算对象是常量、变量或表达式,其运算结果是逻辑量,为“真”时取1,为“假”时取0。 如:i<100 j==10 k<=99 if( 2*i+4*(20-i) = = 60); //例3-6 非=
p53 例3-5 #include <iostream.h> #include <math.h> // 用到数学函数时一定要加 void main() { float a,b,c,area,s; cin>>a; cin>>b; cin>>c; if(a+b<=c || a+c<=b|| b+c<=a) // 判断a,b,c能否构成三角形 cout<<"您输入的数据不能构成三角形!" <<endl; } else s=(a+b+c)/2; area= sqrt (s*(s-a)*(s-b)*(s-c)); cout<<"三角形面积="<<area<<endl; p53 例3-5
<操作数><逻辑运算符><操作数> ③逻辑表达式 <操作数><逻辑运算符><操作数> 逻辑表达式的运算对象是逻辑量,在C语言中无逻辑量,可以是变量、常量或表达式,将非零的值按“真”对待,零值按“假”对待。而运算结果为“真”时取1, 为“假”时取0。 i&&j if(a<=0||b<=0||c<=0||a+b<=c || a+c<=b|| b+c<=a) //例3-5
从键盘输入一个字符,放入字符型变量ch中,当该字符为数字时,… char ch; cin>>ch If(ch>=‘0’&& ch < =‘9’) … 判断字符变量ch是英文字母的的表达式应写成: if((ch>=’a’&&ch<=’z’)||(ch>=’A’&&ch<=’Z’)) …
例3-7循环输入若干个字符,计算其中小写字母的个数,用$作为结束符。 #include <iostream.h> void main() { int n=0; char cha; do { cin>>cha; if(cha>='a'&&cha<='z') n++; } while(cha!= ‘$’) ; cout<< "输入字符中有 "<<n<<" 个小写字母 "<<endl; }
例3-6鸡兔同笼问题:从0到20只鸡一一去试: #include <iostream.h> void main() { int i=0; while(i<=20) { if( 2*i+4*(20-i)==60) cout<<" 鸡= "<<i<<" 兔= "<<20-i<<endl; i++; } P59 第3章第4题 第8题均是穷举法
“穷举法”也称为“枚举法” : 现实中有很多问题的解“隐藏”在多个可能中。所谓“穷举搜索法”就是将问题所有可能的答案一一列举,并对每一个可能解进行判断,从中得到正确的答案。 该法对于人手工操作来说是单调而繁琐的,但是对于高速、高精度的计算机来说,却可以通过牺牲时间(实际计算时间短)来换取答案的正确性和全面性。
复习课时: 以书复习p53 例3-5 例3-6 例3-8 可以省掉变量m和n (编程时尽量少用变量)
表达式中的类型转换 转换规则:由短转长,不能由长转短 (warning) 转换的结果必定是3种基本类型:int, long或double型。 ①如果数据长度最长为int(char)型,char型的数据要先转换成int型运算,结果是int型; ②只要有一个数据是float型,都要先转换成double型,最后结果也是double型。
例 :类型转换。 float x; int i; x=i=3.14159; 则变量i的值为3, 而变量x的值为3.0而不是3,也不是3.14159。
int i=10,j; float x,y=3.5; double dx=2.5,dy; j=i+10 ; //i是整型数,加10的结果还是整型的 dy= dx * y; // y转换成double型,相乘后的结果仍然是double型 x=1/2*40.5; //(1/2)都是int型运算,结果为int型,然后转换成 double型和40.5相乘,结果为double型,再赋给 float型x,x=0 x=40.5*1/2; //(40.5*1)是double型运算,结果为double 型,然后和2相除,结果为double型,再赋给float型x,x=20.25
可以强制类型转换。通过使用强制类型转换(type), 可以强迫表达式的值转换为某一特定类型。一般的形式是: (类型) 表达式 其中类型(type)是C语言标准数据类型。 若x=3, y=(float)x/2,则y=1.5 若x=3, y=(float)(x/2),则y=1.0
空格和圆括号 为了增加程序的可读性,在C程序的表达式中可以随意增加空格。 如以下两个表达式是等价的: x=10/y-(127/x); x = 10 / y - ( 127 / x ); 为了改变程序中表达式的求值顺序,可以加入圆括号。使用多余的圆括号并不会降低该表达式运行的速度,也不会引起错误。因此我们提倡使用圆括号来更清晰地表达运算次序, 也便于别人来读你的程序。
④条件表达式——右结合 a>b? a: c>d? c:d 相当于a>b? a:(c>d? c:d) 当a=1,b=2, c=3, d=4时,此条件表达式的值等于4。
⑤逗号表达式 y=(x=3, ++x, x++); //y=4 y=(x=3, ++x, ++x); //y=5