? 数据形式
? 数据定义
? 运算符
? 表达式
? 运算过程与类型
? 输入输出
? 2.1 数据类型和存储形式
? 常数、变量、函数和表达式是程
序中的基本操作对象,它们都隐式
或显式地与一种数据类型相联系。
? 2.1 数据类型和存储形式
? 数据类型是指数据的内在 表现形
式,类型是在高级语言中的一个非
常重要的概念,因为类型确定数据
的存储形式和值域,类型确定相应
数据所允许执行的运算。
C






基本类型
构造类型
短整型 ( short int )
整型 ( int)
长整型 ( long int)
整型
实型
数组类型
结构类型 ( struct)
共用体 ( union)
文件类型 ( FILE)
指针类型
空类型( void )
单精度型 ( float)
双精度型 ( double)
不同类型
的数据在计
算机中的存
储格式也不
同, 以 32位
机为例说明 。
存储特点:顺序存放,精确表示
实数存储特点,指数与小数分别存放,近似表示 。
1,专用符号, +, -, *, /, —,; 等 多为操作运算符 。
2,单词,
? 保留字(关键字), 具有固定含义的字,作用是用来
命名 C 语句、数据类型、变量属性及个别运算符,一律用
小写字母表示。
数据存储类别限止符,auto,ex ter n,regi ste r,st ati c;
数据类型限止符,l ong,shor t,unsi gned,st ruct,unio n;
数据类型,ch ar,doubl e,fl oat,i nt;
C 语句,brea k,case,conti nue,def aul t,do,el se,f or,got o,i f,
ret urn,s w i tch,w hi l e;
其 它,entr y,siz eof,typed e f;
* C 预处理,de fi ne,i ncl ude,undef,if def,i fnde f,endi f,… ;
? 2.2 基本语法单位
? 用户标识符
? 作用, 标记常数、变量、自定义数据类型、函数及
程序的名字
? 取名规则,
? 以字母或下划线 ‘ _ ’ 中任一字符打头;
? 在第一字符之后,可以是任意的字母、下划线或数
字组成的字符序列,这个字符序列可以是空串。
? 用户标识符
? 说明,
? 不要与保留字同名;
? C 语言中大小写字母有不同的含义,即区分大小写。
name 和 N am e 在 C 中是两个不同的标识符;
? 习惯上除了符号常数,一般都用小写字母表示;
? 标识符长度不限,但只识别前 8 个字符。
例, 正确,a,a1,f_1,area,_age
错误,2 a,last name,no#,- xy,char
? 2.3 C 语言中的常数分类
? 算术常数 ( 整型常数 )
? 十进制整常数,值域 之间,n 为机器字长;
例,123, 100
? 长整数常数,值域 之间,占两个机器字长,
表示形式 为 在整常数后加字母 ‘ l ’ 或 ‘ L ’ ;
例,123 l,1 2 3 L,1 0 0 l,1 0 0 L
? 八进制整常数,由数字 0 打头,后跟一串八进制数字( 0 ~ 7 )
例,0123, 0100, 05, 032727
? 十六进制整常数,以 0 x 打头,随后跟十进制数字( 0 ~ 9 )和六
个字母( A ~ F 或 a ~ f 分别 对应十进制的 10 ~ 15 ) 组成的串。
例,0 x 1 0,0 x 1 A,0 x 1 f,0 x 2 0
122
11
??
?? nn

122
1212
??
?? nn

? 算术常数 ( 实型常数 )
在 C 语言中单精度和双精度实常数的表示方法相同,
编译程序总是把实常数处理 成双精度后再进行运算的。
10E517893246
整数部分
完整形式:
?? ?
指数部分小数部分
实常数的
实常数的组成规则,
? 上述三个部分可以有一部分或二部分缺省,但整数部分和小数部
分不能同时缺省;
? 如果一个实常数有一个小数点,则小数点左右至少有一边有数字;
? 如果实常数 e 或 E, 则两边至少至少都要有一位数字;
? 指数部分必须是整数。
实常数一般有两种书写形式:小数形式和指数形式
? 小数形式, 3,,1 2 3, 4,,0 2 3
? 指数形式, 1.2 E 4,6, 5 e - 5,20e3
实数的取值范围 10
- 38
~ 10
38
:当数值大于 10
38

