资源描述
机电学院计算机培训中心 二级C语言教程 第105页
目 录
第一章:进制转换问题 4
第二章 C语言初步 4
1:标识符 4
2:标识符的分类 4
3:类型关键字的分类: 5
4:常量 5
5:变量 (什么类型的存储空间中只能存放相应类型的常量值,注:字符类型除外) 6
6:赋值语句 6
7:算术运算符 8
8:复合的赋值表达式 8
9:强制类型转换 8
10: ++ 自加 --自减 9
11: 逗号表达式 9
第三章 顺序结构 10
1:输出函数的格式: 10
2:格式: 由 % 加 格式字母 组成 10
3:格式字母 分类 10
4:输出形式: 10
5:输入函数的格式: 12
6: 复合语句 13
7: 空语句 13
第四章 选择结构 15
1:C语言中的逻辑值只有两个:真 假 15
2:真值用1表示,假值用0表示,在使用时要注意所有的非0形式的值都可以理解为真值,0就是假值 15
3:关系运算 15
4:关系运算、算术运算、赋值运算之间的优先级问题 15
5:有关系运算符参与的混合运算 15
6:逻辑运算符和逻辑表达式 15
7: 判断结构 : 17
8: 三目运算符 条件表达式 21
9:switch( ) 多分支选择结构 21
10:goto 语句和语句标号 24
第五章 循环结构 25
1:循环的基本要求: 25
2:while( ) 循环 25
3:do {……..} while( 条件表达式 ) ; 28
4:for (……) 循环 29
6:循环结构作为循环结构的子语句(循环结构的嵌套) 33
7:break 和continue语句的用法 36
第六章 字符型数据 38
1:字符常量: 38
2:在有命令行 stdio.h 的前提下,讲两个函数 38
3: 解释 39
4:多个不同格式之间不加任何符号输入 39
5:多条输入语句同时执行 39
6:在有命令行stdio.h的情况下,C语言中0、’\0’、NULL意思是等价的 39
第七章 函数 41
1:注意几点 41
2:函数的分类: 41
3:用户自定义函数的定义形式: 42
4:例 42
5:程序的流程中的问题 42
6:在程序执行过程中有三个问题 43
第九章:数组 56
3:指针变量 77
第十章:字符串 81
1:定义: 81
3:字符型数组: 81
4: 在边定义边赋值时,没有使用完的存储空间中默认 存放 ‘\0’ 这个字符常量 82
5:字符串在内存中要 占据一维字符型 数组的存储区域 82
6:字符串 和 整型数组、字符型数组、实型数组的最大区别是: 82
7: %s 的意思: 82
8:几种常见的字符串赋值方法 82
9: 通过程序来形成 字符串 83
10:几种常见的对字符串处理的 函数 的使用方法。 85
11:二维字符型数组 86
第十一章 对函数的进一步讨论 90
1: 主函数中的参数 90
2:指向函数的指针 91
3:递归算法: 92
第十二章:全局变量、局部变量、存储分类 92
1:在函数体外部定义的变量叫 全局变量 92
2:全局变量的作用域 从定义语句下面到本程序完为至。 92
局部变量的作用域 从定义语句下面到本函数完为至。 92
3:当全局变量与局部变量同名时,在局部范围内,以局部变量的值为准 92
4:静态局部变量 static 93
第十三章 宏定义、宏代换、动态存储 94
1: 宏定义: 94
2:宏代换: 95
3:动态存储分配: 95
第十四章:结构体、共用体 97
1:定义形式: 97
2: 结构体的使用方法: 97
3:结构体变量的定义方法: 97
4:结构体数组的使用 98
5:结构体指针的使用方法: 98
6:类型声明符的使用 typedef 99
7:结构体变量所占据的存储空间是它的各个成员所占据存储空间之和 100
8: 简单的单向链表 100
9:共用体 101
第十五章: 位运算 103
第十六章 文件 103
1: 文件指针 的定义 103
2: 开打文件 103
3:关闭文件 104
4:fgetc( ) fputc( ) 函数的使用 104
5:fscanf( ) 和 fprintf( ) 函数的用法 105
6:fgets( ) 和 fputs( ) 函数的用法 105
7: fread( ) 和 fwrite( ) 函数的使用方法 105
8:文件定位函数 105
10: rewind 函数 称为“反饶”函数,调用格式如下: 106
附录1 108
一: C语言常用关键字 108
二:运算符的优先级和结合性 108
附录2 库函数 110
一、数学函数 110
二、字符函数和字符串函数 112
三、输入输出函数 113
四、动态分配函数和随机函数 114
第一章:进制转换问题
1:二进制 每位数值上面的数的范围是 0 或 1
2:十进制 每位数值上面的数的范围是 0 1 2 3 4 5 6 7 8 9
3:八进制 每位数值上面的数的范围是 0 1 2 3 4 5 6 7
4:十六进制 每位数值上面的数的范围是 0 1 2 3 4 5 6 7 8 9 A B C D E F
5:十进制转换为二进制的方法: 除二倒序取余
6:二进制转换为十进制的方法: 按权展开
7:二进制转换为八进制的方法: 从右边往左边按三位二进制位来分段,每一个段都对应一位八进制值,前后段之间没有联系。
8:二进制转换为十六进制的方法: 从右边往左边按四位二进制位来分段,每一个段都对
应一位十六进制值,前后段之间没有联系。
学C语言应该注意的两点:
1:编写程序过程中所用到的数值一定要先用类型关键字在内存中开辟能存放该数值的空间。
2:不同的数值所需要的存储空间大小是不一样,由类型关键字来区分。
第二章 C语言初步
例题2.1:计算矩形面积。
#include <stdio.h> 命令行 stdio.h 是标准的输入、输出文件
main( ) 主函数
{ double a,b,area ; 定义语句 语句是由 表达式 加 ; 组成
a =2.1; 赋值语句
b=3.6; 赋值语句
area=a*b; 计算语句
printf(“a =%lf,b=%lf,area=%lf \n”, a,b,area); 输出函数
}
1:标识符
用途:可用做 变量名、符号名、函数名、等等。
定义:a:只能含有3类字符:字母,数字,下划线。 _124
b:只能以 字母 或 下划线开头。
注意:一个合法的标识符必须同时满足上面两个条件。
2:标识符的分类
1)关键字:由C语言规定的一批标识符,它们在程序中只能代表着固定的含义,不能另做其它用途。一般情况下分为 : 类型关键字:int double ,操作关键字: if for 。
2)预定义标识符:由C语言规定的一些标识符,它们在程序中也代表着固定的含义,但C语言语法允许用户可以把它们另做其它用意。
注意:在编写程序过程中尽量不要把关键字和预定义关键字的用法改动、用做其它意思。
3)用户自定义标识符:由用户根据需要、通过类型关键字定义的标识符,一般常用做变量名、函数名、数组名等等,长度不能超过8个字符。
3:类型关键字的分类:
1)字符型 关键字为 char
空间大小:所开辟的存储空间在内存中占据一个字节
作用:用此类型关键字在内存中为合法的用户自定义标识符开辟存储空间,此存储空间中只能存放字符常量值。
2)整型 分为:a:短整型 关键字为 short
空间大小:所开辟的存储空间在内存中占据两个字节
作用:用此类型关键字在内存中为合法的用户自定义标识符开辟存储空间,此存储空间中只能存放短整型常量值。
b:整型 关键字为 int
空间大小:所开辟的存储空间在内存中占据四个字节
作用:用此类型关键字在内存中为合法的用户自定义标识符开辟存储空间,此存储空间中只能存放整型常量值。
c:长整型 关键字为 long
空间大小:所开辟的存储空间在内存中占据四个字节
作用:用此类型关键字在内存中为合法的用户自定义标识符开辟存储空间,此存储空间中只能存放长整型常量值。
3)实型 分为: a:单精度实型 关键字为 float
空间大小:所开辟的存储空间在内存中占据四个字节
作用:用此类型关键字在内存中为合法的用户自定义标识符开辟存储空间,此存储空间中只能存放单精度实型常量值。
b:双精度实型 关键字为 double
空间大小:所开辟的存储空间在内存中占据八个字节
作用:用此类型关键字在内存中为合法的用户自定义标识符开辟存储空间,此存储空间中只能存放双精度型常量值。
注意:VC++6.0环境中默认实型数值的小数部分有六位小数。
4:常量
分为:1)字符型常量: 定义:用单引号引起来、中间有且只有一个字符
例: ‘a’ ‘1’ ‘A’ ‘#’ ‘?’ ‘@’
2)字符串常量: 定义:只要用双引号引起来的都是。
例: “123ab” “ACSW#$” “”
3)整型常量: 定义:就是数学里的整数 例:100 , -451 , 0
4)实型常量:
分为: a:实数形式: 定义:由数字和小数点组成,就是数学里的实数
例:3.14 ,-0.0145 , -5896. , .1402
b:指数形式
标准形式: 定义:就像数学中的科学记数法一样,规定小数点前面只能有一位有效数字,小数点后面可跟六位小数,指数有正、负之分,指数的位数为三位,指数的格式总共占五位,10要用小写e或大写E来表示。
例:321.45 可些成:3.214500e+002
手写形式:定义:字母e 或E之前必须要有数字,且之后的指数必须是整数,且中间不能加入空格。
例:错的:e3 , .5E3.6 , e
5)八进制常量: 定义:必须以数字0(零)开头的
例: 0451 ,0241 , 0778(错的)
6)十六进制常量: 定义:必须以0x 或 0X 开头的
例: 0Xaa , 0x14f , 0x147
5:变量 (什么类型的存储空间中只能存放相应类型的常量值,注:字符类型除外)
1)作用:一般情况用做存储空间的名称
2)定义形式: 存储类别 存储类型关键字 变量名;
3)存储类别一般情况下可以省略,省略时默认为 auto 类别
4)常用定义形式: 存储类型关键字 变量名;
5)例: int a ;
意义:a:给自定义标识符a 在内存中开辟合法的存储空间
b:变量名就代表了它在内存中所表示的存储空间中的值
c:存储类别省略的,auto 类别变量只定义过,没有赋初值,此存储空间中默认存放着不可遇见的值,称为 随机值 。
6)定义的多种形式:( 一定要遵守:先定义,后使用原则 )
例1: int a ; 定义a
int b; 定义b
int c; 定义c
a=b=c=10; 把10分别写入a,b,c三个名字所代表的不同存储空间中
例2: int a,b,c; 定义a , b c
a=b=c=10; 把10分别写入a,b,c三个名字所代表的不同存储空间中
例3: int a=10 , b=10 , c=10 ;
先从左往右为各个变量名在内存开不同的辟存储空间
再把10分别写入三个名字所代表的不同存储空间中
7)定义字符类型值
例1:char ch ;
ch=65 ; 意义:是把整型常量65当成ASCCII码,把此ASCII码所对应的字符常量值存放到ch所表示的存储空间中
例2:char ch ;
ch=4 ; 意义:把字符常量4存放到ch 所表示的存储空间中
6:赋值语句
1) 运算符 = 在C语言中它称为赋值符,意思是 写入 或 存入、存放到 。
2) 运算规则:把运算符右侧的最终结果存放到运算符左边的存储空间中
3) 要求: 赋值运算符的左侧只能为 变量 (只有变量才能在内存中代表存储空间)
右侧的表达式不能是任意表达式。
例: int a=10 , b=20 , c=30 , d=40 ;
a=b+7=c+d ; 就是个错的表达式
4) 赋值号两侧类型统一问题
例1: 大类型存储空间 = 小数值
float a ;
a=10 ; /*计算机系统内部先把10这个整型常量转变为相应的实型常量,再给a所表示的存储空间中存 */
例2: 小类型存储空间 = 大数值
int a ;
a=3.145 ; /* 计算机系统内部把实数分为三部分,整数部分数字、小
数部分数字、小数点,只把相应的整数部分数字存放到a
所表示的空间中 */
7:算术运算符
1) 单目运算符: + 表示正值 - 表示负值
2) 双目运算符: * 乘 / 除 % 求余 + 加 - 减
3)运算符的运算优先级: 单目 高于 双目
4) % 符的运算规则 a: 运算符两侧只能是整数值
b: 例如: m%n 时 ,当m<n时,求余的结果为 m
5)双目运算符的两侧类型统一问题
a: 当两侧运算数的类型统一时,结果和运算数的类型保持一致
例: 3.6+1.2 结果为 4.8 三个数值的类型是一致的
b: 当两侧运算数的类型不统一时,结果必须和大的存储类型保持一致
例: 3.6+50 结果为 53.6 实型值加整型值 结果为 实型值
6) 1/2 按照第5条的运算原则结果是 0 而不是 0.5
例: 用梯形面积公式求面积
(1/2)*(a+b)*h 这样写的结果是 0
8:复合的赋值表达式
1)运算符 *= /= %= += -=
2)解释为:它是有算术运算符和赋值运算符结合起来的运算符,两个符号之间不能加空格
3)运算原则: int a=10 , b=20 ;
a+=b ; 计算过程完全等价于 a=a+b ;
4)%= 运算符的运算原则 和 % 求余运算符的原则是一样的
5)复合的赋值表达式 左侧只能为变量(必须代表能存数值的存储空间)
6)例: int a=10 ;
a=a-=a*=a+a ;
9:强制类型转换
1)形式: ( 存储类型关键字 )对象
2)对象一般可为 常量、变量、表达式、函数等。
3)例: ( int )3.5478 此表达式的结果为 3
4)四舍五入
例:把3.141592 保留3位小数对第四位小数进行四舍五入
double a=3.141592 ;
a=( int )( a*1000+0.5 )/1000.0 ;
10: ++ 自加 --自减
1 )在第二章中的使用形式
int a=10 ;
a++ ; 意义:先应用 后自加 a++; ++a; a+=1; a=a+1;
++a ; 意义:先自加 后应用
a-- ; 意义:先应用 后自减
--a ; 意义:先自减 后应用
应用的含义:在有自加或自减的混合表达式中,根据运算符的优先级从高到低依
次执行,如果先执行自加或自减运算,此时在该表达式中要是还有
其它的运算或操作,都要考虑意义,先应用 就是自加符号让它的自加对象先和表达式中其它的所有运算符结合完,最后再给自加对象
所表示存储空间中的值加一个1,后应用 就是自加符号先给自加对象
所表示存储空间中的值加一个1。再让加1后的值和表达式中的其它
运算符结合。
2)自加 或 自减 运算符执行一次只能加一个1 或是减一个1
3)自加 或 自减 的对象只能是变量 (因为++ -- 带有赋值的含义)
4)例1: int a=10 , b=5 ;
a+=b++; 过程分解为: 1: a=a+b a最后为15
2: b=b+1 b最后为 6
例2: int a= 10 , b= 5 ;
a+=++b ; 过程分解为: 1: b=b+1 b 最后为 6
2: a=a+b a 最后为 16
5)像 a++; v--; ++b; 这样的表达式中只有自加、自减运算的运算式子,就不用考虑它们
的意义,直接给自加、自减的对象所表示存储空间中的值加、减一个1
11: 逗号表达式
1)形式: ( 表达式1 , 表达式2 , 表达式 3 ,表达式 4 )
2)运算原则 : 从最左边的第一个表达式开始一个、一个表达式往右计算,把最后
一个表达式的结果做为整个逗号表达式的结果进行处理。
3)运算原则: 要是一个逗号表达式共包含了n个表达式,如果前n-1个表达式的
结果对最后一个表达式的结果没有影响的话,前n-1个表达式就可以
不用计算
4>; int a , b ;
a=( b=3 , b++ , ++b , b+=10 );
最后a 为15
第三章 顺序结构
1:输出函数的格式:
1: printf( “ 输出控制格式 “ , 输出列表 ) ; 2: printf(“输出控制格式“);
2:格式: 由 % 加 格式字母 组成
3:格式字母 分类
char c short int d long ld float f double lf
指数 e E 八进制 o 16进制 x X
%d :十进制整型 %o :八进制整型 %x :十六进制整型 %ld :十进制长整型
4:输出形式:
1> : 输出字符类型值
a : char ch=’A’ ;
printf( “ %c\n” , ch );
b : char ch =5;
printf( “ %c \n”, ch ) ;
2) 输出整型值
int a=10 ;
printf( “ %d \n”, a );
3) 输出长整型值
long b=100 ;
printf( “ %ld \n ”, b ) ;
4) 输出实型值
double c=3.145;
printf( “ %lf \n ”, c ) ;
5) 在 % 和 格式字母之间可以加输出的总宽度
对字符值 和 对整型值
char ch=’D’ ;
printf( “ %4c \n”, ch ) ;
int a=1540 ;
printf( “ %7d \n”, a ) ;
注意:a:当所设的总宽度比数值的实际总宽度大时,数据默认右对齐显示,左侧没有占用完
的空间上会显示空格。
b:当所设的总宽度小或等于数值的实际总宽度时,所设的总宽度失效,数据按原样显示。
对实型值
double a=3.52 ;
printf(“ %10lf \n”,a) ;
注意:所设的总宽度是整数部分数字、小数部分数字、小数点三部分之和的总宽度,输出时先输出标准的6位小数部分,再输出一位小数点,此时要是所剩的总宽度比实际数值的整数部分列宽大,左侧没有占用完的空间上会显示空格,要是比实际数值的整数部分列宽小或相等,都按原数值的整数部分列宽显示
6) 对指数
double a=325.14 ;
printf( “ %15e \n”, a ) ;
注意:所设的总宽度是整数部分数字、小数部分数字、小数点、指数格式四部
分之和的总宽度,输出时先输出标准的5位指数部分,再输出6位小数部
分和一位小数点,此时要是所剩的总宽度比实际数值的整数部分列宽大,
左侧没有占用完的空间上会显示空格,要是比实际数值的整数部分列宽小
或相等,都按原数值的整数部分列宽显示
7) 改变输出时的对齐方式
int a=2124 ;
printf( “%-6d\n”,a);
在%和格式字母之间加 – 会使的数值从左往右显示,有多余的空间会在数值的后
面显示
8) 加 0 格式
int a=1452 ;
printf(“ %010d\n”, a ) ;
注意:当所设的总列宽比数值的实际列宽大时,会在前面没有占用完的空间上
全部显示0,当没有多余的空间时0格式就失效了
9) 注意:当0格式遇到 – 左对齐时,0格式就失效
10) 加 m.n 格式 只对实型
double a=3541.125 ;
printf(“ %12.4lf \n”,a);
注意:所设的总宽度是整数部分数字、小数部分数字、小数点三部分之和为12
列,输出时先输出标准的4位小数部分(要是小数部分的实际列宽大于所
设置的列宽时,对多出来的小数部分进行四舍五入,要是比实际的小数
部分列宽小,不够的位用0填补,要是两者相同就按原样输出),再输出
一位小数点,此时要是所剩的总宽度比实际数值的整数部分列宽大,左
侧没有占用完的空间上会显示空格,要是比实际数值的整数部分列宽小
或相等,都按原数值的整数部分列宽显示
11) 当输出格式的个数比输出列表中值的个数多时,多出的格式会显示随机值
int a=1,b=2;
printf( “ %d,%d,%d”,a,b);
12) 当输出格式的个数比输出列表中值的个数少时,多出的数值不处理
int a=1,b=2,c=3;
printf(“ %d ,%d \n”,a,b,c);
13) 当%后面所跟的不是一个合法的格式字母时,就把这个错的格式字母原样输出
例1: int a=1,b=2,c=3;
printf(“ %D,%D,%D\n”,a,b,c);
结果是: D,D,D
例2: int a=1,b=2,c=3;
printf(“ %%d , %%d , %%d \n”,a,b,c);
结果是: %d,%d,%d
5:输入函数的格式:
1)scanf(“格式控制”,地址列表) ;
2)取地址符 &
3)给多个字符型空间中赋值
char a,b,c;
scanf(“%c%c%c”,&a,&b,&c);
要求:输入字符值时,必须挨个、连续的输入,各个字符值之间不能加任何符号
4)给多个整型空间中赋值
a:多个格式之间不加任何符号
int a,b,c;
scanf(“%d%d%d”,&a,&b,&c); %ld %f %lf
要求:输入时各个数值之间必须以 空格符 或 回车符 隔开输入
b:多个格式之间以某中符号隔开(适合字符型%c、整型%d %ld、实型%f %lf)
int a,b,c;
scanf(“%d,%d:%d”,&a,&b,&c);
要求:输入时,除了用数值换相应的格式以外,其它符号必须原样输入
5)给多个实型空间中赋值 原理和第4条一致
6)多个不同格式之间不加任何符号输入
a: int a;
char b;
double c;
scanf(“%d%c%lf”,&a,&b,&c);
要求:在非字符型格式和字符型格式之间不能加任何符号、连续输入,在
字符型格式和非字符型格式之间可以加 空格符 或 回车符 或 什
么都不加
b: int a;
char b;
double c;
scanf(“a=%d , b=%c , c=%lf”,&a,&b,&c);
注意:输入时,除了用数值换相应的格式以外,其它符号必须原样输入
7)在%和格式字母之间加输入总宽度
例1:int a,b,c;
scanf(“%3d%3d%3d”,&a,&b,&c);
运行时:输入的数值为123456789,结果是:a中存放了123,b中存放了456,
c中存放了789
例2: char ch;
scanf(“%4c”,&ch);
想给变量ch中存放一个大写字母D,就必须这样写:D空格空格空格
因为%c只能从屏幕的右侧取一列字符值
8)多条输入语句同时执行
例1: int a,b,c;
scanf(“%d”,&a);
scanf(“%d”,&b); scanf(“%d%d%d”,&a,&b,&c);
scanf(“%d”,&c);
想给变量a中存放100,给b中存放200,给c中存放300,在运行输入
时多个数值之间必须、只能以 空格符 或 回车符 来隔开
例2:char a,b,c;
scanf(“%c”,&a);
scanf(“%c”,&b); scanf(“%c%c%c”,&a,&b,&c);
scanf(“%c”,&c);
想给变量a中存放A,给b中存放B,给c中存放C,在运行输入时多
个字符值之间必须、只能挨个、连续输入
9)在%和格式字母之间加*
int a=0,b=0,c=0;
scanf(“%d%*d%d”,&a,&b,&c);
输入的数值为:10 20 30
结果:a中是10,b中是30,c中是0
* :的意思:跳过和本身格式相应的数值,把下一个数值输入到自己的存储空间中
6: 复合语句
用一对 { } 括起来的语句集合就称为一个复合语句
7: 空语句
只有分号而没有表达式的语句 例: ;
例1: 用海伦公式求三角型面积
#include <stdio.h>
#include <math.h>
main( )
{
double a,b,c,h,s ;
printf(“请输入三个边长:\n”);
scanf(“%lf,%lf,%lf”,&a,&b,&c) ;
h=1.0/2*(a+b+c) ;
s=sqrt(h*(h-a)*(h-b)*(h-c)) ;
printf(“s=%lf \n”, s ) ;
}
例2:用求根公式计算一元二次方程的两个根
#include <stdio.h>
#include <math.h>
main( )
{ double a , b , c , h , x1 , x2 , p , q ;
printf(“请输入三个常量:\n”);
scanf(“%lf,%lf,%lf”,&a,&b,&c) ;
h=sqrt( b*b-4*a*c ) ;
p=-b/( 2*a ) ;
q=h/( 2*a ) ;
x1=p+q ;
x2=p-q ;
printf(“x1=%lf,x2=%lf\n”,x1,x2 ) ;
}
例3:分离和组合, 把用户任意输入的一个六位数的各个位上的数字输出,并把它的十万位、千位、十位上的数字重新组合成一个三位数,新三位数的百位数字是原六位数的十位数字、十位数字是原六位数字的千位数字、新三位数的个位数字是原六位数的十万位数字,组成后输出。
#include <stdio.h>
main( )
{ long a;
int a1 , a2 , a3 , a4 , a5 , a6 , a7 ;
printf(“ Please Input a number :\n”);
scanf(“%ld”,&a);
a1=a/100000;
a2=a%100000/10000;
a3=a%10000/1000;
a4=a%1000/100;
a5=a%100/10;
a6=a%10;
a7=a5*100+a3*10+a1;
printf(“这个新数是:%d\n”,a7);
}
例4:交换算法
请用户任意输入两个整数,交换它们的数值后再输出
#include <stdio.h>
main( )
{ int a , b , t ;
printf(“ Please Input two numbers :\n”);
scanf(“%d,%d”,&a,&b);
printf(“原始数据为:\n”);
printf(“a=%d,b=%d\n”,a,b);
printf(“ \n 交换算法过程 :\n”);
t=a;
a=b; /* a=a+b ; b=a-b ; a=a-b ; */
b=t;
printf(“\n交换后的结果为:\n”);
printf(“a=%d,b=%d\n”,a,b);
}
例5:四舍五入的使用
用户任意输入一个实数,要求保留3位小数,对第四位小数进行四舍五入后再输出。
#include <stdio.h>
main( )
{ double x ;
printf(“ Please Input a number :\n”);
x=3.141592;
x=x*1000;
x=x+0.5;
x=(int)x; /* x=( int )(x*1000+0.5)/1000.0 ; */
x=x/1000;
printf
展开阅读全文