Posted on 

C++编程题:从字符串中取数

题目

编写GetDoubleFromString函数,该函数可以不断从字符串中取出正浮点数或整数,无数可取,则返回值小于0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
using namespace std;
double GetDoubleFromString(char * str)
{
// 在此处补充你的代码
}

int main()
{
char line[300];
while(cin.getline(line,280)) {
double n;
n = GetDoubleFromString(line);
while( n > 0) {
cout << fixed << setprecision(6) << n << endl;
n = GetDoubleFromString(NULL);
}
}
return 0;
}

输入

多组数据,每组数据一行

输出

针对每组数据,将其中的数输出来。每行一个数,保留小数点后面6位。输入数据中只会有正数,不用考虑负号。两个数之间有至少一个非数字非小数点的字符。

思路

利用指针p,遍历字符数组str中的每一位。

根据题目要求,需要输出的有:

  1. 正浮点数
  2. 整数

那么需要忽略掉的就是:

  1. 其他字符 如abcd。
  2. 除小数点外的符号 如减号。


在遍历过程中:

  1. 如果遇到不需要的字符,则将指针自加,遍历下一位。

  2. 如果遇到数字,则将其写入num,作为返回值。伪代码如下:

    1
    2
    3
    4
    while (x是数字)
    {
    num=num*10+x;
    }

​ 其中,num的值在每次while循环后自乘10,以达到将当前数字写入num最低位的效果。

  1. 如果遇到小数点,则需要计算小数点后部分表示的值,再累加到小数点前已有的num的值中。伪代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (x是小数点)
    {
    读取下一位;
    double i=10;
    while (x是数字)
    {
    num自加x/i;
    读取下一位;
    i自乘10;
    }
    }

    其中,i的值在每次while循环后自乘10,以达到将当前数字写入num小数部分最低位的效果。

最后结合指针的使用,作答本题。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <iomanip>
using namespace std;
double GetDoubleFromString(char * str)
{
static char *p;
if(str){
p=str;
}
double num=0;
// 不是正浮点数或整数
while(*p&&!(*p>='0'&&*p<='9'))
{
++p;
}
// 没有任何正浮点数或整数
if(*p==0)
{
return -1;
}
// 是正浮点数或整数
while(*p>='0'&&*p<='9')
{
num=num*10+*p-'0';
++p;
}
if(*p=='.')
{
++p;
double i=10;
while(*p>='0'&&*p<='9')
{
num+=(*p-'0')/i;
++p;
i=i*10;
}
}
return num;
}

int main()
{
char line[300];
while(cin.getline(line,280)) {
double n;
n = GetDoubleFromString(line);
while( n > 0) {
cout << fixed << setprecision(6) << n << endl;
n = GetDoubleFromString(NULL);
}
}
return 0;
}
开往-友链接力
A member of 开往-友链接力

This site was deployed by @OasisLee using Stellar.

本站由Vercel提供托管与Serverless支持 | PlanetScale提供数据库支持