课前回顾 数据类型 基本类型 构造类型 指针类型 空类型 常量与变量 常量及常量的类型 变量 标识符及有关规定 变量声明格式 赋值运算符
第四次课 运算符和表达式
本节学习目标 语句 算术运算符 赋值运算符 关系运算符 逻辑运算符 顺序结构
C语句概述
C语句概述 一个c程序可以有若干个源程序文件组成 一个源文件可以有若干个函数和预处理命令以及全局变量声明部分组成 一个函数有函数首部和函数体组成 函数体由数据声明和执行语句组成 C语句分为 5类 控制语句 函数调用语句 表达式语句 空语句 复合语句
C语句概述 (一)控制语句 完成一定的控制功能 1 if() ~else 条件语句 6 break 间断语句 (一)控制语句 完成一定的控制功能 1 if() ~else 条件语句 6 break 间断语句 2 for()~ 循环语句 7 switch() 开关语句 3 while()~循环语句 8 goto 转向语句 4 do ~while();循环语句 9 return 返回语句 5 continue 继续语句
例: C语句概述 (二)函数调用语句 有一个函数调用加一个分号构成一个语句 Printf(“This is a C statement.”); 例:
C语句概述 (三)表达式语句 有一个表达式加一个分号构成一个语句 a = 3 ; 例: 分号 赋值表达式 表达式语句 + =
C语句概述 (四)空语句 只有一个分号的语句 (什么也不做) 用来做流程的转向点 用来作为循环语句中的循环体 ;
C语句概述 (五)复合语句 用一对{}括起来的语句 { z=x+y; t=z/100; printf(“%f”,t); } 例:
运算符和表达式 什么是运算符 什么是表达式? 能作用于数据上的符号 代表作用于数据上的一种特定操作 运算符与操作数的有效结合。 例如:a+b,5*6,a/8等
运算符类型 算术 逻辑 关系 位 一元、二元运算符都是算术运算符 用于对包含关系运算符的表达式 进行合并或取非 测试两个变量或一个变量和一个 常量之间的关系 位 将数字按位进行计算
算术运算符 一元运算符 操作 二元运算符 - 一元减 + 加 ++ 递增 减 -- 递减 * 乘 % 模 / 整除或除法
“/”的用法 #include <stdio.h> void main() { int i=5; printf("%d\n",i/3); printf("%f\n",5/3.0); }
算术运算符的优先级 算术运算符中,(-)求负运算级别最高,(*、/、%)次之,(+、-)最后。 在相同优先级中,-(取负)这一级按从右到左的顺序结合;其余的算术运算符按从左到右的顺序结合.
算术运算符的优先级(续) 考虑下面的例子: - 4 + 3*-6/2-5+5 - 4+3*[-6]/2-5+5 - 4 + 3*-6/2-5+5 - 4+3*[-6]/2-5+5 - 4+[-18/2]-5+5 - [4+-9]-5+5 - [-5]-5+5 - -5
请注意… 不要写出别人看不懂的也 不知道系统会怎样执行程 序 在调用函数时,实参数的求值顺序,C标准并无统 一规定。 例如:i的初值为3,如果有下面的函数调用: printf(″%d,%d″,i,i++) 在有的系统中,从左至右求值,输出“3,3”。在多数系统中对函数参数的求值顺序是自右而左,printf函数输出的是“4,3”。以上这种写法不宜提倡, 最好改写成 j = i++; printf("%d, %d", j,i) 不要写出别人看不懂的也 不知道系统会怎样执行程 序
课堂练习 1.已有定义语句: int a=1,b=2,c=3;float d=4;以下能正确表示数学式 的C语言表达式. A) a/(b+c)*d ; B)a/(b+c)*1/d; C)a/(c+b)/d; D)a/d/(b+c) 2.求表达式 3.6/6+1/2+55%10的计算结果;
++和—用法 使用方法: 概念: 前置用法 ++a、--a ++和—是一种在本身的前提下+1和-1的操作。 后置用法 a++、a— ++与—的运算方向是“从右到左” 概念: ++和—是一种在本身的前提下+1和-1的操作。 例如:a++、++a代表a=a+1; A--、--a代表a=a-1
++的用法举例 ++用法的例子 设A=1 A++,++A 执行后 A=2; B=A++ 执行后 B=1,A=2;
++和—举例 例题 设a=3,c=2; 1.求b=(a++)-c的值 b=3-2 b=1;a=3+1=4; 2.求b=(++a)-c的值
课堂练习 设a=3,c=2; 1.求b=(a--)-c的值 b=? ;a=?; 2.求b=(--a)-c的值 b=? ;a=?; 3求b=(++a)-(--a)的值 b=?;a=?; 4求b=(++a)-(--a)+a--的值 b=?;a=?;
赋值运算符 一般格式: 变量名=表达式 例如:a=5,a=b;a=2*6,a=a+b 例如:a=b=c=10 多重赋值:
赋值语句 赋值语句是由赋值表达式加上一个分号构成 例:a=100 赋值表达式 a=100; 赋值语句 条件中不能含有赋值符号,但是赋值表达式可以 包含于条件表达式中 例:if(a=b) t=a; 错误 if((a=b)>0) t=a; 正确
复合赋值 格式: 说明: a+=5, a=a+5 a-=5 a=a-5 a*=5 a=a*5 a/=5 a=a/5 A%=5 a=a%5 变量名 双目运算符 = 表达式 赋值运算的顺序:从右到左
课堂练习 a=8时;求下列表达式的值 a+=a-=a*=a-5
赋值语句 问题:c语言中的赋值语句于其他高级语言的赋值语句有什么不同点? 2:其他大多数高级语言没有“赋值表达式”这一概念.
关系运算符和逻辑运算符2-1 用于测试两个变量或一个变量和一个常量之间的关系 运算符 关系运算 > 大于 >= 大于等于 < 小于 <= 小于等于 == 等于 != 不等于 高 低
关系运算举例 当a=3,b=4,c=5时 a<b的值为1 a>b的值为0 a>=c的值为0 (a>b)!=c的值为1
课堂练习 当a=3,b=4,c=5时 (a<b)+c的值是多少?
逻辑运算符用于对包含关系运算符的表达式进行合并或取非 关系运算符和逻辑运算符2-2 逻辑运算符用于对包含关系运算符的表达式进行合并或取非 运算符 逻辑运算 && 与 || 或 ! 非 示例:if ((a>10) && (a<20)) 使用逻辑运算符的表达式,返回 0 表示假,返回 1 表示真
逻辑与运算符--&&
课堂练习 求下列表达式的答案 1.(2>2)&&(4>2) 2.(2>=2)&&(5>2)
逻辑或运算符--|| 用于只要一个条件为‘真’就返回 ‘真’的情况.
课堂练习 求下列表达式的答案 1.(2>2)||(4>2) 2.(3>1)||(1>2)
逻辑非运算符--! 把判断的结果取反 只有一个操作数
!> 算术运算 > 关系运算 > && > || > 赋值运算 运算符之间的优先级别 !> 算术运算 > 关系运算 > && > || > 赋值运算
2*3+4/2>3 AND 3<5 OR 10<9 运算符之间的优先级范例 2*3+4/2>3 AND 3<5 OR 10<9 首先计算 算术运算符 计算如下: [2*3+4/2]>3 AND 3<5 OR 10<9 True [[2*3]+[4/2]]>3 AND 3<5 OR 10<9 True OR False [6+2]>3 AND 3<5 OR 10<9 [True AND True] OR False [8>3] AND 3<5 OR 10<9 True AND True OR False 最后计算逻辑运算符 比较运算符,计算总左到右进行
课堂练习 10*3%6*6+5-2&&(2*2+6/3>1||2>8) 12%3/2+3*6>10&&!真||!真
将数字转换成等价的二进制形式后再处理数据(按位表示法) 位运算符 将数字转换成等价的二进制形式后再处理数据(按位表示法) 运算符 描述 按位与 ( x & y) 如果两个操作数的相应位均为 1,则该位的结果值为 1 按位或 ( x | y) 如果两个操作数的相应位有一个为 1,则该位的结果值为 1 按位取反 ( ~x) 将操作数按位取反 (0 到 1 和 1 到 0) 按位异或 ( x^y) 如果参加运算的两个操作数的相应位同号,则结果为 0,异号则为 1
位运算符(续) 操作数 位操作 位表达式 数字 10 & 15 1010 & 1111 1010 10 10 | 15 1010 | 1111 1111 15 10 ^ 15 1010 ^ 1111 0101 5 ~ 10 ~1010 -11 位运算符将数字视为二进制值,并按位进行相 应运算,运算完成后再重新转换为数字
逗号运算符和逗号表达式 如:3+5,6+8 一般形式: 表达式1,表达式2 逗号运算符:将两个表达式连接起来,又称为“顺序求 值运算符” 逗号表达式 的值为14 逗号运算符:将两个表达式连接起来,又称为“顺序求 值运算符” 如:3+5,6+8 一般形式: 表达式1,表达式2 求解过程: 先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。
逗号运算符和逗号表达式 例:逗号表达式a=3*5,a*4 分析:赋值运算符的优先级别高于逗号运算符, 因 此应先求解a=3*5。 a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。 例:逗号表达式a=3*5,a*4 分析:赋值运算符的优先级别高于逗号运算符, 因 此应先求解a=3*5。 一个逗号表达式又可以与另一个表达式组成一 个新的逗号表达式 如:(a=3*5,a*4) a+5先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。
逗号运算符和逗号表达式 逗号表达式的一般形式可以扩展为 它的值为表达式n的值。 表达式1,表达式2,表达式3,……,表达式n 赋值表达式,将一个逗号表达式的值赋给x,x的值等于18 逗号运算符是所有运算符中级别最低的 例: ① x=(a=3,6*3) ② x=a=3,6*3 逗号表达式,包括一个赋值表达式和一个算术表达式,x的值为3,整个逗号表达式的值为18。
逗号运算符和逗号表达式 注意:并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。 “a,b,c”并不是一个逗号表达式,它是printf函数的3个参数 注意:并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。 如: printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c) “(a,b,c)”是一个逗号表达式,它的值等于c的值。
混合运算与数据转换 运算符的操作数属于不同的数据类型,运算时通常会将这些操作数转换为同一类型 char ch; int i; float f; double d; result=(ch/i)+(f*d)-(f+i); int double float double
数据强制转换 转换格式 (数据类型)表达式
范例 #include <stdio.h> void main() { double a=3.784; printf("%d\n",(int)a); }
顺序结构 printf()输出函数 scanf()输入函数 putchar()函数 getchar()函数
printf ()函数 作用:在标准输出设备(显示器)控制台上显示数据 语法格式: printf (“格式控制符 ”, 参数列表); 需要由“ ”括起来。由文本字符和空格、格式命令和非打印字符组成 都需要一个格式命令-与参数列表需要在数量、类型和顺序上匹配
Printf()函数的例题(printf04.c) #include <stdio.h> void main() { printf("静以修身,\n 俭以养德。\n 非淡泊无以明志;\n %s\n","非宁静无以致远!!!"); }
格式控制符由三类项目中的一项或多项组成: printf ()函数 格式控制符由三类项目中的一项或多项组成: 文本字符:由可打印字符组成 格式命令: 以 % 符号开始,随后紧跟与数据项相应的格式代码 非打印字符:包括制表符、空格和新行
文本与空格(text04.c) 范例: #include <stdio.h> void main() { printf(" 谋事在人, 成事在天"); }
常用的格式控制符 %d —以带符号的十进制形式输出整数 %o: 以八进制无符号形式输出整数 %x: 以十六进制无符号形式输出整数
常用的格式控制符 %u:以无符号十进制形式输出整数 %c:以字符形式输出,只输出一个字符 %s:输出字符串 %f:以小数形式输出单,双精度数,隐含输出六位小数 %e:以指数形式输出实数 %g:选用%f或%e格式中输出宽度较短的一种格式,不输 出无意义的0
格式控制符(form04.c) 范例 #include <stdio.h> void main() { int number_1=65; char number_2='b'; printf("number_1=%d\n",number_1); printf("number_1=%c\n",number_1); printf("number_2=%c\n",number_2); printf("number_2=%d\n",number_2);}
格式控制符例2(ex0301.c) #include<stdio.h> int main() { unsigned int a=65535; int b=-2; printf("a=%d,%o,%x,%u\n",a,a,a,a); printf("b=%d,%o,%x,%u\n",b,b,b,b); }
格式符的修饰符(P.44-图2.7): 前缀修饰(P.46) 域宽 精度(域宽与精度说明格式:m.n) 长度修正符(l,h等)
常见的格式符的修饰符 “-” 修饰符 数据项在范围内向左对齐,从范围最左侧的位置开始输出数据项 域宽修饰符 可以用于浮点型、双精度型和字符数组型(字符串)。 范围宽度修饰符是一个整数,定义了数据项的最大范围宽度。
常见的格式符的修饰符(续) 精度修饰符 修饰符示例(modifier04.c) 可以用在浮点型、双精度型或字符数组型(字符串)中。如果用在浮点型或双精度型数据中,数字字符串表示小数右侧最多可输出的数字位数 注意:见P.45图2.8下方描述 修饰符示例(modifier04.c)
课后思考…… P.46-表2.9下方问题
输出的数据可以是常量、变量和表达式,但必须与格式控制符一一对应。 Printf()函数注意事项(一) 输出的数据可以是常量、变量和表达式,但必须与格式控制符一一对应。 #include <stdio.h> void main() { int i=5; float j=3.5; printf("%c,%d,%f,%lf\n",'a',i,j,i*j); }
printf()函数注意事项(二)(modifier042.c) #include <stdio.h> void main() { int f=5; float d=3.5; printf("%c,f=%d,d=%f,%lf\n",'a',f,d,f*d); } %d,%f,%e,%c,%s,一般为小写。而其它的d,f,s,c等字符作为普通字符处理。
printf()函数注意事项(三) 除了X,E,G外,其他各式字符必须用小写。 可以在printf函数中的“格式控制”字符串中包含转义字符。 一个格式说明必须以“%”开头,以9个格式字符之一为结束,中间可以插入附加格式字符。 想输出%,则应该在格式控制字符串中用连续两个%表示
printf()函数注意事项(四) Printf()中输出表达式的运算顺序,见书中P.47例2.13
非打印字符(转义字符) \n——换行 \t——制表符键(右移四个字节的位置)
定义一个字符型变量a=‘b’;请在屏幕上输出b: 课堂练习 定义一个字符型变量a=‘b’;请在屏幕上输出b: 方法1: Printf(“b”); 方法2: Printf(“%c”,a);
scanf()函数 作用:从外部输入设备(键盘)接受数据(具体的说,它是按照格式参数的要求,从终端上把数据传送到地址参数所指定的内存空间中) 语法格式 scanf("control string ", argument list); 控制字符串 地址列表 请注意:printf()语句中的使用的格式极其语法同样适用与scanf()语句(参阅P.48-52) 在输入数据时,格式说明字段中的格式码以及长度修饰符所指定的类型必须与地址参数的类型一致(例2.14) 是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址
使用scanf函数时应注意的问题 : (1)scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。 (2) 如果在“格式控制”字符串中除了格式说明以外还有其他字符, 则在输入数据时在对应位置应输入与这些字符相同的字符。 (3) 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入(P.53-例2.20,2.21) (4) 在输入数据时,遇以下情况时认为该数据结束。 ① 遇空格,或按“回车”或“跳格”(Tab)键; ② 按指定的宽度结束,如“%3d”,只取3列; ③ 遇非法输入。【例2.22-2.23】
单字符输出函数putchar() 作用:向屏幕的光标处输出一个字符。 格式 单个字符 转义序列 字符变量 putchar (参数);
putchar()示例 #include <stdio.h> void main() { char ch_1='9'; putchar('B'); putchar('o'); putchar('y'); putchar('\t'); putchar(ch_1); putchar('\n');}
字符输入函数getchar() 作用:从系统输入一个字符。 语法格式: getchar ( ); ()没有任何参数
getchar()示例(getchar04.c) #include <stdio.h> void main() { char ch; ch=getchar(); putchar(ch); putchar('\n'); }
课后作业 写出下列问题的程序: 输入一个小写字母,将其以大写的形式输出。 计算圆的面积并输出它的值. 要求:(1)用读入方式给半径r(实型变量)输入值. (2)求值后,对小数点后第三位数进行四舍五入
课后作业(选) 编写程序,设计一个学生成绩管理的功能菜单,菜单功能包括,A学生信息录入;B学生成绩统计;C学生成绩查询;D退出;