题目链接贴上,不多赘述
http://codeforces.com/problemset/problem/5/B
这道题首先是要读懂题,搞清楚题目的指示
即 将文本包围在一个符号*组成圈里面,字符串居中放置,若左右空格长度不一致,由上至下依次靠左再靠右交替
同时,在题目进行左右分隔时,不能采用if,而应该采用?:三目运算符,因为从逻辑上讲,是因为左右不同才需要左右交替,而不是因为左右不同且从上至下是第几个才会导致左右交替,这种小逻辑错误可能导致某些行出现左右对不齐的情况
另外,整理一下几个输入的关系
cin |
| ||
cin.get() |
cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足 | ||
cin.getline() | 接受一个字符串,可以接收空格并输出,属于istream流 | ||
getline() | 接受一个字符串,可以接收空格并输出,需包含“#include<string>”,getline()属于string流 |
除此之外
注意size()和length()两个函数的区别,牢记这两个函数有着不同的值
面对死循环时
Windows用Ctrl+z强制停止并调试
Linux用Ctrl+D
最后,贴代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
void outch(int n,char c) //控制输出字符或空格个数
{
while(n--)
{
cout<<c;
}
}
int main()
{
string str[maxn];
char ctmp[maxn];
int cnt=0;
int longest=0;
while(cin.getline(ctmp,maxn)) //寻找字符串最长长度,确定⭐矩阵的宽度
{
str[cnt]=ctmp;
if(str[cnt].length()>longest)
{
longest=str[cnt].length();
}
cnt++;
}
int flag=0; //确定是从上到下第几个,从而决定靠右还是靠左
int left,right;
outch(longest+2,'*');
cout<<endl;
for(int i=0;i<cnt;i++)
{
left=(longest-str[i].length())/2;
right=longest-left-str[i].length();
if(left!=right)
{
left+=(flag%2==0?0:1);
right-=(flag%2==0?0:1);
flag++; //由于整型计算的性质,其天然靠左
}
cout<<'*';
outch(left,' ');
cout<<str[i];
outch(right,' ');
cout<<'*'<<endl;
}
outch(longest+2,'*');
cout<<endl;
return 0;
}
参考引用