用科学记数法输入的一个数(字符串)转换成实数(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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值