題目其實很簡單,答題意思就是從管道讀取一組文件名,并且按照字典序排列,但是輸入的時候按列先輸出,再輸出行。而且每一行最多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 }