Unix is 命令

输入正整数n以及n个文件名,排序后按列优先的方式左对齐输出。假设最长文件名有M字符,则最右列有M字符,其他列都是M+2字符。

附加条件每行最多输出60个字符,在此条件下要求行最少。

Sample input

10
tiny
2short4me
very_long_file_name
shorter
size-1
size2
size3
much_longer_name
12345678.123
mid_size_name
12
Weaser
Alfalfa
Stimey
Buckwheat
Porky
Joe
Darla
Cotton
Butch
Froggy
Mrs_Crabapple
P.D.
19
Mr._French
Jody
Buffy
Sissy
Keith
Danny
Lori
Chris
Shirley
Marsha
Jan
Cindy
Carol
Mike
Greg
Peter
Bobby
Alice
Ruben

Sample output

------------------------------------------------------------
12345678.123         size-1               
2short4me            size2                
mid_size_name        size3                
much_longer_name     tiny                 
shorter              very_long_file_name  
------------------------------------------------------------
Alfalfa        Cotton         Joe            Porky          
Buckwheat      Darla          Mrs_Crabapple  Stimey         
Butch          Froggy         P.D.           Weaser         
------------------------------------------------------------
Alice       Chris       Jan         Marsha      Ruben       
Bobby       Cindy       Jody        Mike        Shirley     
Buffy       Danny       Keith       Mr._French  Sissy       
Carol       Greg        Lori        Peter



#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxcol=60;
const int maxn=100+5;
string filenames[maxn];
                                              //输出字符串s,长度不足len时补字符extra
void print(const string&s,int len,char extra)
{
    cout<<s;
    for(int i=0;i<len-s.length();i++)cout<<extra;
}
int main()
{
    while(1){
        int n;
        while(cin>>n){
            int m=0;
            for(int i=0;i<n;i++){
                cin>>filenames[i];
                m=max(m,(int)filenames[i].length());      //stl中的max,传入两个参数,返回最大值
            }
                               //计算列数cols和行数rows
            int cols=(maxcol-m)/(m+2)+1,rows=(n-1)/cols+1;
            print("",60,'-');           //调用函数,输出60个‘-’
            cout<<endl;
            sort(filenames,filenames+n);                //字典序排列
            for(int r=0;r<rows;r++){
                for(int c=0;c<cols;c++){                     //顺序竖着看,但要横行输出
                    int idx=c*rows+r;
                    if(idx<n)print(filenames[idx],c==cols-1?m:m+2,' ');            //最后一列m个字符,其余m+2个字符
                }
                cout<<endl;
            }
        }
    }
    //system("pause");
    return 0;
}


原文地址:https://www.cnblogs.com/farewell-farewell/p/5254896.html