C程序设计电子教案(上)ppt.ppt_第1页
C程序设计电子教案(上)ppt.ppt_第2页
C程序设计电子教案(上)ppt.ppt_第3页
C程序设计电子教案(上)ppt.ppt_第4页
C程序设计电子教案(上)ppt.ppt_第5页
已阅读5页,还剩138页未读 继续免费阅读

下载本文档

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

文档简介

1,C程序设计,计算机基础教研室,2,课程要求,课程目标: 正确理解和使用 C语言的基本数据结构和语法 运用结构化程序的思想去阅读和设计程序 完成结构化程序的编写、调试的基本训练 课程基本要求: 学会使用C语言编译系统,学会上机调试C程序 C语言概念和方法要清楚,书上的例子要明白 掌握程序设计的一般方法和思想、常用算法 认真完成作业,3,课程特点 C是基础:接触各种数据类型及表达式、基本语句语法、常用函数 C程序设计: 基本算法和案例程序的融合 后续课程 C+程序设计、面向对象程序设计、数据结构与算法分析、操作系统(UNIX) 学什么 语言及程序设计概述 数据类型、运算符与表达式 简单程序设计(顺序、选择、循环结构程序设计 ) 数组 函数 指针 结构体与共用体 文件,4,教学方法如何教 理论课:重点讲授主要算法和程序案例 实验课:验证式实验教学,实现算法程序 习题课:分析复杂程序案例 学习方法如何学 课前预习:书中主要语句、函数、例题 课后复习:教案中重点例题 认真独立完成作业 上机前必须完成基本程序 多读、多看、多写程序,5,第一章语言的发展及其特点和应用,本章要求: 了解C语言的特点、与其它高级语言间异同; 了解C程序在PC机上的建立、编译和运行过程; 了解C语言程序设计思想; 重点: C语言的主要特点; C语言在PC机上的运行过程及上机操作过程; 常用算法的应用,6,0. 回顾下计算机相关知识,.计算机定义:计算机是一种在事先存入程序的控制下,能够接收数据、存储数据、处理数据并提供处理结果的数字化电子设备。,2.计算机工作流程图,7,程序设计语言发展,8,程序执行,9,1.1.1 C语言的发展,C语言是在研制UNIX操作系统过程中诞生,伴随着UNIX操作系统的发展而流行 ALGOL 60 B语言 C语言(UNIX) ANSI C(1983) 目前最流行的语言有以下几种: Microsoft C 或称 MS C Borland Turbo C 或称 Turbo C (本教材选用) AT&T C Turbo C2.0 1989年 Turbo C+(3.0) 1991年,10,1.1.2 C语言主要特点: 1、C语言简洁、紧凑,使用方便、灵活。ANSI C一共只有32个关键字,9种控制语句,主要用小写字母表示。 2、运算符丰富。共有34种。C把括号、赋值、逗号等都作为运算符处理。 3、数据结构类型丰富。 4、C语言是一种结构化、模块化的程序设计语言。其程序由函数组成,便于模块化的程序设计,程序结构完全由顺序结构、选择结构和循环结构组成。 5、语法限制不太严格,程序设计自由度大。一行可以写多个语句,变量类型使用灵活。 6、C语言既具有高级语言的功能,又具有汇编语言的许多功能。 7、生成目标代码质量高,程序执行效率高,与汇编语言相比,用C语言写的程序可移植性好。,11,任何一种程序设计语言都具有特定的语法规则和规定的表达方式。 例1 #include “stdio.h” void main( ) /*printf是一个输出函数*/ printf(“This is a C program. n”) ; ,1.2 C语言程序的基本结构,函数体开始标志,C语句,函数体结束标志,编译预处理部分,函数类型,程序运行结果: this is a C program.,注释,12,程序分析,1)C程序一般用小写字母书写; 2)每个C源程序有且只能一个main ( ) 函数,称主函数;main前的void表示此函数是“空类型”。 3)程序体必须在一对 之间; 4)每个语句的结尾,必须要有“;”作为终止符。 5)/* */ 表示注释部分,注释内容可用汉字或英文字符表示。 6)函数调用语句,printf函数的功能是把要输出的内容送到显示器去显示. 7)printf函数是一个由系统定义的标准函数库中的输出函数,可在程序中直接调用。printf语句中双撇号中的字符串按原样输出。“n”是换行符即回车换行。 8)“#include”为预编译命令也称为文件包含命令,常在“main”主函数之前,用于将有关的“头文件”包括到用户源文件中。被包含的文件通常是由系统提供的,其扩展名为.h。“stdio.h”为标准输入输出库文件,其内定义了printf函数的原型。,13,例1.2计算指定函数关系式。,程序运行结果: input number: 9 2*sqrt(9.000000)+1=7.000000,14,程序的功能是输入一个实数x,求2倍开方x加1关系式的值,然后输出结果 1)凡是在程序中调用一个库函数时,都必须用预处理命令调用该函数原型所在的头文件。在本例中,使用了三个库函数:输入函数scanf,开平方函数sqrt,输出函数printf。sqrt函数是数学函数,其头文件为math.h文件。scanf和printf是标准输入输出函数,其头文件为stdio.h。 2)/* */注释语句可出现在一行中的最右侧,也可独成为一行。注释也可以用“/”符号标识注释内容,这种注释只在一行有效,在执行语句的前面和中间不能使用这种注释。 3)本例中主函数体分为两部分,一部分为说明部分,另一部为执行部分。说明是指变量的类型说明。语言规定,源程序中所有用到的变量都必须先定义,后使用,否则将会出错。本例中使用了两个变量x,y,用来表示输入的自变量和sqrt函数值。说明部分后的四行为执行部分或称为执行语句部分,用以完成程序的功能。执行部分的第一行是输出语句。第二行为输入语句。第三行是调用sqrt函数并把函数值送到变量y中。第四行是用printf 函数输出变量y的值。 4)运行本程序时,首先在显示器屏幕上给出提示串input number,这是由执行部分的第一行完成的。用户在提示下从键盘上键入某一数,如9,按回车键(enter),接着在屏幕上给出计算结果。,程序分析:,15,格式输入格式输出函数简介,scanf和 printf一般形式为: printf或scanf(格式控制,参数表) 格式控制是一个字符串,必须用双引号括起来,它表示了输入输出量的数据类型。各种类型的格式表示法可参阅后续章节。在printf函数中还可以在格式控制内出现非格式控制字符,这时在显示屏幕上将按原样输出。参数表中给出了输入或输出的量。当有多个量时,用逗号间隔。例如: printf(“2*sqrt(%f)+1=%fn“,x,y); 其中%f为格式字符,表示按实数处理。它在格式串中两次现,分别对应了x和y两个变量。其余字符为非格式字符则按原样输出在屏幕上。,16,程序运行结果: input two numbers:a,b 5,9 max=9,例1.3求两个数的最大值。,17,程序分析:,程序的功能是由用户输入两个整数,程序执行后输出其中较大的数。 本程序由两个函数组成,主函数和max 函数。函数之间是并列关系。可从主函数中调用其它函数。max 函数的功能是比较两个数的大小,然后把较大的数返回给主函数。max函数是一个用户自定义函数,其返回值类型是整型。因此在主函数中要给出说明。在程序的说明部分中,不仅可以有变量说明,还可以有函数说明。在程序的每行后用/*和*/括起来的内容为注释部分,程序不执行注释部分。 上例中程序的执行过程是,首先在屏幕上显示提示字符串,请用户输入两个数,回车后由scanf函数语句接收这两个数,并送入变量a,b中,然后调用max函数,把a,b 的值传送给max函数的参数x,y。在max函数中比较x,y的大小,把大者通过中间变量m返回(return m)给主函数的变量c,最后在屏幕上输出c的值。,18,2.C程序结构特点,通过上述例子,可以对源程序的结构特点归纳如下 1)一个语言源程序可以由一个或多个源文件组成。 2)每个源文件可由一个或多个函数组成。(main主函数、系统提供printf、scanf函数、用户定义max函数) 3)一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。程序总是从main()处开始执行,而不管main()在源文件中的位置。 4)源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。 5)每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“”之后不能加分号。 6)C语言用函数进行输入输出,如printf(),scanf()。 7)C语言用/*/或/作注释。注释部分便于阅读程序的人理解程序员的设计意图,这是一个良好的习惯。 8)C程序书写格式自由,一个语句可以占多行,一行也可以有多个语句。,19,3.书写C程序时应遵循的规则,从书写清晰,便于阅读,理解,维护的角度出发,在书写程序时应遵循以下的规则: 1)一个说明或一个语句单独占一行。 2)用 括起来的部分,通常表示了程序的某一层次结构。一般与该结构语句的第一个字母对齐,并单独占一行。 3)低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。以便看起来层次清晰、结构明了,增加程序的可读性。,20,4.语言的字符集,字符是组成语言的最基本的元素。语言字符集由字母,数字,空格,标点和特殊字符组成。在字符常量,字符串常量和注释中还可以使用汉字或其它可表示的图形符号。 1)字母 小写字母az共26个,大写字母AZ共26个, 2)数字 09共10个 3)空白符 空格符、制表符、换行符等统称为空白符。空白符只在字符常量和字符串常量中起作用。在其它地方出现时,只起间隔作用,编译程序对它们忽略不计。因此在程序中使用空白符与否,对程序的编译不发生影响,但在程序中适当的地方使用空白符将增加程序的清晰性和可读性。 4)标点和特殊字符,21,1.3 算法表示方法,1.基本概念介绍 做任何事情都有一定的步骤。为解决一个问题而采取的方法和步骤,就称为算法。在详细展开算法内容前,先介绍几个基本概念。程序数据结构+算法。数据结构是程序中用到的数据的构造形式及其类型。对于面向对象程序设计,强调的是数据结构,而面向过程的程序设计语言如C语言,主要关注的是算法。算法是程序的核心,也是面向对象程序设计的基础。,22,结构化设计是指任何复杂的程序皆可由顺序、分支、循环三种基本结构组成。 程序设计的一般步骤是:设计算法描述算法编写程序检查程序编译调试和运行程序。 由此,对于程序的概念,我们可以这样理解: 程序算法+数据结构 +程序设计方法+语言工具和环境 程序设计的关键是解题的方法与步骤算法。算法可分为两大类:数值运算算法和非数值运算算法。数值运算算法:即求数值解,通过运算得出一个具体值,数值运算一般有现成的模型,算法较成熟。非数值运算算法:用于事务管理,如图书检索、人事管理等。具体对语言而言,其语法就是工具,是算法的一个具体实现和描述。,23,先看两个常用的简单算法:,例1.4累加,求:1+2+3+4+5+100。 第一步:1+2 S(结果) 第二步:S+3 S(结果) 第三步:S+4 S(结果) 第九十九步:S+100 S(结果) 这样的算法虽然正确,但太繁琐。 改进的算法: 第一步:令x1; 第二步:令i2; 第三步:使x+i,和仍放在x中,可表示为x+ix; 第四步:使i的值+1,即i+1i。 第五步:若i100,返回重新执行步骤第三步以及其后的第四步和第五步;否则,算法结束。,24,例1.5有10个工人,要求查找其中工资高于1500元的人员,并输出。 算法分析: 如用n表示工人序号,ni表示第i个工人的序号,g表示工人的工资,gi表示第i个工人的工资。 算法表示: 第一步:1i。 第二步:如果gi1500,则打印ni和gi,否则不打印。 第三步:i+1i。 第四步:若i10,返回第二步,否则结束。,一个优秀的算法应该具备以下特性: 有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性。,25,2.常用算法的表示方法,算法的表示方法有很多种,常用的有:自然语言描述、伪代码、流程图、NS图等。在这里重点介绍流程图和NS图。 用流程图表示算法 一个流程图包括:表示相应操作的框,带箭头的流程线,框内外必要的文字说明。几何图形框的含义如下图所示。,26,例1.6用流程图表示例1.4和1.5,27,一个流程图,包括以下几部分: 表示相应操作的框; 带箭头的流程线; 框内外必要的文字说明; 注意,画流程线时,不要忘记画箭头,因为它是反应流程的执行先后次序的,如不画出箭头就很难判断各框的执行次序了。,28,根据结构化程序设计的思想,任何一个程序都由顺序、循环、选择三种基本结构组成,其流程图结构如下所示。,顺序结构,循环结构,选择结构,29,用N-S流程图表示算法,顺序结构,选择结构,循环结构,30,用计算机语言表示算法,例1.6用C语言改写示例1.4,例1.7用C语言改写示例1.5,31,1.4 运行C语言程序的基本步骤,程序开发过程,32,写好一个程序后,要经过这样几个步骤:上机输入与编辑源程序对源程序进行编译与库函数连接运行目标程序。如下图所示,其中实线表示操作流程,虚线表示文件的输入输出。,33,Turbo C +3.0集成开发环境,34,小 节,C语言程序是由一系列函数组成的模块结构。 C语言程序的书写格式自由、有较大的灵活性,但一般应采用一定的格式书写,养成良好的编程风格。 C语言是一种编译型的高级程序设计语言,其开发过程包括:编辑、编译、连接、运行四个步骤。具体操作应参阅操作系统支撑环境的有关资料。,35,C语言运行环境,Turbo C2.0版本编译系统启动的命令如下: 进入开机画面第二项win98 在win98下四个选项中进入real dos项 C:tc 回车 退出该系统时,先选择主菜单File,再在其下拉菜单中选择Quit子菜单项,或直接按下【Alt+X】键,便可退出该系统。,36,常用命令有: “Ins”键用来设置“插入”或“修改”方式。在“插入”方式下,从键盘上键入的字符被插入在当前光标之前;在“修改”方式下,从键盘上键入的字符将替代当前光标处的字符。 “Del”键用来删除光标所在的字符。 使用光标键可以上下左右移动光标。 使用“Ctrl+N”组合件可在当前光标所在行上插入一空行。 使用“Ctrl+Y”组合键可删除当前光标所在行。 使用退格键可删除当前光标前一个字符。,37,基本操作: F10-调用主菜单 F2-存盘 F3-打开 Alt+F9-Compile Ctrl+F9-Run Alt+F5-User Screen,New编辑新文件 Load装入已有文件 Save重新存储文件 Write to按指定名字存储文件 Change dir指定目录下的文件名 Pick显最近编辑过的若干个文件名 Directory显示当前目录下指定扩展名的所有文件 OS shell进入DOS系统,出现DOS系统提示符,可直接执行DOS命令。键入Exit命令返回原来的编译系统状态 Quit退出该编译系统,返回到DOS操作系统状态,38,第二章 基本数据类型、运算符与表达式,39,本章要求: C语言的数据类型 各种类型数据的定义方法 常量与变量 各种类型数据的混合运算 强制类型变换 重点: 数据类型; 数据的定义方法; 各种类型数据的混合运算,40,2.1 C语言的数据类型,C语言支持的数据类型非常丰富,它包括:基本数据类型,构造数据类型,指针类型,空类型四大类,41,2.2 常量、变量和标识符,对于基本数据类型量,根据其取值是否可改变可分为常量和变量两种。 1.常量,常量:其值不发生改变的量称为常量。常量可与数据类型结合起来分类。例如,整型常量、实型常量、字符型常量、字符串常量和符号常量。在编程过程中,常量是可以不经说明而直接引用的,而变量则必须要先定义后使用。 常用常量如下所示:整型常量:25、0、-7;实型常量:5.6、-6.9;字符常量:a、b。,42,2.标识符,标识符是用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。 用一个标识符来表示一个常量,称之为符号常量。 符号常量在使用之前必须先定义,其一般形式为: #define 标识符 常量 其中#define也是一条预处理命令(预处理命令都以“#“开头),称为宏定义命令其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。一般习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。,43,例2.1符号常量的使用。,程序运行结果: area=300 程序分析: 使用符号常量参与运算,符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。使用符号常量的好处是:含意清楚;能做到“一改全改”。,44,3.变量,变量,其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。变量在使用之前必须进行定义即为每个变量取一个名称(变量名),同时规定它的数据类型,以便编译时根据数据类型分配存储空间。 C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须是字母或者下划线。下面标识符的写法是合法的,可以作为变量名使用。 Sum,Class_2,data,wang_ming,_high,a8,AREA,year_month_day 下面是不合法的标识符和变量名: *data1,99sum,%yuan,$BGss,MR.tom,a1b1,s/t 注意,编译系统区分大小写,将它们认为是两个不同的字符。所以,max和MAX是两个不同的变量。,45,注意,建议变量名的长度最好不要超过8个字符。 在选择变量名和其它标识符时应 “见名知意”。 要求对所有用到的变量作强制定义,也就是“先定义,后使用” 。 变量定义一般放在函数体的开头部分。要区分变量名和变量值是两个不同的概念。,46,变量名实际上就是以一个名字对应,代表一个地址。在对程序编译连接时由编译系统给每个变量名分配对应的内存地址。变量在定义时必须指定其数据类型,以便在编译时为其分配存储单元。,| &a 2500H | 2501H |- 1250 - a=1250 &b2502H | 2503H |- - 2504H |- 123.67 - b=123.67 2505H |- - 2506H | 变量名、变量值、变量地址间的关系,例如: int a=1250; float b=123.67;,47,4.变量赋初值,C语言中可有多种方法为变量提供初值。可以在变量定义的同时给变量赋以初值的方法。这种方法称为初始化。在变量定义中赋初值的一般形式为: 类型说明符 变量1= 值1,变量2= 值2,; 例如: int a=68; /*指定a为整型变量,初值为68*/ 也可以使被定义的变量的一部分赋初值。 例如 float b,c,d=7.9; 上式指定b,c,d为单精度实型变量,只对d初始化,其值为7.9。 如果对几个变量赋予相同的初值,应写为: int e=50,f=50,g=50;,48,例2.2部分初始化数据,程序运行结果: a=6,b=14,c=8 程序分析: 对定义的整型变量进行部分初始化,然后参与运算,并输出结果。,49,5.变量的地址,在定义了一个变量后,在内存中会分配相应的存储单元,将变量的值存储到该单元中。如前所述注意区分变量名和变量值这两个不同的概念。 例如:int x; float y; x=3; y=3.14159;,50,2.3简单数据类型与表示范围,2.3.1 整型数据 1.整型常量的表示方法 整型常量就是整常数。在语言中,经常使用的整常数有三种进制,它们分别是八进制、十六进制和十进制。 八进制前缀为“0”,十六进制前缀为“0x”,十进制无前缀。 (1)十进制整数。 如:123, -456.4。 (2)八进制整数。以0头的数是八进制数。 如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。,51,(3)十六进制整数。以0x开头的数是16进制数。 如:0x123,代表16进制数123,等于十进制数 291。 -0x12等于十进制数18。 (4)整型常数的后缀: 基本整型的长度为16位,十进制无符号整常数的范围为065535,有符号数为-32768+32767。 八进制无符号数的表示范围为00177777。 十六进制无符号数的表示范围为0X00XFFFF或0x00xffff。 如果使用的数超过了上述范围,就必须加上后缀“L”或“l”变为长整型数来表示。 例如:567L (十进制为567) 注意:长整数567L和基本整常数567在数值上并无区别,但是所占存储空间大小不同。对567L而言,因为是长整型量,编译系统将为它分配4个字节存储空间。而对567,因是基本整型,则只分配2个字节的存储空间。,52,2.整型变量,(1) 整型数据在内存中的存放形式 数据在计算机内存中是以二进制形式存放的,例如,定义了一个整型变量a: int a; /*定义a为整型变量*/ a=11; /*给a附以初值11*/ 由于在内存中数值是以补码表示的,正整数的补码和它的原码在二进制形式上是相同的。所以,a11,在内存中的存放形式如下所示。,53,负数的补码:将该数的绝对值的二进制形式按位取反后再加1。 例如:求-11的补码:,符号位,(2)整型的分类,基本型:类型说明符为int,在内存中占2个字节。 短整量:类型说明符为short int或short。所占字节和取值范围均与基本型相同。 长整型:类型说明符为long int或long,在内存中占4个字节。,54,有符号型:类型说明符为signed;无符号型:类型说明符为unsigned。 有符号型与无符号型又可与前三种类型匹配而构成:,上面带 的部分表示其内容可以省略,55,(3)整型变量的定义,变量定义的格式为: 类型说明符 变量名标识符,变量名标识符,.; 说明:允许在一个类型说明符后,定义多个相同类型的变 量,并使用逗号分割变量名中多个变量,使用分号结 束。类型说明符与变量名之间至少用一个空格间隔。 变量定义必须放在变量使用之前。一般放在函数体的开头部分。 在程序的同一部分,禁止对同一变量进行重复定义,在书写不同种类型变量定义时,避免都写在一行上。 对所用到的变量必须进行强制定义,即“先定义,后使用”。 int a,b,c; /*a,b,c为整型变量*/ long x,y; /*x,y为长整型变量*/,56,例2.3整型变量的定义与使用,程序运行结果: b=x+a=-1,sum=12,average=6,57,(4)整型数据的溢出,每个整型数据都有其自身的数据类型,有其自身所占存储空间大小,基本整型int定义的变量的最大允许存储值为32767,例3.4整型数据的溢出,程序运行结果: 32767,-32768,程序分析: 计算结果-32768与实际应该的结果32768相差一个符号,为什么呢?数据在内存中都是以该数的补码的二进制形式存放的,32767的补码为0111 1111 1111 1111,加1后发生进位,变成1000 0000 0000 0000,最高位的1占据了符号位,而它正好是-32768的补码形式,所以才有上述输出结果。,58,2.3.2实型数据,1实型数据表示方法 实型也称为浮点型。语言中,实数有二种形式:十进制小数形式和指数形式。 十进制数形式:由数字09和小数点组成。注意,必须有小数点,且小数点的前面或后面必须有数字。 例如:3.1415926,0.0、0.1、7.0、780.、-25.860等均为合法的实数。 指数形式:由十进制数(基数)、加阶码标志“e”或“E”以及指数(阶码,只能为整数,可以带符号)组成。 其一般形式为: a E n(a为十进制数基数,n为十进制整数阶码) 其值为 a*10n。 如:1.6E2 (等于1.6*102) 注意:阶码标志e(或E)之前必须有数字,且e后的指数必须为整数。,59,2.实型数据在内存中的存放形式,实型数据一般占4个字节(32位)内存空间。与整型数据的存储方式不同,系统把一个实型数据分为小数部分和指数部分分别存放。指数部分采用规范化的指数形式表示。例如,实数7.15731在内存中的存放形式如下:,图中是用十进制形式来表示的,实际上计算机中是用二进制来表示小数部分,以及用2的幂次来表示指数部分的。, .715731(101)0.715731,60,3.实型变量的分类,实型变量分为:单精度(float型)、双精度(double型)和长双精度(long double型)三类。,实型变量定义,例如: float x,y; /*x,y为单精度实型量*/ double a,b,c; /*a,b,c为双精度实型量*/ long double z; /* z为长双精度实型量*/,61,4.实型数据的舍入误差,由于实型变量的存储单元能提供的有效数字总是有限的,其中单精度的有效数字是7为,双精度的是16位。在有效位数之外的数字将被舍去,因此会产生误差。,例2.5 实型数据的舍入误差。,程序运行结果: 7654321152.000000, 7654321152.000000,“f”是输出实数的制定格式。结果中xy,单精度的x较33大的多,其有效位数是7位,超过此范围的数字是无意义的。Turbo C 规定小数后最多保留六位。应避免这种被“忽视”的情况发生。,62,5.实型常数的类型,实型常数不分单、双精度,都按双精度double型处理。例如定义一个实型变量a,进行如下运算: a3.14159*7.1617 编译系统先将3.14159和7.1617作为双精度数进行相乘的运算,得到的结果也是双精度的,然后取其前7位有效数字赋值给实型变量a。这样,可以使计算的结果更加精确。,63,2.3.3 字符型数据和字符串常量,字符型数据包括字符常量和字符变量。 1.字符常量 字符常量是用一对单引号括起来的一个字符。 例如:x、d、=、!等都是合法字符常量。注意:d和D是两个不同的字符常量。 注意:字符常量只能是单个字符,不能是字符串。字符可以是字符集中除了单引号本身“”、双引号“”、反斜杠“”外的任意字符。但数字被定义为字符型之后就不能参与数值运算。如6和6 是不同的。6是字符常量,不能参与运算。,例,a,A, 1 abc、“a”,64,2.转义字符,转义字符以反斜线“”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符的原意,故称“转义”字符。如,输出函数中用到的“n”其意义是“回车换行” C语言中,转义字符有三种:简单转义字符、八进制转义字符和十六进制转义字符。,n 换行 t 横向跳格(水平制表8列) r 回车 反斜杠 单引号 ” 双引号 ddd ddd表示1到3位八进制数字 xhh hh表示1到2位十六进制数字,65,例2.6 转义字符的使用。,程序运行结果: fgcde,程序分析: 注意:转义字符的作用。首先在左端输出“abc”,然后遇到“t”,它的作用是跳到下一个制表符位置;一个制表符占8列,下一制表符位置从第9列开始,故在第910列上输出“de”;然后遇到“r”,它代表“回车”(不换行),于是返回到本行的行首(最左端第1列),输出“f”;然后遇到“b”,它代表“退一格”,接着输出“g”。,程序运行时的输出结果为: fabgcde 但显示器上看到的结果与上述结果不同,为: fgcde 中间的字符被后续字符取代了。,66,3.字符变量 字符变量用来存储字符常量,它只能存放一个字符。 字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。例如: char a,b; 4.在内存中的存储形式 每个字符变量被分配一个字节的内存空间,字符型数据在存储时,并不是把该字符本身放到内存单元中,而是把该字符的ASCII码值存放在变量的内存单元之中的。 例如:A的十进制ASCII码是65,a的十进制ASCII码是97,67,在内存单元中存放的是65和97的二进制代码:,字符型数据在内存中是以ASCII码存放的,它的存储形式与整数的存储形式类似。使得字符型数据和整型数据之间可以通用。语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。,68,例2.7 向字符变量与整型数据通用,程序运行结果: a,A 65,97,a,b值的输出形式取决于printf函数格式串中的格式符,当格式符为“%c“时,对应输出的变量值为字符,当格式符为“%d“时,对应输出的变量值为整数。由此可知,字符型数据和整型数据是可以通用的,但要注意字符型数据只占一个字节,它只能存放0-255范围的整数。,69,例2.8 大小写字母的转换,程序运行结果: A,b 65,98,a,b为字符变量并赋予字符值,语言允许字符变量参与数值运算,即用字符的ASCII码值参与运算。大小写字母的ASCII 码值相差32,因此可以将小写字母与大写字母进行相互转换,然后分别以字符型和整型输出。,70,5.字符串常量,字符常量是用一对单引号括起来的一个字符,而字符串常量则是由一对双引号括起的字符序列。 例如: “chongqing” , “C program” , “&1.75” ,“a”等都是合法的字符串常量。 字符串常量和字符常量是不同的量。它们之间的主要区别如下: 外形不同,字符常量由一对单引号括起来,字符串常量由一对双引号括起来。注意,a和“a“是不同的。 内容不同,字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 单向赋值,可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。 空间不同,字符常量占一个字节的内存空间,字符串常量占的内存字节数等于字符串中字节数加1。末尾增加的一个字节用于存放字符串结束的标志字符“0“ (ASCII码为0)。,71,字符串 “chongqing“ 的长度是9个字节,在内存中所占的字节为10,其存储方式如下图所示:,最后一个字符为0,在输出时是不会输出0的。注意在书写程序时不必加0,0是系统自动加上的。 字符常量a和字符串常量“a“虽然都只有一个字符,但在内存中的情况是不同的。a在内存中占一个字节,“a“在内存中占二个字节。,72,2.3.4 各数据类型间的混合运算,整型(包括int,short, long)、浮点型(包括float, double)可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算.转换的原则就是为了两个运算对象的计算结果尽可能提供多的存储空间。当运算符两端的运算对象的数据类型不一致时,在运算前先将类型等级较低的数据转换成等级较高的数据保值转换。,上述的类型转换是由系统自动进行的.,横向向左的箭头表示必定的转换,纵向的箭头表示数据类型级别的高低,实际运算时不需逐级转换,可由级别低的直接转换为级别高的。,73,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。,例3.9 数据类型转换,程序运行结果: s=78,PI为实型;s,r为整型。在执行s=r*r*PI语句时,r和PI都转换成double型计算,结果也为double型。但由于s为整型,故赋值结果仍为整型,舍去了小数部分。,74,2.3.5 简单数据类型的表示范围,75,2.3.6 数据的简单输出,将数据结果展示出来,必须使用输出语句,所谓输入输出是以计算机为主体而言的。在语言中,所有的数据输入输出都是由库函数完成的。 在使用语言库函数时,要用预编译命令 #include 将有关“头文件”包括到源文件中。 使用标准输入输出库函数时要用到 “stdio.h”文件,因此源文件开头应有以下预编译命令: #include 或 #include “stdio.h“ stdio是standard input &outupt的英文缩写,其意思是标准输入输出。,76,printf函数调用的一般形式为: printf(“格式控制字符串“,输出表列) 其中“格式控制字符串”用于指定输出格式。“格式控制字符串”可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如: “%d”表示按十进制整型输出; “%ld”表示按十进制长整型输出; “%c”表示按字符型输出等。 “%f”表示按小数形式输出单、双精度实数 非格式字符串在输出时原样照印,在显示中起提示作用。 输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。,77,例2.10 数据输出,程序运行结果: 68 80 68,80 D,P a=68,b=80 x is 3.140000,输出第一句中,在两%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第二句中加入的是非格式字符逗号,因此输出的a,b间加了一个逗号。第三句要求按字符型输出a,b值。第四句中为了提示输出结果又增加了非格式字符串。第五句的格式串要求按实型输出,其他非格式字符按原型输出。,78,2.4 C语言的运算符与表达式,2.4.1 C语言运算符简介 1.运算符 C语言的运算符可分为算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、逗号运算符及一些特殊的运算符。 按运算符与运算对象(操作数)的关系可将C语言的运算符分为单目运算符、双目运算符和三目运算符。 单目运算符是指运算符只需要一个操作数,如!,+,-等; 双目运算符是指运算符需要两个操作数,即运算符的左右两侧都需要一个操作数,如+,-,*,/,等; 三目运算符是指运算符需要三个操作数,如条件运算符?:。,79,语言的运算符可分为以下几类: 算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(+)、自减(-)共七种。 关系运算符:用于比较运算。包括大于()、小于(=)、小于等于() 赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,=,=,=) 条件运算符:这是一个三目运算符,用于条件求值(? :)。 逗号运算符:用于把若干表达式组合成一个表达式(,)。 指针运算符:用于取内容(*)和取地址(&)二种运算。 求字节数运算符:用于计算数据类型所占的字节数(sizeof)。 强制类型转换运算符:强制进行数据类型转换(类型)。 分量运算符:用于存取结构和联合中的成员(,.),其优先级在所有运算符中是最高的。 下标运算符:用于数组下标的表示( ). 其他运算符:如函数调用运算符(())。,80,2.表达式 表达式是使用运算符和圆括号将操作数连接起来构成的式子。C语言的操作数包括常量、变量、函数值等。例如:表达式(x-y)/(3*a+b)-6*d中包括+,-,/,*等运算符,操作数包括x,y,a,b,3等。 语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。 3.简单语句 C语言中,在表达式的末尾加上一个分号“;”就构成了简单语句。在程序设计过程中要避免使用无意义的简单语句。,81,1.赋值运算符 赋值就是将一个数据值存储到一个变量中。注意,赋值的对象只能是变量,而这个数据值既可以是常量,也可以是变量,还可以是有确定值的表达式。赋值运算符记为“=”,其作用是将一个数据赋给一个变量。例如,“a3;”其作用是执行一次赋值操作,表示将常量3赋给变量a。 2.赋值表达式 由赋值运算符“= ”将一个变量和表达式连接的式子称为赋值表达式。其一般形式为: 变量=表达式 例如: x=sin(a)+(i+);,2.4.2赋值运算符和赋值表达式,82,对赋值表达式求解的过程是: 求赋值运算符右侧的“表达式”的值; 赋给赋值运算符左侧的变量。 例如: 赋值表达式“=3*5”的值为15,执行表达式后,变量a的值也是15。,注意: 一个表达式应该有一个值,83,左值 (lvalue) : 赋值运算符左侧的标识符 变量可以作为左值; 而表达式就不能作为左值(如a+b); 常变量也不能作为左值,,右值 (rvalue) :出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。,赋值表达式中的“表达式”,又可以是一个赋值表达式.例如: a=(b=5),分析:括弧内的“b=5”是一个赋值表达式,它的值等于5。执行表达式“a=(b=5)”相当于执行 “b=5”和“ab”两个赋值表达式。 赋值运算符 按照“自右而左”的结合顺序,因此,“(b5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等价,最后a5。,84,请分析下面的赋值表达式(a=3*5)=4*3,分析:先执行括弧内的运算,将15赋给a,然后执行 4*3的运算,得12,再把12赋给a。最后a的值为12, 整个表达式的值为12。可以看到(a=3*5)出现在赋 值运算符的左侧,因此赋值表达式(a=3*5)是左值,注意:在对赋值表达式(a=3*5)求解后,变量a得到值 15,执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变量a,而不是赋给3*5。,不能写成: a=3*5=4*3,85,将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中. 如:printf(“%d“,a=b);,分析:如果b的值为3, 则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。,86,3.类型转换,如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下: (1)整型数与实型数之间的转换 将实型数据(单、双精度)赋予整型变量时,舍去实型数据的小数部分。例如:整型变量i,执行“i=3.14”的结果是使得i的值为3,以整数形式存储在内存中。 将整型数据赋给实型(单、双精度)变量时,数值不变,但以实型数据形式存储在内存中,即增加小数部分(小数部分的值为0)。,87,(2)实型数据之间的转换 将一个double型数据赋给float型变量时,截取其前7位有效数字,存放到float型变量的存储单元(32位)中。注意,数值范围不能溢出。例如: float a; double b=123.456789e100; a=b; 便会出现溢出错误。 将一个float型数据赋给double型变量时,其数值不变,有效位数扩展到16位,在内存中以64位存储。,88,(3)整型数与字符型数之间的转换 字符型数据赋给整型变量时,由于字符型只占一个字节,而整型占二个字节,故将字符的ASCII码值放到整型量的低八位中,这时有两种情况: 如所用系统将字符型数据处理为无符号型的量或对unsigned int型变量赋值,则将字符型数据(8位二进制位)放到整型变量的低8位,高8位补为0。例如将字符376(代表图形字符“”,其ASCII码值为254)赋给int型变量a,如下图所示。,89,如所用系统(如Turbo C+3.0)将字符型数据处理为带符号型的量(即signed char),如字符最高位为0,则整型变量高8位补0;如字符最高位为1,则高8位全补1,见下图所示。这称为“符号扩展”,这样做的目的是使数值保持不变,如上述字符/376以整数形式输出为2,a的值也是2。,90,将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(截断)。例如: int a=291; char b=c; b=a; 赋值情况见下图所示,字符变量b的值为35,如用“c”格式输出b,将得到字符“”(其ASCII为35)。,91,(4)整型数据之间的转换 如将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中。如int型数据为正值(符号位为0),则long型变量的高16位补0;如int型变量为负值(符号位为1),则long型变量的高16位补1,以保证数值不改变。 如将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到int型变量(截断)。例如: int x; long y=9; x=y; 赋值情况如下图所示,,92,如果y=65536(八进制数0200000),则在赋值后x值为0,如下图所示。,93,(5)无符号整数与其他整数之间的转换 将一个unsigned int类型数据赋给一个与其长度相同的整型变量(如unsigned intint,unsigned longlong,unsigned shortshort)时,将unsigned型变量的内容原样送到非unsigned型变量中,即进行原样复制;但如果数据范围超过相应整型的范围,则会出现数据错误。例如: unsigned int x=65535; int y; y=x; 将x整个送到y中,如下图所示。由于y是int型,第1位是符号位,因此y成了负数。根据补码指数可知,y的值为1,可以用printf(“%d“,b)来验证。,94,将非unsigned 型数据赋值给长度相同的unsigned型变量,也是原样赋值(连原有的符号也作为数值一起传递),,95,例2.11 有符号数据送给无符号变量,程序运行结果: 65535 程序分析: 赋值情况如下图所示,不同类型的整型数据间的赋值归根结底就是一条,按存储单元中的存储形式直接传送。,96,4.复合赋值运算符,除了基本赋值运算符外,C语言还提供了另外十种复合运算符。它们就是在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=,-=,*=,=,%=,=,&=,=,|=。这些运算符把“运算”和“赋值”两个操作结合在一起称之为复合赋值运算符。采用复合赋值运算符可提高代码执行效率。 构成复合赋值表达式的一般形式为: 变量 双目运算符=表达式 它等效于: 变量=变量 运算符 表达

温馨提示

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

评论

0/150

提交评论