产生上溢,小于 10
- 38
时产生下溢,通常用 0 近似,
一般一个普通实常数在机内表示时具有 6 ~ 7 位十进
制有效数字,双精度实数具有 16 位十进制有效数字。
? 算术常数 ( 实型常数 )
? 字符常数 (单个字符(简称字符)和字符串)
? 单个字符常数,是由一对单引号括起来的单个字符或转义字
符所构成。在内存中占一个字节的存储单元。
例,‘ A ’,‘ 2 ’,‘ # ’,‘ + ’,‘ \ n ’,‘ \ 0 ’,‘ \ t ’,?? 。
? 转义字符的意思是将反斜 杠 ‘ \ ’ 后面的字符或数值转换成
另外的意义。利用它可以表示 ASCII 字符集中任何一个字符。
‘ \ n ’, 作为换行控制字符
‘ \ 101 ’, 代表字母 ‘ A ’
‘ \ 040 ’, 代表空格符,ASCII 码为 32
‘ \ 0 ’ 或 ‘ \ 000 ’, 代表空操作符,
即空字符,ASCII 码为 0
系统作为字符
串结束符使用
? 常用的转义字符及其作用
ASCII 代码含义字符形式
1 到 2 位 16 进制数所代表的字符\ xhh
1 到 3 位 8 进制数所代表的字符\ ddd
34双引号字符\ "
39单引号字符\ '
92反斜杠字符, \,\ \
12换页,将当前位置移到下页开头\ f
13回车,将当前位置移到本行开头\ r
8退格,将当前位置移到前一列\ b
9水平制表(跳到下一个 tab 位置)\ t
10换行,将当前位置移到下一行开头\ n
到 位
到 位
? 字符串常数
是用一对双引号括起来的零个或多个字符序列。采
用数组形式存放,并且编译系统自动为串加 串结束符
‘ \ 0 ’,以表示串的结束。
注意,由于字符串末尾都被加上 ‘ \ 0 ’ 串结束
符,所以字符串在内部 表示所占的空间要比实
际字符多一个字节,所以长度为 1 的字符串与
单字符常数是不同的。
例,"USTC","zhang san","A","C,\ Program Files"
? 注意字符与字符串的区别
字符型 ( char) 以一字节 8 位存放,存放形式:
1
7 6 5 4 3 2 1 0
1000000
? A ? 在内存中
逻辑形态
A
由于字符串末尾都被加上 ? \ 0 ? 串结束符,所以字符
串在内部所占的空间要比实际字符多一个字节。
1 1000000
,A,
A
0 0000000
逻辑形态 \ 0
串结束符,所以字符
? 符号常数
? 符号常数习惯上用大写字母表示;
? 经过定义,标识符与后面的常数就具有等价的作用;
? 使用符号常数的目的是 便于大程序的修改和阅读直
观。
定义形式,# d e f i ne 标识符 常数
例,# define PI 3.14159
#define EOF - 1
? 2.4 变量及其类型
? 变量的定义
变量表示在 C 程序中的基本存储单元。变量是指在程
序运行过程中其值可以改 变的量。变量必须, 先定义
后使用, 。
定义一般形式,类型 变量标识符表;
例, int age,index;
float x,y; double z ;
定义变量的作用:
? 使一变量属于某一确定的类型,即规定该
变量的取值范围及它能执行的运算操作 ;
? 编译时能为其分配相应的存储 单元,并确
定其存储形式,同时根据其定义检查该变量所
进行的运算合法性 。
定义一般形式,类型 变量标识符表;
? 整型变量的定义
int age,index; // 定义整形变量
long int count; // 定义长整形变量
或 l o n g co u n t ;
short int day,month; // 定义短整形变量
或 s h o r t d a y,m o n t h ;
unsigned addr; // 定义无符号整变量
存储单元的字长一般依赖于各
系统的硬件环境, 略有不同 。
说明,
? 单精度和双精度的值域相同 10
- 38
~ 10
38
,双精度仅
提高精度。
? 在运算过程中,单精度变量的值总是转换为双精度
后再参与运算的,目的是提高精度。
? 实型变量的定义
float x,y; // 定义单精度实型变量( 4 字节)
double z; // 定义双精度实型变量( 8 字节)
? 字符型变量定义
void main(){
char c1='a',c2='b'; // 定义字符变量并赋初值
c1=c1 - 32; c2=c2 - 32; // 转换为大写字母
printf("%c %c ",c1,c2); // 以字符形式输出
printf("%d %d \ n",c1,c2); // 以整数形式输出
}
输 出,
A B 65 66
字符型量可直接参与数值运算,
它的值是该变量当前所含字符在
字符集中的序数值,因此实际上
是一个整数值 。
? 字符型量与整数的关系及其数值运算和输出形式
1 1000010
? 字符 ? a ? 和 ? b ? 的存储形式同整数 97 和 98,实际上是一
个整数值;由此 C 语言中字符型量从属与整型数据,可
参与算术运算;
? 由此字符型量既可用字符形式 ? % c ? 输出,也可采用整
型 ? % d ? 输出,具体采用那一种方式,由计算机根据输出
格式符或运行环境自动判定。
1 0100010
…………
…………
? a ? 97
ASC II 码 转成二进制
? b ? 98
ASC II 码 转成二进制


