第2章_C语言程序设计基础.ppt
第2章 C语言程序设计基础,2,回顾,C语言的特点 C程序的编译和运行过程 编译器将源程序转换成机器能理解的程序 连接器用于连接相关的目标文件以生成可执行程序,3,教学目标,算法的表示方法 理解变量和常量的含义 熟悉基本数据类型 int、char、float 和 double 掌握算术运算符和赋值运算符的用法 理解表达式 理解类型转换,4,算法,著名计算机科学家沃思提出一个公式: 数据结构 + 算法 = 程序 算法: 为解决一个具体问题而采取的确定的有限的操作步骤,仅指计算机能执行的算法,对数据的描述:数据结构(data structure) 对操作的描述:算法(algorithm),5,算法的特性,有穷性 在合理的时间内完成 确定性(无歧义) 如果x0,则输出Yes;如果x0,则输出No; 可行性(有效性) 能有效执行 负数开平方 没有输入或有多个输入 有一个或多个输出,有足够的情报,6,算法的表示方法,自然语言描述 流程图 在1966年,Bohra 与 Jacopini 提出 N-S图 1973年,美国学者I.Nassi 和 B.Shneiderman 提出 伪代码,7,例1 有两个存储单元a和b,要求将它们的值互换。,分析:按存储器的性质,如果将单元a的值直接送到单元b中,那么就会覆盖掉b原来的内容,因此,需要借助一个临时单元c来交换。,具体算法如下: 步骤1: 将单元a的值送给单元c; 步骤2: 将单元b的值送给单元a; 步骤3: 将单元c的值送给单元b。,自然语言描述,8,例2 求1+2+3+4+10。,步骤1: 将0送到S中; 步骤2: 将1送到n中; 步骤3: 把n的值加到S中; 步骤4: n增1; 步骤5: 若n10则转回步骤3,否则执行步骤6; 步骤6: 输出S的值。,自然语言描述,9,流程图通常采用一些几何图形来代表各种类型的操作,在图形内标明文字或符号来表示操作的内容,并用箭头来表示操作的顺序。,用流程图表示算法,直观形象,易于理解,但由于流程图允许使用箭头随意跳转,对表示算法的层次结构非常不利,且流程图占的篇幅较大,作图工作量也很大。,流程图,10,顺序结构流程图表示方法,B,A,11,选择结构流程图表示方法,B,N,如果 成绩60 那么 通知补考 否则 告知你考试成绩,A,Y,条件P,12,循环结构流程图表示方法,A,条件P,A,当型循环,直到型循环,真,假,假,条件P,假,真,13,将例2 求1+2+3+4+10 用流程图进行描述。,流程图,14,针对流程图存在的缺点,I. Nassi和B. Shneiderman提出了结构化程序设计的流程图,称为N-S图,更能体现结构化程序设计的思想。推荐使用N-S图。,N-S图完全去掉了流程线,算法的所有处理步骤都写在一个大矩形框内(表示简单、符合结构化思想)(象堆积木),结构化程序设计的三种基本结构 顺序结构、选择结构、循环结构,N-S图(盒图),15,结构化程序设计的三种基本结构具有以下共同的特点: 只有一个入口; 只有一个出口; 结构内的每一部分都有机会被执行到; 结构内不存在“死循环”。,N-S图(盒图),16,将例2 求1+2+3+4+10 用N-S图进行描述。,N-S图(盒图),17,将 求10个任意整数中的最大数 用N-S图进行描述。,N-S图(盒图),18,程序设计步骤,根据实际问题设计应用程序大致要经过以下四个步骤: 分析问题 画流程图或N-S图 编写程序 运行并调试程序,采用自顶向下、逐步细化的结构化分析的方法,19,例3 求三个数中的最大数。,20,数据类型(Data Type),数据为什么要区分类型? 不同类型的数据代表不同的 数据表示形式 合法的取值范围 占用内存空间大小 可参与的运算种类,21,数据类型,在C语言中,数据类型一般包括基本数据类型、构造数据类型、指针类型和空类型等四大类。,22,一个简单的C程序例子,#include /*函数功能:计算两个整数相加之和 入口参数:整型数据a和b 返回值: 整型数a和b之和 */ int Add(int a, int b) return (a + b); /*主函数*/ main() int x, y, sum = 0; printf(“Input two integers:“); scanf(“%d%d“, /*输出x和y相加之和*/ ,并列的两个函数 其中一个是 程序的入口,程序注释,23,C语言中的基本元素,程序,语句,标识符 关键字 常量、变量 运算符 分隔符 ,关键字(Keyword) 又称为保留字 数据类型修饰符int,控制语句return等 标识符(Identifier) 系统预定义标识符,main,printf 等 用户自定义标识符,Add, x, y 等 运算符(Operator) 34种,+ 分隔符(Separator) 空格、回车/换行、逗号等 其它符号 大花括号“”和“” “/*”和“*/”是程序注释所需的定界符 数据(Data) 变量(Variable) 常量(Constant),24,常量,常量是在程序中保持不变的量,常量区分为不同类型:整型、实型、字符型和字符串型 如 12、3.2、'a'、 “hello“,25,整型常量,整型常量有三种不同的表示形式: 十进制:无前缀,无后缀 八进制:在八进制数值前面加前缀“0”,其数码取值为07。 例如:023,0457,01324等 十六进制:前缀为“0X”或“0x”,其数码取值为09、AF或af。例如:0X2A,0XA0,0XFFFF等 当任意整型常量后跟一个字母u或U时,表示是无符号整型。 例如:123u 当任意整型常量后跟一个字母l或L时,表示是长整型。 例如:123L,26,实型常量,实型(浮点型)常量有2种不同的表现形式: 小数形式:由数字和小数点组成,必须要有小数点。例如:0.123,123.,123.0,0.0等。 指数形式:如123e3或123E3都代表123×103。注意字母e或E之前必须有数字,且e或E后面的指数必须为整数。规范化的指数形式:在字母e或E之前的小数部分中,小数点左边应有一位且只能有一位非零的数字,如1.23e5。,27,字符型常量,C语言的字符常量是用单撇号括起来的一个字符,如'A','a','$'等。 转义字符:以一个字符“”开头的字符序列,代表特殊的含义。,28,八进制数字表示(ddd): '123' '3' 注意数字的取值范围 十六进制数字表示(xdd): 'xFF' 'x5' 说明:字符可用对应的编码(整数)表示 如:用 065 53 0x35 表示 '5' C中经常将字符常量等价为整数参与运算: 如:'A' +32 结果为 'a' '0' - 48 为 0,字符型常量,29,字符串由若干字符(含转义字符)组成,用双引号界定 如:“hello“ “a“ “123“ “ “n“ “Tomtis078n“ 含几个字符? 没有长度为零的字符(''),但有长度为零的字符串(“) 注:双引号在一行内成对出现,长字符串可写在多行上,C会自动连接为整体。例如:“hello, I'm“ “ yu. “ “Who are you?“ 输出显示:hello, Im yu. Who are you?,字符串常量,30,符号常量,在C语言中,用一个标识符来表示一个常量,称之为符号常量 一般形式为: #define ,#include #define PI 3.14159 main() double s,r; r=5; s = PI * r * r; printf(“area s=%f“,s); ,31,声明和使用变量,声明变量: Datatype variablename; 如: int age; 定义后给变量赋值: variablename = value; 如:age=20; 定义时初始化变量: Datatype variablename = value; 如:int age=20;,给变量赋值,除了给一个直接的值以外,还可以通过计算获得,32,变量的命名规则: 变量名可以由字母、数字和 _(下划线)组合而成 变量名不能包含除 _ 以外的任何特殊字符,如:%、# 、逗号、空格等 变量名必须以字母或 _(下划线)开头 变量名不能包含空白字符(换行符、空格和制表符称为空白字符) C 语言中的某些词(例如 int 和 float 等)称为保留字,具有特殊意义,不能用作变量名 C 语言区分大小写,因此变量 price 与变量 PRICE 是两个不同的变量,变量命名,在 C 语言中,变量命名需要遵循一定的规则(标识符),有效名称,principal,cost_price,marks_3,lastname,city,无效名称,123rate,currency$,discount%,zip code,33,使用整型变量,声明: int page_number; long int population; unsigned int age; 初始化: int max_marks = 100;,在同一语句中可以声明多个类型相同的变量: int page_number, copies, paper_width;,34,单精度实型,float 在 C 语言中用于存储单精度实数,float,32 位,-3.4×10-383.4×10+38 ,7位有效数字,声明: float selling_price; 初始化: float selling_price = 11.3;,35,双精度实型,213.5671435568967,64位,取值范围:-1.7×10-308 1.7× 10308,16 位有效数字,声明: double pressure_level; 初始化: double pressure_level = 213.5671435568967;,double 在 C 语言中用于存储双精度实数,213.5671,36,数据类型所占的位数与机器硬件(CPU)、操作系统、开发环境有关。,基本数据类型与环境间的关系,37,字符型,占 8 位内存,示例:,char gender; gender='m',char gender='m',38,char型与int型之间的关系,#include main() char ch = 'b' printf(“%c, %dn“, ch, ch); ch = 'b' - 32; printf(“%c, %dn“, ch, ch); ,#include main() char ch = 'b' printf(“%c, %dn“, ch, ch); ch = 'b' - ('a' - 'A') ; printf(“%c, %dn“, ch, ch); ,b, 98 B, 66,b, 98 B, 66,例:小写字母转换为大写字母,39,函数,C语言提供了丰富的内部函数,又叫库函数,也称标准函数,其定义按函数类型存放在不同的“头文件”中,使用时应该在源文件中的开始位置包含上相应的头文件。,例如,使用数学函数时,应该在源文件中的开始位置使用#include “math.h“ 把头文件math.h包含到源文件中。,引用内部函数时,只需要写出相应的函数名,并在后面的括号中给出所要计算的自变量值,即可得到所需要的函数值。例如,sqrt(4.0)得2.0,fabs(-100.0) 得100.0。,使用标准函数时,必须注意以下两点: (1)使用三角函数时,必须注意角度的单位是“弧度”; (2)引用标准函数时,自变量要写在括号里面,自变量可以是常量、变量或表达式。,40,常用的标准数学函数,41,表达式,表达式由操作数和运算符的组合而成 表达式中的操作数可以是变量、常量或者子表达式 表达式是常量、变量、数组元素、函数等运算对象和运算符以及括号的有意义组合。类似数学算式或公式,但写法有所不同。 运算符的类型有: 算术运算符 + - * / % + - 指针运算符 * & 关系运算符 = | & 分量运算符 - 赋值运算符 = 下标运算符 条件运算符 ? : 其他 逗号运算符 ,注意:运算符具有优先级和结合性。,42,算术运算符,算术,一元,二元,操作数,操作数,运算符,二元运算符,+,-,*,/,%,两个整数相除,其值为整数,如 5 / 3值为1 操作数中有一个为实数时,结果为 double 型,% (模(求余)运算符): % 两侧均为整型数据,43,算术运算符和算术表达式,算术,一元,-,+,num+,num=num+1,num-,num=num-1,+num -num,num+ num-,前缀,后缀,二元,44,例:算术运算符和算术表达式应用,#include main() int a = 5, b = 3, c = 25, d = 12; float qu; int re,in,de; /* 使用算术运算符 */ qu = a / b; / 除法 re = a % b; / 求模 in = +c; de = -d; printf (“商为 %fn“,qu); printf (“余数为 %dn“,re); printf (“加 1 后为 %dn“,in); printf (“减 1 后为 %dn“,de); ,商为 1.000000 余数为 2 加 1 后为 26 减 1 后为 11,45,赋值运算符和赋值表达式,变量 表达式,Height = 177.5 Weight = 78 Gender = m x = a+b w = sin(a)+sin(b) y = i+ -j,最简单的运算符:,=,作用是将一个数据(或表达式的值)赋给一个变量。注意:赋值符号左边只能是变量,不能是表达式,也不允许是常量。,46,复合赋值运算符,47,赋值运算符和赋值表达式使用,#include main () float book_price = 60.75; /存放书的价格 printf(“n 书的价格 = %f“,book_price); book_price += 12.50; printf(“n 书的新价格 =%fn“,book_price); ,book_price=book_price+12.50;,48,逗号运算符与逗号表达式,形式:表达式1, 表达式2 作用:用于连接表达式,计算过程:先求解表达式1,再求解表达式2。整个逗号表 达式的值是表达式2的值。,如: 3+5, 6+8,例: x=(a=3, 6*3) x=a=3,6*a,逗号表达式可组合,逗号运算符的优先级最低,结合方向自左到右,并不是任何地方出现的逗号都是逗号运算符,如:printf(“%d, %d, %dn“, a, b, c );,如:(a=3*5, a*4), a+5,49,类型溢出,C语言直接提供的任何类型都有取值范围。当向其赋超过此范围的数值,就会产生数值溢出,得到一个不正确的结果。 int的范围是-21474836482147483647 如果超出取值范围,给它一个小于-2147483648或者大于2147483647的数会如何呢?编程测验,小蛇能吞下大象吗?,50,类型溢出解决方案,解决方案: 预先估算运算结果的可能范围,采用取值范围更大的类型。 1+2+3+ 1!+2!+3!+ 13+23+33+ 如果不需要处理负数,则采用无符号类型。 在运算还没开始之前就判断运算数是否在合理的取值范围内。如果超出,则停止运算,转错误处理。,51,运算符的优先级和结合性,优先级: +、 -、+ 、 - 、sizeof() *、 / 、% +、 - =、+=、-=、*=、/=、%= , 结合性: 右结合 +、 -、+ 、 - 、sizeof() =、+=、-=、*=、/=、%= 左结合 *、 / 、% 、 +、 - 、,,52,自动类型转换,double,float,long,unsigned,int,char,short,低,高,说明:,必定的转换,运算对象类型不同时转换,53,强制类型转换,一般形式:(类型名)(表达式) 例 (int)(x+y) (int)x+y (double)(3/2) (int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变,强制类型转换与指针,并称C语言两大神器,用好了可以呼风唤雨,用坏了就损兵折将,屠 龙 刀,倚 天 剑,54,类型转换举例,#include main() int m = 5; printf(“m / 2=%dn“, m/2); printf(“(float)(m/2) = %fn“, (float)(m/2); printf(“(float)m/2 = %fn“, (float)m/2); printf(“m = %dn“, m); ,两个整数运算的结果 还是整数,不是实数,55,类型转换举例,#include main() float x; int i; x=3.6; i=(int)x; printf(“ x=%f, i=%d“ , x, i); ,精度损失问题,较高类型向较低类型转换时可能发生,56,总结,算法的表示方法 常量是在程序中不能被更改的值;而变量在程序中可以被更改的,通过变量可以引用存储在内存中的数据 C语言中的基本数据类型包括整型、单精度实型、双精度实型和字符型 整型分为短整型、整型、长整型,每种整型又可分为有符号型和无符号型 单精度实型和双精度实型变量可以存储实数,但双精度型取值范围要比单精度型大的多 字符型变量可以存储单个字符,其值是该字符的ASCII 码 表达式是操作数和运算符的集合 赋值运算符的语法如下:variable = expression 算术运算符提供运算功能,包括+、-、*、/、%、+和-,57,作业,习题2:2.12.5 描述算法 2.102.13、2.15、2.16 做在书上 2.18 先写出结果,再上机验证,