21行代码AC——习题5-1 代码对齐(Alignment of Code, UVa1593)——解题报告

题意:

输入若干行代码,要求各列单词的左边界对齐且尽量靠左,单词之间至少要空一格,每个单词不超过80个字符,每行不超过180个字符,一共最多1000行。

思路:

1、输入内容存入二维数组
2、找出每列最长的单词做域宽
3、按域宽输出单词。

注意点:

这道题本质就是在考get型函数处理输入+按域宽和左对齐输出。
1、读取输入内容有两种方法:getline()逐行读取后用stringstream分割,或getchar()逐个读取后靠判断是否为空格分割。个人更倾向第一种。
2、在读取的同时就要求出每列最长单词的大小,方便且高效。这种方法叫做在线处理
3、每行末尾无空格,在输出时判断一下就OK。
4、求域宽和左对齐采用的是#include<iomanop>头文件中的setw()函数和setiosflags()函数。


题目(提交)链接→UVa-1593


代码:

#include<bits/stdc++.h>
using namespace std;
string s, st;
vector<string> lines[1010];			//每一行的单词
int row = 0, maxcol[1010] = {0};	//行号、每列单词最长值
int main() {
	while(getline(cin, s)) {		//整行输入  
		stringstream input(s);
		while(input >> st) {
			maxcol[lines[row].size()] = max(maxcol[lines[row].size()],(int)st.size());
			lines[row].push_back(st);//保存单词 
		}
		row++;						//行号 
	}
	for(int i = 0; i < row; i++) {
		for(int j = 0; j < lines[i].size(); j++) 	//j是否为最后一列,是则直接输出,否则填充空格左对齐。 
			j==(lines[i].size()-1) ? cout << lines[i][j] : cout << setw(maxcol[j]+1) << setiosflags(ios::left) << lines[i][j];
		cout << "\n"; 
	} 
	return 0; 
} 

收获:

1、巩固了getline()用法
2、巩固了在线处理算法,应用更加熟练。


日拱一卒,功不唐捐。

发布了79 篇原创文章 · 获赞 72 · 访问量 7130

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104761708