字符存储单元
c1
c2
? 字符串变量实际上是一个分量为字符型量的字符数组
以上语句说明 name 和 address 是两个字符串变量,
分别含有 20 个分量和 32 个分量,每个分量是一个字符 。
定义形式,char 标识符 [ 整形表达式 ] ;
‘ [ ] ’,数组 下标运算符,因此标识符属于数组名性
质,方括号中的整型表达式的值确定数组的分量个数。
例,c h ar n a m e [ 2 0 ],a d d r e s s [ 3 2 ] ;
? 关于字符数组的说明,
? 存放在字符数组中的字符串应以字符串结束符 ‘ \ 0 ’
束,占一个字节的存储空间,但 不计入串长之内。它
只是作为字符串的结束标志而已 。此规定是为了编译
程序和用户能判断字符串的实际 长度,便于字符串的
处理。
? 数组分量序号的排列从 0 开始,故 name 和 address 数
组的分量分别为,
name[0],name[1],name[3],??, name[19] 。
address[0],address[0],address[0],??, a dd r e s s [ 0 ],
正确区分 字符串长度 与存放字符串 所需空间大小
? 数组名代表相应数组存储单元的起始地址,即通过
数组名可以查找定位相应字符串 的存储位置,可以说
字符数组名代表相应字符串。当 数组名作为函数的参
数时,数据传递的方式属于传地址方式。
name 0 1 2 3 4 5 6 7 8 9 ?? 19
2000
??\ 0nas□gnahz □
? 变量的初始化
语法形式,数据类型 变量名 = 常量表达式;
main( ){
int age=19; char scx= ‘ M ’ ;
double pi=3.141592653;
int convert= ‘ A ’ - ‘ a ’ ;
??
执行语句;
??
}
数据说明定义
语句,在编译
时有效。
执行语句,运
行期间有效。
? 2.5 表达式和表达式语句
? 表达式的组成:
1) 表达式可由常数、变量、函数调用、运 算
符、及圆括号内的表达式组成;
2) 单个常数、单个变量、或单个函数调用 也
都可以看作是一个表达式。
表达式是计算机求解问题的基础
表达式的学习过程中须注意表达式的
书写和运算规则,关心表达式的值和类
型,要求熟练正确地掌握各类表达式的
求解技能。
? 2.5 表达式和表达式语句
丰富的运算符与数据可构成多种表达式,表达式求
值时各运算分量之间类型的 转换极为灵活,适用性强。
整形表达式
浮点表达式
算术运算符
关系运算符
逻辑运算符
增减运算符
赋值运算符
位运算符 …
算术表达式
关系表达式
逻辑表达式
赋值表达式
逗号表达式
条件表达式
表达式运算的最后结果作为表达式的值,
该值的类型即为表达式的类型
一、整表达式, 对整型量进行运算最终得整型值的表达式
允许的运算:
++ -- // 自增自减运算符
* / % // 乘、除和求余运算符
+ - // 加减运算符
说明:
( 1 ) C 的运算符除具有优先级外还具有结合方向的特
征,相关规则如下:
C 的运算符 的相关规则,
1) 同一优先级的运算符级别相同,运算次序由结合方向
决定。
2) 不同的运算符要求有不同的运算对象。
按运算符所要求的对象个数分类,有:
单目运算符,- a,i++,-- i
双目运算符,3*5/4
三目运算符,x? a, b (?, 为条件运算符 )
3) 运算符与对象的结合,C 编译程序在处理时尽可能多
地, 自左而右, 将若干字符组成运算符(在处理标识
符、关键字时也按同一原则处理)
a+++b+++c+++ ( a++)+(b++)+(c++)处理为
? 学习运算符时应特别注意运算符的三个特性
运算符 ①优先级 ②结合方向 ③运算对象
++ -- 高 从右到左 单目运算符
* / %
+ - 低
( 2 ) 两整型量相除商为整数。
17/5 3 5/17 0
( 3 ) 模运算符 ‘ % ’ 的两个操作数必须为整型。
从左到右 双目运算符
使用说明:
++ i,-- i 在使用 i 之前,先使 i 的值加 ( 减 )1 ;
i++,i -- 在使用 i 之后,再使 i 的值加 ( 减 )1 ;
( 4 ) ‘ ++ ’ 自增运算符和 ‘ — ’ 自减运算符,是两个
特殊的单目运算符,其运算对象只能是变量 ( 一般为 整
型 ),不能是表达式,操作结果分别使变量增 1 或减 1 。
㈠ 增减运算符出现在表达式中的运算符多于一个的情

