题目其实很简单,答题意思就是从管道读取一组文件名,并且按照字典序排列,但是输入的时候按列先输出,再输出行。而且每一行最多60个字符。而每个文件名所占的宽度为最大文件名的长度加2,除了输出在最右边的文件名的宽度是最大文件名长度之外。编程实现这个功能,这就是Unix系统下ls命令的一部分而已。具体实现如下。
主要学习的技能要点就是如何用偏移位移法来按列输出。如果一个矩阵n行m列,要按照列输出。但是我们知道,编程时候,只能是for(行)在列。所以必须要有一个偏移量来计算这种偏移关系。x = rows * c + r;
1 #include <iostream>
2 #include <string>
3 #include <algorithm>
4 #include <vector>
5 #include <cmath>
6
7 using namespace std;
8
9 vector<string> words;
10 void print(const string &s, int len, char extra);
11 int main() {
12
13
14 int n;
15 string w;
16
17 while (cin >> n) {
18
19 int max = 0;
20 words.clear();
21 for (int i = 0; i < n; i++) {
22 cin >> w;
23 string::size_type str_size = w.size();
24 if (str_size > max) max = str_size;
25 words.push_back(w);
26 }
27 int cols = (60 - max) / (max + 2) + 1;
28 int rows = ceil(double(n) / cols);
29 sort(words.begin(), words.end());
30 print("", 60, '-');
31 cout << endl;
32 for(int r = 0; r < rows; r++) {
33
34 for (int c = 0; c < cols; c++) {
35
36 int idx = c * rows + r;
37 if (idx < n) print(words[idx],(c == cols - 1? max: max + 2), ' ');
38
39 }
40
41 cout << endl;
42
43 }
44
45
46 }
47
48 return 0;
49
50 }
51
52 void print(const string &s, int len, char extra) {
53
54 cout << s;
55 string::size_type str_size = s.size();
56 for (int i = 0; i < len - str_size; i++) {
57 cout << extra;
58 }
59 }