C语言程序设计课件完整版.ppt_第1页
C语言程序设计课件完整版.ppt_第2页
C语言程序设计课件完整版.ppt_第3页
C语言程序设计课件完整版.ppt_第4页
C语言程序设计课件完整版.ppt_第5页
已阅读5页,还剩170页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计 主讲人:汪洋 第一章 C语言概述 printf(“htibbjk”); 例2.1结果 程序运行后在打印机上得到以下结果 : fabcgde hjik 注意在显示屏上最后看到结果以与 上述打印结果不同,是: fgde hjk 2.2.4 字符串常量 C语言中,字符串变量是由一对双引 号括起来的字符序列,如 “China”,“$3.232”。 注意:不要将字符常量与字符串常量混淆。 字符常量与字符串常量的区别 l字符常量是由单引号括起来的,字符串常量 是由双引号括起来的; l字符常量只能是单个字符,字符串常量则可 是零个或多个字符; l可把一个字符常量赋予一个字符变量,但不 能把一个字符串变量赋予一个字符变量,C 语言中没有相应的字符串变量,可用字符数 组来存放字符串常量; l字符常量占一个字节的内存,字符串常量占 的内存字节数等于字符串中字节数加1,最 后一个字节存放字符0作为字符串结束标 志。 2.2.5 符号常量 C语言中,可用一个标识符来表示 一个常量,称为符号常量又称为宏定 义,使用前须先定义,其定义规则为 : #define 标识符 常量 例2.2 符号常量的使用 #define PRICE 30 main() int num,total; num=10; total=num*PRICE; printf(“total=%d”,total) ; 使用符号常量的好处: 含义清楚; 在需要改变一个常量 时能做到“一改全改”; 2.3 变量 变量是指在程序运行中其值是变化的量 。 一个变量应该有一个变量名,在内存中 占据一定的存储单元,在该存储单元中存 放变量的值。 3变量值 a 变量名 存储单元 图2.1 语言中,要求对变量作强制定义 ,即“先定义,后使用”。 l便于发现错误; l为每一个变量指定确定类型,在编译 时就能为其分配相应的存储单元。 整型数据在内存中的存储方式 整型数据在内存中是以二进制形式 存放的。若定义了一个整型变量i: int i=10; 图3.2(a)是数据存放的示意图,图 3.2(b)是数据在内存中实际存放的情况 ; i 10 (a) i 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 (b) 图2.2 实际上,整型数值是以补码表示的 。一个正数的补码与其原码相同,求 负数的补码方法:将该数的绝对值的 二进制形式按位取反再加1。例如求- 10的补码: 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 10的原码 取反 再加1得-10的 补码 .3.1 整型变量 l有符号基本整型signed int l有符号短整型 signed short int l有符号长整型 signed long int l无符号基本型 unsigned int l无符号短整型 unsigned short int l无符号长整形 unsigned long int .整型变量的分类: 类型说明符数的取值范围字节数 signed int-3276832767 即 -215(215-1)2 unsigned int065535 即 0(216-1)2 signed short int -3276832767 即 -215(215-1)2 unsigned short int 065535 即 0(216-1)2 signed long int-21474836482147483647 即 -231(231-1) 4 unsigned long int 04294967295 即 0(232-1)4 表2.1整型数据的所占的内存字节数与取值范围 2.整型变量的说明 类型说明符 变量名标识符,变量名 标识符,.; 如:int a,b,c; unsigned short x,y; 例2.3 整型变量的定义和运算 见教材P34例2.3 2.3.2 实型变量 l单精度型 float 占4个字节内存,提供7位有效数字, l双精度型 double 占8个字节内存,提供16位有效数字。 整数没有误差,实数有精度,有误差, 提供6位小数,7位有效数字。 2.实型变量的说明 格式和书写规则同整型变量说明相同, 如:float s,t; double h,k; 例2.4实型数据的舍入误差 main() float a,b; a=123456.789e5; b=a+20; printf(“%f,%f”,a,b); 结果: 12345678848.000000,12345678848.000000 误差原因分析 b的理论值应是12345678920,而一个 实型变量只能保证的有效数字是7位有 效数字,后面的数字是无意义的,并 不准确表示该数,从结果看出,把20 加在后几位上,是无意义的,应当避 免将一个很大的数与一个很小的数直 接相加减,否则就会“丢失”小的数。 与此类似,用程序计算1.0/3*3的结果 并不等于1。 2.3.3 字符变量 字符变量用来存放字符常量,只能 存放一个字符,占用1个字节内存。 字符变量定义如下: char c1,c2; l1. 字符数据在内存中的存储 将一个字符常量放到一个字符变量中 ,不是把该字符本身放到内存单元中, 而是将该字符的相应的ASC 代码存放 在存储单元中,如字符a的ASC 代码为97 ,b为98, 9798 c1c2 0 1 1 0 0 0 0 10 1 1 0 0 0 1 0 c1 c1 图2.3 在内存中,字符数据以ASC码存 储,它的存储形式与整数存储形式类 似,C语言允许对整型变量赋以字符值 ,也允许对字符变量赋以整型量。在 输出时,允许把字符变量按整型量输 出,也允许把整型变量按字符型量输 出。 注意:当整形变量按字符型量处理 时,只有低八位参与处理。 例2.5 向字符型变量赋以整型值 main() char c1,c2; c1=97; c2=98; printf(“%c,%cn”,c1,c2); printf(“%d,%dn”,c1,c2); 结果: a,b 97,98 2. 补充 Turbo C将字符变量中的最高位作为符 号位,也就是将字符处理成带符号的整数, 即signed char型。它的取值范围是-128127 。如果使用ASC码为0127间的字符,由 于字节中最高位为0,因此用%d输出时,输 出一个正整数。如果使用ASC码为 128255间的字符,由于在字节中最高位为1 ,用%d格式符输出时,就会得到一个负整 数。例如: main() char c=130;printf(“%d”,c); 得到-126。如果不想按有符号处理,可 以将变量定义为unsigned char类型,这时其 取值范围是0255。signed char和unsigned char 相仿,但它只有一个字节。 例2.6 main() char c1=130; unsigned char c2=130; printf(“c1=%d,c2=%dn”,c1,c2); 结果:c1=-126,c2=130 2.3.4 变量赋初值 程序中常需要对一些变量预先设置初 值。C语言允许在定义变量的同时使变量 初始化,如 int a=3; float f=3.56; char c=a; 也可以使被定义的变量的一部分赋初值, 如: int a,b,c=5; 如果对几个变量赋予初值3,应写成 int a=3,b=3,c=3; 不能写成:int a=b=c=3; int a=3; 相当于: int a; a=3; 2.4 运算符和表达式 l运算符是一些特定的符号,它用来对数据 进行某些特定的操作; l运算对象(操作数)是用来进行运算的数 据,包括常量、变量等; l表达式是用运算符将运算对象连接起来的 式子。 如1+2,1和2为运算对象,而1+2就是表达 式。 2.4.1 运算符种类、优先级和结合性 l算术运算符 用于各类数值计算。运算符有:加(+)、减 (-)、乘(*)、除(/)、求余(或称模运运算 ,%)、自增(+)、自减(-)。 l关系运算符 用于比较运算。运算符主要有:大于()、 小于(=)、小 于等于() 。 l赋值运算符 用于赋值运算。赋值运算符有:简单赋 值(=)、复合算术赋值(+=,-=,*=,/=,%=)、 复合位运算赋值( (int)(x+y); (float)(5%3) l其他运算符 其他运算符有:括号()、数组下标、成 员运算符.和用指针访问结构体成员的 指向运算符-。 2.运算符的运算优先级 C语言中,运算符的运算优先级共 分为15级。1级最高,15级最低。在表 达式中,优先级较高的先于优先级低 的进行运算。 如求表达式x+y*z的值: y的值左侧为 加号,右侧为 乘号, 而乘号优先于加号,因此相当于 x+(y*z),即先进行乘法运算,然后再 进行加法运算。 3. 运算符的结合性 C语言的运算符不仅具有不同的优 先级,还有结合性的问题。在表达式 的运算过程中,各运算对象参与运算 的先后顺序不仅要遵循运算符优先级 别的规定,还要受运算符结合性的制 约,当一个运算对象两侧的运算符优 先级别相同时,需按运算符的结合性 来处理,以便确定是自左向右进行运 算还是自右向左进行运算。 C语言中运算符的结合性分为两种: 即左结合性(自左向右)和右结合性(自右 向左)。 例如:算术运算符就是左结合性的运算符 表达式:x-y+z,运算对象y的左侧运算 符“-”和右侧运算符“+”优先级相同,应 按结合性来进行自左向右的运算,即先 执行x-y运算,再执行+z的运算。 赋值运算符是右结合性的运算符 表达式:x=y=z,由于赋值运算符“=”的 右结合性,所以先执行y=z运算,再执行 x=(y=z)运算。 优 先 级 别 运算符运算形式结合方向含义 1 () . - (e) ae x.y p-x 自左至右 圆括号 数组下标运算符 结构体成员运算符 指向结构体成员运算符 2 - + - ! (t) * printf(“%d,%d,%dn”,c+=c+,c+8,+c); printf(“%dn”,c+=c+,c+8,+c); 注意:Turbo C规定,printf()函数中出现多个表达式输 出项时,先按从右到左的顺序计算各表达式的值,然后 再从左到右输出结果。本例中先计算+c,得c=6, 然后计 算c+8得14,最后计算c+=c+,得c=13。 l1.有如下两个程序,试比较结果 main() int i=3; printf(“%d,%dn”,(i+)+(i+)+(i+),i); main() int i=3,k; k=(i+)+(i+)+(i+); printf(“%d,%dn”,k,i); 补充: 结果:12,3 结 果: 9,6 l2.当出现难以区分的若干个+或-组成 运算符串时,C语言规定,自左向右取 尽可以多的符号组成运算符。 例如:设整型变量x,y均为3,则: x+y 应理解为(x+)+y,结果为6,x 值 为4,y值不变 x-y 应理解为(x-)-y,结果为0,x 值 为2,y值不变 3.算术运算符的优先规则 l单目算术运算符(-、+、-)优先于*、/、 %算术运算符优先于+、-算术运算符; l同级单目算术运算符的结合性自右向左; l同级双目算术运算符的结合性自左向右。 l 4.算术表达式 用算术运算符和括号将运算对象连 接起来的式子,称为算术表达式。例 如下面的表达式为算术表达式: a*b/c-1.5+a 如果一个算术运算符的两侧的数据 类型不同,则按下面所述的内容先自 动进行类型转换,使二者具有同一类 型,然后再进行运算。 各类数值型数据间的混合运算 整型(包括 int, short, long, unsigned int, unsigned short, unsigned long)和实型 (包括 float, double)数据可以混合运算。 而字符型数据可以与整型通用,因此整 型、实型和字符型数据间可以混合运算 ,在进行运算时,不同类型 的数据要 先换成同一类型,然后进行运算,转换 规则如下图所示: doublefloat long unsigned int char, short 高 低 图中横向向左的箭头表示必须的转换,如字符数据必须先转 换为整数,short型转换为int,float型数据在运算时一律先转换 为double型,以提高精度(即使是两个float型数据相加,也先 都化成double型,然后再相加)。 纵向的箭头表示当运算为不同类型时转换的方向。例如int 型与double型数据进行运算,先将int型数据转换为double型 ,然后在两个同类型(double型)数据间进行运算,结果为 double型。注意箭头方向只表示数据类型级别的高低,由低 向高转换。不要理解为int型先转换为unsigned int型,再转成 long型,再转成double型。如果一个int型数据与一个double型 数据运算,是直接将int型转换成double型。 例2.8 假设已指定i为int型变量,f为float型 变量,d为double型变量,e为long型变 量,有以下式子: 10+a+i*f-d/e 在计算机执行时从左至右扫描,运算次序为:进行 10+a的运算,先将a转换为整数97,运算结果为107; 由于“*”比“+”优先,先进行i*f的运算。先将i与f都转 换成double型,运算结果为double型;整数107与i*f的 结果相加。先将整数107转换成double型,再相加,结果 为double型;将变量e化为double型,d/e结果为double 型;将10+a+i*f的结果与d/e的商相减,结果为 double型。 main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); 结果: x=3.600000,i=3 上述类型转换由系统自动进行的,另一种类型转 换为强制类型转换。 需要说明的是在强制类型转换时,得到一个所需 类型的中间变量,原来变量的类型未发生变化。如: (int)x;如果x原来指定为float型,进行强制类型运算后 得一一个int型的中间变量,它的值等于x 的整数部分 ,而x的类型不变(仍为float型)。见下例2.9: 2.4.3 关系运算符和关系表达式 所谓“关系运算”实际上是“比较运 算”。将两个值进行比较,判断其比较 的结果是否符合给定的条件。例如, a3是一个关系表达式,大于号()是一 个关系运算符,如果a的值为5,则满足 给定的“a3” 条件,因此关系表达式的 值为逻辑值“真”(即“条件满足”),用整 数“1”来表示;如果a的值为2,不满足 “a3”的条件,则称关系表达式的值为 逻辑值“假”,用整数“0”来表示。 l1. 关系运算符及其优先次序 C语言提供下面6种关系运算符: (大于) = (大于等于) = (等于) != (不等于) 优先级相同(高) 优先级相同(低) 关于优先顺序: 前4种关系运算符(、=)的优先级别相同,后 2种也相同。前4种高于后2种; 关系运算符的优先级低于算术运算符; 关系运算符的优先级高于赋值运算符。 例2.10 例如: ca+b 等效于c(a+b) ab=c 等效于(ab)=c a=bc 等效于a=(bc) 用关系运算符将两个表达式(可以是 算术表达式、关系表达式、逻辑表达 式、赋值表达式、字符表达式)连接起 来的式子,称为关系表达式。 关系表达式的值是一个逻辑值,即“ 真”或“假”。例如,关系表达式“5=3” 的值为“假”,“5=0”的值为“真”。C语 言没有逻辑型数据类型,以1代表“真” ,以0代表“假”。 l2. 关系表达式 例2.11 a=3,b=2,c=1,则: 关系表达式“ab”的值为“真”,表达式的值为1; 关系表达式“(ab)=c”的值为“真”(因为ab的 值为1,等于c的值),表达式的值为1; 关系表达式“b+cb d的值为1 f=abc f 的值为0(因为“”运算符是自左 向 右的结合方向,先执行“ab”得值 为 1,再执行关系 运算“1c”,得值 0,赋给f)。 例2.12 P36例2.6 main() int a=5,b=3; float x=3.14,y=6.53; printf(“%d,%dn”,a+b!=a-b,xb) printf(“a=%d,b=%d,c=%dn”,a,b,c); 结果:a=0,b=6,c=0 lmain() int m,n,l,a,b,c,d; m=n=a=b=c=d=0; l=(m=a= =b)|(n=c= =d); printf(“m=%d,n=%d,l=%dn”,m,n,l); 结果:m=1,n=0,l=1 2.4.5赋值运算符和赋值表达式 l1.简单赋值运算符 赋值符号“=”就是赋值运算符, 它的作用是将一个数据赋给一个 变量。如“a=3”的作用就是执行一 次赋值运算,把常量3赋给变量a 。也可以将一个表达式的值赋给 一个变量。如:x=a+b*c。 l2.复合赋值运算符 在赋值符“=”之前加上某些二目运算 符可构成复合赋值运算符。 复合算术赋值运算符有:+=、-=、 *=、/=、%=五种。 复合位运算赋值运算符有:=、 int b;b=a; printf(“%d”,b); 结果输出-1 将signed型数据赋给所占字节相同的 unsigned型变量,同样将signed型数据所占 内存的各位原样送到unsigned型变量内存中 ,若signed型数据为非负值,则unsigned型 变量值与signed型数据值相同;若为负值, 要根据补码知识进行转换。如: main() unsigned a; int b=-1;a=b; printf(“%u”,a); 结果输出65535。 2.4.6 条件运算符和条件表达式 l1.条件运算符 条件运算符要求有3个操作对象 ,它是C语言中唯一的三目运算符 。 条件运算符的优先级规则: l其他运算符优先于条件运算符, 条件运算符优先于赋值运算符和 逗号运算符; l条件运算符的结合性是自右向左 。 2.条件表达式 用条件运算符构成的表达式称为条 件表达式,其一般形式为: 表达式1?表达式2:表达式3 条件表达式的执行顺序是:先计算 表达式1的值,若值为非0(真),则计算 表达式2的值,并将表达式2的值作为 整个条件表达式的结果;若表达式1的 值为0(假),则计算表达式3的值,并将 表达式3的值作为整个条件表达式的结 果。 例2.14 main() int a=1,b=2,c=3,d=4,e; e=ab?a:cb?a:cd?c:d相当于 ab?a:(cd?c:d)。 2.4.7 逗号运算符和逗号表达式 l C语言中提供了一种特殊的运算符 逗号运算符。它用来将两个表达式 连接起来组成一个表达式,如3+5,6+8 称为逗号表达式。其一般形式为: 表达式1,表达式2 其求解过程是:先求解表达式1,再 求解表达式2,并将表达式2的值作为 整个逗号表达式的值。如上面的逗号 表达式“3+5,6+8”的值为14,又如 a=3*5,a*4 由表2.2可知:赋值运算符的优先级别 高于逗号运算符,因此应先求解a=3*5 这个赋值表达式,计算得这个赋值表达 式值为15,再求解a*4这个表达式,得 60,整个逗号表达式的值为60。 l一个逗号表达式又可以与另一个表达式 组成一个新的表达式,所以逗号表达式 的一般形式可扩展为: 表达式1,表达式2,表达式3表达 式n 顺序求解这n个表达式,整个表达式值 为表达式n的值。 l请注意并不是任何地方出现的逗号都 是作为逗号运算符,例如 l 变量说明:int a,b,c; l函数参数:printf(“%d,%d,%d”,a,b,c); 其中的“a,b,c”并不是一个逗号表达式 ,它是printf函数的3个参数。 2.4.8 位运算符和位运算 l1.“按位与”运算符( 意思是在显示屏上输出括号内字符 变量ch所代表的字符,ch可以是字符 数据(常量或变量)和整型数据(常量或 变量)。 例3.1 教材P49例3.7 #include main() char a=Y;b=e;putchar(a);putchar(b); putchar(s);putchar(n);putchar(141) ; Yes a 结果: 3.1.2字符输入函数(getchar) getchar函数的作用是从终端(键盘) 设入一个字符。其一般形式为: getchar(); getchar()只能接收一个字符,该字符 可以赋给一个字符变量或整型变量,也 可以不赋给任何变量,作为表达式的 一个运算对象参加表达式的运算处理 。 例3.2 教材P50例3.8 #include main() char c;c=getchar();putchar(c); 例3.3 教材P50例3.9 #include main() int c;c=getchar(); c=aa=b;b=a; printf(“%d,%dn”,a,b); l2、if(表达式) 语句1; else 语句2; 表达式 真 语句1 假 语句2 例4.2用if-else语句重写例4.1。 main() int a,b; scanf(“%d,%d”, if(a main() char c; printf(“input a character:”;c=getchar(); if(c=0break; case E:printf(“=60 4.3 循环结构 1*1+2*2+3*3=? int s; s=1*1+2*2+3*3; 引入循环结构就可以简化程序中大量的重复操 作。 在C语言中,循环结构是由while语句,do while 语句和for语句来实现的。为了更方便地控制程序 流程,C语言还提供了两个循环辅助语句:break语 句和continue语句。 1*1+2*2+3*3+100*100=? 4.3.1 while语句 while(表达式) 语句; 表达式 循环体 真 假 while语句的工作过程是: 首先计算括号中的测试 表达式,如果表达式的值 为真,则执行循环体。循 环体中的语句执行完后, 返回while 处,重新计算测 试表达式。如果测试表达 式的值还为真,则继续执 行循环体。依此循环,直 至测

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论