设 i 的原值都为 3,以下各式的运算过程和结果分别为:
1) j=++i 运算过程,i=i+1,j=i; 运算结果,j=4,i=4
2) k=i++ 运算过程,k = i,i = i + 1 ; 运算结果,k = 3,i = 4
3) l= -- i 运算过程,i=i - 1,l=i; 运算结果,l = 2,i = 2
4) m=i — 运算过程,m = i,i = i - 1; 运算结果,m = 3,i = 2
㈡ 若如 ++ i; i++; -- i; i -- ; 形式, 分别作为单一
表达式语句操作时,前缀和后缀的操作结果是相同
的。 (此情况常出现在循环语句中)
二、浮点表达式:
由浮点量及相应运算符组成,表达式 的 值为实型,允
许的运算:
运算符 ①优先级 ②结合方向 ③运算对象
* / 高
+ - 低
从左到右 双目运算符
设有,i n t i,j ; f l o a t x,y ; d o u b l e r ; 则以
下都为合法的表达式:
123.456 e5,x,sqrt( r ) // 简单表达式
( i + x ) * ( j + r ) // 组合表达式
说明:
1) 可以整型、单精度和双精度量的 混合运算,类型转
换规则为:将整型、单精度量都 转换为双精度量,
然后进行运算。
1) 转换和运算是逐步进行的。
( i + x ) * ( j + r )
整 单 整 双
① 双 + 双

① 双 双① 双 双

