【C语言】之''科学计数法''

老师平时布置的希冀系统上的作业答案,仅供参考!

【问题描述】

该科学记数法表示的数字一般由以下几部分构成:
1.底数部分是一个整数或小数,可能带有前缀的“+”、“-”号。如果底数带有小数点,则小数点前后必有数字。
2.字母“e”
3.指数部分是一个整数,也可能带有前缀的“+”、“-”号。
编写一个程序,将用科学记数法输入的一个数(字符串)转换成实数。

【输入形式】

控制台输入用科学记数法表示的一个数,是不含空格的一行字符串。

【输出形式】

输出该字符串代表的浮点数值,以默认的“%f”格式输出,保留默认的小数位数。

【样例输入】

234.85e-2

【样例输出】

2.348500

【样例说明】

输入用科学记数法表示的一个字符串234.85e-2,输出:2.348500

【参考答案】

#include <stdio.h>
#include <string.h>
#include <math.h>

//当底数为正数(无'+')时
double dpos(char d[])
{
int i=0,j,k,x;
double s=0;
while(d[i]!='.')
{
i++;
}
k=i-1;
for(j=0;j<i;j++)
{
s+=(d[j]-'0')*pow(10,k);
k--;
}
x=-1;
for(j=i+1;d[j]!='\0';j++)
{
s+=(d[j]-'0')*pow(10,x);
x--;
}
return s;

}

//当底数为正数(有'+')时
double dpos2(char d[])
{
char x[100];
int i=0,j=0;
double s;
for(i=1;d[i]!='\0';i++)
{
x[j]=d[i];
j++;
}
x[j]='\0';
s=dpos(x);
return s;
}

//当底数为负数时
double dneg(char d[])
{
char x[100];
int i=0,j=0;
double s;
for(i=1;d[i]!='\0';i++)
{
x[j]=d[i];
j++;
}
x[j]='\0';
s=dpos(x);
return -s;
}

//当指数为正数(无'+')时
int wpos(char w[],int l)
{
int k,i,s=0;
k=l-1;
for(i=0;w[i]!='\0';i++)
{
s+=(w[i]-'0')*pow(10,k);
k--;
}
return s;
}

//当指数为正数(有'+')时
int wpos2(char w[],int l)
{
char x[100];
int i=0,j=0,s=0;
for(i=1;w[i]!='\0';i++)
{
x[j]=w[i];
j++;
}
x[j]='\0';
s=wpos(x,l-1);
return s;
}

//当指数为负数时
int wneg(char w[],int l)
{
char x[100];
int i=0,j=0,s=0;
for(i=1;w[i]!='\0';i++)
{
x[j]=w[i];
j++;
}
x[j]='\0';
s=wpos(x,l-1);
return -s;
}

int main()
{
char m[100],d[100],w[100];
int i,j,k,y,z,flag=0;
double s,x;
scanf("%s",m);
for(i=0;m[i]!='e';i++)
{
d[i]=m[i];
}
d[i]='\0';
k=0;
for(j=i+1;m[j]!='\0';j++)
{
w[k]=m[j];
k++;
}
w[k]='\0';
//检查底数是否是整数
for(z=0;d[z]!='\0';z++)
{
if(d[z]=='.')
{
flag=1;
break;
}
}
if(flag){
if(d[0]=='-')
{
s=dneg(d);
if(w[0]=='-')
{
y=wneg(w,k);
}
else if(w[0]=='+')
{
y=wpos2(w,k);
}
else
{
y=wpos(w,k);
}
}
else if(d[0]=='+')
{
s=dpos2(d);
if(w[0]=='-')
{
y=wneg(w,k);
}
else if(w[0]=='+')
{
y=wpos2(w,k);
}
else
{
y=wpos(w,k);
}
}
else
{
s=dpos(d);
if(w[0]=='-')
{
y=wneg(w,k);
}
else if(w[0]=='+')
{
y=wpos2(w,k);
}
else
{
y=wpos(w,k);
}
}
}
else
{
if(d[0]=='-')
{
s=wneg(d,i);
if(w[0]=='-')
{
y=wneg(w,k);
}
else if(w[0]=='+')
{
y=wpos2(w,k);
}
else
{
y=wpos(w,k);
}
}
else if(d[0]=='+')
{
s=wpos2(d,i);
if(w[0]=='-')
{
y=wneg(w,k);
}
else if(w[0]=='+')
{
y=wpos2(w,k);
}
else
{
y=wpos(w,k);
}
}
else
{
s=wpos(d,i);
if(w[0]=='-')
{
y=wneg(w,k);
}
else if(w[0]=='+')
{
y=wpos2(w,k);
}
else
{
y=wpos(w,k);
}
}
}
x=s*pow(10,y);
printf("%f",x);
return 0;
}
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容