目录
问题:
5. | 【问题描述】 从键盘接收用户输入的字符串, 对用户输入的每个字符串的处理是:将字符串内的每一个十进制数字字符置换成下列表格中右边所对应的一个字符串(所有其他字符不变),然后将转换的结果显示在屏幕上;并分别计算每个数字的置换次数。
例如,若用户输入的字符串为 Page112-Line3, 则程序5的输出是: Page(One) (One) (Two)-Line(Three), 数字0到9的置换次数分别是 0 2 1 1 0 0 0 0 0 0 【输入形式】 输入一行字符串,其中可包含字母、数字、空格或其他符号(英文) 【输出形式】 第一行为将字符串中的数字转换为表格中的内容后输出 第二行为数字0~9被转换的次数 【样例输入】
【样例输出】
|
分析:
这道题不难,是一道字符串处理题目,对应CCF-CSP中第三题,当然CCF-CSP第三题肯定没有这么简单。这里要说的一点是,如何巧用数组,这里可以把(one)——(Nine)这几个字符串存入一个字符串数组中,这样就不用写If-else函数或者switch函数判断输出了,直接根据下标输出对应的字符串。同样可以应用到每个数字出现次数的统计中,使用一个数组统计,0-9对应位置自动+1.
C++ AC代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str; //读入的字符串变量
int len; //字符串长度变量
int number[10]; //统计各个数字出现次数
string strNum[10]={"(Zero)","(One)","(Two)","(Three)","(Four)","(Five)","(Six)","(Seven)","(Eight)","(Nine)"};
//cin >> str;
getline(cin,str); //读入输入的一行字符串
len = str.length(); //计算字符串长度,存入len变量
for(int i=0; i<10; i++)number[i]=0; //统计数组初始化为0
for(int i=0; i<len; i++) //判断并输出每个字符
{
if(str[i]>='0' && str[i]<= '9') //判断是否是数字
{
cout << strNum[str[i]-'0'] ; //如果是数字,则输出对应字符串
number[str[i]-'0']++; //统计数组对应位置+1
}
else
cout << str[i] ; //不是数字直接输出
}
cout <<endl;
for(int j=0; j<9; j++) //输出各个数字出现次数
{
cout << number[j] << ' ';
}
cout <<number[9] << endl;
return 0;
}
总结:
在OJ系统中一开始使用的cin获取字符串,系统只给了10分,后来改用了getline()函数才得100分。这两个的区别就是cin>>会自动过滤掉不可见字符(如空格 回车 tab等),遇到空格、回车等会结束获取输入的字符串,后面的字符串会过滤掉(存放在输入流中)。如果后面还需要输入字符串,则会从前面存放的字符串开始获取。而getline()属于string类的函数,使用时需包含头文件#include<string>。格式为:getline(cin,string s),接收一个字符串,可以接收空格、回车等,会获取整行内容。