1 / 70

第 6 章 基本的程序语句

第 6 章 基本的程序语句. 本章知识点: 预备知识 数据类型及取值范围 标识符、常量与变量 不同类型数据间的转换 运算符和表达式 标准输入输出函数. 计算机中数的表示及进制转换 数码、基与权 数码:表示数的符号 基:数码的个数 权:每一位所具有的值 数制. 6.0 预备知识. 进制之间的转换. 二进制转换成十进制 ( 整数 + 小数 ) 方法:按权相加. 十六进制数. 数制. 十进制数. 二进制数. 八进制数. 数码. 0~9. 0~1. 0~7. 0~9,A~F,a~f. 基. 10. 2. 8. 16. 权.

Télécharger la présentation

第 6 章 基本的程序语句

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第6章 基本的程序语句 本章知识点: 预备知识 数据类型及取值范围 标识符、常量与变量 不同类型数据间的转换 运算符和表达式 标准输入输出函数

  2. 计算机中数的表示及进制转换 数码、基与权 数码:表示数的符号 基:数码的个数 权:每一位所具有的值 数制 6.0预备知识

  3. 进制之间的转换 • 二进制转换成十进制(整数+小数) 方法:按权相加

  4. 十六进制数 数制 十进制数 二进制数 八进制数 数码 0~9 0~1 0~7 0~9,A~F,a~f 基 10 2 8 16 权 10º,10¹,10²,… 2º,2¹,2²,… 8º,8¹,8²,… 16º,16¹,16²,… 表示 特点 逢十进一 逢二进一 逢八进一 逢十六进一 十六进制:81AE=816³+116² +1016¹+1416º 八进制:4275=48³+28² +78¹+58º 十进制:4956= 410³+910² +510¹+610º 二进制:1011=12³+02² +12¹+12º

  5. 十进制转换成二进制 • 方法:(整数部分) • 连续除以2,从低到高记录余数,直至商为0 • 方法:(小数部分) • 连续乘以2,从高到低记录整数,直至余下的小数为0或者满足精度要求 例 把十进制数7转换成二进制数 7 2 余1 余1 2 3 (7)10=(0111)2 2 1 余 1 0 余 0 例 ( 0.625)10=(0.101)2

  6. 0 1 2 3 4 5 7 6 7 6 5 4 3 2 1 0 7 6 8 5 9 4 10 3 ……... 2 1 字节和位 • 内存以字节为单元组成 • 每个字节有一个地址 • 一个字节一般由8个二进制位组成 • 每个二进位的值是0或1

  7. 数值的表示方法——原码、反码和补码 • 原码:最高位为符号位(0正数,1负数),其余各位为数值本身的绝对值 • 反码: • 正数:反码与原码相同 • 负数:符号位为1,其余位对原码取反 • 补码: • 正数:原码、反码、补码相同 • 负数:最高位为1,其余位为原码取反,再对整个数加1

  8. (用一字节8位表示数) 原码 反码 补码 +7 00000111 00000111 00000111 -7 10000111 11111000 11111001 +0 00000000 00000000 00000000 -0 10000000 11111111 00000000 正0代表数字0 负0代表-128 (规定) • 负数补码转换成十进制数:最高位不动,其余位取反加1 例 补码:11111001 取反:10000110 加1: 10000111=-7

  9. 定点数与浮点数 • 定点数:小数点位置固定的数,(整数与纯小数) • 浮点数:小数点位置是浮动的 (有整数和小数)单精度和双精度 例 234 ,256 ,0.123 ,0.0056 是定点数 例 61.329是浮点数 表示方法见P11

  10. 整 型 基本类型 单精度型float 实型 双精度型double 字符类型char 数组 短整型short 结构体struct C 数 据 类 型 整型int 共用体union 构造类型 长整型long 枚举类型enum 指针类型 空类型void 定义类型typedef 6.1数据类型及取值范围 • 数据类型总表 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作

  11. 基本数据类型 类型 符号 关键字 数的表示范围 所占位数 (signed)int 16 -32768~32767 16 (signed)short -32768~32767 32 (signed)long -2147483648~2147483647 unsignedint 16 0~65535 unsignedshort 16 0~65535 unsignedlong 32 0~4294967295 32 float 有 3.4e-38~3.4e38 64 有 double 1.7e-308~1.7e308 8 有 char -128~127 无 8 0~255 unsigned char 有 整型 无 实型 字符型 说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例: 请看int和unsigned int

  12. int型: 最大:32767 01 11 11 11 11 11 11 11 10 00 00 00 00 00 00 00 11 11 11 11 11 11 11 11 最小:-32768 unsigned int型: 最大:65535 00 00 00 00 00 00 00 00 最小:0

  13. b=b-6; m=m*10+10; t=t*10; printf("After change:\n"); printf("a+4=%d\n",a); printf("b-6=%d\n",b); printf("m*10+10=%u\n",m); printf("t*10=%e\n",t); } • 例1:运行下面的程序,了解变量的取值范围和C语言的特性。 /*example6_1.c 变量的取值范围测试*/ #include <stdio.h> main() { int a=32766,b=-32766; unsigned m=6553; float t=3.4e+37; printf("a=%d\n",a); printf("m=%u\n",m); printf(“t=%e\n”,t); a=a+4;

  14. 标识符 定义:用来标识变量、常量、函数等的字符序列 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 大小写敏感 不能使用关键字 长度:最长32个字符 命名原则: 见名知意 不宜混淆 如l与I, o与0 6.2标识符、变量与常量 • 例:判断下列标识符号合法性 • sum Sum M.D.John day Date 3days • student_name #33 lotus_1_2_3 • char a>b _above $123 3days M.D.John #33 char a>b $123 < >

  15. 变量 概念:其值可以改变的量 变量名与变量值 变量定义的一般格式: 数据类型 变量1[,变量2,…,变量n]; int a=1, b=-3,c; 地址 地址 地址 …... main() { int a,b=2; a=1; float data; data=(a+b)*1.2; printf(“data=%f\n”,data); } 1 a 2字节 变量定义 b -3 可执行语句 2字节 main() { int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%f\n”,data); }  c 2字节 …... 随机数 内存 编译程序根据变量定义为其 分配指定字节的内存单元 • 变量初始化:定义时赋初值 例: int a,b,c; float data; • 变量的使用:先定义,后使用 决定分配字节数 和数的表示范围 合法标识符 例: int a=2,b,c=4; float data=3.67; char ch=‘A’; int x=1,y=1,z=1; int x=y=z=1; • 变量定义位置:一般放在函数开头 例1 int student; stadent=19; //Undefined symbol ‘stadent’ in function main 例2 float a,b,c; c=a%b; //Illegal use of floating point in function main

  16. 占字节数随机器不同而不同,一般占一个机器字占字节数随机器不同而不同,一般占一个机器字 short≤int≤long 可用sizeof(类型标识符)测量 整型变量 • 实型变量 • float:占4字节,提供7位有效数字 • double:占8字节,提供15~16位有效数字 例1: float a; a=111111.111; /* a=111111.1*/ 例2: double b; b=111111.111; /* b=111111.111*/ • 字符型变量 • 字符变量存放字符ASCII码 • char与int数据间可进行算术运算 例 a=‘D’; /* a=68; */ x=‘A’+5; /* x=65+5; */ s=‘!’+‘G’ /* s=33+71; */ 没有字符串变量,用字符数组存放

  17. 例子 宏定义 变量定义 输出结果 /*example6_2.c*/ #define PRICE 12.5 main() { int num=3; float total; char ch1,ch2=‘D’; total=num*PRICE; ch1=ch2-‘A’+‘a’; printf(“total=%f,ch1=%c\n”,total,ch1); } 运行结果: total=37.500000, ch1=d

  18. 常量 • 定义:程序运行时其值不能改变的量(即常数) • 分类: • 符号常量:用标识符代表常量 • 定义格式: #define符号常量 常量 • 一般用大写字母 • 是宏定义预处理命令,不是C语句 • 直接常量: • 整型常量 请点击: • 实型常量 请点击: • 字符常量 请点击: • 字符串常量 请点击: 例 符号常量举例 #define PRICE 30 main() { int num,total; num=10; total=num*PRICE; printf("total=%d",total); } 如 #define PRICE 30 运行结果:total=300 < >

  19. 整型常量(整常数) 问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10 83 291 255 • 三种形式: • 十进制整数:由数字0~9和正负号表示.如 123,-456,0 • 八进制整数:由数字0开头,后跟数字0~7表示.如0123,011 • 十六进制整数:由0x开头,后跟0~9,a~f,A~F表示. 如0x123,0Xff 问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10 • 整型常量的类型 • 根据其值所在范围确定其数据类型 • 在整常量后加字母l或L,认为它是long int型常量 例 30000 为int型 65536 为long int 型 例 12 与 12L

  20. 例3:了解整型常量的不同进制表示法。 /*example6_3.c */ #include<stdio.h> main() { printf("十六进制0x80的十进制值为:%d\n",0x80); printf("八进制0200的十进制值为:%d\n",0200); printf("十进制128的十进制值为:%d\n",128); printf("十进制128的十六进制值为:%x\n",128); printf("十进制128的八进制值为:%o\n”,128); }

  21. 实型常量(实数或浮点数) • 表示形式: • 十进制数形式:(必须有小数点) 如0.123, .123, 123.0, 0.0, 123. • 指数形式:(e或E之前必须有数字;指数必须为整数)如12.3e3 ,123E2, 1.23e4 , e-5 , 1.2E-3.5 • 实型常量的类型 • 默认double型 • 在实型常量后加字母f或F,认为它是float 型

  22. 字符常量 • 转义字符及其含义: 转义字符 含义 转义字符 含义 \t \n 换行 水平制表 垂直制表 \b 退格 \v \r 回车 \f 换页 \a 响铃 \\ 反斜线 \‘ 单引号 \“ 双引号 < 2位16进制数代表的字符 \ddd 3位8进制数代表的字符 \xhh • 定义:用单引号括起来的单个普通字符或转义字符. 如 ‘a’ ‘A’ ‘?’ ‘\n’ ‘\101’ • 字符常量的值:该字符的ASCII码值 • 转义字符:反斜线后面跟一个字符或一个代码值表示 如 ‘A’——65, ‘a’——97, ‘0’——48 , ‘\n’——10 例 转义字符举例 /*example2_4.c */ main() { printf("\101 \x42 C\n"); printf("I say:\"How are you?\"\n"); printf("\\C Program\\\n"); printf("Turbo \'C\'"); } 例: ‘A’-------’\101’-------’\x41’--------65 如 ‘\101’ -----------‘A’ ‘\012’ -----------’\n’ ‘\376’ -----------’’ ‘\x61’ -----------’a’ ‘\060’ -----------’0’ ‘\483’ ----------() 运行结果:(屏幕显示) A B C Isay:”How are you?” \C Program\ Turbo ‘C’ 例 见p23 例2-6 aaa

  23. 字符串常量 h e l l o \0 例 字符串“hello”在内存中 例 空串 “” \0 例 ‘a’ “a” a a \0 例: char ch; ch=‘A’; • 定义:用双引号(“”)括起来的字符序列 • 存储:每个字符串尾自动加一个 ‘\0’作为字符串结束标志 • 字符常量与字符串常量不同 例: char ch; ch=“A”;

  24. 隐式转换 什么情况下发生 运算转换------不同类型数据混合运算时 赋值转换------把一个值赋给与其类型不同的变量时 输出转换------输出时转换成指定的输出格式 函数调用转换------实参与形参类型不一致时转换 运算转换规则:不同类型数据运算时先自动转换成同一类型 6.3不同类型数据间的转换

  25. 例1 double float 说明: 高 必定的转换 long 运算对象类型不同时转换 unsigned 例2 int i; float f; double d; long l; int char,short 低 10+‘a’ +i*f - d / l int double double double double int int double double double double double int double double double ch/i + f*d - (f+i) char ch; int i; float f; double d;

  26. 一般形式:(类型名)(表达式) 例: (int)(x+y) (int)x+y (double)(3/2) (int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变 显式转换(强制转换) 较高类型向较低类型转换时可能发生 例 main() { float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); } 结果:x=3.600000,i=3 精度损失问题

  27. 6.4 运算符和表达式 算术运算符:(+ - * / % ++ --) 关系运算符:(< <= == > >= !=) 逻辑运算符:((! && ||) 位运算符 :(<< >> ~ | ^ &) 赋值运算符:(= 及其扩展) 条件运算符:(?:) 逗号运算符:(,) 指针运算符:(* &) 求字节数 :(sizeof) 强制类型转换:(类型) 分量运算符:(. ->) 下标运算符:([]) 其它 :(( ) -) C 运 算 符

  28. 运算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符优先级别 结合方向 结果的类型 学习运算符应注意

  29. 基本算术运算符: + - * / % 结合方向:从左向右 优先级: - ---->* / % -----> + - (14) (13) (12) 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据 算术运算符和表达式 例 5%2 = -5%2 = 1%10 = 5%1 = 5.5%2 1 2 例 5/2 = -5/2.0 = -1 -2.5 1 0 ()

  30. d1=a+b*c-b/a+b%c*a; /* 复杂表达式1 */ d2=(a+b)*c-(b/a)+(b%c)*a; /* 复杂表达式2 */ d3=a/b; d4=c%b; printf("d1=%d, d2=%d, d3=%d, d4=%d\n", d1,d2,d3,d4); x=3.2; y=2.4; z1=x+y/x-y; /* 复杂表达式3 */ z2=(x+y)/(x-y); /* 复杂表达式4 */ z3=y/b; printf("z1=%f, z2=%f, z3=%f\n",z1,z2,z3); } 例: 阅读下面的程序,了解由算术运算符组成的表达式。 /*example6_8.c */ #include<stdio.h> main() { int a,b,c,d1,d2,d3,d4; double x,y,z1,z2,z3; a=8; b=3; c=10; 程序运行结果: d1=62, d2=134, d3=2, d4=1 z1=1.550000, z2=7.000000, z3=0.800000

  31. 作用:使变量值加1或减1 种类: 前置 ++i, --i (先执行i+1或i-1,再使用i值) 后置 i++,i-- (先使用i值,再执行i+1或i-1) 自增、自减运算符++ -- 例 j=3; k=++j; j=3; k=j++; j=3; printf(“%d”,++j); j=3; printf(“%d”,j++); a=3;b=5;c=(++a)*b; a=3;b=5;c=(a++)*b; //k=4,j=4 //k=3,j=4 //4 //3 //c=20,a=4 //c=15,a=4

  32. 自增、自减运算符++ -- 例 j+++k; (j++)+k; • 说明: • ++ -- 不能用于常量和表达式,如5++,(a+b)++ • ++ --结合方向: 自右向左 • 优先级:- ++ -- ------>* / % ----->+ - • (14) (13) (12) • 例 -i++  -(i++) • i=3; printf(“%d”,-i++); //-3 • 例 -i++ • i=3; printf(“%d”,-i++);

  33. 例: 阅读下面的程序,了解由++和--组成的表达式。 /*example6_11.c */ #include<stdio.h> main() { int a ; double x ; a=16; x =12.6; printf(“a1=%d,a2=%d,a3=%d\n”,a++,a++,a++); • printf(“a1=%d,a2=%d,a3=%d\n”, ++a, ++a, ++a); • printf(“x1=%f,x2=%f,x3=%f\n”,x--,x--,x--); • printf(“x1=%f,x2=%f,x3=%f\n”, --x, --x, --x); • }

  34. 简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量 赋值运算符和表达式 a+=3 a=a+3 x*=y+8 x=x*(y+8) x%=3 x=x%3 例 a=3; d=func(); c=d+2; • 复合赋值运算符 • 种类:+= -= *= /= %= 《= 》= &= ^= |= • 含义: exp1 op= exp2exp1 = exp1 op exp2

  35. 结合方向:自右向左 优先级: 2 左侧必须是变量,不能是常量或表达式 说明(1): • 赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型 • 例 3=x-2*y; • a+b=3; • 例float f; • int i; • i=10; • f=i; • 则f=10.0 • 赋值表达式的值与变量值相等,且可嵌套 例 int i; i=2.56; //结果i=2; 例: a=b=c=5 a=(b=5) a=5+(c=6) a=(b=4)+(c=6) a=(b=10)/(c=2) //表达式值为5,a,b,c值为5 // b=5;a=5 //表达式值11,c=6,a=11 //表达式值10,a=10,b=4,c=6 //表达式值5,a=5,b=10,c=2

  36. 例: a=12; a+=a-=a*a //a=-264 等价于a=a+(a=a-(a*a)) 例: int a=2; a%=4-1; a+=a*=a+=a*=3; //a=288 等价于a=a+(a=a*(a=a+(a=a*3)))

  37. 形式:表达式1,表达式2,……表达式n 结合性:从左向右 优先级: 1 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中 逗号运算符和表达式 //a=15,表达式值60 • 例 a=3*5,a*4 • a=3*5,a*4,a+5 • 例 x=(a=3,6*3) • x=a=3,6*a • 例 a=1;b=2;c=3; • printf(“%d,%d,%d”,a,b,c); • printf(“%d,%d,%d”,(a,b,c),b,c); //a=15,表达式值20 //赋值表达式,表达式值18,x=18 //逗号表达式,表达式值18,x=3 //1,2,3 //3,2,3

  38. 关系运算符 种类:< <= == >= > != 结合方向:自左向右 优先级别: 关系运算符和表达式 < <= > >= == != 优先级10(高) 优先级9(低) • 例 c>a+b //c>(a+b) • a>b!=c //(a>b)!=c • a==b<c //a==(b<c) • a=b>c //a=(b>c) • 关系表达式的值:是逻辑值“真”或“假”,用1和0表示 • 例 int a=3,b=2,c=1,d,f; • a>b • (a>b)==c • b+c<a • d=a>b • f=a>b>c //表达式值1 //表达式值1 //表达式值0 //d=1 //f=0

  39. 关系运算注意 例 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0==1.0 结果为 可改写为:fabs(1.0/3.0*3.0-1.0)<1e-6 0 例 注意区分“=”与“==” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a not equal to b”);

  40. 逻辑运算符和表达式(1) 逻辑运算符 种类: ! && || 逻辑运算真值表 a b !a !b a&&b a||b 真 真 假 假 真 真 真 假 假 真 假 真 假 真 真 假 假 真 假 假 真 真 假 假 • C语言中,运算量:0表示“假”, • 非0表示“真”, • 运算结果: 0表示“假”, • 1表示“真”,

  41. 逻辑运算符和表达式(2) ! :从右向左 && :从左向右 || :从左向右 ! (14) && (5) || (4) 高 低 • 优先级: • 结合方向: • 例 a<=x && x<=b • a>b&&x>y • a==b||x==y • !a||a>b // (a<=x) && (x<=b) //(a>b)&&(x>y) //(a==b)||(x==y) //(!a)||(a>b)

  42. 逻辑运算符和表达式(4) • 短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符 • 例 a&&b&&c //只在a为真时,才判别b的值; • 只在a、b都为真时,才判别 c的值 • 例 a||b||c //只在a为假时,才判别b的值; • 只在a、b都为假时,才判别 c的值 • 例 a=1;b=2;c=3;d=4;m=1;n=1; • (m=a>b)&&(n=c>d) //结果m=0,n=1 < >

  43. 非0 =0 expr1 例 if (a>b) printf(“%d”,a); else printf(“%d”,b); printf(“%d”,a>b?a:b); 取expr2值 取expr3值 条件运算符与表达式 • 一般形式: expr1 ? expr2 : expr3 • 执行过程 • 功能:相当于条件语句,但不能取代一般if语句 例 求 a+|b| printf(“a+|b|=%d\n”,b>0?a+b:a-b); • 条件运算符可嵌套 • 如 x>0?1:(x<0?-1:0) • 优先级: 3 例 (a==b)?’Y’:’N’ (x%2==1)?1:0 (x>=0)?x:-x (c>=‘a’ && c<=‘z’)?c-’a’+’A’:c • 结合方向:自右向左 • 如 a>b?a:c>d?c:d  a>b?a:(c>d?c:d) • expr1、expr2、expr3类型可不同,表达式值取较高的类型 例 x?‘a’:‘b’ //x=0,表达式值为‘b’; x‡0,表达式值为‘a’ x>y?1:1.5 //x>y ,值为1.0; x<y ,值为1.5

  44. 阅读下面的程序,了解三目运算符组成的表达式计算规则。阅读下面的程序,了解三目运算符组成的表达式计算规则。 /*example6_15.c 了解三目运算符的语法规则*/ #include <stdio.h> #include <stdlib.h> main() { int a=3,b=5,c; c=(a>b)?(a+b):(a-b); printf("The max value of a and b is: %d\n",c); a=6; b=2; c=(a>b)?(a-b):(a+b); printf("The max value of a and b is: %d\n",c); }

  45. 复杂表达式的计算顺序 C语言共有各类运算符47个,按优先级可分为11个类别共15个优先级。 运算符的优先级与运算方向:P34表2-10

  46. 例 阅读程序,分析复杂表达式的计算顺序。 /*example6_18.c 复杂表达式的计算顺序*/ #include <stdio.h> main() { int a=10,b=15,c=14,temp; temp= a+6>b && b-c>c; /* ① */ printf("a+6>b && b-c>c= %d\n",temp); temp=!a+b*c-b/a && b-a*!(c-a); /* ② */ printf("!a+b*c-b/a && b-a*!(c-a)= %d\n",temp); } 请分析并修改程序。

  47. C语言的基本语句结构 • C语言的语句可分为四大类: • 1.表达式语句 • 2.复合语句 • 3.控制语句 • 4.转向控制语句

  48. 1.表达式语句 • 一个独立的语句就是表达式语句。 • 如: • a=3*b-c/2; • i--; • ++j: • b=(a>3)? 1:0; • 2.复合语句 • 由一对花括号“{ }”将多个表达式语句括起来所组成。 • 如: • { • a=b+c; • x=y%a; • prinft("a=%d, x=%d\n", a, x); • }

  49. 3.控制语句 • 由控制结构组成的语句,有5种控制语句: • (1)选择(分支)语句:if…else。 • (2)多分支语句:switch。 • (3)for循环语句:for。 • (4)while循环:while。 • (5)do_while循环:do…while。 • 4.转向控制语句 • 由系统提供的关键字构成,用于改变程序的流程。 • 有4种转向控制语句: • (1)break;可用于switch语句和循环的语句。 • (2)continue;只适用于循环语句。 • (3)return;用在函数的结束处。 • (4)goto<标号>;可用于程序的任何地方,但不提倡使用。

  50. 6.5 标准输入输出函数 常用的标准输入/输出函数有如下几种。 (1)格式化输入/输出函数:scanf()/printf()。 (2)字符输入/输出函数:getc()/putc()。 (3)字符输入/输出函数:getch()/putch()。 (4)字符输入/输出函数:getchar()/putchar()。 (5)字符串输入/输出函数:gets()/puts()。 • C语言无I/O语句,I/O操作由函数实现 • #include <stdio.h>  不同的函数在功能上有所不同,使用时应根据具体的要求,选择合适的输入/输出函数。 • Stdout 表示屏幕,Stdin表示键盘

More Related