




已阅读5页,还剩479页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,计算机程序设计基础(C语言),2,1. 课堂要求很严格。 2. 多听,适时做笔记。 3. 上课不能讲闲话。 4. 课后认真完成作业、实验报告。 5. 有问题,及时与老师联系。,教 学 要 求,3,选用教材与参考书,主教科书 顾治华、陈天煌等 C语言程序设计 机械工业出版社 2007.2 参考教材 顾治华、陈天煌等C语言程序设计 实验指导 机械工业出版社 2007.2 参考书 谭浩强 C语言程序设计 清华大学出版社,4,课程内容,第一章 C语言程序设计概述 第二章 算法及算法设计简介 第三章 数据描述与基本操作 第四章 选择结构程序设计 第五章 循环结构程序设计 第六章 数组与指针 第七章 函数与模块化程序设计方法,5,第一章 语言程序设计概述,6,1.1 程序设计的概念 1.2 语言的产生及发展 1.3 简单程序介绍 1.4 C程序的上机步骤 1.5 C语言的基本语法和基本结构 1.6 本章要点小结,7,1.1 程序设计的概念,1.1.1 程序设计语言 1.1.2 程序设计的概念,8,计算机,计算机是用来延伸人的能力的工具,需要人来驾驭 我们的职责是让非计算机专业的人更容易驾驭它 完成这一目标的主要手段之一就是 “编程(Programming)”,9,计算机基本工作过程,整个过程的执行者是硬件,但硬件是受软件控制的 编程,就是编写软件,使硬件按照人的意图工作,10,计算机基本工作过程,源程序 和输入数据,输出结果,取出数据,存入数据,操作命令,存取命令,取出 程序指令,输入输出命令,计算结果,CPU,“冯诺依曼机”结构,大脑,眼/耳/口,11,软件的形成,软件(Software)的形成 程序员(Programmer)编写程序源代码(Source Code) 编译器(Compiler)把源代码转换为可被计算机理解的机器代码(Machine Code) 并把机器代码以可执行文件(Executable File)的形式保存在磁盘上,12,机器语言,汇编语言,高级语言,面向过程,面向对象,CPU指令系统,由0、1序列构成的指令码组成 如:10000000 加 10010000 减,用助记符号描述的指令系统 如 ADD A, B,面向机器的语言,程序设计是数据被加工的过程,客观世界可以分类,对象是类的实例 对象是数据和方法的封装 对象间通过发送和接受消息发生联系,程序设计关键是定义类,并由类派生对象,1.1.1 程序设计语言,13,程序设计语言的故事,计算机为什么用二进制呢? 为什么不用我们日常熟悉的十进制呢? 二进制在在电器元件中容易实现 计算机进行二进制运算比进行十进制运算要简单得多,14,程序设计语言的故事,机器语言编写的1+1程序 汇编语言(Assemble Language)编写的1+1程序,10111000 00000001 00000000 00000101 00000001 00000000,MOV AX, 1 ADD AX, 1,15,程序设计语言的故事,BASIC语言编写的1+1程序 C语言编写的1+1程序,PRINT 1+1,#include main() printf(“%dn“, 1+1); ,16,Ada,ALGOL60,ALGOL68,Pascal,Modula-2,CPL,BCPL,B,C,C+,Java,LISP,PROLOG,COBOL,FORTRAN77,FORTRAN,PL/1,Simula 67,Smalltalk 80,BASIC,ANSI-BASIC,QBASIC,VB,FORTRAN90,17,1.1.2 程序设计的概念,程序设计就是用计算机语言来编写程序的过程。 什么是程序?著名计算机科学家沃思提出有名的公式: 算法+数据结构=程序,18,算法即问题的求解过程、计算机的工作步骤。 数据结构即对参与运算的数据怎样进行合理的组织、安排,以提高程序运行的效率和求解的精确性。,程序的两大要素:数据结构、算法,19,1.2 C语言的产生和发展,1.2.1 C语言的产生 1.2.2 C语言的发展 1.2.3 C语言的特点,20,1.2.1 C 语言的产生,一切从一个叫“Space Travel”的电子游戏开始的 Ken Thompson为了让他的游戏能在PDP-7上运行,用汇编语言给PDP-7写了一个操作系统UNIX 汇编太不好用了,Thompson需要高级语言 试验了一些高级语言,包括Fortran,都不理想 他在BCPL基础上,自己设计了一个B语言 UNIX开始发展,B也不够用了 Dennis Ritchie加入,把B改造成C 开始用C重写UNIX,21,1.2.2 C 语言的发展,C语言发展过程 产生过程 时间:19721973 地点:美国贝尔实验室 目的:UNIX操作系统 设计人: Ken.Thompson和Dennis.M.Ritchie C标准 标准C: K&R合著The C Programming Language ANSI C: 1983年 87 ANSI C: 1987年 1990年国际标准的ANSI C,22,Ritchie和Thompson在开发UNIX,23,接受美国国家技术勋章,24,C语言的祖师爷Dennis M. Ritchie,25,Ritchie漫画像,26,C语言本身既有一般高级语言的特点,又由低级语言(汇编语言)的特点。 C语言是一种结构化的程序设计语言,它具有实现顺序、分支、循环三种基本结构化控制的语句。 C语言简洁,紧凑,使用方便灵活。只有32个保留字,9种控制语句,书写形式自由。 数据类型丰富。有整型、实型、字符型、数组型、指针型、结构体型、共用体型和枚举型等。,1.2.3 C语言的特点,27,5、运算功能强。有32种运算符,包括了算术运算、关系运算、逻辑运算、位运算、指针运算等。 6、目标代码质量高,运行速度快。 7、可移植性强。 8、语法限制不太严格,程序设计自由度大。,1.2.3 C语言的特点,28,C 语言是编译型语言,一种编译语言对应一种编译器 按照该语言的语法编写程序源代码,把自己的思想融入到代码中 编译器读入源代码,把程序员的意图转换成可执行程序,供他人使用,29,C语言与计算机系统层次关系,30,1.3 简单C程序介绍,31,C程序格式和结构特点,第一个程序 Hello,World! /* example1.1 The first C Program*/ #include main() printf(“Hello,World!”); ,输出: Hello,World!,32,/* example1.2 calculate the sum of a and b*/ #include /* This is the main program */ main() int a,b,sum; a=10; b=24; sum=add(a,b); printf(”sum= %dn“,sum); /* This function calculates the sum of x and y */ int add(int x,int y) int z; z=x+y; return(z); ,运行结果: sum=34,33,格式特点 习惯用小写字母,大小写敏感 不使用行号,无程序行概念 可使用空行和空格 常用锯齿形书写格式,main( ) . . . . ,main( ) int i , j , sum; sum=0; for(i=1; i10;i+) for(j=1;j10;j+) sum+=i*j ; printf(“%dn”,sum); ,优秀程序员的素质之一: 使用TAB缩进 对齐 有足够的注释 有合适的空行,34,结构特点 函数与主函数 程序由一个或多个函数组成 必须有且只能有一个主函数main() 程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行。 程序语句 C程序由语句组成 用“;”作为语句终止符 注释 /* */为注释,不能嵌套 不产生编译代码,例: /*This is the main /* of example1.1*/ */,编译预处理命令,函数首部: 包括函数名、函数类型、函数参数名、参数类型。 函数体:声明部分,执行部分。,35,1.4 C程序的上机步骤,36,程序代码的录入, 生成源程序*.c,语法分析查错,翻译 生成目标程序*.obj,与其它目标程序或库 链接装配,生成可执行 程序*.exe,开始,编辑,编译,有错?,执行,连接,结果 正确,结束,可执行 目标程序 f.exe,源程序 f.c,目标程序 f.obj,库函数 和其他目 标程序,Yes,No,Yes,No,37,1.5 C语言的基本语法和结构,1.5.1 C语言的基本语法 1.5.2 C语言的基本结构,38,1.5.1 C语言的基本语法,标识符 关键字 运算符 分隔符 常量 注释符 字符集,39,标识符,常量、变量、语句标号以及自定义函数的名称 只能是字母、数字和下划线组成的字符串,第一个字符必须是字母或下划线 标准C不限制标识符长度,但一般不超过8字符 标识符大小写有区别 标识符名最好能“顾名思义”,40,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 unsigned union void volatile while,41,9种控制语句: if( )else switch case for( ) while( ) dowhile( ) continue break goto return,42,34种运算符: 算术运算符:+ - * / % + - 关系运算符: = != 逻辑运算符:! & | 位运算符 : | & 赋值运算符:= 及其扩展 条件运算符:?: 逗号运算符:, 指针运算符:* & 求字节数 :sizeof 强制类型转换:(类型) 分量运算符:. - 下标运算符: 其它 :( ) -,43,1.5.2 C语言的基本结构,(1)顺序结构,A,B,a,b,44,(2)选择结构,或称分支结构,此结构中必包含一个判断框。根据给定的条件 P是否成立而选择执行A框或B框,a,b,B,A,p,不成立,成立,45,(3) 循环结构,它又称为重复结构,即反复执行某一部分 的操作。又两类循环结构:,a. 当型(while型)循环结构,b. 直到型(Until型)循环结构,46,1.6 本章要点小结,程序设计的概念 C语言的产生及发展 C语言的特点 C程序的介绍和上机步骤 C语言的基本语法和结构,47,本章课堂练习,(1) 以下说法中正确的是( ). A) C语言程序总是从第一个函数开始执行 B) 在C语言程序中,要调用的函数必须在main()函数中定义 C) C语言程序总是从main()函数开始执行 D) C语言程序中的main()函数必须放在程序的开始部分,48,解答:C 解释:C语言程序总是从main()函数开始执行,而不论其在程序中的位置。当主函数执行完毕时,亦即程序执行完毕。除main函数外,其它函数都是在执行main函数时被调用执行的。在C语言中,函数不允许嵌套定义。习惯上,将主函数main()放在最前头,但并不是必须的。,49,(2)以下叙述不正确的是 A)一个C源程序可由一个或多个函数组成 B) 一个C源程序必须包含一个main函数 C) C程序的基本组成单位是函数 D) 在C程序中,注释说明只能位于一条语句的后面,50,解答:D 解释: 凡是用“/*”和“*/”括起来的文字,都是注释。其出现的位置可以任意。,51,(3)下列标识符中,合法的变量名有: A)a.b B)$888 C)A1 D) 3x56,52,解答:C 解释:变量名只能由字母、数字和下划线三种字符所组成,且第一个字符必须为字母或下划线。C语言的关键字不能用作变量名。另外,C语言对英文字母的大小写敏感,即同一字母的大小写,被认为是两个不同的字符。习惯上,变量名和函数名中的英文字母用小写,以增加可读性。,第二章 程序的灵魂:算法,一个程序主要包括以下两方面的信息: (1) 对数据的描述。在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式 这就是数据结构(data structure) (2) 对操作的描述。即要求计算机进行操作的步骤 也就是算法(algorithm),数据是操作的对象 操作的目的是对数据进行加工处理,以得到期望的结果 著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式: 算法 + 数据结构 = 程序,一个程序除了算法和数据结构这主要要素外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示 算法、数据结构、程序设计方法和语言工具是一个程序设计人员应具备的知识 算法数据结构程序设计方法语言工具和环境程序,算法是解决“做什么”和“怎么做”的问题 程序中的操作语句,是算法的体现 不了解算法就谈不上程序设计,2.1 算法的概念 2.2 算法的特性 2.3 算法的表示 2.4 结构化程序设计方法,2.1 算法的概念,广义地说,为解决一个问题而采取的方法和步骤,就称为“算法” 对同一个问题,可以有不同的解题方法和步骤 为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法,计算机算法可分为两大类别: 数值运算算法 非数值运算算法 数值运算的目的是求数值解 非数值运算包括的面十分广泛,最常见的是用于事务管理领域,2.1 算法的概念,可以用最原始的方法进行: 步骤1:先求1*2,得到结果2。 步骤2:将步骤1得到的乘积2再乘以3,得到结果6。 步骤3:将6再乘以4,得24。 步骤4:将24再乘以5,得120。这就是最后的结果。,例2.1 求12345 100,太繁琐,例2.1 求12345,简单算法的举例概念,改进的算法: 设变量p为被乘数 变量i为乘数 用循环算法求结果,求12345,简单算法的举例概念,S1:使p=1,或写成1p S2:使i=2,或写成2i S3:使p与i相乘,乘积仍放在变量p中,可表示为:p*ip S4:使i的值加1,即i+1 i S5:如果i不大于5,返回重新执行S3;否则,算法结束 最后得到p的值就是 5!的值,若是100,求什么?,简单算法的举例概念,例2.2 有50个学生,要求将成绩在80-90分的学生的学号和成绩输出。 用ni代表第i个学生学号,gi表示第i个学生成绩 S1:1i S2:如果90 gi80, 则输出ni和gi,否则不输出 S3:i+1i S4:如果i50,返回到步骤S2,继续执行,否则,算法结束,2.1 算法的概念 2.2 算法的特性 2.3 算法的表示 2.4 结构化程序设计方法,一个有效算法应该具有以下特点: (1) 有穷性。一个算法应包含有限的操作步骤,而不能是无限的。 (2) 确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。,2.2 算法的特性,一个有效算法应该具有以下特点: (3) 有零个或多个输入。所谓输入是指在执行算法时需要从外界取得必要的信息。 (4) 有一个或多个输出。算法的目的是为了求解,“解” 就是输出。 没有输出的算法是没有意义的。 (5) 有效性。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。,2.2 算法的特性,对于一般最终用户来说: 他们并不需要在处理每一个问题时都要自己设计算法和编写程序 可以使用别人已设计好的现成算法和程序 只需根据已知算法的要求给予必要的输入,就能得到输出的结果,输入3个数,黑箱子,3个数中最大数,求3个数的最大数,2.2 算法的特性,2.1 算法的概念 2.2 算法的特性 2.3 算法的表示 2.4 结构化程序设计方法,常用的方法有: 自然语言 传统流程图 结构化流程图 伪代码 ,2.3 算法的表示,自然语言表示法,2.1节例子介绍的算法是用自然语言表示的 用自然语言表示通俗易懂,但文字冗长,容易出现歧义性 用自然语言描述包含分支和循环的算法,不很方便 除了很简单的问题外,一般不用自然语言,传统的程序流程图,用一些图形符号形象直观的表述算法,上表给出了ANSI 规定的程序流程图符号。,流程图是用一些图框来表示各种操作 用图形表示算法,直观形象,易于理解,x0,Y,N,一个入口,两个出口,传统的程序流程图,位置不够,防止交叉,传统的程序流程图,例2.4 将例2.1的算法用流程图表示。 求12345 如果需要将最后结果输出:,1t,输出t,i5,开始,2i,t*it,i+1i,结束,N,Y,通过以上几个例子可以看出流程图是表示算法的较好的工具 一个流程图包括以下几部分: (1) 表示相应操作的框 (2) 带箭头的流程线 (3) 框内外必要的文字说明 流程线不要忘记画箭头,否则难以判定各框的执行次序,传统的程序流程图,特点:绘制简单,描述直观,之前广泛使用。 缺点: 程序流程图不易表示算法或程序的层次结构。 用箭头表示的控制流可能引起随意的转移控制。 可能诱使人们过早地考虑局部程序的控制结构而忽视全局的程序结构。 不易表示数据结构和程序模块之间的关系。,传统的程序流程图,NS图表示法,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其他的从属于它的框。,这种流程图又称NS结构化流程图(N和S是两位美国学者的英文姓名的第一个字母)。这种流程图适于结构化程序设计,因此很受欢迎。,N-S流程图用以下的流程图符号:,顺序结构,选择结构,循环结构 (当型),循环结构(直到型),NS图表示法,用伪码表示算法,伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。它不用图形符号,因此书写方便,格式紧凑,也比较好懂,便于向计算机语言算法(即程序)过渡。,BEGIN(算法开始) 1=i While ii 1=i While i=80 and gii END(算法结束),前例用伪代码表示算法如下:,用计算机语言表示算法,要完成一项工作,包括设计算法和实现算法两个部分。 设计算法的目的是为了实现算法。 不仅要考虑如何设计一个算法,也要考虑如何实现一个算法。,用C语言程序实现前例如下,#include /*打印出50名同学中成绩在80-90分者*/ main() int i,g50,n50; for(i=0;i=80) ,fc1.c,2.1 算法的概念 2.2 算法的特性 2.3 算法的表示 2.4 结构化程序设计方法,2.4 结构化程序设计方法简介,荷兰学者E.W.dijkctra提出了结构化程序设计(structured programming)的理论,成为70年代中期至90年代初的程序设计主流。结构化程序设计方法提出了一些大家都要遵循的原则,这些原则归纳为32个字:,自顶向下,逐步细化。 模块设计,结构编码。 清晰第一,效率第二。 书写规范,缩进格式。,顺序、分支和循环三种基本结构的共同特点:,(1)只有一个入口。,(2)只有一个出口。,(3)结构内的每一部分都有机会被执行到。也就是说,对每一个框来说,都有从入口到出口的路径通过它。,(4)结构内不存在“死循环”(无终止的循环)。,结构化程序,所谓结构化程序,就是仅仅使用顺序、选择、 循环等三种基本结构所构造的程序。,结构化程序设计方法,结构化程序设计方法的基本思想是,把一个复杂 问题的求解过程分阶段进行。每个阶段的问题都 控制在人们容易理解和处理的范围内。,2.4 本章要点小结,算法的概念 算法的特性 算法的表示 结构化程序设计方法,第三章 数据描述与 基本操作,89,3.1 基本数据类型 3.2 运算符和表达式 3.3 输入输出操作,90,3.1 基本数据类型,3.1.1 C语言的数据类型 3.1.2 常量和变量 3.1.3 数据类型转换,91,3.1.1 C语言的数据类型,(一) 什么是数据类型? (二) C语言的数据类型有哪些?,92,(一) 什么是数据类型?,数据结构+算法=程序,C语言中以 “数据类型”形式存在,对数据的描述,对操作的描述,93,数据类型,基本类型,整型(有符号、无符号) 字符型 实型(浮点型) 枚举类型,构造类型,数组类型 结构体类型 共用体类型,指针类型,空类型,单精度型 双精度型,在程序中对用到的 所有数据都必须指 定其数据类型.,?,不同类型的数据,所占 内存的字节数不同, 对 应的操作也不相同。,(二) C的数据类型,94,整型数据,1. 整型数据的分类 最基本的整型类型 基本整型(int型):占2个或4个字节(32位编译系统) 短整型(short int):VC+6.0中占2个字节 长整型(long int):VC+6.0中占4个字节 双长整型(long long int):C99新增的,64位占8个字节,VC+6.0中定义为 _int64,95,2. 整型变量的符号属性 整型变量的值的范围包括负数到正数 可以将变量定义为“无符号”类型 扩充的整形类型: 有符号基本整型 signed int; 无符号基本整型 unsigned int; 有符号短整型 signed short int; 无符号短整型 unsigned short int; 有符号长整型 signed long int; 无符号长整型 unsigned long int;,整型数据,96,字符型数据,字符是按其代码(整数)形式存储的 C99把字符型数据作为整数类型的一种 字符型数据在使用上有自己的特点,97,1.字符与字符代码 大多数系统采用ASCII字符集 字母:A Z,a z 数字:09 专门符号:29个:! ” # & ( ) *等 空格符:空格、水平制表符t、换行n等 不能显示的字符: 空(null)字符(以0表示)、鸣铃(以a表示)、 退格(以b表示)、回车(以r表示)等,字符型数据,98,字符1和整数1是不同的概念: 字符1只是代表一个形状为1的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占1个字节 整数1是以整数存储方式(二进制补码方式)存储的,占2个或4个字节,字符型数据,99,2.字符变量 用类型符char定义字符变量 char c = ?; 系统把“?”的ASCII代码63赋给变量c printf(“%d %cn”,c,c); 输出结果是: 63 ?,字符型数据,100,浮点型数据,浮点型数据是用来表示具有小数点的实数 float型(单精度浮点型) 编译系统为float型变量分配4个字节 数值以规范化的二进制数指数形式存放,101,浮点型数据是用来表示具有小数点的实数 float型(单精度浮点型) double型(双精度浮点型) 编译系统为double型变量分配8个字节 15位有效数字,浮点型数据,102,几种基本数据类型,整型,字符型,实型,有,无,说明:数据类型所占字节数随编译器不同而不同,上表以VC+ 6.0为例:,103,举例:数据溢出(Overflow)的危害,一台安装了Windows 95/98的机器,如果连续 运行49.7天,可能死机 原因: Windows自启动时刻起,有一个计数器,记录系统已经运行了多少毫秒。 这个计数器个unsigned long unsigned long的最大值:4294967295 一天有24*60*60*1000 = 86400000毫秒 4294967295 / 86400000 = 49.71026961805 当49.7天的时候,此计数器会溢出,引起死机,104,(一) 常 量 (二) 变 量,3.1.2 常量与变量,105,预备知识:bit,Byte,Word,bit, 位 Byte, 字节 1 B = 8 b Word, 字 1 W=2 B Kilobyte(KB), 1 KB = 1,024 B Megabyte(MB), 1 MB = 1,024 KB Gigabyte(GB), 1 GB = 1,024 MB Terabyte(TB) 1 TB = 1,024 GB,106,一个字节有多大? 可以表示数字0255 保存一个字符(英文字母、数字、符号),ASCII编码 两个字节保存一个汉字,107,预备知识:二进制,世界上有(10)2种人,1种人懂二进制,1种人不懂二进制 一个位有多大? 只能是“0”或者“1”,这叫二进制 二进制诠释了计算机的哲学 种类众多的复杂事物都是由若干种简单事物构成,108,1.常量:在程序运行过程中,其值不能被改变的量 整型常量:如1000,12345,0,-345 实型常量 十进制小数形式:如0.34 -56.79 0.0 指数形式:如12.34e3 (代表12.34103) 字符常量:如? 转义字符:如n 字符串常量:如”boy” 符号常量:#define PI 3.1416,3.1.2 常量与变量,109,字符与字符串的区别有哪些?,定界符不同:字符常量使用单引号,而字符串常量使用双引号; 长度不同:字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数; 存储要求不同:字符常量存储的是字符的ASCII码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志0。,110,2. 变量:在程序运行期间,变量的值是可以改变的 变量必须先定义,后使用 定义变量时指定该变量的名字和类型 变量名和变量值是两个不同的概念 变量名实际上是以一个名字代表的一个存储地址 从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据,3.1.2 常量与变量,111,方式: 1、定义变量的同时赋初值(也叫变量初始化)。 格式: 数据类型 变量名=初值, 变量名2=初值2; 2、通过一个赋值语句给变量赋初值。 格式 : 变量名=初值;,变量赋初值,出现在函数体 的声明部分,出现在函数体 的执行部分,int a,b=3;,int a,b; b=3;,112,1、程序中用到的变量必须“先定义(declare),后使用”。 2、C语言的关键字不能用作变量名。 3、C语言对英文字母的大小写敏感,即同一字母的大小写,被认为是两个不同的字符。 4、定义变量时,给几个变量赋相同的初值, 应写成 : int a=3,b=3,c=3; 不能写成: int a=b=c=3; 5、给变量赋值时,正常情况下应给变量赋相同类型的数据。若给变量赋与其类型不同的数据时,需进行类型转换。,关于变量以及变量赋初值的几点说明,113,变量举例,include void main() int student,age; int if=adrress=1; float score=90; stadent=2; Age=20.7; printf(“%d %d %d %f“,if,student,age,score); ,本程序中有几处错误?,undeclared identifier,114,变量使用要注意长度,不要对变量所占的内存空间字节数想当然 用sizeof获得变量或者数据类型的长度 程序在Turbo C2.0和Visual C+6.0下的运行结果不同,注意!,#include void main() printf(“Data type Number of bytesn“); printf(“- -n“); printf(“char %dn“,sizeof(char); printf(“int %dn“,sizeof(int); printf(“short int %dn“,sizeof(short); printf(“long int %dn“,sizeof(long); printf(“float %dn“,sizeof(float); printf(“double %dn“,sizeof(double); ,115,3.1.3 数据类型转换,(一) 隐式转换(自动转换) (二) 显式转换(强制转换),116,(一)隐式转换(自动转换),转换发生条件,运算转换-不同类型数据混合运算时 赋值转换-把一个值赋给与其类型不同的 变量时 输出转换-输出时转换成指定的输出格式 函数调用转换-实参与形参类型不一致时转换,先转换、后运算,117,隐式转换(自动转换),同种数据类型的运算结果,还是该类型 不同种数据类型的运算结果,是两种类型中取值范围更大的那种 long double double float = long = int =short char 把数据赋值给另外一种类型变量也会发生自动类型转换 从小到大,顺利转换 从大到小,可能丢失信息(好的编译器会发出警告),见教材28页,118,隐式转换(自动转换),不同类型数据间的混合运算: +、-、*、/ 运算的两个数中有一个数为float或double型,结果是double型。系统将float型数据都先转换为double型,然后进行运算; (2) 如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型; (3)字符型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算.,119,int i; float f; double d; long e; i=2; f=2.5; d=3.9; e=3; ,10+a+i*f-d/e,107,5.0,1.3,112. 0,110. 7,int,double,double,double,double,思考:根据已知变量定义及赋值语句,计算以下表达式的值,并说明每一步所得结果的数据类型。,120,(二)显式转换(强制转换),一般形式,(要转换成的数据类型)(被转换的表达式) 注:当被转换的表达式是一个简单表达式时,外面的一对圆括号可以缺省。,举例,float x,y; x=2.3 ; y=4.5; (int)(x+y) / 6 (int) (int)x+y / 6.5 (double),说明,强制转换得到的是所需类型的中间变量,原变量或表达式的类型不变。,121,#include void main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d“,x,i); ,思考:以下程序的输出结果是什么?,x=3.600000,i=3,程序运行结果:,结论:较高类型向较低类型转换时可能发生精度损失问题,122,举例:已知三角形的边长a、b、c,求三角形周长的一半。,#include void main() float a,b,c,s; a=3;b=4;c=5; s=1/2 * (a+b+c); printf(“s=%8.2f“,s); ,s= 0.00,程序运行结果:,?,s= 6.00,程序运行结果:,改为:1.0/2 (1/2.0) 或 (float)1/2 (1/(float)2),123,C运算符简介 算术运算符和算术表达式 赋值运算符和赋值表达式 逗号运算符和逗号表达式 关系运算符和表达式 逻辑运算符和表达式 条件运算符与表达式,3.2 运算符与表达式,124,详见254页!,C运算符简介,125,运算符必须有运算对象,分为3类: 运算对象是一个的,则称为单目运算 运算对象是两个的,则称为双目运算 运算对象是三个的,则称为三目运算,C运算符简介,126,基本算术运算符,+ - * / %,说明,例: 5/3=1 -5/3=-1,模运算符或求余运算符,算术表达式,用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子。,优先级和结合性,先乘除、后加减,有括号先算括号。 自左至右,常量、变量、函数等,说明,两个整数相除的结果为整数,舍去小数部分。 当商为负数时,多采用“向零取整”的方法。,求余运算的两侧均应为整数 5%3=2,例: a*b/c-1.5+a,算术运算符和算术表达式,如果一个运算符两侧的数据类型不同,先自动进行类型转换,使二者具有同一类型,然后进行运算。,127,格式: 前置:+i , -i (在使用i之前,使i的值加(减)1) 后置:i+ , i- (在使用i之后,使i的值加(减)1),自增、自减运算符,作用:自增运算符()使单个变量的值增1; 自减运算符()使单个变量的值减1。,例,i=3; A) j=+i; j=i+; j=-i+;,i=i+1,i=i-1,? j,i,A) j=4 i=4 j=3 i=4 j=-3,+和-结合方向 是“自右至左”,128,(1) 自增、自减运算是语言特有的,常用于循环语句中,使循环控 制变量加(或减),以及指针变量中,使指针指向下(或上)一个地址。 (2) 自增、自减运算符,不能用于常量和表达式。 例如,5+、-(a+b)等都是非法的。 (3) +和-的结合方向为自右至左。(P30) (4) 如果对一个变量的自增自减运算,单独构成语句,而不是作为表达式的一部分时,前置和后置运算效果一样,都是使变量自加。 如 i+;和 +i;是一样的,都是使i加。 (5) 在表达式中,连续使用同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。,说 明,129,赋值运算符,简单赋值运算符:= 复合赋值运算符:+=, -=,*=,/=,%= ,简单赋值运算符的一般形式为: 变量 = 表达式 它的作用是将一个表达式的值赋给一个变量。,复合赋值运算的一般格式为: 变量 双目运算符 = 表达式 复合赋值运算符 它等价于:变量 = 变量 双目运算符 (表达式)。只有当表达式简化为一个变量或一个常数时,两边的括号可以省略。,赋值运算符和赋值表达式,130,赋值表达式,格式: 赋值表达式的值:被赋变量的值,类型转换,转换条件:当赋值运算符两侧的数据类型不一致时 转换原则:转换为被赋值变量的类型。,131,注意: 将取值范围小的类型转为取值范围大的类型是安全的 反之是不安全的 如果大类型的值在小类型能容纳的范围之内,则平安无事 但是,浮点数转为整数,会丢失小数部分,非四舍五入 反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关。避免如此使用,例1,float a; int b; a=1.2; b=a*3;,? b,b=3,例2,a=b=5; a=7+(b=8),? a,b,a=5 ;b=5 a=15;b=8,自右而左 的结合性,132,算术自反赋值运算符,(1) 运算规则,对象数,名称,运算符,运算规则,运算对象,运算结果,结合性,双目,加赋值,减赋值,乘赋值,除赋值,模赋值,*,/ =,%=,a+=b相当于 a=a+b,a=b相当于 a=ab,a*=b相当于 a=a*b,a/=b相当于 a=a/b,a%=b相当于 a=a%b,数值型,数值型,自 右 向 左,整型,整型,133,逗号运算符,,,逗号表达式,表达式1,表达式2, ,表达式n,说明,1、逗号表达式的求解过程为自左至右,依次计算各表达式的值,最后一个表达式的值即为整个逗号表达式的值; 2、逗号运算符的优先级最低。 3、使用逗号表达式的目的通常是想分别得到各个表达式的值,而并非一定要得到整个表达式的值。 4、常用于for循环语句中,除此以外很少使用。,逗号运算符和逗号表达式,134,例1,a=3 a=(3*5,a*4),? a,a=12,例2,a=3 a=3*5,a*4,? a,a=15 表达式的值为60,135,关系运算符及其优先次序,关系运算符: 用来对两个数值进行比较的比较运算符 语言提供种关系运算符: (小于) = (小于或等于) (大于) = (大于或等于) = (等于) != (不等于),优先级相同 (高),优先级相同 (低),136,关系、算术、赋值运算符的优先级,关系运算符及其优先次序,137,ca+b 等效于 c(a+b) ab=c 等效于 (ab)=c a=bc 等效于 a=(bc),关系运算符及其优先次序,138,关系表达式,关系表达式 用关系运算符将两个数值或数值表达式连接起来的式子 关系表达式的值是一个逻辑值,即“真”或“假” 在C的逻辑运算中,以“”代表“真”,以“”代表“假”,139,关系运算注意:,例 若a=0; b=0.5; x=0.3; 则 a=x=b的值为,0,例 5278在C中是允许的, 值为,0,例 a0 结果为 A100 结果为,1,0,140,关系运算注意:,例 注意区分“=”与“=” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a not equal to b”);,例 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为,0,141,逻辑运算符及其优先次序,3种逻辑运算符: &(逻辑与) |(逻辑或) !(逻辑非) &和|是双目(元)运算符 !是一目(元)运算符 逻辑表达式 用逻辑运算符将关系表达式或其他逻辑量连接起来的式子,142,判断年龄在13至17岁之内? age=13 & age65,逻辑运算符及其优先次序,143,逻辑运算的真值表,逻辑运算符及其优先次序,144,逻辑运算符的优先次序 ! & | (!为三者中最高) 与其他运算符的优先次序,! (高) 算术运算符 关系运算符 & 和 | 赋值运算符 (低),逻辑运算符及其优先次序,145,逻辑表达式,逻辑表达式的值应该是逻辑量“真”或“假” 编译系统在表示逻辑运算结果时 以数值1代表“真”,以0代表“假” 但在判断一个量是否为“真”时 以0代表“假”,以非0代表“真” 注意:将一个非零的数值认作为“真”,146,(1) 若a=4,则!a的值为0 (2) 若a=4,b=5,则a & b的值为1 (3) a和b值分别为4和5,则a|b的值为1 (4) a和b值分别为4和5,则!a|b的值为1 (5) 4 & 0 | 2的值为1,逻辑表达式,147,修改后的逻辑运算真值表,逻辑表达式,148,判别某一年是否闰年,用逻辑表达式表示 闰年的条件是符合下面二者之一: 能被4整除,但不能被100整除,如2008 能被400整除,如2000 (year % 4 = 0 & year 100 !=0) | year % 400 = 0 如果表达式值为1,则闰年;否则为非闰年,逻辑表达式,149,条件运算符和条件表达式,有一种if语句,当被判别的表达式的值为“真”或“假” 时,都执行一个赋值语句且向同一个变量赋值 如:if (ab) max=a; else max=b;,max = (a b) ? a : b;,条件运算符,150,条件运算符和条件表达式,有一种if语句,当被判别的表达式的值为“真”或“假” 时,都执行一个赋值语句且向同一个变量赋值 如:if (ab) max=a; else max=b;,max = (a b) ? a : b;,条件表达式,151,条件表达式的一般形式为 表达式?表达式: 表达式,条件运算符和条件表达式,条件运算符的执行顺序: 求解表达式1 若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值 若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值,152,条件运算符优先于赋值运算符 条件运算符的结合方向为“自右至左” 以下为合法的使用方法: ab ? (max=a):(max=b); ab ? printf(“%d”,a): printf(“%d”,b);,条件运算符和条件表达式,153,长度运算符,长度运算符优先级,和单目算术运算符、单目逻辑运算符、增1减1运算符同级别 同级运算符的结合性是自右向左的,154,设变量定义如下: int n; short s; unsigned long u3; float f; char c;,则 size of(n)的值是4 size of(s)的值是2 size of(long)的值是4 size of(unsigned int)的值是2 size of(u3)的值是4 size of(f)的值是4 size of(double)的值是8 size of(c)的值是1,注意:上述结果是在32位机Visual C+ 6.0环境运行的结果。,155,位运算 C语言中提供的位运算符: 、 、 & 、 、 1.按位取反运算符 形式: A 功能:把A的各位
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 喜迎2025年元旦活动方案
- 化学课程的编制与改革
- 配电网运维知识培训课件
- 绩效管理的评价误区
- 高端房地产周末暖场活动
- 广州松田职业学院《建筑设计A4》2023-2024学年第二学期期末试卷
- 秋天漫画节气课件
- 天津商业大学宝德学院《数字产品交互设计》2023-2024学年第二学期期末试卷
- 江苏省无锡市江阴初级中学2024-2025学年9校联考初三物理试题含解析
- 福建福州市台江区达标名校2025年中考英语试题冲刺卷(一)含答案
- 有限空间作业及应急物资清单
- 《个人信息保护法》解读
- GB∕T 3216-2016 回转动力泵 水力性能验收试验 1级、2级和3级
- 电子电气评估规范-最新
- 新疆高速公路建设工程季节性施工方案
- 新版(七步法案例)PFMEA
- 六、矿井通风网络中风量分配与调节ppt课件
- 黑布林绘本 Dad-for-Sale 出售爸爸课件
- 请给我结果ppt课件
- 腹腔镜下肝叶切除术(实用课件)
- 烟道废气监测孔和操作平台要求
评论
0/150
提交评论