题目1:Unix ls 命令
思路:
1.接受用户输入,用数组保存用户输入的文件名
2.计算输出的行数和列数
3.对数组中的字符串进行排序
4.按列输出,但这里我们不可能输出一列又回到开头去输出,所以真正代码的书写还是按行输出,但通过计算造成按列排序输出的“假象”
代码实现:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void print(const string &s,int len,char extra);
//声明保存用户输入字符串的数组
vector<string> saveString;
//每行能保存字符的最大值
const int charMaxOfRow = 60;
//打印函数,输出字符串s,长度不足len时就补充字符extra
void print(const string &s,int len,char extra)
{
cout<< s;
for(unsigned int i=0;i < len-s.length();i++)
cout<<extra;
}
int main()
{
int stringNum; //用户输入的字符串的个数
//获取用户的输入并保存
while(cin>>stringNum)
{
//用户输入的最长字符串的长度
int lenOfMaxString=0;
string tempString;
//保存用户的输入的字符串
for(int i=0;i < stringNum;i++)
{
cin>>tempString;
saveString.push_back(tempString);
lenOfMaxString = max(lenOfMaxString,(int)tempString.length());
}
int row; //输出的字符串的行
int column; //输出的字符串的列
//通过计算每行能输出的最大字符串个数,然后计算列数
// 用每一行所能容纳的字符数减去最后一列的长度,然后除以前面每列字符串的长度,整数的相除,会向下取整,再加上最后一列
column =(charMaxOfRow - lenOfMaxString) /(lenOfMaxString+2)+ 1;
//这里行的计算有一定的技巧,我们直观想到的是:
//row = stringNum/column;但仔细想一下,这样的写法有问题如下
//当stringNum/column的如果单纯数学计算结果大于某个整数的话,在这里的整数运算中会向下取整,就会导致字符串没被完全存储
//所以由此推断很明显我们需要向上取整,很自然想到那写成下面不就好了
//row = stringNum/column+1;
//是的,当stringNum/column的数学计算结果是个小数的时候没问题了
//但是,当stringNum/column的数学计算结果刚好为一个整数时,就多了一行
//所以row = (stringNum - 1)/column + 1恰好解决了上述的两个问题,达到了向上取整的目的
row = (stringNum - 1)/column + 1;
//输出上面的分割符
print("",60,'-');
cout<<"\n";
//排序
sort(saveString.begin(),saveString.end());
//按行输出
for(int r=0;r < row;r++)
{
for(int c=0;c < column;c++)
{
//计算每个字符串在数组中的位置
int index=c * row + r;
//确保访问数组的安全性
if(index < stringNum)
{
//输出指定的格式,这句代码值得再看
print(saveString[index],c == column-1? lenOfMaxString:lenOfMaxString+2,' ');
}
}
//每行完了换行
cout<<"\n";
}
}
}
eclipse下运行结果:
知识点重点补充
1.向上取整与向下取整
向下取整:row = stringNum/column;
向上取整:row = (stringNum - 1)/column + 1
2.三目运算符解析(待补充)
print(saveString[index],c == column-1? lenOfMaxString:lenOfMaxString+2,' ');
题目2:数据库(明天更)
思路:
直观思路:写一个四重循环遍历r1,r2,c1,c2,但是枚举量太大,效率太低,会超时
高效思路:
1.获取用户输入的数据库保存在二维数组当中
2.只枚举