我觉得应该是
printf("%.3e",变量名)
而不是
printf("%3e",变量名)
==================
MSDN 中有关printf打印格式串:
%[flags] [width] [.precision] [{h | l | I64 | L}]type
的描述,其中对[.precision]是这么说的:
The third optional field of the format specification is the precision specification.
(大义:格式规约中第三个选项段是关于小数的规则。)
==================
对于打印e, E类型的数据时,[.precision]选项的作用是:
The precision specifies the number of digits to be printed after the decimal point. The last printed digit is rounded.
(大义:该精度指定了打印小数点后的位数,之后的位数会被四舍五入)
Default precision is 6if precision is 0 or the period (.) appears without a number following it, no decimal point is printed.
(大义:缺省情况下,该精度为6,如果精度值为0或者小数点后没有紧跟着数字,则不会打印小数部分)
==================
例:
#include <stdio.h>
int main()
{
float b = 100000.55555f
printf("%3e\n",b)
printf("%.3e\n",b)
return 0
}
输出结果为:
1.000006e+005
1.000e+005
我了个CAO,还真没想到全功能版本会这么多内容……已编译运行通过。
已经实现了绝大部分内容,包括自动识别正负数,可以直接输入整数而不是分数,会把整数转换为分数来计算,同样,如果得数正好是整数的,也会输出为整数样式。
会自动约分到最简模式,可以说只差以下几点就能算彻底完成了:
1、当分母为0时,自动转化显示为无限大,但是在和的无限大的正负符号上,做了几回都没得出正确结果,所以暂时恒定为正了(输入的分数已经可以判断正负号了)。
2、本来想做分母上带符号也能正常显示负数的符号,就就是说“3/-5“会自动识别为“-3/5”的功能,结果没出效果……可能是scanf的限制吧,考虑到不合平常使用习惯,所以没继续做。
3、要不要显示时自动分号对齐?似乎没必要吧。
加一运行效果图片:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{ //分数数型
unsigned int denominator //分母
unsigned int numerator //分子
unsigned int negative //正负号,0为正号,1为负号
} fraction
fraction fraction_Get(int x1,int x2) { //由分子分母生成分数
fraction x
if(x1<0) { //判断正负和提取分子
x.negative=1
x.numerator=0-x1
} else x.numerator=x1
if(x2<0) { //判断正负和提取分母
x.negative=(x.negative==0)?1:0
x.denominator=0-x2
} else x.denominator=x2
return x
}
void fraction_Show(fraction x) { //分数显示
if(x.negative==1)
printf("-")
else printf(" ")
if(x.denominator==0) { //如果分母是0,显示无限大
printf("∞")
} else {
printf("%d",x.numerator)
if(x.denominator>=2) printf("/%d",x.denominator)
}
}
fraction fraction_reduction(fraction x) { //分数约分
int i,j //循环控制和临时变量
int x_d,x_n
fraction y //定义得数储存属性
x_d=x.denominator //取得分数x的分母和分子
x_n=x.numerator
if(x_d==0||x_n==1) //分母为0或分子为0/1时不约分
return x
if(x_n==0) { //如果分子是0,则分母为1,返回
x.denominator=1
return x
}
for(i=1i<=(x_d<x_n?x_d:x_n)i++) //求分子分母最大公约数
if(x_d%i==0&&x_n%i==0)
j=i
x_d/=j //约分
x_n/=j
y.denominator=x_d //结果复制到y
y.numerator=x_n
y.negative=x.negative //正负号不变
return y
}
fraction fraction_Add(fraction x,fraction y) { //分数相加
int x_d,x_n,y_d,y_n //x、y两分数的分母和分子
fraction z //定义得数储存属性
int z_d,z_n //定义得数的分母和分子
x_d=x.denominator //取得分数x、y的分母和分子
x_n=x.numerator
y_d=y.denominator
y_n=y.numerator
if(x_d==0||y_d==0) { //为分母为0的情况单独计算
z.denominator=0
z.negative=0
z.numerator=1
return z
}
if(x.negative==1) x_n=0-x_n //将正负号添加到分子中
if(y.negative==1) y_n=0-y_n
z_d=x_d*y_d //求得数分母
z_n=x_n*y_d+y_n*x_d //求得数分子
if (z_n<0) { //判断得出分数的正负
z_n=0-z_n
z.negative=1
} else z.negative=0
z.denominator=z_d //复制得数分母分子到分数z
z.numerator=z_n
z=fraction_reduction(z) //调用函数约分
return z
}
void main() {
fraction x,y,z
int x1,x2,y1,y2
x2=y2=1
printf("请输入 x:") //获取分数x,由键盘输入
scanf("%d/%d",&x1,&x2) //用“/”表示分号
x=fraction_Get(x1,x2)
printf("请输入 y:") //获取分数x,由键盘输入
scanf("%d/%d",&y1,&y2) //用“/”表示分号
y=fraction_Get(y1,y2)
printf("输入的 x= ") //计算和输出
fraction_Show(x)
printf("\n约分后 x= ")
x=fraction_reduction(x)
fraction_Show(x)
printf("\n")
printf("输入的 y= ")
fraction_Show(y)
printf("\n约分后 y= ")
y=fraction_reduction(y)
fraction_Show(y)
printf("\n")
z=fraction_Add(x,y)
printf("计算 x+y= ")
fraction_Show(z)
printf("\n")
}
C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
比如说用C 开发了一个DLL 库,为了能够让C ++语言也能够调用DLL输出(Export)的函数,需要用extern "C"来强制编译器不要修改函数名。