③ 双
*
③ 双③ 双
②双 + r
双双
说明:
( 1 ) 综合运算时相关运算符的优先级:
算术运算符 关系运算符 赋值运算符
高 低
( 2 ) 关系表达式的值是整型的。当关系(为真)时其
值为 1 ;当关系不成立(为假)时其值为 0 ; 即以 1 代表
,真,,以 0 代表, 假,,所以说 C 语言的关系表达式
的值是整型的,并可参与通常的算术运算。
注意:
④ 正确书写数学表达式,区别由运算规则不同引起的
差异。设 x 的值为 2,则
数 学 表 达 式,1? x? 1 不成立
错误的 C 表达式, - 1 < = x <= 1 成立
正确的 C 表达式, ( - 1 < = x) && ( x <= 1) 不成立
③ 关系运算符两侧可以是不同类型的算术量,系统自
动由低向高转换。
数 学 表 达 式,1 ≤ x ≤ 1 不成立
四、逻辑表达式
由代表逻辑值的基本常量、变量、函数、关系表达式、
逻辑运算符及括号内的逻辑表达式组成。
C 编译系统在给出逻辑运算结果时,以数值 1
代表 ? 真 ?,以 0 代表 ? 假 ?,但判断一个量是否为
真时,以 0 代表 ? 假 ?,以非零代表 ? 真 ?,即把一
个非零数值作为 ? 真 ? 。 故其值总是整数 1 和 0,
因此也可以把逻辑表达式看成是整型表达式,
亦可参与数值运算。
说明:
( 1 ) 综合运算时相关运算符的优先级:
! 算术运算符 关系运算符 && || 赋值运算符
高 低
( 2 ) 由 ‘ && ’ 和 ‘ || ’ 的结合性则(自左至右),操
作时有:
若 ‘ && ’ 的左操作数为零,则不再对右操作数进行
计算,因为必定为零。
若 ‘ || ’ 的左操作数为非零,则不再对右操作数进
行计算,因为此时必定为 1 。
设,int a=1,b=2; 则表达式
( a = 0 ) && ( b = 1 )
操作后结果为:
表达式的值为 0,且 a = 0,b = 2 。
常见的逻辑表达式有:
ch <= ‘ z ’ && ch >= ‘ a ’
ch <= ‘ Z ’ && ch >= ‘ A ’
digit < ‘ 0 ’ || digit > ‘ 9 ’
说明:
( 1 )表达式有值与类型的概念,左操作 数
(变量)的值和所属类型,即为该表达式的值
和类型。
( 2 )类型的赋值转换:若赋值运算符两边类
型不一致,但都属数值型和字符 类型时,则
‘ = ’ 右边的表达式值的类型将自动转换成左
边变量的类型(即赋值表达式值的类型)。
( 4 )复合赋值运算符(自反运算符):由 ‘ = ’
之前加其它双目运算符复合而成。
复合赋值运算符组成形式:
双目操作符 =
由此构成:
+= - = *= /= %= 五种算术运算符
<<= >>= &= ^= |= 五种位运算符
说明:
( 1 )逗号表达式在语法上相当与一个表达式;
( 2 )求解过程:先求表达式 1,再求表达式 2,
依次类推; ??
( 3 )运算是逐步进行的,注意变量值的变化。
4+5,7+8 逗号表达式的值为,15
a=3*4,a*5 逗号表达式的值为,60
a=3*4,a*5,a+8 逗号表达式的值为,20
七、条件表达式:
条件运算符,?, (三目运算符)
条件表达式,e1? e2, e3
其中 e1,e2,e3 分别代表三个不同的表达式
执行情况:
取 e2 作为该
表达式的值
取 e3 作为该
表达式的值
e1?
非零 0
取 取
条件表达式简洁, 灵活, 有广泛的应用 。 其结果的
类型为取 e2,e3两者中更为高级的一种 。
八、类型转换,( 1 ) 字符、整型、单精度、双精度量
可以混合运算。混合运 算时类型转换的三种基本规则:
① 属同一类型,但存
储单元长度不同之间的
必然转换,短字节向长
字节转换
② 整型与浮点数之间
的转换,低级向高级转
换。
③ 整型量有符号与无
符号之间的转换和长字
节的转换。
double float
int
unsigned
long
char
short
①①
①①
②②
②②
②②
③③
③③
③③
例:设 int i; float f; double d; long e;
10 + ‘ a ’ + i * f – d / e

② 双

② 双① 双
双 双
① 双
双 双97
③ 整 107③ 整

④ 双

