找数据(10分)
题目内容:
编写程序,找出一个字符串中的所有数据然后加9输出(实数或整数)。
例如,China Daily | Updated: 2020-04-10 08:5.9,
输出:
2029
5
-1
17
14.9
单个正号或负号不算数据,但+0,-0都是数据。字符串总长度不超过200.
输入格式:
一个带空格的字符串。
输出格式:
若干行数据。
输入样例:
China Daily | Updated: 2020-04-10 08:5.9
输出样例:
2029
5
-1
17
14.9
#include<iostream>
#include<string>
using namespace std;
#include<stdlib.h>
int func(int n);
double trans(char* p, char* q);
void print(char* arr);
int main()
{
char arr[200];
cin.getline(arr,200);//输入
print(arr);//将数据加9后输出
return 0;
}
void print(char* arr)//将数据加9后输出
{
char* p, *q;
p = q = arr;
double sum;
while(*p != '\0')
{
//pq指向一个数字
while((*p < '0' || *p > '9') && *p != '\0')p++;
q = p;
//q指向数字结束的地方
while(*q >= '0' && *q <= '9')q++;
if(*q == '.' && *(q+1) >= '0' && *(q+1) <= '9')
q++;
while(*q >= '0' && *q <= '9')q++;
//将p~q转化位数字,判断符合,加9,输出
if(p != arr )
{
sum = trans(p, q);
cout << (( *(p-1) == '-' )? (-sum+9): (sum+9)) << endl; //判断正负号
}
else
{
cout << trans(p, q) +9 << endl;
}
//重置p
p = q;
}
}
double trans(char* p, char* q)//trans()将p~q范围的数字字符转化位数字
{
char* pt = p;
while(pt < q)//查找有没有小数点
{
if(*pt == '.')break;
pt++;
}
if(pt == q)//没有小数点直接返回
{
return atoi(p);//atoi是需包含头文件<stdlib.h>,可以将字符数字转换位数字,但仅限于整数。
}
else
{
double s1, s2;//有小数点则分别保存小数点前和小数点后的数字
s1 = atoi(p);
s2 = atoi(pt+1);
s1 = s1 + s2/func(s2);//若s2是n位数,则返回pow(10,n), s2/func(s2)是s2转化为小数的数
return s1;
}
}
int func(int n)
{
int ret = 1;
do
{
ret*=10;
n /= 10;
}while(n);
return ret;
}