2020-03-19_11-扩展

	本文是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码值存入数组中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值