④ 双
⑤ 双
运算是逐步完成的,类型转换由系统自动进行。
( 2 ) 赋值转换,
其值和类型由赋值运算符左边的变量确定。
( 3 )强制类型转换:语法形式
(类型标识符)表达式
作用:将表达式的值显式地转换成所指定的类型。
例:设 int a; float x,y;
(int)5.3%3, sqrt((double)a), (int)(x+y)
九、长度运算符
语法形式:
例:
sizeof(int) // 结果一般为 4
sizeof(double) // 结果一般为 8
sizeof( 类型标识符 ) 或 sizeof 表达式
作用:给出其运算对象以字节为单位的存储单元的长度。
十、表达式语句
语法形式:
例,i++ x=y+1 // 是表达式
printf(, x=%d \ n,,n ) // 函数调用表达式
表达式 ;
表达式语句,即表达式后加分号构成的语句。其中
分号是语句的终结符,是语句的组成部分。
i++; x=y+1 ; // 是表达式语句
printf(, x=%d \ n,,n ) ; // 函数调用语句
a=3*4,a*5,a+8 ; // 逗号表达式语句
十一,C 语言的运算符、优先级、结合性和运
算对象





运算

含义
要求运算
对象的个

结合
方向
1





( )
[ ]
- >
.
圆括号
下标运算符
指向结构体成员运
算符
结构体成员运算符




附录 III 运算符 和 结合性





运算符 含义
要求运算
对象的个

结合
方向
2





!
~
++
--
-
( 类型 )
*
&
sizeof
逻辑非运算符
按位取反运算符
自增运算符
自减运算符
负号运算符
类型转换运算符
指针运算符
地址与运算符
长度运算符
( 1 )
单目运算





要求运算对
象的个数
结合
方向
( 2 )
双目运算符
自左
至右
( 2 )
双目运算符
自左
至右










运算
符符
含义
3










*
/
%
乘法运算符
除法运算符
求余运算符
4
+
-
加法运算符
减法运算符
5






<<
>>
左移运算符
右移运算符
( 2 )
双目运算符
自左
至右





运算

含义
6




<
<=
>
>=
小于
小于等于
大于
大于等于
7
==
! =
等于
不等于
要求运算
对象的个

结合方

( 2 )
双目运算

自左
至右
( 2 )
双目运算

自左
至右





运算

含义
8



& 按位与运算符
9
^
按位异或运算符
10 | 按位或运算符
要求运算
对象的个

结合
方向
( 2 )
双目运算

自左
至右
( 2 )
双目运算

自左
至右
( 2 )
双目运算

自左
至右





运算

含义
11




&& 逻辑与运算符
12 || 逻辑或运算符
要求运算
对象的个

结合
方向
( 2 )
双目运算

自左
至右
( 2 )
双目运算

自左
至右





运算

含义
13




, 条件运算符
要求运算
对象的个

结合
方向
( 3 )
三目运算

自右
至左





运算符
14





= +=
- = *=
/= %=
>>=
<<=
&= ^=
!=
15



含义
赋值运算符
逗号运算符
要求运算
对象的个

结合
方向
( 2 )
双目运算

