本文是2020-03-19_11的扩展
题目描述
一次输入多个数字,每个数字后要跟一个空格,输入的数字不限正负。逆序输出输入的数字。
示例
输入:
-12 23 34
输出:
34 23 -12
编程思路
使用string类型的字符串获取输入,输入的字符有三类:①数字’0’~‘9’、②符号’-’、③空格’ ';其中空格可以用来区分数字,符号则要进行记录。可以先根据空格得到输入数字的个数,再遍历字符串得到每个数字的值,将其存入int类型的数组中就可以根据数组下标进行逆序输出了。
代码实现
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int getNum(string str);
void getIntArr(string str,int num);
/*思路:
*使用getline()函数获取输入
*每个数字后面都有空格
*设置两个函数,一个用于得到数字的个数
*一个用于将string类型的字符串转换成int类型的数字并存入数组
*/
int main()
{
int num = 0;
string str;
getline(cin, str);
num = getNum(str);
getIntArr(str,num);
return 0;
}
/*
@统计字符串中包含数字的个数,
@因为每两个数字间用空格进行分隔,
@故统计空格数即可得到数字个数(最后一个字符后面有空格)
*Fn getNum
*brief 得到字符串中数字的个数
*param string str 要统计数字个数的字符串
*return int num 返回数字个数
*/
int getNum(string str)
{
int num = 0;
for (int i = 0; i < str.length(); i++)
{
if (' ' == str[i])
num++;
}
return num;
}
/*
@每次取一位数字存放到save中,然后判断下一位
@ ①如果下一位不是空格,则将save乘10再加上下一位的值,重复判断
@ ②如果下一位是空格,则将save的值存入int型数组arr中,并将save的值置零且subscript的值加一
※每次判断是还要判断是否为负数,还要设置一位标志位记录这个数是否判断过符号
*Fn getIntArr
*brief 将string类型的数组转化成int类型的数组
*param string str 需要转化的数组
*param int num 数组长度
*return void
*/
void getIntArr(string str,int num)
{
int *arr = new int[num];
fill(arr, arr + num, 0);
//save用于存储数字的值,target用于标记是否判断过符号,subscript用来存储arr的下标
int save = 0, target = 0, subscript = 0;
//sign用来存储数字的符号
bool sign = true;
//将string类型的数组存入int类型的数组中
for (int i = 0; i < str.length(); i++)
{
//判断是否为同一数字
if (str[i] != ' ')
{
//target为0时表示没有进行符号判断
if (!target)
{
if (str[i] == '-')
{
//判断是否为符号,如果是符号则跳过后续的存值操作
sign = false;
target = 1;
continue;
}
}
save = save * 10 + (str[i] - '0');
}
else
{
//将元素存入数组
//sign为true时表示非负数,为false时表示负数
if (sign)
arr[subscript] = save;
else
arr[subscript] = 0 - save;
//存储变量清零,arr下标自增
save = 0, subscript++;
//还原标记
target = 0, sign = true;
}
}
//逆序输出输入的字符串
for (int i = subscript - 1; i >= 0; i--)
cout << arr[i] << ' ';
cout << endl;
}
运行结果
总结
首先。明确可能有的(合法)输入,判断每种输入应该怎么处理,可能的处理有:保存、标记、传值等
其次。注意输入格式和存储格式间的转换。
最后。判断中的逻辑关系要理清,尤其是为什么要判断、要怎么判断、判断后做什么。比如在进行符号判断时,判断后要更改标志位,更改标志位后要记得continue; 不然程序继续运行会将’-'的ASCII码值存入数组中。