将一个字符串中(没有空格)用科学计数法表示的数串转 换成对应的实数,结果保留 6 位小数。 输入仅一个字符串,该字符串中仅有一个用科学计数法表示的数据串。 输入 一个字符串中(字符中不含空格)包含

令不才的我煞费苦心.
将一个字符串中(没有空格)用科学计数法表示的数串转
换成对应的实数,结果保留 6 位小数。
输入仅一个字符串,该字符串中仅有一个用科学计数法表示的数据串。
输入
一个字符串中(字符中不含空格)包含 一个 用 科学计数法 表示的 数串(它的意思是从一段文字中要解析处数字的部分并进行转化,(默认是十进制的.))
输出
科学计数法表示的数串对应的实数
样例输入
abc1.32e+2defg
abc 1.32e+2 defg
样例输出
132.000000
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
//在此下方插入自定义函数对的声明:
int is_legal_num_string(char *str, int digital_index_1st, int digital_index_last)
{
int num_E_e = 0, index_E_e = -1; //index为了判断先后性.
int num_pointer = 0, index_pointer = -1;
/*下面的i任然是匹配于最原始的str中的索引 */
for (int i = digital_index_1st; i <= digital_index_last; i++)
{
/* 检查内部是否出现非法字符 */
if (str[i] != 'e' && str[i] != 'E' && str[i] != '.' && !isdigit(str[i]) && str[i] != '+' && str[i] != '-')
{
return 0;
}
else if (str[i] == 'e' || str[i] == 'E')
{
num_E_e++;
if (index_E_e == -1)
{
index_E_e = i;
}
}
else if (str[i] == '.')
{
num_pointer++;
if(index_pointer == -1)
{
index_pointer = i;
} /* code */
}
if (num_pointer > 1 || num_E_e > 1 || (index_pointer > index_E_e && index_E_e != -1))
{
return 0;
}
}
return 1;
/* 对'e','E','.'的重复性格检查. */
}
//主函数main
int main()
{
//复制模版式删除这个或者上面那个
char str[100]; //根据需要分配更大的维数
//while(scanf("%s",str) != EOF , str == " xxx")判断读到了什么;while(gets(str));
while (scanf("%s", str) != EOF)
{
int len = strlen(str);
int digit_1st_index = -1;
int digit_last_index = -1;
int e_index = -1;
// int part1 = 0;用来存储float将导致信息损失.
// int part2 = 0;
float part1 = 0;
float part2 = 0;
float result = 0;
float signal_1 = +1.0; /* 处理正负数的. 但在定义的时候要定义为float,否则int 下 1.0没用,还是1*/
float signal_2 = +1.0; /* 处理指数部分的正负. */
int i = 0;//小心放置.
int j = 0;
while (1)
{
digit_1st_index = -1;
digit_last_index = -1;
e_index = -1;
// int part1 = 0;用来存储float将导致信息损失.
// int part2 = 0;
part1 = 0;
part2 = 0;
result = 0;
i = j;//记录着经过了多少次for:
for (; i < len; i++)
{
/* isdigit是计算机C(C++)语言中的一个函数,主要用于检查其参数 (某个ascii码 是否为十进制数字字符。 */
/* 记录第一个数字字符出现的位置. */
if (isdigit(str[i]) && digit_1st_index == -1)
{
digit_1st_index = i;
}
/* 找出科学计数法中出现e/E的位置 */
if ((str[i] == 'e' || str[i] == 'E') && digit_1st_index != -1)
{
e_index = i;
}
/* 找出最该可能是科学计数法表示的数串 的 最后一个数码 */
if (e_index != -1 && isdigit(str[i]) && !isdigit(str[i + 1]))
{
digit_last_index = i;
break; /*abc1.32e+2defg */
}
}
/* before deal,judge the number_string is legal? */
/* 如果的到了否定的结果,那就从下一个起始字符再判断. */
if (is_legal_num_string(str, digit_1st_index, digit_last_index))
{
int change_char_to_int = 0;
/* deal part1: */
for (int i = digit_1st_index; i < e_index; i++)
{
if (str[i] != '.')
{
change_char_to_int = str[i] - 48;
part1 = change_char_to_int + part1 * 10;
}
}
if (str[digit_1st_index] == '-')
{
signal_1 = -1;
}
int setoff_point = e_index - digit_1st_index - 2;
part1 = signal_1 * part1 / (float)(pow(10, setoff_point));
/* deal part2: */
int state = 0; /* 默认没有符号位. */
if (!isdigit(str[e_index + 1]))
{
if (str[e_index + 1] == '-')
{
signal_2 = -1;
}
/* 符号位需要占一位. */
state = 1;
}
for (int j = e_index + state + 1; j <= digit_last_index; j++)
{
change_char_to_int = str[j] - 48;
part2 = change_char_to_int + part2 * 10;
part2 *= signal_2;
}
result += part1 * pow(10, part2);
printf("%.6f\n", result);
break;
}//if
j++;
// else
// {
// ;
// }
} //while(1)
} //while(scanf)
return 0;
}
posted @   xuchaoxin1375  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-12-12 CN_@TCP可靠机制@差错控制@流量控制@拥塞控制
2021-12-12 java_Fabonacci斐波那契数列
2021-12-12 CN_TCP_协议分析_wireShark分析报文(reserve+flags)
点击右上角即可分享
微信分享提示