将一个字符串中(没有空格)用科学计数法表示的数串转 换成对应的实数,结果保留 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 @ 2023-12-12 09:20  xuchaoxin1375  阅读(25)  评论(0)    收藏  举报  来源