今天在一道题上发现一个坑。
输入三个字符,按以下规则求其平均值。
(1)如果是数字0~9,那么直接参与求值;
(2)如果是其他字符,则其ASCII码参与求值。
输入
输入数据有多组。第一行是数据的组数T,接下来由T行,每行有3个字符,没有其他任何多余字符。
输出
对于每组输入,根据规则输出平均值。保留2位小数。
样例输入
2 123 1A3
样例输出
2.00 23.00
这是我栽了几次坑之后,还是错的代码:
#include<iostream> #include<cstdio> using namespace std; int main() { char str[3]; int i,t; double sum; cin>>t; getchar(); while(t--) { cin>>str[0]; cin>>str[1]; cin>>str[2]; getchar(); sum=0; for(i=0;i<3;i++) { if(str[i]-'0'>=0&&str[i]-'0'<=9) sum+=str[i]-'0'; else sum+=(int)str[i]; } printf("%0.2lf\n",sum/3.0); } return 0; }
发现有什么问题吗?
在看一看正确的代码:
#include<iostream> #include<cstdio> using namespace std; int main() { char str[3]; int i,t; double sum; cin>>t; getchar(); while(t--) { str[0]=getchar(); str[1]=getchar(); str[2]=getchar(); getchar(); sum=0; for(i=0;i<3;i++) { if(str[i]-'0'>=0&&str[i]-'0'<=9) sum+=str[i]-'0'; else sum+=(int)str[i]; } printf("%0.2lf\n",sum/3.0); } return 0; }
发现问题了没?
两组测试数据即可发现问题:1 3(中间为空格) 和123
下面就这个问题说一说:
①cin>>:无法接收空格、Tap键且以空格、Tap键、回车符为分隔符;
②cin.get( ):可以接收空格、Tap键且以回车符为结束符;
一:可输入单个字符
格式:
char ch;
ch=cin.get( );/cin.get(ch);
二:可输入字符串
格式:
cin.get(字符数组名,元素个数)
③getline( ):可接收空格、Tap键且以回车符为结束符;
格式:
string str;//字符串变量
getline(cin,str);
④cin.getline( ):可接收空格、Tapa键且以回车符结束;
格式:cin.getline(字符数组名,元素个数)
char m[20];
cin.getline(m,20);
③和④类似,单数getline( )属于string流类,而cin.getline( )属于istream流类,是不一样的函数。
C语言中的gets( )和getchar( )
①gets(字符数组名)用于接收字符串,可包括空格、Tap键且以回车符结束;
②getchar(字符变量名)用于接收单个字符且以回车符结束,一般需要两个。前一个接收字符,后一个接收回车符。
③putchar(字符变量名或整常数)