数据形式
数据定义
运算符
表达式
运算过程与类型
输入输出
2.1 数据类型和存储形式
常数、变量、函数和表达式是程序中的基本操作对象,它们都隐式或显式地与一种数据类型相联系。
2.1 数据类型和存储形式
数据类型是指数据的内在 表现形式,类型是在高级语言中的一个非常重要的概念,因为类型确定数据的存储形式和值域,类型确定相应数据所允许执行的运算。
C
中的类型划分基本类型构造类型短整型 ( short int )
整型 ( int)
长整型 ( long int)
整型实型数组类型结构类型 ( struct)
共用体 ( union)
文件类型 ( FILE)
指针类型空类型( void )
单精度型 ( float)
双精度型 ( double)
不同类型的数据在计算机中的存储格式也不同,以 32位机为例说明 。
存储特点:顺序存放,精确表示实数存储特点,指数与小数分别存放,近似表示 。
1,专用符号,+,-,*,/,—,; 等 多为操作运算符 。
2,单词,
保留字(关键字),具有固定含义的字,作用是用来命名 C 语句、数据类型、变量属性及个别运算符,一律用小写字母表示。
数据存储类别限止符,auto,ex tern,regis te r,stat i c;
数据类型限止符,l ong,shor t,unsi gned,struct,union;
数据类型,ch ar,double,fl oat,i nt;
C 语句,brea k,case,conti nue,de faul t,do,el se,for,got o,i f,
return,s w i tch,w hil e;
其 它,entry,siz eof,typede f;
* C 预处理,de fi ne,incl ude,un def,i fdef,i fndef,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
A SC II 码 转成二进制
b? 98
A SC 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
shor t
①①
①①
②②
②②
②②
③③
③③
③③
例:设 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));The end
培 育 英 才 钻 研 科 学书山有径勤为路学海无边苦作舟书山有径勤为路书山有径勤为路学海无边苦作舟学海无边苦作舟