C++STL练习(3)

题目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.只枚举

题目3:PGA巡回赛的奖金

猜你喜欢

转载自blog.csdn.net/qq_34805255/article/details/84159048
今日推荐