自右
至左
自左
至右
? 2.6 输入输出补充
介绍 getchar(),putchar() 的应用,与字符输入输出
相关概念。
例[ 1 ], 一个将输入 ( stdin) 拷贝到输出
( stdout) 的文件拷贝程序 。 算法描述:
读入一个字符
while( 字符不是文件结束标志 ) {
输出刚才读入的字符;
再读入下一个字符。
}
完整的程序:
# include <stdio.h>
void main(){
char c;
c=getchar();
while( c != EOF ){
putchar(c);
c=getchar();
}
}
运行测试结果:
abcde12345
abcde12345
^Z
# include <stdio.h>
void main(){
char c;
while((c=getchar())!=EOF) putchar(c);
}
? EOF 是文件结束标志。在, stdio.h, 中有如下定义:
# define EOF - 1
? 程序运行时,getchar() 遇文件结束标志返回值 - 1 ;
? UNIX 系统键盘标准输入文件的结束符号为,CTRL+D ;
? 微机系统键盘标准输入文件的结束符号为,CTRL+Z ;
该程序可优化
成如下形式:
? 键盘输入的是一个字符流,空格是字符,回车也是
字符,除非使用格式符作数值的转换处理。
? C 表达式高效灵活,在一个表达式中可以完成多种功
能的运算。这种运算是按算符的优先级和结合方向性,
逐步完成的。因此要注意表达式的实际运算次序。
# include <stdio.h>
void main(){
char c;
while((c=getchar())!=EOF) putchar(c);
}
该程序可优化
成如下形式:
例[ 1 ], 自顶向下逐步求精的编程方法示例
为进行交通流量的统计,在路边设置了一个车辆探
测器,探测器用线路连接到 计算机。当有车辆通过时,
探测器传送信号 1 给计算机;探测器中有一计时器,每
一秒钟发出一个数字信号 2 传送给计算机,该计算机从
开始探测时计时,探测结束时传递一个数字信号 0 给计
算机,编写程序读入这一系 列的信号并输出下列结果:
① 进行了多长时间的统计调查;
② 记录到的车辆数;
③ 在车辆之间最长的时间间隔是多少
一、数据分析
1 车辆通过
输入信号( sign ) 2 秒钟信号
0 探测结束
① 进行了多长时间的统计调查( seconds )
② 记录到的车辆数( nums )
③ 在车辆之间最长的时间间隔( longest )
是多少,由此派生出的车辆间隔变量
( inter )
要求
输出
结果
① )
② )
③ )
( )
根据以上数据特性,类型都可定义为整型( int )
二、自顶向下,逐步求精的算法描述过程
一级算法:
beging
1,数据定义与赋初值
2,读入探测信号 sign
3,while( sign != 0 )
对 sign 进行处理
4,输出结果
end
有待
进一
步细
化求
精。
二级算法:
3 while( sign != 0 ){
if( sign == 1 )
3.1 处理车辆信号;
else
if( sign = 2 )
3.2 处理计时信号;
3.3 读入下一个 sign
}
有待进一步
细化求精
有待进一步
细化求精
三级算法:
3.1 begin
3.1.1 车辆计数 nums++;
3.1.2 处理最大间隔
if(longest<inter)longest=inter ;
3.1.3 间隔变量清零,为下一个间隔计数作准备
inter=0 ;
end
3.2 begin
3.2.1 总的控制时间累加器增 1,seconds++ ;
3.2.2 间隔计数器计数 inter++ ;
end
三、算法转换为完整的 C 程序
#include <stdio.h>
void main(){
int sign;
void handle(int sign); // 自定义函数原型说明
scanf("%d",&sign);
if(sign!=0)
handle(sign); // 调用自定义函数
printf("OK!");
}
void handle(int sign){ // 用户自定义函数
int nums=0,seconds=0,inter=0,longest=0;
while(sign!=0){
if(sign==1){
nums++;
if(inter>longest) longest=inter;
inter=0;
}
else if(sign==2){
seconds++; inter++;
}
scanf("%d",&sign);
}
printf("nums=%d seconds=%d longest%d \ n",
nums,seconds,longest);
}运行结果:
1 2 1 1 2 2 1 2 1 0
nums=5 seconds=4 longest2
OK!
# include <stdio.h>
#include <math.h>
#define EPS 1e - 7
void main(){
double udf_sin(double x); // 用户自定义函数原型说明
double a; scanf("%lf",&a);
printf("%f %f \ n",udf_sin(a),sin(a));
}
double udf_sin( double x ){ // 用户自定义函数
double sum,term,n=1; sum=term=x;
while( fabs(term) > EPS ){
n=n+1;
term=term*( - x*x)/((2*n - 2)*(2*n - 1));Th e end
培 育 英 才 钻 研 科 学
书山有径勤为路
学海无边苦作舟
书山有径勤为路书山有径勤为路
学海无边苦作舟学海无边苦作舟